Coverage Report

Created: 2026-10-17 06:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/mbedtls-3.6.6/library/pk_wrap.c
Line
Count
Source
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
static int rsa_can_do(mbedtls_pk_type_t type)
53
0
{
54
0
    return type == MBEDTLS_PK_RSA ||
55
0
           type == MBEDTLS_PK_RSASSA_PSS;
56
0
}
57
58
static size_t rsa_get_bitlen(mbedtls_pk_context *pk)
59
0
{
60
0
    const mbedtls_rsa_context *rsa = (const mbedtls_rsa_context *) pk->pk_ctx;
61
0
    return mbedtls_rsa_get_bitlen(rsa);
62
0
}
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[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
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
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
0
{
134
0
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
135
0
    mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
136
0
    size_t rsa_len = mbedtls_rsa_get_len(rsa);
137
138
0
#if SIZE_MAX > UINT_MAX
139
0
    if (md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len) {
140
0
        return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
141
0
    }
142
0
#endif
143
144
0
    if (sig_len < rsa_len) {
145
0
        return MBEDTLS_ERR_RSA_VERIFY_FAILED;
146
0
    }
147
148
0
    if ((ret = mbedtls_rsa_pkcs1_verify(rsa, md_alg,
149
0
                                        (unsigned int) hash_len,
150
0
                                        hash, sig)) != 0) {
151
0
        return ret;
152
0
    }
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
0
    if (sig_len > rsa_len) {
160
0
        return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH;
161
0
    }
162
163
0
    return 0;
164
0
}
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
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
0
{
259
0
    mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
260
261
0
#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
0
    }
265
0
#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
0
    }
271
272
0
    return mbedtls_rsa_pkcs1_sign(rsa, f_rng, p_rng,
273
0
                                  md_alg, (unsigned int) hash_len,
274
0
                                  hash, sig);
275
0
}
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
    ((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
339
cleanup:
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 */
349
static 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
0
{
354
0
    mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
355
356
0
    if (ilen != mbedtls_rsa_get_len(rsa)) {
357
0
        return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
358
0
    }
359
360
0
    return mbedtls_rsa_pkcs1_decrypt(rsa, f_rng, p_rng,
361
0
                                     olen, input, output, osize);
362
0
}
363
#endif /* MBEDTLS_USE_PSA_CRYPTO */
364
365
#if defined(MBEDTLS_USE_PSA_CRYPTO)
366
static 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
422
cleanup:
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 */
431
static 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
0
{
436
0
    mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
437
0
    *olen = mbedtls_rsa_get_len(rsa);
438
439
0
    if (*olen > osize) {
440
0
        return MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE;
441
0
    }
442
443
0
    return mbedtls_rsa_pkcs1_encrypt(rsa, f_rng, p_rng,
444
0
                                     ilen, input, output);
445
0
}
446
#endif /* MBEDTLS_USE_PSA_CRYPTO */
447
448
static 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
0
{
452
0
    (void) f_rng;
453
0
    (void) p_rng;
454
0
    return mbedtls_rsa_check_pub_priv((const mbedtls_rsa_context *) pub->pk_ctx,
455
0
                                      (const mbedtls_rsa_context *) prv->pk_ctx);
456
0
}
457
458
static void *rsa_alloc_wrap(void)
459
0
{
460
0
    void *ctx = mbedtls_calloc(1, sizeof(mbedtls_rsa_context));
461
462
0
    if (ctx != NULL) {
463
0
        mbedtls_rsa_init((mbedtls_rsa_context *) ctx);
464
0
    }
465
466
0
    return ctx;
467
0
}
468
469
static void rsa_free_wrap(void *ctx)
470
0
{
471
0
    mbedtls_rsa_free((mbedtls_rsa_context *) ctx);
472
0
    mbedtls_free(ctx);
473
0
}
474
475
static void rsa_debug(mbedtls_pk_context *pk, mbedtls_pk_debug_item *items)
476
0
{
477
#if defined(MBEDTLS_RSA_ALT)
478
    /* Not supported */
479
    (void) pk;
480
    (void) items;
481
#else
482
0
    mbedtls_rsa_context *rsa = (mbedtls_rsa_context *) pk->pk_ctx;
483
484
0
    items->type = MBEDTLS_PK_DEBUG_MPI;
485
0
    items->name = "rsa.N";
486
0
    items->value = &(rsa->N);
487
488
0
    items++;
489
490
0
    items->type = MBEDTLS_PK_DEBUG_MPI;
491
0
    items->name = "rsa.E";
492
0
    items->value = &(rsa->E);
493
0
#endif
494
0
}
495
496
const 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
 */
522
static int eckey_can_do(mbedtls_pk_type_t type)
523
0
{
524
0
    return type == MBEDTLS_PK_ECKEY ||
525
0
           type == MBEDTLS_PK_ECKEY_DH ||
526
0
           type == MBEDTLS_PK_ECDSA;
527
0
}
528
529
static size_t eckey_get_bitlen(mbedtls_pk_context *pk)
530
0
{
531
#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
532
    return pk->ec_bits;
533
#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
534
0
    mbedtls_ecp_keypair *ecp = (mbedtls_ecp_keypair *) pk->pk_ctx;
535
0
    return ecp->grp.pbits;
536
0
#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
537
0
}
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. */
542
static 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
597
cleanup:
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
606
static 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)
637
static 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 */
650
static 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 */
675
static 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
0
{
679
0
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
680
0
    ((void) md_alg);
681
682
0
    ret = mbedtls_ecdsa_read_signature((mbedtls_ecdsa_context *) pk->pk_ctx,
683
0
                                       hash, hash_len, sig, sig_len);
684
685
0
    if (ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) {
686
0
        return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH;
687
0
    }
688
689
0
    return ret;
690
0
}
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
 */
700
static 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
732
done:
733
    ret = mbedtls_ecdsa_raw_to_der(key_bits, sig, *sig_len, sig, sig_size, sig_len);
734
735
    return ret;
736
}
737
738
static 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 */
758
static 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
802
cleanup:
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 */
813
static 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
0
{
818
0
    return mbedtls_ecdsa_write_signature((mbedtls_ecdsa_context *) pk->pk_ctx,
819
0
                                         md_alg, hash, hash_len,
820
0
                                         sig, sig_size, sig_len,
821
0
                                         f_rng, p_rng);
822
0
}
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 */
828
static 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
833
static 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
 */
845
typedef struct {
846
    mbedtls_ecdsa_restart_ctx ecdsa_rs;
847
    mbedtls_ecdsa_context ecdsa_ctx;
848
} eckey_restart_ctx;
849
850
static 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
865
static 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
880
static 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
902
cleanup:
903
    return ret;
904
}
905
906
static 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
929
cleanup:
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)
936
static 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 */
958
static 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
1023
static 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 */
1032
static 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
0
{
1036
0
    return mbedtls_ecp_check_pub_priv((const mbedtls_ecp_keypair *) pub->pk_ctx,
1037
0
                                      (const mbedtls_ecp_keypair *) prv->pk_ctx,
1038
0
                                      f_rng, p_rng);
1039
0
}
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 */
1048
static 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)
1085
static void *eckey_alloc_wrap(void)
1086
0
{
1087
0
    void *ctx = mbedtls_calloc(1, sizeof(mbedtls_ecp_keypair));
1088
1089
0
    if (ctx != NULL) {
1090
0
        mbedtls_ecp_keypair_init(ctx);
1091
0
    }
1092
1093
0
    return ctx;
1094
0
}
1095
1096
static void eckey_free_wrap(void *ctx)
1097
0
{
1098
0
    mbedtls_ecp_keypair_free((mbedtls_ecp_keypair *) ctx);
1099
0
    mbedtls_free(ctx);
1100
0
}
1101
#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
1102
1103
static void eckey_debug(mbedtls_pk_context *pk, mbedtls_pk_debug_item *items)
1104
0
{
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
0
    mbedtls_ecp_keypair *ecp = (mbedtls_ecp_keypair *) pk->pk_ctx;
1111
0
    items->type = MBEDTLS_PK_DEBUG_ECP;
1112
0
    items->name = "eckey.Q";
1113
0
    items->value = &(ecp->Q);
1114
0
#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
1115
0
}
1116
1117
const 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
 */
1154
static int eckeydh_can_do(mbedtls_pk_type_t type)
1155
0
{
1156
0
    return type == MBEDTLS_PK_ECKEY ||
1157
0
           type == MBEDTLS_PK_ECKEY_DH;
1158
0
}
1159
1160
const 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)
1185
static int ecdsa_can_do(mbedtls_pk_type_t type)
1186
0
{
1187
0
    return type == MBEDTLS_PK_ECDSA;
1188
0
}
1189
1190
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1191
static 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
1211
static 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
1224
static 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
1235
static 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
1242
const 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
1283
static int rsa_alt_can_do(mbedtls_pk_type_t type)
1284
0
{
1285
0
    return type == MBEDTLS_PK_RSA;
1286
0
}
1287
1288
static size_t rsa_alt_get_bitlen(mbedtls_pk_context *pk)
1289
0
{
1290
0
    const mbedtls_rsa_alt_context *rsa_alt = pk->pk_ctx;
1291
1292
0
    return 8 * rsa_alt->key_len_func(rsa_alt->key);
1293
0
}
1294
1295
static 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
0
{
1300
0
    mbedtls_rsa_alt_context *rsa_alt = pk->pk_ctx;
1301
1302
0
#if SIZE_MAX > UINT_MAX
1303
0
    if (UINT_MAX < hash_len) {
1304
0
        return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
1305
0
    }
1306
0
#endif
1307
1308
0
    *sig_len = rsa_alt->key_len_func(rsa_alt->key);
1309
0
    if (*sig_len > MBEDTLS_PK_SIGNATURE_MAX_SIZE) {
1310
0
        return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
1311
0
    }
1312
0
    if (*sig_len > sig_size) {
1313
0
        return MBEDTLS_ERR_PK_BUFFER_TOO_SMALL;
1314
0
    }
1315
1316
0
    return rsa_alt->sign_func(rsa_alt->key, f_rng, p_rng,
1317
0
                              md_alg, (unsigned int) hash_len, hash, sig);
1318
0
}
1319
1320
static 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
0
{
1325
0
    mbedtls_rsa_alt_context *rsa_alt = pk->pk_ctx;
1326
1327
0
    ((void) f_rng);
1328
0
    ((void) p_rng);
1329
1330
0
    if (ilen != rsa_alt->key_len_func(rsa_alt->key)) {
1331
0
        return MBEDTLS_ERR_RSA_BAD_INPUT_DATA;
1332
0
    }
1333
1334
0
    return rsa_alt->decrypt_func(rsa_alt->key,
1335
0
                                 olen, input, output, osize);
1336
0
}
1337
1338
#if defined(MBEDTLS_RSA_C)
1339
static 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
0
{
1343
0
    unsigned char hash[32];
1344
0
    size_t sig_len = 0;
1345
0
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1346
1347
0
    if (rsa_alt_get_bitlen(prv) != rsa_get_bitlen(pub)) {
1348
0
        return MBEDTLS_ERR_RSA_KEY_CHECK_FAILED;
1349
0
    }
1350
1351
0
    size_t sig_size = (rsa_get_bitlen(pub) + 7) / 8;
1352
0
    unsigned char *sig = mbedtls_calloc(1, sig_size);
1353
0
    if (sig == NULL) {
1354
0
        return MBEDTLS_ERR_PK_ALLOC_FAILED;
1355
0
    }
1356
1357
0
    memset(hash, 0x2a, sizeof(hash));
1358
1359
0
    if ((ret = rsa_alt_sign_wrap(prv, MBEDTLS_MD_NONE,
1360
0
                                 hash, sizeof(hash),
1361
0
                                 sig, sig_size, &sig_len,
1362
0
                                 f_rng, p_rng)) != 0) {
1363
0
        goto cleanup;
1364
0
    }
1365
1366
0
    if (rsa_verify_wrap(pub, MBEDTLS_MD_NONE,
1367
0
                        hash, sizeof(hash), sig, sig_len) != 0) {
1368
0
        ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED;
1369
0
    }
1370
1371
0
cleanup:
1372
0
    mbedtls_zeroize_and_free(sig, sig_size);
1373
0
    return ret;
1374
0
}
1375
#endif /* MBEDTLS_RSA_C */
1376
1377
static void *rsa_alt_alloc_wrap(void)
1378
0
{
1379
0
    void *ctx = mbedtls_calloc(1, sizeof(mbedtls_rsa_alt_context));
1380
1381
0
    if (ctx != NULL) {
1382
0
        memset(ctx, 0, sizeof(mbedtls_rsa_alt_context));
1383
0
    }
1384
1385
0
    return ctx;
1386
0
}
1387
1388
static void rsa_alt_free_wrap(void *ctx)
1389
0
{
1390
0
    mbedtls_zeroize_and_free(ctx, sizeof(mbedtls_rsa_alt_context));
1391
0
}
1392
1393
const 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)
1420
static 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)
1435
static int ecdsa_opaque_can_do(mbedtls_pk_type_t type)
1436
{
1437
    return type == MBEDTLS_PK_ECKEY ||
1438
           type == MBEDTLS_PK_ECDSA;
1439
}
1440
1441
const 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
1471
static 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)
1478
static 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
1514
static 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
1568
const 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 */