xref: /aosp_15_r20/external/mbedtls/tests/suites/test_suite_pk.function (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi/* BEGIN_HEADER */
2*62c56f98SSadaf Ebrahimi#include "mbedtls/pk.h"
3*62c56f98SSadaf Ebrahimi#include "pk_internal.h"
4*62c56f98SSadaf Ebrahimi
5*62c56f98SSadaf Ebrahimi/* For error codes */
6*62c56f98SSadaf Ebrahimi#include "mbedtls/asn1.h"
7*62c56f98SSadaf Ebrahimi#include "mbedtls/base64.h"
8*62c56f98SSadaf Ebrahimi#include "mbedtls/ecp.h"
9*62c56f98SSadaf Ebrahimi#include "mbedtls/rsa.h"
10*62c56f98SSadaf Ebrahimi#include "pk_internal.h"
11*62c56f98SSadaf Ebrahimi
12*62c56f98SSadaf Ebrahimi#include <limits.h>
13*62c56f98SSadaf Ebrahimi#include <stdint.h>
14*62c56f98SSadaf Ebrahimi
15*62c56f98SSadaf Ebrahimi/* Needed only for test case data under #if defined(MBEDTLS_USE_PSA_CRYPTO),
16*62c56f98SSadaf Ebrahimi * but the test code generator requires test case data to be valid C code
17*62c56f98SSadaf Ebrahimi * unconditionally (https://github.com/Mbed-TLS/mbedtls/issues/2023). */
18*62c56f98SSadaf Ebrahimi#include "psa/crypto.h"
19*62c56f98SSadaf Ebrahimi#include "md_psa.h"
20*62c56f98SSadaf Ebrahimi
21*62c56f98SSadaf Ebrahimi/* Used for properly sizing the key buffer in pk_genkey_ec() */
22*62c56f98SSadaf Ebrahimi#include "psa_util_internal.h"
23*62c56f98SSadaf Ebrahimi
24*62c56f98SSadaf Ebrahimi#define RSA_KEY_SIZE   MBEDTLS_RSA_GEN_KEY_MIN_BITS
25*62c56f98SSadaf Ebrahimi#define RSA_KEY_LEN   (MBEDTLS_RSA_GEN_KEY_MIN_BITS/8)
26*62c56f98SSadaf Ebrahimi
27*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
28*62c56f98SSadaf Ebrahimistatic int pk_genkey_ec(mbedtls_pk_context *pk, mbedtls_ecp_group_id grp_id)
29*62c56f98SSadaf Ebrahimi{
30*62c56f98SSadaf Ebrahimi    psa_status_t status;
31*62c56f98SSadaf Ebrahimi    psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
32*62c56f98SSadaf Ebrahimi    size_t curve_bits;
33*62c56f98SSadaf Ebrahimi    psa_ecc_family_t curve = mbedtls_ecc_group_to_psa(grp_id, &curve_bits);
34*62c56f98SSadaf Ebrahimi    int ret;
35*62c56f98SSadaf Ebrahimi
36*62c56f98SSadaf Ebrahimi    if (curve == 0) {
37*62c56f98SSadaf Ebrahimi        return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
38*62c56f98SSadaf Ebrahimi    }
39*62c56f98SSadaf Ebrahimi
40*62c56f98SSadaf Ebrahimi    psa_set_key_type(&key_attr, PSA_KEY_TYPE_ECC_KEY_PAIR(curve));
41*62c56f98SSadaf Ebrahimi    psa_set_key_bits(&key_attr, curve_bits);
42*62c56f98SSadaf Ebrahimi    psa_set_key_usage_flags(&key_attr, PSA_KEY_USAGE_EXPORT |
43*62c56f98SSadaf Ebrahimi                            PSA_KEY_USAGE_SIGN_HASH |
44*62c56f98SSadaf Ebrahimi                            PSA_KEY_USAGE_SIGN_MESSAGE);
45*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
46*62c56f98SSadaf Ebrahimi    psa_set_key_algorithm(&key_attr, PSA_ALG_DETERMINISTIC_ECDSA(PSA_ALG_ANY_HASH));
47*62c56f98SSadaf Ebrahimi#else
48*62c56f98SSadaf Ebrahimi    psa_set_key_algorithm(&key_attr, PSA_ALG_ECDSA(PSA_ALG_ANY_HASH));
49*62c56f98SSadaf Ebrahimi#endif
50*62c56f98SSadaf Ebrahimi
51*62c56f98SSadaf Ebrahimi    status = psa_generate_key(&key_attr, &pk->priv_id);
52*62c56f98SSadaf Ebrahimi    if (status != PSA_SUCCESS) {
53*62c56f98SSadaf Ebrahimi        return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
54*62c56f98SSadaf Ebrahimi    }
55*62c56f98SSadaf Ebrahimi
56*62c56f98SSadaf Ebrahimi    status = psa_export_public_key(pk->priv_id, pk->pub_raw, sizeof(pk->pub_raw),
57*62c56f98SSadaf Ebrahimi                                   &pk->pub_raw_len);
58*62c56f98SSadaf Ebrahimi    if (status != PSA_SUCCESS) {
59*62c56f98SSadaf Ebrahimi        ret = MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
60*62c56f98SSadaf Ebrahimi        goto exit;
61*62c56f98SSadaf Ebrahimi    }
62*62c56f98SSadaf Ebrahimi
63*62c56f98SSadaf Ebrahimi    pk->ec_family = curve;
64*62c56f98SSadaf Ebrahimi    pk->ec_bits = curve_bits;
65*62c56f98SSadaf Ebrahimi
66*62c56f98SSadaf Ebrahimi    return 0;
67*62c56f98SSadaf Ebrahimi
68*62c56f98SSadaf Ebrahimiexit:
69*62c56f98SSadaf Ebrahimi    status = psa_destroy_key(pk->priv_id);
70*62c56f98SSadaf Ebrahimi    return (ret != 0) ? ret : psa_pk_status_to_mbedtls(status);
71*62c56f98SSadaf Ebrahimi}
72*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
73*62c56f98SSadaf Ebrahimi
74*62c56f98SSadaf Ebrahimi/** Generate a key of the desired type.
75*62c56f98SSadaf Ebrahimi *
76*62c56f98SSadaf Ebrahimi * \param pk        The PK object to fill. It must have been initialized
77*62c56f98SSadaf Ebrahimi *                  with mbedtls_pk_setup().
78*62c56f98SSadaf Ebrahimi * \param parameter - For RSA keys, the key size in bits.
79*62c56f98SSadaf Ebrahimi *                  - For EC keys, the curve (\c MBEDTLS_ECP_DP_xxx).
80*62c56f98SSadaf Ebrahimi *
81*62c56f98SSadaf Ebrahimi * \return          The status from the underlying type-specific key
82*62c56f98SSadaf Ebrahimi *                  generation function.
83*62c56f98SSadaf Ebrahimi * \return          -1 if the key type is not recognized.
84*62c56f98SSadaf Ebrahimi */
85*62c56f98SSadaf Ebrahimistatic int pk_genkey(mbedtls_pk_context *pk, int parameter)
86*62c56f98SSadaf Ebrahimi{
87*62c56f98SSadaf Ebrahimi    ((void) pk);
88*62c56f98SSadaf Ebrahimi    (void) parameter;
89*62c56f98SSadaf Ebrahimi
90*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)
91*62c56f98SSadaf Ebrahimi    if (mbedtls_pk_get_type(pk) == MBEDTLS_PK_RSA) {
92*62c56f98SSadaf Ebrahimi        return mbedtls_rsa_gen_key(mbedtls_pk_rsa(*pk),
93*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_std_rand, NULL,
94*62c56f98SSadaf Ebrahimi                                   parameter, 3);
95*62c56f98SSadaf Ebrahimi    }
96*62c56f98SSadaf Ebrahimi#endif
97*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
98*62c56f98SSadaf Ebrahimi    if (mbedtls_pk_get_type(pk) == MBEDTLS_PK_ECKEY ||
99*62c56f98SSadaf Ebrahimi        mbedtls_pk_get_type(pk) == MBEDTLS_PK_ECKEY_DH ||
100*62c56f98SSadaf Ebrahimi        mbedtls_pk_get_type(pk) == MBEDTLS_PK_ECDSA) {
101*62c56f98SSadaf Ebrahimi        int ret;
102*62c56f98SSadaf Ebrahimi
103*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECP_C)
104*62c56f98SSadaf Ebrahimi        ret = mbedtls_ecp_group_load(&mbedtls_pk_ec_rw(*pk)->grp, parameter);
105*62c56f98SSadaf Ebrahimi        if (ret != 0) {
106*62c56f98SSadaf Ebrahimi            return ret;
107*62c56f98SSadaf Ebrahimi        }
108*62c56f98SSadaf Ebrahimi        return mbedtls_ecp_gen_keypair(&mbedtls_pk_ec_rw(*pk)->grp,
109*62c56f98SSadaf Ebrahimi                                       &mbedtls_pk_ec_rw(*pk)->d,
110*62c56f98SSadaf Ebrahimi                                       &mbedtls_pk_ec_rw(*pk)->Q,
111*62c56f98SSadaf Ebrahimi                                       mbedtls_test_rnd_std_rand, NULL);
112*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_ECP_C */
113*62c56f98SSadaf Ebrahimi
114*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
115*62c56f98SSadaf Ebrahimi        ret = pk_genkey_ec(pk, parameter);
116*62c56f98SSadaf Ebrahimi        if (ret != 0) {
117*62c56f98SSadaf Ebrahimi            return ret;
118*62c56f98SSadaf Ebrahimi        }
119*62c56f98SSadaf Ebrahimi
120*62c56f98SSadaf Ebrahimi        return 0;
121*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
122*62c56f98SSadaf Ebrahimi
123*62c56f98SSadaf Ebrahimi    }
124*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
125*62c56f98SSadaf Ebrahimi    return -1;
126*62c56f98SSadaf Ebrahimi}
127*62c56f98SSadaf Ebrahimi
128*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_RSA_C)
129*62c56f98SSadaf Ebrahimiint mbedtls_rsa_decrypt_func(void *ctx, size_t *olen,
130*62c56f98SSadaf Ebrahimi                             const unsigned char *input, unsigned char *output,
131*62c56f98SSadaf Ebrahimi                             size_t output_max_len)
132*62c56f98SSadaf Ebrahimi{
133*62c56f98SSadaf Ebrahimi    return mbedtls_rsa_pkcs1_decrypt((mbedtls_rsa_context *) ctx,
134*62c56f98SSadaf Ebrahimi                                     mbedtls_test_rnd_std_rand, NULL,
135*62c56f98SSadaf Ebrahimi                                     olen, input, output, output_max_len);
136*62c56f98SSadaf Ebrahimi}
137*62c56f98SSadaf Ebrahimiint mbedtls_rsa_sign_func(void *ctx,
138*62c56f98SSadaf Ebrahimi                          int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
139*62c56f98SSadaf Ebrahimi                          mbedtls_md_type_t md_alg, unsigned int hashlen,
140*62c56f98SSadaf Ebrahimi                          const unsigned char *hash, unsigned char *sig)
141*62c56f98SSadaf Ebrahimi{
142*62c56f98SSadaf Ebrahimi    ((void) f_rng);
143*62c56f98SSadaf Ebrahimi    ((void) p_rng);
144*62c56f98SSadaf Ebrahimi    return mbedtls_rsa_pkcs1_sign((mbedtls_rsa_context *) ctx,
145*62c56f98SSadaf Ebrahimi                                  mbedtls_test_rnd_std_rand, NULL,
146*62c56f98SSadaf Ebrahimi                                  md_alg, hashlen, hash, sig);
147*62c56f98SSadaf Ebrahimi}
148*62c56f98SSadaf Ebrahimisize_t mbedtls_rsa_key_len_func(void *ctx)
149*62c56f98SSadaf Ebrahimi{
150*62c56f98SSadaf Ebrahimi    return ((const mbedtls_rsa_context *) ctx)->len;
151*62c56f98SSadaf Ebrahimi}
152*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_RSA_C */
153*62c56f98SSadaf Ebrahimi
154*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
155*62c56f98SSadaf Ebrahimi
156*62c56f98SSadaf Ebrahimi/*
157*62c56f98SSadaf Ebrahimi * Generate an ECC key using PSA and return the key identifier of that key,
158*62c56f98SSadaf Ebrahimi * or 0 if the key generation failed.
159*62c56f98SSadaf Ebrahimi * The key uses NIST P-256 and is usable for signing with SHA-256.
160*62c56f98SSadaf Ebrahimi */
161*62c56f98SSadaf Ebrahimimbedtls_svc_key_id_t pk_psa_genkey_ecc(void)
162*62c56f98SSadaf Ebrahimi{
163*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t key;
164*62c56f98SSadaf Ebrahimi    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
165*62c56f98SSadaf Ebrahimi    const psa_key_type_t type =
166*62c56f98SSadaf Ebrahimi        PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1);
167*62c56f98SSadaf Ebrahimi    const size_t bits = 256;
168*62c56f98SSadaf Ebrahimi
169*62c56f98SSadaf Ebrahimi    psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
170*62c56f98SSadaf Ebrahimi    psa_set_key_algorithm(&attributes, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
171*62c56f98SSadaf Ebrahimi    psa_set_key_type(&attributes, type);
172*62c56f98SSadaf Ebrahimi    psa_set_key_bits(&attributes, bits);
173*62c56f98SSadaf Ebrahimi    PSA_ASSERT(psa_generate_key(&attributes, &key));
174*62c56f98SSadaf Ebrahimi
175*62c56f98SSadaf Ebrahimiexit:
176*62c56f98SSadaf Ebrahimi    return key;
177*62c56f98SSadaf Ebrahimi}
178*62c56f98SSadaf Ebrahimi
179*62c56f98SSadaf Ebrahimi/*
180*62c56f98SSadaf Ebrahimi * Generate an RSA key using PSA and return the key identifier of that key,
181*62c56f98SSadaf Ebrahimi * or 0 if the key generation failed.
182*62c56f98SSadaf Ebrahimi */
183*62c56f98SSadaf Ebrahimimbedtls_svc_key_id_t pk_psa_genkey_rsa(void)
184*62c56f98SSadaf Ebrahimi{
185*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t key;
186*62c56f98SSadaf Ebrahimi    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
187*62c56f98SSadaf Ebrahimi    const psa_key_type_t type = PSA_KEY_TYPE_RSA_KEY_PAIR;
188*62c56f98SSadaf Ebrahimi    const size_t bits = 1024;
189*62c56f98SSadaf Ebrahimi
190*62c56f98SSadaf Ebrahimi    psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
191*62c56f98SSadaf Ebrahimi    psa_set_key_algorithm(&attributes, PSA_ALG_RSA_PKCS1V15_SIGN_RAW);
192*62c56f98SSadaf Ebrahimi    psa_set_key_type(&attributes, type);
193*62c56f98SSadaf Ebrahimi    psa_set_key_bits(&attributes, bits);
194*62c56f98SSadaf Ebrahimi    PSA_ASSERT(psa_generate_key(&attributes, &key));
195*62c56f98SSadaf Ebrahimi
196*62c56f98SSadaf Ebrahimiexit:
197*62c56f98SSadaf Ebrahimi    return key;
198*62c56f98SSadaf Ebrahimi}
199*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO */
200*62c56f98SSadaf Ebrahimi/* END_HEADER */
201*62c56f98SSadaf Ebrahimi
202*62c56f98SSadaf Ebrahimi/* BEGIN_DEPENDENCIES
203*62c56f98SSadaf Ebrahimi * depends_on:MBEDTLS_PK_C
204*62c56f98SSadaf Ebrahimi * END_DEPENDENCIES
205*62c56f98SSadaf Ebrahimi */
206*62c56f98SSadaf Ebrahimi
207*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
208*62c56f98SSadaf Ebrahimivoid pk_psa_utils(int key_is_rsa)
209*62c56f98SSadaf Ebrahimi{
210*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk, pk2;
211*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t key;
212*62c56f98SSadaf Ebrahimi    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
213*62c56f98SSadaf Ebrahimi
214*62c56f98SSadaf Ebrahimi    const char * const name = "Opaque";
215*62c56f98SSadaf Ebrahimi    size_t bitlen;
216*62c56f98SSadaf Ebrahimi
217*62c56f98SSadaf Ebrahimi    mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
218*62c56f98SSadaf Ebrahimi    unsigned char b1[1], b2[1];
219*62c56f98SSadaf Ebrahimi    size_t len;
220*62c56f98SSadaf Ebrahimi    mbedtls_pk_debug_item dbg;
221*62c56f98SSadaf Ebrahimi
222*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
223*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk2);
224*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
225*62c56f98SSadaf Ebrahimi
226*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup_opaque(&pk, MBEDTLS_SVC_KEY_ID_INIT) ==
227*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
228*62c56f98SSadaf Ebrahimi
229*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
230*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
231*62c56f98SSadaf Ebrahimi
232*62c56f98SSadaf Ebrahimi    if (key_is_rsa) {
233*62c56f98SSadaf Ebrahimi        bitlen = 1024; /* hardcoded in genkey() */
234*62c56f98SSadaf Ebrahimi        key = pk_psa_genkey_rsa();
235*62c56f98SSadaf Ebrahimi    } else {
236*62c56f98SSadaf Ebrahimi        bitlen = 256; /* hardcoded in genkey() */
237*62c56f98SSadaf Ebrahimi        key = pk_psa_genkey_ecc();
238*62c56f98SSadaf Ebrahimi    }
239*62c56f98SSadaf Ebrahimi    if (mbedtls_svc_key_id_is_null(key)) {
240*62c56f98SSadaf Ebrahimi        goto exit;
241*62c56f98SSadaf Ebrahimi    }
242*62c56f98SSadaf Ebrahimi
243*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup_opaque(&pk, key) == 0);
244*62c56f98SSadaf Ebrahimi
245*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_type(&pk) == MBEDTLS_PK_OPAQUE);
246*62c56f98SSadaf Ebrahimi    TEST_ASSERT(strcmp(mbedtls_pk_get_name(&pk), name) == 0);
247*62c56f98SSadaf Ebrahimi
248*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_bitlen(&pk) == bitlen);
249*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_len(&pk) == bitlen / 8);
250*62c56f98SSadaf Ebrahimi
251*62c56f98SSadaf Ebrahimi    if (key_is_rsa) {
252*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECKEY) == 0);
253*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA) == 0);
254*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_RSA) == 1);
255*62c56f98SSadaf Ebrahimi    } else {
256*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECKEY) == 1);
257*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA) == 1);
258*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_RSA) == 0);
259*62c56f98SSadaf Ebrahimi    }
260*62c56f98SSadaf Ebrahimi
261*62c56f98SSadaf Ebrahimi    /* unsupported operations: verify, decrypt, encrypt */
262*62c56f98SSadaf Ebrahimi    if (key_is_rsa == 1) {
263*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_verify(&pk, md_alg,
264*62c56f98SSadaf Ebrahimi                                      b1, sizeof(b1), b2, sizeof(b2))
265*62c56f98SSadaf Ebrahimi                    == MBEDTLS_ERR_PK_TYPE_MISMATCH);
266*62c56f98SSadaf Ebrahimi    } else {
267*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_decrypt(&pk, b1, sizeof(b1),
268*62c56f98SSadaf Ebrahimi                                       b2, &len, sizeof(b2),
269*62c56f98SSadaf Ebrahimi                                       NULL, NULL)
270*62c56f98SSadaf Ebrahimi                    == MBEDTLS_ERR_PK_TYPE_MISMATCH);
271*62c56f98SSadaf Ebrahimi    }
272*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_encrypt(&pk, b1, sizeof(b1),
273*62c56f98SSadaf Ebrahimi                                   b2, &len, sizeof(b2),
274*62c56f98SSadaf Ebrahimi                                   NULL, NULL)
275*62c56f98SSadaf Ebrahimi                == MBEDTLS_ERR_PK_TYPE_MISMATCH);
276*62c56f98SSadaf Ebrahimi
277*62c56f98SSadaf Ebrahimi    /* unsupported functions: check_pair, debug */
278*62c56f98SSadaf Ebrahimi    if (key_is_rsa) {
279*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_setup(&pk2,
280*62c56f98SSadaf Ebrahimi                                     mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
281*62c56f98SSadaf Ebrahimi    } else {
282*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_setup(&pk2,
283*62c56f98SSadaf Ebrahimi                                     mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)) == 0);
284*62c56f98SSadaf Ebrahimi    }
285*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_check_pair(&pk, &pk2,
286*62c56f98SSadaf Ebrahimi                                      mbedtls_test_rnd_std_rand, NULL)
287*62c56f98SSadaf Ebrahimi                == MBEDTLS_ERR_PK_TYPE_MISMATCH);
288*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_debug(&pk, &dbg)
289*62c56f98SSadaf Ebrahimi                == MBEDTLS_ERR_PK_TYPE_MISMATCH);
290*62c56f98SSadaf Ebrahimi
291*62c56f98SSadaf Ebrahimi    /* test that freeing the context does not destroy the key */
292*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
293*62c56f98SSadaf Ebrahimi    TEST_ASSERT(PSA_SUCCESS == psa_get_key_attributes(key, &attributes));
294*62c56f98SSadaf Ebrahimi    TEST_ASSERT(PSA_SUCCESS == psa_destroy_key(key));
295*62c56f98SSadaf Ebrahimi
296*62c56f98SSadaf Ebrahimiexit:
297*62c56f98SSadaf Ebrahimi    /*
298*62c56f98SSadaf Ebrahimi     * Key attributes may have been returned by psa_get_key_attributes()
299*62c56f98SSadaf Ebrahimi     * thus reset them as required.
300*62c56f98SSadaf Ebrahimi     */
301*62c56f98SSadaf Ebrahimi    psa_reset_key_attributes(&attributes);
302*62c56f98SSadaf Ebrahimi
303*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);   /* redundant except upon error */
304*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk2);
305*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
306*62c56f98SSadaf Ebrahimi}
307*62c56f98SSadaf Ebrahimi/* END_CASE */
308*62c56f98SSadaf Ebrahimi
309*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
310*62c56f98SSadaf Ebrahimivoid pk_can_do_ext(int opaque_key, int key_type, int key_usage, int key_alg,
311*62c56f98SSadaf Ebrahimi                   int key_alg2, int parameter, int alg_check, int usage_check,
312*62c56f98SSadaf Ebrahimi                   int result)
313*62c56f98SSadaf Ebrahimi{
314*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
315*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
316*62c56f98SSadaf Ebrahimi    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
317*62c56f98SSadaf Ebrahimi
318*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
319*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
320*62c56f98SSadaf Ebrahimi
321*62c56f98SSadaf Ebrahimi    if (opaque_key == 1) {
322*62c56f98SSadaf Ebrahimi        psa_set_key_usage_flags(&attributes, key_usage);
323*62c56f98SSadaf Ebrahimi        psa_set_key_algorithm(&attributes, key_alg);
324*62c56f98SSadaf Ebrahimi        if (key_alg2 != 0) {
325*62c56f98SSadaf Ebrahimi            psa_set_key_enrollment_algorithm(&attributes, key_alg2);
326*62c56f98SSadaf Ebrahimi        }
327*62c56f98SSadaf Ebrahimi        psa_set_key_type(&attributes, key_type);
328*62c56f98SSadaf Ebrahimi        psa_set_key_bits(&attributes, parameter);
329*62c56f98SSadaf Ebrahimi
330*62c56f98SSadaf Ebrahimi        PSA_ASSERT(psa_generate_key(&attributes, &key));
331*62c56f98SSadaf Ebrahimi
332*62c56f98SSadaf Ebrahimi        if (mbedtls_svc_key_id_is_null(key)) {
333*62c56f98SSadaf Ebrahimi            goto exit;
334*62c56f98SSadaf Ebrahimi        }
335*62c56f98SSadaf Ebrahimi
336*62c56f98SSadaf Ebrahimi        TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, key), 0);
337*62c56f98SSadaf Ebrahimi
338*62c56f98SSadaf Ebrahimi        TEST_EQUAL(mbedtls_pk_get_type(&pk), MBEDTLS_PK_OPAQUE);
339*62c56f98SSadaf Ebrahimi    } else {
340*62c56f98SSadaf Ebrahimi        TEST_EQUAL(mbedtls_pk_setup(&pk,
341*62c56f98SSadaf Ebrahimi                                    mbedtls_pk_info_from_type(key_type)), 0);
342*62c56f98SSadaf Ebrahimi        TEST_EQUAL(pk_genkey(&pk, parameter), 0);
343*62c56f98SSadaf Ebrahimi        TEST_EQUAL(mbedtls_pk_get_type(&pk), key_type);
344*62c56f98SSadaf Ebrahimi    }
345*62c56f98SSadaf Ebrahimi
346*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_can_do_ext(&pk, alg_check, usage_check), result);
347*62c56f98SSadaf Ebrahimi
348*62c56f98SSadaf Ebrahimiexit:
349*62c56f98SSadaf Ebrahimi    psa_reset_key_attributes(&attributes);
350*62c56f98SSadaf Ebrahimi    PSA_ASSERT(psa_destroy_key(key));
351*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
352*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
353*62c56f98SSadaf Ebrahimi}
354*62c56f98SSadaf Ebrahimi/* END_CASE */
355*62c56f98SSadaf Ebrahimi
356*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */
357*62c56f98SSadaf Ebrahimivoid pk_invalid_param()
358*62c56f98SSadaf Ebrahimi{
359*62c56f98SSadaf Ebrahimi    mbedtls_pk_context ctx;
360*62c56f98SSadaf Ebrahimi    mbedtls_pk_type_t pk_type = 0;
361*62c56f98SSadaf Ebrahimi    unsigned char buf[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
362*62c56f98SSadaf Ebrahimi    size_t buf_size = sizeof(buf);
363*62c56f98SSadaf Ebrahimi
364*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&ctx);
365*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
366*62c56f98SSadaf Ebrahimi
367*62c56f98SSadaf Ebrahimi    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
368*62c56f98SSadaf Ebrahimi               mbedtls_pk_verify_restartable(&ctx, MBEDTLS_MD_NONE,
369*62c56f98SSadaf Ebrahimi                                             NULL, buf_size,
370*62c56f98SSadaf Ebrahimi                                             buf, buf_size,
371*62c56f98SSadaf Ebrahimi                                             NULL));
372*62c56f98SSadaf Ebrahimi    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
373*62c56f98SSadaf Ebrahimi               mbedtls_pk_verify_restartable(&ctx, MBEDTLS_MD_SHA256,
374*62c56f98SSadaf Ebrahimi                                             NULL, 0,
375*62c56f98SSadaf Ebrahimi                                             buf, buf_size,
376*62c56f98SSadaf Ebrahimi                                             NULL));
377*62c56f98SSadaf Ebrahimi    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
378*62c56f98SSadaf Ebrahimi               mbedtls_pk_verify_ext(pk_type, NULL,
379*62c56f98SSadaf Ebrahimi                                     &ctx, MBEDTLS_MD_NONE,
380*62c56f98SSadaf Ebrahimi                                     NULL, buf_size,
381*62c56f98SSadaf Ebrahimi                                     buf, buf_size));
382*62c56f98SSadaf Ebrahimi    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
383*62c56f98SSadaf Ebrahimi               mbedtls_pk_verify_ext(pk_type, NULL,
384*62c56f98SSadaf Ebrahimi                                     &ctx, MBEDTLS_MD_SHA256,
385*62c56f98SSadaf Ebrahimi                                     NULL, 0,
386*62c56f98SSadaf Ebrahimi                                     buf, buf_size));
387*62c56f98SSadaf Ebrahimi    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
388*62c56f98SSadaf Ebrahimi               mbedtls_pk_sign_restartable(&ctx, MBEDTLS_MD_NONE,
389*62c56f98SSadaf Ebrahimi                                           NULL, buf_size,
390*62c56f98SSadaf Ebrahimi                                           buf, buf_size, &buf_size,
391*62c56f98SSadaf Ebrahimi                                           NULL, NULL,
392*62c56f98SSadaf Ebrahimi                                           NULL));
393*62c56f98SSadaf Ebrahimi    TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
394*62c56f98SSadaf Ebrahimi               mbedtls_pk_sign_restartable(&ctx, MBEDTLS_MD_SHA256,
395*62c56f98SSadaf Ebrahimi                                           NULL, 0,
396*62c56f98SSadaf Ebrahimi                                           buf, buf_size, &buf_size,
397*62c56f98SSadaf Ebrahimi                                           NULL, NULL,
398*62c56f98SSadaf Ebrahimi                                           NULL));
399*62c56f98SSadaf Ebrahimiexit:
400*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&ctx);
401*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
402*62c56f98SSadaf Ebrahimi}
403*62c56f98SSadaf Ebrahimi/* END_CASE */
404*62c56f98SSadaf Ebrahimi
405*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */
406*62c56f98SSadaf Ebrahimivoid valid_parameters()
407*62c56f98SSadaf Ebrahimi{
408*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
409*62c56f98SSadaf Ebrahimi    unsigned char buf[1];
410*62c56f98SSadaf Ebrahimi    size_t len;
411*62c56f98SSadaf Ebrahimi    void *options = NULL;
412*62c56f98SSadaf Ebrahimi
413*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
414*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
415*62c56f98SSadaf Ebrahimi
416*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk, NULL) ==
417*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
418*62c56f98SSadaf Ebrahimi
419*62c56f98SSadaf Ebrahimi    /* In informational functions, we accept NULL where a context pointer
420*62c56f98SSadaf Ebrahimi     * is expected because that's what the library has done forever.
421*62c56f98SSadaf Ebrahimi     * We do not document that NULL is accepted, so we may wish to change
422*62c56f98SSadaf Ebrahimi     * the behavior in a future version. */
423*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_bitlen(NULL) == 0);
424*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_len(NULL) == 0);
425*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_can_do(NULL, MBEDTLS_PK_NONE) == 0);
426*62c56f98SSadaf Ebrahimi
427*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign_restartable(&pk,
428*62c56f98SSadaf Ebrahimi                                            MBEDTLS_MD_NONE,
429*62c56f98SSadaf Ebrahimi                                            NULL, 0,
430*62c56f98SSadaf Ebrahimi                                            buf, sizeof(buf), &len,
431*62c56f98SSadaf Ebrahimi                                            mbedtls_test_rnd_std_rand, NULL,
432*62c56f98SSadaf Ebrahimi                                            NULL) ==
433*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
434*62c56f98SSadaf Ebrahimi
435*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign_restartable(&pk,
436*62c56f98SSadaf Ebrahimi                                            MBEDTLS_MD_NONE,
437*62c56f98SSadaf Ebrahimi                                            NULL, 0,
438*62c56f98SSadaf Ebrahimi                                            buf, sizeof(buf), &len,
439*62c56f98SSadaf Ebrahimi                                            mbedtls_test_rnd_std_rand, NULL,
440*62c56f98SSadaf Ebrahimi                                            NULL) ==
441*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
442*62c56f98SSadaf Ebrahimi
443*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign(&pk,
444*62c56f98SSadaf Ebrahimi                                MBEDTLS_MD_NONE,
445*62c56f98SSadaf Ebrahimi                                NULL, 0,
446*62c56f98SSadaf Ebrahimi                                buf, sizeof(buf), &len,
447*62c56f98SSadaf Ebrahimi                                mbedtls_test_rnd_std_rand, NULL) ==
448*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
449*62c56f98SSadaf Ebrahimi
450*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify_restartable(&pk,
451*62c56f98SSadaf Ebrahimi                                              MBEDTLS_MD_NONE,
452*62c56f98SSadaf Ebrahimi                                              NULL, 0,
453*62c56f98SSadaf Ebrahimi                                              buf, sizeof(buf),
454*62c56f98SSadaf Ebrahimi                                              NULL) ==
455*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
456*62c56f98SSadaf Ebrahimi
457*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify(&pk,
458*62c56f98SSadaf Ebrahimi                                  MBEDTLS_MD_NONE,
459*62c56f98SSadaf Ebrahimi                                  NULL, 0,
460*62c56f98SSadaf Ebrahimi                                  buf, sizeof(buf)) ==
461*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
462*62c56f98SSadaf Ebrahimi
463*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify_ext(MBEDTLS_PK_NONE, options,
464*62c56f98SSadaf Ebrahimi                                      &pk,
465*62c56f98SSadaf Ebrahimi                                      MBEDTLS_MD_NONE,
466*62c56f98SSadaf Ebrahimi                                      NULL, 0,
467*62c56f98SSadaf Ebrahimi                                      buf, sizeof(buf)) ==
468*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
469*62c56f98SSadaf Ebrahimi
470*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_encrypt(&pk,
471*62c56f98SSadaf Ebrahimi                                   NULL, 0,
472*62c56f98SSadaf Ebrahimi                                   NULL, &len, 0,
473*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_std_rand, NULL) ==
474*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
475*62c56f98SSadaf Ebrahimi
476*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_decrypt(&pk,
477*62c56f98SSadaf Ebrahimi                                   NULL, 0,
478*62c56f98SSadaf Ebrahimi                                   NULL, &len, 0,
479*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_std_rand, NULL) ==
480*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
481*62c56f98SSadaf Ebrahimi
482*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PK_PARSE_C)
483*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_parse_key(&pk, NULL, 0, NULL, 1,
484*62c56f98SSadaf Ebrahimi                                     mbedtls_test_rnd_std_rand, NULL) ==
485*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_KEY_INVALID_FORMAT);
486*62c56f98SSadaf Ebrahimi
487*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_parse_public_key(&pk, NULL, 0) ==
488*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_KEY_INVALID_FORMAT);
489*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_PK_PARSE_C */
490*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
491*62c56f98SSadaf Ebrahimi}
492*62c56f98SSadaf Ebrahimi/* END_CASE */
493*62c56f98SSadaf Ebrahimi
494*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PK_WRITE_C */
495*62c56f98SSadaf Ebrahimivoid valid_parameters_pkwrite(data_t *key_data)
496*62c56f98SSadaf Ebrahimi{
497*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
498*62c56f98SSadaf Ebrahimi
499*62c56f98SSadaf Ebrahimi    /* For the write tests to be effective, we need a valid key pair. */
500*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
501*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
502*62c56f98SSadaf Ebrahimi
503*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_parse_key(&pk,
504*62c56f98SSadaf Ebrahimi                                     key_data->x, key_data->len, NULL, 0,
505*62c56f98SSadaf Ebrahimi                                     mbedtls_test_rnd_std_rand, NULL) == 0);
506*62c56f98SSadaf Ebrahimi
507*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_write_key_der(&pk, NULL, 0) ==
508*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_ASN1_BUF_TOO_SMALL);
509*62c56f98SSadaf Ebrahimi
510*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_write_pubkey_der(&pk, NULL, 0) ==
511*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_ASN1_BUF_TOO_SMALL);
512*62c56f98SSadaf Ebrahimi
513*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PEM_WRITE_C)
514*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_write_key_pem(&pk, NULL, 0) ==
515*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
516*62c56f98SSadaf Ebrahimi
517*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_write_pubkey_pem(&pk, NULL, 0) ==
518*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
519*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_PEM_WRITE_C */
520*62c56f98SSadaf Ebrahimi
521*62c56f98SSadaf Ebrahimiexit:
522*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
523*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
524*62c56f98SSadaf Ebrahimi}
525*62c56f98SSadaf Ebrahimi/* END_CASE */
526*62c56f98SSadaf Ebrahimi
527*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */
528*62c56f98SSadaf Ebrahimivoid pk_utils(int type, int parameter, int bitlen, int len, char *name)
529*62c56f98SSadaf Ebrahimi{
530*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
531*62c56f98SSadaf Ebrahimi
532*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
533*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
534*62c56f98SSadaf Ebrahimi
535*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
536*62c56f98SSadaf Ebrahimi    TEST_ASSERT(pk_genkey(&pk, parameter) == 0);
537*62c56f98SSadaf Ebrahimi
538*62c56f98SSadaf Ebrahimi    TEST_ASSERT((int) mbedtls_pk_get_type(&pk) == type);
539*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_can_do(&pk, type));
540*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_bitlen(&pk) == (unsigned) bitlen);
541*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_len(&pk) == (unsigned) len);
542*62c56f98SSadaf Ebrahimi    TEST_ASSERT(strcmp(mbedtls_pk_get_name(&pk), name) == 0);
543*62c56f98SSadaf Ebrahimi
544*62c56f98SSadaf Ebrahimiexit:
545*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
546*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
547*62c56f98SSadaf Ebrahimi}
548*62c56f98SSadaf Ebrahimi/* END_CASE */
549*62c56f98SSadaf Ebrahimi
550*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PK_PARSE_C:MBEDTLS_FS_IO */
551*62c56f98SSadaf Ebrahimivoid mbedtls_pk_check_pair(char *pub_file, char *prv_file, int ret)
552*62c56f98SSadaf Ebrahimi{
553*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pub, prv, alt;
554*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
555*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t opaque_key_id = MBEDTLS_SVC_KEY_ID_INIT;
556*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO */
557*62c56f98SSadaf Ebrahimi
558*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pub);
559*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&prv);
560*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&alt);
561*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
562*62c56f98SSadaf Ebrahimi
563*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
564*62c56f98SSadaf Ebrahimi    /* mbedtls_pk_check_pair() returns either PK or ECP error codes depending
565*62c56f98SSadaf Ebrahimi       on MBEDTLS_USE_PSA_CRYPTO so here we dynamically translate between the
566*62c56f98SSadaf Ebrahimi       two */
567*62c56f98SSadaf Ebrahimi    if (ret == MBEDTLS_ERR_ECP_BAD_INPUT_DATA) {
568*62c56f98SSadaf Ebrahimi        ret = MBEDTLS_ERR_PK_BAD_INPUT_DATA;
569*62c56f98SSadaf Ebrahimi    }
570*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO */
571*62c56f98SSadaf Ebrahimi
572*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_parse_public_keyfile(&pub, pub_file) == 0);
573*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_parse_keyfile(&prv, prv_file, NULL,
574*62c56f98SSadaf Ebrahimi                                         mbedtls_test_rnd_std_rand, NULL)
575*62c56f98SSadaf Ebrahimi                == 0);
576*62c56f98SSadaf Ebrahimi
577*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_check_pair(&pub, &prv,
578*62c56f98SSadaf Ebrahimi                                      mbedtls_test_rnd_std_rand, NULL)
579*62c56f98SSadaf Ebrahimi                == ret);
580*62c56f98SSadaf Ebrahimi
581*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
582*62c56f98SSadaf Ebrahimi    if (mbedtls_pk_get_type(&prv) == MBEDTLS_PK_RSA) {
583*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_setup_rsa_alt(&alt, mbedtls_pk_rsa(prv),
584*62c56f98SSadaf Ebrahimi                                             mbedtls_rsa_decrypt_func, mbedtls_rsa_sign_func,
585*62c56f98SSadaf Ebrahimi                                             mbedtls_rsa_key_len_func) == 0);
586*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_check_pair(&pub, &alt,
587*62c56f98SSadaf Ebrahimi                                          mbedtls_test_rnd_std_rand, NULL)
588*62c56f98SSadaf Ebrahimi                    == ret);
589*62c56f98SSadaf Ebrahimi    }
590*62c56f98SSadaf Ebrahimi#endif
591*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
592*62c56f98SSadaf Ebrahimi    if (mbedtls_pk_get_type(&prv) == MBEDTLS_PK_ECKEY) {
593*62c56f98SSadaf Ebrahimi        TEST_EQUAL(mbedtls_pk_wrap_as_opaque(&prv, &opaque_key_id,
594*62c56f98SSadaf Ebrahimi                                             PSA_ALG_ANY_HASH,
595*62c56f98SSadaf Ebrahimi                                             PSA_KEY_USAGE_EXPORT, 0), 0);
596*62c56f98SSadaf Ebrahimi        TEST_EQUAL(mbedtls_pk_check_pair(&pub, &prv, mbedtls_test_rnd_std_rand,
597*62c56f98SSadaf Ebrahimi                                         NULL), ret);
598*62c56f98SSadaf Ebrahimi    }
599*62c56f98SSadaf Ebrahimi#endif
600*62c56f98SSadaf Ebrahimi
601*62c56f98SSadaf Ebrahimiexit:
602*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
603*62c56f98SSadaf Ebrahimi    psa_destroy_key(opaque_key_id);
604*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO */
605*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pub);
606*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&prv);
607*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&alt);
608*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
609*62c56f98SSadaf Ebrahimi}
610*62c56f98SSadaf Ebrahimi/* END_CASE */
611*62c56f98SSadaf Ebrahimi
612*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
613*62c56f98SSadaf Ebrahimivoid pk_rsa_verify_test_vec(data_t *message_str, int digest, int mod,
614*62c56f98SSadaf Ebrahimi                            char *input_N, char *input_E,
615*62c56f98SSadaf Ebrahimi                            data_t *result_str, int result)
616*62c56f98SSadaf Ebrahimi{
617*62c56f98SSadaf Ebrahimi    mbedtls_rsa_context *rsa;
618*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
619*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_ctx *rs_ctx = NULL;
620*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
621*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_ctx ctx;
622*62c56f98SSadaf Ebrahimi
623*62c56f98SSadaf Ebrahimi    rs_ctx = &ctx;
624*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_init(rs_ctx);
625*62c56f98SSadaf Ebrahimi    // this setting would ensure restart would happen if ECC was used
626*62c56f98SSadaf Ebrahimi    mbedtls_ecp_set_max_ops(1);
627*62c56f98SSadaf Ebrahimi#endif
628*62c56f98SSadaf Ebrahimi
629*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
630*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
631*62c56f98SSadaf Ebrahimi
632*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
633*62c56f98SSadaf Ebrahimi    rsa = mbedtls_pk_rsa(pk);
634*62c56f98SSadaf Ebrahimi
635*62c56f98SSadaf Ebrahimi    rsa->len = mod / 8;
636*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->N, input_N) == 0);
637*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->E, input_E) == 0);
638*62c56f98SSadaf Ebrahimi
639*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify(&pk, digest, message_str->x, 0,
640*62c56f98SSadaf Ebrahimi                                  result_str->x, mbedtls_pk_get_len(&pk)) == result);
641*62c56f98SSadaf Ebrahimi
642*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, digest, message_str->x, 0,
643*62c56f98SSadaf Ebrahimi                                              result_str->x, mbedtls_pk_get_len(
644*62c56f98SSadaf Ebrahimi                                                  &pk), rs_ctx) == result);
645*62c56f98SSadaf Ebrahimi
646*62c56f98SSadaf Ebrahimiexit:
647*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
648*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_free(rs_ctx);
649*62c56f98SSadaf Ebrahimi#endif
650*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
651*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
652*62c56f98SSadaf Ebrahimi}
653*62c56f98SSadaf Ebrahimi/* END_CASE */
654*62c56f98SSadaf Ebrahimi
655*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
656*62c56f98SSadaf Ebrahimivoid pk_rsa_verify_ext_test_vec(data_t *message_str, int digest,
657*62c56f98SSadaf Ebrahimi                                int mod, char *input_N,
658*62c56f98SSadaf Ebrahimi                                char *input_E, data_t *result_str,
659*62c56f98SSadaf Ebrahimi                                int pk_type, int mgf1_hash_id,
660*62c56f98SSadaf Ebrahimi                                int salt_len, int sig_len,
661*62c56f98SSadaf Ebrahimi                                int result)
662*62c56f98SSadaf Ebrahimi{
663*62c56f98SSadaf Ebrahimi    mbedtls_rsa_context *rsa;
664*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
665*62c56f98SSadaf Ebrahimi    mbedtls_pk_rsassa_pss_options pss_opts;
666*62c56f98SSadaf Ebrahimi    void *options;
667*62c56f98SSadaf Ebrahimi    int ret;
668*62c56f98SSadaf Ebrahimi
669*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
670*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_INIT();
671*62c56f98SSadaf Ebrahimi
672*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
673*62c56f98SSadaf Ebrahimi    rsa = mbedtls_pk_rsa(pk);
674*62c56f98SSadaf Ebrahimi
675*62c56f98SSadaf Ebrahimi    rsa->len = mod / 8;
676*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->N, input_N) == 0);
677*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->E, input_E) == 0);
678*62c56f98SSadaf Ebrahimi
679*62c56f98SSadaf Ebrahimi
680*62c56f98SSadaf Ebrahimi    if (mgf1_hash_id < 0) {
681*62c56f98SSadaf Ebrahimi        options = NULL;
682*62c56f98SSadaf Ebrahimi    } else {
683*62c56f98SSadaf Ebrahimi        options = &pss_opts;
684*62c56f98SSadaf Ebrahimi
685*62c56f98SSadaf Ebrahimi        pss_opts.mgf1_hash_id = mgf1_hash_id;
686*62c56f98SSadaf Ebrahimi        pss_opts.expected_salt_len = salt_len;
687*62c56f98SSadaf Ebrahimi    }
688*62c56f98SSadaf Ebrahimi
689*62c56f98SSadaf Ebrahimi    ret = mbedtls_pk_verify_ext(pk_type, options, &pk,
690*62c56f98SSadaf Ebrahimi                                digest, message_str->x, message_str->len,
691*62c56f98SSadaf Ebrahimi                                result_str->x, sig_len);
692*62c56f98SSadaf Ebrahimi
693*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
694*62c56f98SSadaf Ebrahimi    if (result == MBEDTLS_ERR_RSA_INVALID_PADDING) {
695*62c56f98SSadaf Ebrahimi        /* Mbed TLS distinguishes "invalid padding" from "valid padding but
696*62c56f98SSadaf Ebrahimi         * the rest of the signature is invalid". This has little use in
697*62c56f98SSadaf Ebrahimi         * practice and PSA doesn't report this distinction.
698*62c56f98SSadaf Ebrahimi         * In this case, PSA returns PSA_ERROR_INVALID_SIGNATURE translated
699*62c56f98SSadaf Ebrahimi         * to MBEDTLS_ERR_RSA_VERIFY_FAILED.
700*62c56f98SSadaf Ebrahimi         * However, currently `mbedtls_pk_verify_ext()` may use either the
701*62c56f98SSadaf Ebrahimi         * PSA or the Mbed TLS API, depending on the PSS options used.
702*62c56f98SSadaf Ebrahimi         * So, it may return either INVALID_PADDING or INVALID_SIGNATURE.
703*62c56f98SSadaf Ebrahimi         */
704*62c56f98SSadaf Ebrahimi        TEST_ASSERT(ret == result || ret == MBEDTLS_ERR_RSA_VERIFY_FAILED);
705*62c56f98SSadaf Ebrahimi    } else
706*62c56f98SSadaf Ebrahimi#endif
707*62c56f98SSadaf Ebrahimi    {
708*62c56f98SSadaf Ebrahimi        TEST_EQUAL(ret, result);
709*62c56f98SSadaf Ebrahimi    }
710*62c56f98SSadaf Ebrahimi
711*62c56f98SSadaf Ebrahimiexit:
712*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
713*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_DONE();
714*62c56f98SSadaf Ebrahimi}
715*62c56f98SSadaf Ebrahimi/* END_CASE */
716*62c56f98SSadaf Ebrahimi
717*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PK_CAN_ECDSA_VERIFY */
718*62c56f98SSadaf Ebrahimivoid pk_ec_test_vec(int type, int id, data_t *key, data_t *hash,
719*62c56f98SSadaf Ebrahimi                    data_t *sig, int ret)
720*62c56f98SSadaf Ebrahimi{
721*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
722*62c56f98SSadaf Ebrahimi
723*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
724*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
725*62c56f98SSadaf Ebrahimi
726*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
727*62c56f98SSadaf Ebrahimi
728*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA));
729*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
730*62c56f98SSadaf Ebrahimi    TEST_ASSERT(key->len <= MBEDTLS_PK_MAX_EC_PUBKEY_RAW_LEN);
731*62c56f98SSadaf Ebrahimi    memcpy(pk.pub_raw, key->x, key->len);
732*62c56f98SSadaf Ebrahimi    pk.ec_family = mbedtls_ecc_group_to_psa(id, &(pk.ec_bits));
733*62c56f98SSadaf Ebrahimi    pk.pub_raw_len = key->len;
734*62c56f98SSadaf Ebrahimi#else
735*62c56f98SSadaf Ebrahimi    mbedtls_ecp_keypair *eckey = (mbedtls_ecp_keypair *) mbedtls_pk_ec(pk);
736*62c56f98SSadaf Ebrahimi
737*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_ecp_group_load(&eckey->grp, id) == 0);
738*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_ecp_point_read_binary(&eckey->grp, &eckey->Q,
739*62c56f98SSadaf Ebrahimi                                              key->x, key->len) == 0);
740*62c56f98SSadaf Ebrahimi#endif
741*62c56f98SSadaf Ebrahimi
742*62c56f98SSadaf Ebrahimi    // MBEDTLS_MD_NONE is used since it will be ignored.
743*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_NONE,
744*62c56f98SSadaf Ebrahimi                                  hash->x, hash->len, sig->x, sig->len) == ret);
745*62c56f98SSadaf Ebrahimi
746*62c56f98SSadaf Ebrahimiexit:
747*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
748*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
749*62c56f98SSadaf Ebrahimi}
750*62c56f98SSadaf Ebrahimi/* END_CASE */
751*62c56f98SSadaf Ebrahimi
752*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE:MBEDTLS_ECDSA_C:MBEDTLS_ECDSA_DETERMINISTIC */
753*62c56f98SSadaf Ebrahimivoid pk_sign_verify_restart(int pk_type, int grp_id, char *d_str,
754*62c56f98SSadaf Ebrahimi                            char *QX_str, char *QY_str,
755*62c56f98SSadaf Ebrahimi                            int md_alg, data_t *hash, data_t *sig_check,
756*62c56f98SSadaf Ebrahimi                            int max_ops, int min_restart, int max_restart)
757*62c56f98SSadaf Ebrahimi{
758*62c56f98SSadaf Ebrahimi    int ret, cnt_restart;
759*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_ctx rs_ctx;
760*62c56f98SSadaf Ebrahimi    mbedtls_pk_context prv, pub;
761*62c56f98SSadaf Ebrahimi    unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];
762*62c56f98SSadaf Ebrahimi    size_t slen;
763*62c56f98SSadaf Ebrahimi
764*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_init(&rs_ctx);
765*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&prv);
766*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pub);
767*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
768*62c56f98SSadaf Ebrahimi
769*62c56f98SSadaf Ebrahimi    memset(sig, 0, sizeof(sig));
770*62c56f98SSadaf Ebrahimi
771*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&prv, mbedtls_pk_info_from_type(pk_type)) == 0);
772*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_ecp_group_load(&mbedtls_pk_ec_rw(prv)->grp, grp_id) == 0);
773*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&mbedtls_pk_ec_rw(prv)->d, d_str) == 0);
774*62c56f98SSadaf Ebrahimi
775*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pub, mbedtls_pk_info_from_type(pk_type)) == 0);
776*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_ecp_group_load(&mbedtls_pk_ec_rw(pub)->grp, grp_id) == 0);
777*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_ecp_point_read_string(&mbedtls_pk_ec_rw(pub)->Q, 16, QX_str, QY_str) == 0);
778*62c56f98SSadaf Ebrahimi
779*62c56f98SSadaf Ebrahimi    mbedtls_ecp_set_max_ops(max_ops);
780*62c56f98SSadaf Ebrahimi
781*62c56f98SSadaf Ebrahimi    slen = sizeof(sig);
782*62c56f98SSadaf Ebrahimi    cnt_restart = 0;
783*62c56f98SSadaf Ebrahimi    do {
784*62c56f98SSadaf Ebrahimi        ret = mbedtls_pk_sign_restartable(&prv, md_alg, hash->x, hash->len,
785*62c56f98SSadaf Ebrahimi                                          sig, sizeof(sig), &slen,
786*62c56f98SSadaf Ebrahimi                                          mbedtls_test_rnd_std_rand, NULL,
787*62c56f98SSadaf Ebrahimi                                          &rs_ctx);
788*62c56f98SSadaf Ebrahimi    } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart);
789*62c56f98SSadaf Ebrahimi
790*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret == 0);
791*62c56f98SSadaf Ebrahimi    TEST_ASSERT(slen == sig_check->len);
792*62c56f98SSadaf Ebrahimi    TEST_ASSERT(memcmp(sig, sig_check->x, slen) == 0);
793*62c56f98SSadaf Ebrahimi
794*62c56f98SSadaf Ebrahimi    TEST_ASSERT(cnt_restart >= min_restart);
795*62c56f98SSadaf Ebrahimi    TEST_ASSERT(cnt_restart <= max_restart);
796*62c56f98SSadaf Ebrahimi
797*62c56f98SSadaf Ebrahimi    cnt_restart = 0;
798*62c56f98SSadaf Ebrahimi    do {
799*62c56f98SSadaf Ebrahimi        ret = mbedtls_pk_verify_restartable(&pub, md_alg,
800*62c56f98SSadaf Ebrahimi                                            hash->x, hash->len, sig, slen, &rs_ctx);
801*62c56f98SSadaf Ebrahimi    } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart);
802*62c56f98SSadaf Ebrahimi
803*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret == 0);
804*62c56f98SSadaf Ebrahimi    TEST_ASSERT(cnt_restart >= min_restart);
805*62c56f98SSadaf Ebrahimi    TEST_ASSERT(cnt_restart <= max_restart);
806*62c56f98SSadaf Ebrahimi
807*62c56f98SSadaf Ebrahimi    sig[0]++;
808*62c56f98SSadaf Ebrahimi    do {
809*62c56f98SSadaf Ebrahimi        ret = mbedtls_pk_verify_restartable(&pub, md_alg,
810*62c56f98SSadaf Ebrahimi                                            hash->x, hash->len, sig, slen, &rs_ctx);
811*62c56f98SSadaf Ebrahimi    } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
812*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret != 0);
813*62c56f98SSadaf Ebrahimi    sig[0]--;
814*62c56f98SSadaf Ebrahimi
815*62c56f98SSadaf Ebrahimi    /* Do we leak memory when aborting? try verify then sign
816*62c56f98SSadaf Ebrahimi     * This test only makes sense when we actually restart */
817*62c56f98SSadaf Ebrahimi    if (min_restart > 0) {
818*62c56f98SSadaf Ebrahimi        ret = mbedtls_pk_verify_restartable(&pub, md_alg,
819*62c56f98SSadaf Ebrahimi                                            hash->x, hash->len, sig, slen, &rs_ctx);
820*62c56f98SSadaf Ebrahimi        TEST_ASSERT(ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
821*62c56f98SSadaf Ebrahimi        mbedtls_pk_restart_free(&rs_ctx);
822*62c56f98SSadaf Ebrahimi
823*62c56f98SSadaf Ebrahimi        slen = sizeof(sig);
824*62c56f98SSadaf Ebrahimi        ret = mbedtls_pk_sign_restartable(&prv, md_alg, hash->x, hash->len,
825*62c56f98SSadaf Ebrahimi                                          sig, sizeof(sig), &slen,
826*62c56f98SSadaf Ebrahimi                                          mbedtls_test_rnd_std_rand, NULL,
827*62c56f98SSadaf Ebrahimi                                          &rs_ctx);
828*62c56f98SSadaf Ebrahimi        TEST_ASSERT(ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
829*62c56f98SSadaf Ebrahimi    }
830*62c56f98SSadaf Ebrahimi
831*62c56f98SSadaf Ebrahimiexit:
832*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_free(&rs_ctx);
833*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&prv);
834*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pub);
835*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
836*62c56f98SSadaf Ebrahimi}
837*62c56f98SSadaf Ebrahimi/* END_CASE */
838*62c56f98SSadaf Ebrahimi
839*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_MD_CAN_SHA256 */
840*62c56f98SSadaf Ebrahimivoid pk_sign_verify(int type, int parameter, int sign_ret, int verify_ret)
841*62c56f98SSadaf Ebrahimi{
842*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
843*62c56f98SSadaf Ebrahimi    size_t sig_len;
844*62c56f98SSadaf Ebrahimi    unsigned char hash[32]; // Hard-coded for SHA256
845*62c56f98SSadaf Ebrahimi    size_t hash_len = sizeof(hash);
846*62c56f98SSadaf Ebrahimi    unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
847*62c56f98SSadaf Ebrahimi    void *rs_ctx = NULL;
848*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
849*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_ctx ctx;
850*62c56f98SSadaf Ebrahimi
851*62c56f98SSadaf Ebrahimi    rs_ctx = &ctx;
852*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_init(rs_ctx);
853*62c56f98SSadaf Ebrahimi    /* This value is large enough that the operation will complete in one run.
854*62c56f98SSadaf Ebrahimi     * See comments at the top of ecp_test_vect_restart in
855*62c56f98SSadaf Ebrahimi     * test_suite_ecp.function for estimates of operation counts. */
856*62c56f98SSadaf Ebrahimi    mbedtls_ecp_set_max_ops(42000);
857*62c56f98SSadaf Ebrahimi#endif
858*62c56f98SSadaf Ebrahimi
859*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
860*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_INIT();
861*62c56f98SSadaf Ebrahimi
862*62c56f98SSadaf Ebrahimi    memset(hash, 0x2a, sizeof(hash));
863*62c56f98SSadaf Ebrahimi    memset(sig, 0, sizeof(sig));
864*62c56f98SSadaf Ebrahimi
865*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
866*62c56f98SSadaf Ebrahimi    TEST_ASSERT(pk_genkey(&pk, parameter) == 0);
867*62c56f98SSadaf Ebrahimi
868*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign_restartable(&pk, MBEDTLS_MD_SHA256,
869*62c56f98SSadaf Ebrahimi                                            hash, hash_len,
870*62c56f98SSadaf Ebrahimi                                            sig, sizeof(sig), &sig_len,
871*62c56f98SSadaf Ebrahimi                                            mbedtls_test_rnd_std_rand, NULL,
872*62c56f98SSadaf Ebrahimi                                            rs_ctx) == sign_ret);
873*62c56f98SSadaf Ebrahimi    if (sign_ret == 0) {
874*62c56f98SSadaf Ebrahimi        TEST_ASSERT(sig_len <= MBEDTLS_PK_SIGNATURE_MAX_SIZE);
875*62c56f98SSadaf Ebrahimi    } else {
876*62c56f98SSadaf Ebrahimi        sig_len = MBEDTLS_PK_SIGNATURE_MAX_SIZE;
877*62c56f98SSadaf Ebrahimi    }
878*62c56f98SSadaf Ebrahimi
879*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
880*62c56f98SSadaf Ebrahimi                                  hash, hash_len, sig, sig_len) == verify_ret);
881*62c56f98SSadaf Ebrahimi
882*62c56f98SSadaf Ebrahimi    if (verify_ret == 0) {
883*62c56f98SSadaf Ebrahimi        hash[0]++;
884*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
885*62c56f98SSadaf Ebrahimi                                      hash, hash_len, sig, sig_len) != 0);
886*62c56f98SSadaf Ebrahimi        hash[0]--;
887*62c56f98SSadaf Ebrahimi
888*62c56f98SSadaf Ebrahimi        sig[0]++;
889*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
890*62c56f98SSadaf Ebrahimi                                      hash, hash_len, sig, sig_len) != 0);
891*62c56f98SSadaf Ebrahimi        sig[0]--;
892*62c56f98SSadaf Ebrahimi    }
893*62c56f98SSadaf Ebrahimi
894*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign(&pk, MBEDTLS_MD_SHA256, hash, hash_len,
895*62c56f98SSadaf Ebrahimi                                sig, sizeof(sig), &sig_len,
896*62c56f98SSadaf Ebrahimi                                mbedtls_test_rnd_std_rand,
897*62c56f98SSadaf Ebrahimi                                NULL) == sign_ret);
898*62c56f98SSadaf Ebrahimi    if (sign_ret == 0) {
899*62c56f98SSadaf Ebrahimi        TEST_ASSERT(sig_len <= MBEDTLS_PK_SIGNATURE_MAX_SIZE);
900*62c56f98SSadaf Ebrahimi    } else {
901*62c56f98SSadaf Ebrahimi        sig_len = MBEDTLS_PK_SIGNATURE_MAX_SIZE;
902*62c56f98SSadaf Ebrahimi    }
903*62c56f98SSadaf Ebrahimi
904*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, MBEDTLS_MD_SHA256,
905*62c56f98SSadaf Ebrahimi                                              hash, hash_len, sig, sig_len, rs_ctx) == verify_ret);
906*62c56f98SSadaf Ebrahimi
907*62c56f98SSadaf Ebrahimi    if (verify_ret == 0) {
908*62c56f98SSadaf Ebrahimi        hash[0]++;
909*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, MBEDTLS_MD_SHA256,
910*62c56f98SSadaf Ebrahimi                                                  hash, sizeof(hash), sig, sig_len, rs_ctx) != 0);
911*62c56f98SSadaf Ebrahimi        hash[0]--;
912*62c56f98SSadaf Ebrahimi
913*62c56f98SSadaf Ebrahimi        sig[0]++;
914*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, MBEDTLS_MD_SHA256,
915*62c56f98SSadaf Ebrahimi                                                  hash, sizeof(hash), sig, sig_len, rs_ctx) != 0);
916*62c56f98SSadaf Ebrahimi        sig[0]--;
917*62c56f98SSadaf Ebrahimi    }
918*62c56f98SSadaf Ebrahimi
919*62c56f98SSadaf Ebrahimiexit:
920*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
921*62c56f98SSadaf Ebrahimi    mbedtls_pk_restart_free(rs_ctx);
922*62c56f98SSadaf Ebrahimi#endif
923*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
924*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_DONE();
925*62c56f98SSadaf Ebrahimi}
926*62c56f98SSadaf Ebrahimi/* END_CASE */
927*62c56f98SSadaf Ebrahimi
928*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
929*62c56f98SSadaf Ebrahimivoid pk_rsa_encrypt_decrypt_test(data_t *message, int mod,
930*62c56f98SSadaf Ebrahimi                                 char *input_P, char *input_Q,
931*62c56f98SSadaf Ebrahimi                                 char *input_N, char *input_E,
932*62c56f98SSadaf Ebrahimi                                 int ret)
933*62c56f98SSadaf Ebrahimi{
934*62c56f98SSadaf Ebrahimi    unsigned char output[300], result[300];
935*62c56f98SSadaf Ebrahimi    mbedtls_test_rnd_pseudo_info rnd_info;
936*62c56f98SSadaf Ebrahimi    mbedtls_mpi N, P, Q, E;
937*62c56f98SSadaf Ebrahimi    mbedtls_rsa_context *rsa;
938*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
939*62c56f98SSadaf Ebrahimi    size_t olen, rlen;
940*62c56f98SSadaf Ebrahimi
941*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
942*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
943*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
944*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
945*62c56f98SSadaf Ebrahimi
946*62c56f98SSadaf Ebrahimi    memset(&rnd_info,  0, sizeof(mbedtls_test_rnd_pseudo_info));
947*62c56f98SSadaf Ebrahimi    memset(output,     0, sizeof(output));
948*62c56f98SSadaf Ebrahimi
949*62c56f98SSadaf Ebrahimi    /* encryption test */
950*62c56f98SSadaf Ebrahimi
951*62c56f98SSadaf Ebrahimi    /* init pk-rsa context */
952*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
953*62c56f98SSadaf Ebrahimi    rsa = mbedtls_pk_rsa(pk);
954*62c56f98SSadaf Ebrahimi
955*62c56f98SSadaf Ebrahimi    /* load public key */
956*62c56f98SSadaf Ebrahimi    rsa->len = mod / 8;
957*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->N, input_N) == 0);
958*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&rsa->E, input_E) == 0);
959*62c56f98SSadaf Ebrahimi
960*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_encrypt(&pk, message->x, message->len,
961*62c56f98SSadaf Ebrahimi                                   output, &olen, sizeof(output),
962*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
963*62c56f98SSadaf Ebrahimi
964*62c56f98SSadaf Ebrahimi    /* decryption test */
965*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
966*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
967*62c56f98SSadaf Ebrahimi
968*62c56f98SSadaf Ebrahimi    /* init pk-rsa context */
969*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
970*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk,
971*62c56f98SSadaf Ebrahimi                                 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
972*62c56f98SSadaf Ebrahimi    rsa = mbedtls_pk_rsa(pk);
973*62c56f98SSadaf Ebrahimi
974*62c56f98SSadaf Ebrahimi    /* load public key */
975*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
976*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
977*62c56f98SSadaf Ebrahimi
978*62c56f98SSadaf Ebrahimi    /* load private key */
979*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&P, input_P) == 0);
980*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&Q, input_Q) == 0);
981*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_rsa_import(rsa, &N, &P, &Q, NULL, &E) == 0);
982*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_rsa_get_len(rsa) == (size_t) (mod / 8));
983*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_rsa_complete(rsa) == 0);
984*62c56f98SSadaf Ebrahimi
985*62c56f98SSadaf Ebrahimi    memset(result, 0, sizeof(result));
986*62c56f98SSadaf Ebrahimi    rlen = 0;
987*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_decrypt(&pk, output, olen,
988*62c56f98SSadaf Ebrahimi                                   result, &rlen, sizeof(result),
989*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
990*62c56f98SSadaf Ebrahimi    if (ret == 0) {
991*62c56f98SSadaf Ebrahimi        TEST_ASSERT(rlen == message->len);
992*62c56f98SSadaf Ebrahimi        TEST_ASSERT(memcmp(result, message->x, rlen) == 0);
993*62c56f98SSadaf Ebrahimi    }
994*62c56f98SSadaf Ebrahimi
995*62c56f98SSadaf Ebrahimiexit:
996*62c56f98SSadaf Ebrahimi    mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
997*62c56f98SSadaf Ebrahimi    mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
998*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
999*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
1000*62c56f98SSadaf Ebrahimi}
1001*62c56f98SSadaf Ebrahimi/* END_CASE */
1002*62c56f98SSadaf Ebrahimi
1003*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
1004*62c56f98SSadaf Ebrahimivoid pk_rsa_decrypt_test_vec(data_t *cipher, int mod,
1005*62c56f98SSadaf Ebrahimi                             char *input_P, char *input_Q,
1006*62c56f98SSadaf Ebrahimi                             char *input_N, char *input_E,
1007*62c56f98SSadaf Ebrahimi                             data_t *clear, int ret)
1008*62c56f98SSadaf Ebrahimi{
1009*62c56f98SSadaf Ebrahimi    unsigned char output[256];
1010*62c56f98SSadaf Ebrahimi    mbedtls_test_rnd_pseudo_info rnd_info;
1011*62c56f98SSadaf Ebrahimi    mbedtls_mpi N, P, Q, E;
1012*62c56f98SSadaf Ebrahimi    mbedtls_rsa_context *rsa;
1013*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
1014*62c56f98SSadaf Ebrahimi    size_t olen;
1015*62c56f98SSadaf Ebrahimi
1016*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1017*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1018*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
1019*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
1020*62c56f98SSadaf Ebrahimi
1021*62c56f98SSadaf Ebrahimi    memset(&rnd_info,  0, sizeof(mbedtls_test_rnd_pseudo_info));
1022*62c56f98SSadaf Ebrahimi
1023*62c56f98SSadaf Ebrahimi    /* init pk-rsa context */
1024*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1025*62c56f98SSadaf Ebrahimi    rsa = mbedtls_pk_rsa(pk);
1026*62c56f98SSadaf Ebrahimi
1027*62c56f98SSadaf Ebrahimi    /* load public key */
1028*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
1029*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
1030*62c56f98SSadaf Ebrahimi
1031*62c56f98SSadaf Ebrahimi    /* load private key */
1032*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&P, input_P) == 0);
1033*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_test_read_mpi(&Q, input_Q) == 0);
1034*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_rsa_import(rsa, &N, &P, &Q, NULL, &E) == 0);
1035*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_rsa_get_len(rsa) == (size_t) (mod / 8));
1036*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_rsa_complete(rsa) == 0);
1037*62c56f98SSadaf Ebrahimi
1038*62c56f98SSadaf Ebrahimi    /* decryption test */
1039*62c56f98SSadaf Ebrahimi    memset(output, 0, sizeof(output));
1040*62c56f98SSadaf Ebrahimi    olen = 0;
1041*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_decrypt(&pk, cipher->x, cipher->len,
1042*62c56f98SSadaf Ebrahimi                                   output, &olen, sizeof(output),
1043*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1044*62c56f98SSadaf Ebrahimi    if (ret == 0) {
1045*62c56f98SSadaf Ebrahimi        TEST_ASSERT(olen == clear->len);
1046*62c56f98SSadaf Ebrahimi        TEST_ASSERT(memcmp(output, clear->x, olen) == 0);
1047*62c56f98SSadaf Ebrahimi    }
1048*62c56f98SSadaf Ebrahimi
1049*62c56f98SSadaf Ebrahimiexit:
1050*62c56f98SSadaf Ebrahimi    mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
1051*62c56f98SSadaf Ebrahimi    mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
1052*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
1053*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
1054*62c56f98SSadaf Ebrahimi}
1055*62c56f98SSadaf Ebrahimi/* END_CASE */
1056*62c56f98SSadaf Ebrahimi
1057*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_USE_PSA_CRYPTO */
1058*62c56f98SSadaf Ebrahimivoid pk_wrap_rsa_decrypt_test_vec(data_t *cipher, int mod,
1059*62c56f98SSadaf Ebrahimi                                  char *input_P, char *input_Q,
1060*62c56f98SSadaf Ebrahimi                                  char *input_N, char *input_E,
1061*62c56f98SSadaf Ebrahimi                                  data_t *clear, int ret)
1062*62c56f98SSadaf Ebrahimi{
1063*62c56f98SSadaf Ebrahimi    unsigned char output[256];
1064*62c56f98SSadaf Ebrahimi    mbedtls_test_rnd_pseudo_info rnd_info;
1065*62c56f98SSadaf Ebrahimi    mbedtls_mpi N, P, Q, E;
1066*62c56f98SSadaf Ebrahimi    mbedtls_rsa_context *rsa;
1067*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
1068*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t key_id;
1069*62c56f98SSadaf Ebrahimi    size_t olen;
1070*62c56f98SSadaf Ebrahimi
1071*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1072*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1073*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
1074*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
1075*62c56f98SSadaf Ebrahimi
1076*62c56f98SSadaf Ebrahimi    memset(&rnd_info,  0, sizeof(mbedtls_test_rnd_pseudo_info));
1077*62c56f98SSadaf Ebrahimi
1078*62c56f98SSadaf Ebrahimi    /* init pk-rsa context */
1079*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_setup(&pk,
1080*62c56f98SSadaf Ebrahimi                                mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)), 0);
1081*62c56f98SSadaf Ebrahimi    rsa = mbedtls_pk_rsa(pk);
1082*62c56f98SSadaf Ebrahimi
1083*62c56f98SSadaf Ebrahimi    /* load public key */
1084*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_test_read_mpi(&N, input_N), 0);
1085*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_test_read_mpi(&E, input_E), 0);
1086*62c56f98SSadaf Ebrahimi
1087*62c56f98SSadaf Ebrahimi    /* load private key */
1088*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_test_read_mpi(&P, input_P), 0);
1089*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_test_read_mpi(&Q, input_Q), 0);
1090*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_rsa_import(rsa, &N, &P, &Q, NULL, &E), 0);
1091*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_rsa_get_len(rsa), (size_t) (mod / 8));
1092*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_rsa_complete(rsa), 0);
1093*62c56f98SSadaf Ebrahimi
1094*62c56f98SSadaf Ebrahimi    /* Turn PK context into an opaque one. */
1095*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_wrap_as_opaque(&pk, &key_id,
1096*62c56f98SSadaf Ebrahimi                                         PSA_ALG_RSA_PKCS1V15_CRYPT,
1097*62c56f98SSadaf Ebrahimi                                         PSA_KEY_USAGE_DECRYPT,
1098*62c56f98SSadaf Ebrahimi                                         PSA_ALG_NONE), 0);
1099*62c56f98SSadaf Ebrahimi
1100*62c56f98SSadaf Ebrahimi    /* decryption test */
1101*62c56f98SSadaf Ebrahimi    memset(output, 0, sizeof(output));
1102*62c56f98SSadaf Ebrahimi    olen = 0;
1103*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_decrypt(&pk, cipher->x, cipher->len,
1104*62c56f98SSadaf Ebrahimi                                  output, &olen, sizeof(output),
1105*62c56f98SSadaf Ebrahimi                                  mbedtls_test_rnd_pseudo_rand, &rnd_info), ret);
1106*62c56f98SSadaf Ebrahimi    if (ret == 0) {
1107*62c56f98SSadaf Ebrahimi        TEST_EQUAL(olen, clear->len);
1108*62c56f98SSadaf Ebrahimi        TEST_EQUAL(memcmp(output, clear->x, olen), 0);
1109*62c56f98SSadaf Ebrahimi    }
1110*62c56f98SSadaf Ebrahimi
1111*62c56f98SSadaf Ebrahimi    TEST_EQUAL(PSA_SUCCESS, psa_destroy_key(key_id));
1112*62c56f98SSadaf Ebrahimi
1113*62c56f98SSadaf Ebrahimiexit:
1114*62c56f98SSadaf Ebrahimi    mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
1115*62c56f98SSadaf Ebrahimi    mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
1116*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
1117*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
1118*62c56f98SSadaf Ebrahimi}
1119*62c56f98SSadaf Ebrahimi/* END_CASE */
1120*62c56f98SSadaf Ebrahimi
1121*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */
1122*62c56f98SSadaf Ebrahimivoid pk_ec_nocrypt(int type)
1123*62c56f98SSadaf Ebrahimi{
1124*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
1125*62c56f98SSadaf Ebrahimi    unsigned char output[100];
1126*62c56f98SSadaf Ebrahimi    unsigned char input[100];
1127*62c56f98SSadaf Ebrahimi    mbedtls_test_rnd_pseudo_info rnd_info;
1128*62c56f98SSadaf Ebrahimi    size_t olen = 0;
1129*62c56f98SSadaf Ebrahimi    int ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
1130*62c56f98SSadaf Ebrahimi
1131*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1132*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
1133*62c56f98SSadaf Ebrahimi
1134*62c56f98SSadaf Ebrahimi    memset(&rnd_info,  0, sizeof(mbedtls_test_rnd_pseudo_info));
1135*62c56f98SSadaf Ebrahimi    memset(output,     0, sizeof(output));
1136*62c56f98SSadaf Ebrahimi    memset(input,      0, sizeof(input));
1137*62c56f98SSadaf Ebrahimi
1138*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
1139*62c56f98SSadaf Ebrahimi
1140*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_encrypt(&pk, input, sizeof(input),
1141*62c56f98SSadaf Ebrahimi                                   output, &olen, sizeof(output),
1142*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1143*62c56f98SSadaf Ebrahimi
1144*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_decrypt(&pk, input, sizeof(input),
1145*62c56f98SSadaf Ebrahimi                                   output, &olen, sizeof(output),
1146*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1147*62c56f98SSadaf Ebrahimi
1148*62c56f98SSadaf Ebrahimiexit:
1149*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
1150*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
1151*62c56f98SSadaf Ebrahimi}
1152*62c56f98SSadaf Ebrahimi/* END_CASE */
1153*62c56f98SSadaf Ebrahimi
1154*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
1155*62c56f98SSadaf Ebrahimivoid pk_rsa_overflow()
1156*62c56f98SSadaf Ebrahimi{
1157*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
1158*62c56f98SSadaf Ebrahimi    size_t hash_len = UINT_MAX + 1, sig_len = UINT_MAX + 1;
1159*62c56f98SSadaf Ebrahimi    unsigned char hash[50], sig[100];
1160*62c56f98SSadaf Ebrahimi
1161*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1162*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
1163*62c56f98SSadaf Ebrahimi
1164*62c56f98SSadaf Ebrahimi    memset(hash, 0x2a, sizeof(hash));
1165*62c56f98SSadaf Ebrahimi    memset(sig, 0, sizeof(sig));
1166*62c56f98SSadaf Ebrahimi
1167*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk,
1168*62c56f98SSadaf Ebrahimi                                 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1169*62c56f98SSadaf Ebrahimi
1170*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PKCS1_V21)
1171*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify_ext(MBEDTLS_PK_RSASSA_PSS, NULL, &pk,
1172*62c56f98SSadaf Ebrahimi                                      MBEDTLS_MD_NONE, hash, hash_len, sig, sig_len) ==
1173*62c56f98SSadaf Ebrahimi                MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1174*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_PKCS1_V21 */
1175*62c56f98SSadaf Ebrahimi
1176*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_NONE, hash, hash_len,
1177*62c56f98SSadaf Ebrahimi                                  sig, sig_len) == MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1178*62c56f98SSadaf Ebrahimi
1179*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign(&pk, MBEDTLS_MD_NONE, hash, hash_len,
1180*62c56f98SSadaf Ebrahimi                                sig, sizeof(sig), &sig_len,
1181*62c56f98SSadaf Ebrahimi                                mbedtls_test_rnd_std_rand, NULL)
1182*62c56f98SSadaf Ebrahimi                == MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1183*62c56f98SSadaf Ebrahimi
1184*62c56f98SSadaf Ebrahimiexit:
1185*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
1186*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
1187*62c56f98SSadaf Ebrahimi}
1188*62c56f98SSadaf Ebrahimi/* END_CASE */
1189*62c56f98SSadaf Ebrahimi
1190*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_PK_RSA_ALT_SUPPORT */
1191*62c56f98SSadaf Ebrahimivoid pk_rsa_alt()
1192*62c56f98SSadaf Ebrahimi{
1193*62c56f98SSadaf Ebrahimi    /*
1194*62c56f98SSadaf Ebrahimi     * An rsa_alt context can only do private operations (decrypt, sign).
1195*62c56f98SSadaf Ebrahimi     * Test it against the public operations (encrypt, verify) of a
1196*62c56f98SSadaf Ebrahimi     * corresponding rsa context.
1197*62c56f98SSadaf Ebrahimi     */
1198*62c56f98SSadaf Ebrahimi    mbedtls_rsa_context raw;
1199*62c56f98SSadaf Ebrahimi    mbedtls_pk_context rsa, alt;
1200*62c56f98SSadaf Ebrahimi    mbedtls_pk_debug_item dbg_items[10];
1201*62c56f98SSadaf Ebrahimi    unsigned char hash[50], sig[RSA_KEY_LEN];
1202*62c56f98SSadaf Ebrahimi    unsigned char msg[50], ciph[RSA_KEY_LEN], test[50];
1203*62c56f98SSadaf Ebrahimi    size_t sig_len, ciph_len, test_len;
1204*62c56f98SSadaf Ebrahimi    int ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
1205*62c56f98SSadaf Ebrahimi
1206*62c56f98SSadaf Ebrahimi    mbedtls_rsa_init(&raw);
1207*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&rsa);
1208*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&alt);
1209*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
1210*62c56f98SSadaf Ebrahimi
1211*62c56f98SSadaf Ebrahimi    memset(hash, 0x2a, sizeof(hash));
1212*62c56f98SSadaf Ebrahimi    memset(sig, 0, sizeof(sig));
1213*62c56f98SSadaf Ebrahimi    memset(msg, 0x2a, sizeof(msg));
1214*62c56f98SSadaf Ebrahimi    memset(ciph, 0, sizeof(ciph));
1215*62c56f98SSadaf Ebrahimi    memset(test, 0, sizeof(test));
1216*62c56f98SSadaf Ebrahimi
1217*62c56f98SSadaf Ebrahimi    /* Initialize PK RSA context with random key */
1218*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&rsa,
1219*62c56f98SSadaf Ebrahimi                                 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1220*62c56f98SSadaf Ebrahimi    TEST_ASSERT(pk_genkey(&rsa, RSA_KEY_SIZE) == 0);
1221*62c56f98SSadaf Ebrahimi
1222*62c56f98SSadaf Ebrahimi    /* Extract key to the raw rsa context */
1223*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_rsa_copy(&raw, mbedtls_pk_rsa(rsa)) == 0);
1224*62c56f98SSadaf Ebrahimi
1225*62c56f98SSadaf Ebrahimi    /* Initialize PK RSA_ALT context */
1226*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup_rsa_alt(&alt, (void *) &raw,
1227*62c56f98SSadaf Ebrahimi                                         mbedtls_rsa_decrypt_func, mbedtls_rsa_sign_func,
1228*62c56f98SSadaf Ebrahimi                                         mbedtls_rsa_key_len_func) == 0);
1229*62c56f98SSadaf Ebrahimi
1230*62c56f98SSadaf Ebrahimi    /* Test administrative functions */
1231*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_can_do(&alt, MBEDTLS_PK_RSA));
1232*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_bitlen(&alt) == RSA_KEY_SIZE);
1233*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_len(&alt) == RSA_KEY_LEN);
1234*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_get_type(&alt) == MBEDTLS_PK_RSA_ALT);
1235*62c56f98SSadaf Ebrahimi    TEST_ASSERT(strcmp(mbedtls_pk_get_name(&alt), "RSA-alt") == 0);
1236*62c56f98SSadaf Ebrahimi
1237*62c56f98SSadaf Ebrahimi    /* Test signature */
1238*62c56f98SSadaf Ebrahimi#if SIZE_MAX > UINT_MAX
1239*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign(&alt, MBEDTLS_MD_NONE, hash, SIZE_MAX,
1240*62c56f98SSadaf Ebrahimi                                sig, sizeof(sig), &sig_len,
1241*62c56f98SSadaf Ebrahimi                                mbedtls_test_rnd_std_rand, NULL)
1242*62c56f98SSadaf Ebrahimi                == MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1243*62c56f98SSadaf Ebrahimi#endif /* SIZE_MAX > UINT_MAX */
1244*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign(&alt, MBEDTLS_MD_NONE, hash, sizeof(hash),
1245*62c56f98SSadaf Ebrahimi                                sig, sizeof(sig), &sig_len,
1246*62c56f98SSadaf Ebrahimi                                mbedtls_test_rnd_std_rand, NULL)
1247*62c56f98SSadaf Ebrahimi                == 0);
1248*62c56f98SSadaf Ebrahimi    TEST_ASSERT(sig_len == RSA_KEY_LEN);
1249*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify(&rsa, MBEDTLS_MD_NONE,
1250*62c56f98SSadaf Ebrahimi                                  hash, sizeof(hash), sig, sig_len) == 0);
1251*62c56f98SSadaf Ebrahimi
1252*62c56f98SSadaf Ebrahimi    /* Test decrypt */
1253*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_encrypt(&rsa, msg, sizeof(msg),
1254*62c56f98SSadaf Ebrahimi                                   ciph, &ciph_len, sizeof(ciph),
1255*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_std_rand, NULL) == 0);
1256*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_decrypt(&alt, ciph, ciph_len,
1257*62c56f98SSadaf Ebrahimi                                   test, &test_len, sizeof(test),
1258*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_std_rand, NULL) == 0);
1259*62c56f98SSadaf Ebrahimi    TEST_ASSERT(test_len == sizeof(msg));
1260*62c56f98SSadaf Ebrahimi    TEST_ASSERT(memcmp(test, msg, test_len) == 0);
1261*62c56f98SSadaf Ebrahimi
1262*62c56f98SSadaf Ebrahimi    /* Test forbidden operations */
1263*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_encrypt(&alt, msg, sizeof(msg),
1264*62c56f98SSadaf Ebrahimi                                   ciph, &ciph_len, sizeof(ciph),
1265*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_std_rand, NULL) == ret);
1266*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify(&alt, MBEDTLS_MD_NONE,
1267*62c56f98SSadaf Ebrahimi                                  hash, sizeof(hash), sig, sig_len) == ret);
1268*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_debug(&alt, dbg_items) == ret);
1269*62c56f98SSadaf Ebrahimi
1270*62c56f98SSadaf Ebrahimiexit:
1271*62c56f98SSadaf Ebrahimi    mbedtls_rsa_free(&raw);
1272*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&rsa); mbedtls_pk_free(&alt);
1273*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
1274*62c56f98SSadaf Ebrahimi}
1275*62c56f98SSadaf Ebrahimi/* END_CASE */
1276*62c56f98SSadaf Ebrahimi
1277*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_MD_CAN_SHA256:MBEDTLS_USE_PSA_CRYPTO */
1278*62c56f98SSadaf Ebrahimivoid pk_psa_sign(int parameter_arg,
1279*62c56f98SSadaf Ebrahimi                 int psa_type_arg, int expected_bits_arg)
1280*62c56f98SSadaf Ebrahimi{
1281*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
1282*62c56f98SSadaf Ebrahimi    unsigned char hash[32];
1283*62c56f98SSadaf Ebrahimi    unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
1284*62c56f98SSadaf Ebrahimi    unsigned char pkey_legacy[200];
1285*62c56f98SSadaf Ebrahimi    unsigned char pkey_psa[200];
1286*62c56f98SSadaf Ebrahimi    unsigned char *pkey_legacy_start, *pkey_psa_start;
1287*62c56f98SSadaf Ebrahimi    psa_algorithm_t alg_psa;
1288*62c56f98SSadaf Ebrahimi    size_t sig_len, klen_legacy, klen_psa;
1289*62c56f98SSadaf Ebrahimi    int ret;
1290*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t key_id;
1291*62c56f98SSadaf Ebrahimi    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1292*62c56f98SSadaf Ebrahimi    psa_key_type_t expected_type = psa_type_arg;
1293*62c56f98SSadaf Ebrahimi    size_t expected_bits = expected_bits_arg;
1294*62c56f98SSadaf Ebrahimi
1295*62c56f98SSadaf Ebrahimi    /*
1296*62c56f98SSadaf Ebrahimi     * This tests making signatures with a wrapped PSA key:
1297*62c56f98SSadaf Ebrahimi     * - generate a fresh ECP/RSA legacy PK context
1298*62c56f98SSadaf Ebrahimi     * - wrap it in a PK context and make a signature this way
1299*62c56f98SSadaf Ebrahimi     * - extract the public key
1300*62c56f98SSadaf Ebrahimi     * - parse it to a PK context and verify the signature this way
1301*62c56f98SSadaf Ebrahimi     */
1302*62c56f98SSadaf Ebrahimi
1303*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1304*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
1305*62c56f98SSadaf Ebrahimi
1306*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)
1307*62c56f98SSadaf Ebrahimi    if (PSA_KEY_TYPE_IS_RSA(psa_type_arg)) {
1308*62c56f98SSadaf Ebrahimi        /* Create legacy RSA public/private key in PK context. */
1309*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_setup(&pk,
1310*62c56f98SSadaf Ebrahimi                                     mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1311*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_rsa_gen_key(mbedtls_pk_rsa(pk),
1312*62c56f98SSadaf Ebrahimi                                        mbedtls_test_rnd_std_rand, NULL,
1313*62c56f98SSadaf Ebrahimi                                        parameter_arg, 3) == 0);
1314*62c56f98SSadaf Ebrahimi        alg_psa = PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_256);
1315*62c56f98SSadaf Ebrahimi    } else
1316*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_RSA_C && MBEDTLS_GENPRIME */
1317*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
1318*62c56f98SSadaf Ebrahimi    if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(psa_type_arg)) {
1319*62c56f98SSadaf Ebrahimi        mbedtls_ecp_group_id grpid = parameter_arg;
1320*62c56f98SSadaf Ebrahimi
1321*62c56f98SSadaf Ebrahimi        /* Create legacy EC public/private key in PK context. */
1322*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_setup(&pk,
1323*62c56f98SSadaf Ebrahimi                                     mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)) == 0);
1324*62c56f98SSadaf Ebrahimi        TEST_ASSERT(pk_genkey(&pk, grpid) == 0);
1325*62c56f98SSadaf Ebrahimi
1326*62c56f98SSadaf Ebrahimi        alg_psa = PSA_ALG_ECDSA(PSA_ALG_SHA_256);
1327*62c56f98SSadaf Ebrahimi    } else
1328*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_PK_CAN_ECDSA_SIGN */
1329*62c56f98SSadaf Ebrahimi    {
1330*62c56f98SSadaf Ebrahimi        (void) parameter_arg;
1331*62c56f98SSadaf Ebrahimi        TEST_ASSUME(!"Opaque PK key not supported in this configuration");
1332*62c56f98SSadaf Ebrahimi    }
1333*62c56f98SSadaf Ebrahimi
1334*62c56f98SSadaf Ebrahimi    /* Export underlying public key for re-importing in a legacy context. */
1335*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PK_WRITE_C)
1336*62c56f98SSadaf Ebrahimi    ret = mbedtls_pk_write_pubkey_der(&pk, pkey_legacy,
1337*62c56f98SSadaf Ebrahimi                                      sizeof(pkey_legacy));
1338*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret >= 0);
1339*62c56f98SSadaf Ebrahimi    klen_legacy = (size_t) ret;
1340*62c56f98SSadaf Ebrahimi    /* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
1341*62c56f98SSadaf Ebrahimi    pkey_legacy_start = pkey_legacy + sizeof(pkey_legacy) - klen_legacy;
1342*62c56f98SSadaf Ebrahimi#else
1343*62c56f98SSadaf Ebrahimi    ret = mbedtls_ecp_point_write_binary(&(mbedtls_pk_ec_ro(pk)->grp),
1344*62c56f98SSadaf Ebrahimi                                         &(mbedtls_pk_ec_ro(pk)->Q),
1345*62c56f98SSadaf Ebrahimi                                         MBEDTLS_ECP_PF_UNCOMPRESSED,
1346*62c56f98SSadaf Ebrahimi                                         &klen_legacy, pkey_legacy,
1347*62c56f98SSadaf Ebrahimi                                         sizeof(pkey_legacy));
1348*62c56f98SSadaf Ebrahimi    TEST_EQUAL(ret, 0);
1349*62c56f98SSadaf Ebrahimi    pkey_legacy_start = pkey_legacy;
1350*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_PK_WRITE_C */
1351*62c56f98SSadaf Ebrahimi
1352*62c56f98SSadaf Ebrahimi    /* Turn PK context into an opaque one. */
1353*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_wrap_as_opaque(&pk, &key_id, alg_psa,
1354*62c56f98SSadaf Ebrahimi                                          PSA_KEY_USAGE_SIGN_HASH,
1355*62c56f98SSadaf Ebrahimi                                          PSA_ALG_NONE) == 0);
1356*62c56f98SSadaf Ebrahimi
1357*62c56f98SSadaf Ebrahimi    PSA_ASSERT(psa_get_key_attributes(key_id, &attributes));
1358*62c56f98SSadaf Ebrahimi    TEST_EQUAL(psa_get_key_type(&attributes), expected_type);
1359*62c56f98SSadaf Ebrahimi    TEST_EQUAL(psa_get_key_bits(&attributes), expected_bits);
1360*62c56f98SSadaf Ebrahimi    TEST_EQUAL(psa_get_key_lifetime(&attributes),
1361*62c56f98SSadaf Ebrahimi               PSA_KEY_LIFETIME_VOLATILE);
1362*62c56f98SSadaf Ebrahimi
1363*62c56f98SSadaf Ebrahimi    memset(hash, 0x2a, sizeof(hash));
1364*62c56f98SSadaf Ebrahimi    memset(sig, 0, sizeof(sig));
1365*62c56f98SSadaf Ebrahimi
1366*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign(&pk, MBEDTLS_MD_SHA256,
1367*62c56f98SSadaf Ebrahimi                                hash, sizeof(hash), sig, sizeof(sig), &sig_len,
1368*62c56f98SSadaf Ebrahimi                                NULL, NULL) == 0);
1369*62c56f98SSadaf Ebrahimi    /* Only opaque EC keys support verification. */
1370*62c56f98SSadaf Ebrahimi    if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(psa_type_arg)) {
1371*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1372*62c56f98SSadaf Ebrahimi                                      hash, sizeof(hash), sig, sig_len) == 0);
1373*62c56f98SSadaf Ebrahimi    }
1374*62c56f98SSadaf Ebrahimi
1375*62c56f98SSadaf Ebrahimi    /* Export underlying public key for re-importing in a psa context. */
1376*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PK_WRITE_C)
1377*62c56f98SSadaf Ebrahimi    ret = mbedtls_pk_write_pubkey_der(&pk, pkey_psa,
1378*62c56f98SSadaf Ebrahimi                                      sizeof(pkey_psa));
1379*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret >= 0);
1380*62c56f98SSadaf Ebrahimi    klen_psa = (size_t) ret;
1381*62c56f98SSadaf Ebrahimi    /* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
1382*62c56f98SSadaf Ebrahimi    pkey_psa_start = pkey_psa + sizeof(pkey_psa) - klen_psa;
1383*62c56f98SSadaf Ebrahimi#else
1384*62c56f98SSadaf Ebrahimi    psa_status_t status;
1385*62c56f98SSadaf Ebrahimi
1386*62c56f98SSadaf Ebrahimi    status = psa_export_public_key(key_id, pkey_psa, sizeof(pkey_psa),
1387*62c56f98SSadaf Ebrahimi                                   &klen_psa);
1388*62c56f98SSadaf Ebrahimi    TEST_EQUAL(status, PSA_SUCCESS);
1389*62c56f98SSadaf Ebrahimi    pkey_psa_start = pkey_psa;
1390*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_PK_WRITE_C */
1391*62c56f98SSadaf Ebrahimi
1392*62c56f98SSadaf Ebrahimi    TEST_ASSERT(klen_psa == klen_legacy);
1393*62c56f98SSadaf Ebrahimi    TEST_ASSERT(memcmp(pkey_psa_start, pkey_legacy_start, klen_psa) == 0);
1394*62c56f98SSadaf Ebrahimi
1395*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
1396*62c56f98SSadaf Ebrahimi    TEST_ASSERT(PSA_SUCCESS == psa_destroy_key(key_id));
1397*62c56f98SSadaf Ebrahimi
1398*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1399*62c56f98SSadaf Ebrahimi
1400*62c56f98SSadaf Ebrahimi    /* If we used "pk_write" previously, then we go for a "pk_parse" here;
1401*62c56f98SSadaf Ebrahimi     * otherwise if we went for "ecp_point_write_binary" then we'll go
1402*62c56f98SSadaf Ebrahimi     * for a "ecp_point_read_binary" here. This allows to drop dependencies
1403*62c56f98SSadaf Ebrahimi     * on "PK_WRITE" and "PK_PARSE" if required */
1404*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_PK_WRITE_C) && defined(MBEDTLS_PK_PARSE_C)
1405*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_parse_public_key(&pk, pkey_legacy_start,
1406*62c56f98SSadaf Ebrahimi                                           klen_legacy), 0);
1407*62c56f98SSadaf Ebrahimi#else
1408*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_setup(&pk,
1409*62c56f98SSadaf Ebrahimi                                mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)), 0);
1410*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_ecp_group_load(
1411*62c56f98SSadaf Ebrahimi                   &(mbedtls_pk_ec_rw(pk)->grp),
1412*62c56f98SSadaf Ebrahimi                   (mbedtls_ecp_group_id) parameter_arg), 0);
1413*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_ecp_point_read_binary(&(mbedtls_pk_ec_ro(pk)->grp),
1414*62c56f98SSadaf Ebrahimi                                             &(mbedtls_pk_ec_rw(pk)->Q),
1415*62c56f98SSadaf Ebrahimi                                             pkey_legacy_start, klen_legacy), 0);
1416*62c56f98SSadaf Ebrahimi#endif
1417*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1418*62c56f98SSadaf Ebrahimi                                  hash, sizeof(hash), sig, sig_len) == 0);
1419*62c56f98SSadaf Ebrahimi
1420*62c56f98SSadaf Ebrahimiexit:
1421*62c56f98SSadaf Ebrahimi    /*
1422*62c56f98SSadaf Ebrahimi     * Key attributes may have been returned by psa_get_key_attributes()
1423*62c56f98SSadaf Ebrahimi     * thus reset them as required.
1424*62c56f98SSadaf Ebrahimi     */
1425*62c56f98SSadaf Ebrahimi    psa_reset_key_attributes(&attributes);
1426*62c56f98SSadaf Ebrahimi
1427*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
1428*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
1429*62c56f98SSadaf Ebrahimi}
1430*62c56f98SSadaf Ebrahimi/* END_CASE */
1431*62c56f98SSadaf Ebrahimi
1432*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:MBEDTLS_GENPRIME */
1433*62c56f98SSadaf Ebrahimivoid pk_psa_sign_ext(int pk_type, int parameter, int key_pk_type, int md_alg)
1434*62c56f98SSadaf Ebrahimi{
1435*62c56f98SSadaf Ebrahimi    /* See the description of pk_genkey() for the description of the `parameter` argument. */
1436*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
1437*62c56f98SSadaf Ebrahimi    size_t sig_len;
1438*62c56f98SSadaf Ebrahimi    unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
1439*62c56f98SSadaf Ebrahimi    unsigned char hash[PSA_HASH_MAX_SIZE];
1440*62c56f98SSadaf Ebrahimi    size_t hash_len = mbedtls_md_get_size_from_type(md_alg);
1441*62c56f98SSadaf Ebrahimi    void const *options = NULL;
1442*62c56f98SSadaf Ebrahimi    mbedtls_pk_rsassa_pss_options rsassa_pss_options;
1443*62c56f98SSadaf Ebrahimi    memset(hash, 0x2a, sizeof(hash));
1444*62c56f98SSadaf Ebrahimi    memset(sig, 0, sizeof(sig));
1445*62c56f98SSadaf Ebrahimi
1446*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1447*62c56f98SSadaf Ebrahimi    PSA_INIT();
1448*62c56f98SSadaf Ebrahimi
1449*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_setup(&pk,
1450*62c56f98SSadaf Ebrahimi                                 mbedtls_pk_info_from_type(pk_type)) == 0);
1451*62c56f98SSadaf Ebrahimi
1452*62c56f98SSadaf Ebrahimi    TEST_ASSERT(pk_genkey(&pk, parameter) == 0);
1453*62c56f98SSadaf Ebrahimi
1454*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_sign_ext(key_pk_type, &pk, md_alg, hash, hash_len,
1455*62c56f98SSadaf Ebrahimi                                    sig, sizeof(sig), &sig_len,
1456*62c56f98SSadaf Ebrahimi                                    mbedtls_test_rnd_std_rand, NULL) == 0);
1457*62c56f98SSadaf Ebrahimi
1458*62c56f98SSadaf Ebrahimi    if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
1459*62c56f98SSadaf Ebrahimi        rsassa_pss_options.mgf1_hash_id = md_alg;
1460*62c56f98SSadaf Ebrahimi        TEST_ASSERT(hash_len != 0);
1461*62c56f98SSadaf Ebrahimi        rsassa_pss_options.expected_salt_len = hash_len;
1462*62c56f98SSadaf Ebrahimi        options = (const void *) &rsassa_pss_options;
1463*62c56f98SSadaf Ebrahimi    }
1464*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_verify_ext(key_pk_type, options, &pk, md_alg,
1465*62c56f98SSadaf Ebrahimi                                      hash, hash_len, sig, sig_len) == 0);
1466*62c56f98SSadaf Ebrahimiexit:
1467*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
1468*62c56f98SSadaf Ebrahimi    PSA_DONE();
1469*62c56f98SSadaf Ebrahimi}
1470*62c56f98SSadaf Ebrahimi/* END_CASE */
1471*62c56f98SSadaf Ebrahimi
1472*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_GENPRIME:MBEDTLS_USE_PSA_CRYPTO */
1473*62c56f98SSadaf Ebrahimivoid pk_psa_wrap_sign_ext(int pk_type, int parameter, int key_pk_type, int md_alg)
1474*62c56f98SSadaf Ebrahimi{
1475*62c56f98SSadaf Ebrahimi    /* See the description of mbedtls_rsa_gen_key() for the description of the `parameter` argument. */
1476*62c56f98SSadaf Ebrahimi    mbedtls_pk_context pk;
1477*62c56f98SSadaf Ebrahimi    size_t sig_len, pkey_len;
1478*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t key_id;
1479*62c56f98SSadaf Ebrahimi    unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
1480*62c56f98SSadaf Ebrahimi    unsigned char pkey[PSA_EXPORT_PUBLIC_KEY_MAX_SIZE];
1481*62c56f98SSadaf Ebrahimi    unsigned char *pkey_start;
1482*62c56f98SSadaf Ebrahimi    unsigned char hash[PSA_HASH_MAX_SIZE];
1483*62c56f98SSadaf Ebrahimi    psa_algorithm_t psa_md_alg = mbedtls_md_psa_alg_from_type(md_alg);
1484*62c56f98SSadaf Ebrahimi    psa_algorithm_t psa_alg;
1485*62c56f98SSadaf Ebrahimi    size_t hash_len = PSA_HASH_LENGTH(psa_md_alg);
1486*62c56f98SSadaf Ebrahimi    void const *options = NULL;
1487*62c56f98SSadaf Ebrahimi    mbedtls_pk_rsassa_pss_options rsassa_pss_options;
1488*62c56f98SSadaf Ebrahimi    int ret;
1489*62c56f98SSadaf Ebrahimi
1490*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1491*62c56f98SSadaf Ebrahimi    PSA_INIT();
1492*62c56f98SSadaf Ebrahimi
1493*62c56f98SSadaf Ebrahimi    /* Create legacy RSA public/private key in PK context. */
1494*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1495*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_setup(&pk,
1496*62c56f98SSadaf Ebrahimi                                mbedtls_pk_info_from_type(pk_type)), 0);
1497*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_rsa_gen_key(mbedtls_pk_rsa(pk),
1498*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_std_rand, NULL,
1499*62c56f98SSadaf Ebrahimi                                   parameter, 3), 0);
1500*62c56f98SSadaf Ebrahimi
1501*62c56f98SSadaf Ebrahimi    /* Export underlying public key for re-importing in a legacy context. */
1502*62c56f98SSadaf Ebrahimi    ret = mbedtls_pk_write_pubkey_der(&pk, pkey, sizeof(pkey));
1503*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret >= 0);
1504*62c56f98SSadaf Ebrahimi
1505*62c56f98SSadaf Ebrahimi    pkey_len = (size_t) ret;
1506*62c56f98SSadaf Ebrahimi    /* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
1507*62c56f98SSadaf Ebrahimi    pkey_start = pkey + sizeof(pkey) - pkey_len;
1508*62c56f98SSadaf Ebrahimi
1509*62c56f98SSadaf Ebrahimi    if (key_pk_type == MBEDTLS_PK_RSA) {
1510*62c56f98SSadaf Ebrahimi        psa_alg = PSA_ALG_RSA_PKCS1V15_SIGN(psa_md_alg);
1511*62c56f98SSadaf Ebrahimi    } else if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
1512*62c56f98SSadaf Ebrahimi        psa_alg = PSA_ALG_RSA_PSS(psa_md_alg);
1513*62c56f98SSadaf Ebrahimi    } else {
1514*62c56f98SSadaf Ebrahimi        TEST_ASSUME(!"PK key type not supported in this configuration");
1515*62c56f98SSadaf Ebrahimi    }
1516*62c56f98SSadaf Ebrahimi
1517*62c56f98SSadaf Ebrahimi    /* Turn PK context into an opaque one. */
1518*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_wrap_as_opaque(&pk, &key_id, psa_alg,
1519*62c56f98SSadaf Ebrahimi                                         PSA_KEY_USAGE_SIGN_HASH,
1520*62c56f98SSadaf Ebrahimi                                         PSA_ALG_NONE), 0);
1521*62c56f98SSadaf Ebrahimi
1522*62c56f98SSadaf Ebrahimi    memset(hash, 0x2a, sizeof(hash));
1523*62c56f98SSadaf Ebrahimi    memset(sig, 0, sizeof(sig));
1524*62c56f98SSadaf Ebrahimi
1525*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_sign_ext(key_pk_type, &pk, md_alg, hash, hash_len,
1526*62c56f98SSadaf Ebrahimi                                   sig, sizeof(sig), &sig_len,
1527*62c56f98SSadaf Ebrahimi                                   mbedtls_test_rnd_std_rand, NULL), 0);
1528*62c56f98SSadaf Ebrahimi
1529*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
1530*62c56f98SSadaf Ebrahimi    TEST_EQUAL(PSA_SUCCESS, psa_destroy_key(key_id));
1531*62c56f98SSadaf Ebrahimi
1532*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&pk);
1533*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_parse_public_key(&pk, pkey_start, pkey_len), 0);
1534*62c56f98SSadaf Ebrahimi
1535*62c56f98SSadaf Ebrahimi    if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
1536*62c56f98SSadaf Ebrahimi        rsassa_pss_options.mgf1_hash_id = md_alg;
1537*62c56f98SSadaf Ebrahimi        TEST_ASSERT(hash_len != 0);
1538*62c56f98SSadaf Ebrahimi        rsassa_pss_options.expected_salt_len = hash_len;
1539*62c56f98SSadaf Ebrahimi        options = (const void *) &rsassa_pss_options;
1540*62c56f98SSadaf Ebrahimi    }
1541*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_pk_verify_ext(key_pk_type, options, &pk, md_alg,
1542*62c56f98SSadaf Ebrahimi                                     hash, hash_len, sig, sig_len), 0);
1543*62c56f98SSadaf Ebrahimi
1544*62c56f98SSadaf Ebrahimiexit:
1545*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&pk);
1546*62c56f98SSadaf Ebrahimi    PSA_DONE();
1547*62c56f98SSadaf Ebrahimi}
1548*62c56f98SSadaf Ebrahimi/* END_CASE */
1549