Make the EVP_PKEY_get0* functions have a const return type
[openssl.git] / crypto / evp / p_lib.c
1 /*
2  * Copyright 1995-2021 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  * DSA low level APIs are deprecated for public use, but still ok for
12  * internal use.
13  */
14 #include "internal/deprecated.h"
15
16 #include <assert.h>
17 #include <stdio.h>
18 #include "internal/cryptlib.h"
19 #include "internal/refcount.h"
20 #include "internal/namemap.h"
21 #include <openssl/bn.h>
22 #include <openssl/err.h>
23 #include <openssl/objects.h>
24 #include <openssl/evp.h>
25 #include <openssl/x509.h>
26 #include <openssl/rsa.h>
27 #include <openssl/dsa.h>
28 #include <openssl/dh.h>
29 #include <openssl/ec.h>
30 #include <openssl/cmac.h>
31 #include <openssl/engine.h>
32 #include <openssl/params.h>
33 #include <openssl/param_build.h>
34 #include <openssl/encoder.h>
35 #include <openssl/core_names.h>
36
37 #include "internal/ffc.h"
38 #include "crypto/asn1.h"
39 #include "crypto/evp.h"
40 #include "crypto/ec.h"
41 #include "crypto/ecx.h"
42 #include "internal/provider.h"
43 #include "evp_local.h"
44
45 #include "crypto/ec.h"
46
47 #include "e_os.h"                /* strcasecmp on Windows */
48
49 static int pkey_set_type(EVP_PKEY *pkey, ENGINE *e, int type, const char *str,
50                          int len, EVP_KEYMGMT *keymgmt);
51 static void evp_pkey_free_it(EVP_PKEY *key);
52
53 #ifndef FIPS_MODULE
54
55 /* The type of parameters selected in key parameter functions */
56 # define SELECT_PARAMETERS OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS
57
58 int EVP_PKEY_bits(const EVP_PKEY *pkey)
59 {
60     int size = 0;
61
62     if (pkey != NULL) {
63         size = pkey->cache.bits;
64         if (pkey->ameth != NULL && pkey->ameth->pkey_bits != NULL)
65             size = pkey->ameth->pkey_bits(pkey);
66     }
67     return size < 0 ? 0 : size;
68 }
69
70 int EVP_PKEY_security_bits(const EVP_PKEY *pkey)
71 {
72     int size = 0;
73
74     if (pkey != NULL) {
75         size = pkey->cache.security_bits;
76         if (pkey->ameth != NULL && pkey->ameth->pkey_security_bits != NULL)
77             size = pkey->ameth->pkey_security_bits(pkey);
78     }
79     return size < 0 ? 0 : size;
80 }
81
82 int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode)
83 {
84 # ifndef OPENSSL_NO_DSA
85     if (pkey->type == EVP_PKEY_DSA) {
86         int ret = pkey->save_parameters;
87
88         if (mode >= 0)
89             pkey->save_parameters = mode;
90         return ret;
91     }
92 # endif
93 # ifndef OPENSSL_NO_EC
94     if (pkey->type == EVP_PKEY_EC) {
95         int ret = pkey->save_parameters;
96
97         if (mode >= 0)
98             pkey->save_parameters = mode;
99         return ret;
100     }
101 # endif
102     return 0;
103 }
104
105 int EVP_PKEY_set_ex_data(EVP_PKEY *key, int idx, void *arg)
106 {
107     return CRYPTO_set_ex_data(&key->ex_data, idx, arg);
108 }
109
110 void *EVP_PKEY_get_ex_data(const EVP_PKEY *key, int idx)
111 {
112     return CRYPTO_get_ex_data(&key->ex_data, idx);
113 }
114
115 int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
116 {
117     /*
118      * Clean up legacy stuff from this function when legacy support is gone.
119      */
120
121     EVP_PKEY *downgraded_from = NULL;
122     int ok = 0;
123
124     /*
125      * If |to| is a legacy key and |from| isn't, we must make a downgraded
126      * copy of |from|.  If that fails, this function fails.
127      */
128     if (evp_pkey_is_legacy(to) && evp_pkey_is_provided(from)) {
129         if (!evp_pkey_copy_downgraded(&downgraded_from, from))
130             goto end;
131         from = downgraded_from;
132     }
133
134     /*
135      * Make sure |to| is typed.  Content is less important at this early
136      * stage.
137      *
138      * 1.  If |to| is untyped, assign |from|'s key type to it.
139      * 2.  If |to| contains a legacy key, compare its |type| to |from|'s.
140      *     (|from| was already downgraded above)
141      *
142      * If |to| is a provided key, there's nothing more to do here, functions
143      * like evp_keymgmt_util_copy() and evp_pkey_export_to_provider() called
144      * further down help us find out if they are the same or not.
145      */
146     if (evp_pkey_is_blank(to)) {
147         if (evp_pkey_is_legacy(from)) {
148             if (EVP_PKEY_set_type(to, from->type) == 0)
149                 goto end;
150         } else {
151             if (EVP_PKEY_set_type_by_keymgmt(to, from->keymgmt) == 0)
152                 goto end;
153         }
154     } else if (evp_pkey_is_legacy(to)) {
155         if (to->type != from->type) {
156             ERR_raise(ERR_LIB_EVP, EVP_R_DIFFERENT_KEY_TYPES);
157             goto end;
158         }
159     }
160
161     if (EVP_PKEY_missing_parameters(from)) {
162         ERR_raise(ERR_LIB_EVP, EVP_R_MISSING_PARAMETERS);
163         goto end;
164     }
165
166     if (!EVP_PKEY_missing_parameters(to)) {
167         if (EVP_PKEY_parameters_eq(to, from) == 1)
168             ok = 1;
169         else
170             ERR_raise(ERR_LIB_EVP, EVP_R_DIFFERENT_PARAMETERS);
171         goto end;
172     }
173
174     /* For purely provided keys, we just call the keymgmt utility */
175     if (to->keymgmt != NULL && from->keymgmt != NULL) {
176         ok = evp_keymgmt_util_copy(to, (EVP_PKEY *)from, SELECT_PARAMETERS);
177         goto end;
178     }
179
180     /*
181      * If |to| is provided, we know that |from| is legacy at this point.
182      * Try exporting |from| to |to|'s keymgmt, then use evp_keymgmt_copy()
183      * to copy the appropriate data to |to|'s keydata.
184      */
185     if (to->keymgmt != NULL) {
186         EVP_KEYMGMT *to_keymgmt = to->keymgmt;
187         void *from_keydata =
188             evp_pkey_export_to_provider((EVP_PKEY *)from, NULL, &to_keymgmt,
189                                         NULL);
190
191         /*
192          * If we get a NULL, it could be an internal error, or it could be
193          * that there's a key mismatch.  We're pretending the latter...
194          */
195         if (from_keydata == NULL)
196             ERR_raise(ERR_LIB_EVP, EVP_R_DIFFERENT_KEY_TYPES);
197         else
198             ok = evp_keymgmt_copy(to->keymgmt, to->keydata, from_keydata,
199                                   SELECT_PARAMETERS);
200         goto end;
201     }
202
203     /* Both keys are legacy */
204     if (from->ameth != NULL && from->ameth->param_copy != NULL)
205         ok = from->ameth->param_copy(to, from);
206  end:
207     EVP_PKEY_free(downgraded_from);
208     return ok;
209 }
210
211 int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey)
212 {
213     if (pkey != NULL) {
214         if (pkey->keymgmt != NULL)
215             return !evp_keymgmt_util_has((EVP_PKEY *)pkey, SELECT_PARAMETERS);
216         else if (pkey->ameth != NULL && pkey->ameth->param_missing != NULL)
217             return pkey->ameth->param_missing(pkey);
218     }
219     return 0;
220 }
221
222 /*
223  * This function is called for any mixture of keys except pure legacy pair.
224  * TODO When legacy keys are gone, we replace a call to this functions with
225  * a call to evp_keymgmt_util_match().
226  */
227 static int evp_pkey_cmp_any(const EVP_PKEY *a, const EVP_PKEY *b,
228                             int selection)
229 {
230     EVP_KEYMGMT *keymgmt1 = NULL, *keymgmt2 = NULL;
231     void *keydata1 = NULL, *keydata2 = NULL, *tmp_keydata = NULL;
232
233     /* If none of them are provided, this function shouldn't have been called */
234     if (!ossl_assert(evp_pkey_is_provided(a) || evp_pkey_is_provided(b)))
235         return -2;
236
237     /* For purely provided keys, we just call the keymgmt utility */
238     if (evp_pkey_is_provided(a) && evp_pkey_is_provided(b))
239         return evp_keymgmt_util_match((EVP_PKEY *)a, (EVP_PKEY *)b, selection);
240
241     /*
242      * At this point, one of them is provided, the other not.  This allows
243      * us to compare types using legacy NIDs.
244      */
245     if (evp_pkey_is_legacy(a)
246         && !EVP_KEYMGMT_is_a(b->keymgmt, OBJ_nid2sn(a->type)))
247         return -1;               /* not the same key type */
248     if (evp_pkey_is_legacy(b)
249         && !EVP_KEYMGMT_is_a(a->keymgmt, OBJ_nid2sn(b->type)))
250         return -1;               /* not the same key type */
251
252     /*
253      * We've determined that they both are the same keytype, so the next
254      * step is to do a bit of cross export to ensure we have keydata for
255      * both keys in the same keymgmt.
256      */
257     keymgmt1 = a->keymgmt;
258     keydata1 = a->keydata;
259     keymgmt2 = b->keymgmt;
260     keydata2 = b->keydata;
261
262     if (keymgmt2 != NULL && keymgmt2->match != NULL) {
263         tmp_keydata =
264             evp_pkey_export_to_provider((EVP_PKEY *)a, NULL, &keymgmt2, NULL);
265         if (tmp_keydata != NULL) {
266             keymgmt1 = keymgmt2;
267             keydata1 = tmp_keydata;
268         }
269     }
270     if (tmp_keydata == NULL && keymgmt1 != NULL && keymgmt1->match != NULL) {
271         tmp_keydata =
272             evp_pkey_export_to_provider((EVP_PKEY *)b, NULL, &keymgmt1, NULL);
273         if (tmp_keydata != NULL) {
274             keymgmt2 = keymgmt1;
275             keydata2 = tmp_keydata;
276         }
277     }
278
279     /* If we still don't have matching keymgmt implementations, we give up */
280     if (keymgmt1 != keymgmt2)
281         return -2;
282
283     /* If the keymgmt implementations are NULL, the export failed */
284     if (keymgmt1 == NULL)
285         return -2;
286
287     return evp_keymgmt_match(keymgmt1, keydata1, keydata2, selection);
288 }
289
290 int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
291 {
292     return EVP_PKEY_parameters_eq(a, b);
293 }
294
295 int EVP_PKEY_parameters_eq(const EVP_PKEY *a, const EVP_PKEY *b)
296 {
297     /*
298      * TODO: clean up legacy stuff from this function when legacy support
299      * is gone.
300      */
301
302     if (a->keymgmt != NULL || b->keymgmt != NULL)
303         return evp_pkey_cmp_any(a, b, SELECT_PARAMETERS);
304
305     /* All legacy keys */
306     if (a->type != b->type)
307         return -1;
308     if (a->ameth != NULL && a->ameth->param_cmp != NULL)
309         return a->ameth->param_cmp(a, b);
310     return -2;
311 }
312
313 int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
314 {
315     return EVP_PKEY_eq(a, b);
316 }
317
318 int EVP_PKEY_eq(const EVP_PKEY *a, const EVP_PKEY *b)
319 {
320     /*
321      * TODO: clean up legacy stuff from this function when legacy support
322      * is gone.
323      */
324
325     if (a->keymgmt != NULL || b->keymgmt != NULL)
326         return evp_pkey_cmp_any(a, b, (SELECT_PARAMETERS
327                                        | OSSL_KEYMGMT_SELECT_PUBLIC_KEY));
328
329     /* All legacy keys */
330     if (a->type != b->type)
331         return -1;
332
333     if (a->ameth != NULL) {
334         int ret;
335         /* Compare parameters if the algorithm has them */
336         if (a->ameth->param_cmp != NULL) {
337             ret = a->ameth->param_cmp(a, b);
338             if (ret <= 0)
339                 return ret;
340         }
341
342         if (a->ameth->pub_cmp != NULL)
343             return a->ameth->pub_cmp(a, b);
344     }
345
346     return -2;
347 }
348
349
350 static EVP_PKEY *new_raw_key_int(OSSL_LIB_CTX *libctx,
351                                  const char *strtype,
352                                  const char *propq,
353                                  int nidtype,
354                                  ENGINE *e,
355                                  const unsigned char *key,
356                                  size_t len,
357                                  int key_is_priv)
358 {
359     EVP_PKEY *pkey = NULL;
360     EVP_PKEY_CTX *ctx = NULL;
361     const EVP_PKEY_ASN1_METHOD *ameth = NULL;
362     int result = 0;
363
364 # ifndef OPENSSL_NO_ENGINE
365     /* Check if there is an Engine for this type */
366     if (e == NULL) {
367         ENGINE *tmpe = NULL;
368
369         if (strtype != NULL)
370             ameth = EVP_PKEY_asn1_find_str(&tmpe, strtype, -1);
371         else if (nidtype != EVP_PKEY_NONE)
372             ameth = EVP_PKEY_asn1_find(&tmpe, nidtype);
373
374         /* If tmpe is NULL then no engine is claiming to support this type */
375         if (tmpe == NULL)
376             ameth = NULL;
377
378         ENGINE_finish(tmpe);
379     }
380 # endif
381
382     if (e == NULL && ameth == NULL) {
383         /*
384          * No engine is claiming to support this type, so lets see if we have
385          * a provider.
386          */
387         ctx = EVP_PKEY_CTX_new_from_name(libctx,
388                                          strtype != NULL ? strtype
389                                                          : OBJ_nid2sn(nidtype),
390                                          propq);
391         if (ctx == NULL)
392             goto err;
393         /* May fail if no provider available */
394         ERR_set_mark();
395         if (EVP_PKEY_fromdata_init(ctx) == 1) {
396             OSSL_PARAM params[] = { OSSL_PARAM_END, OSSL_PARAM_END };
397
398             ERR_clear_last_mark();
399             params[0] = OSSL_PARAM_construct_octet_string(
400                             key_is_priv ? OSSL_PKEY_PARAM_PRIV_KEY
401                                         : OSSL_PKEY_PARAM_PUB_KEY,
402                             (void *)key, len);
403
404             if (EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEYPAIR, params) != 1) {
405                 ERR_raise(ERR_LIB_EVP, EVP_R_KEY_SETUP_FAILED);
406                 goto err;
407             }
408
409             EVP_PKEY_CTX_free(ctx);
410
411             return pkey;
412         }
413         ERR_pop_to_mark();
414         /* else not supported so fallback to legacy */
415     }
416
417     /* Legacy code path */
418
419     pkey = EVP_PKEY_new();
420     if (pkey == NULL) {
421         ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
422         goto err;
423     }
424
425     if (!pkey_set_type(pkey, e, nidtype, strtype, -1, NULL)) {
426         /* EVPerr already called */
427         goto err;
428     }
429
430     if (!ossl_assert(pkey->ameth != NULL))
431         goto err;
432
433     if (key_is_priv) {
434         if (pkey->ameth->set_priv_key == NULL) {
435             ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
436             goto err;
437         }
438
439         if (!pkey->ameth->set_priv_key(pkey, key, len)) {
440             ERR_raise(ERR_LIB_EVP, EVP_R_KEY_SETUP_FAILED);
441             goto err;
442         }
443     } else {
444         if (pkey->ameth->set_pub_key == NULL) {
445             ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
446             goto err;
447         }
448
449         if (!pkey->ameth->set_pub_key(pkey, key, len)) {
450             ERR_raise(ERR_LIB_EVP, EVP_R_KEY_SETUP_FAILED);
451             goto err;
452         }
453     }
454
455     result = 1;
456  err:
457     if (!result) {
458         EVP_PKEY_free(pkey);
459         pkey = NULL;
460     }
461     EVP_PKEY_CTX_free(ctx);
462     return pkey;
463 }
464
465 EVP_PKEY *EVP_PKEY_new_raw_private_key_ex(OSSL_LIB_CTX *libctx,
466                                           const char *keytype,
467                                           const char *propq,
468                                           const unsigned char *priv, size_t len)
469 {
470     return new_raw_key_int(libctx, keytype, propq, EVP_PKEY_NONE, NULL, priv,
471                            len, 1);
472 }
473
474 EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *e,
475                                        const unsigned char *priv,
476                                        size_t len)
477 {
478     return new_raw_key_int(NULL, NULL, NULL, type, e, priv, len, 1);
479 }
480
481 EVP_PKEY *EVP_PKEY_new_raw_public_key_ex(OSSL_LIB_CTX *libctx,
482                                          const char *keytype, const char *propq,
483                                          const unsigned char *pub, size_t len)
484 {
485     return new_raw_key_int(libctx, keytype, propq, EVP_PKEY_NONE, NULL, pub,
486                            len, 0);
487 }
488
489 EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *e,
490                                       const unsigned char *pub,
491                                       size_t len)
492 {
493     return new_raw_key_int(NULL, NULL, NULL, type, e, pub, len, 0);
494 }
495
496 struct raw_key_details_st
497 {
498     unsigned char **key;
499     size_t *len;
500     int selection;
501 };
502
503 static OSSL_CALLBACK get_raw_key_details;
504 static int get_raw_key_details(const OSSL_PARAM params[], void *arg)
505 {
506     const OSSL_PARAM *p = NULL;
507     struct raw_key_details_st *raw_key = arg;
508
509     if (raw_key->selection == OSSL_KEYMGMT_SELECT_PRIVATE_KEY) {
510         if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_PRIV_KEY))
511                 != NULL)
512             return OSSL_PARAM_get_octet_string(p, (void **)raw_key->key,
513                                                SIZE_MAX, raw_key->len);
514     } else if (raw_key->selection == OSSL_KEYMGMT_SELECT_PUBLIC_KEY) {
515         if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_PUB_KEY))
516                 != NULL)
517             return OSSL_PARAM_get_octet_string(p, (void **)raw_key->key,
518                                                SIZE_MAX, raw_key->len);
519     }
520
521     return 0;
522 }
523
524 int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, unsigned char *priv,
525                                  size_t *len)
526 {
527     if (pkey->keymgmt != NULL) {
528         struct raw_key_details_st raw_key;
529
530         raw_key.key = priv == NULL ? NULL : &priv;
531         raw_key.len = len;
532         raw_key.selection = OSSL_KEYMGMT_SELECT_PRIVATE_KEY;
533
534         return evp_keymgmt_util_export(pkey, OSSL_KEYMGMT_SELECT_PRIVATE_KEY,
535                                        get_raw_key_details, &raw_key);
536     }
537
538     if (pkey->ameth == NULL) {
539         ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
540         return 0;
541     }
542
543     if (pkey->ameth->get_priv_key == NULL) {
544         ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
545         return 0;
546     }
547
548     if (!pkey->ameth->get_priv_key(pkey, priv, len)) {
549         ERR_raise(ERR_LIB_EVP, EVP_R_GET_RAW_KEY_FAILED);
550         return 0;
551     }
552
553     return 1;
554 }
555
556 int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, unsigned char *pub,
557                                 size_t *len)
558 {
559     if (pkey->keymgmt != NULL) {
560         struct raw_key_details_st raw_key;
561
562         raw_key.key = pub == NULL ? NULL : &pub;
563         raw_key.len = len;
564         raw_key.selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY;
565
566         return evp_keymgmt_util_export(pkey, OSSL_KEYMGMT_SELECT_PUBLIC_KEY,
567                                        get_raw_key_details, &raw_key);
568     }
569
570     if (pkey->ameth == NULL) {
571         ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
572         return 0;
573     }
574
575      if (pkey->ameth->get_pub_key == NULL) {
576         ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
577         return 0;
578     }
579
580     if (!pkey->ameth->get_pub_key(pkey, pub, len)) {
581         ERR_raise(ERR_LIB_EVP, EVP_R_GET_RAW_KEY_FAILED);
582         return 0;
583     }
584
585     return 1;
586 }
587
588 static EVP_PKEY *new_cmac_key_int(const unsigned char *priv, size_t len,
589                                   const char *cipher_name,
590                                   const EVP_CIPHER *cipher,
591                                   OSSL_LIB_CTX *libctx,
592                                   const char *propq, ENGINE *e)
593 {
594 # ifndef OPENSSL_NO_CMAC
595 #  ifndef OPENSSL_NO_ENGINE
596     const char *engine_id = e != NULL ? ENGINE_get_id(e) : NULL;
597 #  endif
598     OSSL_PARAM params[5], *p = params;
599     EVP_PKEY *pkey = NULL;
600     EVP_PKEY_CTX *ctx;
601
602     if (cipher != NULL)
603         cipher_name = EVP_CIPHER_name(cipher);
604
605     if (cipher_name == NULL) {
606         ERR_raise(ERR_LIB_EVP, EVP_R_KEY_SETUP_FAILED);
607         return NULL;
608     }
609
610     ctx = EVP_PKEY_CTX_new_from_name(libctx, "CMAC", propq);
611     if (ctx == NULL)
612         goto err;
613
614     if (!EVP_PKEY_fromdata_init(ctx)) {
615         ERR_raise(ERR_LIB_EVP, EVP_R_KEY_SETUP_FAILED);
616         goto err;
617     }
618
619     *p++ = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
620                                             (void *)priv, len);
621     *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_CIPHER,
622                                             (char *)cipher_name, 0);
623     if (propq != NULL)
624         *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_PROPERTIES,
625                                                 (char *)propq, 0);
626 #  ifndef OPENSSL_NO_ENGINE
627     if (engine_id != NULL)
628         *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_ENGINE,
629                                                 (char *)engine_id, 0);
630 #  endif
631     *p = OSSL_PARAM_construct_end();
632
633     if (!EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEYPAIR, params)) {
634         ERR_raise(ERR_LIB_EVP, EVP_R_KEY_SETUP_FAILED);
635         goto err;
636     }
637
638  err:
639     EVP_PKEY_CTX_free(ctx);
640
641     return pkey;
642 # else
643     ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
644     return NULL;
645 # endif
646 }
647
648 EVP_PKEY *EVP_PKEY_new_CMAC_key(ENGINE *e, const unsigned char *priv,
649                                 size_t len, const EVP_CIPHER *cipher)
650 {
651     return new_cmac_key_int(priv, len, NULL, cipher, NULL, NULL, e);
652 }
653
654 int EVP_PKEY_set_type(EVP_PKEY *pkey, int type)
655 {
656     return pkey_set_type(pkey, NULL, type, NULL, -1, NULL);
657 }
658
659 int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len)
660 {
661     return pkey_set_type(pkey, NULL, EVP_PKEY_NONE, str, len, NULL);
662 }
663
664 # ifndef OPENSSL_NO_DEPRECATED_3_0
665 int EVP_PKEY_set_alias_type(EVP_PKEY *pkey, int type)
666 {
667     if (!evp_pkey_is_legacy(pkey)) {
668         const char *name = OBJ_nid2sn(type);
669
670         if (name != NULL && EVP_PKEY_is_a(pkey, name))
671             return 1;
672
673         ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION);
674         return 0;
675     }
676
677     if (pkey->type == type) {
678         return 1; /* it already is that type */
679     }
680
681     /*
682      * The application is requesting to alias this to a different pkey type,
683      * but not one that resolves to the base type.
684      */
685     if (EVP_PKEY_type(type) != EVP_PKEY_base_id(pkey)) {
686         ERR_raise(ERR_LIB_EVP, EVP_R_UNSUPPORTED_ALGORITHM);
687         return 0;
688     }
689
690     pkey->type = type;
691     return 1;
692 }
693 # endif
694
695 # ifndef OPENSSL_NO_ENGINE
696 int EVP_PKEY_set1_engine(EVP_PKEY *pkey, ENGINE *e)
697 {
698     if (e != NULL) {
699         if (!ENGINE_init(e)) {
700             ERR_raise(ERR_LIB_EVP, ERR_R_ENGINE_LIB);
701             return 0;
702         }
703         if (ENGINE_get_pkey_meth(e, pkey->type) == NULL) {
704             ENGINE_finish(e);
705             ERR_raise(ERR_LIB_EVP, EVP_R_UNSUPPORTED_ALGORITHM);
706             return 0;
707         }
708     }
709     ENGINE_finish(pkey->pmeth_engine);
710     pkey->pmeth_engine = e;
711     return 1;
712 }
713
714 ENGINE *EVP_PKEY_get0_engine(const EVP_PKEY *pkey)
715 {
716     return pkey->engine;
717 }
718 # endif
719
720 # ifndef OPENSSL_NO_DEPRECATED_3_0
721 int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key)
722 {
723     int alias = type;
724
725 #  ifndef OPENSSL_NO_EC
726     if ((key != NULL) && (EVP_PKEY_type(type) == EVP_PKEY_EC)) {
727         const EC_GROUP *group = EC_KEY_get0_group(key);
728
729         if (group != NULL && EC_GROUP_get_curve_name(group) == NID_sm2)
730             alias = EVP_PKEY_SM2;
731     }
732 #  endif
733
734     if (pkey == NULL || !EVP_PKEY_set_type(pkey, type))
735         return 0;
736     if (!EVP_PKEY_set_alias_type(pkey, alias))
737         return 0;
738     pkey->pkey.ptr = key;
739     return (key != NULL);
740 }
741 # endif
742
743 const void *EVP_PKEY_get0(const EVP_PKEY *pkey)
744 {
745     if (pkey == NULL)
746         return NULL;
747
748     return evp_pkey_get_legacy((EVP_PKEY *)pkey);
749 }
750
751 const unsigned char *EVP_PKEY_get0_hmac(const EVP_PKEY *pkey, size_t *len)
752 {
753     const ASN1_OCTET_STRING *os = NULL;
754     if (pkey->type != EVP_PKEY_HMAC) {
755         ERR_raise(ERR_LIB_EVP, EVP_R_EXPECTING_AN_HMAC_KEY);
756         return NULL;
757     }
758     os = EVP_PKEY_get0(pkey);
759     *len = os->length;
760     return os->data;
761 }
762
763 # ifndef OPENSSL_NO_POLY1305
764 const unsigned char *EVP_PKEY_get0_poly1305(const EVP_PKEY *pkey, size_t *len)
765 {
766     const ASN1_OCTET_STRING *os = NULL;
767     if (pkey->type != EVP_PKEY_POLY1305) {
768         ERR_raise(ERR_LIB_EVP, EVP_R_EXPECTING_A_POLY1305_KEY);
769         return NULL;
770     }
771     os = EVP_PKEY_get0(pkey);
772     *len = os->length;
773     return os->data;
774 }
775 # endif
776
777 # ifndef OPENSSL_NO_SIPHASH
778 const unsigned char *EVP_PKEY_get0_siphash(const EVP_PKEY *pkey, size_t *len)
779 {
780     const ASN1_OCTET_STRING *os = NULL;
781
782     if (pkey->type != EVP_PKEY_SIPHASH) {
783         ERR_raise(ERR_LIB_EVP, EVP_R_EXPECTING_A_SIPHASH_KEY);
784         return NULL;
785     }
786     os = EVP_PKEY_get0(pkey);
787     *len = os->length;
788     return os->data;
789 }
790 # endif
791
792 # ifndef OPENSSL_NO_DSA
793 static DSA *evp_pkey_get0_DSA_int(const EVP_PKEY *pkey)
794 {
795     if (pkey->type != EVP_PKEY_DSA) {
796         ERR_raise(ERR_LIB_EVP, EVP_R_EXPECTING_A_DSA_KEY);
797         return NULL;
798     }
799     return evp_pkey_get_legacy((EVP_PKEY *)pkey);
800 }
801
802 const DSA *EVP_PKEY_get0_DSA(const EVP_PKEY *pkey)
803 {
804     return evp_pkey_get0_DSA_int(pkey);
805 }
806
807 int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key)
808 {
809     int ret = EVP_PKEY_assign_DSA(pkey, key);
810     if (ret)
811         DSA_up_ref(key);
812     return ret;
813 }
814 DSA *EVP_PKEY_get1_DSA(EVP_PKEY *pkey)
815 {
816     DSA *ret = evp_pkey_get0_DSA_int(pkey);
817
818     if (ret != NULL)
819         DSA_up_ref(ret);
820     return ret;
821 }
822 # endif /*  OPENSSL_NO_DSA */
823 #endif /* FIPS_MODULE */
824
825 #ifndef FIPS_MODULE
826 # ifndef OPENSSL_NO_EC
827 static const ECX_KEY *evp_pkey_get0_ECX_KEY(const EVP_PKEY *pkey, int type)
828 {
829     if (EVP_PKEY_base_id(pkey) != type) {
830         ERR_raise(ERR_LIB_EVP, EVP_R_EXPECTING_A_ECX_KEY);
831         return NULL;
832     }
833     return evp_pkey_get_legacy((EVP_PKEY *)pkey);
834 }
835
836 static ECX_KEY *evp_pkey_get1_ECX_KEY(EVP_PKEY *pkey, int type)
837 {
838     ECX_KEY *ret = (ECX_KEY *)evp_pkey_get0_ECX_KEY(pkey, type);
839     if (ret != NULL)
840         ossl_ecx_key_up_ref(ret);
841     return ret;
842 }
843
844 #  define IMPLEMENT_ECX_VARIANT(NAME)                                   \
845     ECX_KEY *ossl_evp_pkey_get1_##NAME(EVP_PKEY *pkey)                  \
846     {                                                                   \
847         return evp_pkey_get1_ECX_KEY(pkey, EVP_PKEY_##NAME);            \
848     }
849 IMPLEMENT_ECX_VARIANT(X25519)
850 IMPLEMENT_ECX_VARIANT(X448)
851 IMPLEMENT_ECX_VARIANT(ED25519)
852 IMPLEMENT_ECX_VARIANT(ED448)
853
854 # endif
855
856 # if !defined(OPENSSL_NO_DH) && !defined(OPENSSL_NO_DEPRECATED_3_0)
857
858 int EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key)
859 {
860     int type = DH_get0_q(key) == NULL ? EVP_PKEY_DH : EVP_PKEY_DHX;
861     int ret = EVP_PKEY_assign(pkey, type, key);
862
863     if (ret)
864         DH_up_ref(key);
865     return ret;
866 }
867
868 DH *evp_pkey_get0_DH_int(const EVP_PKEY *pkey)
869 {
870     if (pkey->type != EVP_PKEY_DH && pkey->type != EVP_PKEY_DHX) {
871         ERR_raise(ERR_LIB_EVP, EVP_R_EXPECTING_A_DH_KEY);
872         return NULL;
873     }
874     return evp_pkey_get_legacy((EVP_PKEY *)pkey);
875 }
876
877 const DH *EVP_PKEY_get0_DH(const EVP_PKEY *pkey)
878 {
879     return evp_pkey_get0_DH_int(pkey);
880 }
881
882 DH *EVP_PKEY_get1_DH(EVP_PKEY *pkey)
883 {
884     DH *ret = evp_pkey_get0_DH_int(pkey);
885
886     if (ret != NULL)
887         DH_up_ref(ret);
888     return ret;
889 }
890 # endif
891
892 int EVP_PKEY_type(int type)
893 {
894     int ret;
895     const EVP_PKEY_ASN1_METHOD *ameth;
896     ENGINE *e;
897     ameth = EVP_PKEY_asn1_find(&e, type);
898     if (ameth)
899         ret = ameth->pkey_id;
900     else
901         ret = NID_undef;
902 # ifndef OPENSSL_NO_ENGINE
903     ENGINE_finish(e);
904 # endif
905     return ret;
906 }
907
908 int EVP_PKEY_id(const EVP_PKEY *pkey)
909 {
910     return pkey->type;
911 }
912
913 int EVP_PKEY_base_id(const EVP_PKEY *pkey)
914 {
915     return EVP_PKEY_type(pkey->type);
916 }
917
918 #ifndef FIPS_MODULE
919 /*
920  * These hard coded cases are pure hackery to get around the fact
921  * that names in crypto/objects/objects.txt are a mess.  There is
922  * no "EC", and "RSA" leads to the NID for 2.5.8.1.1, an OID that's
923  * fallen out in favor of { pkcs-1 1 }, i.e. 1.2.840.113549.1.1.1,
924  * the NID of which is used for EVP_PKEY_RSA.  Strangely enough,
925  * "DSA" is accurate...  but still, better be safe and hard-code
926  * names that we know.
927  * On a similar topic, EVP_PKEY_type(EVP_PKEY_SM2) will result in
928  * EVP_PKEY_EC, because of aliasing.
929  * TODO Clean this away along with all other #legacy support.
930  */
931 static const OSSL_ITEM standard_name2type[] = {
932     { EVP_PKEY_RSA,     "RSA" },
933     { EVP_PKEY_RSA_PSS, "RSA-PSS" },
934     { EVP_PKEY_EC,      "EC" },
935     { EVP_PKEY_ED25519, "ED25519" },
936     { EVP_PKEY_ED448,   "ED448" },
937     { EVP_PKEY_X25519,  "X25519" },
938     { EVP_PKEY_X448,    "X448" },
939     { EVP_PKEY_SM2,     "SM2" },
940     { EVP_PKEY_DH,      "DH" },
941     { EVP_PKEY_DHX,     "X9.42 DH" },
942     { EVP_PKEY_DHX,     "DHX" },
943     { EVP_PKEY_DSA,     "DSA" },
944 };
945
946 int evp_pkey_name2type(const char *name)
947 {
948     int type;
949     size_t i;
950
951     for (i = 0; i < OSSL_NELEM(standard_name2type); i++) {
952         if (strcasecmp(name, standard_name2type[i].ptr) == 0)
953             return (int)standard_name2type[i].id;
954     }
955
956     if ((type = EVP_PKEY_type(OBJ_sn2nid(name))) != NID_undef)
957         return type;
958     return EVP_PKEY_type(OBJ_ln2nid(name));
959 }
960
961 const char *evp_pkey_type2name(int type)
962 {
963     size_t i;
964
965     for (i = 0; i < OSSL_NELEM(standard_name2type); i++) {
966         if (type == (int)standard_name2type[i].id)
967             return standard_name2type[i].ptr;
968     }
969
970     return OBJ_nid2sn(type);
971 }
972 #endif
973
974 int EVP_PKEY_is_a(const EVP_PKEY *pkey, const char *name)
975 {
976 #ifndef FIPS_MODULE
977     if (pkey->keymgmt == NULL) {
978         int type = evp_pkey_name2type(name);
979
980         return pkey->type == type;
981     }
982 #endif
983     return EVP_KEYMGMT_is_a(pkey->keymgmt, name);
984 }
985
986 int EVP_PKEY_typenames_do_all(const EVP_PKEY *pkey,
987                               void (*fn)(const char *name, void *data),
988                               void *data)
989 {
990     if (!evp_pkey_is_typed(pkey))
991         return 0;
992
993     if (!evp_pkey_is_provided(pkey)) {
994         const char *name = OBJ_nid2sn(EVP_PKEY_id(pkey));
995
996         fn(name, data);
997         return 1;
998     }
999     return EVP_KEYMGMT_names_do_all(pkey->keymgmt, fn, data);
1000 }
1001
1002 int EVP_PKEY_can_sign(const EVP_PKEY *pkey)
1003 {
1004     if (pkey->keymgmt == NULL) {
1005         switch (EVP_PKEY_base_id(pkey)) {
1006         case EVP_PKEY_RSA:
1007             return 1;
1008 #ifndef OPENSSL_NO_DSA
1009         case EVP_PKEY_DSA:
1010             return 1;
1011 #endif
1012 #ifndef OPENSSL_NO_EC
1013         case EVP_PKEY_ED25519:
1014         case EVP_PKEY_ED448:
1015             return 1;
1016         case EVP_PKEY_EC:        /* Including SM2 */
1017             return EC_KEY_can_sign(pkey->pkey.ec);
1018 #endif
1019         default:
1020             break;
1021         }
1022     } else {
1023         const OSSL_PROVIDER *prov = EVP_KEYMGMT_provider(pkey->keymgmt);
1024         OSSL_LIB_CTX *libctx = ossl_provider_libctx(prov);
1025         const char *supported_sig =
1026             pkey->keymgmt->query_operation_name != NULL
1027             ? pkey->keymgmt->query_operation_name(OSSL_OP_SIGNATURE)
1028             : evp_first_name(prov, pkey->keymgmt->name_id);
1029         EVP_SIGNATURE *signature = NULL;
1030
1031         signature = EVP_SIGNATURE_fetch(libctx, supported_sig, NULL);
1032         if (signature != NULL) {
1033             EVP_SIGNATURE_free(signature);
1034             return 1;
1035         }
1036     }
1037     return 0;
1038 }
1039
1040 static int print_reset_indent(BIO **out, int pop_f_prefix, long saved_indent)
1041 {
1042     BIO_set_indent(*out, saved_indent);
1043     if (pop_f_prefix) {
1044         BIO *next = BIO_pop(*out);
1045
1046         BIO_free(*out);
1047         *out = next;
1048     }
1049     return 1;
1050 }
1051
1052 static int print_set_indent(BIO **out, int *pop_f_prefix, long *saved_indent,
1053                             long indent)
1054 {
1055     *pop_f_prefix = 0;
1056     *saved_indent = 0;
1057     if (indent > 0) {
1058         long i = BIO_get_indent(*out);
1059
1060         *saved_indent =  (i < 0 ? 0 : i);
1061         if (BIO_set_indent(*out, indent) <= 0) {
1062             if ((*out = BIO_push(BIO_new(BIO_f_prefix()), *out)) == NULL)
1063                 return 0;
1064             *pop_f_prefix = 1;
1065         }
1066         if (BIO_set_indent(*out, indent) <= 0) {
1067             print_reset_indent(out, *pop_f_prefix, *saved_indent);
1068             return 0;
1069         }
1070     }
1071     return 1;
1072 }
1073
1074 static int unsup_alg(BIO *out, const EVP_PKEY *pkey, int indent,
1075                      const char *kstr)
1076 {
1077     return BIO_indent(out, indent, 128)
1078         && BIO_printf(out, "%s algorithm \"%s\" unsupported\n",
1079                       kstr, OBJ_nid2ln(pkey->type)) > 0;
1080 }
1081
1082 static int print_pkey(const EVP_PKEY *pkey, BIO *out, int indent,
1083                       int selection /* For provided encoding */,
1084                       const char *propquery /* For provided encoding */,
1085                       int (*legacy_print)(BIO *out, const EVP_PKEY *pkey,
1086                                           int indent, ASN1_PCTX *pctx),
1087                       ASN1_PCTX *legacy_pctx /* For legacy print */)
1088 {
1089     int pop_f_prefix;
1090     long saved_indent;
1091     OSSL_ENCODER_CTX *ctx = NULL;
1092     int ret = -2;                /* default to unsupported */
1093
1094     if (!print_set_indent(&out, &pop_f_prefix, &saved_indent, indent))
1095         return 0;
1096
1097     ctx = OSSL_ENCODER_CTX_new_for_pkey(pkey, selection, "TEXT", NULL,
1098                                         propquery);
1099     if (OSSL_ENCODER_CTX_get_num_encoders(ctx) != 0)
1100         ret = OSSL_ENCODER_to_bio(ctx, out);
1101     OSSL_ENCODER_CTX_free(ctx);
1102
1103     if (ret != -2)
1104         goto end;
1105
1106     /* legacy fallback */
1107     if (legacy_print != NULL)
1108         ret = legacy_print(out, pkey, 0, legacy_pctx);
1109     else
1110         ret = unsup_alg(out, pkey, 0, "Public Key");
1111
1112  end:
1113     print_reset_indent(&out, pop_f_prefix, saved_indent);
1114     return ret;
1115 }
1116
1117 int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey,
1118                           int indent, ASN1_PCTX *pctx)
1119 {
1120     return print_pkey(pkey, out, indent, EVP_PKEY_PUBLIC_KEY, NULL,
1121                       (pkey->ameth != NULL ? pkey->ameth->pub_print : NULL),
1122                       pctx);
1123 }
1124
1125 int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey,
1126                            int indent, ASN1_PCTX *pctx)
1127 {
1128     return print_pkey(pkey, out, indent, EVP_PKEY_KEYPAIR, NULL,
1129                       (pkey->ameth != NULL ? pkey->ameth->priv_print : NULL),
1130                       pctx);
1131 }
1132
1133 int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey,
1134                           int indent, ASN1_PCTX *pctx)
1135 {
1136     return print_pkey(pkey, out, indent, EVP_PKEY_KEY_PARAMETERS, NULL,
1137                       (pkey->ameth != NULL ? pkey->ameth->param_print : NULL),
1138                       pctx);
1139 }
1140
1141 static void mdname2nid(const char *mdname, void *data)
1142 {
1143     int *nid = (int *)data;
1144
1145     if (*nid != NID_undef)
1146         return;
1147
1148     *nid = OBJ_sn2nid(mdname);
1149     if (*nid == NID_undef)
1150         *nid = OBJ_ln2nid(mdname);
1151 }
1152
1153 static int legacy_asn1_ctrl_to_param(EVP_PKEY *pkey, int op,
1154                                      int arg1, void *arg2)
1155 {
1156     if (pkey->keymgmt == NULL)
1157         return 0;
1158     switch (op) {
1159     case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
1160         {
1161             char mdname[80] = "";
1162             int rv = EVP_PKEY_get_default_digest_name(pkey, mdname,
1163                                                       sizeof(mdname));
1164
1165             if (rv > 0) {
1166                 int mdnum;
1167                 OSSL_LIB_CTX *libctx = ossl_provider_libctx(pkey->keymgmt->prov);
1168                 /* Make sure the MD is in the namemap if available */
1169                 EVP_MD *md = EVP_MD_fetch(libctx, mdname, NULL);
1170                 OSSL_NAMEMAP *namemap = ossl_namemap_stored(libctx);
1171                 int nid = NID_undef;
1172
1173                 /*
1174                  * The only reason to fetch the MD was to make sure it is in the
1175                  * namemap. We can immediately free it.
1176                  */
1177                 EVP_MD_free(md);
1178                 mdnum = ossl_namemap_name2num(namemap, mdname);
1179                 if (mdnum == 0)
1180                     return 0;
1181
1182                 /*
1183                  * We have the namemap number - now we need to find the
1184                  * associated nid
1185                  */
1186                 if (!ossl_namemap_doall_names(namemap, mdnum, mdname2nid, &nid))
1187                     return 0;
1188                 *(int *)arg2 = nid;
1189             }
1190             return rv;
1191         }
1192     default:
1193         return -2;
1194     }
1195 }
1196
1197 static int evp_pkey_asn1_ctrl(EVP_PKEY *pkey, int op, int arg1, void *arg2)
1198 {
1199     if (pkey->ameth == NULL)
1200         return legacy_asn1_ctrl_to_param(pkey, op, arg1, arg2);
1201     if (pkey->ameth->pkey_ctrl == NULL)
1202         return -2;
1203     return pkey->ameth->pkey_ctrl(pkey, op, arg1, arg2);
1204 }
1205
1206 int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid)
1207 {
1208     return evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_DEFAULT_MD_NID, 0, pnid);
1209 }
1210
1211 int EVP_PKEY_get_default_digest_name(EVP_PKEY *pkey,
1212                                      char *mdname, size_t mdname_sz)
1213 {
1214     if (pkey->ameth == NULL)
1215         return evp_keymgmt_util_get_deflt_digest_name(pkey->keymgmt,
1216                                                       pkey->keydata,
1217                                                       mdname, mdname_sz);
1218
1219     {
1220         int nid = NID_undef;
1221         int rv = EVP_PKEY_get_default_digest_nid(pkey, &nid);
1222         const char *name = rv > 0 ? OBJ_nid2sn(nid) : NULL;
1223
1224         if (rv > 0)
1225             OPENSSL_strlcpy(mdname, name, mdname_sz);
1226         return rv;
1227     }
1228 }
1229
1230 int EVP_PKEY_get_group_name(const EVP_PKEY *pkey, char *gname, size_t gname_sz,
1231                             size_t *gname_len)
1232 {
1233     return EVP_PKEY_get_utf8_string_param(pkey, OSSL_PKEY_PARAM_GROUP_NAME,
1234                                           gname, gname_sz, gname_len);
1235 }
1236
1237 int EVP_PKEY_supports_digest_nid(EVP_PKEY *pkey, int nid)
1238 {
1239     int rv, default_nid;
1240
1241     rv = evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_SUPPORTS_MD_NID, nid, NULL);
1242     if (rv == -2) {
1243         /*
1244          * If there is a mandatory default digest and this isn't it, then
1245          * the answer is 'no'.
1246          */
1247         rv = EVP_PKEY_get_default_digest_nid(pkey, &default_nid);
1248         if (rv == 2)
1249             return (nid == default_nid);
1250         /* zero is an error from EVP_PKEY_get_default_digest_nid() */
1251         if (rv == 0)
1252             return -1;
1253     }
1254     return rv;
1255 }
1256
1257 int EVP_PKEY_set1_encoded_public_key(EVP_PKEY *pkey, const unsigned char *pub,
1258                                      size_t publen)
1259 {
1260     if (pkey != NULL && evp_pkey_is_provided(pkey))
1261         return
1262             EVP_PKEY_set_octet_string_param(pkey,
1263                                             OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY,
1264                                             (unsigned char *)pub, publen);
1265
1266     if (publen > INT_MAX)
1267         return 0;
1268     /* Historically this function was EVP_PKEY_set1_tls_encodedpoint */
1269     if (evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_SET1_TLS_ENCPT, publen,
1270                            (void *)pub) <= 0)
1271         return 0;
1272     return 1;
1273 }
1274
1275 size_t EVP_PKEY_get1_encoded_public_key(EVP_PKEY *pkey, unsigned char **ppub)
1276 {
1277     int rv;
1278
1279     if (pkey != NULL && evp_pkey_is_provided(pkey)) {
1280         size_t return_size = OSSL_PARAM_UNMODIFIED;
1281
1282         /*
1283          * We know that this is going to fail, but it will give us a size
1284          * to allocate.
1285          */
1286         EVP_PKEY_get_octet_string_param(pkey,
1287                                         OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY,
1288                                         NULL, 0, &return_size);
1289         if (return_size == OSSL_PARAM_UNMODIFIED)
1290             return 0;
1291
1292         *ppub = OPENSSL_malloc(return_size);
1293         if (*ppub == NULL)
1294             return 0;
1295
1296         if (!EVP_PKEY_get_octet_string_param(pkey,
1297                                              OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY,
1298                                              *ppub, return_size, NULL))
1299             return 0;
1300         return return_size;
1301     }
1302
1303
1304     rv = evp_pkey_asn1_ctrl(pkey, ASN1_PKEY_CTRL_GET1_TLS_ENCPT, 0, ppub);
1305     if (rv <= 0)
1306         return 0;
1307     return rv;
1308 }
1309
1310 #endif /* FIPS_MODULE */
1311
1312 /*- All methods below can also be used in FIPS_MODULE */
1313
1314 EVP_PKEY *EVP_PKEY_new(void)
1315 {
1316     EVP_PKEY *ret = OPENSSL_zalloc(sizeof(*ret));
1317
1318     if (ret == NULL) {
1319         ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
1320         return NULL;
1321     }
1322
1323     ret->type = EVP_PKEY_NONE;
1324     ret->save_type = EVP_PKEY_NONE;
1325     ret->references = 1;
1326     ret->save_parameters = 1;
1327
1328     ret->lock = CRYPTO_THREAD_lock_new();
1329     if (ret->lock == NULL) {
1330         EVPerr(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
1331         goto err;
1332     }
1333
1334 #ifndef FIPS_MODULE
1335     if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_EVP_PKEY, ret, &ret->ex_data)) {
1336         ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
1337         goto err;
1338     }
1339 #endif
1340     return ret;
1341
1342  err:
1343     CRYPTO_THREAD_lock_free(ret->lock);
1344     OPENSSL_free(ret);
1345     return NULL;
1346 }
1347
1348 /*
1349  * Setup a public key management method.
1350  *
1351  * For legacy keys, either |type| or |str| is expected to have the type
1352  * information.  In this case, the setup consists of finding an ASN1 method
1353  * and potentially an ENGINE, and setting those fields in |pkey|.
1354  *
1355  * For provider side keys, |keymgmt| is expected to be non-NULL.  In this
1356  * case, the setup consists of setting the |keymgmt| field in |pkey|.
1357  *
1358  * If pkey is NULL just return 1 or 0 if the key management method exists.
1359  */
1360
1361 static int pkey_set_type(EVP_PKEY *pkey, ENGINE *e, int type, const char *str,
1362                          int len, EVP_KEYMGMT *keymgmt)
1363 {
1364 #ifndef FIPS_MODULE
1365     const EVP_PKEY_ASN1_METHOD *ameth = NULL;
1366     ENGINE **eptr = (e == NULL) ? &e :  NULL;
1367 #endif
1368
1369     /*
1370      * The setups can't set both legacy and provider side methods.
1371      * It is forbidden
1372      */
1373     if (!ossl_assert(type == EVP_PKEY_NONE || keymgmt == NULL)
1374         || !ossl_assert(e == NULL || keymgmt == NULL)) {
1375         ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
1376         return 0;
1377     }
1378
1379     if (pkey != NULL) {
1380         int free_it = 0;
1381
1382 #ifndef FIPS_MODULE
1383         free_it = free_it || pkey->pkey.ptr != NULL;
1384 #endif
1385         free_it = free_it || pkey->keydata != NULL;
1386         if (free_it)
1387             evp_pkey_free_it(pkey);
1388 #ifndef FIPS_MODULE
1389         /*
1390          * If key type matches and a method exists then this lookup has
1391          * succeeded once so just indicate success.
1392          */
1393         if (pkey->type != EVP_PKEY_NONE
1394             && type == pkey->save_type
1395             && pkey->ameth != NULL)
1396             return 1;
1397 # ifndef OPENSSL_NO_ENGINE
1398         /* If we have ENGINEs release them */
1399         ENGINE_finish(pkey->engine);
1400         pkey->engine = NULL;
1401         ENGINE_finish(pkey->pmeth_engine);
1402         pkey->pmeth_engine = NULL;
1403 # endif
1404 #endif
1405     }
1406 #ifndef FIPS_MODULE
1407     if (str != NULL)
1408         ameth = EVP_PKEY_asn1_find_str(eptr, str, len);
1409     else if (type != EVP_PKEY_NONE)
1410         ameth = EVP_PKEY_asn1_find(eptr, type);
1411 # ifndef OPENSSL_NO_ENGINE
1412     if (pkey == NULL && eptr != NULL)
1413         ENGINE_finish(e);
1414 # endif
1415 #endif
1416
1417
1418     {
1419         int check = 1;
1420
1421 #ifndef FIPS_MODULE
1422         check = check && ameth == NULL;
1423 #endif
1424         check = check && keymgmt == NULL;
1425         if (check) {
1426             ERR_raise(ERR_LIB_EVP, EVP_R_UNSUPPORTED_ALGORITHM);
1427             return 0;
1428         }
1429     }
1430     if (pkey != NULL) {
1431         if (keymgmt != NULL && !EVP_KEYMGMT_up_ref(keymgmt)) {
1432             ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
1433             return 0;
1434         }
1435
1436         pkey->keymgmt = keymgmt;
1437
1438         pkey->save_type = type;
1439         pkey->type = type;
1440
1441 #ifndef FIPS_MODULE
1442         /*
1443          * If the internal "origin" key is provider side, don't save |ameth|.
1444          * The main reason is that |ameth| is one factor to detect that the
1445          * internal "origin" key is a legacy one.
1446          */
1447         if (keymgmt == NULL)
1448             pkey->ameth = ameth;
1449         pkey->engine = e;
1450
1451         /*
1452          * The EVP_PKEY_ASN1_METHOD |pkey_id| retains its legacy key purpose
1453          * for any key type that has a legacy implementation, regardless of
1454          * if the internal key is a legacy or a provider side one.  When
1455          * there is no legacy implementation for the key, the type becomes
1456          * EVP_PKEY_KEYMGMT, which indicates that one should be cautious
1457          * with functions that expect legacy internal keys.
1458          */
1459         if (ameth != NULL)
1460             pkey->type = ameth->pkey_id;
1461         else
1462             pkey->type = EVP_PKEY_KEYMGMT;
1463 #endif
1464     }
1465     return 1;
1466 }
1467
1468 #ifndef FIPS_MODULE
1469 static void find_ameth(const char *name, void *data)
1470 {
1471     const char **str = data;
1472
1473     /*
1474      * The error messages from pkey_set_type() are uninteresting here,
1475      * and misleading.
1476      */
1477     ERR_set_mark();
1478
1479     if (pkey_set_type(NULL, NULL, EVP_PKEY_NONE, name, strlen(name),
1480                       NULL)) {
1481         if (str[0] == NULL)
1482             str[0] = name;
1483         else if (str[1] == NULL)
1484             str[1] = name;
1485     }
1486
1487     ERR_pop_to_mark();
1488 }
1489 #endif
1490
1491 int EVP_PKEY_set_type_by_keymgmt(EVP_PKEY *pkey, EVP_KEYMGMT *keymgmt)
1492 {
1493 #ifndef FIPS_MODULE
1494 # define EVP_PKEY_TYPE_STR str[0]
1495 # define EVP_PKEY_TYPE_STRLEN (str[0] == NULL ? -1 : (int)strlen(str[0]))
1496     /*
1497      * Find at most two strings that have an associated EVP_PKEY_ASN1_METHOD
1498      * Ideally, only one should be found.  If two (or more) are found, the
1499      * match is ambiguous.  This should never happen, but...
1500      */
1501     const char *str[2] = { NULL, NULL };
1502
1503     if (!EVP_KEYMGMT_names_do_all(keymgmt, find_ameth, &str)
1504             || str[1] != NULL) {
1505         ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
1506         return 0;
1507     }
1508 #else
1509 # define EVP_PKEY_TYPE_STR NULL
1510 # define EVP_PKEY_TYPE_STRLEN -1
1511 #endif
1512     return pkey_set_type(pkey, NULL, EVP_PKEY_NONE,
1513                          EVP_PKEY_TYPE_STR, EVP_PKEY_TYPE_STRLEN,
1514                          keymgmt);
1515
1516 #undef EVP_PKEY_TYPE_STR
1517 #undef EVP_PKEY_TYPE_STRLEN
1518 }
1519
1520 int EVP_PKEY_up_ref(EVP_PKEY *pkey)
1521 {
1522     int i;
1523
1524     if (CRYPTO_UP_REF(&pkey->references, &i, pkey->lock) <= 0)
1525         return 0;
1526
1527     REF_PRINT_COUNT("EVP_PKEY", pkey);
1528     REF_ASSERT_ISNT(i < 2);
1529     return ((i > 1) ? 1 : 0);
1530 }
1531
1532 #ifndef FIPS_MODULE
1533 void evp_pkey_free_legacy(EVP_PKEY *x)
1534 {
1535     const EVP_PKEY_ASN1_METHOD *ameth = x->ameth;
1536     ENGINE *tmpe = NULL;
1537
1538     if (ameth == NULL && x->legacy_cache_pkey.ptr != NULL)
1539         ameth = EVP_PKEY_asn1_find(&tmpe, x->type);
1540
1541     if (ameth != NULL) {
1542         if (x->legacy_cache_pkey.ptr != NULL) {
1543             /*
1544              * We should never have both a legacy origin key, and a key in the
1545              * legacy cache.
1546              */
1547             assert(x->pkey.ptr == NULL);
1548             /*
1549              * For the purposes of freeing we make the legacy cache look like
1550              * a legacy origin key.
1551              */
1552             x->pkey = x->legacy_cache_pkey;
1553             x->legacy_cache_pkey.ptr = NULL;
1554         }
1555         if (ameth->pkey_free != NULL)
1556             ameth->pkey_free(x);
1557         x->pkey.ptr = NULL;
1558     }
1559 # ifndef OPENSSL_NO_ENGINE
1560     ENGINE_finish(tmpe);
1561     ENGINE_finish(x->engine);
1562     x->engine = NULL;
1563     ENGINE_finish(x->pmeth_engine);
1564     x->pmeth_engine = NULL;
1565 # endif
1566 }
1567 #endif  /* FIPS_MODULE */
1568
1569 static void evp_pkey_free_it(EVP_PKEY *x)
1570 {
1571     /* internal function; x is never NULL */
1572     evp_keymgmt_util_clear_operation_cache(x, 1);
1573 #ifndef FIPS_MODULE
1574     evp_pkey_free_legacy(x);
1575 #endif
1576
1577     if (x->keymgmt != NULL) {
1578         evp_keymgmt_freedata(x->keymgmt, x->keydata);
1579         EVP_KEYMGMT_free(x->keymgmt);
1580         x->keymgmt = NULL;
1581         x->keydata = NULL;
1582     }
1583     x->type = EVP_PKEY_NONE;
1584 }
1585
1586 void EVP_PKEY_free(EVP_PKEY *x)
1587 {
1588     int i;
1589
1590     if (x == NULL)
1591         return;
1592
1593     CRYPTO_DOWN_REF(&x->references, &i, x->lock);
1594     REF_PRINT_COUNT("EVP_PKEY", x);
1595     if (i > 0)
1596         return;
1597     REF_ASSERT_ISNT(i < 0);
1598     evp_pkey_free_it(x);
1599 #ifndef FIPS_MODULE
1600     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_EVP_PKEY, x, &x->ex_data);
1601 #endif
1602     CRYPTO_THREAD_lock_free(x->lock);
1603 #ifndef FIPS_MODULE
1604     sk_X509_ATTRIBUTE_pop_free(x->attributes, X509_ATTRIBUTE_free);
1605 #endif
1606     OPENSSL_free(x);
1607 }
1608
1609 int EVP_PKEY_size(const EVP_PKEY *pkey)
1610 {
1611     int size = 0;
1612
1613     if (pkey != NULL) {
1614         size = pkey->cache.size;
1615 #ifndef FIPS_MODULE
1616         if (pkey->ameth != NULL && pkey->ameth->pkey_size != NULL)
1617             size = pkey->ameth->pkey_size(pkey);
1618 #endif
1619     }
1620     return size < 0 ? 0 : size;
1621 }
1622
1623 void *evp_pkey_export_to_provider(EVP_PKEY *pk, OSSL_LIB_CTX *libctx,
1624                                   EVP_KEYMGMT **keymgmt,
1625                                   const char *propquery)
1626 {
1627     EVP_KEYMGMT *allocated_keymgmt = NULL;
1628     EVP_KEYMGMT *tmp_keymgmt = NULL;
1629     void *keydata = NULL;
1630     int check;
1631
1632     if (pk == NULL)
1633         return NULL;
1634
1635     /* No key data => nothing to export */
1636     check = 1;
1637 #ifndef FIPS_MODULE
1638     check = check && pk->pkey.ptr == NULL;
1639 #endif
1640     check = check && pk->keydata == NULL;
1641     if (check)
1642         return NULL;
1643
1644 #ifndef FIPS_MODULE
1645     if (pk->pkey.ptr != NULL) {
1646         /*
1647          * If the legacy key doesn't have an dirty counter or export function,
1648          * give up
1649          */
1650         if (pk->ameth->dirty_cnt == NULL || pk->ameth->export_to == NULL)
1651             return NULL;
1652     }
1653 #endif
1654
1655     if (keymgmt != NULL) {
1656         tmp_keymgmt = *keymgmt;
1657         *keymgmt = NULL;
1658     }
1659
1660     /*
1661      * If no keymgmt was given or found, get a default keymgmt.  We do so by
1662      * letting EVP_PKEY_CTX_new_from_pkey() do it for us, then we steal it.
1663      */
1664     if (tmp_keymgmt == NULL) {
1665         EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pk, propquery);
1666
1667         tmp_keymgmt = ctx->keymgmt;
1668         ctx->keymgmt = NULL;
1669         EVP_PKEY_CTX_free(ctx);
1670     }
1671
1672     /* If there's still no keymgmt to be had, give up */
1673     if (tmp_keymgmt == NULL)
1674         goto end;
1675
1676 #ifndef FIPS_MODULE
1677     if (pk->pkey.ptr != NULL) {
1678         OP_CACHE_ELEM *op;
1679
1680         /*
1681          * If the legacy "origin" hasn't changed since last time, we try
1682          * to find our keymgmt in the operation cache.  If it has changed,
1683          * |i| remains zero, and we will clear the cache further down.
1684          */
1685         if (pk->ameth->dirty_cnt(pk) == pk->dirty_cnt_copy) {
1686             if (!CRYPTO_THREAD_read_lock(pk->lock))
1687                 goto end;
1688             op = evp_keymgmt_util_find_operation_cache(pk, tmp_keymgmt);
1689
1690             /*
1691              * If |tmp_keymgmt| is present in the operation cache, it means
1692              * that export doesn't need to be redone.  In that case, we take
1693              * token copies of the cached pointers, to have token success
1694              * values to return.
1695              */
1696             if (op != NULL && op->keymgmt != NULL) {
1697                 keydata = op->keydata;
1698                 CRYPTO_THREAD_unlock(pk->lock);
1699                 goto end;
1700             }
1701             CRYPTO_THREAD_unlock(pk->lock);
1702         }
1703
1704         /* Make sure that the keymgmt key type matches the legacy NID */
1705         if (!ossl_assert(EVP_KEYMGMT_is_a(tmp_keymgmt, OBJ_nid2sn(pk->type))))
1706             goto end;
1707
1708         if ((keydata = evp_keymgmt_newdata(tmp_keymgmt)) == NULL)
1709             goto end;
1710
1711         if (!pk->ameth->export_to(pk, keydata, tmp_keymgmt, libctx, propquery)) {
1712             evp_keymgmt_freedata(tmp_keymgmt, keydata);
1713             keydata = NULL;
1714             goto end;
1715         }
1716
1717         /*
1718          * If the dirty counter changed since last time, then clear the
1719          * operation cache.  In that case, we know that |i| is zero.  Just
1720          * in case this is a re-export, we increment then decrement the
1721          * keymgmt reference counter.
1722          */
1723         if (!EVP_KEYMGMT_up_ref(tmp_keymgmt)) { /* refcnt++ */
1724             evp_keymgmt_freedata(tmp_keymgmt, keydata);
1725             keydata = NULL;
1726             goto end;
1727         }
1728
1729         if (!CRYPTO_THREAD_write_lock(pk->lock))
1730             goto end;
1731         if (pk->ameth->dirty_cnt(pk) != pk->dirty_cnt_copy
1732                 && !evp_keymgmt_util_clear_operation_cache(pk, 0)) {
1733             CRYPTO_THREAD_unlock(pk->lock);
1734             evp_keymgmt_freedata(tmp_keymgmt, keydata);
1735             keydata = NULL;
1736             EVP_KEYMGMT_free(tmp_keymgmt);
1737             goto end;
1738         }
1739         EVP_KEYMGMT_free(tmp_keymgmt); /* refcnt-- */
1740
1741         /* Check to make sure some other thread didn't get there first */
1742         op = evp_keymgmt_util_find_operation_cache(pk, tmp_keymgmt);
1743         if (op != NULL && op->keymgmt != NULL) {
1744             void *tmp_keydata = op->keydata;
1745
1746             CRYPTO_THREAD_unlock(pk->lock);
1747             evp_keymgmt_freedata(tmp_keymgmt, keydata);
1748             keydata = tmp_keydata;
1749             goto end;
1750         }
1751
1752         /* Add the new export to the operation cache */
1753         if (!evp_keymgmt_util_cache_keydata(pk, tmp_keymgmt, keydata)) {
1754             CRYPTO_THREAD_unlock(pk->lock);
1755             evp_keymgmt_freedata(tmp_keymgmt, keydata);
1756             keydata = NULL;
1757             goto end;
1758         }
1759
1760         /* Synchronize the dirty count */
1761         pk->dirty_cnt_copy = pk->ameth->dirty_cnt(pk);
1762     
1763         CRYPTO_THREAD_unlock(pk->lock);
1764         goto end;
1765     }
1766 #endif  /* FIPS_MODULE */
1767
1768     keydata = evp_keymgmt_util_export_to_provider(pk, tmp_keymgmt);
1769
1770  end:
1771     /*
1772      * If nothing was exported, |tmp_keymgmt| might point at a freed
1773      * EVP_KEYMGMT, so we clear it to be safe.  It shouldn't be useful for
1774      * the caller either way in that case.
1775      */
1776     if (keydata == NULL)
1777         tmp_keymgmt = NULL;
1778
1779     if (keymgmt != NULL)
1780         *keymgmt = tmp_keymgmt;
1781
1782     EVP_KEYMGMT_free(allocated_keymgmt);
1783     return keydata;
1784 }
1785
1786 #ifndef FIPS_MODULE
1787 int evp_pkey_copy_downgraded(EVP_PKEY **dest, const EVP_PKEY *src)
1788 {
1789     if (!ossl_assert(dest != NULL))
1790         return 0;
1791
1792     if (evp_pkey_is_assigned(src) && evp_pkey_is_provided(src)) {
1793         EVP_KEYMGMT *keymgmt = src->keymgmt;
1794         void *keydata = src->keydata;
1795         int type = src->type;
1796         const char *keytype = NULL;
1797
1798         keytype = evp_first_name(EVP_KEYMGMT_provider(keymgmt),
1799                                  keymgmt->name_id);
1800
1801         /*
1802          * If the type is EVP_PKEY_NONE, then we have a problem somewhere
1803          * else in our code.  If it's not one of the well known EVP_PKEY_xxx
1804          * values, it should at least be EVP_PKEY_KEYMGMT at this point.
1805          * TODO(3.0) remove this check when we're confident that the rest
1806          * of the code treats this correctly.
1807          */
1808         if (!ossl_assert(type != EVP_PKEY_NONE)) {
1809             ERR_raise_data(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR,
1810                            "keymgmt key type = %s but legacy type = EVP_PKEY_NONE",
1811                            keytype);
1812             return 0;
1813         }
1814
1815         /* Prefer the legacy key type name for error reporting */
1816         if (type != EVP_PKEY_KEYMGMT)
1817             keytype = OBJ_nid2sn(type);
1818
1819         /* Make sure we have a clean slate to copy into */
1820         if (*dest == NULL) {
1821             *dest = EVP_PKEY_new();
1822             if (*dest == NULL) {
1823                 ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
1824                 return 0;
1825             }
1826         } else {
1827             evp_pkey_free_it(*dest);
1828         }
1829
1830         if (EVP_PKEY_set_type(*dest, type)) {
1831             /* If the key is typed but empty, we're done */
1832             if (keydata == NULL)
1833                 return 1;
1834
1835             if ((*dest)->ameth->import_from == NULL) {
1836                 ERR_raise_data(ERR_LIB_EVP, EVP_R_NO_IMPORT_FUNCTION,
1837                                "key type = %s", keytype);
1838             } else {
1839                 /*
1840                  * We perform the export in the same libctx as the keymgmt
1841                  * that we are using.
1842                  */
1843                 OSSL_LIB_CTX *libctx =
1844                     ossl_provider_libctx(keymgmt->prov);
1845                 EVP_PKEY_CTX *pctx =
1846                     EVP_PKEY_CTX_new_from_pkey(libctx, *dest, NULL);
1847
1848                 if (pctx == NULL)
1849                     ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
1850
1851                 if (pctx != NULL
1852                     && evp_keymgmt_export(keymgmt, keydata,
1853                                           OSSL_KEYMGMT_SELECT_ALL,
1854                                           (*dest)->ameth->import_from,
1855                                           pctx)) {
1856                     /* Synchronize the dirty count */
1857                     (*dest)->dirty_cnt_copy = (*dest)->ameth->dirty_cnt(*dest);
1858
1859                     EVP_PKEY_CTX_free(pctx);
1860                     return 1;
1861                 }
1862                 EVP_PKEY_CTX_free(pctx);
1863             }
1864
1865             ERR_raise_data(ERR_LIB_EVP, EVP_R_KEYMGMT_EXPORT_FAILURE,
1866                            "key type = %s", keytype);
1867         }
1868     }
1869
1870     return 0;
1871 }
1872
1873 void *evp_pkey_get_legacy(EVP_PKEY *pk)
1874 {
1875     EVP_PKEY *tmp_copy = NULL;
1876     void *ret = NULL;
1877
1878     if (!ossl_assert(pk != NULL))
1879         return NULL;
1880
1881     /*
1882      * If this isn't an assigned provider side key, we just use any existing
1883      * origin legacy key.
1884      */
1885     if (!evp_pkey_is_assigned(pk))
1886         return NULL;
1887     if (!evp_pkey_is_provided(pk))
1888         return pk->pkey.ptr;
1889
1890     if (!CRYPTO_THREAD_read_lock(pk->lock))
1891         return NULL;
1892
1893     ret = pk->legacy_cache_pkey.ptr;
1894
1895     if (!CRYPTO_THREAD_unlock(pk->lock))
1896         return NULL;
1897
1898     if (ret != NULL)
1899         return ret;
1900
1901     if (!evp_pkey_copy_downgraded(&tmp_copy, pk))
1902         return NULL;
1903
1904     if (!CRYPTO_THREAD_write_lock(pk->lock))
1905         goto err;
1906
1907     /* Check again in case some other thread has updated it in the meantime */
1908     ret = pk->legacy_cache_pkey.ptr;
1909     if (ret == NULL) {
1910         /* Steal the legacy key reference from the temporary copy */
1911         ret = pk->legacy_cache_pkey.ptr = tmp_copy->pkey.ptr;
1912         tmp_copy->pkey.ptr = NULL;
1913     }
1914
1915     if (!CRYPTO_THREAD_unlock(pk->lock)) {
1916         ret = NULL;
1917         goto err;
1918     }
1919
1920  err:
1921     EVP_PKEY_free(tmp_copy);
1922
1923     return ret;
1924 }
1925 #endif  /* FIPS_MODULE */
1926
1927 int EVP_PKEY_get_bn_param(const EVP_PKEY *pkey, const char *key_name,
1928                           BIGNUM **bn)
1929 {
1930     int ret = 0;
1931     OSSL_PARAM params[2];
1932     unsigned char buffer[2048];
1933     unsigned char *buf = NULL;
1934     size_t buf_sz = 0;
1935
1936     if (key_name == NULL
1937         || bn == NULL
1938         || pkey == NULL
1939         || !evp_pkey_is_provided(pkey))
1940         return 0;
1941
1942     memset(buffer, 0, sizeof(buffer));
1943     params[0] = OSSL_PARAM_construct_BN(key_name, buffer, sizeof(buffer));
1944     params[1] = OSSL_PARAM_construct_end();
1945     if (!EVP_PKEY_get_params(pkey, params)) {
1946         if (!OSSL_PARAM_modified(params) || params[0].return_size == 0)
1947             return 0;
1948         buf_sz = params[0].return_size;
1949         /*
1950          * If it failed because the buffer was too small then allocate the
1951          * required buffer size and retry.
1952          */
1953         buf = OPENSSL_zalloc(buf_sz);
1954         if (buf == NULL)
1955             return 0;
1956         params[0].data = buf;
1957         params[0].data_size = buf_sz;
1958
1959         if (!EVP_PKEY_get_params(pkey, params))
1960             goto err;
1961     }
1962     /* Fail if the param was not found */
1963     if (!OSSL_PARAM_modified(params))
1964         goto err;
1965     ret = OSSL_PARAM_get_BN(params, bn);
1966 err:
1967     OPENSSL_free(buf);
1968     return ret;
1969 }
1970
1971 int EVP_PKEY_get_octet_string_param(const EVP_PKEY *pkey, const char *key_name,
1972                                     unsigned char *buf, size_t max_buf_sz,
1973                                     size_t *out_sz)
1974 {
1975     OSSL_PARAM params[2];
1976     int ret1 = 0, ret2 = 0;
1977
1978     if (key_name == NULL
1979         || pkey == NULL
1980         || !evp_pkey_is_provided(pkey))
1981         return 0;
1982
1983     params[0] = OSSL_PARAM_construct_octet_string(key_name, buf, max_buf_sz);
1984     params[1] = OSSL_PARAM_construct_end();
1985     if ((ret1 = EVP_PKEY_get_params(pkey, params)))
1986         ret2 = OSSL_PARAM_modified(params);
1987     if (ret2 && out_sz != NULL)
1988         *out_sz = params[0].return_size;
1989     return ret1 && ret2;
1990 }
1991
1992 int EVP_PKEY_get_utf8_string_param(const EVP_PKEY *pkey, const char *key_name,
1993                                     char *str, size_t max_buf_sz,
1994                                     size_t *out_sz)
1995 {
1996     OSSL_PARAM params[2];
1997     int ret1 = 0, ret2 = 0;
1998
1999     if (key_name == NULL)
2000         return 0;
2001
2002     params[0] = OSSL_PARAM_construct_utf8_string(key_name, str, max_buf_sz);
2003     params[1] = OSSL_PARAM_construct_end();
2004     if ((ret1 = EVP_PKEY_get_params(pkey, params)))
2005         ret2 = OSSL_PARAM_modified(params);
2006     if (ret2 && out_sz != NULL)
2007         *out_sz = params[0].return_size;
2008     return ret1 && ret2;
2009 }
2010
2011 int EVP_PKEY_get_int_param(const EVP_PKEY *pkey, const char *key_name,
2012                            int *out)
2013 {
2014     OSSL_PARAM params[2];
2015
2016     if (key_name == NULL)
2017         return 0;
2018
2019     params[0] = OSSL_PARAM_construct_int(key_name, out);
2020     params[1] = OSSL_PARAM_construct_end();
2021     return EVP_PKEY_get_params(pkey, params)
2022         && OSSL_PARAM_modified(params);
2023 }
2024
2025 int EVP_PKEY_get_size_t_param(const EVP_PKEY *pkey, const char *key_name,
2026                               size_t *out)
2027 {
2028     OSSL_PARAM params[2];
2029
2030     if (key_name == NULL)
2031         return 0;
2032
2033     params[0] = OSSL_PARAM_construct_size_t(key_name, out);
2034     params[1] = OSSL_PARAM_construct_end();
2035     return EVP_PKEY_get_params(pkey, params)
2036         && OSSL_PARAM_modified(params);
2037 }
2038
2039 int EVP_PKEY_set_int_param(EVP_PKEY *pkey, const char *key_name, int in)
2040 {
2041     OSSL_PARAM params[2];
2042
2043     if (key_name == NULL)
2044         return 0;
2045
2046     params[0] = OSSL_PARAM_construct_int(key_name, &in);
2047     params[1] = OSSL_PARAM_construct_end();
2048     return EVP_PKEY_set_params(pkey, params);
2049 }
2050
2051 int EVP_PKEY_set_size_t_param(EVP_PKEY *pkey, const char *key_name, size_t in)
2052 {
2053     OSSL_PARAM params[2];
2054
2055     if (key_name == NULL)
2056         return 0;
2057
2058     params[0] = OSSL_PARAM_construct_size_t(key_name, &in);
2059     params[1] = OSSL_PARAM_construct_end();
2060     return EVP_PKEY_set_params(pkey, params);
2061 }
2062
2063 int EVP_PKEY_set_bn_param(EVP_PKEY *pkey, const char *key_name,
2064                           const BIGNUM *bn)
2065 {
2066     OSSL_PARAM params[2];
2067     unsigned char buffer[2048];
2068     int bsize = 0;
2069
2070     if (key_name == NULL
2071         || bn == NULL
2072         || pkey == NULL
2073         || !evp_pkey_is_assigned(pkey))
2074         return 0;
2075
2076     bsize = BN_num_bytes(bn);
2077     if (!ossl_assert(bsize <= (int)sizeof(buffer)))
2078         return 0;
2079
2080     if (BN_bn2nativepad(bn, buffer, bsize) < 0)
2081         return 0;
2082     params[0] = OSSL_PARAM_construct_BN(key_name, buffer, bsize);
2083     params[1] = OSSL_PARAM_construct_end();
2084     return EVP_PKEY_set_params(pkey, params);
2085 }
2086
2087 int EVP_PKEY_set_utf8_string_param(EVP_PKEY *pkey, const char *key_name,
2088                                    const char *str)
2089 {
2090     OSSL_PARAM params[2];
2091
2092     if (key_name == NULL)
2093         return 0;
2094
2095     params[0] = OSSL_PARAM_construct_utf8_string(key_name, (char *)str, 0);
2096     params[1] = OSSL_PARAM_construct_end();
2097     return EVP_PKEY_set_params(pkey, params);
2098 }
2099
2100 int EVP_PKEY_set_octet_string_param(EVP_PKEY *pkey, const char *key_name,
2101                                     const unsigned char *buf, size_t bsize)
2102 {
2103     OSSL_PARAM params[2];
2104
2105     if (key_name == NULL)
2106         return 0;
2107
2108     params[0] = OSSL_PARAM_construct_octet_string(key_name,
2109                                                   (unsigned char *)buf, bsize);
2110     params[1] = OSSL_PARAM_construct_end();
2111     return EVP_PKEY_set_params(pkey, params);
2112 }
2113
2114 const OSSL_PARAM *EVP_PKEY_settable_params(const EVP_PKEY *pkey)
2115 {
2116     return (pkey != NULL && evp_pkey_is_provided(pkey))
2117         ? EVP_KEYMGMT_settable_params(pkey->keymgmt)
2118         : NULL;
2119 }
2120
2121 int EVP_PKEY_set_params(EVP_PKEY *pkey, OSSL_PARAM params[])
2122 {
2123     if (pkey != NULL) {
2124         if (evp_pkey_is_provided(pkey)) {
2125             pkey->dirty_cnt++;
2126             return evp_keymgmt_set_params(pkey->keymgmt, pkey->keydata, params);
2127         }
2128 #ifndef FIPS_MODULE
2129         /*
2130          * TODO?
2131          * We will hopefully never find the need to set individual data in
2132          * EVP_PKEYs with a legacy internal key, but we can't be entirely
2133          * sure.  This bit of code can be enabled if we find the need.  If
2134          * not, it can safely be removed when #legacy support is removed.
2135          */
2136 # if 0
2137         else if (evp_pkey_is_legacy(pkey)) {
2138             return evp_pkey_set_params_to_ctrl(pkey, params);
2139         }
2140 # endif
2141 #endif
2142     }
2143     ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_KEY);
2144     return 0;
2145 }
2146
2147 const OSSL_PARAM *EVP_PKEY_gettable_params(const EVP_PKEY *pkey)
2148 {
2149     return (pkey != NULL && evp_pkey_is_provided(pkey))
2150         ? EVP_KEYMGMT_gettable_params(pkey->keymgmt)
2151         : NULL;
2152 }
2153
2154 int EVP_PKEY_get_params(const EVP_PKEY *pkey, OSSL_PARAM params[])
2155 {
2156     if (pkey != NULL) {
2157         if (evp_pkey_is_provided(pkey))
2158             return evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params);
2159 #ifndef FIPS_MODULE
2160         else if (evp_pkey_is_legacy(pkey))
2161             return evp_pkey_get_params_to_ctrl(pkey, params);
2162 #endif
2163     }
2164     ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_KEY);
2165     return 0;
2166 }
2167
2168 #ifndef FIPS_MODULE
2169 int EVP_PKEY_get_ec_point_conv_form(const EVP_PKEY *pkey)
2170 {
2171     char name[80];
2172     size_t name_len;
2173
2174     if (pkey == NULL)
2175         return 0;
2176
2177     if (pkey->keymgmt == NULL
2178             || pkey->keydata == NULL) {
2179 #ifndef OPENSSL_NO_EC
2180         /* Might work through the legacy route */
2181         const EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
2182
2183         if (ec == NULL)
2184             return 0;
2185
2186         return EC_KEY_get_conv_form(ec);
2187 #else
2188         return 0;
2189 #endif
2190     }
2191
2192     if (!EVP_PKEY_get_utf8_string_param(pkey,
2193                                         OSSL_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT,
2194                                         name, sizeof(name), &name_len))
2195         return 0;
2196
2197     if (strcmp(name, "uncompressed") == 0)
2198         return POINT_CONVERSION_UNCOMPRESSED;
2199
2200     if (strcmp(name, "compressed") == 0)
2201         return POINT_CONVERSION_COMPRESSED;
2202
2203     if (strcmp(name, "hybrid") == 0)
2204         return POINT_CONVERSION_HYBRID;
2205
2206     return 0;
2207 }
2208
2209 int EVP_PKEY_get_field_type(const EVP_PKEY *pkey)
2210 {
2211     char fstr[80];
2212     size_t fstrlen;
2213
2214     if (pkey == NULL)
2215         return 0;
2216
2217     if (pkey->keymgmt == NULL
2218             || pkey->keydata == NULL) {
2219 #ifndef OPENSSL_NO_EC
2220         /* Might work through the legacy route */
2221         const EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
2222         const EC_GROUP *grp;
2223
2224         if (ec == NULL)
2225             return 0;
2226         grp = EC_KEY_get0_group(ec);
2227         if (grp == NULL)
2228             return 0;
2229
2230         return EC_GROUP_get_field_type(grp);
2231 #else
2232         return 0;
2233 #endif
2234     }
2235
2236     if (!EVP_PKEY_get_utf8_string_param(pkey, OSSL_PKEY_PARAM_EC_FIELD_TYPE,
2237                                         fstr, sizeof(fstr), &fstrlen))
2238         return 0;
2239
2240     if (strcmp(fstr, SN_X9_62_prime_field) == 0)
2241         return NID_X9_62_prime_field;
2242     else if (strcmp(fstr, SN_X9_62_characteristic_two_field))
2243         return NID_X9_62_characteristic_two_field;
2244
2245     return 0;
2246 }
2247 #endif