8108d448cb1648025c8a84dac3a1df280f59475b
[openssl.git] / crypto / evp / pmeth_lib.c
1 /* pmeth_lib.c */
2 /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
3  * project 2006.
4  */
5 /* ====================================================================
6  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer. 
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in
17  *    the documentation and/or other materials provided with the
18  *    distribution.
19  *
20  * 3. All advertising materials mentioning features or use of this
21  *    software must display the following acknowledgment:
22  *    "This product includes software developed by the OpenSSL Project
23  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24  *
25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26  *    endorse or promote products derived from this software without
27  *    prior written permission. For written permission, please contact
28  *    licensing@OpenSSL.org.
29  *
30  * 5. Products derived from this software may not be called "OpenSSL"
31  *    nor may "OpenSSL" appear in their names without prior written
32  *    permission of the OpenSSL Project.
33  *
34  * 6. Redistributions of any form whatsoever must retain the following
35  *    acknowledgment:
36  *    "This product includes software developed by the OpenSSL Project
37  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38  *
39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50  * OF THE POSSIBILITY OF SUCH DAMAGE.
51  * ====================================================================
52  *
53  * This product includes cryptographic software written by Eric Young
54  * (eay@cryptsoft.com).  This product includes software written by Tim
55  * Hudson (tjh@cryptsoft.com).
56  *
57  */
58
59 #include <stdio.h>
60 #include <stdlib.h>
61 #include "cryptlib.h"
62 #include <openssl/objects.h>
63 #include <openssl/evp.h>
64 #ifndef OPENSSL_NO_ENGINE
65 #include <openssl/engine.h>
66 #endif
67 #include "asn1_locl.h"
68 #include "evp_locl.h"
69
70 typedef int sk_cmp_fn_type(const char * const *a, const char * const *b);
71 STACK *app_pkey_methods = NULL;
72
73 extern EVP_PKEY_METHOD rsa_pkey_meth, dh_pkey_meth, dsa_pkey_meth, ec_pkey_meth;
74
75 static const EVP_PKEY_METHOD *standard_methods[] =
76         {
77         &rsa_pkey_meth,
78         &dh_pkey_meth,
79         &dsa_pkey_meth,
80         &ec_pkey_meth
81         };
82
83 static int pmeth_cmp(const EVP_PKEY_METHOD * const *a,
84                 const EVP_PKEY_METHOD * const *b)
85         {
86         return ((*a)->pkey_id - (*b)->pkey_id);
87         }
88
89 const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type)
90         {
91         EVP_PKEY_METHOD tmp, *t = &tmp, **ret;
92         tmp.pkey_id = type;
93         if (app_pkey_methods)
94                 {
95                 int idx;
96                 idx = sk_find(app_pkey_methods, (char *)&tmp);
97                 if (idx >= 0)
98                         return (EVP_PKEY_METHOD *)
99                                 sk_value(app_pkey_methods, idx);
100                 }
101         ret = (EVP_PKEY_METHOD **) OBJ_bsearch((char *)&t,
102                         (char *)standard_methods,
103                         sizeof(standard_methods)/sizeof(EVP_PKEY_METHOD *),
104                         sizeof(EVP_PKEY_METHOD *),
105                         (int (*)(const void *, const void *))pmeth_cmp);
106         if (!ret || !*ret)
107                 return NULL;
108         return *ret;
109         }
110
111 static EVP_PKEY_CTX *int_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id)
112         {
113         EVP_PKEY_CTX *ret;
114         const EVP_PKEY_METHOD *pmeth;
115         if (id == -1)
116                 {
117                 if (!pkey || !pkey->ameth)
118                         return NULL;
119                 id = pkey->ameth->pkey_id;
120                 }
121         /* Try to find an ENGINE which implements this method */
122         if (e)
123                 {
124                 if (!ENGINE_init(e))
125                         {
126                         EVPerr(EVP_F_INT_CTX_NEW,ERR_R_ENGINE_LIB);
127                         return NULL;
128                         }
129                 }
130         else
131                 e = ENGINE_get_pkey_meth_engine(id);
132
133         /* If an ENGINE handled this method look it up. Othewise
134          * use internal tables.
135          */
136
137         if (e)
138                 pmeth = ENGINE_get_pkey_meth(e, id);
139         else
140                 pmeth = EVP_PKEY_meth_find(id);
141
142         if (pmeth == NULL)
143                 return NULL;
144
145         ret = OPENSSL_malloc(sizeof(EVP_PKEY_CTX));
146         if (!ret)
147                 {
148                 if (e)
149                         ENGINE_finish(e);
150                 EVPerr(EVP_F_INT_CTX_NEW,ERR_R_MALLOC_FAILURE);
151                 return NULL;
152                 }
153         ret->engine = e;
154         ret->pmeth = pmeth;
155         ret->operation = EVP_PKEY_OP_UNDEFINED;
156         ret->pkey = pkey;
157         ret->peerkey = NULL;
158         if (pkey)
159                 CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
160         ret->data = NULL;
161
162         if (pmeth->init)
163                 {
164                 if (pmeth->init(ret) <= 0)
165                         {
166                         EVP_PKEY_CTX_free(ret);
167                         return NULL;
168                         }
169                 }
170
171         return ret;
172         }
173
174 EVP_PKEY_METHOD* EVP_PKEY_meth_new(int id, int flags)
175         {
176         EVP_PKEY_METHOD *pmeth;
177         pmeth = OPENSSL_malloc(sizeof(EVP_PKEY_METHOD));
178         if (!pmeth)
179                 return NULL;
180
181         pmeth->pkey_id = id;
182         pmeth->flags = flags | EVP_PKEY_FLAG_DYNAMIC;
183
184         pmeth->init = 0;
185         pmeth->copy = 0;
186         pmeth->cleanup = 0;
187         pmeth->paramgen_init = 0;
188         pmeth->paramgen = 0;
189         pmeth->keygen_init = 0;
190         pmeth->keygen = 0;
191         pmeth->sign_init = 0;
192         pmeth->sign = 0;
193         pmeth->verify_init = 0;
194         pmeth->verify = 0;
195         pmeth->verify_recover_init = 0;
196         pmeth->verify_recover = 0;
197         pmeth->signctx_init = 0;
198         pmeth->signctx = 0;
199         pmeth->verifyctx_init = 0;
200         pmeth->verifyctx = 0;
201         pmeth->encrypt_init = 0;
202         pmeth->encrypt = 0;
203         pmeth->decrypt_init = 0;
204         pmeth->decrypt = 0;
205         pmeth->derive_init = 0;
206         pmeth->derive = 0;
207         pmeth->ctrl = 0;
208         pmeth->ctrl_str = 0;
209
210         return pmeth;
211         }
212
213 void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth)
214         {
215         if (pmeth && (pmeth->flags & EVP_PKEY_FLAG_DYNAMIC))
216                 OPENSSL_free(pmeth);
217         }
218
219 EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e)
220         {
221         return int_ctx_new(pkey, e, -1);
222         }
223
224 EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e)
225         {
226         return int_ctx_new(NULL, e, id);
227         }
228
229 EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx)
230         {
231         EVP_PKEY_CTX *rctx;
232         if (!pctx->pmeth || !pctx->pmeth->copy)
233                 return NULL;
234 #ifndef OPENSSL_NO_ENGINE
235         /* Make sure it's safe to copy a pkey context using an ENGINE */
236         if (pctx->engine && !ENGINE_init(pctx->engine))
237                 {
238                 EVPerr(EVP_F_EVP_PKEY_CTX_DUP,ERR_R_ENGINE_LIB);
239                 return 0;
240                 }
241 #endif
242         rctx = OPENSSL_malloc(sizeof(EVP_PKEY_CTX));
243         if (!rctx)
244                 return NULL;
245
246         rctx->pmeth = pctx->pmeth;
247 #ifndef OPENSSL_NO_ENGINE
248         rctx->engine = pctx->engine;
249 #endif
250
251         if (pctx->pkey)
252                 {
253                 CRYPTO_add(&pctx->pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
254                 rctx->pkey = pctx->pkey;
255                 }
256
257         if (pctx->peerkey)
258                 {
259                 CRYPTO_add(&pctx->peerkey->references,1,CRYPTO_LOCK_EVP_PKEY);
260                 rctx->peerkey = pctx->peerkey;
261                 }
262
263         rctx->data = NULL;
264         rctx->app_data = NULL;
265         rctx->operation = pctx->operation;
266
267         if (pctx->pmeth->copy(rctx, pctx) > 0)
268                 return pctx;
269
270         EVP_PKEY_CTX_free(rctx);
271         return NULL;
272
273         }
274
275 int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth)
276         {
277         if (app_pkey_methods == NULL)
278                 {
279                 app_pkey_methods = sk_new((sk_cmp_fn_type *)pmeth_cmp);
280                 if (!app_pkey_methods)
281                         return 0;
282                 }
283         if (!sk_push(app_pkey_methods, (char *)pmeth))
284                 return 0;
285         sk_sort(app_pkey_methods);
286         return 1;
287         }
288
289 void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx)
290         {
291         if (ctx->pmeth && ctx->pmeth->cleanup)
292                 ctx->pmeth->cleanup(ctx);
293         if (ctx->pkey)
294                 EVP_PKEY_free(ctx->pkey);
295         if (ctx->peerkey)
296                 EVP_PKEY_free(ctx->peerkey);
297 #ifndef OPENSSL_NO_ENGINE
298         if(ctx->engine)
299                 /* The EVP_PKEY_CTX we used belongs to an ENGINE, release the
300                  * functional reference we held for this reason. */
301                 ENGINE_finish(ctx->engine);
302 #endif
303         OPENSSL_free(ctx);
304         }
305
306 int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype,
307                                 int cmd, int p1, void *p2)
308         {
309         int ret;
310         if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl)
311                 {
312                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED);
313                 return -2;
314                 }
315         if ((keytype != -1) && (ctx->pmeth->pkey_id != keytype))
316                 return -1;
317
318         if (ctx->operation == EVP_PKEY_OP_UNDEFINED)
319                 {
320                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_NO_OPERATION_SET);
321                 return -1;
322                 }
323
324         if ((optype != -1) && !(ctx->operation & optype))
325                 {
326                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_INVALID_OPERATION);
327                 return -1;
328                 }
329
330         ret = ctx->pmeth->ctrl(ctx, cmd, p1, p2);
331
332         if (ret == -2)
333                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED);
334
335         return ret;
336
337         }
338
339 int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx,
340                                         const char *name, const char *value)
341         {
342         if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl_str)
343                 {
344                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR,
345                                                 EVP_R_COMMAND_NOT_SUPPORTED);
346                 return -2;
347                 }
348         if (!strcmp(name, "digest"))
349                 {
350                 const EVP_MD *md;
351                 if (!value || !(md = EVP_get_digestbyname(value)))
352                         {
353                         EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR,
354                                                 EVP_R_INVALID_DIGEST);
355                         return 0;
356                         }
357                 return EVP_PKEY_CTX_set_signature_md(ctx, md);
358                 }
359         return ctx->pmeth->ctrl_str(ctx, name, value);
360         }
361
362 int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx)
363         {
364         return ctx->operation;
365         }
366
367 void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen)
368         {
369         ctx->keygen_info = dat;
370         ctx->keygen_info_count = datlen;
371         }
372
373 void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data)
374         {
375         ctx->data = data;
376         }
377
378 void *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx)
379         {
380         return ctx->data;
381         }
382
383 EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx)
384         {
385         return ctx->pkey;
386         }
387
388 void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data)
389         {
390         ctx->app_data = data;
391         }
392
393 void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx)
394         {
395         return ctx->app_data;
396         }
397
398 void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth,
399         int (*init)(EVP_PKEY_CTX *ctx))
400         {
401         pmeth->init = init;
402         }
403
404 void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth,
405         int (*copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src))
406         {
407         pmeth->copy = copy;
408         }
409
410 void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth,
411         void (*cleanup)(EVP_PKEY_CTX *ctx))
412         {
413         pmeth->cleanup = cleanup;
414         }
415
416 void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth,
417         int (*paramgen_init)(EVP_PKEY_CTX *ctx),
418         int (*paramgen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey))
419         {
420         pmeth->paramgen_init = paramgen_init;
421         pmeth->paramgen = paramgen;
422         }
423
424 void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth,
425         int (*keygen_init)(EVP_PKEY_CTX *ctx),
426         int (*keygen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey))
427         {
428         pmeth->keygen_init = keygen_init;
429         pmeth->keygen = keygen;
430         }
431
432 void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth,
433         int (*sign_init)(EVP_PKEY_CTX *ctx),
434         int (*sign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
435                                         const unsigned char *tbs, size_t tbslen))
436         {
437         pmeth->sign_init = sign_init;
438         pmeth->sign = sign;
439         }
440
441 void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth,
442         int (*verify_init)(EVP_PKEY_CTX *ctx),
443         int (*verify)(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen,
444                                         const unsigned char *tbs, size_t tbslen))
445         {
446         pmeth->verify_init = verify_init;
447         pmeth->verify = verify;
448         }
449
450 void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth,
451         int (*verify_recover_init)(EVP_PKEY_CTX *ctx),
452         int (*verify_recover)(EVP_PKEY_CTX *ctx,
453                                         unsigned char *sig, size_t *siglen,
454                                         const unsigned char *tbs, size_t tbslen))
455         {
456         pmeth->verify_recover_init = verify_recover_init;
457         pmeth->verify_recover = verify_recover;
458         }
459
460 void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth,
461         int (*signctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx),
462         int (*signctx)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
463                                         EVP_MD_CTX *mctx))
464         {
465         pmeth->signctx_init = signctx_init;
466         pmeth->signctx = signctx;
467         }
468
469 void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth,
470         int (*verifyctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx),
471         int (*verifyctx)(EVP_PKEY_CTX *ctx, const unsigned char *sig,int siglen,
472                                         EVP_MD_CTX *mctx))
473         {
474         pmeth->verifyctx_init = verifyctx_init;
475         pmeth->verifyctx = verifyctx;
476         }
477
478 void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth,
479         int (*encrypt_init)(EVP_PKEY_CTX *ctx),
480         int (*encrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
481                                         const unsigned char *in, size_t inlen))
482         {
483         pmeth->encrypt_init = encrypt_init;
484         pmeth->encrypt = encrypt;
485         }
486
487 void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth,
488         int (*decrypt_init)(EVP_PKEY_CTX *ctx),
489         int (*decrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
490                                         const unsigned char *in, size_t inlen))
491         {
492         pmeth->decrypt_init = decrypt_init;
493         pmeth->decrypt = decrypt;
494         }
495
496 void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth,
497         int (*derive_init)(EVP_PKEY_CTX *ctx),
498         int (*derive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen))
499         {
500         pmeth->derive_init = derive_init;
501         pmeth->derive = derive;
502         }
503
504 void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth,
505         int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2),
506         int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value))
507         {
508         pmeth->ctrl = ctrl;
509         pmeth->ctrl_str = ctrl_str;
510         }