6d34accc3cde7783df80408e5f8f9d67e8bebc93
[openssl.git] / crypto / evp / pmeth_lib.c
1 /*
2  * Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 /*
11  * Low level key APIs (DH etc) are deprecated for public use, but still ok for
12  * internal use.
13  */
14 #include "internal/deprecated.h"
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <openssl/engine.h>
19 #include <openssl/evp.h>
20 #include <openssl/x509v3.h>
21 #include <openssl/core_names.h>
22 #include <openssl/dh.h>
23 #include <openssl/rsa.h>
24 #include "internal/cryptlib.h"
25 #include "crypto/asn1.h"
26 #include "crypto/evp.h"
27 #include "internal/numbers.h"
28 #include "internal/provider.h"
29 #include "evp_local.h"
30
31 #ifndef FIPS_MODE
32
33 typedef const EVP_PKEY_METHOD *(*pmeth_fn)(void);
34 typedef int sk_cmp_fn_type(const char *const *a, const char *const *b);
35
36 static STACK_OF(EVP_PKEY_METHOD) *app_pkey_methods = NULL;
37
38 /* This array needs to be in order of NIDs */
39 static pmeth_fn standard_methods[] = {
40 # ifndef OPENSSL_NO_RSA
41     rsa_pkey_method,
42 # endif
43 # ifndef OPENSSL_NO_DH
44     dh_pkey_method,
45 # endif
46 # ifndef OPENSSL_NO_DSA
47     dsa_pkey_method,
48 # endif
49 # ifndef OPENSSL_NO_EC
50     ec_pkey_method,
51 # endif
52     hmac_pkey_method,
53 # ifndef OPENSSL_NO_CMAC
54     cmac_pkey_method,
55 # endif
56 # ifndef OPENSSL_NO_RSA
57     rsa_pss_pkey_method,
58 # endif
59 # ifndef OPENSSL_NO_DH
60     dhx_pkey_method,
61 # endif
62 # ifndef OPENSSL_NO_SCRYPT
63     scrypt_pkey_method,
64 # endif
65     tls1_prf_pkey_method,
66 # ifndef OPENSSL_NO_EC
67     ecx25519_pkey_method,
68     ecx448_pkey_method,
69 # endif
70     hkdf_pkey_method,
71 # ifndef OPENSSL_NO_POLY1305
72     poly1305_pkey_method,
73 # endif
74 # ifndef OPENSSL_NO_SIPHASH
75     siphash_pkey_method,
76 # endif
77 # ifndef OPENSSL_NO_EC
78     ed25519_pkey_method,
79     ed448_pkey_method,
80 # endif
81 # ifndef OPENSSL_NO_SM2
82     sm2_pkey_method,
83 # endif
84 };
85
86 DECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, pmeth_fn, pmeth_func);
87
88 static int pmeth_func_cmp(const EVP_PKEY_METHOD *const *a, pmeth_fn const *b)
89 {
90     return ((*a)->pkey_id - ((**b)())->pkey_id);
91 }
92
93 IMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_METHOD *, pmeth_fn, pmeth_func);
94
95 static int pmeth_cmp(const EVP_PKEY_METHOD *const *a,
96                      const EVP_PKEY_METHOD *const *b)
97 {
98     return ((*a)->pkey_id - (*b)->pkey_id);
99 }
100
101 const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type)
102 {
103     pmeth_fn *ret;
104     EVP_PKEY_METHOD tmp;
105     const EVP_PKEY_METHOD *t = &tmp;
106
107     tmp.pkey_id = type;
108     if (app_pkey_methods) {
109         int idx;
110         idx = sk_EVP_PKEY_METHOD_find(app_pkey_methods, &tmp);
111         if (idx >= 0)
112             return sk_EVP_PKEY_METHOD_value(app_pkey_methods, idx);
113     }
114     ret = OBJ_bsearch_pmeth_func(&t, standard_methods,
115                                  sizeof(standard_methods) /
116                                  sizeof(pmeth_fn));
117     if (ret == NULL || *ret == NULL)
118         return NULL;
119     return (**ret)();
120 }
121
122 EVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags)
123 {
124     EVP_PKEY_METHOD *pmeth;
125
126     pmeth = OPENSSL_zalloc(sizeof(*pmeth));
127     if (pmeth == NULL) {
128         EVPerr(EVP_F_EVP_PKEY_METH_NEW, ERR_R_MALLOC_FAILURE);
129         return NULL;
130     }
131
132     pmeth->pkey_id = id;
133     pmeth->flags = flags | EVP_PKEY_FLAG_DYNAMIC;
134     return pmeth;
135 }
136 #endif /* FIPS_MODE */
137
138 static EVP_PKEY_CTX *int_ctx_new(OPENSSL_CTX *libctx,
139                                  EVP_PKEY *pkey, ENGINE *e,
140                                  const char *keytype, const char *propquery,
141                                  int id)
142
143 {
144     EVP_PKEY_CTX *ret;
145     const EVP_PKEY_METHOD *pmeth = NULL;
146     EVP_KEYMGMT *keymgmt = NULL;
147
148     /*
149      * When using providers, the context is bound to the algo implementation
150      * later.
151      */
152     if (pkey == NULL && e == NULL && id == -1)
153         goto common;
154
155     /*
156      * If the key doesn't contain anything legacy, then it must be provided,
157      * so we extract the necessary information and use that.
158      */
159     if (pkey != NULL && pkey->type == EVP_PKEY_NONE) {
160         /* If we have an engine, something went wrong somewhere... */
161         if (!ossl_assert(e == NULL))
162             return NULL;
163         keytype = evp_first_name(pkey->keymgmt->prov, pkey->keymgmt->name_id);
164         goto common;
165     }
166 #ifndef FIPS_MODE
167     /* TODO(3.0) Legacy code should be removed when all is provider based */
168     /* BEGIN legacy */
169     if (id == -1) {
170         if (pkey == NULL)
171             return NULL;
172         id = pkey->type;
173     }
174
175     /*
176      * Here, we extract what information we can for the purpose of
177      * supporting usage with implementations from providers, to make
178      * for a smooth transition from legacy stuff to provider based stuff.
179      *
180      * If an engine is given, this is entirely legacy, and we should not
181      * pretend anything else, so we only set the name when no engine is
182      * given.  If both are already given, someone made a mistake, and
183      * since that can only happen internally, it's safe to make an
184      * assertion.
185      */
186     if (!ossl_assert(e == NULL || keytype == NULL))
187         return NULL;
188     if (e == NULL)
189         keytype = OBJ_nid2sn(id);
190
191 # ifndef OPENSSL_NO_ENGINE
192     if (e == NULL && pkey != NULL)
193         e = pkey->pmeth_engine != NULL ? pkey->pmeth_engine : pkey->engine;
194     /* Try to find an ENGINE which implements this method */
195     if (e) {
196         if (!ENGINE_init(e)) {
197             EVPerr(EVP_F_INT_CTX_NEW, ERR_R_ENGINE_LIB);
198             return NULL;
199         }
200     } else {
201         e = ENGINE_get_pkey_meth_engine(id);
202     }
203
204     /*
205      * If an ENGINE handled this method look it up. Otherwise use internal
206      * tables.
207      */
208     if (e)
209         pmeth = ENGINE_get_pkey_meth(e, id);
210     else
211 # endif
212         pmeth = EVP_PKEY_meth_find(id);
213
214     if (pmeth == NULL) {
215 # ifndef OPENSSL_NO_ENGINE
216         ENGINE_finish(e);
217 # endif
218         EVPerr(EVP_F_INT_CTX_NEW, EVP_R_UNSUPPORTED_ALGORITHM);
219         return NULL;
220     }
221     /* END legacy */
222 #endif /* FIPS_MODE */
223  common:
224     /*
225      * If there's no engine and there's a name, we try fetching a provider
226      * implementation.
227      */
228     if (e == NULL && keytype != NULL) {
229         /* This could fail so ignore errors */
230         ERR_set_mark();
231         keymgmt = EVP_KEYMGMT_fetch(libctx, keytype, propquery);
232         ERR_pop_to_mark();
233     }
234
235     ret = OPENSSL_zalloc(sizeof(*ret));
236     if (ret == NULL) {
237 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
238         ENGINE_finish(e);
239 #endif
240         EVPerr(EVP_F_INT_CTX_NEW, ERR_R_MALLOC_FAILURE);
241         return NULL;
242     }
243     ret->libctx = libctx;
244     ret->propquery = propquery;
245     ret->keytype = keytype;
246     ret->keymgmt = keymgmt;
247     ret->engine = e;
248     ret->pmeth = pmeth;
249     ret->operation = EVP_PKEY_OP_UNDEFINED;
250     ret->pkey = pkey;
251     if (pkey != NULL)
252         EVP_PKEY_up_ref(pkey);
253
254     if (pmeth != NULL && pmeth->init != NULL) {
255         if (pmeth->init(ret) <= 0) {
256             ret->pmeth = NULL;
257             EVP_PKEY_CTX_free(ret);
258             return NULL;
259         }
260     }
261
262     return ret;
263 }
264
265 /*- All methods below can also be used in FIPS_MODE */
266
267 EVP_PKEY_CTX *EVP_PKEY_CTX_new_from_name(OPENSSL_CTX *libctx,
268                                          const char *name,
269                                          const char *propquery)
270 {
271     return int_ctx_new(libctx, NULL, NULL, name, propquery, -1);
272 }
273
274 EVP_PKEY_CTX *EVP_PKEY_CTX_new_from_pkey(OPENSSL_CTX *libctx, EVP_PKEY *pkey,
275                                          const char *propquery)
276 {
277     return int_ctx_new(libctx, pkey, NULL, NULL, propquery, -1);
278 }
279
280 void evp_pkey_ctx_free_old_ops(EVP_PKEY_CTX *ctx)
281 {
282     if (EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)) {
283         if (ctx->op.sig.sigprovctx != NULL && ctx->op.sig.signature != NULL)
284             ctx->op.sig.signature->freectx(ctx->op.sig.sigprovctx);
285         EVP_SIGNATURE_free(ctx->op.sig.signature);
286         ctx->op.sig.sigprovctx = NULL;
287         ctx->op.sig.signature = NULL;
288     } else if (EVP_PKEY_CTX_IS_DERIVE_OP(ctx)) {
289         if (ctx->op.kex.exchprovctx != NULL && ctx->op.kex.exchange != NULL)
290             ctx->op.kex.exchange->freectx(ctx->op.kex.exchprovctx);
291         EVP_KEYEXCH_free(ctx->op.kex.exchange);
292         ctx->op.kex.exchprovctx = NULL;
293         ctx->op.kex.exchange = NULL;
294     }
295 /* TODO(3.0): add dependancies and uncomment this when available for fips mode */
296 #ifndef FIPS_MODE
297     else if (EVP_PKEY_CTX_IS_ASYM_CIPHER_OP(ctx)) {
298         if (ctx->op.ciph.ciphprovctx != NULL && ctx->op.ciph.cipher != NULL)
299             ctx->op.ciph.cipher->freectx(ctx->op.ciph.ciphprovctx);
300         EVP_ASYM_CIPHER_free(ctx->op.ciph.cipher);
301         ctx->op.ciph.ciphprovctx = NULL;
302         ctx->op.ciph.cipher = NULL;
303     } else if (EVP_PKEY_CTX_IS_GEN_OP(ctx)) {
304         if (ctx->op.keymgmt.genctx != NULL && ctx->keymgmt != NULL)
305             evp_keymgmt_gen_cleanup(ctx->keymgmt, ctx->op.keymgmt.genctx);
306     }
307 #endif
308 }
309
310 void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx)
311 {
312     if (ctx == NULL)
313         return;
314     if (ctx->pmeth && ctx->pmeth->cleanup)
315         ctx->pmeth->cleanup(ctx);
316
317     evp_pkey_ctx_free_old_ops(ctx);
318     EVP_KEYMGMT_free(ctx->keymgmt);
319
320     EVP_PKEY_free(ctx->pkey);
321     EVP_PKEY_free(ctx->peerkey);
322 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
323     ENGINE_finish(ctx->engine);
324 #endif
325     OPENSSL_free(ctx);
326 }
327
328 #ifndef FIPS_MODE
329
330 void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags,
331                              const EVP_PKEY_METHOD *meth)
332 {
333     if (ppkey_id)
334         *ppkey_id = meth->pkey_id;
335     if (pflags)
336         *pflags = meth->flags;
337 }
338
339 void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src)
340 {
341
342     dst->init = src->init;
343     dst->copy = src->copy;
344     dst->cleanup = src->cleanup;
345
346     dst->paramgen_init = src->paramgen_init;
347     dst->paramgen = src->paramgen;
348
349     dst->keygen_init = src->keygen_init;
350     dst->keygen = src->keygen;
351
352     dst->sign_init = src->sign_init;
353     dst->sign = src->sign;
354
355     dst->verify_init = src->verify_init;
356     dst->verify = src->verify;
357
358     dst->verify_recover_init = src->verify_recover_init;
359     dst->verify_recover = src->verify_recover;
360
361     dst->signctx_init = src->signctx_init;
362     dst->signctx = src->signctx;
363
364     dst->verifyctx_init = src->verifyctx_init;
365     dst->verifyctx = src->verifyctx;
366
367     dst->encrypt_init = src->encrypt_init;
368     dst->encrypt = src->encrypt;
369
370     dst->decrypt_init = src->decrypt_init;
371     dst->decrypt = src->decrypt;
372
373     dst->derive_init = src->derive_init;
374     dst->derive = src->derive;
375
376     dst->ctrl = src->ctrl;
377     dst->ctrl_str = src->ctrl_str;
378
379     dst->check = src->check;
380 }
381
382 void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth)
383 {
384     if (pmeth && (pmeth->flags & EVP_PKEY_FLAG_DYNAMIC))
385         OPENSSL_free(pmeth);
386 }
387
388 EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e)
389 {
390     return int_ctx_new(NULL, pkey, e, NULL, NULL, -1);
391 }
392
393 EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e)
394 {
395     return int_ctx_new(NULL, NULL, e, NULL, NULL, id);
396 }
397
398 EVP_PKEY_CTX *EVP_PKEY_CTX_dup(const EVP_PKEY_CTX *pctx)
399 {
400     EVP_PKEY_CTX *rctx;
401
402     if (((pctx->pmeth == NULL) || (pctx->pmeth->copy == NULL))
403             && ((EVP_PKEY_CTX_IS_DERIVE_OP(pctx)
404                  && pctx->op.kex.exchprovctx == NULL)
405                 || (EVP_PKEY_CTX_IS_SIGNATURE_OP(pctx)
406                     && pctx->op.sig.sigprovctx == NULL)))
407         return NULL;
408 # ifndef OPENSSL_NO_ENGINE
409     /* Make sure it's safe to copy a pkey context using an ENGINE */
410     if (pctx->engine && !ENGINE_init(pctx->engine)) {
411         EVPerr(EVP_F_EVP_PKEY_CTX_DUP, ERR_R_ENGINE_LIB);
412         return 0;
413     }
414 # endif
415     rctx = OPENSSL_zalloc(sizeof(*rctx));
416     if (rctx == NULL) {
417         EVPerr(EVP_F_EVP_PKEY_CTX_DUP, ERR_R_MALLOC_FAILURE);
418         return NULL;
419     }
420
421     if (pctx->pkey != NULL)
422         EVP_PKEY_up_ref(pctx->pkey);
423     rctx->pkey = pctx->pkey;
424     rctx->operation = pctx->operation;
425     rctx->libctx = pctx->libctx;
426     rctx->keytype = pctx->keytype;
427     rctx->propquery = pctx->propquery;
428
429     if (EVP_PKEY_CTX_IS_DERIVE_OP(pctx)) {
430         if (pctx->op.kex.exchange != NULL) {
431             rctx->op.kex.exchange = pctx->op.kex.exchange;
432             if (!EVP_KEYEXCH_up_ref(rctx->op.kex.exchange)) {
433                 OPENSSL_free(rctx);
434                 return NULL;
435             }
436         }
437         if (pctx->op.kex.exchprovctx != NULL) {
438             if (!ossl_assert(pctx->op.kex.exchange != NULL))
439                 return NULL;
440             rctx->op.kex.exchprovctx
441                 = pctx->op.kex.exchange->dupctx(pctx->op.kex.exchprovctx);
442             if (rctx->op.kex.exchprovctx == NULL) {
443                 EVP_KEYEXCH_free(rctx->op.kex.exchange);
444                 OPENSSL_free(rctx);
445                 return NULL;
446             }
447             return rctx;
448         }
449     } else if (EVP_PKEY_CTX_IS_SIGNATURE_OP(pctx)) {
450         if (pctx->op.sig.signature != NULL) {
451             rctx->op.sig.signature = pctx->op.sig.signature;
452             if (!EVP_SIGNATURE_up_ref(rctx->op.sig.signature)) {
453                 OPENSSL_free(rctx);
454                 return NULL;
455             }
456         }
457         if (pctx->op.sig.sigprovctx != NULL) {
458             if (!ossl_assert(pctx->op.sig.signature != NULL))
459                 return NULL;
460             rctx->op.sig.sigprovctx
461                 = pctx->op.sig.signature->dupctx(pctx->op.sig.sigprovctx);
462             if (rctx->op.sig.sigprovctx == NULL) {
463                 EVP_SIGNATURE_free(rctx->op.sig.signature);
464                 OPENSSL_free(rctx);
465                 return NULL;
466             }
467             return rctx;
468         }
469     } else if (EVP_PKEY_CTX_IS_ASYM_CIPHER_OP(pctx)) {
470         if (pctx->op.ciph.cipher != NULL) {
471             rctx->op.ciph.cipher = pctx->op.ciph.cipher;
472             if (!EVP_ASYM_CIPHER_up_ref(rctx->op.ciph.cipher)) {
473                 OPENSSL_free(rctx);
474                 return NULL;
475             }
476         }
477         if (pctx->op.ciph.ciphprovctx != NULL) {
478             if (!ossl_assert(pctx->op.ciph.cipher != NULL))
479                 return NULL;
480             rctx->op.ciph.ciphprovctx
481                 = pctx->op.ciph.cipher->dupctx(pctx->op.ciph.ciphprovctx);
482             if (rctx->op.ciph.ciphprovctx == NULL) {
483                 EVP_ASYM_CIPHER_free(rctx->op.ciph.cipher);
484                 OPENSSL_free(rctx);
485                 return NULL;
486             }
487             return rctx;
488         }
489     }
490
491     rctx->pmeth = pctx->pmeth;
492 # ifndef OPENSSL_NO_ENGINE
493     rctx->engine = pctx->engine;
494 # endif
495
496     if (pctx->peerkey)
497         EVP_PKEY_up_ref(pctx->peerkey);
498     rctx->peerkey = pctx->peerkey;
499
500     if (pctx->pmeth->copy(rctx, pctx) > 0)
501         return rctx;
502
503     rctx->pmeth = NULL;
504     EVP_PKEY_CTX_free(rctx);
505     return NULL;
506
507 }
508
509 int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth)
510 {
511     if (app_pkey_methods == NULL) {
512         app_pkey_methods = sk_EVP_PKEY_METHOD_new(pmeth_cmp);
513         if (app_pkey_methods == NULL){
514             EVPerr(EVP_F_EVP_PKEY_METH_ADD0, ERR_R_MALLOC_FAILURE);
515             return 0;
516         }
517     }
518     if (!sk_EVP_PKEY_METHOD_push(app_pkey_methods, pmeth)) {
519         EVPerr(EVP_F_EVP_PKEY_METH_ADD0, ERR_R_MALLOC_FAILURE);
520         return 0;
521     }
522     sk_EVP_PKEY_METHOD_sort(app_pkey_methods);
523     return 1;
524 }
525
526 void evp_app_cleanup_int(void)
527 {
528     if (app_pkey_methods != NULL)
529         sk_EVP_PKEY_METHOD_pop_free(app_pkey_methods, EVP_PKEY_meth_free);
530 }
531
532 int EVP_PKEY_meth_remove(const EVP_PKEY_METHOD *pmeth)
533 {
534     const EVP_PKEY_METHOD *ret;
535
536     ret = sk_EVP_PKEY_METHOD_delete_ptr(app_pkey_methods, pmeth);
537
538     return ret == NULL ? 0 : 1;
539 }
540
541 size_t EVP_PKEY_meth_get_count(void)
542 {
543     size_t rv = OSSL_NELEM(standard_methods);
544
545     if (app_pkey_methods)
546         rv += sk_EVP_PKEY_METHOD_num(app_pkey_methods);
547     return rv;
548 }
549
550 const EVP_PKEY_METHOD *EVP_PKEY_meth_get0(size_t idx)
551 {
552     if (idx < OSSL_NELEM(standard_methods))
553         return (standard_methods[idx])();
554     if (app_pkey_methods == NULL)
555         return NULL;
556     idx -= OSSL_NELEM(standard_methods);
557     if (idx >= (size_t)sk_EVP_PKEY_METHOD_num(app_pkey_methods))
558         return NULL;
559     return sk_EVP_PKEY_METHOD_value(app_pkey_methods, idx);
560 }
561 #endif
562
563 int EVP_PKEY_CTX_set_params(EVP_PKEY_CTX *ctx, OSSL_PARAM *params)
564 {
565     if (EVP_PKEY_CTX_IS_DERIVE_OP(ctx)
566             && ctx->op.kex.exchprovctx != NULL
567             && ctx->op.kex.exchange != NULL
568             && ctx->op.kex.exchange->set_ctx_params != NULL)
569         return ctx->op.kex.exchange->set_ctx_params(ctx->op.kex.exchprovctx,
570                                                     params);
571     if (EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)
572             && ctx->op.sig.sigprovctx != NULL
573             && ctx->op.sig.signature != NULL
574             && ctx->op.sig.signature->set_ctx_params != NULL)
575         return ctx->op.sig.signature->set_ctx_params(ctx->op.sig.sigprovctx,
576                                                      params);
577     if (EVP_PKEY_CTX_IS_ASYM_CIPHER_OP(ctx)
578             && ctx->op.ciph.ciphprovctx != NULL
579             && ctx->op.ciph.cipher != NULL
580             && ctx->op.ciph.cipher->set_ctx_params != NULL)
581         return ctx->op.ciph.cipher->set_ctx_params(ctx->op.ciph.ciphprovctx,
582                                                      params);
583     if (EVP_PKEY_CTX_IS_GEN_OP(ctx)
584         && ctx->op.keymgmt.genctx != NULL
585         && ctx->keymgmt != NULL
586         && ctx->keymgmt->gen_set_params != NULL)
587         return evp_keymgmt_gen_set_params(ctx->keymgmt, ctx->op.keymgmt.genctx,
588                                           params);
589     return 0;
590 }
591
592 #ifndef FIPS_MODE
593 int EVP_PKEY_CTX_get_params(EVP_PKEY_CTX *ctx, OSSL_PARAM *params)
594 {
595     if (EVP_PKEY_CTX_IS_DERIVE_OP(ctx)
596             && ctx->op.kex.exchprovctx != NULL
597             && ctx->op.kex.exchange != NULL
598             && ctx->op.kex.exchange->get_ctx_params != NULL)
599         return ctx->op.kex.exchange->get_ctx_params(ctx->op.kex.exchprovctx,
600                                                     params);
601     if (EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)
602             && ctx->op.sig.sigprovctx != NULL
603             && ctx->op.sig.signature != NULL
604             && ctx->op.sig.signature->get_ctx_params != NULL)
605         return ctx->op.sig.signature->get_ctx_params(ctx->op.sig.sigprovctx,
606                                                      params);
607     if (EVP_PKEY_CTX_IS_ASYM_CIPHER_OP(ctx)
608             && ctx->op.ciph.ciphprovctx != NULL
609             && ctx->op.ciph.cipher != NULL
610             && ctx->op.ciph.cipher->get_ctx_params != NULL)
611         return ctx->op.ciph.cipher->get_ctx_params(ctx->op.ciph.ciphprovctx,
612                                                    params);
613     if (EVP_PKEY_CTX_IS_GEN_OP(ctx)
614         && ctx->op.keymgmt.genctx != NULL
615         && ctx->keymgmt != NULL
616         && ctx->keymgmt->gen_get_params != NULL)
617         return evp_keymgmt_gen_get_params(ctx->keymgmt, ctx->op.keymgmt.genctx,
618                                           params);
619     return 0;
620 }
621
622 const OSSL_PARAM *EVP_PKEY_CTX_gettable_params(EVP_PKEY_CTX *ctx)
623 {
624     if (EVP_PKEY_CTX_IS_DERIVE_OP(ctx)
625             && ctx->op.kex.exchange != NULL
626             && ctx->op.kex.exchange->gettable_ctx_params != NULL)
627         return ctx->op.kex.exchange->gettable_ctx_params();
628     if (EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)
629             && ctx->op.sig.signature != NULL
630             && ctx->op.sig.signature->gettable_ctx_params != NULL)
631         return ctx->op.sig.signature->gettable_ctx_params();
632
633     if (EVP_PKEY_CTX_IS_ASYM_CIPHER_OP(ctx)
634             && ctx->op.ciph.cipher != NULL
635             && ctx->op.ciph.cipher->gettable_ctx_params != NULL)
636         return ctx->op.ciph.cipher->gettable_ctx_params();
637
638     return NULL;
639 }
640
641 const OSSL_PARAM *EVP_PKEY_CTX_settable_params(EVP_PKEY_CTX *ctx)
642 {
643     if (EVP_PKEY_CTX_IS_DERIVE_OP(ctx)
644             && ctx->op.kex.exchange != NULL
645             && ctx->op.kex.exchange->settable_ctx_params != NULL)
646         return ctx->op.kex.exchange->settable_ctx_params();
647     if (EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)
648             && ctx->op.sig.signature != NULL
649             && ctx->op.sig.signature->settable_ctx_params != NULL)
650         return ctx->op.sig.signature->settable_ctx_params();
651     if (EVP_PKEY_CTX_IS_ASYM_CIPHER_OP(ctx)
652             && ctx->op.ciph.cipher != NULL
653             && ctx->op.ciph.cipher->settable_ctx_params != NULL)
654         return ctx->op.ciph.cipher->settable_ctx_params();
655     if (EVP_PKEY_CTX_IS_GEN_OP(ctx)
656             && ctx->keymgmt != NULL
657             && ctx->keymgmt->gen_settable_params != NULL)
658         return evp_keymgmt_gen_settable_params(ctx->keymgmt);
659
660     return NULL;
661 }
662
663 /*
664  * Internal helpers for stricter EVP_PKEY_CTX_{set,get}_params().
665  *
666  * Return 1 on success, 0 or negative for errors.
667  *
668  * In particular they return -2 if any of the params is not supported.
669  *
670  * They are not available in FIPS_MODE as they depend on
671  *      - EVP_PKEY_CTX_{get,set}_params()
672  *      - EVP_PKEY_CTX_{gettable,settable}_params()
673  *
674  */
675 int evp_pkey_ctx_set_params_strict(EVP_PKEY_CTX *ctx, OSSL_PARAM *params)
676 {
677     const OSSL_PARAM *p;
678
679     if (ctx == NULL || params == NULL)
680         return 0;
681
682     for (p = params; p->key != NULL; p++) {
683         /* Check the ctx actually understands this parameter */
684         if (OSSL_PARAM_locate_const(EVP_PKEY_CTX_settable_params(ctx),
685                                     p->key) == NULL )
686             return -2;
687     }
688
689     return EVP_PKEY_CTX_set_params(ctx, params);
690 }
691
692 int evp_pkey_ctx_get_params_strict(EVP_PKEY_CTX *ctx, OSSL_PARAM *params)
693 {
694     const OSSL_PARAM *p;
695
696     if (ctx == NULL || params == NULL)
697         return 0;
698
699     for (p = params; p->key != NULL; p++ ) {
700         /* Check the ctx actually understands this parameter */
701         if (OSSL_PARAM_locate_const(EVP_PKEY_CTX_gettable_params(ctx),
702                                     p->key) == NULL )
703             return -2;
704     }
705
706     return EVP_PKEY_CTX_get_params(ctx, params);
707 }
708
709 # ifndef OPENSSL_NO_DH
710 int EVP_PKEY_CTX_set_dh_pad(EVP_PKEY_CTX *ctx, int pad)
711 {
712     OSSL_PARAM dh_pad_params[2];
713     unsigned int upad = pad;
714
715     /* We use EVP_PKEY_CTX_ctrl return values */
716     if (ctx == NULL || !EVP_PKEY_CTX_IS_DERIVE_OP(ctx)) {
717         ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
718         return -2;
719     }
720
721     /* TODO(3.0): Remove this eventually when no more legacy */
722     if (ctx->op.kex.exchprovctx == NULL)
723         return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_DERIVE,
724                                  EVP_PKEY_CTRL_DH_PAD, pad, NULL);
725
726     dh_pad_params[0] = OSSL_PARAM_construct_uint(OSSL_EXCHANGE_PARAM_PAD, &upad);
727     dh_pad_params[1] = OSSL_PARAM_construct_end();
728
729     return EVP_PKEY_CTX_set_params(ctx, dh_pad_params);
730 }
731 # endif
732
733 int EVP_PKEY_CTX_get_signature_md(EVP_PKEY_CTX *ctx, const EVP_MD **md)
734 {
735     OSSL_PARAM sig_md_params[3], *p = sig_md_params;
736     /* 80 should be big enough */
737     char name[80] = "";
738     const EVP_MD *tmp;
739
740     if (ctx == NULL || !EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)) {
741         ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
742         /* Uses the same return values as EVP_PKEY_CTX_ctrl */
743         return -2;
744     }
745
746     /* TODO(3.0): Remove this eventually when no more legacy */
747     if (ctx->op.sig.sigprovctx == NULL)
748         return EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG,
749                                  EVP_PKEY_CTRL_GET_MD, 0, (void *)(md));
750
751     *p++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
752                                             name,
753                                             sizeof(name));
754     *p++ = OSSL_PARAM_construct_end();
755
756     if (!EVP_PKEY_CTX_get_params(ctx, sig_md_params))
757         return 0;
758
759     tmp = evp_get_digestbyname_ex(ctx->libctx, name);
760     if (tmp == NULL)
761         return 0;
762
763     *md = tmp;
764
765     return 1;
766 }
767
768 int EVP_PKEY_CTX_set_signature_md(EVP_PKEY_CTX *ctx, const EVP_MD *md)
769 {
770     OSSL_PARAM sig_md_params[2], *p = sig_md_params;
771     const char *name;
772
773     if (ctx == NULL || !EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)) {
774         ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
775         /* Uses the same return values as EVP_PKEY_CTX_ctrl */
776         return -2;
777     }
778
779     /* TODO(3.0): Remove this eventually when no more legacy */
780     if (ctx->op.sig.sigprovctx == NULL)
781         return EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG,
782                                  EVP_PKEY_CTRL_MD, 0, (void *)(md));
783
784     if (md == NULL) {
785         name = "";
786     } else {
787         name = EVP_MD_name(md);
788     }
789
790     *p++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
791                                             /*
792                                              * Cast away the const. This is read
793                                              * only so should be safe
794                                              */
795                                             (char *)name, 0);
796     *p++ = OSSL_PARAM_construct_end();
797
798     return EVP_PKEY_CTX_set_params(ctx, sig_md_params);
799 }
800
801 static int legacy_ctrl_to_param(EVP_PKEY_CTX *ctx, int keytype, int optype,
802                                 int cmd, int p1, void *p2)
803 {
804     /*
805      * GOST CMS format is different for different cipher algorithms.
806      * Most of other algorithms don't have such a difference
807      * so this ctrl is just ignored.
808      */
809     if (cmd == EVP_PKEY_CTRL_CIPHER)
810         return -2;
811 # ifndef OPENSSL_NO_DH
812     if (keytype == EVP_PKEY_DH) {
813         switch (cmd) {
814             case EVP_PKEY_CTRL_DH_PAD:
815                 return EVP_PKEY_CTX_set_dh_pad(ctx, p1);
816         }
817     }
818 # endif
819 # ifndef OPENSSL_NO_DSA
820     if (keytype == EVP_PKEY_DSA) {
821         switch (cmd) {
822         case EVP_PKEY_CTRL_DSA_PARAMGEN_BITS:
823             return EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, p1);
824         case EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS:
825             return EVP_PKEY_CTX_set_dsa_paramgen_q_bits(ctx, p1);
826         case EVP_PKEY_CTRL_DSA_PARAMGEN_MD:
827             return EVP_PKEY_CTX_set_dsa_paramgen_md(ctx, p2);
828         }
829     }
830 # endif
831 # ifndef OPENSSL_NO_EC
832     if (keytype == EVP_PKEY_EC) {
833         switch (cmd) {
834         case EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID:
835             return EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, p1);
836         case EVP_PKEY_CTRL_EC_ECDH_COFACTOR:
837             if (p1 == -2) {
838                 return EVP_PKEY_CTX_get_ecdh_cofactor_mode(ctx);
839             } else if (p1 < -1 || p1 > 1) {
840                 /* Uses the same return values as EVP_PKEY_CTX_ctrl */
841                 return -2;
842             } else {
843                 return EVP_PKEY_CTX_set_ecdh_cofactor_mode(ctx, p1);
844             }
845         case EVP_PKEY_CTRL_EC_KDF_TYPE:
846             if (p1 == -2) {
847                 return EVP_PKEY_CTX_get_ecdh_kdf_type(ctx);
848             } else {
849                 return EVP_PKEY_CTX_set_ecdh_kdf_type(ctx, p1);
850             }
851         case EVP_PKEY_CTRL_GET_EC_KDF_MD:
852             return EVP_PKEY_CTX_get_ecdh_kdf_md(ctx, p2);
853         case EVP_PKEY_CTRL_EC_KDF_MD:
854             return EVP_PKEY_CTX_set_ecdh_kdf_md(ctx, p2);
855         case EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN:
856             return EVP_PKEY_CTX_get_ecdh_kdf_outlen(ctx, p2);
857         case EVP_PKEY_CTRL_EC_KDF_OUTLEN:
858             return EVP_PKEY_CTX_set_ecdh_kdf_outlen(ctx, p1);
859         case EVP_PKEY_CTRL_GET_EC_KDF_UKM:
860             return EVP_PKEY_CTX_get0_ecdh_kdf_ukm(ctx, p2);
861         case EVP_PKEY_CTRL_EC_KDF_UKM:
862             return EVP_PKEY_CTX_set0_ecdh_kdf_ukm(ctx, p2, p1);
863         }
864     }
865 # endif
866     if (keytype == EVP_PKEY_RSA) {
867         switch (cmd) {
868         case EVP_PKEY_CTRL_RSA_OAEP_MD:
869             return EVP_PKEY_CTX_set_rsa_oaep_md(ctx, p2);
870         case EVP_PKEY_CTRL_GET_RSA_OAEP_MD:
871             return EVP_PKEY_CTX_get_rsa_oaep_md(ctx, p2);
872         case EVP_PKEY_CTRL_RSA_MGF1_MD:
873             return EVP_PKEY_CTX_set_rsa_oaep_md(ctx, p2);
874         case EVP_PKEY_CTRL_RSA_OAEP_LABEL:
875             return EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, p2, p1);
876         case EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL:
877             return EVP_PKEY_CTX_get0_rsa_oaep_label(ctx, (unsigned char **)p2);
878         case EVP_PKEY_CTRL_RSA_KEYGEN_BITS:
879             return EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, p1);
880         case EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP:
881             return EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, p2);
882         case EVP_PKEY_CTRL_RSA_KEYGEN_PRIMES:
883             return EVP_PKEY_CTX_set_rsa_keygen_primes(ctx, p1);
884         }
885     }
886     /*
887      * keytype == -1 is used when several key types share the same structure,
888      * or for generic controls that are the same across multiple key types.
889      */
890     if (keytype == -1) {
891         switch (cmd) {
892         case EVP_PKEY_CTRL_MD:
893             return EVP_PKEY_CTX_set_signature_md(ctx, p2);
894         case EVP_PKEY_CTRL_GET_MD:
895             return EVP_PKEY_CTX_get_signature_md(ctx, p2);
896         case EVP_PKEY_CTRL_RSA_PADDING:
897             return EVP_PKEY_CTX_set_rsa_padding(ctx, p1);
898         case EVP_PKEY_CTRL_GET_RSA_PADDING:
899             return EVP_PKEY_CTX_get_rsa_padding(ctx, p2);
900         case EVP_PKEY_CTRL_GET_RSA_MGF1_MD:
901             return EVP_PKEY_CTX_get_rsa_oaep_md(ctx, p2);
902         case EVP_PKEY_CTRL_RSA_PSS_SALTLEN:
903             return EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, p1);
904         case EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN:
905             return EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx, p2);
906         case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
907         case EVP_PKEY_CTRL_PKCS7_DECRYPT:
908 # ifndef OPENSSL_NO_CMS
909         case EVP_PKEY_CTRL_CMS_DECRYPT:
910         case EVP_PKEY_CTRL_CMS_ENCRYPT:
911 # endif
912             /* TODO (3.0) Temporary hack, this should probe */
913             if (!EVP_PKEY_is_a(EVP_PKEY_CTX_get0_pkey(ctx), "RSASSA-PSS"))
914                 return 1;
915             ERR_raise(ERR_LIB_EVP,
916                       EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
917             return -2;
918         }
919     }
920     return 0;
921 }
922
923 int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype,
924                       int cmd, int p1, void *p2)
925 {
926     int ret;
927
928     if (ctx == NULL) {
929         EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED);
930         return -2;
931     }
932
933     if ((EVP_PKEY_CTX_IS_DERIVE_OP(ctx) && ctx->op.kex.exchprovctx != NULL)
934             || (EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)
935                 && ctx->op.sig.sigprovctx != NULL)
936             || (EVP_PKEY_CTX_IS_ASYM_CIPHER_OP(ctx)
937                 && ctx->op.ciph.ciphprovctx != NULL)
938             || (EVP_PKEY_CTX_IS_GEN_OP(ctx)
939                 && ctx->op.keymgmt.genctx != NULL))
940         return legacy_ctrl_to_param(ctx, keytype, optype, cmd, p1, p2);
941
942     if (ctx->pmeth == NULL || ctx->pmeth->ctrl == NULL) {
943         EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED);
944         return -2;
945     }
946     if ((keytype != -1) && (ctx->pmeth->pkey_id != keytype))
947         return -1;
948
949     /* Skip the operation checks since this is called in a very early stage */
950     if (ctx->pmeth->digest_custom != NULL)
951         goto doit;
952
953     if (ctx->operation == EVP_PKEY_OP_UNDEFINED) {
954         EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_NO_OPERATION_SET);
955         return -1;
956     }
957
958     if ((optype != -1) && !(ctx->operation & optype)) {
959         EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_INVALID_OPERATION);
960         return -1;
961     }
962
963  doit:
964     ret = ctx->pmeth->ctrl(ctx, cmd, p1, p2);
965
966     if (ret == -2)
967         EVPerr(EVP_F_EVP_PKEY_CTX_CTRL, EVP_R_COMMAND_NOT_SUPPORTED);
968
969     return ret;
970 }
971
972 int EVP_PKEY_CTX_ctrl_uint64(EVP_PKEY_CTX *ctx, int keytype, int optype,
973                              int cmd, uint64_t value)
974 {
975     return EVP_PKEY_CTX_ctrl(ctx, keytype, optype, cmd, 0, &value);
976 }
977
978 static int legacy_ctrl_str_to_param(EVP_PKEY_CTX *ctx, const char *name,
979                                     const char *value)
980 {
981
982     /* Special cases that we intercept */
983 # ifndef OPENSSL_NO_EC
984     /*
985      * We don't support encoding settings for providers, i.e. the only
986      * possible encoding is "named_curve", so we simply fail when something
987      * else is given, and otherwise just pretend all is fine.
988      */
989     if (strcmp(name, "ec_param_enc") == 0) {
990         if (strcmp(value, "named_curve") == 0) {
991             return 1;
992         } else {
993             ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
994             return -2;
995         }
996     }
997 # endif
998
999     if (strcmp(name, "rsa_padding_mode") == 0)
1000         name = OSSL_ASYM_CIPHER_PARAM_PAD_MODE;
1001     else if (strcmp(name, "rsa_mgf1_md") == 0)
1002         name = OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST;
1003     else if (strcmp(name, "rsa_oaep_md") == 0)
1004         name = OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST;
1005     else if (strcmp(name, "rsa_oaep_label") == 0)
1006         name = OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL;
1007     else if (strcmp(name, "rsa_pss_saltlen") == 0)
1008         name = OSSL_SIGNATURE_PARAM_PSS_SALTLEN;
1009     else if (strcmp(name, "rsa_keygen_bits") == 0)
1010         name = OSSL_PKEY_PARAM_RSA_BITS;
1011     else if (strcmp(name, "rsa_keygen_pubexp") == 0)
1012         name = OSSL_PKEY_PARAM_RSA_E;
1013     else if (strcmp(name, "rsa_keygen_primes") == 0)
1014         name = OSSL_PKEY_PARAM_RSA_PRIMES;
1015 # ifndef OPENSSL_NO_DSA
1016     else if (strcmp(name, "dsa_paramgen_bits") == 0)
1017         name = OSSL_PKEY_PARAM_FFC_PBITS;
1018     else if (strcmp(name, "dsa_paramgen_q_bits") == 0)
1019         name = OSSL_PKEY_PARAM_FFC_QBITS;
1020     else if (strcmp(name, "dsa_paramgen_md") == 0)
1021         name = OSSL_PKEY_PARAM_FFC_DIGEST;
1022 # endif
1023 # ifndef OPENSSL_NO_DH
1024     else if (strcmp(name, "dh_pad") == 0)
1025         name = OSSL_EXCHANGE_PARAM_PAD;
1026 # endif
1027 # ifndef OPENSSL_NO_EC
1028     else if (strcmp(name, "ec_paramgen_curve") == 0)
1029         name = OSSL_PKEY_PARAM_EC_NAME;
1030     else if (strcmp(name, "ecdh_cofactor_mode") == 0)
1031         name = OSSL_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE;
1032     else if (strcmp(name, "ecdh_kdf_md") == 0)
1033         name = OSSL_EXCHANGE_PARAM_KDF_DIGEST;
1034 # endif
1035
1036     {
1037         /*
1038          * TODO(3.0) reduce the code above to only translate known legacy
1039          * string to the corresponding core name (see core_names.h), but
1040          * otherwise leave it to this code block to do the actual work.
1041          */
1042         const OSSL_PARAM *settable = EVP_PKEY_CTX_settable_params(ctx);
1043         OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
1044         int rv = 0;
1045         int exists = 0;
1046
1047         if (!OSSL_PARAM_allocate_from_text(&params[0], settable, name, value,
1048                                            strlen(value), &exists)) {
1049             if (!exists) {
1050                 ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
1051                 return -2;
1052             }
1053             return 0;
1054         }
1055         if (EVP_PKEY_CTX_set_params(ctx, params))
1056             rv = 1;
1057         OPENSSL_free(params[0].data);
1058         return rv;
1059     }
1060 }
1061
1062 int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx,
1063                           const char *name, const char *value)
1064 {
1065     if (ctx == NULL) {
1066         EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR, EVP_R_COMMAND_NOT_SUPPORTED);
1067         return -2;
1068     }
1069
1070     if ((EVP_PKEY_CTX_IS_DERIVE_OP(ctx) && ctx->op.kex.exchprovctx != NULL)
1071             || (EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx)
1072                 && ctx->op.sig.sigprovctx != NULL)
1073             || (EVP_PKEY_CTX_IS_ASYM_CIPHER_OP(ctx)
1074                 && ctx->op.ciph.ciphprovctx != NULL)
1075             || (EVP_PKEY_CTX_IS_GEN_OP(ctx)
1076                 && ctx->op.keymgmt.genctx != NULL))
1077         return legacy_ctrl_str_to_param(ctx, name, value);
1078
1079     if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl_str) {
1080         EVPerr(EVP_F_EVP_PKEY_CTX_CTRL_STR, EVP_R_COMMAND_NOT_SUPPORTED);
1081         return -2;
1082     }
1083     if (strcmp(name, "digest") == 0)
1084         return EVP_PKEY_CTX_md(ctx, EVP_PKEY_OP_TYPE_SIG, EVP_PKEY_CTRL_MD,
1085                                value);
1086     return ctx->pmeth->ctrl_str(ctx, name, value);
1087 }
1088
1089 /* Utility functions to send a string of hex string to a ctrl */
1090
1091 int EVP_PKEY_CTX_str2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *str)
1092 {
1093     size_t len;
1094
1095     len = strlen(str);
1096     if (len > INT_MAX)
1097         return -1;
1098     return ctx->pmeth->ctrl(ctx, cmd, len, (void *)str);
1099 }
1100
1101 int EVP_PKEY_CTX_hex2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *hex)
1102 {
1103     unsigned char *bin;
1104     long binlen;
1105     int rv = -1;
1106
1107     bin = OPENSSL_hexstr2buf(hex, &binlen);
1108     if (bin == NULL)
1109         return 0;
1110     if (binlen <= INT_MAX)
1111         rv = ctx->pmeth->ctrl(ctx, cmd, binlen, bin);
1112     OPENSSL_free(bin);
1113     return rv;
1114 }
1115
1116 /* Pass a message digest to a ctrl */
1117 int EVP_PKEY_CTX_md(EVP_PKEY_CTX *ctx, int optype, int cmd, const char *md)
1118 {
1119     const EVP_MD *m;
1120
1121     if (md == NULL || (m = EVP_get_digestbyname(md)) == NULL) {
1122         EVPerr(EVP_F_EVP_PKEY_CTX_MD, EVP_R_INVALID_DIGEST);
1123         return 0;
1124     }
1125     return EVP_PKEY_CTX_ctrl(ctx, -1, optype, cmd, 0, (void *)m);
1126 }
1127
1128 int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx)
1129 {
1130     return ctx->operation;
1131 }
1132
1133 void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen)
1134 {
1135     ctx->keygen_info = dat;
1136     ctx->keygen_info_count = datlen;
1137 }
1138
1139 void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data)
1140 {
1141     ctx->data = data;
1142 }
1143
1144 void *EVP_PKEY_CTX_get_data(const EVP_PKEY_CTX *ctx)
1145 {
1146     return ctx->data;
1147 }
1148
1149 EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx)
1150 {
1151     return ctx->pkey;
1152 }
1153
1154 EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx)
1155 {
1156     return ctx->peerkey;
1157 }
1158
1159 void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data)
1160 {
1161     ctx->app_data = data;
1162 }
1163
1164 void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx)
1165 {
1166     return ctx->app_data;
1167 }
1168
1169 void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth,
1170                             int (*init) (EVP_PKEY_CTX *ctx))
1171 {
1172     pmeth->init = init;
1173 }
1174
1175 void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD *pmeth,
1176                             int (*copy) (EVP_PKEY_CTX *dst,
1177                                          const EVP_PKEY_CTX *src))
1178 {
1179     pmeth->copy = copy;
1180 }
1181
1182 void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD *pmeth,
1183                                void (*cleanup) (EVP_PKEY_CTX *ctx))
1184 {
1185     pmeth->cleanup = cleanup;
1186 }
1187
1188 void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD *pmeth,
1189                                 int (*paramgen_init) (EVP_PKEY_CTX *ctx),
1190                                 int (*paramgen) (EVP_PKEY_CTX *ctx,
1191                                                  EVP_PKEY *pkey))
1192 {
1193     pmeth->paramgen_init = paramgen_init;
1194     pmeth->paramgen = paramgen;
1195 }
1196
1197 void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD *pmeth,
1198                               int (*keygen_init) (EVP_PKEY_CTX *ctx),
1199                               int (*keygen) (EVP_PKEY_CTX *ctx,
1200                                              EVP_PKEY *pkey))
1201 {
1202     pmeth->keygen_init = keygen_init;
1203     pmeth->keygen = keygen;
1204 }
1205
1206 void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD *pmeth,
1207                             int (*sign_init) (EVP_PKEY_CTX *ctx),
1208                             int (*sign) (EVP_PKEY_CTX *ctx,
1209                                          unsigned char *sig, size_t *siglen,
1210                                          const unsigned char *tbs,
1211                                          size_t tbslen))
1212 {
1213     pmeth->sign_init = sign_init;
1214     pmeth->sign = sign;
1215 }
1216
1217 void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD *pmeth,
1218                               int (*verify_init) (EVP_PKEY_CTX *ctx),
1219                               int (*verify) (EVP_PKEY_CTX *ctx,
1220                                              const unsigned char *sig,
1221                                              size_t siglen,
1222                                              const unsigned char *tbs,
1223                                              size_t tbslen))
1224 {
1225     pmeth->verify_init = verify_init;
1226     pmeth->verify = verify;
1227 }
1228
1229 void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD *pmeth,
1230                                       int (*verify_recover_init) (EVP_PKEY_CTX
1231                                                                   *ctx),
1232                                       int (*verify_recover) (EVP_PKEY_CTX
1233                                                              *ctx,
1234                                                              unsigned char
1235                                                              *sig,
1236                                                              size_t *siglen,
1237                                                              const unsigned
1238                                                              char *tbs,
1239                                                              size_t tbslen))
1240 {
1241     pmeth->verify_recover_init = verify_recover_init;
1242     pmeth->verify_recover = verify_recover;
1243 }
1244
1245 void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD *pmeth,
1246                                int (*signctx_init) (EVP_PKEY_CTX *ctx,
1247                                                     EVP_MD_CTX *mctx),
1248                                int (*signctx) (EVP_PKEY_CTX *ctx,
1249                                                unsigned char *sig,
1250                                                size_t *siglen,
1251                                                EVP_MD_CTX *mctx))
1252 {
1253     pmeth->signctx_init = signctx_init;
1254     pmeth->signctx = signctx;
1255 }
1256
1257 void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD *pmeth,
1258                                  int (*verifyctx_init) (EVP_PKEY_CTX *ctx,
1259                                                         EVP_MD_CTX *mctx),
1260                                  int (*verifyctx) (EVP_PKEY_CTX *ctx,
1261                                                    const unsigned char *sig,
1262                                                    int siglen,
1263                                                    EVP_MD_CTX *mctx))
1264 {
1265     pmeth->verifyctx_init = verifyctx_init;
1266     pmeth->verifyctx = verifyctx;
1267 }
1268
1269 void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD *pmeth,
1270                                int (*encrypt_init) (EVP_PKEY_CTX *ctx),
1271                                int (*encryptfn) (EVP_PKEY_CTX *ctx,
1272                                                  unsigned char *out,
1273                                                  size_t *outlen,
1274                                                  const unsigned char *in,
1275                                                  size_t inlen))
1276 {
1277     pmeth->encrypt_init = encrypt_init;
1278     pmeth->encrypt = encryptfn;
1279 }
1280
1281 void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD *pmeth,
1282                                int (*decrypt_init) (EVP_PKEY_CTX *ctx),
1283                                int (*decrypt) (EVP_PKEY_CTX *ctx,
1284                                                unsigned char *out,
1285                                                size_t *outlen,
1286                                                const unsigned char *in,
1287                                                size_t inlen))
1288 {
1289     pmeth->decrypt_init = decrypt_init;
1290     pmeth->decrypt = decrypt;
1291 }
1292
1293 void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD *pmeth,
1294                               int (*derive_init) (EVP_PKEY_CTX *ctx),
1295                               int (*derive) (EVP_PKEY_CTX *ctx,
1296                                              unsigned char *key,
1297                                              size_t *keylen))
1298 {
1299     pmeth->derive_init = derive_init;
1300     pmeth->derive = derive;
1301 }
1302
1303 void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth,
1304                             int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1,
1305                                          void *p2),
1306                             int (*ctrl_str) (EVP_PKEY_CTX *ctx,
1307                                              const char *type,
1308                                              const char *value))
1309 {
1310     pmeth->ctrl = ctrl;
1311     pmeth->ctrl_str = ctrl_str;
1312 }
1313
1314 void EVP_PKEY_meth_set_digestsign(EVP_PKEY_METHOD *pmeth,
1315     int (*digestsign) (EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen,
1316                        const unsigned char *tbs, size_t tbslen))
1317 {
1318     pmeth->digestsign = digestsign;
1319 }
1320
1321 void EVP_PKEY_meth_set_digestverify(EVP_PKEY_METHOD *pmeth,
1322     int (*digestverify) (EVP_MD_CTX *ctx, const unsigned char *sig,
1323                          size_t siglen, const unsigned char *tbs,
1324                          size_t tbslen))
1325 {
1326     pmeth->digestverify = digestverify;
1327 }
1328
1329 void EVP_PKEY_meth_set_check(EVP_PKEY_METHOD *pmeth,
1330                              int (*check) (EVP_PKEY *pkey))
1331 {
1332     pmeth->check = check;
1333 }
1334
1335 void EVP_PKEY_meth_set_public_check(EVP_PKEY_METHOD *pmeth,
1336                                     int (*check) (EVP_PKEY *pkey))
1337 {
1338     pmeth->public_check = check;
1339 }
1340
1341 void EVP_PKEY_meth_set_param_check(EVP_PKEY_METHOD *pmeth,
1342                                    int (*check) (EVP_PKEY *pkey))
1343 {
1344     pmeth->param_check = check;
1345 }
1346
1347 void EVP_PKEY_meth_set_digest_custom(EVP_PKEY_METHOD *pmeth,
1348                                      int (*digest_custom) (EVP_PKEY_CTX *ctx,
1349                                                            EVP_MD_CTX *mctx))
1350 {
1351     pmeth->digest_custom = digest_custom;
1352 }
1353
1354 void EVP_PKEY_meth_get_init(const EVP_PKEY_METHOD *pmeth,
1355                             int (**pinit) (EVP_PKEY_CTX *ctx))
1356 {
1357     *pinit = pmeth->init;
1358 }
1359
1360 void EVP_PKEY_meth_get_copy(const EVP_PKEY_METHOD *pmeth,
1361                             int (**pcopy) (EVP_PKEY_CTX *dst,
1362                                            const EVP_PKEY_CTX *src))
1363 {
1364     *pcopy = pmeth->copy;
1365 }
1366
1367 void EVP_PKEY_meth_get_cleanup(const EVP_PKEY_METHOD *pmeth,
1368                                void (**pcleanup) (EVP_PKEY_CTX *ctx))
1369 {
1370     *pcleanup = pmeth->cleanup;
1371 }
1372
1373 void EVP_PKEY_meth_get_paramgen(const EVP_PKEY_METHOD *pmeth,
1374                                 int (**pparamgen_init) (EVP_PKEY_CTX *ctx),
1375                                 int (**pparamgen) (EVP_PKEY_CTX *ctx,
1376                                                    EVP_PKEY *pkey))
1377 {
1378     if (pparamgen_init)
1379         *pparamgen_init = pmeth->paramgen_init;
1380     if (pparamgen)
1381         *pparamgen = pmeth->paramgen;
1382 }
1383
1384 void EVP_PKEY_meth_get_keygen(const EVP_PKEY_METHOD *pmeth,
1385                               int (**pkeygen_init) (EVP_PKEY_CTX *ctx),
1386                               int (**pkeygen) (EVP_PKEY_CTX *ctx,
1387                                                EVP_PKEY *pkey))
1388 {
1389     if (pkeygen_init)
1390         *pkeygen_init = pmeth->keygen_init;
1391     if (pkeygen)
1392         *pkeygen = pmeth->keygen;
1393 }
1394
1395 void EVP_PKEY_meth_get_sign(const EVP_PKEY_METHOD *pmeth,
1396                             int (**psign_init) (EVP_PKEY_CTX *ctx),
1397                             int (**psign) (EVP_PKEY_CTX *ctx,
1398                                            unsigned char *sig, size_t *siglen,
1399                                            const unsigned char *tbs,
1400                                            size_t tbslen))
1401 {
1402     if (psign_init)
1403         *psign_init = pmeth->sign_init;
1404     if (psign)
1405         *psign = pmeth->sign;
1406 }
1407
1408 void EVP_PKEY_meth_get_verify(const EVP_PKEY_METHOD *pmeth,
1409                               int (**pverify_init) (EVP_PKEY_CTX *ctx),
1410                               int (**pverify) (EVP_PKEY_CTX *ctx,
1411                                                const unsigned char *sig,
1412                                                size_t siglen,
1413                                                const unsigned char *tbs,
1414                                                size_t tbslen))
1415 {
1416     if (pverify_init)
1417         *pverify_init = pmeth->verify_init;
1418     if (pverify)
1419         *pverify = pmeth->verify;
1420 }
1421
1422 void EVP_PKEY_meth_get_verify_recover(const EVP_PKEY_METHOD *pmeth,
1423                                       int (**pverify_recover_init) (EVP_PKEY_CTX
1424                                                                     *ctx),
1425                                       int (**pverify_recover) (EVP_PKEY_CTX
1426                                                                *ctx,
1427                                                                unsigned char
1428                                                                *sig,
1429                                                                size_t *siglen,
1430                                                                const unsigned
1431                                                                char *tbs,
1432                                                                size_t tbslen))
1433 {
1434     if (pverify_recover_init)
1435         *pverify_recover_init = pmeth->verify_recover_init;
1436     if (pverify_recover)
1437         *pverify_recover = pmeth->verify_recover;
1438 }
1439
1440 void EVP_PKEY_meth_get_signctx(const EVP_PKEY_METHOD *pmeth,
1441                                int (**psignctx_init) (EVP_PKEY_CTX *ctx,
1442                                                       EVP_MD_CTX *mctx),
1443                                int (**psignctx) (EVP_PKEY_CTX *ctx,
1444                                                  unsigned char *sig,
1445                                                  size_t *siglen,
1446                                                  EVP_MD_CTX *mctx))
1447 {
1448     if (psignctx_init)
1449         *psignctx_init = pmeth->signctx_init;
1450     if (psignctx)
1451         *psignctx = pmeth->signctx;
1452 }
1453
1454 void EVP_PKEY_meth_get_verifyctx(const EVP_PKEY_METHOD *pmeth,
1455                                  int (**pverifyctx_init) (EVP_PKEY_CTX *ctx,
1456                                                           EVP_MD_CTX *mctx),
1457                                  int (**pverifyctx) (EVP_PKEY_CTX *ctx,
1458                                                      const unsigned char *sig,
1459                                                      int siglen,
1460                                                      EVP_MD_CTX *mctx))
1461 {
1462     if (pverifyctx_init)
1463         *pverifyctx_init = pmeth->verifyctx_init;
1464     if (pverifyctx)
1465         *pverifyctx = pmeth->verifyctx;
1466 }
1467
1468 void EVP_PKEY_meth_get_encrypt(const EVP_PKEY_METHOD *pmeth,
1469                                int (**pencrypt_init) (EVP_PKEY_CTX *ctx),
1470                                int (**pencryptfn) (EVP_PKEY_CTX *ctx,
1471                                                    unsigned char *out,
1472                                                    size_t *outlen,
1473                                                    const unsigned char *in,
1474                                                    size_t inlen))
1475 {
1476     if (pencrypt_init)
1477         *pencrypt_init = pmeth->encrypt_init;
1478     if (pencryptfn)
1479         *pencryptfn = pmeth->encrypt;
1480 }
1481
1482 void EVP_PKEY_meth_get_decrypt(const EVP_PKEY_METHOD *pmeth,
1483                                int (**pdecrypt_init) (EVP_PKEY_CTX *ctx),
1484                                int (**pdecrypt) (EVP_PKEY_CTX *ctx,
1485                                                  unsigned char *out,
1486                                                  size_t *outlen,
1487                                                  const unsigned char *in,
1488                                                  size_t inlen))
1489 {
1490     if (pdecrypt_init)
1491         *pdecrypt_init = pmeth->decrypt_init;
1492     if (pdecrypt)
1493         *pdecrypt = pmeth->decrypt;
1494 }
1495
1496 void EVP_PKEY_meth_get_derive(const EVP_PKEY_METHOD *pmeth,
1497                               int (**pderive_init) (EVP_PKEY_CTX *ctx),
1498                               int (**pderive) (EVP_PKEY_CTX *ctx,
1499                                                unsigned char *key,
1500                                                size_t *keylen))
1501 {
1502     if (pderive_init)
1503         *pderive_init = pmeth->derive_init;
1504     if (pderive)
1505         *pderive = pmeth->derive;
1506 }
1507
1508 void EVP_PKEY_meth_get_ctrl(const EVP_PKEY_METHOD *pmeth,
1509                             int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1,
1510                                            void *p2),
1511                             int (**pctrl_str) (EVP_PKEY_CTX *ctx,
1512                                                const char *type,
1513                                                const char *value))
1514 {
1515     if (pctrl)
1516         *pctrl = pmeth->ctrl;
1517     if (pctrl_str)
1518         *pctrl_str = pmeth->ctrl_str;
1519 }
1520
1521 void EVP_PKEY_meth_get_digestsign(EVP_PKEY_METHOD *pmeth,
1522     int (**digestsign) (EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen,
1523                         const unsigned char *tbs, size_t tbslen))
1524 {
1525     if (digestsign)
1526         *digestsign = pmeth->digestsign;
1527 }
1528
1529 void EVP_PKEY_meth_get_digestverify(EVP_PKEY_METHOD *pmeth,
1530     int (**digestverify) (EVP_MD_CTX *ctx, const unsigned char *sig,
1531                           size_t siglen, const unsigned char *tbs,
1532                           size_t tbslen))
1533 {
1534     if (digestverify)
1535         *digestverify = pmeth->digestverify;
1536 }
1537
1538 void EVP_PKEY_meth_get_check(const EVP_PKEY_METHOD *pmeth,
1539                              int (**pcheck) (EVP_PKEY *pkey))
1540 {
1541     if (pcheck != NULL)
1542         *pcheck = pmeth->check;
1543 }
1544
1545 void EVP_PKEY_meth_get_public_check(const EVP_PKEY_METHOD *pmeth,
1546                                     int (**pcheck) (EVP_PKEY *pkey))
1547 {
1548     if (pcheck != NULL)
1549         *pcheck = pmeth->public_check;
1550 }
1551
1552 void EVP_PKEY_meth_get_param_check(const EVP_PKEY_METHOD *pmeth,
1553                                    int (**pcheck) (EVP_PKEY *pkey))
1554 {
1555     if (pcheck != NULL)
1556         *pcheck = pmeth->param_check;
1557 }
1558
1559 void EVP_PKEY_meth_get_digest_custom(EVP_PKEY_METHOD *pmeth,
1560                                      int (**pdigest_custom) (EVP_PKEY_CTX *ctx,
1561                                                              EVP_MD_CTX *mctx))
1562 {
1563     if (pdigest_custom != NULL)
1564         *pdigest_custom = pmeth->digest_custom;
1565 }
1566
1567 #endif /* FIPS_MODE */