v / thirdparty / mbedtls / library / pk_wrap.c
1595 lines · 1377 sloc · 51.92 KB · 3d9911f887ecec942f9ae2a5be02d064f233b729
Raw
1/*
2 * Public Key abstraction layer: wrapper functions
3 *
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 */
7
8#include "common.h"
9
10#include "mbedtls/platform_util.h"
11
12#if defined(MBEDTLS_PK_C)
13#include "pk_wrap.h"
14#include "pk_internal.h"
15#include "mbedtls/error.h"
16#include "mbedtls/psa_util.h"
17
18/* Even if RSA not activated, for the sake of RSA-alt */
19#include "mbedtls/rsa.h"
20
21#if defined(MBEDTLS_ECP_C)
22#include "mbedtls/ecp.h"
23#endif
24
25#if defined(MBEDTLS_ECDSA_C)
26#include "mbedtls/ecdsa.h"
27#endif
28
29#if defined(MBEDTLS_USE_PSA_CRYPTO)
30#include "psa_util_internal.h"
31#include "psa/crypto.h"
32#include "mbedtls/psa_util.h"
33
34#if defined(MBEDTLS_RSA_C)
35#include "pkwrite.h"
36#include "rsa_internal.h"
37#endif
38
39#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
40#include "mbedtls/asn1write.h"
41#include "mbedtls/asn1.h"
42#endif
43#endif /* MBEDTLS_USE_PSA_CRYPTO */
44
45#include "mbedtls/platform.h"
46
47#include <limits.h>
48#include <stdint.h>
49#include <string.h>
50
51#if defined(MBEDTLS_RSA_C)
52static int rsa_can_do(mbedtls_pk_type_t type)
53{
54 return type == MBEDTLS_PK_RSA ||
55 type == MBEDTLS_PK_RSASSA_PSS;
56}
57
58static size_t rsa_get_bitlen(mbedtls_pk_context *pk)
59{
60 const mbedtls_rsa_context *rsa = (const mbedtls_rsa_context *) pk->pk_ctx;
61 return mbedtls_rsa_get_bitlen(rsa);
62}
63
64#if defined(MBEDTLS_USE_PSA_CRYPTO)
65static int rsa_verify_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
66 const unsigned char *hash, size_t hash_len,
67 const unsigned char *sig, size_t sig_len)
68{
69 mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
70 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
71 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
72 mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
73 psa_status_t status;
74 int key_len;
75 unsigned char buf[PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS)];
76 unsigned char *p = buf + sizeof(buf);
77 psa_algorithm_t psa_alg_md;
78 size_t rsa_len = mbedtls_rsa_get_len(rsa);
79
80#if SIZE_MAX > UINT_MAX
81 if (md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len) {
82 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
83 }
84#endif
85
86 if (mbedtls_rsa_get_padding_mode(rsa) == MBEDTLS_RSA_PKCS_V21) {
87 psa_alg_md = PSA_ALG_RSA_PSS(mbedtls_md_psa_alg_from_type(md_alg));
88 } else {
89 psa_alg_md = PSA_ALG_RSA_PKCS1V15_SIGN(mbedtls_md_psa_alg_from_type(md_alg));
90 }
91
92 if (sig_len < rsa_len) {
93 return MBEDTLS_ERR_RSA_VERIFY_FAILED;
94 }
95
96 key_len = mbedtls_rsa_write_pubkey(rsa, buf, &p);
97 if (key_len <= 0) {
98 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
99 }
100
101 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_VERIFY_HASH);
102 psa_set_key_algorithm(&attributes, psa_alg_md);
103 psa_set_key_type(&attributes, PSA_KEY_TYPE_RSA_PUBLIC_KEY);
104
105 status = psa_import_key(&attributes,
106 buf + sizeof(buf) - key_len, key_len,
107 &key_id);
108 if (status != PSA_SUCCESS) {
109 ret = PSA_PK_TO_MBEDTLS_ERR(status);
110 goto cleanup;
111 }
112
113 status = psa_verify_hash(key_id, psa_alg_md, hash, hash_len,
114 sig, sig_len);
115 if (status != PSA_SUCCESS) {
116 ret = PSA_PK_RSA_TO_MBEDTLS_ERR(status);
117 goto cleanup;
118 }
119 ret = 0;
120
121cleanup:
122 status = psa_destroy_key(key_id);
123 if (ret == 0 && status != PSA_SUCCESS) {
124 ret = PSA_PK_TO_MBEDTLS_ERR(status);
125 }
126
127 return ret;
128}
129#else /* MBEDTLS_USE_PSA_CRYPTO */
130static int rsa_verify_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
131 const unsigned char *hash, size_t hash_len,
132 const unsigned char *sig, size_t sig_len)
133{
134 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
135 mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
136 size_t rsa_len = mbedtls_rsa_get_len(rsa);
137
138#if SIZE_MAX > UINT_MAX
139 if (md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len) {
140 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
141 }
142#endif
143
144 if (sig_len < rsa_len) {
145 return MBEDTLS_ERR_RSA_VERIFY_FAILED;
146 }
147
148 if ((ret = mbedtls_rsa_pkcs1_verify(rsa, md_alg,
149 (unsigned int) hash_len,
150 hash, sig)) != 0) {
151 return ret;
152 }
153
154 /* The buffer contains a valid signature followed by extra data.
155 * We have a special error code for that so that so that callers can
156 * use mbedtls_pk_verify() to check "Does the buffer start with a
157 * valid signature?" and not just "Does the buffer contain a valid
158 * signature?". */
159 if (sig_len > rsa_len) {
160 return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH;
161 }
162
163 return 0;
164}
165#endif /* MBEDTLS_USE_PSA_CRYPTO */
166
167#if defined(MBEDTLS_USE_PSA_CRYPTO)
168int mbedtls_pk_psa_rsa_sign_ext(psa_algorithm_t alg,
169 mbedtls_rsa_context *rsa_ctx,
170 const unsigned char *hash, size_t hash_len,
171 unsigned char *sig, size_t sig_size,
172 size_t *sig_len)
173{
174 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
175 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
176 mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
177 psa_status_t status;
178 int key_len;
179 unsigned char *buf = NULL;
180 unsigned char *p;
181
182 buf = mbedtls_calloc(1, MBEDTLS_PK_RSA_PRV_DER_MAX_BYTES);
183 if (buf == NULL) {
184 return MBEDTLS_ERR_PK_ALLOC_FAILED;
185 }
186 p = buf + MBEDTLS_PK_RSA_PRV_DER_MAX_BYTES;
187
188 *sig_len = mbedtls_rsa_get_len(rsa_ctx);
189 if (sig_size < *sig_len) {
190 mbedtls_free(buf);
191 return MBEDTLS_ERR_PK_BUFFER_TOO_SMALL;
192 }
193
194 key_len = mbedtls_rsa_write_key(rsa_ctx, buf, &p);
195 if (key_len <= 0) {
196 mbedtls_free(buf);
197 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
198 }
199 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
200 psa_set_key_algorithm(&attributes, alg);
201 psa_set_key_type(&attributes, PSA_KEY_TYPE_RSA_KEY_PAIR);
202
203 status = psa_import_key(&attributes,
204 buf + MBEDTLS_PK_RSA_PRV_DER_MAX_BYTES - key_len, key_len,
205 &key_id);
206 if (status != PSA_SUCCESS) {
207 ret = PSA_PK_TO_MBEDTLS_ERR(status);
208 goto cleanup;
209 }
210 status = psa_sign_hash(key_id, alg, hash, hash_len,
211 sig, sig_size, sig_len);
212 if (status != PSA_SUCCESS) {
213 ret = PSA_PK_RSA_TO_MBEDTLS_ERR(status);
214 goto cleanup;
215 }
216
217 ret = 0;
218
219cleanup:
220 mbedtls_free(buf);
221 status = psa_destroy_key(key_id);
222 if (ret == 0 && status != PSA_SUCCESS) {
223 ret = PSA_PK_TO_MBEDTLS_ERR(status);
224 }
225 return ret;
226}
227#endif /* MBEDTLS_USE_PSA_CRYPTO */
228
229#if defined(MBEDTLS_USE_PSA_CRYPTO)
230static int rsa_sign_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
231 const unsigned char *hash, size_t hash_len,
232 unsigned char *sig, size_t sig_size, size_t *sig_len,
233 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
234{
235 ((void) f_rng);
236 ((void) p_rng);
237
238 psa_algorithm_t psa_md_alg;
239 psa_md_alg = mbedtls_md_psa_alg_from_type(md_alg);
240 if (psa_md_alg == 0) {
241 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
242 }
243 psa_algorithm_t psa_alg;
244 if (mbedtls_rsa_get_padding_mode(mbedtls_pk_rsa(*pk)) == MBEDTLS_RSA_PKCS_V21) {
245 psa_alg = PSA_ALG_RSA_PSS(psa_md_alg);
246 } else {
247 psa_alg = PSA_ALG_RSA_PKCS1V15_SIGN(psa_md_alg);
248 }
249
250 return mbedtls_pk_psa_rsa_sign_ext(psa_alg, pk->pk_ctx, hash, hash_len,
251 sig, sig_size, sig_len);
252}
253#else /* MBEDTLS_USE_PSA_CRYPTO */
254static int rsa_sign_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
255 const unsigned char *hash, size_t hash_len,
256 unsigned char *sig, size_t sig_size, size_t *sig_len,
257 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
258{
259 mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
260
261#if SIZE_MAX > UINT_MAX
262 if (md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len) {
263 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
264 }
265#endif
266
267 *sig_len = mbedtls_rsa_get_len(rsa);
268 if (sig_size < *sig_len) {
269 return MBEDTLS_ERR_PK_BUFFER_TOO_SMALL;
270 }
271
272 return mbedtls_rsa_pkcs1_sign(rsa, f_rng, p_rng,
273 md_alg, (unsigned int) hash_len,
274 hash, sig);
275}
276#endif /* MBEDTLS_USE_PSA_CRYPTO */
277
278#if defined(MBEDTLS_USE_PSA_CRYPTO)
279static int rsa_decrypt_wrap(mbedtls_pk_context *pk,
280 const unsigned char *input, size_t ilen,
281 unsigned char *output, size_t *olen, size_t osize,
282 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
283{
284 mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
285 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
286 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
287 mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
288 psa_algorithm_t psa_md_alg, decrypt_alg;
289 psa_status_t status;
290 int key_len;
291 ((void) f_rng);
292 ((void) p_rng);
293
294 if (ilen != mbedtls_rsa_get_len(rsa)) {
295 return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
296 }
297
298 const size_t key_bits = mbedtls_pk_get_bitlen(pk);
299 /* mbedtls_rsa_write_key() uses the same format as PSA export, which
300 * actually calls it under the hood, so we can use the PSA size macro. */
301 const size_t buf_size = PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(key_bits);
302 unsigned char *buf = mbedtls_calloc(1, buf_size);
303
304 unsigned char *p = buf + buf_size;
305 key_len = mbedtls_rsa_write_key(rsa, buf, &p);
306 if (key_len <= 0) {
307 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
308 }
309
310 psa_set_key_type(&attributes, PSA_KEY_TYPE_RSA_KEY_PAIR);
311 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DECRYPT);
312 if (mbedtls_rsa_get_padding_mode(rsa) == MBEDTLS_RSA_PKCS_V21) {
313 psa_md_alg = mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) mbedtls_rsa_get_md_alg(rsa));
314 decrypt_alg = PSA_ALG_RSA_OAEP(psa_md_alg);
315 } else {
316 decrypt_alg = PSA_ALG_RSA_PKCS1V15_CRYPT;
317 }
318 psa_set_key_algorithm(&attributes, decrypt_alg);
319
320 status = psa_import_key(&attributes,
321 buf + buf_size - key_len, key_len,
322 &key_id);
323 if (status != PSA_SUCCESS) {
324 ret = PSA_PK_TO_MBEDTLS_ERR(status);
325 goto cleanup;
326 }
327
328 status = psa_asymmetric_decrypt(key_id, decrypt_alg,
329 input, ilen,
330 NULL, 0,
331 output, osize, olen);
332 if (status != PSA_SUCCESS) {
333 ret = PSA_PK_RSA_TO_MBEDTLS_ERR(status);
334 goto cleanup;
335 }
336
337 ret = 0;
338
339cleanup:
340 mbedtls_zeroize_and_free(buf, buf_size);
341 status = psa_destroy_key(key_id);
342 if (ret == 0 && status != PSA_SUCCESS) {
343 ret = PSA_PK_TO_MBEDTLS_ERR(status);
344 }
345
346 return ret;
347}
348#else /* MBEDTLS_USE_PSA_CRYPTO */
349static int rsa_decrypt_wrap(mbedtls_pk_context *pk,
350 const unsigned char *input, size_t ilen,
351 unsigned char *output, size_t *olen, size_t osize,
352 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
353{
354 mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
355
356 if (ilen != mbedtls_rsa_get_len(rsa)) {
357 return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
358 }
359
360 return mbedtls_rsa_pkcs1_decrypt(rsa, f_rng, p_rng,
361 olen, input, output, osize);
362}
363#endif /* MBEDTLS_USE_PSA_CRYPTO */
364
365#if defined(MBEDTLS_USE_PSA_CRYPTO)
366static int rsa_encrypt_wrap(mbedtls_pk_context *pk,
367 const unsigned char *input, size_t ilen,
368 unsigned char *output, size_t *olen, size_t osize,
369 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
370{
371 mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
372 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
373 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
374 mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
375 psa_algorithm_t psa_md_alg, psa_encrypt_alg;
376 psa_status_t status;
377 int key_len;
378 unsigned char buf[PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS)];
379 unsigned char *p = buf + sizeof(buf);
380
381 ((void) f_rng);
382 ((void) p_rng);
383
384 if (mbedtls_rsa_get_len(rsa) > osize) {
385 return MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE;
386 }
387
388 key_len = mbedtls_rsa_write_pubkey(rsa, buf, &p);
389 if (key_len <= 0) {
390 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
391 }
392
393 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_ENCRYPT);
394 if (mbedtls_rsa_get_padding_mode(rsa) == MBEDTLS_RSA_PKCS_V21) {
395 psa_md_alg = mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) mbedtls_rsa_get_md_alg(rsa));
396 psa_encrypt_alg = PSA_ALG_RSA_OAEP(psa_md_alg);
397 } else {
398 psa_encrypt_alg = PSA_ALG_RSA_PKCS1V15_CRYPT;
399 }
400 psa_set_key_algorithm(&attributes, psa_encrypt_alg);
401 psa_set_key_type(&attributes, PSA_KEY_TYPE_RSA_PUBLIC_KEY);
402
403 status = psa_import_key(&attributes,
404 buf + sizeof(buf) - key_len, key_len,
405 &key_id);
406 if (status != PSA_SUCCESS) {
407 ret = PSA_PK_TO_MBEDTLS_ERR(status);
408 goto cleanup;
409 }
410
411 status = psa_asymmetric_encrypt(key_id, psa_encrypt_alg,
412 input, ilen,
413 NULL, 0,
414 output, osize, olen);
415 if (status != PSA_SUCCESS) {
416 ret = PSA_PK_RSA_TO_MBEDTLS_ERR(status);
417 goto cleanup;
418 }
419
420 ret = 0;
421
422cleanup:
423 status = psa_destroy_key(key_id);
424 if (ret == 0 && status != PSA_SUCCESS) {
425 ret = PSA_PK_TO_MBEDTLS_ERR(status);
426 }
427
428 return ret;
429}
430#else /* MBEDTLS_USE_PSA_CRYPTO */
431static int rsa_encrypt_wrap(mbedtls_pk_context *pk,
432 const unsigned char *input, size_t ilen,
433 unsigned char *output, size_t *olen, size_t osize,
434 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
435{
436 mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
437 *olen = mbedtls_rsa_get_len(rsa);
438
439 if (*olen > osize) {
440 return MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE;
441 }
442
443 return mbedtls_rsa_pkcs1_encrypt(rsa, f_rng, p_rng,
444 ilen, input, output);
445}
446#endif /* MBEDTLS_USE_PSA_CRYPTO */
447
448static int rsa_check_pair_wrap(mbedtls_pk_context *pub, mbedtls_pk_context *prv,
449 int (*f_rng)(void *, unsigned char *, size_t),
450 void *p_rng)
451{
452 (void) f_rng;
453 (void) p_rng;
454 return mbedtls_rsa_check_pub_priv((const mbedtls_rsa_context *) pub->pk_ctx,
455 (const mbedtls_rsa_context *) prv->pk_ctx);
456}
457
458static void *rsa_alloc_wrap(void)
459{
460 void *ctx = mbedtls_calloc(1, sizeof(mbedtls_rsa_context));
461
462 if (ctx != NULL) {
463 mbedtls_rsa_init((mbedtls_rsa_context *) ctx);
464 }
465
466 return ctx;
467}
468
469static void rsa_free_wrap(void *ctx)
470{
471 mbedtls_rsa_free((mbedtls_rsa_context *) ctx);
472 mbedtls_free(ctx);
473}
474
475static void rsa_debug(mbedtls_pk_context *pk, mbedtls_pk_debug_item *items)
476{
477#if defined(MBEDTLS_RSA_ALT)
478 /* Not supported */
479 (void) pk;
480 (void) items;
481#else
482 mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
483
484 items->type = MBEDTLS_PK_DEBUG_MPI;
485 items->name = "rsa.N";
486 items->value = &(rsa->N);
487
488 items++;
489
490 items->type = MBEDTLS_PK_DEBUG_MPI;
491 items->name = "rsa.E";
492 items->value = &(rsa->E);
493#endif
494}
495
496const mbedtls_pk_info_t mbedtls_rsa_info = {
497 .type = MBEDTLS_PK_RSA,
498 .name = "RSA",
499 .get_bitlen = rsa_get_bitlen,
500 .can_do = rsa_can_do,
501 .verify_func = rsa_verify_wrap,
502 .sign_func = rsa_sign_wrap,
503#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
504 .verify_rs_func = NULL,
505 .sign_rs_func = NULL,
506 .rs_alloc_func = NULL,
507 .rs_free_func = NULL,
508#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
509 .decrypt_func = rsa_decrypt_wrap,
510 .encrypt_func = rsa_encrypt_wrap,
511 .check_pair_func = rsa_check_pair_wrap,
512 .ctx_alloc_func = rsa_alloc_wrap,
513 .ctx_free_func = rsa_free_wrap,
514 .debug_func = rsa_debug,
515};
516#endif /* MBEDTLS_RSA_C */
517
518#if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
519/*
520 * Generic EC key
521 */
522static int eckey_can_do(mbedtls_pk_type_t type)
523{
524 return type == MBEDTLS_PK_ECKEY ||
525 type == MBEDTLS_PK_ECKEY_DH ||
526 type == MBEDTLS_PK_ECDSA;
527}
528
529static size_t eckey_get_bitlen(mbedtls_pk_context *pk)
530{
531#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
532 return pk->ec_bits;
533#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
534 mbedtls_ecp_keypair *ecp = (mbedtls_ecp_keypair *) pk->pk_ctx;
535 return ecp->grp.pbits;
536#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
537}
538
539#if defined(MBEDTLS_PK_CAN_ECDSA_VERIFY)
540#if defined(MBEDTLS_USE_PSA_CRYPTO)
541/* Common helper for ECDSA verify using PSA functions. */
542static int ecdsa_verify_psa(unsigned char *key, size_t key_len,
543 psa_ecc_family_t curve, size_t curve_bits,
544 const unsigned char *hash, size_t hash_len,
545 const unsigned char *sig, size_t sig_len)
546{
547 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
548 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
549 mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
550 psa_algorithm_t psa_sig_md = PSA_ALG_ECDSA_ANY;
551 size_t signature_len = PSA_ECDSA_SIGNATURE_SIZE(curve_bits);
552 size_t converted_sig_len;
553 unsigned char extracted_sig[PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE];
554 unsigned char *p;
555 psa_status_t status;
556
557 if (curve == 0) {
558 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
559 }
560
561 psa_set_key_type(&attributes, PSA_KEY_TYPE_ECC_PUBLIC_KEY(curve));
562 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_VERIFY_HASH);
563 psa_set_key_algorithm(&attributes, psa_sig_md);
564
565 status = psa_import_key(&attributes, key, key_len, &key_id);
566 if (status != PSA_SUCCESS) {
567 ret = PSA_PK_TO_MBEDTLS_ERR(status);
568 goto cleanup;
569 }
570
571 if (signature_len > sizeof(extracted_sig)) {
572 ret = MBEDTLS_ERR_PK_BAD_INPUT_DATA;
573 goto cleanup;
574 }
575
576 p = (unsigned char *) sig;
577 ret = mbedtls_ecdsa_der_to_raw(curve_bits, p, sig_len, extracted_sig,
578 sizeof(extracted_sig), &converted_sig_len);
579 if (ret != 0) {
580 goto cleanup;
581 }
582
583 if (converted_sig_len != signature_len) {
584 ret = MBEDTLS_ERR_PK_BAD_INPUT_DATA;
585 goto cleanup;
586 }
587
588 status = psa_verify_hash(key_id, psa_sig_md, hash, hash_len,
589 extracted_sig, signature_len);
590 if (status != PSA_SUCCESS) {
591 ret = PSA_PK_ECDSA_TO_MBEDTLS_ERR(status);
592 goto cleanup;
593 }
594
595 ret = 0;
596
597cleanup:
598 status = psa_destroy_key(key_id);
599 if (ret == 0 && status != PSA_SUCCESS) {
600 ret = PSA_PK_TO_MBEDTLS_ERR(status);
601 }
602
603 return ret;
604}
605
606static int ecdsa_opaque_verify_wrap(mbedtls_pk_context *pk,
607 mbedtls_md_type_t md_alg,
608 const unsigned char *hash, size_t hash_len,
609 const unsigned char *sig, size_t sig_len)
610{
611 (void) md_alg;
612 unsigned char key[MBEDTLS_PK_MAX_EC_PUBKEY_RAW_LEN];
613 size_t key_len;
614 psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
615 psa_ecc_family_t curve;
616 size_t curve_bits;
617 psa_status_t status;
618
619 status = psa_get_key_attributes(pk->priv_id, &key_attr);
620 if (status != PSA_SUCCESS) {
621 return PSA_PK_ECDSA_TO_MBEDTLS_ERR(status);
622 }
623 curve = PSA_KEY_TYPE_ECC_GET_FAMILY(psa_get_key_type(&key_attr));
624 curve_bits = psa_get_key_bits(&key_attr);
625 psa_reset_key_attributes(&key_attr);
626
627 status = psa_export_public_key(pk->priv_id, key, sizeof(key), &key_len);
628 if (status != PSA_SUCCESS) {
629 return PSA_PK_ECDSA_TO_MBEDTLS_ERR(status);
630 }
631
632 return ecdsa_verify_psa(key, key_len, curve, curve_bits,
633 hash, hash_len, sig, sig_len);
634}
635
636#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
637static int ecdsa_verify_wrap(mbedtls_pk_context *pk,
638 mbedtls_md_type_t md_alg,
639 const unsigned char *hash, size_t hash_len,
640 const unsigned char *sig, size_t sig_len)
641{
642 (void) md_alg;
643 psa_ecc_family_t curve = pk->ec_family;
644 size_t curve_bits = pk->ec_bits;
645
646 return ecdsa_verify_psa(pk->pub_raw, pk->pub_raw_len, curve, curve_bits,
647 hash, hash_len, sig, sig_len);
648}
649#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
650static int ecdsa_verify_wrap(mbedtls_pk_context *pk,
651 mbedtls_md_type_t md_alg,
652 const unsigned char *hash, size_t hash_len,
653 const unsigned char *sig, size_t sig_len)
654{
655 (void) md_alg;
656 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
657 mbedtls_ecp_keypair *ctx = pk->pk_ctx;
658 unsigned char key[MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH];
659 size_t key_len;
660 size_t curve_bits;
661 psa_ecc_family_t curve = mbedtls_ecc_group_to_psa(ctx->grp.id, &curve_bits);
662
663 ret = mbedtls_ecp_point_write_binary(&ctx->grp, &ctx->Q,
664 MBEDTLS_ECP_PF_UNCOMPRESSED,
665 &key_len, key, sizeof(key));
666 if (ret != 0) {
667 return ret;
668 }
669
670 return ecdsa_verify_psa(key, key_len, curve, curve_bits,
671 hash, hash_len, sig, sig_len);
672}
673#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
674#else /* MBEDTLS_USE_PSA_CRYPTO */
675static int ecdsa_verify_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
676 const unsigned char *hash, size_t hash_len,
677 const unsigned char *sig, size_t sig_len)
678{
679 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
680 ((void) md_alg);
681
682 ret = mbedtls_ecdsa_read_signature((mbedtls_ecdsa_context *) pk->pk_ctx,
683 hash, hash_len, sig, sig_len);
684
685 if (ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) {
686 return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH;
687 }
688
689 return ret;
690}
691#endif /* MBEDTLS_USE_PSA_CRYPTO */
692#endif /* MBEDTLS_PK_CAN_ECDSA_VERIFY */
693
694#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
695#if defined(MBEDTLS_USE_PSA_CRYPTO)
696/* Common helper for ECDSA sign using PSA functions.
697 * Instead of extracting key's properties in order to check which kind of ECDSA
698 * signature it supports, we try both deterministic and non-deterministic.
699 */
700static int ecdsa_sign_psa(mbedtls_svc_key_id_t key_id, mbedtls_md_type_t md_alg,
701 const unsigned char *hash, size_t hash_len,
702 unsigned char *sig, size_t sig_size, size_t *sig_len)
703{
704 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
705 psa_status_t status;
706 psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
707 size_t key_bits = 0;
708
709 status = psa_get_key_attributes(key_id, &key_attr);
710 if (status != PSA_SUCCESS) {
711 return PSA_PK_ECDSA_TO_MBEDTLS_ERR(status);
712 }
713 key_bits = psa_get_key_bits(&key_attr);
714 psa_reset_key_attributes(&key_attr);
715
716 status = psa_sign_hash(key_id,
717 PSA_ALG_DETERMINISTIC_ECDSA(mbedtls_md_psa_alg_from_type(md_alg)),
718 hash, hash_len, sig, sig_size, sig_len);
719 if (status == PSA_SUCCESS) {
720 goto done;
721 } else if (status != PSA_ERROR_NOT_PERMITTED) {
722 return PSA_PK_ECDSA_TO_MBEDTLS_ERR(status);
723 }
724
725 status = psa_sign_hash(key_id,
726 PSA_ALG_ECDSA(mbedtls_md_psa_alg_from_type(md_alg)),
727 hash, hash_len, sig, sig_size, sig_len);
728 if (status != PSA_SUCCESS) {
729 return PSA_PK_ECDSA_TO_MBEDTLS_ERR(status);
730 }
731
732done:
733 ret = mbedtls_ecdsa_raw_to_der(key_bits, sig, *sig_len, sig, sig_size, sig_len);
734
735 return ret;
736}
737
738static int ecdsa_opaque_sign_wrap(mbedtls_pk_context *pk,
739 mbedtls_md_type_t md_alg,
740 const unsigned char *hash, size_t hash_len,
741 unsigned char *sig, size_t sig_size,
742 size_t *sig_len,
743 int (*f_rng)(void *, unsigned char *, size_t),
744 void *p_rng)
745{
746 ((void) f_rng);
747 ((void) p_rng);
748
749 return ecdsa_sign_psa(pk->priv_id, md_alg, hash, hash_len, sig, sig_size,
750 sig_len);
751}
752
753#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
754/* When PK_USE_PSA_EC_DATA is defined opaque and non-opaque keys end up
755 * using the same function. */
756#define ecdsa_sign_wrap ecdsa_opaque_sign_wrap
757#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
758static int ecdsa_sign_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
759 const unsigned char *hash, size_t hash_len,
760 unsigned char *sig, size_t sig_size, size_t *sig_len,
761 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
762{
763 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
764 mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
765 psa_status_t status;
766 mbedtls_ecp_keypair *ctx = pk->pk_ctx;
767 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
768 unsigned char buf[MBEDTLS_PSA_MAX_EC_KEY_PAIR_LENGTH];
769 size_t curve_bits;
770 psa_ecc_family_t curve =
771 mbedtls_ecc_group_to_psa(ctx->grp.id, &curve_bits);
772 size_t key_len = PSA_BITS_TO_BYTES(curve_bits);
773 psa_algorithm_t psa_hash = mbedtls_md_psa_alg_from_type(md_alg);
774 psa_algorithm_t psa_sig_md = MBEDTLS_PK_PSA_ALG_ECDSA_MAYBE_DET(psa_hash);
775 ((void) f_rng);
776 ((void) p_rng);
777
778 if (curve == 0) {
779 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
780 }
781
782 if (key_len > sizeof(buf)) {
783 return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
784 }
785 ret = mbedtls_mpi_write_binary(&ctx->d, buf, key_len);
786 if (ret != 0) {
787 goto cleanup;
788 }
789
790 psa_set_key_type(&attributes, PSA_KEY_TYPE_ECC_KEY_PAIR(curve));
791 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
792 psa_set_key_algorithm(&attributes, psa_sig_md);
793
794 status = psa_import_key(&attributes, buf, key_len, &key_id);
795 if (status != PSA_SUCCESS) {
796 ret = PSA_PK_TO_MBEDTLS_ERR(status);
797 goto cleanup;
798 }
799
800 ret = ecdsa_sign_psa(key_id, md_alg, hash, hash_len, sig, sig_size, sig_len);
801
802cleanup:
803 mbedtls_platform_zeroize(buf, sizeof(buf));
804 status = psa_destroy_key(key_id);
805 if (ret == 0 && status != PSA_SUCCESS) {
806 ret = PSA_PK_TO_MBEDTLS_ERR(status);
807 }
808
809 return ret;
810}
811#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
812#else /* MBEDTLS_USE_PSA_CRYPTO */
813static int ecdsa_sign_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
814 const unsigned char *hash, size_t hash_len,
815 unsigned char *sig, size_t sig_size, size_t *sig_len,
816 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
817{
818 return mbedtls_ecdsa_write_signature((mbedtls_ecdsa_context *) pk->pk_ctx,
819 md_alg, hash, hash_len,
820 sig, sig_size, sig_len,
821 f_rng, p_rng);
822}
823#endif /* MBEDTLS_USE_PSA_CRYPTO */
824#endif /* MBEDTLS_PK_CAN_ECDSA_SIGN */
825
826#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
827/* Forward declarations */
828static int ecdsa_verify_rs_wrap(mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
829 const unsigned char *hash, size_t hash_len,
830 const unsigned char *sig, size_t sig_len,
831 void *rs_ctx);
832
833static int ecdsa_sign_rs_wrap(mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
834 const unsigned char *hash, size_t hash_len,
835 unsigned char *sig, size_t sig_size, size_t *sig_len,
836 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
837 void *rs_ctx);
838
839/*
840 * Restart context for ECDSA operations with ECKEY context
841 *
842 * We need to store an actual ECDSA context, as we need to pass the same to
843 * the underlying ecdsa function, so we can't create it on the fly every time.
844 */
845typedef struct {
846 mbedtls_ecdsa_restart_ctx ecdsa_rs;
847 mbedtls_ecdsa_context ecdsa_ctx;
848} eckey_restart_ctx;
849
850static void *eckey_rs_alloc(void)
851{
852 eckey_restart_ctx *rs_ctx;
853
854 void *ctx = mbedtls_calloc(1, sizeof(eckey_restart_ctx));
855
856 if (ctx != NULL) {
857 rs_ctx = ctx;
858 mbedtls_ecdsa_restart_init(&rs_ctx->ecdsa_rs);
859 mbedtls_ecdsa_init(&rs_ctx->ecdsa_ctx);
860 }
861
862 return ctx;
863}
864
865static void eckey_rs_free(void *ctx)
866{
867 eckey_restart_ctx *rs_ctx;
868
869 if (ctx == NULL) {
870 return;
871 }
872
873 rs_ctx = ctx;
874 mbedtls_ecdsa_restart_free(&rs_ctx->ecdsa_rs);
875 mbedtls_ecdsa_free(&rs_ctx->ecdsa_ctx);
876
877 mbedtls_free(ctx);
878}
879
880static int eckey_verify_rs_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
881 const unsigned char *hash, size_t hash_len,
882 const unsigned char *sig, size_t sig_len,
883 void *rs_ctx)
884{
885 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
886 eckey_restart_ctx *rs = rs_ctx;
887
888 /* Should never happen */
889 if (rs == NULL) {
890 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
891 }
892
893 /* set up our own sub-context if needed (that is, on first run) */
894 if (rs->ecdsa_ctx.grp.pbits == 0) {
895 MBEDTLS_MPI_CHK(mbedtls_ecdsa_from_keypair(&rs->ecdsa_ctx, pk->pk_ctx));
896 }
897
898 MBEDTLS_MPI_CHK(ecdsa_verify_rs_wrap(pk,
899 md_alg, hash, hash_len,
900 sig, sig_len, &rs->ecdsa_rs));
901
902cleanup:
903 return ret;
904}
905
906static int eckey_sign_rs_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
907 const unsigned char *hash, size_t hash_len,
908 unsigned char *sig, size_t sig_size, size_t *sig_len,
909 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
910 void *rs_ctx)
911{
912 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
913 eckey_restart_ctx *rs = rs_ctx;
914
915 /* Should never happen */
916 if (rs == NULL) {
917 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
918 }
919
920 /* set up our own sub-context if needed (that is, on first run) */
921 if (rs->ecdsa_ctx.grp.pbits == 0) {
922 MBEDTLS_MPI_CHK(mbedtls_ecdsa_from_keypair(&rs->ecdsa_ctx, pk->pk_ctx));
923 }
924
925 MBEDTLS_MPI_CHK(ecdsa_sign_rs_wrap(pk, md_alg,
926 hash, hash_len, sig, sig_size, sig_len,
927 f_rng, p_rng, &rs->ecdsa_rs));
928
929cleanup:
930 return ret;
931}
932#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
933
934#if defined(MBEDTLS_USE_PSA_CRYPTO)
935#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
936static int eckey_check_pair_psa(mbedtls_pk_context *pub, mbedtls_pk_context *prv)
937{
938 psa_status_t status;
939 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
940 uint8_t prv_key_buf[MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH];
941 size_t prv_key_len;
942 mbedtls_svc_key_id_t key_id = prv->priv_id;
943
944 status = psa_export_public_key(key_id, prv_key_buf, sizeof(prv_key_buf),
945 &prv_key_len);
946 ret = PSA_PK_TO_MBEDTLS_ERR(status);
947 if (ret != 0) {
948 return ret;
949 }
950
951 if (memcmp(prv_key_buf, pub->pub_raw, pub->pub_raw_len) != 0) {
952 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
953 }
954
955 return 0;
956}
957#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
958static int eckey_check_pair_psa(mbedtls_pk_context *pub, mbedtls_pk_context *prv)
959{
960 psa_status_t status;
961 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
962 uint8_t prv_key_buf[MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH];
963 size_t prv_key_len;
964 psa_status_t destruction_status;
965 mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
966 psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
967 uint8_t pub_key_buf[MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH];
968 size_t pub_key_len;
969 size_t curve_bits;
970 const psa_ecc_family_t curve =
971 mbedtls_ecc_group_to_psa(mbedtls_pk_ec_ro(*prv)->grp.id, &curve_bits);
972 const size_t curve_bytes = PSA_BITS_TO_BYTES(curve_bits);
973
974 if (curve == 0) {
975 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
976 }
977
978 psa_set_key_type(&key_attr, PSA_KEY_TYPE_ECC_KEY_PAIR(curve));
979 psa_set_key_usage_flags(&key_attr, PSA_KEY_USAGE_EXPORT);
980
981 ret = mbedtls_mpi_write_binary(&mbedtls_pk_ec_ro(*prv)->d,
982 prv_key_buf, curve_bytes);
983 if (ret != 0) {
984 mbedtls_platform_zeroize(prv_key_buf, sizeof(prv_key_buf));
985 return ret;
986 }
987
988 status = psa_import_key(&key_attr, prv_key_buf, curve_bytes, &key_id);
989 mbedtls_platform_zeroize(prv_key_buf, sizeof(prv_key_buf));
990 ret = PSA_PK_TO_MBEDTLS_ERR(status);
991 if (ret != 0) {
992 return ret;
993 }
994
995 // From now on prv_key_buf is used to store the public key of prv.
996 status = psa_export_public_key(key_id, prv_key_buf, sizeof(prv_key_buf),
997 &prv_key_len);
998 ret = PSA_PK_TO_MBEDTLS_ERR(status);
999 destruction_status = psa_destroy_key(key_id);
1000 if (ret != 0) {
1001 return ret;
1002 } else if (destruction_status != PSA_SUCCESS) {
1003 return PSA_PK_TO_MBEDTLS_ERR(destruction_status);
1004 }
1005
1006 ret = mbedtls_ecp_point_write_binary(&mbedtls_pk_ec_rw(*pub)->grp,
1007 &mbedtls_pk_ec_rw(*pub)->Q,
1008 MBEDTLS_ECP_PF_UNCOMPRESSED,
1009 &pub_key_len, pub_key_buf,
1010 sizeof(pub_key_buf));
1011 if (ret != 0) {
1012 return ret;
1013 }
1014
1015 if (memcmp(prv_key_buf, pub_key_buf, curve_bytes) != 0) {
1016 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
1017 }
1018
1019 return 0;
1020}
1021#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
1022
1023static int eckey_check_pair_wrap(mbedtls_pk_context *pub, mbedtls_pk_context *prv,
1024 int (*f_rng)(void *, unsigned char *, size_t),
1025 void *p_rng)
1026{
1027 (void) f_rng;
1028 (void) p_rng;
1029 return eckey_check_pair_psa(pub, prv);
1030}
1031#else /* MBEDTLS_USE_PSA_CRYPTO */
1032static int eckey_check_pair_wrap(mbedtls_pk_context *pub, mbedtls_pk_context *prv,
1033 int (*f_rng)(void *, unsigned char *, size_t),
1034 void *p_rng)
1035{
1036 return mbedtls_ecp_check_pub_priv((const mbedtls_ecp_keypair *) pub->pk_ctx,
1037 (const mbedtls_ecp_keypair *) prv->pk_ctx,
1038 f_rng, p_rng);
1039}
1040#endif /* MBEDTLS_USE_PSA_CRYPTO */
1041
1042#if defined(MBEDTLS_USE_PSA_CRYPTO)
1043#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
1044/* When PK_USE_PSA_EC_DATA is defined opaque and non-opaque keys end up
1045 * using the same function. */
1046#define ecdsa_opaque_check_pair_wrap eckey_check_pair_wrap
1047#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
1048static int ecdsa_opaque_check_pair_wrap(mbedtls_pk_context *pub,
1049 mbedtls_pk_context *prv,
1050 int (*f_rng)(void *, unsigned char *, size_t),
1051 void *p_rng)
1052{
1053 psa_status_t status;
1054 uint8_t exp_pub_key[MBEDTLS_PK_MAX_EC_PUBKEY_RAW_LEN];
1055 size_t exp_pub_key_len = 0;
1056 uint8_t pub_key[MBEDTLS_PK_MAX_EC_PUBKEY_RAW_LEN];
1057 size_t pub_key_len = 0;
1058 int ret;
1059 (void) f_rng;
1060 (void) p_rng;
1061
1062 status = psa_export_public_key(prv->priv_id, exp_pub_key, sizeof(exp_pub_key),
1063 &exp_pub_key_len);
1064 if (status != PSA_SUCCESS) {
1065 ret = psa_pk_status_to_mbedtls(status);
1066 return ret;
1067 }
1068 ret = mbedtls_ecp_point_write_binary(&(mbedtls_pk_ec_ro(*pub)->grp),
1069 &(mbedtls_pk_ec_ro(*pub)->Q),
1070 MBEDTLS_ECP_PF_UNCOMPRESSED,
1071 &pub_key_len, pub_key, sizeof(pub_key));
1072 if (ret != 0) {
1073 return ret;
1074 }
1075 if ((exp_pub_key_len != pub_key_len) ||
1076 memcmp(exp_pub_key, pub_key, exp_pub_key_len)) {
1077 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
1078 }
1079 return 0;
1080}
1081#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
1082#endif /* MBEDTLS_USE_PSA_CRYPTO */
1083
1084#if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
1085static void *eckey_alloc_wrap(void)
1086{
1087 void *ctx = mbedtls_calloc(1, sizeof(mbedtls_ecp_keypair));
1088
1089 if (ctx != NULL) {
1090 mbedtls_ecp_keypair_init(ctx);
1091 }
1092
1093 return ctx;
1094}
1095
1096static void eckey_free_wrap(void *ctx)
1097{
1098 mbedtls_ecp_keypair_free((mbedtls_ecp_keypair *) ctx);
1099 mbedtls_free(ctx);
1100}
1101#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
1102
1103static void eckey_debug(mbedtls_pk_context *pk, mbedtls_pk_debug_item *items)
1104{
1105#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
1106 items->type = MBEDTLS_PK_DEBUG_PSA_EC;
1107 items->name = "eckey.Q";
1108 items->value = pk;
1109#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
1110 mbedtls_ecp_keypair *ecp = (mbedtls_ecp_keypair *) pk->pk_ctx;
1111 items->type = MBEDTLS_PK_DEBUG_ECP;
1112 items->name = "eckey.Q";
1113 items->value = &(ecp->Q);
1114#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
1115}
1116
1117const mbedtls_pk_info_t mbedtls_eckey_info = {
1118 .type = MBEDTLS_PK_ECKEY,
1119 .name = "EC",
1120 .get_bitlen = eckey_get_bitlen,
1121 .can_do = eckey_can_do,
1122#if defined(MBEDTLS_PK_CAN_ECDSA_VERIFY)
1123 .verify_func = ecdsa_verify_wrap, /* Compatible key structures */
1124#else /* MBEDTLS_PK_CAN_ECDSA_VERIFY */
1125 .verify_func = NULL,
1126#endif /* MBEDTLS_PK_CAN_ECDSA_VERIFY */
1127#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
1128 .sign_func = ecdsa_sign_wrap, /* Compatible key structures */
1129#else /* MBEDTLS_PK_CAN_ECDSA_VERIFY */
1130 .sign_func = NULL,
1131#endif /* MBEDTLS_PK_CAN_ECDSA_VERIFY */
1132#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1133 .verify_rs_func = eckey_verify_rs_wrap,
1134 .sign_rs_func = eckey_sign_rs_wrap,
1135 .rs_alloc_func = eckey_rs_alloc,
1136 .rs_free_func = eckey_rs_free,
1137#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
1138 .decrypt_func = NULL,
1139 .encrypt_func = NULL,
1140 .check_pair_func = eckey_check_pair_wrap,
1141#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
1142 .ctx_alloc_func = NULL,
1143 .ctx_free_func = NULL,
1144#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
1145 .ctx_alloc_func = eckey_alloc_wrap,
1146 .ctx_free_func = eckey_free_wrap,
1147#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
1148 .debug_func = eckey_debug,
1149};
1150
1151/*
1152 * EC key restricted to ECDH
1153 */
1154static int eckeydh_can_do(mbedtls_pk_type_t type)
1155{
1156 return type == MBEDTLS_PK_ECKEY ||
1157 type == MBEDTLS_PK_ECKEY_DH;
1158}
1159
1160const mbedtls_pk_info_t mbedtls_eckeydh_info = {
1161 .type = MBEDTLS_PK_ECKEY_DH,
1162 .name = "EC_DH",
1163 .get_bitlen = eckey_get_bitlen, /* Same underlying key structure */
1164 .can_do = eckeydh_can_do,
1165 .verify_func = NULL,
1166 .sign_func = NULL,
1167#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1168 .verify_rs_func = NULL,
1169 .sign_rs_func = NULL,
1170#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
1171 .decrypt_func = NULL,
1172 .encrypt_func = NULL,
1173 .check_pair_func = eckey_check_pair_wrap,
1174#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
1175 .ctx_alloc_func = NULL,
1176 .ctx_free_func = NULL,
1177#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
1178 .ctx_alloc_func = eckey_alloc_wrap, /* Same underlying key structure */
1179 .ctx_free_func = eckey_free_wrap, /* Same underlying key structure */
1180#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
1181 .debug_func = eckey_debug, /* Same underlying key structure */
1182};
1183
1184#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
1185static int ecdsa_can_do(mbedtls_pk_type_t type)
1186{
1187 return type == MBEDTLS_PK_ECDSA;
1188}
1189
1190#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1191static int ecdsa_verify_rs_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
1192 const unsigned char *hash, size_t hash_len,
1193 const unsigned char *sig, size_t sig_len,
1194 void *rs_ctx)
1195{
1196 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1197 ((void) md_alg);
1198
1199 ret = mbedtls_ecdsa_read_signature_restartable(
1200 (mbedtls_ecdsa_context *) pk->pk_ctx,
1201 hash, hash_len, sig, sig_len,
1202 (mbedtls_ecdsa_restart_ctx *) rs_ctx);
1203
1204 if (ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) {
1205 return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH;
1206 }
1207
1208 return ret;
1209}
1210
1211static int ecdsa_sign_rs_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
1212 const unsigned char *hash, size_t hash_len,
1213 unsigned char *sig, size_t sig_size, size_t *sig_len,
1214 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
1215 void *rs_ctx)
1216{
1217 return mbedtls_ecdsa_write_signature_restartable(
1218 (mbedtls_ecdsa_context *) pk->pk_ctx,
1219 md_alg, hash, hash_len, sig, sig_size, sig_len, f_rng, p_rng,
1220 (mbedtls_ecdsa_restart_ctx *) rs_ctx);
1221
1222}
1223
1224static void *ecdsa_rs_alloc(void)
1225{
1226 void *ctx = mbedtls_calloc(1, sizeof(mbedtls_ecdsa_restart_ctx));
1227
1228 if (ctx != NULL) {
1229 mbedtls_ecdsa_restart_init(ctx);
1230 }
1231
1232 return ctx;
1233}
1234
1235static void ecdsa_rs_free(void *ctx)
1236{
1237 mbedtls_ecdsa_restart_free(ctx);
1238 mbedtls_free(ctx);
1239}
1240#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
1241
1242const mbedtls_pk_info_t mbedtls_ecdsa_info = {
1243 .type = MBEDTLS_PK_ECDSA,
1244 .name = "ECDSA",
1245 .get_bitlen = eckey_get_bitlen, /* Compatible key structures */
1246 .can_do = ecdsa_can_do,
1247#if defined(MBEDTLS_PK_CAN_ECDSA_VERIFY)
1248 .verify_func = ecdsa_verify_wrap, /* Compatible key structures */
1249#else /* MBEDTLS_PK_CAN_ECDSA_VERIFY */
1250 .verify_func = NULL,
1251#endif /* MBEDTLS_PK_CAN_ECDSA_VERIFY */
1252#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
1253 .sign_func = ecdsa_sign_wrap, /* Compatible key structures */
1254#else /* MBEDTLS_PK_CAN_ECDSA_SIGN */
1255 .sign_func = NULL,
1256#endif /* MBEDTLS_PK_CAN_ECDSA_SIGN */
1257#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1258 .verify_rs_func = ecdsa_verify_rs_wrap,
1259 .sign_rs_func = ecdsa_sign_rs_wrap,
1260 .rs_alloc_func = ecdsa_rs_alloc,
1261 .rs_free_func = ecdsa_rs_free,
1262#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
1263 .decrypt_func = NULL,
1264 .encrypt_func = NULL,
1265 .check_pair_func = eckey_check_pair_wrap, /* Compatible key structures */
1266#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
1267 .ctx_alloc_func = NULL,
1268 .ctx_free_func = NULL,
1269#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
1270 .ctx_alloc_func = eckey_alloc_wrap, /* Compatible key structures */
1271 .ctx_free_func = eckey_free_wrap, /* Compatible key structures */
1272#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
1273 .debug_func = eckey_debug, /* Compatible key structures */
1274};
1275#endif /* MBEDTLS_PK_CAN_ECDSA_SOME */
1276#endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
1277
1278#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
1279/*
1280 * Support for alternative RSA-private implementations
1281 */
1282
1283static int rsa_alt_can_do(mbedtls_pk_type_t type)
1284{
1285 return type == MBEDTLS_PK_RSA;
1286}
1287
1288static size_t rsa_alt_get_bitlen(mbedtls_pk_context *pk)
1289{
1290 const mbedtls_rsa_alt_context *rsa_alt = pk->pk_ctx;
1291
1292 return 8 * rsa_alt->key_len_func(rsa_alt->key);
1293}
1294
1295static int rsa_alt_sign_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
1296 const unsigned char *hash, size_t hash_len,
1297 unsigned char *sig, size_t sig_size, size_t *sig_len,
1298 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
1299{
1300 mbedtls_rsa_alt_context *rsa_alt = pk->pk_ctx;
1301
1302#if SIZE_MAX > UINT_MAX
1303 if (UINT_MAX < hash_len) {
1304 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
1305 }
1306#endif
1307
1308 *sig_len = rsa_alt->key_len_func(rsa_alt->key);
1309 if (*sig_len > MBEDTLS_PK_SIGNATURE_MAX_SIZE) {
1310 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
1311 }
1312 if (*sig_len > sig_size) {
1313 return MBEDTLS_ERR_PK_BUFFER_TOO_SMALL;
1314 }
1315
1316 return rsa_alt->sign_func(rsa_alt->key, f_rng, p_rng,
1317 md_alg, (unsigned int) hash_len, hash, sig);
1318}
1319
1320static int rsa_alt_decrypt_wrap(mbedtls_pk_context *pk,
1321 const unsigned char *input, size_t ilen,
1322 unsigned char *output, size_t *olen, size_t osize,
1323 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
1324{
1325 mbedtls_rsa_alt_context *rsa_alt = pk->pk_ctx;
1326
1327 ((void) f_rng);
1328 ((void) p_rng);
1329
1330 if (ilen != rsa_alt->key_len_func(rsa_alt->key)) {
1331 return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
1332 }
1333
1334 return rsa_alt->decrypt_func(rsa_alt->key,
1335 olen, input, output, osize);
1336}
1337
1338#if defined(MBEDTLS_RSA_C)
1339static int rsa_alt_check_pair(mbedtls_pk_context *pub, mbedtls_pk_context *prv,
1340 int (*f_rng)(void *, unsigned char *, size_t),
1341 void *p_rng)
1342{
1343 unsigned char hash[32];
1344 size_t sig_len = 0;
1345 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1346
1347 if (rsa_alt_get_bitlen(prv) != rsa_get_bitlen(pub)) {
1348 return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED;
1349 }
1350
1351 size_t sig_size = (rsa_get_bitlen(pub) + 7) / 8;
1352 unsigned char *sig = mbedtls_calloc(1, sig_size);
1353 if (sig == NULL) {
1354 return MBEDTLS_ERR_PK_ALLOC_FAILED;
1355 }
1356
1357 memset(hash, 0x2a, sizeof(hash));
1358
1359 if ((ret = rsa_alt_sign_wrap(prv, MBEDTLS_MD_NONE,
1360 hash, sizeof(hash),
1361 sig, sig_size, &sig_len,
1362 f_rng, p_rng)) != 0) {
1363 goto cleanup;
1364 }
1365
1366 if (rsa_verify_wrap(pub, MBEDTLS_MD_NONE,
1367 hash, sizeof(hash), sig, sig_len) != 0) {
1368 ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED;
1369 }
1370
1371cleanup:
1372 mbedtls_zeroize_and_free(sig, sig_size);
1373 return ret;
1374}
1375#endif /* MBEDTLS_RSA_C */
1376
1377static void *rsa_alt_alloc_wrap(void)
1378{
1379 void *ctx = mbedtls_calloc(1, sizeof(mbedtls_rsa_alt_context));
1380
1381 if (ctx != NULL) {
1382 memset(ctx, 0, sizeof(mbedtls_rsa_alt_context));
1383 }
1384
1385 return ctx;
1386}
1387
1388static void rsa_alt_free_wrap(void *ctx)
1389{
1390 mbedtls_zeroize_and_free(ctx, sizeof(mbedtls_rsa_alt_context));
1391}
1392
1393const mbedtls_pk_info_t mbedtls_rsa_alt_info = {
1394 .type = MBEDTLS_PK_RSA_ALT,
1395 .name = "RSA-alt",
1396 .get_bitlen = rsa_alt_get_bitlen,
1397 .can_do = rsa_alt_can_do,
1398 .verify_func = NULL,
1399 .sign_func = rsa_alt_sign_wrap,
1400#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1401 .verify_rs_func = NULL,
1402 .sign_rs_func = NULL,
1403 .rs_alloc_func = NULL,
1404 .rs_free_func = NULL,
1405#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
1406 .decrypt_func = rsa_alt_decrypt_wrap,
1407 .encrypt_func = NULL,
1408#if defined(MBEDTLS_RSA_C)
1409 .check_pair_func = rsa_alt_check_pair,
1410#else
1411 .check_pair_func = NULL,
1412#endif
1413 .ctx_alloc_func = rsa_alt_alloc_wrap,
1414 .ctx_free_func = rsa_alt_free_wrap,
1415 .debug_func = NULL,
1416};
1417#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */
1418
1419#if defined(MBEDTLS_USE_PSA_CRYPTO)
1420static size_t opaque_get_bitlen(mbedtls_pk_context *pk)
1421{
1422 size_t bits;
1423 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1424
1425 if (PSA_SUCCESS != psa_get_key_attributes(pk->priv_id, &attributes)) {
1426 return 0;
1427 }
1428
1429 bits = psa_get_key_bits(&attributes);
1430 psa_reset_key_attributes(&attributes);
1431 return bits;
1432}
1433
1434#if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
1435static int ecdsa_opaque_can_do(mbedtls_pk_type_t type)
1436{
1437 return type == MBEDTLS_PK_ECKEY ||
1438 type == MBEDTLS_PK_ECDSA;
1439}
1440
1441const mbedtls_pk_info_t mbedtls_ecdsa_opaque_info = {
1442 .type = MBEDTLS_PK_OPAQUE,
1443 .name = "Opaque",
1444 .get_bitlen = opaque_get_bitlen,
1445 .can_do = ecdsa_opaque_can_do,
1446#if defined(MBEDTLS_PK_CAN_ECDSA_VERIFY)
1447 .verify_func = ecdsa_opaque_verify_wrap,
1448#else /* MBEDTLS_PK_CAN_ECDSA_VERIFY */
1449 .verify_func = NULL,
1450#endif /* MBEDTLS_PK_CAN_ECDSA_VERIFY */
1451#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
1452 .sign_func = ecdsa_opaque_sign_wrap,
1453#else /* MBEDTLS_PK_CAN_ECDSA_SIGN */
1454 .sign_func = NULL,
1455#endif /* MBEDTLS_PK_CAN_ECDSA_SIGN */
1456#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1457 .verify_rs_func = NULL,
1458 .sign_rs_func = NULL,
1459 .rs_alloc_func = NULL,
1460 .rs_free_func = NULL,
1461#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
1462 .decrypt_func = NULL,
1463 .encrypt_func = NULL,
1464 .check_pair_func = ecdsa_opaque_check_pair_wrap,
1465 .ctx_alloc_func = NULL,
1466 .ctx_free_func = NULL,
1467 .debug_func = NULL,
1468};
1469#endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
1470
1471static int rsa_opaque_can_do(mbedtls_pk_type_t type)
1472{
1473 return type == MBEDTLS_PK_RSA ||
1474 type == MBEDTLS_PK_RSASSA_PSS;
1475}
1476
1477#if defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC)
1478static int rsa_opaque_decrypt(mbedtls_pk_context *pk,
1479 const unsigned char *input, size_t ilen,
1480 unsigned char *output, size_t *olen, size_t osize,
1481 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
1482{
1483 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1484 psa_algorithm_t alg;
1485 psa_key_type_t type;
1486 psa_status_t status;
1487
1488 /* PSA has its own RNG */
1489 (void) f_rng;
1490 (void) p_rng;
1491
1492 status = psa_get_key_attributes(pk->priv_id, &attributes);
1493 if (status != PSA_SUCCESS) {
1494 return PSA_PK_TO_MBEDTLS_ERR(status);
1495 }
1496
1497 type = psa_get_key_type(&attributes);
1498 alg = psa_get_key_algorithm(&attributes);
1499 psa_reset_key_attributes(&attributes);
1500
1501 if (!PSA_KEY_TYPE_IS_RSA(type)) {
1502 return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
1503 }
1504
1505 status = psa_asymmetric_decrypt(pk->priv_id, alg, input, ilen, NULL, 0, output, osize, olen);
1506 if (status != PSA_SUCCESS) {
1507 return PSA_PK_RSA_TO_MBEDTLS_ERR(status);
1508 }
1509
1510 return 0;
1511}
1512#endif /* PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC */
1513
1514static int rsa_opaque_sign_wrap(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
1515 const unsigned char *hash, size_t hash_len,
1516 unsigned char *sig, size_t sig_size, size_t *sig_len,
1517 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
1518{
1519#if defined(MBEDTLS_RSA_C)
1520 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1521 psa_algorithm_t alg;
1522 psa_key_type_t type;
1523 psa_status_t status;
1524
1525 /* PSA has its own RNG */
1526 (void) f_rng;
1527 (void) p_rng;
1528
1529 status = psa_get_key_attributes(pk->priv_id, &attributes);
1530 if (status != PSA_SUCCESS) {
1531 return PSA_PK_TO_MBEDTLS_ERR(status);
1532 }
1533
1534 type = psa_get_key_type(&attributes);
1535 alg = psa_get_key_algorithm(&attributes);
1536 psa_reset_key_attributes(&attributes);
1537
1538 if (PSA_KEY_TYPE_IS_RSA(type)) {
1539 alg = (alg & ~PSA_ALG_HASH_MASK) | mbedtls_md_psa_alg_from_type(md_alg);
1540 } else {
1541 return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
1542 }
1543
1544 status = psa_sign_hash(pk->priv_id, alg, hash, hash_len, sig, sig_size, sig_len);
1545 if (status != PSA_SUCCESS) {
1546 if (PSA_KEY_TYPE_IS_RSA(type)) {
1547 return PSA_PK_RSA_TO_MBEDTLS_ERR(status);
1548 } else {
1549 return PSA_PK_TO_MBEDTLS_ERR(status);
1550 }
1551 }
1552
1553 return 0;
1554#else /* !MBEDTLS_RSA_C */
1555 ((void) pk);
1556 ((void) md_alg);
1557 ((void) hash);
1558 ((void) hash_len);
1559 ((void) sig);
1560 ((void) sig_size);
1561 ((void) sig_len);
1562 ((void) f_rng);
1563 ((void) p_rng);
1564 return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
1565#endif /* !MBEDTLS_RSA_C */
1566}
1567
1568const mbedtls_pk_info_t mbedtls_rsa_opaque_info = {
1569 .type = MBEDTLS_PK_OPAQUE,
1570 .name = "Opaque",
1571 .get_bitlen = opaque_get_bitlen,
1572 .can_do = rsa_opaque_can_do,
1573 .verify_func = NULL,
1574 .sign_func = rsa_opaque_sign_wrap,
1575#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1576 .verify_rs_func = NULL,
1577 .sign_rs_func = NULL,
1578 .rs_alloc_func = NULL,
1579 .rs_free_func = NULL,
1580#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
1581#if defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC)
1582 .decrypt_func = rsa_opaque_decrypt,
1583#else /* PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC */
1584 .decrypt_func = NULL,
1585#endif /* PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC */
1586 .encrypt_func = NULL,
1587 .check_pair_func = NULL,
1588 .ctx_alloc_func = NULL,
1589 .ctx_free_func = NULL,
1590 .debug_func = NULL,
1591};
1592
1593#endif /* MBEDTLS_USE_PSA_CRYPTO */
1594
1595#endif /* MBEDTLS_PK_C */
1596