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