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