1/* BEGIN_HEADER */
2#include "mbedtls/pk.h"
3#include "mbedtls/psa_util.h"
4#include "pk_internal.h"
5
6/* For error codes */
7#include "mbedtls/asn1.h"
8#include "mbedtls/base64.h"
9#include "mbedtls/ecp.h"
10#include "mbedtls/error.h"
11#include "mbedtls/rsa.h"
12#include "rsa_internal.h"
13#include "pk_internal.h"
14
15#include <limits.h>
16#include <stdint.h>
17
18/* Needed only for test case data under #if defined(MBEDTLS_USE_PSA_CRYPTO),
19 * but the test code generator requires test case data to be valid C code
20 * unconditionally (https://github.com/Mbed-TLS/mbedtls/issues/2023). */
21#include "psa/crypto.h"
22#include "mbedtls/psa_util.h"
23
24#include "pkwrite.h"
25
26#include <test/psa_exercise_key.h>
27
28/* Needed for the definition of MBEDTLS_PK_WRITE_PUBKEY_MAX_SIZE. */
29#include "pkwrite.h"
30
31#if defined(MBEDTLS_RSA_C) ||                                           \
32    defined(MBEDTLS_PK_RSA_ALT_SUPPORT) ||                              \
33    defined(MBEDTLS_ECDSA_C) ||                                         \
34    defined(MBEDTLS_USE_PSA_CRYPTO)
35#define PK_CAN_SIGN_SOME
36#endif
37
38/* MBEDTLS_TEST_PK_PSA_SIGN is enabled when:
39 * - The build has PK_[PARSE/WRITE]_C for RSA or ECDSA signature.
40 * - The build has built-in ECC and ECDSA signature.
41 */
42#if (defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_PK_WRITE_C) && \
43    (defined(MBEDTLS_RSA_C) || defined(MBEDTLS_PK_CAN_ECDSA_SIGN))) || \
44    (defined(MBEDTLS_ECP_C) && defined(MBEDTLS_PK_CAN_ECDSA_SIGN))
45#define MBEDTLS_TEST_PK_PSA_SIGN
46#endif
47
48#if defined(MBEDTLS_PSA_CRYPTO_C) && defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
49/* Pick an elliptic curve that's supported by PSA. Note that the curve is
50 * not guaranteed to be supported by the ECP module.
51 *
52 * This should always find a curve if ECC is enabled in the build, except in
53 * one edge case: in a build with MBEDTLS_PSA_CRYPTO_CONFIG disabled and
54 * where the only legacy curve is secp224k1, which is not supported in PSA,
55 * PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY ends up enabled but PSA does not
56 * support any curve.
57 */
58
59/* First try all the curves that can do both ECDSA and ECDH, then try
60 * the ECDH-only curves. (There are no curves that can do ECDSA but not ECDH.)
61 * This way, if ECDSA is enabled then the curve that's selected here will
62 * be ECDSA-capable, and likewise for ECDH. */
63#if defined(PSA_WANT_ECC_SECP_R1_192)
64#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
65#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 192
66#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP192R1
67#elif defined(PSA_WANT_ECC_SECP_R1_256)
68#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
69#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 256
70#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP256R1
71#elif defined(PSA_WANT_ECC_SECP_K1_192)
72#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_K1
73#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 192
74#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP192K1
75#elif defined(PSA_WANT_ECC_SECP_K1_256)
76#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_K1
77#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 256
78#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP256K1
79#elif defined(PSA_WANT_ECC_SECP_R1_224)
80#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
81#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 224
82#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP224R1
83#elif defined(PSA_WANT_ECC_SECP_R1_384)
84#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
85#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 384
86#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP384R1
87#elif defined(PSA_WANT_ECC_SECP_R1_521)
88#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
89#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 521
90#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP521R1
91#elif defined(PSA_WANT_ECC_SECP_K1_224)
92#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_K1
93#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 224
94#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP224K1
95#elif defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
96#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_BRAINPOOL_P_R1
97#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 256
98#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_BP256R1
99#elif defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
100#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_BRAINPOOL_P_R1
101#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 384
102#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_BP384R1
103#elif defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
104#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_BRAINPOOL_P_R1
105#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 512
106#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_BP512R1
107#elif defined(PSA_WANT_ECC_MONTGOMERY_255)
108#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_MONTGOMERY
109#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 255
110#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_CURVE25519
111#elif defined(PSA_WANT_ECC_MONTGOMERY_448)
112#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_MONTGOMERY
113#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 448
114#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_CURVE448
115#endif /* curve selection */
116
117#if defined(MBEDTLS_TEST_PSA_ECC_ONE_FAMILY)
118#define MBEDTLS_TEST_PSA_ECC_AT_LEAST_ONE_CURVE
119#endif
120
121/* Pick a second curve, for tests that need two supported curves of the
122 * same size. For simplicity, we only handle a subset of configurations,
123 * and both curves will support both ECDH and ECDSA. */
124#if defined(PSA_WANT_ECC_SECP_R1_192) && defined(PSA_WANT_ECC_SECP_K1_192)
125/* Identical redefinition of the ONE macros, to confirm that they have
126 * the values we expect here. */
127#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
128#define MBEDTLS_TEST_PSA_ECC_ANOTHER_FAMILY PSA_ECC_FAMILY_SECP_K1
129#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 192
130#define MBEDTLS_TEST_PSA_ECC_HAVE_TWO_FAMILIES
131#elif defined(PSA_WANT_ECC_SECP_R1_256) && defined(PSA_WANT_ECC_SECP_K1_256) && \
132    !defined(PSA_WANT_ECC_SECP_R1_192)
133#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
134#define MBEDTLS_TEST_PSA_ECC_ANOTHER_FAMILY PSA_ECC_FAMILY_SECP_K1
135#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 256
136#define MBEDTLS_TEST_PSA_ECC_HAVE_TWO_FAMILIES
137#endif
138
139/* Pick a second bit-size, for tests that need two supported curves of the
140 * same family. For simplicity, we only handle a subset of configurations,
141 * and both curves will support both ECDH and ECDSA. */
142#if defined(PSA_WANT_ECC_SECP_R1_192) && defined(PSA_WANT_ECC_SECP_R1_256)
143/* Identical redefinition of the ONE macros, to confirm that they have
144 * the values we expect here. */
145#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
146#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 192
147#define MBEDTLS_TEST_PSA_ECC_ANOTHER_CURVE_BITS 256
148#define MBEDTLS_TEST_PSA_ECC_HAVE_TWO_BITS
149#elif defined(PSA_WANT_ECC_SECP_R1_256) && defined(PSA_WANT_ECC_SECP_R1_384)
150#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
151#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 256
152#define MBEDTLS_TEST_PSA_ECC_ANOTHER_CURVE_BITS 384
153#define MBEDTLS_TEST_PSA_ECC_HAVE_TWO_BITS
154#endif
155
156#endif /* defined(MBEDTLS_PSA_CRYPTO_C) && defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY) */
157
158/* Always define the macros so that we can use them in test data. */
159#if !defined(MBEDTLS_TEST_PSA_ECC_ONE_FAMILY)
160#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY 0
161#define MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS 0
162#define MBEDTLS_TEST_ECP_DP_ONE_CURVE 0
163#endif
164#if !defined(MBEDTLS_TEST_PSA_ECC_ANOTHER_FAMILY)
165#define MBEDTLS_TEST_PSA_ECC_ANOTHER_FAMILY 0
166#endif
167#if !defined(MBEDTLS_TEST_PSA_ECC_ANOTHER_CURVE_BITS)
168#define MBEDTLS_TEST_PSA_ECC_ANOTHER_CURVE_BITS 0
169#endif
170
171/* Get an available MD alg to be used in sign/verify tests. */
172#if defined(MBEDTLS_MD_CAN_SHA1)
173#define MBEDTLS_MD_ALG_FOR_TEST         MBEDTLS_MD_SHA1
174#elif defined(MBEDTLS_MD_CAN_SHA224)
175#define MBEDTLS_MD_ALG_FOR_TEST         MBEDTLS_MD_SHA224
176#elif defined(MBEDTLS_MD_CAN_SHA256)
177#define MBEDTLS_MD_ALG_FOR_TEST         MBEDTLS_MD_SHA256
178#elif defined(MBEDTLS_MD_CAN_SHA384)
179#define MBEDTLS_MD_ALG_FOR_TEST         MBEDTLS_MD_SHA384
180#elif defined(MBEDTLS_MD_CAN_SHA512)
181#define MBEDTLS_MD_ALG_FOR_TEST         MBEDTLS_MD_SHA512
182#endif
183
184#include <../src/test_keys.h>
185
186/* Define an RSA key size we know it's present in predefined_key[] array. */
187#define RSA_KEY_SIZE   1024
188#define RSA_KEY_LEN   (RSA_KEY_SIZE/8)
189
190static int get_predefined_key_data(int is_ec, int group_id_or_keybits,
191                                   const unsigned char **key, size_t *key_len,
192                                   const unsigned char **pub_key, size_t *pub_key_len)
193{
194    size_t i;
195    struct predefined_key_element *predefined_key = NULL;
196
197    for (i = 0; i < ARRAY_LENGTH(predefined_keys); i++) {
198        if (is_ec) {
199            if (group_id_or_keybits == predefined_keys[i].group_id) {
200                predefined_key = &predefined_keys[i];
201            }
202        } else if (group_id_or_keybits == predefined_keys[i].keybits) {
203            predefined_key = &predefined_keys[i];
204        }
205    }
206
207    if (predefined_key != NULL) {
208        *key = predefined_key->priv_key;
209        *key_len = predefined_key->priv_key_len;
210        if (pub_key != NULL) {
211            *pub_key = predefined_key->pub_key;
212            *pub_key_len = predefined_key->pub_key_len;
213        }
214        return 0;
215    }
216
217    TEST_FAIL("Unsupported key");
218    /* "exit" label is to make the compiler happy. */
219exit:
220    return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
221}
222
223#if defined(MBEDTLS_PSA_CRYPTO_C)
224static psa_status_t pk_psa_import_key(const unsigned char *key_data, size_t key_len,
225                                      psa_key_type_t type, psa_key_usage_t usage,
226                                      psa_algorithm_t alg, mbedtls_svc_key_id_t *key)
227{
228    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
229    psa_status_t status;
230
231    *key = MBEDTLS_SVC_KEY_ID_INIT;
232
233    /* Note: psa_import_key() automatically determines the key's bit length
234     * from the provided key data. That's why psa_set_key_bits() is not used below. */
235    psa_set_key_usage_flags(&attributes, usage);
236    psa_set_key_algorithm(&attributes, alg);
237    psa_set_key_type(&attributes, type);
238    status = psa_import_key(&attributes, key_data, key_len, key);
239
240    return status;
241}
242#endif /* MBEDTLS_PSA_CRYPTO_C */
243
244/** Setup the provided PK context.
245 *
246 * Predefined keys used for the setup are taken from "test/src/test_keys.h"
247 * which is automatically generated using "framework/scripts/generate_test_keys.py".
248 *
249 * \param pk               The PK object to fill. It must  have been initialized
250 *                         (mbedtls_pk_init()), but not setup (mbedtls_pk_setup()).
251 * \param pk_type          mbedtls_pk_type_t to use in the PK context.
252 * \param curve_or_keybits - For RSA keys, the key size in bits.
253 *                         - For EC keys, the curve (\c MBEDTLS_ECP_DP_xxx).
254 *
255 * \return                 0 on success or a negative value otherwise.
256 */
257static int pk_setup(mbedtls_pk_context *pk, mbedtls_pk_type_t pk_type, int curve_or_keybits)
258{
259    const unsigned char *key_data = NULL;
260    const unsigned char *pub_key_data = NULL;
261    size_t key_data_len = 0;
262    size_t pub_key_data_len = 0;
263    int ret = MBEDTLS_ERR_PK_BAD_INPUT_DATA;
264
265    TEST_EQUAL(mbedtls_pk_setup(pk, mbedtls_pk_info_from_type(pk_type)), 0);
266
267    if (pk_type == MBEDTLS_PK_RSA) {
268#if defined(MBEDTLS_RSA_C)
269        TEST_EQUAL(get_predefined_key_data(0, curve_or_keybits, &key_data, &key_data_len,
270                                           NULL, 0), 0);
271        TEST_EQUAL(mbedtls_rsa_parse_key(mbedtls_pk_rsa(*pk), key_data, key_data_len), 0);
272#else /* MBEDTLS_RSA_C */
273        TEST_FAIL("RSA keys not supported.");
274#endif /* MBEDTLS_RSA_C */
275    } else {
276        TEST_EQUAL(get_predefined_key_data(1, curve_or_keybits, &key_data, &key_data_len,
277                                           &pub_key_data, &pub_key_data_len), 0);
278#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
279        pk->ec_family = mbedtls_ecc_group_to_psa(curve_or_keybits, &pk->ec_bits);
280        TEST_EQUAL(pk_psa_import_key(key_data, key_data_len,
281                                     PSA_KEY_TYPE_ECC_KEY_PAIR(pk->ec_family),
282                                     PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH |
283                                     PSA_KEY_USAGE_SIGN_MESSAGE | PSA_KEY_USAGE_VERIFY_MESSAGE |
284                                     PSA_KEY_USAGE_DERIVE | PSA_KEY_USAGE_COPY |
285                                     PSA_KEY_USAGE_EXPORT,
286                                     MBEDTLS_PK_PSA_ALG_ECDSA_MAYBE_DET(PSA_ALG_ANY_HASH),
287                                     &pk->priv_id), 0);
288        memcpy(pk->pub_raw, pub_key_data, pub_key_data_len);
289        pk->pub_raw_len = pub_key_data_len;
290#elif defined(MBEDTLS_ECP_C)
291        TEST_EQUAL(mbedtls_ecp_read_key(curve_or_keybits, mbedtls_pk_ec_rw(*pk),
292                                        key_data, key_data_len), 0);
293        TEST_EQUAL(mbedtls_ecp_point_read_binary(&(mbedtls_pk_ec_rw(*pk)->grp),
294                                                 &(mbedtls_pk_ec_rw(*pk)->Q),
295                                                 pub_key_data, pub_key_data_len), 0);
296#else /* MBEDTLS_PK_USE_PSA_EC_DATA || MBEDTLS_ECP_C */
297        TEST_FAIL("EC keys not supported.");
298#endif /* MBEDTLS_PK_USE_PSA_EC_DATA || MBEDTLS_ECP_C */
299    }
300    /* Override pk_info. */
301    pk->pk_info = mbedtls_pk_info_from_type(pk_type);
302    ret = 0;
303
304exit:
305    return ret;
306}
307
308#if defined(MBEDTLS_PSA_CRYPTO_C)
309/** Create a PSA key of the desired type and properties.
310 *
311 * - For RSA and EC keys predefined key data is used (as in the pk_setup() above).
312 * - Other key types (ex: DH) are generated at runtime.
313 *
314 * \param type                  PSA key type.
315 * \param bits                  PSA key bit size.
316 * \param usage                 PSA key usage flags.
317 * \param alg                   PSA key primary algorithm.
318 * \param enrollment_alg        PSA key enrollment algorithm.
319 * \param persistent_key_id     PSA key ID for persistent keys. Set to PSA_KEY_ID_NULL
320 *                              for volatile keys.
321 * \param[out] key              Identifier of the "generated" (actually imported) PSA key.
322 */
323static psa_status_t pk_psa_setup(psa_key_type_t type, size_t bits,
324                                 psa_key_usage_t usage, psa_algorithm_t alg,
325                                 psa_algorithm_t enrollment_alg,
326                                 mbedtls_svc_key_id_t persistent_key_id,
327                                 mbedtls_svc_key_id_t *key)
328{
329    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
330    psa_status_t status = PSA_ERROR_GENERIC_ERROR;
331    const unsigned char *key_data = NULL;
332    size_t key_data_size = 0;
333
334    *key = MBEDTLS_SVC_KEY_ID_INIT;
335    psa_set_key_usage_flags(&attributes, usage);
336    psa_set_key_algorithm(&attributes, alg);
337    psa_set_key_enrollment_algorithm(&attributes, enrollment_alg);
338    psa_set_key_type(&attributes, type);
339    psa_set_key_bits(&attributes, bits);
340    if (!mbedtls_svc_key_id_is_null(persistent_key_id)) {
341        psa_set_key_id(&attributes, persistent_key_id);
342    }
343
344    /* For EC and RSA keys we use predefined keys in order to:
345     * - speed up testing and
346     * - ease requirements/dependencies on test cases.
347     * For other keys (ex: DH) psa_generate_key() is used instead. */
348    if (PSA_KEY_TYPE_IS_RSA(type)) {
349        TEST_EQUAL(get_predefined_key_data(0, bits, &key_data, &key_data_size, NULL, 0), 0);
350    } else if (PSA_KEY_TYPE_IS_ECC(type)) {
351#if defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
352        mbedtls_ecp_group_id grp_id;
353        grp_id = mbedtls_ecc_group_from_psa(PSA_KEY_TYPE_ECC_GET_FAMILY(type), bits);
354        TEST_EQUAL(get_predefined_key_data(1, grp_id, &key_data, &key_data_size, NULL, 0), 0);
355#else /* PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY */
356        TEST_FAIL("EC keys are not supported");
357#endif /* PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY */
358    } else {
359        return psa_generate_key(&attributes, key);
360    }
361
362    status = psa_import_key(&attributes, key_data, key_data_size, key);
363
364exit:
365    return status;
366}
367
368static psa_key_usage_t pk_get_psa_attributes_implied_usage(
369    psa_key_usage_t expected_usage)
370{
371    /* Usage implied universally */
372    if (expected_usage & PSA_KEY_USAGE_SIGN_HASH) {
373        expected_usage |= PSA_KEY_USAGE_SIGN_MESSAGE;
374    }
375    if (expected_usage & PSA_KEY_USAGE_VERIFY_HASH) {
376        expected_usage |= PSA_KEY_USAGE_VERIFY_MESSAGE;
377    }
378    /* Usage implied by mbedtls_pk_get_psa_attributes() */
379    if (expected_usage & PSA_KEY_USAGE_SIGN_HASH) {
380        expected_usage |= PSA_KEY_USAGE_VERIFY_HASH;
381    }
382    if (expected_usage & PSA_KEY_USAGE_SIGN_MESSAGE) {
383        expected_usage |= PSA_KEY_USAGE_VERIFY_MESSAGE;
384    }
385    if (expected_usage & PSA_KEY_USAGE_DECRYPT) {
386        expected_usage |= PSA_KEY_USAGE_ENCRYPT;
387    }
388    expected_usage |= PSA_KEY_USAGE_EXPORT | PSA_KEY_USAGE_COPY;
389    return expected_usage;
390}
391
392#define RSA_WRITE_PUBKEY_MAX_SIZE                                       \
393    PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_RSA_MAX_KEY_BITS)
394#define ECP_WRITE_PUBKEY_MAX_SIZE                                       \
395    PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)
396static int pk_public_same(const mbedtls_pk_context *pk1,
397                          const mbedtls_pk_context *pk2)
398{
399    int ok = 0;
400
401    mbedtls_pk_type_t type = mbedtls_pk_get_type(pk1);
402    TEST_EQUAL(type, mbedtls_pk_get_type(pk2));
403
404    switch (type) {
405#if defined(MBEDTLS_RSA_C)
406        case MBEDTLS_PK_RSA:
407        {
408            const mbedtls_rsa_context *rsa1 = mbedtls_pk_rsa(*pk1);
409            const mbedtls_rsa_context *rsa2 = mbedtls_pk_rsa(*pk2);
410            TEST_EQUAL(mbedtls_rsa_get_padding_mode(rsa1),
411                       mbedtls_rsa_get_padding_mode(rsa2));
412            TEST_EQUAL(mbedtls_rsa_get_md_alg(rsa1),
413                       mbedtls_rsa_get_md_alg(rsa2));
414            unsigned char buf1[RSA_WRITE_PUBKEY_MAX_SIZE];
415            unsigned char *p1 = buf1 + sizeof(buf1);
416            int len1 = mbedtls_rsa_write_pubkey(rsa1, buf1, &p1);
417            TEST_LE_U(0, len1);
418            unsigned char buf2[RSA_WRITE_PUBKEY_MAX_SIZE];
419            unsigned char *p2 = buf2 + sizeof(buf2);
420            int len2 = mbedtls_rsa_write_pubkey(rsa2, buf2, &p2);
421            TEST_LE_U(0, len2);
422            TEST_MEMORY_COMPARE(p1, len1, p2, len2);
423            break;
424        }
425#endif /* MBEDTLS_RSA_C */
426
427#if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
428        case MBEDTLS_PK_ECKEY:
429        case MBEDTLS_PK_ECKEY_DH:
430        case MBEDTLS_PK_ECDSA:
431        {
432#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
433            TEST_MEMORY_COMPARE(pk1->pub_raw, pk1->pub_raw_len,
434                                pk2->pub_raw, pk2->pub_raw_len);
435            TEST_EQUAL(pk1->ec_family, pk2->ec_family);
436            TEST_EQUAL(pk1->ec_bits, pk2->ec_bits);
437
438#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
439            const mbedtls_ecp_keypair *ec1 = mbedtls_pk_ec_ro(*pk1);
440            const mbedtls_ecp_keypair *ec2 = mbedtls_pk_ec_ro(*pk2);
441            TEST_EQUAL(mbedtls_ecp_keypair_get_group_id(ec1),
442                       mbedtls_ecp_keypair_get_group_id(ec2));
443            unsigned char buf1[ECP_WRITE_PUBKEY_MAX_SIZE];
444            size_t len1 = 99999991;
445            TEST_EQUAL(mbedtls_ecp_write_public_key(
446                           ec1, MBEDTLS_ECP_PF_UNCOMPRESSED,
447                           &len1, buf1, sizeof(buf1)), 0);
448            unsigned char buf2[ECP_WRITE_PUBKEY_MAX_SIZE];
449            size_t len2 = 99999992;
450            TEST_EQUAL(mbedtls_ecp_write_public_key(
451                           ec2, MBEDTLS_ECP_PF_UNCOMPRESSED,
452                           &len2, buf2, sizeof(buf2)), 0);
453            TEST_MEMORY_COMPARE(buf1, len1, buf2, len2);
454#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
455        }
456        break;
457#endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
458
459        default:
460            TEST_FAIL("Unsupported pk type in pk_public_same");
461    }
462
463    ok = 1;
464
465exit:
466    return ok;
467}
468#endif /* MBEDTLS_PSA_CRYPTO_C */
469
470#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
471static int mbedtls_rsa_decrypt_func(void *ctx, size_t *olen,
472                                    const unsigned char *input, unsigned char *output,
473                                    size_t output_max_len)
474{
475    return mbedtls_rsa_pkcs1_decrypt((mbedtls_rsa_context *) ctx,
476                                     mbedtls_test_rnd_std_rand, NULL,
477                                     olen, input, output, output_max_len);
478}
479static int mbedtls_rsa_sign_func(void *ctx,
480                                 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
481                                 mbedtls_md_type_t md_alg, unsigned int hashlen,
482                                 const unsigned char *hash, unsigned char *sig)
483{
484    ((void) f_rng);
485    ((void) p_rng);
486    return mbedtls_rsa_pkcs1_sign((mbedtls_rsa_context *) ctx,
487                                  mbedtls_test_rnd_std_rand, NULL,
488                                  md_alg, hashlen, hash, sig);
489}
490static size_t mbedtls_rsa_key_len_func(void *ctx)
491{
492    return ((const mbedtls_rsa_context *) ctx)->len;
493}
494#endif /* MBEDTLS_RSA_C && MBEDTLS_PK_RSA_ALT_SUPPORT */
495
496typedef enum {
497    /* The values are compatible with thinking of "from pair" as a boolean. */
498    FROM_PUBLIC = 0,
499    FROM_PAIR = 1
500} from_pair_t;
501
502#if defined(MBEDTLS_PSA_CRYPTO_C)
503static int pk_setup_for_type(mbedtls_pk_type_t pk_type, int want_pair,
504                             mbedtls_pk_context *pk, psa_key_type_t *psa_type)
505{
506    if (pk_type == MBEDTLS_PK_NONE) {
507        return 0;
508    }
509
510    switch (pk_type) {
511#if defined(MBEDTLS_RSA_C)
512        case MBEDTLS_PK_RSA:
513        {
514            *psa_type = PSA_KEY_TYPE_RSA_KEY_PAIR;
515            TEST_EQUAL(pk_setup(pk, pk_type, RSA_KEY_SIZE), 0);
516            if (!want_pair) {
517                mbedtls_rsa_context *rsa = mbedtls_pk_rsa(*pk);
518                mbedtls_mpi_free(&rsa->D);
519                mbedtls_mpi_free(&rsa->P);
520                mbedtls_mpi_free(&rsa->Q);
521            }
522            break;
523        }
524#endif /* MBEDTLS_RSA_C */
525
526#if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
527        case MBEDTLS_PK_ECKEY:
528        case MBEDTLS_PK_ECKEY_DH:
529        case MBEDTLS_PK_ECDSA:
530        {
531            mbedtls_ecp_group_id grp_id = MBEDTLS_TEST_ECP_DP_ONE_CURVE;
532            size_t bits;
533            *psa_type = PSA_KEY_TYPE_ECC_KEY_PAIR(mbedtls_ecc_group_to_psa(grp_id, &bits));
534            TEST_EQUAL(pk_setup(pk, pk_type, grp_id), 0);
535            if (!want_pair) {
536#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
537                psa_key_attributes_t pub_attributes = PSA_KEY_ATTRIBUTES_INIT;
538                psa_set_key_type(&pub_attributes,
539                                 PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(*psa_type));
540                psa_set_key_usage_flags(&pub_attributes,
541                                        PSA_KEY_USAGE_EXPORT |
542                                        PSA_KEY_USAGE_COPY |
543                                        PSA_KEY_USAGE_VERIFY_MESSAGE |
544                                        PSA_KEY_USAGE_VERIFY_HASH);
545                psa_set_key_algorithm(&pub_attributes, PSA_ALG_ECDSA_ANY);
546                PSA_ASSERT(psa_destroy_key(pk->priv_id));
547                pk->priv_id = MBEDTLS_SVC_KEY_ID_INIT;
548#else
549                mbedtls_ecp_keypair *ec = mbedtls_pk_ec_rw(*pk);
550                mbedtls_mpi_free(&ec->d);
551#endif
552            }
553            break;
554        }
555#endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
556
557        default:
558            TEST_FAIL("Unknown PK type in test data");
559            break;
560    }
561
562    if (!want_pair) {
563        *psa_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(*psa_type);
564    }
565    return 0;
566
567exit:
568    return MBEDTLS_ERR_ERROR_GENERIC_ERROR;
569}
570#endif /* MBEDTLS_PSA_CRYPTO_C */
571
572#if defined(MBEDTLS_PSA_CRYPTO_C)
573/* Create a new PSA key which will contain only the public part of the private
574 * key which is provided in input. For this new key:
575 * - Type is the public counterpart of the private key.
576 * - Usage is the copied from the original private key, but the PSA_KEY_USAGE_EXPORT
577 *   flag is removed. This is to prove that mbedtls_pk_copy_from_psa() doesn't
578 *   require the key to have the EXPORT flag.
579 * - Algorithm is copied from the original key pair.
580 */
581static mbedtls_svc_key_id_t psa_pub_key_from_priv(mbedtls_svc_key_id_t priv_id)
582{
583    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
584    psa_key_type_t type;
585    psa_algorithm_t alg;
586    psa_key_usage_t usage;
587    unsigned char pub_key_buf[PSA_EXPORT_PUBLIC_KEY_MAX_SIZE];
588    size_t pub_key_len;
589    mbedtls_svc_key_id_t pub_key = MBEDTLS_SVC_KEY_ID_INIT;
590
591    /* Get attributes from the private key. */
592    PSA_ASSERT(psa_get_key_attributes(priv_id, &attributes));
593    type = psa_get_key_type(&attributes);
594    usage = psa_get_key_usage_flags(&attributes);
595    alg = psa_get_key_algorithm(&attributes);
596    psa_reset_key_attributes(&attributes);
597
598    /* Export the public key and then import it in a new slot. */
599    PSA_ASSERT(psa_export_public_key(priv_id, pub_key_buf, sizeof(pub_key_buf), &pub_key_len));
600
601    /* Notes:
602     * - psa_import_key() automatically determines the key's bit length
603     *   from the provided key data. That's why psa_set_key_bits() is not used
604     *   below.
605     */
606    type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type);
607    usage &= ~PSA_KEY_USAGE_EXPORT;
608    psa_set_key_type(&attributes, type);
609    psa_set_key_usage_flags(&attributes, usage);
610    psa_set_key_algorithm(&attributes, alg);
611
612    PSA_ASSERT(psa_import_key(&attributes, pub_key_buf, pub_key_len, &pub_key));
613
614exit:
615    psa_reset_key_attributes(&attributes);
616    return pub_key;
617}
618
619/* Create a copy of a PSA key with same usage and algorithm policy and destroy
620 * the original one. */
621static mbedtls_svc_key_id_t psa_copy_and_destroy(mbedtls_svc_key_id_t orig_key_id)
622{
623    psa_key_attributes_t orig_attr = PSA_KEY_ATTRIBUTES_INIT;
624    psa_key_attributes_t new_attr = PSA_KEY_ATTRIBUTES_INIT;
625    mbedtls_svc_key_id_t new_key_id = MBEDTLS_SVC_KEY_ID_INIT;
626
627    PSA_ASSERT(psa_get_key_attributes(orig_key_id, &orig_attr));
628    psa_set_key_usage_flags(&new_attr, psa_get_key_usage_flags(&orig_attr));
629    psa_set_key_algorithm(&new_attr, psa_get_key_algorithm(&orig_attr));
630
631    PSA_ASSERT(psa_copy_key(orig_key_id, &new_attr, &new_key_id));
632    psa_destroy_key(orig_key_id);
633
634exit:
635    psa_reset_key_attributes(&orig_attr);
636    psa_reset_key_attributes(&new_attr);
637    return new_key_id;
638}
639#endif /* MBEDTLS_PSA_CRYPTO_C */
640/* END_HEADER */
641
642/* BEGIN_DEPENDENCIES
643 * depends_on:MBEDTLS_PK_C
644 * END_DEPENDENCIES
645 */
646
647/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
648void pk_psa_utils(int key_is_rsa)
649{
650    mbedtls_pk_context pk, pk2;
651    mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
652    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
653
654    const char * const name = "Opaque";
655    size_t bitlen;
656
657    mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
658    unsigned char b1[1], b2[1];
659    size_t len;
660    mbedtls_pk_debug_item dbg;
661
662    mbedtls_pk_init(&pk);
663    mbedtls_pk_init(&pk2);
664    USE_PSA_INIT();
665
666    TEST_ASSERT(mbedtls_pk_setup_opaque(&pk, MBEDTLS_SVC_KEY_ID_INIT) ==
667                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
668
669    mbedtls_pk_free(&pk);
670    mbedtls_pk_init(&pk);
671
672    if (key_is_rsa) {
673        bitlen = 1024;
674        PSA_ASSERT(pk_psa_setup(PSA_KEY_TYPE_RSA_KEY_PAIR, 1024, PSA_KEY_USAGE_SIGN_HASH,
675                                PSA_ALG_RSA_PKCS1V15_SIGN_RAW, PSA_ALG_NONE,
676                                MBEDTLS_SVC_KEY_ID_INIT, &key));
677    } else {
678        bitlen = 256;
679        PSA_ASSERT(pk_psa_setup(PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1), 256,
680                                PSA_KEY_USAGE_SIGN_HASH, PSA_ALG_ECDSA(PSA_ALG_SHA_256),
681                                PSA_ALG_NONE, MBEDTLS_SVC_KEY_ID_INIT, &key));
682    }
683    if (mbedtls_svc_key_id_is_null(key)) {
684        goto exit;
685    }
686
687    TEST_ASSERT(mbedtls_pk_setup_opaque(&pk, key) == 0);
688
689    TEST_ASSERT(mbedtls_pk_get_type(&pk) == MBEDTLS_PK_OPAQUE);
690    TEST_ASSERT(strcmp(mbedtls_pk_get_name(&pk), name) == 0);
691
692    TEST_ASSERT(mbedtls_pk_get_bitlen(&pk) == bitlen);
693    TEST_ASSERT(mbedtls_pk_get_len(&pk) == (bitlen + 7) / 8);
694
695    if (key_is_rsa) {
696        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECKEY) == 0);
697        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA) == 0);
698        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_RSA) == 1);
699    } else {
700        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECKEY) == 1);
701        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA) == 1);
702        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_RSA) == 0);
703    }
704
705    /* unsupported operations: verify, decrypt, encrypt */
706    if (key_is_rsa == 1) {
707        TEST_ASSERT(mbedtls_pk_verify(&pk, md_alg,
708                                      b1, sizeof(b1), b2, sizeof(b2))
709                    == MBEDTLS_ERR_PK_TYPE_MISMATCH);
710    } else {
711        TEST_ASSERT(mbedtls_pk_decrypt(&pk, b1, sizeof(b1),
712                                       b2, &len, sizeof(b2),
713                                       NULL, NULL)
714                    == MBEDTLS_ERR_PK_TYPE_MISMATCH);
715    }
716    TEST_ASSERT(mbedtls_pk_encrypt(&pk, b1, sizeof(b1),
717                                   b2, &len, sizeof(b2),
718                                   NULL, NULL)
719                == MBEDTLS_ERR_PK_TYPE_MISMATCH);
720
721    /* unsupported functions: check_pair, debug */
722    if (key_is_rsa) {
723        TEST_ASSERT(mbedtls_pk_setup(&pk2,
724                                     mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
725    } else {
726        TEST_ASSERT(mbedtls_pk_setup(&pk2,
727                                     mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)) == 0);
728    }
729    TEST_ASSERT(mbedtls_pk_check_pair(&pk, &pk2,
730                                      mbedtls_test_rnd_std_rand, NULL)
731                == MBEDTLS_ERR_PK_TYPE_MISMATCH);
732    TEST_ASSERT(mbedtls_pk_debug(&pk, &dbg)
733                == MBEDTLS_ERR_PK_TYPE_MISMATCH);
734
735    /* test that freeing the context does not destroy the key */
736    mbedtls_pk_free(&pk);
737    TEST_ASSERT(PSA_SUCCESS == psa_get_key_attributes(key, &attributes));
738    TEST_ASSERT(PSA_SUCCESS == psa_destroy_key(key));
739
740exit:
741    /*
742     * Key attributes may have been returned by psa_get_key_attributes()
743     * thus reset them as required.
744     */
745    psa_reset_key_attributes(&attributes);
746
747    mbedtls_pk_free(&pk);   /* redundant except upon error */
748    mbedtls_pk_free(&pk2);
749    USE_PSA_DONE();
750}
751/* END_CASE */
752
753/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
754void pk_can_do_ext(int opaque_key, int key_type, int key_usage, int key_alg,
755                   int key_alg2, int curve_or_keybits, int alg_check, int usage_check,
756                   int result)
757{
758    mbedtls_pk_context pk;
759    mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
760    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
761
762    mbedtls_pk_init(&pk);
763    USE_PSA_INIT();
764
765    if (opaque_key == 1) {
766        PSA_ASSERT(pk_psa_setup(key_type, curve_or_keybits, key_usage,
767                                key_alg, key_alg2, MBEDTLS_SVC_KEY_ID_INIT, &key));
768        if (mbedtls_svc_key_id_is_null(key)) {
769            goto exit;
770        }
771
772        TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, key), 0);
773
774        TEST_EQUAL(mbedtls_pk_get_type(&pk), MBEDTLS_PK_OPAQUE);
775    } else {
776        TEST_EQUAL(pk_setup(&pk, key_type, curve_or_keybits), 0);
777        TEST_EQUAL(mbedtls_pk_get_type(&pk), key_type);
778    }
779
780    TEST_EQUAL(mbedtls_pk_can_do_ext(&pk, alg_check, usage_check), result);
781
782exit:
783    psa_reset_key_attributes(&attributes);
784    PSA_ASSERT(psa_destroy_key(key));
785    mbedtls_pk_free(&pk);
786    USE_PSA_DONE();
787}
788/* END_CASE */
789
790/* BEGIN_CASE */
791void pk_invalid_param()
792{
793    mbedtls_pk_context ctx;
794    mbedtls_pk_type_t pk_type = 0;
795    unsigned char buf[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
796    size_t buf_size = sizeof(buf);
797
798    mbedtls_pk_init(&ctx);
799    USE_PSA_INIT();
800
801    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
802               mbedtls_pk_verify_restartable(&ctx, MBEDTLS_MD_NONE,
803                                             NULL, buf_size,
804                                             buf, buf_size,
805                                             NULL));
806    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
807               mbedtls_pk_verify_restartable(&ctx, MBEDTLS_MD_SHA256,
808                                             NULL, 0,
809                                             buf, buf_size,
810                                             NULL));
811    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
812               mbedtls_pk_verify_ext(pk_type, NULL,
813                                     &ctx, MBEDTLS_MD_NONE,
814                                     NULL, buf_size,
815                                     buf, buf_size));
816    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
817               mbedtls_pk_verify_ext(pk_type, NULL,
818                                     &ctx, MBEDTLS_MD_SHA256,
819                                     NULL, 0,
820                                     buf, buf_size));
821    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
822               mbedtls_pk_sign_restartable(&ctx, MBEDTLS_MD_NONE,
823                                           NULL, buf_size,
824                                           buf, buf_size, &buf_size,
825                                           NULL, NULL,
826                                           NULL));
827    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
828               mbedtls_pk_sign_restartable(&ctx, MBEDTLS_MD_SHA256,
829                                           NULL, 0,
830                                           buf, buf_size, &buf_size,
831                                           NULL, NULL,
832                                           NULL));
833    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
834               mbedtls_pk_sign_ext(pk_type, &ctx, MBEDTLS_MD_NONE,
835                                   NULL, buf_size,
836                                   buf, buf_size, &buf_size,
837                                   NULL, NULL));
838    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
839               mbedtls_pk_sign_ext(pk_type, &ctx, MBEDTLS_MD_SHA256,
840                                   NULL, 0,
841                                   buf, buf_size, &buf_size,
842                                   NULL, NULL));
843exit:
844    mbedtls_pk_free(&ctx);
845    USE_PSA_DONE();
846}
847/* END_CASE */
848
849/* BEGIN_CASE */
850void valid_parameters()
851{
852    mbedtls_pk_context pk;
853    unsigned char buf[1];
854    size_t len;
855    void *options = NULL;
856
857    mbedtls_pk_init(&pk);
858    USE_PSA_INIT();
859
860    TEST_ASSERT(mbedtls_pk_setup(&pk, NULL) ==
861                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
862
863    /* In informational functions, we accept NULL where a context pointer
864     * is expected because that's what the library has done forever.
865     * We do not document that NULL is accepted, so we may wish to change
866     * the behavior in a future version. */
867    TEST_ASSERT(mbedtls_pk_get_bitlen(NULL) == 0);
868    TEST_ASSERT(mbedtls_pk_get_len(NULL) == 0);
869    TEST_ASSERT(mbedtls_pk_can_do(NULL, MBEDTLS_PK_NONE) == 0);
870
871    TEST_ASSERT(mbedtls_pk_sign_restartable(&pk,
872                                            MBEDTLS_MD_NONE,
873                                            NULL, 0,
874                                            buf, sizeof(buf), &len,
875                                            mbedtls_test_rnd_std_rand, NULL,
876                                            NULL) ==
877                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
878
879    TEST_ASSERT(mbedtls_pk_sign(&pk,
880                                MBEDTLS_MD_NONE,
881                                NULL, 0,
882                                buf, sizeof(buf), &len,
883                                mbedtls_test_rnd_std_rand, NULL) ==
884                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
885
886    TEST_ASSERT(mbedtls_pk_sign_ext(MBEDTLS_PK_NONE, &pk,
887                                    MBEDTLS_MD_NONE,
888                                    NULL, 0,
889                                    buf, sizeof(buf), &len,
890                                    mbedtls_test_rnd_std_rand, NULL) ==
891                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
892
893    TEST_ASSERT(mbedtls_pk_verify_restartable(&pk,
894                                              MBEDTLS_MD_NONE,
895                                              NULL, 0,
896                                              buf, sizeof(buf),
897                                              NULL) ==
898                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
899
900    TEST_ASSERT(mbedtls_pk_verify(&pk,
901                                  MBEDTLS_MD_NONE,
902                                  NULL, 0,
903                                  buf, sizeof(buf)) ==
904                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
905
906    TEST_ASSERT(mbedtls_pk_verify_ext(MBEDTLS_PK_NONE, options,
907                                      &pk,
908                                      MBEDTLS_MD_NONE,
909                                      NULL, 0,
910                                      buf, sizeof(buf)) ==
911                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
912
913    TEST_ASSERT(mbedtls_pk_encrypt(&pk,
914                                   NULL, 0,
915                                   NULL, &len, 0,
916                                   mbedtls_test_rnd_std_rand, NULL) ==
917                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
918
919    TEST_ASSERT(mbedtls_pk_decrypt(&pk,
920                                   NULL, 0,
921                                   NULL, &len, 0,
922                                   mbedtls_test_rnd_std_rand, NULL) ==
923                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
924
925#if defined(MBEDTLS_PK_PARSE_C)
926    TEST_ASSERT(mbedtls_pk_parse_key(&pk, NULL, 0, NULL, 1,
927                                     mbedtls_test_rnd_std_rand, NULL) ==
928                MBEDTLS_ERR_PK_KEY_INVALID_FORMAT);
929
930    TEST_ASSERT(mbedtls_pk_parse_public_key(&pk, NULL, 0) ==
931                MBEDTLS_ERR_PK_KEY_INVALID_FORMAT);
932#endif /* MBEDTLS_PK_PARSE_C */
933    USE_PSA_DONE();
934}
935/* END_CASE */
936
937/* BEGIN_CASE depends_on:MBEDTLS_PK_WRITE_C:MBEDTLS_PK_PARSE_C */
938void valid_parameters_pkwrite(data_t *key_data)
939{
940    mbedtls_pk_context pk;
941
942    /* For the write tests to be effective, we need a valid key pair. */
943    mbedtls_pk_init(&pk);
944    USE_PSA_INIT();
945
946    TEST_ASSERT(mbedtls_pk_parse_key(&pk,
947                                     key_data->x, key_data->len, NULL, 0,
948                                     mbedtls_test_rnd_std_rand, NULL) == 0);
949
950    TEST_ASSERT(mbedtls_pk_write_key_der(&pk, NULL, 0) ==
951                MBEDTLS_ERR_ASN1_BUF_TOO_SMALL);
952
953    TEST_ASSERT(mbedtls_pk_write_pubkey_der(&pk, NULL, 0) ==
954                MBEDTLS_ERR_ASN1_BUF_TOO_SMALL);
955
956#if defined(MBEDTLS_PEM_WRITE_C)
957    TEST_ASSERT(mbedtls_pk_write_key_pem(&pk, NULL, 0) ==
958                MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
959
960    TEST_ASSERT(mbedtls_pk_write_pubkey_pem(&pk, NULL, 0) ==
961                MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
962#endif /* MBEDTLS_PEM_WRITE_C */
963
964exit:
965    mbedtls_pk_free(&pk);
966    USE_PSA_DONE();
967}
968/* END_CASE */
969
970/* BEGIN_CASE */
971void pk_utils(int type, int curve_or_keybits, int bitlen, int len, char *name)
972{
973    mbedtls_pk_context pk;
974
975    mbedtls_pk_init(&pk);
976    USE_PSA_INIT();
977
978    TEST_ASSERT(pk_setup(&pk, type, curve_or_keybits) == 0);
979
980    TEST_ASSERT((int) mbedtls_pk_get_type(&pk) == type);
981    TEST_ASSERT(mbedtls_pk_can_do(&pk, type));
982    TEST_ASSERT(mbedtls_pk_get_bitlen(&pk) == (unsigned) bitlen);
983    TEST_ASSERT(mbedtls_pk_get_len(&pk) == (unsigned) len);
984    TEST_ASSERT(strcmp(mbedtls_pk_get_name(&pk), name) == 0);
985
986exit:
987    mbedtls_pk_free(&pk);
988    USE_PSA_DONE();
989}
990/* END_CASE */
991
992/* BEGIN_CASE depends_on:MBEDTLS_PK_PARSE_C:MBEDTLS_FS_IO */
993void mbedtls_pk_check_pair(char *pub_file, char *prv_file, int ret)
994{
995    mbedtls_pk_context pub, prv, alt;
996#if defined(MBEDTLS_USE_PSA_CRYPTO)
997    mbedtls_svc_key_id_t opaque_key_id = MBEDTLS_SVC_KEY_ID_INIT;
998    psa_key_attributes_t opaque_key_attr = PSA_KEY_ATTRIBUTES_INIT;
999    int is_ec_key = 0;
1000#endif /* MBEDTLS_USE_PSA_CRYPTO */
1001
1002    mbedtls_pk_init(&pub);
1003    mbedtls_pk_init(&prv);
1004    mbedtls_pk_init(&alt);
1005    USE_PSA_INIT();
1006
1007#if defined(MBEDTLS_USE_PSA_CRYPTO)
1008    /* mbedtls_pk_check_pair() returns either PK or ECP error codes depending
1009       on MBEDTLS_USE_PSA_CRYPTO so here we dynamically translate between the
1010       two */
1011    if (ret == MBEDTLS_ERR_ECP_BAD_INPUT_DATA) {
1012        ret = MBEDTLS_ERR_PK_BAD_INPUT_DATA;
1013    }
1014#endif /* MBEDTLS_USE_PSA_CRYPTO */
1015
1016    TEST_ASSERT(mbedtls_pk_parse_public_keyfile(&pub, pub_file) == 0);
1017    TEST_ASSERT(mbedtls_pk_parse_keyfile(&prv, prv_file, NULL,
1018                                         mbedtls_test_rnd_std_rand, NULL)
1019                == 0);
1020
1021    TEST_ASSERT(mbedtls_pk_check_pair(&pub, &prv,
1022                                      mbedtls_test_rnd_std_rand, NULL)
1023                == ret);
1024
1025#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
1026    if (mbedtls_pk_get_type(&prv) == MBEDTLS_PK_RSA) {
1027        TEST_ASSERT(mbedtls_pk_setup_rsa_alt(&alt, mbedtls_pk_rsa(prv),
1028                                             mbedtls_rsa_decrypt_func, mbedtls_rsa_sign_func,
1029                                             mbedtls_rsa_key_len_func) == 0);
1030        TEST_ASSERT(mbedtls_pk_check_pair(&pub, &alt,
1031                                          mbedtls_test_rnd_std_rand, NULL)
1032                    == ret);
1033    }
1034#endif
1035#if defined(MBEDTLS_USE_PSA_CRYPTO)
1036    is_ec_key = (mbedtls_pk_get_type(&prv) == MBEDTLS_PK_ECKEY);
1037    /* Turn the prv PK context into an opaque one.*/
1038    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&prv, PSA_KEY_USAGE_SIGN_HASH,
1039                                             &opaque_key_attr), 0);
1040    TEST_EQUAL(mbedtls_pk_import_into_psa(&prv, &opaque_key_attr, &opaque_key_id), 0);
1041    mbedtls_pk_free(&prv);
1042    mbedtls_pk_init(&prv);
1043    TEST_EQUAL(mbedtls_pk_setup_opaque(&prv, opaque_key_id), 0);
1044    /* Test check_pair() between the opaque key we just created and the public PK counterpart.
1045     * Note: opaque EC keys support check_pair(), whereas RSA ones do not. */
1046    if (is_ec_key) {
1047        TEST_EQUAL(mbedtls_pk_check_pair(&pub, &prv, mbedtls_test_rnd_std_rand,
1048                                         NULL), ret);
1049    } else {
1050        TEST_EQUAL(mbedtls_pk_check_pair(&pub, &prv, mbedtls_test_rnd_std_rand,
1051                                         NULL), MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE);
1052    }
1053#endif
1054
1055exit:
1056#if defined(MBEDTLS_USE_PSA_CRYPTO)
1057    psa_destroy_key(opaque_key_id);
1058#endif /* MBEDTLS_USE_PSA_CRYPTO */
1059    mbedtls_pk_free(&pub);
1060    mbedtls_pk_free(&prv);
1061    mbedtls_pk_free(&alt);
1062    USE_PSA_DONE();
1063}
1064/* END_CASE */
1065
1066/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
1067void pk_rsa_verify_test_vec(data_t *message_str, int padding, int digest,
1068                            int mod, char *input_N, char *input_E,
1069                            data_t *result_str, int expected_result)
1070{
1071    mbedtls_rsa_context *rsa;
1072    mbedtls_pk_context pk;
1073    mbedtls_pk_restart_ctx *rs_ctx = NULL;
1074#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1075    mbedtls_pk_restart_ctx ctx;
1076
1077    rs_ctx = &ctx;
1078    mbedtls_pk_restart_init(rs_ctx);
1079    // this setting would ensure restart would happen if ECC was used
1080    mbedtls_ecp_set_max_ops(1);
1081#endif
1082
1083    mbedtls_pk_init(&pk);
1084    MD_OR_USE_PSA_INIT();
1085
1086    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1087    rsa = mbedtls_pk_rsa(pk);
1088
1089    rsa->len = (mod + 7) / 8;
1090    if (padding >= 0) {
1091        TEST_EQUAL(mbedtls_rsa_set_padding(rsa, padding, MBEDTLS_MD_NONE), 0);
1092    }
1093
1094    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->N, input_N) == 0);
1095    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->E, input_E) == 0);
1096
1097    int actual_result;
1098    actual_result = mbedtls_pk_verify(&pk, digest, message_str->x, 0,
1099                                      result_str->x, mbedtls_pk_get_len(&pk));
1100#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1101    if (actual_result == MBEDTLS_ERR_RSA_INVALID_PADDING &&
1102        expected_result == MBEDTLS_ERR_RSA_VERIFY_FAILED) {
1103        /* Tolerate INVALID_PADDING error for an invalid signature with
1104         * the legacy API (but not with PSA). */
1105    } else
1106#endif
1107    {
1108        TEST_EQUAL(actual_result, expected_result);
1109    }
1110
1111    actual_result = mbedtls_pk_verify_restartable(&pk, digest, message_str->x, 0,
1112                                                  result_str->x,
1113                                                  mbedtls_pk_get_len(&pk),
1114                                                  rs_ctx);
1115#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1116    if (actual_result == MBEDTLS_ERR_RSA_INVALID_PADDING &&
1117        expected_result == MBEDTLS_ERR_RSA_VERIFY_FAILED) {
1118        /* Tolerate INVALID_PADDING error for an invalid signature with
1119         * the legacy API (but not with PSA). */
1120    } else
1121#endif
1122    {
1123        TEST_EQUAL(actual_result, expected_result);
1124    }
1125
1126exit:
1127#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1128    mbedtls_pk_restart_free(rs_ctx);
1129#endif
1130    mbedtls_pk_free(&pk);
1131    MD_OR_USE_PSA_DONE();
1132}
1133/* END_CASE */
1134
1135/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
1136void pk_rsa_verify_ext_test_vec(data_t *message_str, int digest,
1137                                int mod, char *input_N,
1138                                char *input_E, data_t *result_str,
1139                                int pk_type, int mgf1_hash_id,
1140                                int salt_len, int sig_len,
1141                                int result)
1142{
1143    mbedtls_rsa_context *rsa;
1144    mbedtls_pk_context pk;
1145    mbedtls_pk_rsassa_pss_options pss_opts;
1146    void *options;
1147    int ret;
1148
1149    mbedtls_pk_init(&pk);
1150    MD_OR_USE_PSA_INIT();
1151
1152    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1153    rsa = mbedtls_pk_rsa(pk);
1154
1155    rsa->len = (mod + 7) / 8;
1156    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->N, input_N) == 0);
1157    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->E, input_E) == 0);
1158
1159
1160    if (mgf1_hash_id < 0) {
1161        options = NULL;
1162    } else {
1163        options = &pss_opts;
1164
1165        pss_opts.mgf1_hash_id = mgf1_hash_id;
1166        pss_opts.expected_salt_len = salt_len;
1167    }
1168
1169    ret = mbedtls_pk_verify_ext(pk_type, options, &pk,
1170                                digest, message_str->x, message_str->len,
1171                                result_str->x, sig_len);
1172
1173#if defined(MBEDTLS_USE_PSA_CRYPTO)
1174    if (result == MBEDTLS_ERR_RSA_INVALID_PADDING) {
1175        /* Mbed TLS distinguishes "invalid padding" from "valid padding but
1176         * the rest of the signature is invalid". This has little use in
1177         * practice and PSA doesn't report this distinction.
1178         * In this case, PSA returns PSA_ERROR_INVALID_SIGNATURE translated
1179         * to MBEDTLS_ERR_RSA_VERIFY_FAILED.
1180         * However, currently `mbedtls_pk_verify_ext()` may use either the
1181         * PSA or the Mbed TLS API, depending on the PSS options used.
1182         * So, it may return either INVALID_PADDING or INVALID_SIGNATURE.
1183         */
1184        TEST_ASSERT(ret == result || ret == MBEDTLS_ERR_RSA_VERIFY_FAILED);
1185    } else
1186#endif
1187    {
1188        TEST_EQUAL(ret, result);
1189    }
1190
1191exit:
1192    mbedtls_pk_free(&pk);
1193    MD_OR_USE_PSA_DONE();
1194}
1195/* END_CASE */
1196
1197/* BEGIN_CASE depends_on:MBEDTLS_PK_CAN_ECDSA_VERIFY */
1198void pk_ec_test_vec(int type, int id, data_t *key, data_t *hash,
1199                    data_t *sig, int ret)
1200{
1201    mbedtls_pk_context pk;
1202
1203    mbedtls_pk_init(&pk);
1204    USE_PSA_INIT();
1205
1206    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
1207
1208    TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA));
1209#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
1210    TEST_ASSERT(key->len <= MBEDTLS_PK_MAX_EC_PUBKEY_RAW_LEN);
1211    memcpy(pk.pub_raw, key->x, key->len);
1212    pk.ec_family = mbedtls_ecc_group_to_psa(id, &(pk.ec_bits));
1213    pk.pub_raw_len = key->len;
1214#else
1215    mbedtls_ecp_keypair *eckey = (mbedtls_ecp_keypair *) mbedtls_pk_ec(pk);
1216
1217    TEST_ASSERT(mbedtls_ecp_group_load(&eckey->grp, id) == 0);
1218    TEST_ASSERT(mbedtls_ecp_point_read_binary(&eckey->grp, &eckey->Q,
1219                                              key->x, key->len) == 0);
1220#endif
1221
1222    // MBEDTLS_MD_NONE is used since it will be ignored.
1223    TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_NONE,
1224                                  hash->x, hash->len, sig->x, sig->len) == ret);
1225
1226exit:
1227    mbedtls_pk_free(&pk);
1228    USE_PSA_DONE();
1229}
1230/* END_CASE */
1231
1232/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE:MBEDTLS_ECDSA_C:MBEDTLS_ECDSA_DETERMINISTIC */
1233void pk_sign_verify_restart(int pk_type, int grp_id, char *d_str,
1234                            char *QX_str, char *QY_str,
1235                            int md_alg, data_t *hash, data_t *sig_check,
1236                            int max_ops, int min_restart, int max_restart)
1237{
1238    int ret, cnt_restart;
1239    mbedtls_pk_restart_ctx rs_ctx;
1240    mbedtls_pk_context prv, pub;
1241    unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];
1242    size_t slen;
1243
1244    mbedtls_pk_restart_init(&rs_ctx);
1245    mbedtls_pk_init(&prv);
1246    mbedtls_pk_init(&pub);
1247    USE_PSA_INIT();
1248
1249    memset(sig, 0, sizeof(sig));
1250
1251    TEST_ASSERT(mbedtls_pk_setup(&prv, mbedtls_pk_info_from_type(pk_type)) == 0);
1252    TEST_ASSERT(mbedtls_ecp_group_load(&mbedtls_pk_ec_rw(prv)->grp, grp_id) == 0);
1253    TEST_ASSERT(mbedtls_test_read_mpi(&mbedtls_pk_ec_rw(prv)->d, d_str) == 0);
1254
1255    TEST_ASSERT(mbedtls_pk_setup(&pub, mbedtls_pk_info_from_type(pk_type)) == 0);
1256    TEST_ASSERT(mbedtls_ecp_group_load(&mbedtls_pk_ec_rw(pub)->grp, grp_id) == 0);
1257    TEST_ASSERT(mbedtls_ecp_point_read_string(&mbedtls_pk_ec_rw(pub)->Q, 16, QX_str, QY_str) == 0);
1258
1259    mbedtls_ecp_set_max_ops(max_ops);
1260
1261    slen = sizeof(sig);
1262    cnt_restart = 0;
1263    do {
1264        ret = mbedtls_pk_sign_restartable(&prv, md_alg, hash->x, hash->len,
1265                                          sig, sizeof(sig), &slen,
1266                                          mbedtls_test_rnd_std_rand, NULL,
1267                                          &rs_ctx);
1268    } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart);
1269
1270    TEST_ASSERT(ret == 0);
1271    TEST_ASSERT(slen == sig_check->len);
1272    TEST_ASSERT(memcmp(sig, sig_check->x, slen) == 0);
1273
1274    TEST_ASSERT(cnt_restart >= min_restart);
1275    TEST_ASSERT(cnt_restart <= max_restart);
1276
1277    cnt_restart = 0;
1278    do {
1279        ret = mbedtls_pk_verify_restartable(&pub, md_alg,
1280                                            hash->x, hash->len, sig, slen, &rs_ctx);
1281    } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart);
1282
1283    TEST_ASSERT(ret == 0);
1284    TEST_ASSERT(cnt_restart >= min_restart);
1285    TEST_ASSERT(cnt_restart <= max_restart);
1286
1287    sig[0]++;
1288    do {
1289        ret = mbedtls_pk_verify_restartable(&pub, md_alg,
1290                                            hash->x, hash->len, sig, slen, &rs_ctx);
1291    } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
1292    TEST_ASSERT(ret != 0);
1293    sig[0]--;
1294
1295    /* Do we leak memory when aborting? try verify then sign
1296     * This test only makes sense when we actually restart */
1297    if (min_restart > 0) {
1298        ret = mbedtls_pk_verify_restartable(&pub, md_alg,
1299                                            hash->x, hash->len, sig, slen, &rs_ctx);
1300        TEST_ASSERT(ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
1301        mbedtls_pk_restart_free(&rs_ctx);
1302
1303        slen = sizeof(sig);
1304        ret = mbedtls_pk_sign_restartable(&prv, md_alg, hash->x, hash->len,
1305                                          sig, sizeof(sig), &slen,
1306                                          mbedtls_test_rnd_std_rand, NULL,
1307                                          &rs_ctx);
1308        TEST_ASSERT(ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
1309    }
1310
1311exit:
1312    mbedtls_pk_restart_free(&rs_ctx);
1313    mbedtls_pk_free(&prv);
1314    mbedtls_pk_free(&pub);
1315    USE_PSA_DONE();
1316}
1317/* END_CASE */
1318
1319/* BEGIN_CASE depends_on:MBEDTLS_MD_CAN_SHA256:PK_CAN_SIGN_SOME */
1320void pk_sign_verify(int type, int curve_or_keybits, int rsa_padding, int rsa_md_alg,
1321                    int sign_ret, int verify_ret)
1322{
1323    mbedtls_pk_context pk;
1324    size_t sig_len;
1325    unsigned char hash[32]; // Hard-coded for SHA256
1326    size_t hash_len = sizeof(hash);
1327    unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
1328    void *rs_ctx = NULL;
1329#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1330    mbedtls_pk_restart_ctx ctx;
1331
1332    rs_ctx = &ctx;
1333    mbedtls_pk_restart_init(rs_ctx);
1334    /* This value is large enough that the operation will complete in one run.
1335     * See comments at the top of ecp_test_vect_restart in
1336     * test_suite_ecp.function for estimates of operation counts. */
1337    mbedtls_ecp_set_max_ops(42000);
1338#endif
1339
1340    mbedtls_pk_init(&pk);
1341    MD_OR_USE_PSA_INIT();
1342
1343    memset(hash, 0x2a, sizeof(hash));
1344    memset(sig, 0, sizeof(sig));
1345
1346    TEST_ASSERT(pk_setup(&pk, type, curve_or_keybits) == 0);
1347
1348#if defined(MBEDTLS_RSA_C)
1349    if (type == MBEDTLS_PK_RSA) {
1350        TEST_ASSERT(mbedtls_rsa_set_padding(mbedtls_pk_rsa(pk), rsa_padding, rsa_md_alg) == 0);
1351    }
1352#else
1353    (void) rsa_padding;
1354    (void) rsa_md_alg;
1355#endif /* MBEDTLS_RSA_C */
1356
1357    TEST_ASSERT(mbedtls_pk_sign_restartable(&pk, MBEDTLS_MD_SHA256,
1358                                            hash, hash_len,
1359                                            sig, sizeof(sig), &sig_len,
1360                                            mbedtls_test_rnd_std_rand, NULL,
1361                                            rs_ctx) == sign_ret);
1362    if (sign_ret == 0) {
1363        TEST_ASSERT(sig_len <= MBEDTLS_PK_SIGNATURE_MAX_SIZE);
1364    } else {
1365        sig_len = MBEDTLS_PK_SIGNATURE_MAX_SIZE;
1366    }
1367
1368    TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1369                                  hash, hash_len, sig, sig_len) == verify_ret);
1370
1371    if (verify_ret == 0) {
1372        hash[0]++;
1373        TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1374                                      hash, hash_len, sig, sig_len) != 0);
1375        hash[0]--;
1376
1377        sig[0]++;
1378        TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1379                                      hash, hash_len, sig, sig_len) != 0);
1380        sig[0]--;
1381    }
1382
1383    TEST_ASSERT(mbedtls_pk_sign(&pk, MBEDTLS_MD_SHA256, hash, hash_len,
1384                                sig, sizeof(sig), &sig_len,
1385                                mbedtls_test_rnd_std_rand,
1386                                NULL) == sign_ret);
1387    if (sign_ret == 0) {
1388        TEST_ASSERT(sig_len <= MBEDTLS_PK_SIGNATURE_MAX_SIZE);
1389    } else {
1390        sig_len = MBEDTLS_PK_SIGNATURE_MAX_SIZE;
1391    }
1392
1393    TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, MBEDTLS_MD_SHA256,
1394                                              hash, hash_len, sig, sig_len, rs_ctx) == verify_ret);
1395
1396    if (verify_ret == 0) {
1397        hash[0]++;
1398        TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, MBEDTLS_MD_SHA256,
1399                                                  hash, sizeof(hash), sig, sig_len, rs_ctx) != 0);
1400        hash[0]--;
1401
1402        sig[0]++;
1403        TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, MBEDTLS_MD_SHA256,
1404                                                  hash, sizeof(hash), sig, sig_len, rs_ctx) != 0);
1405        sig[0]--;
1406    }
1407
1408exit:
1409#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
1410    mbedtls_pk_restart_free(rs_ctx);
1411#endif
1412    mbedtls_pk_free(&pk);
1413    MD_OR_USE_PSA_DONE();
1414}
1415/* END_CASE */
1416
1417/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
1418void pk_rsa_encrypt_decrypt_test(data_t *message, int mod, int padding,
1419                                 char *input_P, char *input_Q,
1420                                 char *input_N, char *input_E,
1421                                 int ret)
1422{
1423    unsigned char output[300], result[300];
1424    mbedtls_test_rnd_pseudo_info rnd_info;
1425    mbedtls_mpi N, P, Q, E;
1426    mbedtls_rsa_context *rsa;
1427    mbedtls_pk_context pk;
1428    size_t olen, rlen;
1429
1430    mbedtls_pk_init(&pk);
1431    mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1432    mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
1433    MD_OR_USE_PSA_INIT();
1434
1435    memset(&rnd_info,  0, sizeof(mbedtls_test_rnd_pseudo_info));
1436    memset(output,     0, sizeof(output));
1437
1438    /* encryption test */
1439
1440    /* init pk-rsa context */
1441    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1442    rsa = mbedtls_pk_rsa(pk);
1443    mbedtls_rsa_set_padding(rsa, padding, MBEDTLS_MD_SHA1);
1444
1445    /* load public key */
1446    rsa->len = (mod + 7) / 8;
1447    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->N, input_N) == 0);
1448    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->E, input_E) == 0);
1449
1450    TEST_ASSERT(mbedtls_pk_encrypt(&pk, message->x, message->len,
1451                                   output, &olen, sizeof(output),
1452                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1453
1454    /* decryption test */
1455    mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1456    mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
1457
1458    /* init pk-rsa context */
1459    mbedtls_pk_free(&pk);
1460    TEST_ASSERT(mbedtls_pk_setup(&pk,
1461                                 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1462    rsa = mbedtls_pk_rsa(pk);
1463    mbedtls_rsa_set_padding(rsa, padding, MBEDTLS_MD_SHA1);
1464
1465    /* load public key */
1466    TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
1467    TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
1468
1469    /* load private key */
1470    TEST_ASSERT(mbedtls_test_read_mpi(&P, input_P) == 0);
1471    TEST_ASSERT(mbedtls_test_read_mpi(&Q, input_Q) == 0);
1472    TEST_ASSERT(mbedtls_rsa_import(rsa, &N, &P, &Q, NULL, &E) == 0);
1473    TEST_EQUAL(mbedtls_rsa_get_len(rsa), (mod + 7) / 8);
1474    TEST_ASSERT(mbedtls_rsa_complete(rsa) == 0);
1475
1476    TEST_EQUAL(mbedtls_pk_get_len(&pk), (mod + 7) / 8);
1477    TEST_EQUAL(mbedtls_pk_get_bitlen(&pk), mod);
1478
1479    memset(result, 0, sizeof(result));
1480    rlen = 0;
1481    TEST_ASSERT(mbedtls_pk_decrypt(&pk, output, olen,
1482                                   result, &rlen, sizeof(result),
1483                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1484    if (ret == 0) {
1485        TEST_ASSERT(rlen == message->len);
1486        TEST_ASSERT(memcmp(result, message->x, rlen) == 0);
1487    }
1488
1489exit:
1490    mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
1491    mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
1492    mbedtls_pk_free(&pk);
1493    MD_OR_USE_PSA_DONE();
1494}
1495/* END_CASE */
1496
1497/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
1498void pk_rsa_decrypt_test_vec(data_t *cipher, int mod, int padding, int md_alg,
1499                             char *input_P, char *input_Q,
1500                             char *input_N, char *input_E,
1501                             data_t *clear, int ret)
1502{
1503    unsigned char output[256];
1504    mbedtls_test_rnd_pseudo_info rnd_info;
1505    mbedtls_mpi N, P, Q, E;
1506    mbedtls_rsa_context *rsa;
1507    mbedtls_pk_context pk;
1508    size_t olen;
1509
1510    mbedtls_pk_init(&pk);
1511    mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1512    mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
1513    MD_OR_USE_PSA_INIT();
1514
1515    memset(&rnd_info,  0, sizeof(mbedtls_test_rnd_pseudo_info));
1516
1517    /* init pk-rsa context */
1518    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1519    rsa = mbedtls_pk_rsa(pk);
1520
1521    /* load public key */
1522    TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
1523    TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
1524
1525    /* load private key */
1526    TEST_ASSERT(mbedtls_test_read_mpi(&P, input_P) == 0);
1527    TEST_ASSERT(mbedtls_test_read_mpi(&Q, input_Q) == 0);
1528    TEST_ASSERT(mbedtls_rsa_import(rsa, &N, &P, &Q, NULL, &E) == 0);
1529    TEST_EQUAL(mbedtls_rsa_get_len(rsa), (mod + 7) / 8);
1530    TEST_ASSERT(mbedtls_rsa_complete(rsa) == 0);
1531
1532    TEST_EQUAL(mbedtls_pk_get_bitlen(&pk), mod);
1533    TEST_EQUAL(mbedtls_pk_get_len(&pk), (mod + 7) / 8);
1534
1535    /* set padding mode */
1536    if (padding >= 0) {
1537        TEST_EQUAL(mbedtls_rsa_set_padding(rsa, padding, md_alg), 0);
1538    }
1539
1540    /* decryption test */
1541    memset(output, 0, sizeof(output));
1542    olen = 0;
1543    TEST_ASSERT(mbedtls_pk_decrypt(&pk, cipher->x, cipher->len,
1544                                   output, &olen, sizeof(output),
1545                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1546    if (ret == 0) {
1547        TEST_ASSERT(olen == clear->len);
1548        TEST_ASSERT(memcmp(output, clear->x, olen) == 0);
1549    }
1550
1551exit:
1552    mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
1553    mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
1554    mbedtls_pk_free(&pk);
1555    MD_OR_USE_PSA_DONE();
1556}
1557/* END_CASE */
1558
1559/* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_USE_PSA_CRYPTO */
1560void pk_wrap_rsa_decrypt_test_vec(data_t *cipher, int mod,
1561                                  char *input_P, char *input_Q,
1562                                  char *input_N, char *input_E,
1563                                  int padding_mode,
1564                                  data_t *clear, int ret)
1565{
1566    unsigned char output[256];
1567    mbedtls_test_rnd_pseudo_info rnd_info;
1568    mbedtls_mpi N, P, Q, E;
1569    mbedtls_rsa_context *rsa;
1570    mbedtls_pk_context pk;
1571    mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
1572    psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
1573    size_t olen;
1574
1575    mbedtls_pk_init(&pk);
1576    mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1577    mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
1578    USE_PSA_INIT();
1579
1580    memset(&rnd_info,  0, sizeof(mbedtls_test_rnd_pseudo_info));
1581
1582    /* init pk-rsa context */
1583    TEST_EQUAL(mbedtls_pk_setup(&pk,
1584                                mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)), 0);
1585    rsa = mbedtls_pk_rsa(pk);
1586
1587    /* load public key */
1588    TEST_EQUAL(mbedtls_test_read_mpi(&N, input_N), 0);
1589    TEST_EQUAL(mbedtls_test_read_mpi(&E, input_E), 0);
1590
1591    /* load private key */
1592    TEST_EQUAL(mbedtls_test_read_mpi(&P, input_P), 0);
1593    TEST_EQUAL(mbedtls_test_read_mpi(&Q, input_Q), 0);
1594    TEST_EQUAL(mbedtls_rsa_import(rsa, &N, &P, &Q, NULL, &E), 0);
1595    TEST_EQUAL(mbedtls_rsa_get_len(rsa), (mod + 7) / 8);
1596    TEST_EQUAL(mbedtls_rsa_complete(rsa), 0);
1597
1598    /* Set padding mode */
1599    if (padding_mode == MBEDTLS_RSA_PKCS_V21) {
1600        TEST_EQUAL(mbedtls_rsa_set_padding(rsa, padding_mode, MBEDTLS_MD_SHA1), 0);
1601    }
1602
1603    /* Turn PK context into an opaque one. */
1604    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, PSA_KEY_USAGE_DECRYPT, &key_attr), 0);
1605    TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &key_attr, &key_id), 0);
1606    mbedtls_pk_free(&pk);
1607    mbedtls_pk_init(&pk);
1608    TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, key_id), 0);
1609
1610    TEST_EQUAL(mbedtls_pk_get_bitlen(&pk), mod);
1611
1612    /* decryption test */
1613    memset(output, 0, sizeof(output));
1614    olen = 0;
1615    TEST_EQUAL(mbedtls_pk_decrypt(&pk, cipher->x, cipher->len,
1616                                  output, &olen, sizeof(output),
1617                                  mbedtls_test_rnd_pseudo_rand, &rnd_info), ret);
1618    if (ret == 0) {
1619        TEST_EQUAL(olen, clear->len);
1620        TEST_EQUAL(memcmp(output, clear->x, olen), 0);
1621    }
1622
1623    TEST_EQUAL(PSA_SUCCESS, psa_destroy_key(key_id));
1624
1625exit:
1626    mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
1627    mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
1628    mbedtls_pk_free(&pk);
1629    USE_PSA_DONE();
1630}
1631/* END_CASE */
1632
1633/* BEGIN_CASE */
1634void pk_ec_nocrypt(int type)
1635{
1636    mbedtls_pk_context pk;
1637    unsigned char output[100];
1638    unsigned char input[100];
1639    mbedtls_test_rnd_pseudo_info rnd_info;
1640    size_t olen = 0;
1641    int ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
1642
1643    mbedtls_pk_init(&pk);
1644    USE_PSA_INIT();
1645
1646    memset(&rnd_info,  0, sizeof(mbedtls_test_rnd_pseudo_info));
1647    memset(output,     0, sizeof(output));
1648    memset(input,      0, sizeof(input));
1649
1650    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
1651
1652    TEST_ASSERT(mbedtls_pk_encrypt(&pk, input, sizeof(input),
1653                                   output, &olen, sizeof(output),
1654                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1655
1656    TEST_ASSERT(mbedtls_pk_decrypt(&pk, input, sizeof(input),
1657                                   output, &olen, sizeof(output),
1658                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1659
1660exit:
1661    mbedtls_pk_free(&pk);
1662    USE_PSA_DONE();
1663}
1664/* END_CASE */
1665
1666/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
1667void pk_rsa_overflow()
1668{
1669    mbedtls_pk_context pk;
1670    size_t hash_len = UINT_MAX + 1, sig_len = UINT_MAX + 1;
1671    unsigned char hash[50], sig[100];
1672
1673    mbedtls_pk_init(&pk);
1674    USE_PSA_INIT();
1675
1676    memset(hash, 0x2a, sizeof(hash));
1677    memset(sig, 0, sizeof(sig));
1678
1679    TEST_EQUAL(mbedtls_pk_setup(&pk,
1680                                mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)), 0);
1681
1682#if defined(MBEDTLS_PKCS1_V21)
1683    TEST_EQUAL(mbedtls_pk_verify_ext(MBEDTLS_PK_RSASSA_PSS, NULL, &pk,
1684                                     MBEDTLS_MD_NONE, hash, hash_len, sig, sig_len),
1685               MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1686#endif /* MBEDTLS_PKCS1_V21 */
1687
1688    TEST_EQUAL(mbedtls_pk_verify(&pk, MBEDTLS_MD_NONE, hash, hash_len,
1689                                 sig, sig_len),
1690               MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1691
1692#if defined(MBEDTLS_PKCS1_V21)
1693    TEST_EQUAL(mbedtls_pk_sign_ext(MBEDTLS_PK_RSASSA_PSS, &pk,
1694                                   MBEDTLS_MD_NONE, hash, hash_len,
1695                                   sig, sizeof(sig), &sig_len,
1696                                   mbedtls_test_rnd_std_rand, NULL),
1697               MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1698#endif /* MBEDTLS_PKCS1_V21 */
1699
1700    TEST_EQUAL(mbedtls_pk_sign(&pk, MBEDTLS_MD_NONE, hash, hash_len,
1701                               sig, sizeof(sig), &sig_len,
1702                               mbedtls_test_rnd_std_rand, NULL),
1703               MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1704
1705exit:
1706    mbedtls_pk_free(&pk);
1707    USE_PSA_DONE();
1708}
1709/* END_CASE */
1710
1711/* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_PK_RSA_ALT_SUPPORT */
1712void pk_rsa_alt()
1713{
1714    /*
1715     * An rsa_alt context can only do private operations (decrypt, sign).
1716     * Test it against the public operations (encrypt, verify) of a
1717     * corresponding rsa context.
1718     */
1719    mbedtls_rsa_context raw;
1720    mbedtls_pk_context rsa, alt;
1721    mbedtls_pk_debug_item dbg_items[10];
1722    unsigned char hash[50], sig[RSA_KEY_LEN];
1723    unsigned char msg[50], ciph[RSA_KEY_LEN], test[50];
1724    size_t sig_len, ciph_len, test_len;
1725    int ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
1726
1727    mbedtls_rsa_init(&raw);
1728    mbedtls_pk_init(&rsa);
1729    mbedtls_pk_init(&alt);
1730    USE_PSA_INIT();
1731
1732    memset(hash, 0x2a, sizeof(hash));
1733    memset(sig, 0, sizeof(sig));
1734    memset(msg, 0x2a, sizeof(msg));
1735    memset(ciph, 0, sizeof(ciph));
1736    memset(test, 0, sizeof(test));
1737
1738    /* Initialize PK RSA context with random key */
1739    TEST_ASSERT(pk_setup(&rsa, MBEDTLS_PK_RSA, RSA_KEY_SIZE) == 0);
1740
1741    /* Extract key to the raw rsa context */
1742    TEST_ASSERT(mbedtls_rsa_copy(&raw, mbedtls_pk_rsa(rsa)) == 0);
1743
1744    /* Initialize PK RSA_ALT context */
1745    TEST_ASSERT(mbedtls_pk_setup_rsa_alt(&alt, (void *) &raw,
1746                                         mbedtls_rsa_decrypt_func, mbedtls_rsa_sign_func,
1747                                         mbedtls_rsa_key_len_func) == 0);
1748
1749    /* Test administrative functions */
1750    TEST_ASSERT(mbedtls_pk_can_do(&alt, MBEDTLS_PK_RSA));
1751    TEST_ASSERT(mbedtls_pk_get_bitlen(&alt) == RSA_KEY_SIZE);
1752    TEST_ASSERT(mbedtls_pk_get_len(&alt) == RSA_KEY_LEN);
1753    TEST_ASSERT(mbedtls_pk_get_type(&alt) == MBEDTLS_PK_RSA_ALT);
1754    TEST_ASSERT(strcmp(mbedtls_pk_get_name(&alt), "RSA-alt") == 0);
1755
1756#if defined(MBEDTLS_PSA_CRYPTO_C)
1757    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1758    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&alt,
1759                                             PSA_KEY_USAGE_ENCRYPT,
1760                                             &attributes),
1761               MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE);
1762    mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
1763    TEST_EQUAL(mbedtls_pk_import_into_psa(&alt, &attributes, &key_id),
1764               MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE);
1765#endif /* MBEDTLS_PSA_CRYPTO_C */
1766
1767    /* Test signature */
1768#if SIZE_MAX > UINT_MAX
1769    TEST_ASSERT(mbedtls_pk_sign(&alt, MBEDTLS_MD_NONE, hash, SIZE_MAX,
1770                                sig, sizeof(sig), &sig_len,
1771                                mbedtls_test_rnd_std_rand, NULL)
1772                == MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1773#endif /* SIZE_MAX > UINT_MAX */
1774    TEST_ASSERT(mbedtls_pk_sign(&alt, MBEDTLS_MD_NONE, hash, sizeof(hash),
1775                                sig, sizeof(sig), &sig_len,
1776                                mbedtls_test_rnd_std_rand, NULL)
1777                == 0);
1778    TEST_ASSERT(sig_len == RSA_KEY_LEN);
1779    TEST_ASSERT(mbedtls_pk_verify(&rsa, MBEDTLS_MD_NONE,
1780                                  hash, sizeof(hash), sig, sig_len) == 0);
1781
1782    /* Test decrypt */
1783    TEST_ASSERT(mbedtls_pk_encrypt(&rsa, msg, sizeof(msg),
1784                                   ciph, &ciph_len, sizeof(ciph),
1785                                   mbedtls_test_rnd_std_rand, NULL) == 0);
1786    TEST_ASSERT(mbedtls_pk_decrypt(&alt, ciph, ciph_len,
1787                                   test, &test_len, sizeof(test),
1788                                   mbedtls_test_rnd_std_rand, NULL) == 0);
1789    TEST_ASSERT(test_len == sizeof(msg));
1790    TEST_ASSERT(memcmp(test, msg, test_len) == 0);
1791
1792    /* Test forbidden operations */
1793    TEST_ASSERT(mbedtls_pk_encrypt(&alt, msg, sizeof(msg),
1794                                   ciph, &ciph_len, sizeof(ciph),
1795                                   mbedtls_test_rnd_std_rand, NULL) == ret);
1796    TEST_ASSERT(mbedtls_pk_verify(&alt, MBEDTLS_MD_NONE,
1797                                  hash, sizeof(hash), sig, sig_len) == ret);
1798    TEST_ASSERT(mbedtls_pk_debug(&alt, dbg_items) == ret);
1799
1800exit:
1801    mbedtls_rsa_free(&raw);
1802    mbedtls_pk_free(&rsa); mbedtls_pk_free(&alt);
1803    USE_PSA_DONE();
1804}
1805/* END_CASE */
1806
1807/* BEGIN_CASE depends_on:MBEDTLS_PK_PARSE_C:MBEDTLS_MD_CAN_SHA256:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_TEST_PK_PSA_SIGN */
1808void pk_psa_sign(int psa_type, int bits, int rsa_padding)
1809{
1810    mbedtls_pk_context pk;
1811    unsigned char hash[32];
1812    unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
1813    unsigned char legacy_pub_key[MBEDTLS_PK_WRITE_PUBKEY_MAX_SIZE];
1814    unsigned char opaque_pub_key[MBEDTLS_PK_WRITE_PUBKEY_MAX_SIZE];
1815    size_t sig_len, legacy_pub_key_len, opaque_pub_key_len;
1816    mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
1817    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1818#if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_PK_WRITE_C)
1819    int ret;
1820#endif /* MBEDTLS_RSA_C || MBEDTLS_PK_WRITE_C */
1821#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
1822    mbedtls_ecp_group_id ecp_grp_id = MBEDTLS_ECP_DP_NONE;
1823#endif /* MBEDTLS_PK_CAN_ECDSA_SIGN */
1824
1825    /*
1826     * Following checks are perfomed:
1827     * - create an RSA/EC opaque context;
1828     * - sign with opaque context for both EC and RSA keys;
1829     * - [EC only] verify with opaque context;
1830     * - verify that public keys of opaque and non-opaque contexts match;
1831     * - verify with non-opaque context.
1832     */
1833
1834    mbedtls_pk_init(&pk);
1835    USE_PSA_INIT();
1836
1837    /* Create the legacy EC/RSA PK context. */
1838#if defined(MBEDTLS_RSA_C)
1839    if (PSA_KEY_TYPE_IS_RSA(psa_type)) {
1840        TEST_EQUAL(pk_setup(&pk, MBEDTLS_PK_RSA, bits), 0);
1841        TEST_EQUAL(mbedtls_rsa_set_padding(mbedtls_pk_rsa(pk), rsa_padding, MBEDTLS_MD_NONE), 0);
1842    }
1843#else /* MBEDTLS_RSA_C */
1844    (void) rsa_padding;
1845#endif /* MBEDTLS_RSA_C */
1846#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
1847    if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(psa_type)) {
1848        ecp_grp_id = mbedtls_ecc_group_from_psa(psa_type, bits);
1849        TEST_ASSERT(pk_setup(&pk, MBEDTLS_PK_ECKEY, ecp_grp_id) == 0);
1850    }
1851#endif /* MBEDTLS_PK_CAN_ECDSA_SIGN */
1852
1853    /* Export public key from the non-opaque PK context we just created. */
1854#if defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_PK_WRITE_C)
1855    ret = mbedtls_pk_write_pubkey_der(&pk, legacy_pub_key, sizeof(legacy_pub_key));
1856    TEST_ASSERT(ret >= 0);
1857    legacy_pub_key_len = (size_t) ret;
1858    /* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer so we
1859     * shift data back to the beginning of the buffer. */
1860    memmove(legacy_pub_key,
1861            legacy_pub_key + sizeof(legacy_pub_key) - legacy_pub_key_len,
1862            legacy_pub_key_len);
1863#else /* MBEDTLS_PK_PARSE_C && MBEDTLS_PK_WRITE_C */
1864#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
1865    if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(psa_type)) {
1866        TEST_EQUAL(mbedtls_ecp_point_write_binary(&(mbedtls_pk_ec_ro(pk)->grp),
1867                                                  &(mbedtls_pk_ec_ro(pk)->Q),
1868                                                  MBEDTLS_ECP_PF_UNCOMPRESSED,
1869                                                  &legacy_pub_key_len, legacy_pub_key,
1870                                                  sizeof(legacy_pub_key)), 0);
1871    }
1872#endif /* MBEDTLS_PK_CAN_ECDSA_SIGN */
1873#if defined(MBEDTLS_RSA_C)
1874    if (PSA_KEY_TYPE_IS_RSA(psa_type)) {
1875        unsigned char *end = legacy_pub_key + sizeof(legacy_pub_key);
1876        ret = mbedtls_rsa_write_pubkey(mbedtls_pk_rsa(pk), legacy_pub_key, &end);
1877        legacy_pub_key_len = (size_t) ret;
1878        TEST_ASSERT(legacy_pub_key_len > 0);
1879        /* mbedtls_rsa_write_pubkey() writes data backward in the buffer so
1880         * we shift that to the origin of the buffer instead. */
1881        memmove(legacy_pub_key, end, legacy_pub_key_len);
1882    }
1883#endif /* MBEDTLS_RSA_C */
1884#endif /* MBEDTLS_PK_PARSE_C && MBEDTLS_PK_WRITE_C */
1885
1886    /* Turn the PK context into an opaque one. */
1887    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, PSA_KEY_USAGE_SIGN_HASH, &attributes), 0);
1888    TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &key_id), 0);
1889    mbedtls_pk_free(&pk);
1890    mbedtls_pk_init(&pk);
1891    TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, key_id), 0);
1892
1893    PSA_ASSERT(psa_get_key_attributes(key_id, &attributes));
1894    TEST_EQUAL(psa_get_key_type(&attributes), (psa_key_type_t) psa_type);
1895    TEST_EQUAL(psa_get_key_bits(&attributes), (size_t) bits);
1896    TEST_EQUAL(psa_get_key_lifetime(&attributes), PSA_KEY_LIFETIME_VOLATILE);
1897
1898    /* Sign with the opaque context. */
1899    memset(hash, 0x2a, sizeof(hash));
1900    memset(sig, 0, sizeof(sig));
1901    TEST_ASSERT(mbedtls_pk_sign(&pk, MBEDTLS_MD_SHA256,
1902                                hash, sizeof(hash), sig, sizeof(sig), &sig_len,
1903                                NULL, NULL) == 0);
1904    /* Only opaque EC keys support verification. */
1905    if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(psa_type)) {
1906        TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1907                                      hash, sizeof(hash), sig, sig_len) == 0);
1908    }
1909
1910    /* Export public key from the opaque PK context. */
1911#if defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_PK_WRITE_C)
1912    ret = mbedtls_pk_write_pubkey_der(&pk, opaque_pub_key, sizeof(opaque_pub_key));
1913    TEST_ASSERT(ret >= 0);
1914    opaque_pub_key_len = (size_t) ret;
1915    /* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
1916    memmove(opaque_pub_key,
1917            opaque_pub_key + sizeof(opaque_pub_key) - opaque_pub_key_len,
1918            opaque_pub_key_len);
1919#else /* MBEDTLS_PK_PARSE_C && MBEDTLS_PK_WRITE_C */
1920    TEST_EQUAL(psa_export_public_key(key_id, opaque_pub_key, sizeof(opaque_pub_key),
1921                                     &opaque_pub_key_len), PSA_SUCCESS);
1922#endif /* MBEDTLS_PK_PARSE_C && MBEDTLS_PK_WRITE_C */
1923
1924    /* Check that the public keys of opaque and non-opaque PK contexts match. */
1925    TEST_EQUAL(opaque_pub_key_len, legacy_pub_key_len);
1926    TEST_MEMORY_COMPARE(opaque_pub_key, opaque_pub_key_len, legacy_pub_key, legacy_pub_key_len);
1927
1928    /* Destroy the opaque PK context and the wrapped PSA key. */
1929    mbedtls_pk_free(&pk);
1930    TEST_ASSERT(PSA_SUCCESS == psa_destroy_key(key_id));
1931
1932    /* Create a new non-opaque PK context to verify the signature. */
1933    mbedtls_pk_init(&pk);
1934#if defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_PK_WRITE_C)
1935    TEST_EQUAL(mbedtls_pk_parse_public_key(&pk, legacy_pub_key, legacy_pub_key_len), 0);
1936#else /* MBEDTLS_PK_PARSE_C && MBEDTLS_PK_WRITE_C */
1937#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
1938    if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(psa_type)) {
1939        TEST_EQUAL(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)), 0);
1940        TEST_EQUAL(mbedtls_ecp_group_load(&(mbedtls_pk_ec_rw(pk)->grp), ecp_grp_id), 0);
1941        TEST_EQUAL(mbedtls_ecp_point_read_binary(&(mbedtls_pk_ec_ro(pk)->grp),
1942                                                 &(mbedtls_pk_ec_rw(pk)->Q),
1943                                                 legacy_pub_key, legacy_pub_key_len), 0);
1944    }
1945#endif /* MBEDTLS_PK_CAN_ECDSA_SIGN */
1946#if defined(MBEDTLS_RSA_C)
1947    if (PSA_KEY_TYPE_IS_RSA(psa_type)) {
1948        TEST_EQUAL(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)), 0);
1949        TEST_EQUAL(mbedtls_rsa_parse_pubkey(mbedtls_pk_rsa(pk), legacy_pub_key,
1950                                            legacy_pub_key_len), 0);
1951    }
1952#endif /* MBEDTLS_RSA_C */
1953#endif /* MBEDTLS_PK_PARSE_C && MBEDTLS_PK_WRITE_C */
1954
1955#if defined(MBEDTLS_RSA_C)
1956    if (PSA_KEY_TYPE_IS_RSA(psa_type)) {
1957        TEST_EQUAL(mbedtls_rsa_set_padding(mbedtls_pk_rsa(pk), rsa_padding, MBEDTLS_MD_NONE), 0);
1958    }
1959#endif /* MBEDTLS_RSA_C */
1960    TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1961                                  hash, sizeof(hash), sig, sig_len) == 0);
1962
1963exit:
1964    psa_reset_key_attributes(&attributes);
1965
1966    mbedtls_pk_free(&pk);
1967    USE_PSA_DONE();
1968}
1969/* END_CASE */
1970
1971/* BEGIN_CASE */
1972void pk_sign_ext(int pk_type, int curve_or_keybits, int key_pk_type, int md_alg)
1973{
1974    mbedtls_pk_context pk;
1975    size_t sig_len;
1976    unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
1977    unsigned char hash[MBEDTLS_MD_MAX_SIZE];
1978    size_t hash_len = mbedtls_md_get_size_from_type(md_alg);
1979    void const *options = NULL;
1980    mbedtls_pk_rsassa_pss_options rsassa_pss_options;
1981    memset(hash, 0x2a, sizeof(hash));
1982    memset(sig, 0, sizeof(sig));
1983
1984    mbedtls_pk_init(&pk);
1985    MD_OR_USE_PSA_INIT();
1986
1987    TEST_EQUAL(pk_setup(&pk, pk_type, curve_or_keybits), 0);
1988
1989    TEST_EQUAL(mbedtls_pk_sign_ext(key_pk_type, &pk, md_alg, hash, hash_len,
1990                                   sig, sizeof(sig), &sig_len,
1991                                   mbedtls_test_rnd_std_rand, NULL), 0);
1992
1993    if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
1994        rsassa_pss_options.mgf1_hash_id = md_alg;
1995        TEST_ASSERT(hash_len != 0);
1996        rsassa_pss_options.expected_salt_len = hash_len;
1997        options = (const void *) &rsassa_pss_options;
1998    }
1999    TEST_EQUAL(mbedtls_pk_verify_ext(key_pk_type, options, &pk, md_alg,
2000                                     hash, hash_len, sig, sig_len), 0);
2001exit:
2002    mbedtls_pk_free(&pk);
2003    MD_OR_USE_PSA_DONE();
2004}
2005/* END_CASE */
2006
2007/* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_USE_PSA_CRYPTO */
2008void pk_psa_wrap_sign_ext(int pk_type, int key_bits, int key_pk_type, int md_alg)
2009{
2010    mbedtls_pk_context pk;
2011    size_t sig_len, pkey_len;
2012    mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
2013    psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
2014    unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
2015    unsigned char pkey[PSA_EXPORT_PUBLIC_KEY_MAX_SIZE];
2016    unsigned char *pkey_start;
2017    unsigned char hash[PSA_HASH_MAX_SIZE];
2018    psa_algorithm_t psa_md_alg = mbedtls_md_psa_alg_from_type(md_alg);
2019    size_t hash_len = PSA_HASH_LENGTH(psa_md_alg);
2020    void const *options = NULL;
2021    mbedtls_pk_rsassa_pss_options rsassa_pss_options;
2022    int ret;
2023
2024    mbedtls_pk_init(&pk);
2025    PSA_INIT();
2026
2027    /* Create legacy RSA public/private key in PK context. */
2028    mbedtls_pk_init(&pk);
2029    TEST_EQUAL(pk_setup(&pk, pk_type, key_bits), 0);
2030
2031    if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
2032        mbedtls_rsa_set_padding(mbedtls_pk_rsa(pk), MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_NONE);
2033    }
2034
2035    /* Export underlying public key for re-importing in a legacy context.
2036     * Note: mbedtls_rsa_write_key() writes backwards in the data buffer. */
2037    pkey_start = pkey + sizeof(pkey);
2038    ret = mbedtls_rsa_write_pubkey(mbedtls_pk_rsa(pk), pkey, &pkey_start);
2039    TEST_ASSERT(ret >= 0);
2040
2041    pkey_len = (size_t) ret;
2042    /* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
2043    pkey_start = pkey + sizeof(pkey) - pkey_len;
2044
2045    /* Turn PK context into an opaque one. */
2046    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, PSA_KEY_USAGE_SIGN_HASH, &key_attr), 0);
2047    TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &key_attr, &key_id), 0);
2048    mbedtls_pk_free(&pk);
2049    mbedtls_pk_init(&pk);
2050    TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, key_id), 0);
2051
2052    memset(hash, 0x2a, sizeof(hash));
2053    memset(sig, 0, sizeof(sig));
2054
2055#if defined(MBEDTLS_PKCS1_V21)
2056    /* Check that trying to use the wrong pk_type in sign_ext() results in a failure.
2057     * The PSA key was setup to use PKCS1 v1.5 signature algorithm, but here we try
2058     * to use it for PSS (PKCS1 v2.1) and it should fail. */
2059    if (key_pk_type == MBEDTLS_PK_RSA) {
2060        TEST_EQUAL(mbedtls_pk_sign_ext(MBEDTLS_PK_RSASSA_PSS, &pk, md_alg, hash, hash_len,
2061                                       sig, sizeof(sig), &sig_len,
2062                                       mbedtls_test_rnd_std_rand, NULL),
2063                   MBEDTLS_ERR_RSA_BAD_INPUT_DATA);
2064    }
2065#endif /* MBEDTLS_PKCS1_V21 */
2066
2067    /* Perform sign_ext() with the correct pk_type. */
2068    TEST_EQUAL(mbedtls_pk_sign_ext(key_pk_type, &pk, md_alg, hash, hash_len,
2069                                   sig, sizeof(sig), &sig_len,
2070                                   mbedtls_test_rnd_std_rand, NULL), 0);
2071
2072    /* verify_ext() is not supported when using an opaque context. */
2073    if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
2074        mbedtls_pk_rsassa_pss_options pss_opts = {
2075            .mgf1_hash_id = md_alg,
2076            .expected_salt_len = MBEDTLS_RSA_SALT_LEN_ANY,
2077        };
2078        TEST_EQUAL(mbedtls_pk_verify_ext(key_pk_type, &pss_opts, &pk, md_alg,
2079                                         hash, hash_len, sig, sig_len),
2080                   MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE);
2081    } else {
2082        TEST_EQUAL(mbedtls_pk_verify_ext(key_pk_type, NULL, &pk, md_alg,
2083                                         hash, hash_len, sig, sig_len),
2084                   MBEDTLS_ERR_PK_TYPE_MISMATCH);
2085    }
2086
2087    mbedtls_pk_free(&pk);
2088    TEST_EQUAL(PSA_SUCCESS, psa_destroy_key(key_id));
2089
2090    mbedtls_pk_init(&pk);
2091    TEST_EQUAL(mbedtls_pk_setup(&pk,
2092                                mbedtls_pk_info_from_type(pk_type)), 0);
2093    TEST_EQUAL(mbedtls_rsa_parse_pubkey(mbedtls_pk_rsa(pk), pkey_start, pkey_len), 0);
2094
2095    if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
2096        rsassa_pss_options.mgf1_hash_id = md_alg;
2097        TEST_ASSERT(hash_len != 0);
2098        rsassa_pss_options.expected_salt_len = hash_len;
2099        options = (const void *) &rsassa_pss_options;
2100    }
2101    TEST_EQUAL(mbedtls_pk_verify_ext(key_pk_type, options, &pk, md_alg,
2102                                     hash, hash_len, sig, sig_len), 0);
2103
2104exit:
2105    mbedtls_pk_free(&pk);
2106    PSA_DONE();
2107}
2108/* END_CASE */
2109
2110/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
2111void pk_get_psa_attributes(int pk_type, int from_pair,
2112                           int usage_arg,
2113                           int to_pair, int expected_alg)
2114{
2115    mbedtls_pk_context pk;
2116    mbedtls_pk_init(&pk);
2117    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2118    psa_key_usage_t usage = usage_arg;
2119    mbedtls_svc_key_id_t new_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2120
2121    PSA_INIT();
2122
2123    psa_key_type_t expected_psa_type = 0;
2124    TEST_EQUAL(pk_setup_for_type(pk_type, from_pair,
2125                                 &pk, &expected_psa_type), 0);
2126    if (!to_pair) {
2127        expected_psa_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(expected_psa_type);
2128    }
2129
2130    psa_key_lifetime_t lifetime = PSA_KEY_LIFETIME_VOLATILE; //TODO: diversity
2131    mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT; //TODO: diversity
2132    psa_set_key_id(&attributes, key_id);
2133    psa_set_key_lifetime(&attributes, lifetime);
2134    psa_set_key_enrollment_algorithm(&attributes, 42);
2135    psa_key_usage_t expected_usage = pk_get_psa_attributes_implied_usage(usage);
2136
2137#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
2138    /* When the resulting algorithm is ECDSA, the compile-time configuration
2139     * can cause it to be either deterministic or randomized ECDSA.
2140     * Rather than have two near-identical sets of test data depending on
2141     * the configuration, always use randomized in the test data and
2142     * tweak the expected result here. */
2143    if (expected_alg == PSA_ALG_ECDSA(PSA_ALG_ANY_HASH)) {
2144        expected_alg = PSA_ALG_DETERMINISTIC_ECDSA(PSA_ALG_ANY_HASH);
2145    }
2146#endif
2147
2148    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, usage, &attributes), 0);
2149
2150    TEST_EQUAL(psa_get_key_lifetime(&attributes), lifetime);
2151    TEST_ASSERT(mbedtls_svc_key_id_equal(psa_get_key_id(&attributes),
2152                                         key_id));
2153    TEST_EQUAL(psa_get_key_type(&attributes), expected_psa_type);
2154    TEST_EQUAL(psa_get_key_bits(&attributes),
2155               mbedtls_pk_get_bitlen(&pk));
2156    TEST_EQUAL(psa_get_key_usage_flags(&attributes), expected_usage);
2157    TEST_EQUAL(psa_get_key_algorithm(&attributes), expected_alg);
2158    TEST_EQUAL(psa_get_key_enrollment_algorithm(&attributes), PSA_ALG_NONE);
2159
2160    TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &new_key_id), 0);
2161    if (!mbedtls_test_key_consistency_psa_pk(new_key_id, &pk)) {
2162        goto exit;
2163    }
2164
2165exit:
2166    mbedtls_pk_free(&pk);
2167    psa_reset_key_attributes(&attributes);
2168    psa_destroy_key(new_key_id);
2169    PSA_DONE();
2170}
2171/* END_CASE */
2172
2173/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:MBEDTLS_RSA_C:MBEDTLS_PKCS1_V21 */
2174void pk_rsa_v21_get_psa_attributes(int md_type, int from_pair,
2175                                   int usage_arg,
2176                                   int to_pair, int expected_alg)
2177{
2178    mbedtls_pk_context pk;
2179    mbedtls_pk_init(&pk);
2180    psa_key_usage_t usage = usage_arg;
2181    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2182    mbedtls_svc_key_id_t new_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2183
2184    PSA_INIT();
2185
2186    psa_key_type_t expected_psa_type = 0;
2187    TEST_EQUAL(pk_setup_for_type(MBEDTLS_PK_RSA, from_pair,
2188                                 &pk, &expected_psa_type), 0);
2189    mbedtls_rsa_context *rsa = mbedtls_pk_rsa(pk);
2190    TEST_EQUAL(mbedtls_rsa_set_padding(rsa, MBEDTLS_RSA_PKCS_V21, md_type), 0);
2191    if (!to_pair) {
2192        expected_psa_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(expected_psa_type);
2193    }
2194    psa_key_usage_t expected_usage = pk_get_psa_attributes_implied_usage(usage);
2195
2196    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, usage, &attributes), 0);
2197
2198    TEST_EQUAL(psa_get_key_lifetime(&attributes), PSA_KEY_LIFETIME_VOLATILE);
2199    TEST_ASSERT(mbedtls_svc_key_id_equal(psa_get_key_id(&attributes),
2200                                         MBEDTLS_SVC_KEY_ID_INIT));
2201    TEST_EQUAL(psa_get_key_type(&attributes), expected_psa_type);
2202    TEST_EQUAL(psa_get_key_bits(&attributes),
2203               mbedtls_pk_get_bitlen(&pk));
2204    TEST_EQUAL(psa_get_key_usage_flags(&attributes), expected_usage);
2205    TEST_EQUAL(psa_get_key_algorithm(&attributes), expected_alg);
2206    TEST_EQUAL(psa_get_key_enrollment_algorithm(&attributes), PSA_ALG_NONE);
2207
2208    TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &new_key_id), 0);
2209    if (!mbedtls_test_key_consistency_psa_pk(new_key_id, &pk)) {
2210        goto exit;
2211    }
2212
2213exit:
2214    mbedtls_pk_free(&pk);
2215    psa_reset_key_attributes(&attributes);
2216    psa_destroy_key(new_key_id);
2217    PSA_DONE();
2218}
2219/* END_CASE */
2220
2221/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
2222void pk_get_psa_attributes_fail(int pk_type, int from_pair,
2223                                int usage_arg,
2224                                int expected_ret)
2225{
2226    mbedtls_pk_context pk;
2227    mbedtls_pk_init(&pk);
2228    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2229    psa_key_usage_t usage = usage_arg;
2230
2231    PSA_INIT();
2232
2233    psa_key_type_t expected_psa_type;
2234    TEST_EQUAL(pk_setup_for_type(pk_type, from_pair,
2235                                 &pk, &expected_psa_type), 0);
2236
2237    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, usage, &attributes),
2238               expected_ret);
2239
2240exit:
2241    mbedtls_pk_free(&pk);
2242    psa_reset_key_attributes(&attributes);
2243    PSA_DONE();
2244}
2245/* END_CASE */
2246
2247/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:MBEDTLS_TEST_PSA_ECC_AT_LEAST_ONE_CURVE:MBEDTLS_PSA_CRYPTO_STORAGE_C */
2248void pk_import_into_psa_lifetime(int from_opaque,
2249                                 int from_persistent, /* when from opaque */
2250                                 int from_exportable, /* when from opaque */
2251                                 int to_public,
2252                                 int to_persistent)
2253{
2254    mbedtls_pk_context pk;
2255    mbedtls_pk_init(&pk);
2256    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2257    mbedtls_svc_key_id_t old_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2258    mbedtls_svc_key_id_t new_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2259    mbedtls_svc_key_id_t expected_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2260    psa_key_lifetime_t expected_lifetime = PSA_KEY_LIFETIME_VOLATILE;
2261
2262    PSA_INIT();
2263
2264    if (from_opaque) {
2265#if defined(MBEDTLS_USE_PSA_CRYPTO)
2266        psa_key_type_t from_psa_type =
2267            PSA_KEY_TYPE_ECC_KEY_PAIR(MBEDTLS_TEST_PSA_ECC_ONE_FAMILY);
2268        psa_key_usage_t psa_key_usage =
2269            (from_exportable ? PSA_KEY_USAGE_EXPORT : PSA_KEY_USAGE_COPY) |
2270            PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH;
2271        mbedtls_svc_key_id_t persistent_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2272
2273        if (from_persistent) {
2274            persistent_key_id = mbedtls_svc_key_id_make(0, 1);
2275        }
2276
2277        PSA_ASSERT(pk_psa_setup(from_psa_type, MBEDTLS_TEST_PSA_ECC_ONE_CURVE_BITS,
2278                                psa_key_usage, PSA_ALG_ECDH, PSA_ALG_NONE,
2279                                persistent_key_id, &old_key_id));
2280        TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, old_key_id), 0);
2281        psa_reset_key_attributes(&attributes);
2282#else
2283        (void) from_persistent;
2284        (void) from_exportable;
2285        TEST_FAIL("Attempted to test opaque key without opaque key support");
2286#endif
2287    } else {
2288        psa_key_type_t psa_type_according_to_setup;
2289        TEST_EQUAL(pk_setup_for_type(MBEDTLS_PK_ECKEY, 1,
2290                                     &pk, &psa_type_according_to_setup), 0);
2291    }
2292
2293    if (to_persistent) {
2294        expected_key_id = mbedtls_svc_key_id_make(42, 2);
2295        psa_set_key_id(&attributes, expected_key_id);
2296        /* psa_set_key_id() sets the lifetime to PERSISTENT */
2297        expected_lifetime = PSA_KEY_LIFETIME_PERSISTENT;
2298    }
2299
2300    psa_key_usage_t to_usage =
2301        to_public ? PSA_KEY_USAGE_VERIFY_HASH : PSA_KEY_USAGE_SIGN_HASH;
2302    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, to_usage,
2303                                             &attributes), 0);
2304    /* mbedtls_pk_get_psa_attributes() is specified to not modify
2305     * the persistence attributes. */
2306    TEST_EQUAL(psa_get_key_lifetime(&attributes), expected_lifetime);
2307    TEST_EQUAL(MBEDTLS_SVC_KEY_ID_GET_KEY_ID(psa_get_key_id(&attributes)),
2308               MBEDTLS_SVC_KEY_ID_GET_KEY_ID(expected_key_id));
2309
2310    TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &new_key_id), 0);
2311    if (!mbedtls_test_key_consistency_psa_pk(new_key_id, &pk)) {
2312        goto exit;
2313    }
2314
2315    PSA_ASSERT(psa_get_key_attributes(new_key_id, &attributes));
2316    TEST_EQUAL(psa_get_key_lifetime(&attributes), expected_lifetime);
2317    /* Here expected_key_id=0 for a volatile key, but we expect
2318     * attributes to contain a dynamically assigned key id which we
2319     * can't predict. */
2320    if (to_persistent) {
2321        TEST_ASSERT(mbedtls_svc_key_id_equal(psa_get_key_id(&attributes),
2322                                             expected_key_id));
2323    }
2324
2325exit:
2326    mbedtls_pk_free(&pk);
2327    psa_reset_key_attributes(&attributes);
2328    psa_destroy_key(old_key_id);
2329    psa_destroy_key(new_key_id);
2330    PSA_DONE();
2331}
2332/* END_CASE */
2333
2334/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
2335void pk_get_psa_attributes_opaque(int from_type_arg, int from_bits_arg,
2336                                  int from_usage_arg, int from_alg_arg,
2337                                  int usage_arg,
2338                                  int expected_ret,
2339                                  int to_pair, int expected_usage_arg)
2340{
2341    mbedtls_pk_context pk;
2342    mbedtls_pk_init(&pk);
2343    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2344    mbedtls_svc_key_id_t old_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2345    psa_key_type_t from_type = from_type_arg;
2346    size_t bits = from_bits_arg;
2347    psa_key_usage_t from_usage = from_usage_arg;
2348    psa_algorithm_t alg = from_alg_arg;
2349    psa_key_usage_t usage = usage_arg;
2350    psa_key_usage_t expected_usage = expected_usage_arg;
2351    mbedtls_svc_key_id_t new_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2352
2353    PSA_INIT();
2354
2355    PSA_ASSERT(pk_psa_setup(from_type, bits, from_usage, alg, 42,
2356                            MBEDTLS_SVC_KEY_ID_INIT, &old_key_id));
2357    TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, old_key_id), 0);
2358
2359    psa_key_type_t expected_psa_type =
2360        to_pair ? from_type : PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(from_type);
2361
2362    TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, usage, &attributes),
2363               expected_ret);
2364
2365    if (expected_ret == 0) {
2366        TEST_EQUAL(psa_get_key_lifetime(&attributes), PSA_KEY_LIFETIME_VOLATILE);
2367        TEST_ASSERT(mbedtls_svc_key_id_equal(psa_get_key_id(&attributes),
2368                                             MBEDTLS_SVC_KEY_ID_INIT));
2369        TEST_EQUAL(psa_get_key_type(&attributes), expected_psa_type);
2370        TEST_EQUAL(psa_get_key_bits(&attributes), bits);
2371        TEST_EQUAL(psa_get_key_usage_flags(&attributes), expected_usage);
2372        TEST_EQUAL(psa_get_key_algorithm(&attributes), alg);
2373        TEST_EQUAL(psa_get_key_enrollment_algorithm(&attributes), PSA_ALG_NONE);
2374
2375        int expected_import_ret = 0;
2376        if (to_pair &&
2377            !(from_usage & (PSA_KEY_USAGE_COPY | PSA_KEY_USAGE_EXPORT))) {
2378            expected_import_ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
2379        }
2380        TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &new_key_id),
2381                   expected_import_ret);
2382        if (expected_import_ret == 0) {
2383            if (!mbedtls_test_key_consistency_psa_pk(new_key_id, &pk)) {
2384                goto exit;
2385            }
2386        }
2387    }
2388
2389exit:
2390    mbedtls_pk_free(&pk);
2391    psa_destroy_key(old_key_id);
2392    psa_destroy_key(new_key_id);
2393    psa_reset_key_attributes(&attributes);
2394    PSA_DONE();
2395}
2396/* END_CASE */
2397
2398/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
2399void pk_import_into_psa_fail(int pk_type, int from_pair,
2400                             int type_arg, int bits_arg,
2401                             int expected_ret)
2402{
2403    mbedtls_pk_context pk;
2404    mbedtls_pk_init(&pk);
2405    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2406    psa_key_type_t type = type_arg;
2407    size_t bits = bits_arg;
2408    mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make(0, 42);
2409
2410    PSA_INIT();
2411
2412    psa_key_type_t expected_psa_type;
2413    TEST_EQUAL(pk_setup_for_type(pk_type, from_pair,
2414                                 &pk, &expected_psa_type), 0);
2415
2416    psa_set_key_type(&attributes, type);
2417    psa_set_key_bits(&attributes, bits);
2418
2419    TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &key_id),
2420               expected_ret);
2421    TEST_ASSERT(mbedtls_svc_key_id_equal(key_id, MBEDTLS_SVC_KEY_ID_INIT));
2422
2423exit:
2424    psa_destroy_key(key_id);
2425    mbedtls_pk_free(&pk);
2426    psa_reset_key_attributes(&attributes);
2427    PSA_DONE();
2428}
2429/* END_CASE */
2430
2431/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
2432void pk_import_into_psa_opaque(int from_type, int from_bits,
2433                               int from_usage, int from_alg,
2434                               int to_type, int to_bits,
2435                               int to_usage, int to_alg,
2436                               int expected_ret)
2437{
2438    mbedtls_pk_context pk;
2439    mbedtls_pk_init(&pk);
2440    psa_key_attributes_t from_attributes = PSA_KEY_ATTRIBUTES_INIT;
2441    mbedtls_svc_key_id_t from_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2442    psa_key_attributes_t to_attributes = PSA_KEY_ATTRIBUTES_INIT;
2443    mbedtls_svc_key_id_t to_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2444    psa_key_attributes_t actual_attributes = PSA_KEY_ATTRIBUTES_INIT;
2445
2446    PSA_INIT();
2447
2448    PSA_ASSERT(pk_psa_setup(from_type, from_bits, from_usage, from_alg, PSA_ALG_NONE,
2449                            MBEDTLS_SVC_KEY_ID_INIT, &from_key_id));
2450    TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, from_key_id), 0);
2451
2452    psa_set_key_type(&to_attributes, to_type);
2453    psa_set_key_bits(&to_attributes, to_bits);
2454    psa_set_key_usage_flags(&to_attributes, to_usage);
2455    psa_set_key_algorithm(&to_attributes, to_alg);
2456
2457    TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &to_attributes, &to_key_id),
2458               expected_ret);
2459
2460    if (expected_ret == 0) {
2461        PSA_ASSERT(psa_get_key_attributes(to_key_id, &actual_attributes));
2462        TEST_EQUAL(to_type, psa_get_key_type(&actual_attributes));
2463        if (to_bits != 0) {
2464            TEST_EQUAL(to_bits, psa_get_key_bits(&actual_attributes));
2465        }
2466        TEST_EQUAL(to_alg, psa_get_key_algorithm(&actual_attributes));
2467        psa_key_usage_t expected_usage = to_usage;
2468        if (expected_usage & PSA_KEY_USAGE_SIGN_HASH) {
2469            expected_usage |= PSA_KEY_USAGE_SIGN_MESSAGE;
2470        }
2471        if (expected_usage & PSA_KEY_USAGE_VERIFY_HASH) {
2472            expected_usage |= PSA_KEY_USAGE_VERIFY_MESSAGE;
2473        }
2474        TEST_EQUAL(expected_usage, psa_get_key_usage_flags(&actual_attributes));
2475        if (!mbedtls_test_key_consistency_psa_pk(to_key_id, &pk)) {
2476            goto exit;
2477        }
2478    } else {
2479        TEST_ASSERT(mbedtls_svc_key_id_equal(to_key_id, MBEDTLS_SVC_KEY_ID_INIT));
2480    }
2481
2482exit:
2483    mbedtls_pk_free(&pk);
2484    psa_destroy_key(from_key_id);
2485    psa_destroy_key(to_key_id);
2486    psa_reset_key_attributes(&from_attributes);
2487    psa_reset_key_attributes(&to_attributes);
2488    psa_reset_key_attributes(&actual_attributes);
2489    PSA_DONE();
2490}
2491/* END_CASE */
2492
2493/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C*/
2494void pk_copy_from_psa_fail(void)
2495{
2496    mbedtls_pk_context pk_ctx;
2497    mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
2498
2499    mbedtls_pk_init(&pk_ctx);
2500    PSA_INIT();
2501
2502    /* Null pk pointer. */
2503    TEST_EQUAL(mbedtls_pk_copy_from_psa(key_id, NULL),
2504               MBEDTLS_ERR_PK_BAD_INPUT_DATA);
2505    TEST_EQUAL(mbedtls_pk_copy_public_from_psa(key_id, NULL),
2506               MBEDTLS_ERR_PK_BAD_INPUT_DATA);
2507
2508    /* Invalid key ID. */
2509    TEST_EQUAL(mbedtls_pk_copy_from_psa(mbedtls_svc_key_id_make(0, 0), &pk_ctx),
2510               MBEDTLS_ERR_PK_BAD_INPUT_DATA);
2511    TEST_EQUAL(mbedtls_pk_copy_public_from_psa(mbedtls_svc_key_id_make(0, 0), &pk_ctx),
2512               MBEDTLS_ERR_PK_BAD_INPUT_DATA);
2513
2514#if defined(PSA_WANT_KEY_TYPE_DH_KEY_PAIR_GENERATE)
2515    pk_psa_setup(PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919), 2048,
2516                 PSA_KEY_USAGE_EXPORT, PSA_ALG_NONE, PSA_ALG_NONE,
2517                 MBEDTLS_SVC_KEY_ID_INIT, &key_id);
2518    TEST_EQUAL(mbedtls_pk_copy_from_psa(key_id, &pk_ctx), MBEDTLS_ERR_PK_BAD_INPUT_DATA);
2519    TEST_EQUAL(mbedtls_pk_copy_public_from_psa(key_id, &pk_ctx), MBEDTLS_ERR_PK_BAD_INPUT_DATA);
2520    psa_destroy_key(key_id);
2521#endif /* PSA_WANT_KEY_TYPE_DH_KEY_PAIR_GENERATE */
2522
2523#if defined(MBEDTLS_PK_HAVE_ECC_KEYS) && defined(PSA_WANT_ECC_SECP_R1_256)
2524    /* Generate an EC key which cannot be exported. */
2525    PSA_ASSERT(pk_psa_setup(PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1), 256,
2526                            0, PSA_ALG_NONE, PSA_ALG_NONE, MBEDTLS_SVC_KEY_ID_INIT, &key_id));
2527    TEST_EQUAL(mbedtls_pk_copy_from_psa(key_id, &pk_ctx), MBEDTLS_ERR_PK_TYPE_MISMATCH);
2528    psa_destroy_key(key_id);
2529#endif /* MBEDTLS_PK_HAVE_ECC_KEYS && PSA_WANT_ECC_SECP_R1_256 */
2530
2531exit:
2532    mbedtls_pk_free(&pk_ctx);
2533    psa_destroy_key(key_id);
2534    PSA_DONE();
2535}
2536/* END_CASE */
2537
2538/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN:MBEDTLS_PSA_ACCEL_KEY_TYPE_RSA_KEY_PAIR_BASIC:!MBEDTLS_RSA_C */
2539void pk_copy_from_psa_builtin_fail()
2540{
2541    mbedtls_pk_context pk_ctx;
2542    mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
2543
2544    mbedtls_pk_init(&pk_ctx);
2545    PSA_INIT();
2546
2547    PSA_ASSERT(pk_psa_setup(PSA_KEY_TYPE_RSA_KEY_PAIR,
2548                            PSA_VENDOR_RSA_GENERATE_MIN_KEY_BITS,
2549                            PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_EXPORT,
2550                            PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_256),
2551                            PSA_ALG_NONE,
2552                            MBEDTLS_SVC_KEY_ID_INIT, &key_id));
2553    TEST_EQUAL(mbedtls_pk_copy_from_psa(key_id, &pk_ctx), MBEDTLS_ERR_PK_BAD_INPUT_DATA);
2554exit:
2555    mbedtls_pk_free(&pk_ctx);
2556    psa_destroy_key(key_id);
2557    PSA_DONE();
2558}
2559/* END_CASE */
2560
2561/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C*/
2562void pk_copy_from_psa_success(data_t *priv_key_data, int key_type_arg,
2563                              int key_alg_arg)
2564{
2565    psa_key_type_t key_type = key_type_arg;
2566    psa_algorithm_t key_alg = key_alg_arg;
2567    psa_key_usage_t key_usage = PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH |
2568                                PSA_KEY_USAGE_EXPORT | PSA_KEY_USAGE_COPY;
2569    mbedtls_pk_context pk_priv, pk_priv_copy_public, pk_pub, pk_pub_copy_public;
2570    mbedtls_svc_key_id_t priv_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2571    mbedtls_svc_key_id_t pub_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2572
2573    mbedtls_pk_init(&pk_priv);
2574    mbedtls_pk_init(&pk_priv_copy_public);
2575    mbedtls_pk_init(&pk_pub);
2576    mbedtls_pk_init(&pk_pub_copy_public);
2577    PSA_INIT();
2578
2579    if (key_type == PSA_KEY_TYPE_RSA_KEY_PAIR) {
2580        key_usage |= PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT;
2581    }
2582
2583    /* Create both a private key and its public counterpart in PSA. */
2584    PSA_ASSERT(pk_psa_import_key(priv_key_data->x, priv_key_data->len,
2585                                 key_type, key_usage, key_alg, &priv_key_id));
2586    pub_key_id = psa_pub_key_from_priv(priv_key_id);
2587
2588    /* Create 4 PK contexts starting from the PSA keys we just created. */
2589    TEST_EQUAL(mbedtls_pk_copy_from_psa(priv_key_id, &pk_priv), 0);
2590    TEST_EQUAL(mbedtls_pk_copy_public_from_psa(priv_key_id, &pk_priv_copy_public), 0);
2591    TEST_EQUAL(mbedtls_pk_copy_from_psa(pub_key_id, &pk_pub), 0);
2592    TEST_EQUAL(mbedtls_pk_copy_public_from_psa(pub_key_id, &pk_pub_copy_public), 0);
2593
2594    /* Destroy both PSA keys to prove that generated PK contexts are independent
2595     * from them. */
2596    priv_key_id = psa_copy_and_destroy(priv_key_id);
2597    pub_key_id = psa_copy_and_destroy(pub_key_id);
2598
2599    /* - Check that the generated PK contexts are of the correct type.
2600     * - [Only for RSA] check that the padding mode is correct.
2601     */
2602    if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(key_type)) {
2603        TEST_EQUAL(mbedtls_pk_get_type(&pk_priv), MBEDTLS_PK_ECKEY);
2604        TEST_EQUAL(mbedtls_pk_get_type(&pk_pub), MBEDTLS_PK_ECKEY);
2605    } else {
2606        TEST_EQUAL(mbedtls_pk_get_type(&pk_priv), MBEDTLS_PK_RSA);
2607        TEST_EQUAL(mbedtls_pk_get_type(&pk_pub), MBEDTLS_PK_RSA);
2608#if defined(MBEDTLS_RSA_C)
2609        mbedtls_rsa_context *rsa_priv = mbedtls_pk_rsa(pk_priv);
2610        mbedtls_rsa_context *rsa_pub = mbedtls_pk_rsa(pk_pub);
2611        if (PSA_ALG_IS_RSA_OAEP(key_alg) || PSA_ALG_IS_RSA_PSS(key_alg)) {
2612            TEST_EQUAL(mbedtls_rsa_get_padding_mode(rsa_priv), MBEDTLS_RSA_PKCS_V21);
2613            TEST_EQUAL(mbedtls_rsa_get_padding_mode(rsa_pub), MBEDTLS_RSA_PKCS_V21);
2614        } else {
2615            TEST_EQUAL(mbedtls_rsa_get_padding_mode(rsa_priv), MBEDTLS_RSA_PKCS_V15);
2616            TEST_EQUAL(mbedtls_rsa_get_padding_mode(rsa_pub), MBEDTLS_RSA_PKCS_V15);
2617        }
2618#endif /* MBEDTLS_RSA_C */
2619    }
2620
2621    /* Check that generated private/public PK contexts form a valid private/public key pair. */
2622    TEST_EQUAL(mbedtls_pk_check_pair(&pk_pub, &pk_priv, mbedtls_test_rnd_std_rand, NULL), 0);
2623
2624    /* Check consistency between copied PSA keys and generated PK contexts. */
2625    TEST_EQUAL(mbedtls_test_key_consistency_psa_pk(priv_key_id, &pk_priv), 1);
2626    TEST_EQUAL(mbedtls_test_key_consistency_psa_pk(priv_key_id, &pk_pub), 1);
2627    TEST_EQUAL(mbedtls_test_key_consistency_psa_pk(pub_key_id, &pk_priv), 1);
2628    TEST_EQUAL(mbedtls_test_key_consistency_psa_pk(pub_key_id, &pk_pub), 1);
2629
2630    /* Test that the keys from mbedtls_pk_copy_public_from_psa() are identical
2631     * to the public keys from mbedtls_pk_copy_from_psa(). */
2632    mbedtls_test_set_step(1);
2633    TEST_ASSERT(pk_public_same(&pk_pub, &pk_priv_copy_public));
2634    mbedtls_test_set_step(2);
2635    TEST_ASSERT(pk_public_same(&pk_pub, &pk_pub_copy_public));
2636
2637exit:
2638    mbedtls_pk_free(&pk_priv);
2639    mbedtls_pk_free(&pk_priv_copy_public);
2640    mbedtls_pk_free(&pk_pub);
2641    mbedtls_pk_free(&pk_pub_copy_public);
2642    psa_destroy_key(priv_key_id);
2643    psa_destroy_key(pub_key_id);
2644    PSA_DONE();
2645}
2646/* END_CASE */
2647
2648/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C*/
2649void pk_copy_public_from_psa(data_t *priv_key_data, int key_type_arg)
2650{
2651    psa_key_type_t key_type = key_type_arg;
2652    mbedtls_pk_context pk_from_exportable;
2653    mbedtls_pk_init(&pk_from_exportable);
2654    mbedtls_pk_context pk_from_non_exportable;
2655    mbedtls_pk_init(&pk_from_non_exportable);
2656    mbedtls_pk_context pk_private;
2657    mbedtls_pk_init(&pk_private);
2658    mbedtls_svc_key_id_t non_exportable_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2659    mbedtls_svc_key_id_t exportable_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2660
2661    PSA_INIT();
2662
2663    PSA_ASSERT(pk_psa_import_key(priv_key_data->x, priv_key_data->len,
2664                                 key_type,
2665                                 PSA_KEY_USAGE_EXPORT,
2666                                 PSA_ALG_NONE,
2667                                 &exportable_key_id));
2668    PSA_ASSERT(pk_psa_import_key(priv_key_data->x, priv_key_data->len,
2669                                 key_type,
2670                                 0,
2671                                 PSA_ALG_NONE,
2672                                 &non_exportable_key_id));
2673
2674    TEST_EQUAL(mbedtls_pk_copy_public_from_psa(exportable_key_id,
2675                                               &pk_from_exportable), 0);
2676    TEST_EQUAL(mbedtls_pk_copy_public_from_psa(non_exportable_key_id,
2677                                               &pk_from_non_exportable), 0);
2678
2679    /* Check that the non-exportable key really is non-exportable */
2680    TEST_EQUAL(mbedtls_pk_copy_from_psa(non_exportable_key_id, &pk_private),
2681               MBEDTLS_ERR_PK_TYPE_MISMATCH);
2682
2683    psa_destroy_key(exportable_key_id);
2684    psa_destroy_key(non_exportable_key_id);
2685
2686    /* The goal of this test function is mostly to check that
2687     * mbedtls_pk_copy_public_from_psa works with a non-exportable key pair.
2688     * We check that the resulting key is the same as for an exportable
2689     * key pair. We rely on pk_copy_from_psa_success tests to validate that
2690     * the result is correct. */
2691    TEST_ASSERT(pk_public_same(&pk_from_non_exportable, &pk_from_exportable));
2692
2693exit:
2694    mbedtls_pk_free(&pk_from_non_exportable);
2695    mbedtls_pk_free(&pk_from_exportable);
2696    mbedtls_pk_free(&pk_private);
2697    psa_destroy_key(exportable_key_id);
2698    psa_destroy_key(non_exportable_key_id);
2699    PSA_DONE();
2700}
2701/* END_CASE */
2702