29448c00ecba750ac73eb0ee6d045cb9a5597fdc
[openssl.git] / crypto / evp / pmeth_lib.c
1 /* pmeth_lib.c */
2 /* Written by Dr Stephen N Henson (steve@openssl.org) 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
72 DECLARE_STACK_OF(EVP_PKEY_METHOD)
73 STACK_OF(EVP_PKEY_METHOD) *app_pkey_methods = NULL;
74
75 extern const EVP_PKEY_METHOD rsa_pkey_meth, dh_pkey_meth, dsa_pkey_meth;
76 extern const EVP_PKEY_METHOD ec_pkey_meth, hmac_pkey_meth, cmac_pkey_meth;
77
78 static const EVP_PKEY_METHOD *standard_methods[] =
79         {
80 #ifndef OPENSSL_NO_RSA
81         &rsa_pkey_meth,
82 #endif
83 #ifndef OPENSSL_NO_DH
84         &dh_pkey_meth,
85 #endif
86 #ifndef OPENSSL_NO_DSA
87         &dsa_pkey_meth,
88 #endif
89 #ifndef OPENSSL_NO_EC
90         &ec_pkey_meth,
91 #endif
92         &hmac_pkey_meth,
93         &cmac_pkey_meth
94         };
95
96 DECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, const EVP_PKEY_METHOD *,
97                            pmeth);
98
99 static int pmeth_cmp(const EVP_PKEY_METHOD * const *a,
100                      const EVP_PKEY_METHOD * const *b)
101         {
102         return ((*a)->pkey_id - (*b)->pkey_id);
103         }
104
105 IMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, const EVP_PKEY_METHOD *,
106                              pmeth);
107
108 const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type)
109         {
110         EVP_PKEY_METHOD tmp;
111         const EVP_PKEY_METHOD *t = &tmp, **ret;
112         tmp.pkey_id = type;
113         if (app_pkey_methods)
114                 {
115                 int idx;
116                 idx = sk_EVP_PKEY_METHOD_find(app_pkey_methods, &tmp);
117                 if (idx >= 0)
118                         return sk_EVP_PKEY_METHOD_value(app_pkey_methods, idx);
119                 }
120         ret = OBJ_bsearch_pmeth(&t, standard_methods,
121                           sizeof(standard_methods)/sizeof(EVP_PKEY_METHOD *));
122         if (!ret || !*ret)
123                 return NULL;
124         return *ret;
125         }
126
127 static EVP_PKEY_CTX *int_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id)
128         {
129         EVP_PKEY_CTX *ret;
130         const EVP_PKEY_METHOD *pmeth;
131         if (id == -1)
132                 {
133                 if (!pkey || !pkey->ameth)
134                         return NULL;
135                 id = pkey->ameth->pkey_id;
136                 }
137 #ifndef OPENSSL_NO_ENGINE
138         /* Try to find an ENGINE which implements this method */
139         if (e)
140                 {
141                 if (!ENGINE_init(e))
142                         {
143                         EVPerr(EVP_F_INT_CTX_NEW,ERR_R_ENGINE_LIB);
144                         return NULL;
145                         }
146                 }
147         else
148                 e = ENGINE_get_pkey_meth_engine(id);
149
150         /* If an ENGINE handled this method look it up. Othewise
151          * use internal tables.
152          */
153
154         if (e)
155                 pmeth = ENGINE_get_pkey_meth(e, id);
156         else
157 #endif
158                 pmeth = EVP_PKEY_meth_find(id);
159
160         if (pmeth == NULL)
161                 {
162                 EVPerr(EVP_F_INT_CTX_NEW,EVP_R_UNSUPPORTED_ALGORITHM);
163                 return NULL;
164                 }
165
166         ret = OPENSSL_malloc(sizeof(EVP_PKEY_CTX));
167         if (!ret)
168                 {
169 #ifndef OPENSSL_NO_ENGINE
170                 if (e)
171                         ENGINE_finish(e);
172 #endif
173                 EVPerr(EVP_F_INT_CTX_NEW,ERR_R_MALLOC_FAILURE);
174                 return NULL;
175                 }
176         ret->engine = e;
177         ret->pmeth = pmeth;
178         ret->operation = EVP_PKEY_OP_UNDEFINED;
179         ret->pkey = pkey;
180         ret->peerkey = NULL;
181         ret->pkey_gencb = 0;
182         if (pkey)
183                 CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
184         ret->data = NULL;
185
186         if (pmeth->init)
187                 {
188                 if (pmeth->init(ret) <= 0)
189                         {
190                         EVP_PKEY_CTX_free(ret);
191                         return NULL;
192                         }
193                 }
194
195         return ret;
196         }
197
198 EVP_PKEY_METHOD* EVP_PKEY_meth_new(int id, int flags)
199         {
200         EVP_PKEY_METHOD *pmeth;
201         pmeth = OPENSSL_malloc(sizeof(EVP_PKEY_METHOD));
202         if (!pmeth)
203                 return NULL;
204
205         pmeth->pkey_id = id;
206         pmeth->flags = flags | EVP_PKEY_FLAG_DYNAMIC;
207
208         pmeth->init = 0;
209         pmeth->copy = 0;
210         pmeth->cleanup = 0;
211         pmeth->paramgen_init = 0;
212         pmeth->paramgen = 0;
213         pmeth->keygen_init = 0;
214         pmeth->keygen = 0;
215         pmeth->sign_init = 0;
216         pmeth->sign = 0;
217         pmeth->verify_init = 0;
218         pmeth->verify = 0;
219         pmeth->verify_recover_init = 0;
220         pmeth->verify_recover = 0;
221         pmeth->signctx_init = 0;
222         pmeth->signctx = 0;
223         pmeth->verifyctx_init = 0;
224         pmeth->verifyctx = 0;
225         pmeth->encrypt_init = 0;
226         pmeth->encrypt = 0;
227         pmeth->decrypt_init = 0;
228         pmeth->decrypt = 0;
229         pmeth->derive_init = 0;
230         pmeth->derive = 0;
231         pmeth->ctrl = 0;
232         pmeth->ctrl_str = 0;
233
234         return pmeth;
235         }
236
237 void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth)
238         {
239         if (pmeth && (pmeth->flags & EVP_PKEY_FLAG_DYNAMIC))
240                 OPENSSL_free(pmeth);
241         }
242
243 EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e)
244         {
245         return int_ctx_new(pkey, e, -1);
246         }
247
248 EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e)
249         {
250         return int_ctx_new(NULL, e, id);
251         }
252
253 EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx)
254         {
255         EVP_PKEY_CTX *rctx;
256         if (!pctx->pmeth || !pctx->pmeth->copy)
257                 return NULL;
258 #ifndef OPENSSL_NO_ENGINE
259         /* Make sure it's safe to copy a pkey context using an ENGINE */
260         if (pctx->engine && !ENGINE_init(pctx->engine))
261                 {
262                 EVPerr(EVP_F_EVP_PKEY_CTX_DUP,ERR_R_ENGINE_LIB);
263                 return 0;
264                 }
265 #endif
266         rctx = OPENSSL_malloc(sizeof(EVP_PKEY_CTX));
267         if (!rctx)
268                 return NULL;
269
270         rctx->pmeth = pctx->pmeth;
271 #ifndef OPENSSL_NO_ENGINE
272         rctx->engine = pctx->engine;
273 #endif
274
275         if (pctx->pkey)
276                 CRYPTO_add(&pctx->pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
277
278         rctx->pkey = pctx->pkey;
279
280         if (pctx->peerkey)
281                 CRYPTO_add(&pctx->peerkey->references,1,CRYPTO_LOCK_EVP_PKEY);
282
283         rctx->peerkey = pctx->peerkey;
284
285         rctx->data = NULL;
286         rctx->app_data = NULL;
287         rctx->operation = pctx->operation;
288
289         if (pctx->pmeth->copy(rctx, pctx) > 0)
290                 return rctx;
291
292         EVP_PKEY_CTX_free(rctx);
293         return NULL;
294
295         }
296
297 int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth)
298         {
299         if (app_pkey_methods == NULL)
300                 {
301                 app_pkey_methods = sk_EVP_PKEY_METHOD_new(pmeth_cmp);
302                 if (!app_pkey_methods)
303                         return 0;
304                 }
305         if (!sk_EVP_PKEY_METHOD_push(app_pkey_methods, pmeth))
306                 return 0;
307         sk_EVP_PKEY_METHOD_sort(app_pkey_methods);
308         return 1;
309         }
310
311 void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx)
312         {
313         if (ctx == NULL)
314                 return;
315         if (ctx->pmeth && ctx->pmeth->cleanup)
316                 ctx->pmeth->cleanup(ctx);
317         if (ctx->pkey)
318                 EVP_PKEY_free(ctx->pkey);
319         if (ctx->peerkey)
320                 EVP_PKEY_free(ctx->peerkey);
321 #ifndef OPENSSL_NO_ENGINE
322         if(ctx->engine)
323                 /* The EVP_PKEY_CTX we used belongs to an ENGINE, release the
324                  * functional reference we held for this reason. */
325                 ENGINE_finish(ctx->engine);
326 #endif
327         OPENSSL_free(ctx);
328         }
329
330 int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype,
331                                 int cmd, int p1, void *p2)
332         {
333         int ret;
334         if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl)
335                 {
336                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED);
337                 return -2;
338                 }
339         if ((keytype != -1) && (ctx->pmeth->pkey_id != keytype))
340                 return -1;
341
342         if (ctx->operation == EVP_PKEY_OP_UNDEFINED)
343                 {
344                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_NO_OPERATION_SET);
345                 return -1;
346                 }
347
348         if ((optype != -1) && !(ctx->operation & optype))
349                 {
350                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_INVALID_OPERATION);
351                 return -1;
352                 }
353
354         ret = ctx->pmeth->ctrl(ctx, cmd, p1, p2);
355
356         if (ret == -2)
357                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED);
358
359         return ret;
360
361         }
362
363 int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx,
364                                         const char *name, const char *value)
365         {
366         if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl_str)
367                 {
368                 EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR,
369                                                 EVP_R_COMMAND_NOT_SUPPORTED);
370                 return -2;
371                 }
372         if (!strcmp(name, "digest"))
373                 {
374                 const EVP_MD *md;
375                 if (!value || !(md = EVP_get_digestbyname(value)))
376                         {
377                         EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR,
378                                                 EVP_R_INVALID_DIGEST);
379                         return 0;
380                         }
381                 return EVP_PKEY_CTX_set_signature_md(ctx, md);
382                 }
383         return ctx->pmeth->ctrl_str(ctx, name, value);
384         }
385
386 int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx)
387         {
388         return ctx->operation;
389         }
390
391 void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen)
392         {
393         ctx->keygen_info = dat;
394         ctx->keygen_info_count = datlen;
395         }
396
397 void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data)
398         {
399         ctx->data = data;
400         }
401
402 void *EVP_PKEY_CTX_get_data(EVP_PKEY_CTX *ctx)
403         {
404         return ctx->data;
405         }
406
407 EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx)
408         {
409         return ctx->pkey;
410         }
411
412 EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx)
413         {
414         return ctx->peerkey;
415         }
416         
417 void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data)
418         {
419         ctx->app_data = data;
420         }
421
422 void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx)
423         {
424         return ctx->app_data;
425         }
426
427 void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth,
428         int (*init)(EVP_PKEY_CTX *ctx))
429         {
430         pmeth->init = init;
431         }
432
433 void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth,
434         int (*copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src))
435         {
436         pmeth->copy = copy;
437         }
438
439 void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth,
440         void (*cleanup)(EVP_PKEY_CTX *ctx))
441         {
442         pmeth->cleanup = cleanup;
443         }
444
445 void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth,
446         int (*paramgen_init)(EVP_PKEY_CTX *ctx),
447         int (*paramgen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey))
448         {
449         pmeth->paramgen_init = paramgen_init;
450         pmeth->paramgen = paramgen;
451         }
452
453 void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth,
454         int (*keygen_init)(EVP_PKEY_CTX *ctx),
455         int (*keygen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey))
456         {
457         pmeth->keygen_init = keygen_init;
458         pmeth->keygen = keygen;
459         }
460
461 void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth,
462         int (*sign_init)(EVP_PKEY_CTX *ctx),
463         int (*sign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
464                                         const unsigned char *tbs, size_t tbslen))
465         {
466         pmeth->sign_init = sign_init;
467         pmeth->sign = sign;
468         }
469
470 void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth,
471         int (*verify_init)(EVP_PKEY_CTX *ctx),
472         int (*verify)(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen,
473                                         const unsigned char *tbs, size_t tbslen))
474         {
475         pmeth->verify_init = verify_init;
476         pmeth->verify = verify;
477         }
478
479 void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth,
480         int (*verify_recover_init)(EVP_PKEY_CTX *ctx),
481         int (*verify_recover)(EVP_PKEY_CTX *ctx,
482                                         unsigned char *sig, size_t *siglen,
483                                         const unsigned char *tbs, size_t tbslen))
484         {
485         pmeth->verify_recover_init = verify_recover_init;
486         pmeth->verify_recover = verify_recover;
487         }
488
489 void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth,
490         int (*signctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx),
491         int (*signctx)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
492                                         EVP_MD_CTX *mctx))
493         {
494         pmeth->signctx_init = signctx_init;
495         pmeth->signctx = signctx;
496         }
497
498 void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth,
499         int (*verifyctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx),
500         int (*verifyctx)(EVP_PKEY_CTX *ctx, const unsigned char *sig,int siglen,
501                                         EVP_MD_CTX *mctx))
502         {
503         pmeth->verifyctx_init = verifyctx_init;
504         pmeth->verifyctx = verifyctx;
505         }
506
507 void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth,
508         int (*encrypt_init)(EVP_PKEY_CTX *ctx),
509         int (*encryptfn)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
510                                         const unsigned char *in, size_t inlen))
511         {
512         pmeth->encrypt_init = encrypt_init;
513         pmeth->encrypt = encryptfn;
514         }
515
516 void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth,
517         int (*decrypt_init)(EVP_PKEY_CTX *ctx),
518         int (*decrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
519                                         const unsigned char *in, size_t inlen))
520         {
521         pmeth->decrypt_init = decrypt_init;
522         pmeth->decrypt = decrypt;
523         }
524
525 void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth,
526         int (*derive_init)(EVP_PKEY_CTX *ctx),
527         int (*derive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen))
528         {
529         pmeth->derive_init = derive_init;
530         pmeth->derive = derive;
531         }
532
533 void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth,
534         int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2),
535         int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value))
536         {
537         pmeth->ctrl = ctrl;
538         pmeth->ctrl_str = ctrl_str;
539         }