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