1
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
37
39
40
43
50
51
54
66
67
68
94
95
98
99
100
101
102
106
110
111
112
116
118
119
120
121
124
125
126
127
130
131
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
155
156
159
160
161
162
163
166
167
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
196
197
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
217
228
229
232
233
234
235
236
239
240
243
244
247
248
249
250
251
252
253
254
255
256
257
258
259
260
263
264
265
268
269
272
273
274
275
276
277
278
279
282
283
284
285
286
287
288
289
290
291
292
293
297
298
299
300
301
302
303
304
305
308
309
310
311
312
315
316
317
318
319
320
321
322
325
326
327
328
329
330
333
334
335
340
341
344
345
346
347
348
349
350
351
352
353
354
357
358
361
362
363
364
365
366
367
368
372
373
376
377
378
379
382
383
384
385
386
387
388
389
392
393
396
397
398
399
400
401
402
403
404
407
408
409
410
411
414
415
416
417
418
419
420
421
422
423
424
425
426
430
431
432
433
434
435
436
437
438
441
442
443
444
445
446
449
450
451
452
453
454
455
456
459
460
461
462
463
464
467
468
469
470
475
476
479
480
481
482
483
484
485
486
487
488
489
492
493
496
497
498
499
500
501
504
505
506
507
508
509
510
511
512
513
514
517
518
521
522
523
524
525
526
529
530
531
532
533
534
538
539
542
543
552
553
554
555
556
559
569
570
573
574
575
576
579
580
583
584
585
586
587
588
591
599
600
603
611
612
613
614
615
616
617
618
619
620
621
622
623
624
628
629
630
631
632
633
634
635
636
637
638
639
640
643
644
645
646
649
650
651
652
653
654
655
656
657
658
659
660
661
662
665
666
667
668
669
670
671
672
673
674
/* ... */
#include "common.h"
#if defined(MBEDTLS_PK_C)
#include "mbedtls/pk.h"
#include "mbedtls/pk_internal.h"
#include "mbedtls/platform_util.h"
#include "mbedtls/error.h"
#if defined(MBEDTLS_RSA_C)
#include "mbedtls/rsa.h"
#endif
#if defined(MBEDTLS_ECP_C)
#include "mbedtls/ecp.h"
#endif
#if defined(MBEDTLS_ECDSA_C)
#include "mbedtls/ecdsa.h"
#endif
#if defined(MBEDTLS_USE_PSA_CRYPTO)
#include "mbedtls/psa_util.h"
#endif
#include <limits.h>
#include <stdint.h>
#define PK_VALIDATE_RET(cond) \
MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA)...
#define PK_VALIDATE(cond) \
MBEDTLS_INTERNAL_VALIDATE(cond)...
/* ... */
void mbedtls_pk_init(mbedtls_pk_context *ctx)
{
PK_VALIDATE(ctx != NULL);
ctx->pk_info = NULL;
ctx->pk_ctx = NULL;
}{ ... }
/* ... */
void mbedtls_pk_free(mbedtls_pk_context *ctx)
{
if (ctx == NULL) {
return;
}if (ctx == NULL) { ... }
if (ctx->pk_info != NULL) {
ctx->pk_info->ctx_free_func(ctx->pk_ctx);
}if (ctx->pk_info != NULL) { ... }
mbedtls_platform_zeroize(ctx, sizeof(mbedtls_pk_context));
}{ ... }
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
/* ... */
void mbedtls_pk_restart_init(mbedtls_pk_restart_ctx *ctx)
{
PK_VALIDATE(ctx != NULL);
ctx->pk_info = NULL;
ctx->rs_ctx = NULL;
}mbedtls_pk_restart_init (mbedtls_pk_restart_ctx *ctx) { ... }
/* ... */
void mbedtls_pk_restart_free(mbedtls_pk_restart_ctx *ctx)
{
if (ctx == NULL || ctx->pk_info == NULL ||
ctx->pk_info->rs_free_func == NULL) {
return;
}if (ctx == NULL || ctx->pk_info == NULL || ctx->pk_info->rs_free_func == NULL) { ... }
ctx->pk_info->rs_free_func(ctx->rs_ctx);
ctx->pk_info = NULL;
ctx->rs_ctx = NULL;
}mbedtls_pk_restart_free (mbedtls_pk_restart_ctx *ctx) { ... }
/* ... */#endif
/* ... */
const mbedtls_pk_info_t *mbedtls_pk_info_from_type(mbedtls_pk_type_t pk_type)
{
switch (pk_type) {
#if defined(MBEDTLS_RSA_C)
case MBEDTLS_PK_RSA:
return &mbedtls_rsa_info;/* ... */
#endif
#if defined(MBEDTLS_ECP_C)case MBEDTLS_PK_RSA:
case MBEDTLS_PK_ECKEY:
return &mbedtls_eckey_info;case MBEDTLS_PK_ECKEY:
case MBEDTLS_PK_ECKEY_DH:
return &mbedtls_eckeydh_info;/* ... */
#endif
#if defined(MBEDTLS_ECDSA_C)
case MBEDTLS_PK_ECDSA:
return &mbedtls_ecdsa_info;/* ... */
#endif
case MBEDTLS_PK_ECDSA:
default:
return NULL;default
}switch (pk_type) { ... }
}{ ... }
/* ... */
int mbedtls_pk_setup(mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info)
{
PK_VALIDATE_RET(ctx != NULL);
if (info == NULL || ctx->pk_info != NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (info == NULL || ctx->pk_info != NULL) { ... }
if ((ctx->pk_ctx = info->ctx_alloc_func()) == NULL) {
return MBEDTLS_ERR_PK_ALLOC_FAILED;
}if ((ctx->pk_ctx = info->ctx_alloc_func()) == NULL) { ... }
ctx->pk_info = info;
return 0;
}{ ... }
#if defined(MBEDTLS_USE_PSA_CRYPTO)
/* ... */
int mbedtls_pk_setup_opaque(mbedtls_pk_context *ctx,
const psa_key_id_t key)
{
const mbedtls_pk_info_t * const info = &mbedtls_pk_opaque_info;
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
psa_key_id_t *pk_ctx;
psa_key_type_t type;
if (ctx == NULL || ctx->pk_info != NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (ctx == NULL || ctx->pk_info != NULL) { ... }
if (PSA_SUCCESS != psa_get_key_attributes(key, &attributes)) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (PSA_SUCCESS != psa_get_key_attributes(key, &attributes)) { ... }
type = psa_get_key_type(&attributes);
psa_reset_key_attributes(&attributes);
if (!PSA_KEY_TYPE_IS_ECC_KEY_PAIR(type)) {
return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
}if (!PSA_KEY_TYPE_IS_ECC_KEY_PAIR(type)) { ... }
if ((ctx->pk_ctx = info->ctx_alloc_func()) == NULL) {
return MBEDTLS_ERR_PK_ALLOC_FAILED;
}if ((ctx->pk_ctx = info->ctx_alloc_func()) == NULL) { ... }
ctx->pk_info = info;
pk_ctx = (psa_key_id_t *) ctx->pk_ctx;
*pk_ctx = key;
return 0;
}mbedtls_pk_setup_opaque (mbedtls_pk_context *ctx, const psa_key_id_t key) { ... }
/* ... */#endif
#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
/* ... */
int mbedtls_pk_setup_rsa_alt(mbedtls_pk_context *ctx, void *key,
mbedtls_pk_rsa_alt_decrypt_func decrypt_func,
mbedtls_pk_rsa_alt_sign_func sign_func,
mbedtls_pk_rsa_alt_key_len_func key_len_func)
{
mbedtls_rsa_alt_context *rsa_alt;
const mbedtls_pk_info_t *info = &mbedtls_rsa_alt_info;
PK_VALIDATE_RET(ctx != NULL);
if (ctx->pk_info != NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (ctx->pk_info != NULL) { ... }
if ((ctx->pk_ctx = info->ctx_alloc_func()) == NULL) {
return MBEDTLS_ERR_PK_ALLOC_FAILED;
}if ((ctx->pk_ctx = info->ctx_alloc_func()) == NULL) { ... }
ctx->pk_info = info;
rsa_alt = (mbedtls_rsa_alt_context *) ctx->pk_ctx;
rsa_alt->key = key;
rsa_alt->decrypt_func = decrypt_func;
rsa_alt->sign_func = sign_func;
rsa_alt->key_len_func = key_len_func;
return 0;
}mbedtls_pk_setup_rsa_alt (mbedtls_pk_context *ctx, void *key, mbedtls_pk_rsa_alt_decrypt_func decrypt_func, mbedtls_pk_rsa_alt_sign_func sign_func, mbedtls_pk_rsa_alt_key_len_func key_len_func) { ... }
/* ... */#endif
/* ... */
int mbedtls_pk_can_do(const mbedtls_pk_context *ctx, mbedtls_pk_type_t type)
{
/* ... */
if (ctx == NULL || ctx->pk_info == NULL) {
return 0;
}if (ctx == NULL || ctx->pk_info == NULL) { ... }
return ctx->pk_info->can_do(type);
}{ ... }
/* ... */
static inline int pk_hashlen_helper(mbedtls_md_type_t md_alg, size_t *hash_len)
{
const mbedtls_md_info_t *md_info;
if (*hash_len != 0 && md_alg == MBEDTLS_MD_NONE) {
return 0;
}if (*hash_len != 0 && md_alg == MBEDTLS_MD_NONE) { ... }
if ((md_info = mbedtls_md_info_from_type(md_alg)) == NULL) {
return -1;
}if ((md_info = mbedtls_md_info_from_type(md_alg)) == NULL) { ... }
if (*hash_len != 0 && *hash_len != mbedtls_md_get_size(md_info)) {
return -1;
}if (*hash_len != 0 && *hash_len != mbedtls_md_get_size(md_info)) { ... }
*hash_len = mbedtls_md_get_size(md_info);
return 0;
}{ ... }
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
/* ... */
static int pk_restart_setup(mbedtls_pk_restart_ctx *ctx,
const mbedtls_pk_info_t *info)
{
if (ctx == NULL || ctx->pk_info != NULL) {
return 0;
}if (ctx == NULL || ctx->pk_info != NULL) { ... }
if (info->rs_alloc_func == NULL || info->rs_free_func == NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (info->rs_alloc_func == NULL || info->rs_free_func == NULL) { ... }
if ((ctx->rs_ctx = info->rs_alloc_func()) == NULL) {
return MBEDTLS_ERR_PK_ALLOC_FAILED;
}if ((ctx->rs_ctx = info->rs_alloc_func()) == NULL) { ... }
ctx->pk_info = info;
return 0;
}pk_restart_setup (mbedtls_pk_restart_ctx *ctx, const mbedtls_pk_info_t *info) { ... }
/* ... */#endif
/* ... */
int mbedtls_pk_verify_restartable(mbedtls_pk_context *ctx,
mbedtls_md_type_t md_alg,
const unsigned char *hash, size_t hash_len,
const unsigned char *sig, size_t sig_len,
mbedtls_pk_restart_ctx *rs_ctx)
{
PK_VALIDATE_RET(ctx != NULL);
PK_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && hash_len == 0) ||
hash != NULL);
PK_VALIDATE_RET(sig != NULL);
if (ctx->pk_info == NULL ||
pk_hashlen_helper(md_alg, &hash_len) != 0) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (ctx->pk_info == NULL || pk_hashlen_helper(md_alg, &hash_len) != 0) { ... }
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
if (rs_ctx != NULL &&
mbedtls_ecp_restart_is_enabled() &&
ctx->pk_info->verify_rs_func != NULL) {
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
if ((ret = pk_restart_setup(rs_ctx, ctx->pk_info)) != 0) {
return ret;
}if ((ret = pk_restart_setup(rs_ctx, ctx->pk_info)) != 0) { ... }
ret = ctx->pk_info->verify_rs_func(ctx->pk_ctx,
md_alg, hash, hash_len, sig, sig_len, rs_ctx->rs_ctx);
if (ret != MBEDTLS_ERR_ECP_IN_PROGRESS) {
mbedtls_pk_restart_free(rs_ctx);
}if (ret != MBEDTLS_ERR_ECP_IN_PROGRESS) { ... }
return ret;
}if (rs_ctx != NULL && mbedtls_ecp_restart_is_enabled() && ctx->pk_info->verify_rs_func != NULL) { ... }
/* ... */#else
(void) rs_ctx;
#endif
if (ctx->pk_info->verify_func == NULL) {
return MBEDTLS_ERR_PK_TYPE_MISMATCH;
}if (ctx->pk_info->verify_func == NULL) { ... }
return ctx->pk_info->verify_func(ctx->pk_ctx, md_alg, hash, hash_len,
sig, sig_len);
}{ ... }
/* ... */
int mbedtls_pk_verify(mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
const unsigned char *hash, size_t hash_len,
const unsigned char *sig, size_t sig_len)
{
return mbedtls_pk_verify_restartable(ctx, md_alg, hash, hash_len,
sig, sig_len, NULL);
}{ ... }
/* ... */
int mbedtls_pk_verify_ext(mbedtls_pk_type_t type, const void *options,
mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
const unsigned char *hash, size_t hash_len,
const unsigned char *sig, size_t sig_len)
{
PK_VALIDATE_RET(ctx != NULL);
PK_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && hash_len == 0) ||
hash != NULL);
PK_VALIDATE_RET(sig != NULL);
if (ctx->pk_info == NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (ctx->pk_info == NULL) { ... }
if (!mbedtls_pk_can_do(ctx, type)) {
return MBEDTLS_ERR_PK_TYPE_MISMATCH;
}if (!mbedtls_pk_can_do(ctx, type)) { ... }
if (type == MBEDTLS_PK_RSASSA_PSS) {
#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PKCS1_V21)
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
const mbedtls_pk_rsassa_pss_options *pss_opts;
#if SIZE_MAX > UINT_MAX
if (md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len) { ... }
/* ... */#endif
if (options == NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (options == NULL) { ... }
pss_opts = (const mbedtls_pk_rsassa_pss_options *) options;
if (sig_len < mbedtls_pk_get_len(ctx)) {
return MBEDTLS_ERR_RSA_VERIFY_FAILED;
}if (sig_len < mbedtls_pk_get_len(ctx)) { ... }
ret = mbedtls_rsa_rsassa_pss_verify_ext(mbedtls_pk_rsa(*ctx),
NULL, NULL, MBEDTLS_RSA_PUBLIC,
md_alg, (unsigned int) hash_len, hash,
pss_opts->mgf1_hash_id,
pss_opts->expected_salt_len,
sig);
if (ret != 0) {
return ret;
}if (ret != 0) { ... }
if (sig_len > mbedtls_pk_get_len(ctx)) {
return MBEDTLS_ERR_PK_SIG_LEN_MISMATCH;
}if (sig_len > mbedtls_pk_get_len(ctx)) { ... }
return 0;/* ... */
#else
return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
#endif
}if (type == MBEDTLS_PK_RSASSA_PSS) { ... }
if (options != NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (options != NULL) { ... }
return mbedtls_pk_verify(ctx, md_alg, hash, hash_len, sig, sig_len);
}{ ... }
/* ... */
int mbedtls_pk_sign_restartable(mbedtls_pk_context *ctx,
mbedtls_md_type_t md_alg,
const unsigned char *hash, size_t hash_len,
unsigned char *sig, size_t *sig_len,
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
mbedtls_pk_restart_ctx *rs_ctx)
{
PK_VALIDATE_RET(ctx != NULL);
PK_VALIDATE_RET((md_alg == MBEDTLS_MD_NONE && hash_len == 0) ||
hash != NULL);
PK_VALIDATE_RET(sig != NULL);
if (ctx->pk_info == NULL ||
pk_hashlen_helper(md_alg, &hash_len) != 0) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (ctx->pk_info == NULL || pk_hashlen_helper(md_alg, &hash_len) != 0) { ... }
#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
if (rs_ctx != NULL &&
mbedtls_ecp_restart_is_enabled() &&
ctx->pk_info->sign_rs_func != NULL) {
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
if ((ret = pk_restart_setup(rs_ctx, ctx->pk_info)) != 0) {
return ret;
}if ((ret = pk_restart_setup(rs_ctx, ctx->pk_info)) != 0) { ... }
ret = ctx->pk_info->sign_rs_func(ctx->pk_ctx, md_alg,
hash, hash_len, sig, sig_len, f_rng, p_rng,
rs_ctx->rs_ctx);
if (ret != MBEDTLS_ERR_ECP_IN_PROGRESS) {
mbedtls_pk_restart_free(rs_ctx);
}if (ret != MBEDTLS_ERR_ECP_IN_PROGRESS) { ... }
return ret;
}if (rs_ctx != NULL && mbedtls_ecp_restart_is_enabled() && ctx->pk_info->sign_rs_func != NULL) { ... }
/* ... */#else
(void) rs_ctx;
#endif
if (ctx->pk_info->sign_func == NULL) {
return MBEDTLS_ERR_PK_TYPE_MISMATCH;
}if (ctx->pk_info->sign_func == NULL) { ... }
return ctx->pk_info->sign_func(ctx->pk_ctx, md_alg, hash, hash_len,
sig, sig_len, f_rng, p_rng);
}{ ... }
/* ... */
int mbedtls_pk_sign(mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
const unsigned char *hash, size_t hash_len,
unsigned char *sig, size_t *sig_len,
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
{
return mbedtls_pk_sign_restartable(ctx, md_alg, hash, hash_len,
sig, sig_len, f_rng, p_rng, NULL);
}{ ... }
/* ... */
int mbedtls_pk_decrypt(mbedtls_pk_context *ctx,
const unsigned char *input, size_t ilen,
unsigned char *output, size_t *olen, size_t osize,
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
{
PK_VALIDATE_RET(ctx != NULL);
PK_VALIDATE_RET(input != NULL || ilen == 0);
PK_VALIDATE_RET(output != NULL || osize == 0);
PK_VALIDATE_RET(olen != NULL);
if (ctx->pk_info == NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (ctx->pk_info == NULL) { ... }
if (ctx->pk_info->decrypt_func == NULL) {
return MBEDTLS_ERR_PK_TYPE_MISMATCH;
}if (ctx->pk_info->decrypt_func == NULL) { ... }
return ctx->pk_info->decrypt_func(ctx->pk_ctx, input, ilen,
output, olen, osize, f_rng, p_rng);
}{ ... }
/* ... */
int mbedtls_pk_encrypt(mbedtls_pk_context *ctx,
const unsigned char *input, size_t ilen,
unsigned char *output, size_t *olen, size_t osize,
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
{
PK_VALIDATE_RET(ctx != NULL);
PK_VALIDATE_RET(input != NULL || ilen == 0);
PK_VALIDATE_RET(output != NULL || osize == 0);
PK_VALIDATE_RET(olen != NULL);
if (ctx->pk_info == NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (ctx->pk_info == NULL) { ... }
if (ctx->pk_info->encrypt_func == NULL) {
return MBEDTLS_ERR_PK_TYPE_MISMATCH;
}if (ctx->pk_info->encrypt_func == NULL) { ... }
return ctx->pk_info->encrypt_func(ctx->pk_ctx, input, ilen,
output, olen, osize, f_rng, p_rng);
}{ ... }
/* ... */
int mbedtls_pk_check_pair(const mbedtls_pk_context *pub, const mbedtls_pk_context *prv)
{
PK_VALIDATE_RET(pub != NULL);
PK_VALIDATE_RET(prv != NULL);
if (pub->pk_info == NULL ||
prv->pk_info == NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (pub->pk_info == NULL || prv->pk_info == NULL) { ... }
if (prv->pk_info->check_pair_func == NULL) {
return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
}if (prv->pk_info->check_pair_func == NULL) { ... }
if (prv->pk_info->type == MBEDTLS_PK_RSA_ALT) {
if (pub->pk_info->type != MBEDTLS_PK_RSA) {
return MBEDTLS_ERR_PK_TYPE_MISMATCH;
}if (pub->pk_info->type != MBEDTLS_PK_RSA) { ... }
}if (prv->pk_info->type == MBEDTLS_PK_RSA_ALT) { ... } else {
if (pub->pk_info != prv->pk_info) {
return MBEDTLS_ERR_PK_TYPE_MISMATCH;
}if (pub->pk_info != prv->pk_info) { ... }
}else { ... }
return prv->pk_info->check_pair_func(pub->pk_ctx, prv->pk_ctx);
}{ ... }
/* ... */
size_t mbedtls_pk_get_bitlen(const mbedtls_pk_context *ctx)
{
/* ... */
if (ctx == NULL || ctx->pk_info == NULL) {
return 0;
}if (ctx == NULL || ctx->pk_info == NULL) { ... }
return ctx->pk_info->get_bitlen(ctx->pk_ctx);
}{ ... }
/* ... */
int mbedtls_pk_debug(const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items)
{
PK_VALIDATE_RET(ctx != NULL);
if (ctx->pk_info == NULL) {
return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
}if (ctx->pk_info == NULL) { ... }
if (ctx->pk_info->debug_func == NULL) {
return MBEDTLS_ERR_PK_TYPE_MISMATCH;
}if (ctx->pk_info->debug_func == NULL) { ... }
ctx->pk_info->debug_func(ctx->pk_ctx, items);
return 0;
}{ ... }
/* ... */
const char *mbedtls_pk_get_name(const mbedtls_pk_context *ctx)
{
if (ctx == NULL || ctx->pk_info == NULL) {
return "invalid PK";
}if (ctx == NULL || ctx->pk_info == NULL) { ... }
return ctx->pk_info->name;
}{ ... }
/* ... */
mbedtls_pk_type_t mbedtls_pk_get_type(const mbedtls_pk_context *ctx)
{
if (ctx == NULL || ctx->pk_info == NULL) {
return MBEDTLS_PK_NONE;
}if (ctx == NULL || ctx->pk_info == NULL) { ... }
return ctx->pk_info->type;
}{ ... }
#if defined(MBEDTLS_USE_PSA_CRYPTO)
/* ... */
int mbedtls_pk_wrap_as_opaque(mbedtls_pk_context *pk,
psa_key_id_t *key,
psa_algorithm_t hash_alg)
{
#if !defined(MBEDTLS_ECP_C)
((void) pk);
((void) key);
((void) hash_alg);
return MBEDTLS_ERR_PK_TYPE_MISMATCH;/* ... */
#else
const mbedtls_ecp_keypair *ec;
unsigned char d[MBEDTLS_ECP_MAX_BYTES];
size_t d_len;
psa_ecc_family_t curve_id;
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
psa_key_type_t key_type;
size_t bits;
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
psa_status_t status;
if (mbedtls_pk_get_type(pk) != MBEDTLS_PK_ECKEY) {
return MBEDTLS_ERR_PK_TYPE_MISMATCH;
}if (mbedtls_pk_get_type(pk) != MBEDTLS_PK_ECKEY) { ... }
ec = mbedtls_pk_ec(*pk);
d_len = (ec->grp.nbits + 7) / 8;
if ((ret = mbedtls_mpi_write_binary(&ec->d, d, d_len)) != 0) {
return ret;
}if ((ret = mbedtls_mpi_write_binary(&ec->d, d, d_len)) != 0) { ... }
curve_id = mbedtls_ecc_group_to_psa(ec->grp.id, &bits);
key_type = PSA_KEY_TYPE_ECC_KEY_PAIR(curve_id);
psa_set_key_type(&attributes, key_type);
psa_set_key_bits(&attributes, bits);
psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
psa_set_key_algorithm(&attributes, PSA_ALG_ECDSA(hash_alg));
status = psa_import_key(&attributes, d, d_len, key);
mbedtls_platform_zeroize(d, sizeof(d));
if (status != PSA_SUCCESS) {
return MBEDTLS_ERR_PK_HW_ACCEL_FAILED;
}if (status != PSA_SUCCESS) { ... }
mbedtls_pk_free(pk);
mbedtls_pk_init(pk);
return mbedtls_pk_setup_opaque(pk, *key);/* ... */
#endif
}mbedtls_pk_wrap_as_opaque (mbedtls_pk_context *pk, psa_key_id_t *key, psa_algorithm_t hash_alg) { ... }
/* ... */#endif /* ... */
#endif