Coverage Report

Created: 2026-05-14 06:36

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