blob: 76713649a60099365fbc3b26ddefed67a41cdc3b [file] [log] [blame]
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/pk.h"
Valerio Setti483738e2023-05-17 15:37:29 +02003#include "pk_internal.h"
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02004
Manuel Pégourié-Gonnard7c13d692014-11-12 00:01:34 +01005/* For error codes */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05006#include "mbedtls/asn1.h"
7#include "mbedtls/base64.h"
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00008#include "mbedtls/ecp.h"
Gilles Peskine03aa9bc2024-01-30 11:08:44 +01009#include "mbedtls/error.h"
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000010#include "mbedtls/rsa.h"
Valerio Setti77a75682023-05-15 11:18:46 +020011#include "pk_internal.h"
Manuel Pégourié-Gonnard7c13d692014-11-12 00:01:34 +010012
Andres Amaya Garcia7ea67272017-05-08 11:15:49 +010013#include <limits.h>
Andres Amaya Garcia6ff067d2017-06-09 14:26:59 +010014#include <stdint.h>
Andres AG5c79d252017-02-15 10:52:32 +000015
Gilles Peskine33b1c692019-12-19 00:09:47 +010016/* Needed only for test case data under #if defined(MBEDTLS_USE_PSA_CRYPTO),
17 * but the test code generator requires test case data to be valid C code
Dave Rodgman017a1992022-03-31 14:07:01 +010018 * unconditionally (https://github.com/Mbed-TLS/mbedtls/issues/2023). */
Gilles Peskine33b1c692019-12-19 00:09:47 +010019#include "psa/crypto.h"
Valerio Setti384fbde2024-01-02 13:26:40 +010020#include "mbedtls/psa_util.h"
Gilles Peskine33b1c692019-12-19 00:09:47 +010021
Valerio Setti7816c242023-04-04 11:47:55 +020022/* Used for properly sizing the key buffer in pk_genkey_ec() */
Manuel Pégourié-Gonnard2be8c632023-06-07 13:07:21 +020023#include "psa_util_internal.h"
Valerio Settib6891b12023-04-03 16:01:47 +020024
Waleed Elmelegyd7bdbbe2023-07-20 16:26:58 +000025#define RSA_KEY_SIZE MBEDTLS_RSA_GEN_KEY_MIN_BITS
26#define RSA_KEY_LEN (MBEDTLS_RSA_GEN_KEY_MIN_BITS/8)
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +020027
Gilles Peskine74860dd2024-02-12 14:25:18 +010028#if defined(MBEDTLS_RSA_C) || \
29 defined(MBEDTLS_PK_RSA_ALT_SUPPORT) || \
30 defined(MBEDTLS_ECDSA_C) || \
31 defined(MBEDTLS_USE_PSA_CRYPTO)
32#define PK_CAN_SIGN_SOME
33#endif
34
Yanray Wang61f96602023-09-25 14:13:22 +080035/* MBEDTLS_TEST_PK_PSA_SIGN is enabled when:
36 * - The build has PK_[PARSE/WRITE]_C for RSA or ECDSA signature.
37 * - The build has built-in ECC and ECDSA signature.
38 */
39#if (defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_PK_WRITE_C) && \
40 ((defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)) || \
41 defined(MBEDTLS_PK_CAN_ECDSA_SIGN))) || \
42 (defined(MBEDTLS_ECP_C) && defined(MBEDTLS_PK_CAN_ECDSA_SIGN))
43#define MBEDTLS_TEST_PK_PSA_SIGN
44#endif
45
Gilles Peskine735ac3e2024-02-06 11:11:32 +010046#if defined(MBEDTLS_PSA_CRYPTO_C) && defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
Gilles Peskine48b87eb2024-02-07 18:40:25 +010047/* Pick an elliptic curve that's supported by PSA. Note that the curve is
48 * not guaranteed to be supported by the ECP module.
49 *
50 * This should always find a curve if ECC is enabled in the build, except in
51 * one edge case: in a build with MBEDTLS_PSA_CRYPTO_CONFIG disabled and
52 * where the only legacy curve is secp224k1, which is not supported in PSA,
53 * PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY ends up enabled but PSA does not
54 * support any curve.
55 */
56
57/* First try all the curves that can do both ECDSA and ECDH, then try
58 * the ECDH-only curves. (There are no curves that can do ECDSA but not ECDH.)
59 * This way, if ECDSA is enabled then the curve that's selected here will
60 * be ECDSA-capable, and likewise for ECDH. */
61#if defined(PSA_WANT_ECC_SECP_R1_192)
62#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
63#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 192
64#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP192R1
65#elif defined(PSA_WANT_ECC_SECP_R1_224)
66#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
67#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 224
68#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP224R1
69#elif defined(PSA_WANT_ECC_SECP_R1_256)
70#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
71#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 256
72#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP256R1
73#elif defined(PSA_WANT_ECC_SECP_R1_384)
74#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
75#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 384
76#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP384R1
77#elif defined(PSA_WANT_ECC_SECP_R1_521)
78#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
79#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 521
80#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP521R1
81#elif defined(PSA_WANT_ECC_SECP_K1_192)
82#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_K1
83#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 192
84#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP192K1
85#elif defined(PSA_WANT_ECC_SECP_K1_224)
86#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_K1
87#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 224
88#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP224K1
89#elif defined(PSA_WANT_ECC_SECP_K1_256)
90#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_K1
91#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 256
92#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_SECP256K1
93#elif defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
94#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_BRAINPOOL_P_R1
95#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 256
96#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_BP256R1
97#elif defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
98#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_BRAINPOOL_P_R1
99#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 384
100#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_BP384R1
101#elif defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
102#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_BRAINPOOL_P_R1
103#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 512
104#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_BP512R1
105#elif defined(PSA_WANT_ECC_MONTGOMERY_255)
106#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_MONTGOMERY
107#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 255
108#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_CURVE25519
109#elif defined(PSA_WANT_ECC_MONTGOMERY_448)
110#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_MONTGOMERY
111#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 448
112#define MBEDTLS_TEST_ECP_DP_ONE_CURVE MBEDTLS_ECP_DP_CURVE448
113#endif /* curve selection */
114
115#if defined(MBEDTLS_TEST_PSA_ECC_ONE_FAMILY)
Gilles Peskine735ac3e2024-02-06 11:11:32 +0100116#define MBEDTLS_TEST_PSA_ECC_AT_LEAST_ONE_CURVE
117#endif
Gilles Peskine48b87eb2024-02-07 18:40:25 +0100118
Gilles Peskine10e9c412024-02-09 19:29:08 +0100119/* Pick a second curve, for tests that need two supported curves of the
120 * same size. For simplicity, we only handle a subset of configurations,
121 * and both curves will support both ECDH and ECDSA. */
122#if defined(PSA_WANT_ECC_SECP_R1_192) && defined(PSA_WANT_ECC_SECP_K1_192)
123/* Identical redefinition of the ONE macros, to confirm that they have
124 * the values we expect here. */
125#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
126#define MBEDTLS_TEST_PSA_ECC_ANOTHER_FAMILY PSA_ECC_FAMILY_SECP_K1
127#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 192
128#define MBEDTLS_TEST_PSA_ECC_HAVE_TWO_FAMILIES
129#elif defined(PSA_WANT_ECC_SECP_R1_256) && defined(PSA_WANT_ECC_SECP_K1_256)
130#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY PSA_ECC_FAMILY_SECP_R1
131#define MBEDTLS_TEST_PSA_ECC_ANOTHER_FAMILY PSA_ECC_FAMILY_SECP_K1
132#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 256
133#define MBEDTLS_TEST_PSA_ECC_HAVE_TWO_FAMILIES
Gilles Peskine10e9c412024-02-09 19:29:08 +0100134#endif
135
Gilles Peskine48b87eb2024-02-07 18:40:25 +0100136#endif /* defined(MBEDTLS_PSA_CRYPTO_C) && defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY) */
Gilles Peskine735ac3e2024-02-06 11:11:32 +0100137
Gilles Peskine1d338762024-02-12 14:18:26 +0100138/* Always define the macros so that we can use them in test data. */
139#if !defined(MBEDTLS_TEST_PSA_ECC_ONE_FAMILY)
140#define MBEDTLS_TEST_PSA_ECC_ONE_FAMILY 0
141#define MBEDTLS_PSA_ECC_ONE_CURVE_BITS 0
142#define MBEDTLS_TEST_ECP_DP_ONE_CURVE 0
143#endif
144#if !defined(MBEDTLS_TEST_PSA_ECC_ANOTHER_FAMILY)
145#define MBEDTLS_TEST_PSA_ECC_ANOTHER_FAMILY 0
146#endif
147
Valerio Setti483738e2023-05-17 15:37:29 +0200148#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
149static int pk_genkey_ec(mbedtls_pk_context *pk, mbedtls_ecp_group_id grp_id)
Valerio Settib6891b12023-04-03 16:01:47 +0200150{
151 psa_status_t status;
152 psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
Valerio Settib6891b12023-04-03 16:01:47 +0200153 size_t curve_bits;
Valerio Setti483738e2023-05-17 15:37:29 +0200154 psa_ecc_family_t curve = mbedtls_ecc_group_to_psa(grp_id, &curve_bits);
Valerio Settib6891b12023-04-03 16:01:47 +0200155 int ret;
156
Valerio Settia7cb8452023-05-22 18:39:43 +0200157 if (curve == 0) {
158 return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
159 }
160
Valerio Settib6891b12023-04-03 16:01:47 +0200161 psa_set_key_type(&key_attr, PSA_KEY_TYPE_ECC_KEY_PAIR(curve));
162 psa_set_key_bits(&key_attr, curve_bits);
Gilles Peskinefc3d8662024-02-09 19:26:37 +0100163 psa_key_usage_t usage = PSA_KEY_USAGE_EXPORT | PSA_KEY_USAGE_COPY;
164 psa_algorithm_t sign_alg = 0;
165 psa_algorithm_t derive_alg = 0;
166 if (mbedtls_pk_get_type(pk) != MBEDTLS_PK_ECDSA) {
167 usage |= PSA_KEY_USAGE_DERIVE;
168 derive_alg = PSA_ALG_ECDH;
169 }
170 if (mbedtls_pk_get_type(pk) != MBEDTLS_PK_ECKEY_DH &&
171 curve != PSA_ECC_FAMILY_MONTGOMERY) {
172 usage |= PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_SIGN_MESSAGE;
Valerio Setti7237d5f2023-05-18 19:00:22 +0200173#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
Gilles Peskinefc3d8662024-02-09 19:26:37 +0100174 sign_alg = PSA_ALG_DETERMINISTIC_ECDSA(PSA_ALG_ANY_HASH);
Valerio Setti7237d5f2023-05-18 19:00:22 +0200175#else
Gilles Peskinefc3d8662024-02-09 19:26:37 +0100176 sign_alg = PSA_ALG_ECDSA(PSA_ALG_ANY_HASH);
Valerio Setti7237d5f2023-05-18 19:00:22 +0200177#endif
Gilles Peskinefc3d8662024-02-09 19:26:37 +0100178 }
179 if (derive_alg != 0) {
180 psa_set_key_algorithm(&key_attr, derive_alg);
181 if (sign_alg != 0) {
182 psa_set_key_enrollment_algorithm(&key_attr, sign_alg);
183 }
184 } else {
185 psa_set_key_algorithm(&key_attr, sign_alg);
186 }
187 psa_set_key_usage_flags(&key_attr, usage);
Valerio Settib6891b12023-04-03 16:01:47 +0200188
Valerio Setti7237d5f2023-05-18 19:00:22 +0200189 status = psa_generate_key(&key_attr, &pk->priv_id);
Valerio Settib6891b12023-04-03 16:01:47 +0200190 if (status != PSA_SUCCESS) {
191 return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
192 }
193
Valerio Setti7237d5f2023-05-18 19:00:22 +0200194 status = psa_export_public_key(pk->priv_id, pk->pub_raw, sizeof(pk->pub_raw),
Valerio Setti483738e2023-05-17 15:37:29 +0200195 &pk->pub_raw_len);
Valerio Settib6891b12023-04-03 16:01:47 +0200196 if (status != PSA_SUCCESS) {
Valerio Settib3f20da2023-04-04 11:19:33 +0200197 ret = MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
198 goto exit;
Valerio Settib6891b12023-04-03 16:01:47 +0200199 }
200
Valerio Setti483738e2023-05-17 15:37:29 +0200201 pk->ec_family = curve;
202 pk->ec_bits = curve_bits;
203
Valerio Setti483738e2023-05-17 15:37:29 +0200204 return 0;
Valerio Settib6891b12023-04-03 16:01:47 +0200205
Valerio Settib3f20da2023-04-04 11:19:33 +0200206exit:
Valerio Setti7237d5f2023-05-18 19:00:22 +0200207 status = psa_destroy_key(pk->priv_id);
Valerio Setti483738e2023-05-17 15:37:29 +0200208 return (ret != 0) ? ret : psa_pk_status_to_mbedtls(status);
Valerio Settib6891b12023-04-03 16:01:47 +0200209}
Valerio Setti483738e2023-05-17 15:37:29 +0200210#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Valerio Settib6891b12023-04-03 16:01:47 +0200211
Gilles Peskinee48fe552019-11-05 16:42:13 +0100212/** Generate a key of the desired type.
213 *
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200214 * \param pk The PK object to fill. It must have been initialized
215 * with mbedtls_pk_setup().
216 * \param curve_or_keybits - For RSA keys, the key size in bits.
217 * - For EC keys, the curve (\c MBEDTLS_ECP_DP_xxx).
Gilles Peskinee48fe552019-11-05 16:42:13 +0100218 *
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200219 * \return The status from the underlying type-specific key
220 * generation function.
221 * \return -1 if the key type is not recognized.
Gilles Peskinee48fe552019-11-05 16:42:13 +0100222 */
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200223static int pk_genkey(mbedtls_pk_context *pk, int curve_or_keybits)
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200224{
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200225 (void) pk;
226 (void) curve_or_keybits;
Paul Bakkera5320902013-12-19 17:29:52 +0100227
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200228#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)
Gilles Peskine449bd832023-01-11 14:50:10 +0100229 if (mbedtls_pk_get_type(pk) == MBEDTLS_PK_RSA) {
230 return mbedtls_rsa_gen_key(mbedtls_pk_rsa(*pk),
231 mbedtls_test_rnd_std_rand, NULL,
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200232 curve_or_keybits, 3);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200233 }
234#endif
Valerio Setti545a0d62023-06-14 14:56:48 +0200235#if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 if (mbedtls_pk_get_type(pk) == MBEDTLS_PK_ECKEY ||
237 mbedtls_pk_get_type(pk) == MBEDTLS_PK_ECKEY_DH ||
238 mbedtls_pk_get_type(pk) == MBEDTLS_PK_ECDSA) {
239 int ret;
Valerio Setti483738e2023-05-17 15:37:29 +0200240
Gilles Peskinef3dbc982024-01-23 11:05:34 +0100241#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
242 ret = pk_genkey_ec(pk, curve_or_keybits);
243 if (ret != 0) {
244 return ret;
245 }
246
247 return 0;
248#else
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200249 ret = mbedtls_ecp_group_load(&mbedtls_pk_ec_rw(*pk)->grp, curve_or_keybits);
Valerio Setti483738e2023-05-17 15:37:29 +0200250 if (ret != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 return ret;
252 }
Valerio Setti7237d5f2023-05-18 19:00:22 +0200253 return mbedtls_ecp_gen_keypair(&mbedtls_pk_ec_rw(*pk)->grp,
254 &mbedtls_pk_ec_rw(*pk)->d,
255 &mbedtls_pk_ec_rw(*pk)->Q,
256 mbedtls_test_rnd_std_rand, NULL);
Gilles Peskinef8c2cd12024-01-30 10:18:36 +0100257#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
Valerio Setti483738e2023-05-17 15:37:29 +0200258
Valerio Settid49cbc12023-04-05 18:21:48 +0200259 }
Valerio Setti545a0d62023-06-14 14:56:48 +0200260#endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100261 return -1;
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200262}
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +0200263
Gilles Peskine7e353ba2024-02-01 20:46:19 +0100264#if defined(MBEDTLS_PSA_CRYPTO_C)
265static psa_key_usage_t pk_get_psa_attributes_implied_usage(
266 psa_key_usage_t expected_usage)
267{
268 /* Usage implied universally */
269 if (expected_usage & PSA_KEY_USAGE_SIGN_HASH) {
270 expected_usage |= PSA_KEY_USAGE_SIGN_MESSAGE;
271 }
272 if (expected_usage & PSA_KEY_USAGE_VERIFY_HASH) {
273 expected_usage |= PSA_KEY_USAGE_VERIFY_MESSAGE;
274 }
275 /* Usage implied by mbedtls_pk_get_psa_attributes() */
276 if (expected_usage & PSA_KEY_USAGE_SIGN_HASH) {
277 expected_usage |= PSA_KEY_USAGE_VERIFY_HASH;
278 }
279 if (expected_usage & PSA_KEY_USAGE_SIGN_MESSAGE) {
280 expected_usage |= PSA_KEY_USAGE_VERIFY_MESSAGE;
281 }
282 if (expected_usage & PSA_KEY_USAGE_DECRYPT) {
283 expected_usage |= PSA_KEY_USAGE_ENCRYPT;
284 }
285 expected_usage |= PSA_KEY_USAGE_EXPORT | PSA_KEY_USAGE_COPY;
286 return expected_usage;
287}
288#endif /* MBEDTLS_PSA_CRYPTO_C */
289
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200290#if defined(MBEDTLS_RSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100291int mbedtls_rsa_decrypt_func(void *ctx, size_t *olen,
292 const unsigned char *input, unsigned char *output,
293 size_t output_max_len)
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +0200294{
Gilles Peskine449bd832023-01-11 14:50:10 +0100295 return mbedtls_rsa_pkcs1_decrypt((mbedtls_rsa_context *) ctx,
296 mbedtls_test_rnd_std_rand, NULL,
297 olen, input, output, output_max_len);
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +0200298}
Gilles Peskine449bd832023-01-11 14:50:10 +0100299int mbedtls_rsa_sign_func(void *ctx,
300 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
301 mbedtls_md_type_t md_alg, unsigned int hashlen,
302 const unsigned char *hash, unsigned char *sig)
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +0200303{
Hanno Beckera5400682017-05-03 16:43:15 +0100304 ((void) f_rng);
305 ((void) p_rng);
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 return mbedtls_rsa_pkcs1_sign((mbedtls_rsa_context *) ctx,
307 mbedtls_test_rnd_std_rand, NULL,
308 md_alg, hashlen, hash, sig);
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +0200309}
Gilles Peskine449bd832023-01-11 14:50:10 +0100310size_t mbedtls_rsa_key_len_func(void *ctx)
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +0200311{
Gilles Peskine449bd832023-01-11 14:50:10 +0100312 return ((const mbedtls_rsa_context *) ctx)->len;
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +0200313}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200314#endif /* MBEDTLS_RSA_C */
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100315
Gilles Peskine0b172552024-01-18 14:11:26 +0100316#if defined(MBEDTLS_PSA_CRYPTO_C)
317static int pk_setup_for_type(mbedtls_pk_type_t pk_type, int want_pair,
318 mbedtls_pk_context *pk, psa_key_type_t *psa_type)
319{
Gilles Peskine0b172552024-01-18 14:11:26 +0100320 if (pk_type == MBEDTLS_PK_NONE) {
Gilles Peskine03aa9bc2024-01-30 11:08:44 +0100321 return 0;
Gilles Peskine0b172552024-01-18 14:11:26 +0100322 }
323 TEST_EQUAL(mbedtls_pk_setup(pk, mbedtls_pk_info_from_type(pk_type)), 0);
324
325 switch (pk_type) {
Gilles Peskine6ea18362024-01-18 14:16:27 +0100326#if defined(MBEDTLS_RSA_C)
327 case MBEDTLS_PK_RSA:
328 {
329 *psa_type = PSA_KEY_TYPE_RSA_KEY_PAIR;
330 mbedtls_rsa_context *rsa = mbedtls_pk_rsa(*pk);
331 if (want_pair) {
Gilles Peskine77faddf2024-01-24 10:50:17 +0100332#if defined(MBEDTLS_GENPRIME)
Gilles Peskine6ea18362024-01-18 14:16:27 +0100333 TEST_EQUAL(mbedtls_rsa_gen_key(
334 rsa,
335 mbedtls_test_rnd_std_rand, NULL,
336 MBEDTLS_RSA_GEN_KEY_MIN_BITS, 65537), 0);
Gilles Peskine77faddf2024-01-24 10:50:17 +0100337#else
338 TEST_FAIL("I don't know how to create an RSA key pair in this configuration.");
339#endif
Gilles Peskine6ea18362024-01-18 14:16:27 +0100340 } else {
341 unsigned char N[PSA_BITS_TO_BYTES(MBEDTLS_RSA_GEN_KEY_MIN_BITS)] = { 0xff };
342 N[sizeof(N) - 1] = 0x03;
Gilles Peskineace7c772024-01-18 17:47:54 +0100343 const unsigned char E[1] = { 0x03 };
Gilles Peskine6ea18362024-01-18 14:16:27 +0100344 TEST_EQUAL(mbedtls_rsa_import_raw(rsa,
345 N, sizeof(N),
346 NULL, 0, NULL, 0, NULL, 0,
347 E, sizeof(E)), 0);
348 TEST_EQUAL(mbedtls_rsa_complete(rsa), 0);
349 }
350 break;
351 }
352#endif /* MBEDTLS_RSA_C */
353
Gilles Peskineace7c772024-01-18 17:47:54 +0100354#if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
355 case MBEDTLS_PK_ECKEY:
356 case MBEDTLS_PK_ECKEY_DH:
357 case MBEDTLS_PK_ECDSA:
358 {
Gilles Peskine48b87eb2024-02-07 18:40:25 +0100359 mbedtls_ecp_group_id grp_id = MBEDTLS_TEST_ECP_DP_ONE_CURVE;
Gilles Peskineace7c772024-01-18 17:47:54 +0100360 size_t bits;
361 *psa_type = PSA_KEY_TYPE_ECC_KEY_PAIR(mbedtls_ecc_group_to_psa(grp_id, &bits));
362 TEST_EQUAL(pk_genkey(pk, grp_id), 0);
363 if (!want_pair) {
Gilles Peskinef3dbc982024-01-23 11:05:34 +0100364#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
365 psa_key_attributes_t pub_attributes = PSA_KEY_ATTRIBUTES_INIT;
366 psa_set_key_type(&pub_attributes,
367 PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(*psa_type));
368 psa_set_key_usage_flags(&pub_attributes,
369 PSA_KEY_USAGE_EXPORT |
370 PSA_KEY_USAGE_COPY |
371 PSA_KEY_USAGE_VERIFY_MESSAGE |
372 PSA_KEY_USAGE_VERIFY_HASH);
373 psa_set_key_algorithm(&pub_attributes, PSA_ALG_ECDSA_ANY);
374 PSA_ASSERT(psa_destroy_key(pk->priv_id));
Gilles Peskinecb3b4ca2024-02-02 13:12:39 +0100375 pk->priv_id = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinef3dbc982024-01-23 11:05:34 +0100376#else
Gilles Peskineae2668b2024-02-01 20:48:04 +0100377 mbedtls_ecp_keypair *ec = mbedtls_pk_ec_rw(*pk);
Gilles Peskineace7c772024-01-18 17:47:54 +0100378 mbedtls_mpi_free(&ec->d);
Gilles Peskinef3dbc982024-01-23 11:05:34 +0100379#endif
Gilles Peskineace7c772024-01-18 17:47:54 +0100380 }
381 break;
382 }
383#endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
384
Gilles Peskine0b172552024-01-18 14:11:26 +0100385 default:
386 TEST_FAIL("Unknown PK type in test data");
387 break;
388 }
389
390 if (!want_pair) {
391 *psa_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(*psa_type);
392 }
Gilles Peskine03aa9bc2024-01-30 11:08:44 +0100393 return 0;
Gilles Peskine0b172552024-01-18 14:11:26 +0100394
395exit:
Gilles Peskine03aa9bc2024-01-30 11:08:44 +0100396 return MBEDTLS_ERR_ERROR_GENERIC_ERROR;
Gilles Peskine0b172552024-01-18 14:11:26 +0100397}
398#endif
399
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100400#if defined(MBEDTLS_USE_PSA_CRYPTO)
401
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100402/*
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100403 * Generate an ECC key using PSA and return the key identifier of that key,
Gilles Peskined2d45c12019-05-27 14:53:13 +0200404 * or 0 if the key generation failed.
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +0100405 * The key uses NIST P-256 and is usable for signing with SHA-256.
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100406 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100407mbedtls_svc_key_id_t pk_psa_genkey_ecc(void)
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100408{
Ronald Cron5425a212020-08-04 14:58:35 +0200409 mbedtls_svc_key_id_t key;
Gilles Peskined2d45c12019-05-27 14:53:13 +0200410 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskine89177e82019-12-03 21:19:09 +0100411 const psa_key_type_t type =
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1);
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100413 const size_t bits = 256;
414
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
416 psa_set_key_algorithm(&attributes, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
417 psa_set_key_type(&attributes, type);
418 psa_set_key_bits(&attributes, bits);
419 PSA_ASSERT(psa_generate_key(&attributes, &key));
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100420
Gilles Peskined2d45c12019-05-27 14:53:13 +0200421exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100422 return key;
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100423}
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100424
425/*
426 * Generate an RSA key using PSA and return the key identifier of that key,
427 * or 0 if the key generation failed.
428 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100429mbedtls_svc_key_id_t pk_psa_genkey_rsa(void)
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100430{
431 mbedtls_svc_key_id_t key;
432 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
433 const psa_key_type_t type = PSA_KEY_TYPE_RSA_KEY_PAIR;
Neil Armstrongcb874032022-04-08 15:14:40 +0200434 const size_t bits = 1024;
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100435
Gilles Peskine449bd832023-01-11 14:50:10 +0100436 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
437 psa_set_key_algorithm(&attributes, PSA_ALG_RSA_PKCS1V15_SIGN_RAW);
438 psa_set_key_type(&attributes, type);
439 psa_set_key_bits(&attributes, bits);
440 PSA_ASSERT(psa_generate_key(&attributes, &key));
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100441
442exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100443 return key;
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100444}
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100445#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200446/* END_HEADER */
447
448/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449 * depends_on:MBEDTLS_PK_C
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200450 * END_DEPENDENCIES
451 */
452
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100453/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100454void pk_psa_utils(int key_is_rsa)
Manuel Pégourié-Gonnard7b5fe042018-10-31 09:57:45 +0100455{
Manuel Pégourié-Gonnardd97390e2018-10-31 11:14:36 +0100456 mbedtls_pk_context pk, pk2;
Ronald Cron5425a212020-08-04 14:58:35 +0200457 mbedtls_svc_key_id_t key;
Gilles Peskined2d45c12019-05-27 14:53:13 +0200458 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Manuel Pégourié-Gonnard7b5fe042018-10-31 09:57:45 +0100459
Manuel Pégourié-Gonnard69baf702018-11-06 09:34:30 +0100460 const char * const name = "Opaque";
Neil Armstrongcb874032022-04-08 15:14:40 +0200461 size_t bitlen;
Manuel Pégourié-Gonnard0184b3c2018-10-31 10:36:51 +0100462
Manuel Pégourié-Gonnardd97390e2018-10-31 11:14:36 +0100463 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
464 unsigned char b1[1], b2[1];
465 size_t len;
466 mbedtls_pk_debug_item dbg;
467
Gilles Peskine449bd832023-01-11 14:50:10 +0100468 mbedtls_pk_init(&pk);
469 mbedtls_pk_init(&pk2);
valerio32f2ac92023-04-20 11:59:52 +0200470 USE_PSA_INIT();
Manuel Pégourié-Gonnard7b5fe042018-10-31 09:57:45 +0100471
Gilles Peskine449bd832023-01-11 14:50:10 +0100472 TEST_ASSERT(mbedtls_pk_setup_opaque(&pk, MBEDTLS_SVC_KEY_ID_INIT) ==
473 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard920c0632018-10-31 10:57:29 +0100474
Gilles Peskine449bd832023-01-11 14:50:10 +0100475 mbedtls_pk_free(&pk);
476 mbedtls_pk_init(&pk);
Manuel Pégourié-Gonnard920c0632018-10-31 10:57:29 +0100477
Gilles Peskine449bd832023-01-11 14:50:10 +0100478 if (key_is_rsa) {
Andrzej Kurek5c65c572022-04-13 14:28:52 -0400479 bitlen = 1024; /* hardcoded in genkey() */
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100480 key = pk_psa_genkey_rsa();
Gilles Peskine449bd832023-01-11 14:50:10 +0100481 } else {
Andrzej Kurek5c65c572022-04-13 14:28:52 -0400482 bitlen = 256; /* hardcoded in genkey() */
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100483 key = pk_psa_genkey_ecc();
Neil Armstrongcb874032022-04-08 15:14:40 +0200484 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100485 if (mbedtls_svc_key_id_is_null(key)) {
Gilles Peskined2d45c12019-05-27 14:53:13 +0200486 goto exit;
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100487 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100488
489 TEST_ASSERT(mbedtls_pk_setup_opaque(&pk, key) == 0);
490
491 TEST_ASSERT(mbedtls_pk_get_type(&pk) == MBEDTLS_PK_OPAQUE);
492 TEST_ASSERT(strcmp(mbedtls_pk_get_name(&pk), name) == 0);
493
494 TEST_ASSERT(mbedtls_pk_get_bitlen(&pk) == bitlen);
495 TEST_ASSERT(mbedtls_pk_get_len(&pk) == bitlen / 8);
496
497 if (key_is_rsa) {
498 TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECKEY) == 0);
499 TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA) == 0);
500 TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_RSA) == 1);
501 } else {
502 TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECKEY) == 1);
503 TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA) == 1);
504 TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_RSA) == 0);
Neil Armstrong0cd78dd2022-03-15 14:20:20 +0100505 }
Manuel Pégourié-Gonnard920c0632018-10-31 10:57:29 +0100506
Manuel Pégourié-Gonnardd97390e2018-10-31 11:14:36 +0100507 /* unsupported operations: verify, decrypt, encrypt */
Valerio Settie7730772023-06-21 16:58:40 +0200508 if (key_is_rsa == 1) {
509 TEST_ASSERT(mbedtls_pk_verify(&pk, md_alg,
510 b1, sizeof(b1), b2, sizeof(b2))
511 == MBEDTLS_ERR_PK_TYPE_MISMATCH);
512 } else {
Gilles Peskine449bd832023-01-11 14:50:10 +0100513 TEST_ASSERT(mbedtls_pk_decrypt(&pk, b1, sizeof(b1),
514 b2, &len, sizeof(b2),
515 NULL, NULL)
516 == MBEDTLS_ERR_PK_TYPE_MISMATCH);
Neil Armstrongb32ae722022-04-22 15:02:47 +0200517 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100518 TEST_ASSERT(mbedtls_pk_encrypt(&pk, b1, sizeof(b1),
519 b2, &len, sizeof(b2),
520 NULL, NULL)
521 == MBEDTLS_ERR_PK_TYPE_MISMATCH);
Manuel Pégourié-Gonnardd97390e2018-10-31 11:14:36 +0100522
523 /* unsupported functions: check_pair, debug */
Gilles Peskine449bd832023-01-11 14:50:10 +0100524 if (key_is_rsa) {
525 TEST_ASSERT(mbedtls_pk_setup(&pk2,
526 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
527 } else {
528 TEST_ASSERT(mbedtls_pk_setup(&pk2,
529 mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)) == 0);
530 }
531 TEST_ASSERT(mbedtls_pk_check_pair(&pk, &pk2,
532 mbedtls_test_rnd_std_rand, NULL)
533 == MBEDTLS_ERR_PK_TYPE_MISMATCH);
534 TEST_ASSERT(mbedtls_pk_debug(&pk, &dbg)
535 == MBEDTLS_ERR_PK_TYPE_MISMATCH);
Manuel Pégourié-Gonnardd97390e2018-10-31 11:14:36 +0100536
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100537 /* test that freeing the context does not destroy the key */
Gilles Peskine449bd832023-01-11 14:50:10 +0100538 mbedtls_pk_free(&pk);
539 TEST_ASSERT(PSA_SUCCESS == psa_get_key_attributes(key, &attributes));
540 TEST_ASSERT(PSA_SUCCESS == psa_destroy_key(key));
Manuel Pégourié-Gonnard01a12c42018-10-31 10:28:01 +0100541
542exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100543 /*
544 * Key attributes may have been returned by psa_get_key_attributes()
545 * thus reset them as required.
546 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100547 psa_reset_key_attributes(&attributes);
Ronald Cron3a4f0e32020-11-19 17:55:23 +0100548
Gilles Peskine449bd832023-01-11 14:50:10 +0100549 mbedtls_pk_free(&pk); /* redundant except upon error */
550 mbedtls_pk_free(&pk2);
551 USE_PSA_DONE();
Manuel Pégourié-Gonnard7b5fe042018-10-31 09:57:45 +0100552}
553/* END_CASE */
554
Neil Armstrongce1d2392022-05-11 14:11:46 +0200555/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100556void pk_can_do_ext(int opaque_key, int key_type, int key_usage, int key_alg,
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200557 int key_alg2, int curve_or_keybits, int alg_check, int usage_check,
Gilles Peskine449bd832023-01-11 14:50:10 +0100558 int result)
Neil Armstrongce1d2392022-05-11 14:11:46 +0200559{
560 mbedtls_pk_context pk;
561 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
562 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
563
Gilles Peskine449bd832023-01-11 14:50:10 +0100564 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +0200565 USE_PSA_INIT();
Neil Armstrongce1d2392022-05-11 14:11:46 +0200566
Gilles Peskine449bd832023-01-11 14:50:10 +0100567 if (opaque_key == 1) {
568 psa_set_key_usage_flags(&attributes, key_usage);
569 psa_set_key_algorithm(&attributes, key_alg);
570 if (key_alg2 != 0) {
571 psa_set_key_enrollment_algorithm(&attributes, key_alg2);
572 }
573 psa_set_key_type(&attributes, key_type);
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200574 psa_set_key_bits(&attributes, curve_or_keybits);
Neil Armstrongce1d2392022-05-11 14:11:46 +0200575
Gilles Peskine449bd832023-01-11 14:50:10 +0100576 PSA_ASSERT(psa_generate_key(&attributes, &key));
Neil Armstrongce1d2392022-05-11 14:11:46 +0200577
Gilles Peskine449bd832023-01-11 14:50:10 +0100578 if (mbedtls_svc_key_id_is_null(key)) {
Neil Armstrong5c5b1162022-05-19 18:07:53 +0200579 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +0100580 }
Neil Armstrongce1d2392022-05-11 14:11:46 +0200581
Gilles Peskine449bd832023-01-11 14:50:10 +0100582 TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, key), 0);
Neil Armstrongce1d2392022-05-11 14:11:46 +0200583
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 TEST_EQUAL(mbedtls_pk_get_type(&pk), MBEDTLS_PK_OPAQUE);
585 } else {
586 TEST_EQUAL(mbedtls_pk_setup(&pk,
587 mbedtls_pk_info_from_type(key_type)), 0);
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200588 TEST_EQUAL(pk_genkey(&pk, curve_or_keybits), 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100589 TEST_EQUAL(mbedtls_pk_get_type(&pk), key_type);
Neil Armstrong5c5b1162022-05-19 18:07:53 +0200590 }
Neil Armstrongce1d2392022-05-11 14:11:46 +0200591
Gilles Peskine449bd832023-01-11 14:50:10 +0100592 TEST_EQUAL(mbedtls_pk_can_do_ext(&pk, alg_check, usage_check), result);
Neil Armstrongce1d2392022-05-11 14:11:46 +0200593
594exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100595 psa_reset_key_attributes(&attributes);
596 PSA_ASSERT(psa_destroy_key(key));
597 mbedtls_pk_free(&pk);
598 USE_PSA_DONE();
Neil Armstrongce1d2392022-05-11 14:11:46 +0200599}
600/* END_CASE */
Manuel Pégourié-Gonnard7b5fe042018-10-31 09:57:45 +0100601
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200602/* BEGIN_CASE */
Tuvshinzaya Erdenekhuu79bf51a2022-07-29 15:06:52 +0100603void pk_invalid_param()
604{
605 mbedtls_pk_context ctx;
Tuvshinzaya Erdenekhuu79bf51a2022-07-29 15:06:52 +0100606 mbedtls_pk_type_t pk_type = 0;
Tuvshinzaya Erdenekhuued99ed32022-08-02 14:02:28 +0100607 unsigned char buf[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
Gilles Peskine449bd832023-01-11 14:50:10 +0100608 size_t buf_size = sizeof(buf);
Tuvshinzaya Erdenekhuu79bf51a2022-07-29 15:06:52 +0100609
Gilles Peskine449bd832023-01-11 14:50:10 +0100610 mbedtls_pk_init(&ctx);
valerio32f2ac92023-04-20 11:59:52 +0200611 USE_PSA_INIT();
Tuvshinzaya Erdenekhuu79bf51a2022-07-29 15:06:52 +0100612
Gilles Peskine449bd832023-01-11 14:50:10 +0100613 TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
614 mbedtls_pk_verify_restartable(&ctx, MBEDTLS_MD_NONE,
Tuvshinzaya Erdenekhuu79bf51a2022-07-29 15:06:52 +0100615 NULL, buf_size,
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 buf, buf_size,
617 NULL));
618 TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
619 mbedtls_pk_verify_restartable(&ctx, MBEDTLS_MD_SHA256,
Tuvshinzaya Erdenekhuu0050b912022-08-30 13:15:55 +0100620 NULL, 0,
Gilles Peskine449bd832023-01-11 14:50:10 +0100621 buf, buf_size,
622 NULL));
623 TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
624 mbedtls_pk_verify_ext(pk_type, NULL,
625 &ctx, MBEDTLS_MD_NONE,
626 NULL, buf_size,
627 buf, buf_size));
628 TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
629 mbedtls_pk_verify_ext(pk_type, NULL,
630 &ctx, MBEDTLS_MD_SHA256,
631 NULL, 0,
632 buf, buf_size));
633 TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
634 mbedtls_pk_sign_restartable(&ctx, MBEDTLS_MD_NONE,
635 NULL, buf_size,
636 buf, buf_size, &buf_size,
637 NULL, NULL,
638 NULL));
639 TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
640 mbedtls_pk_sign_restartable(&ctx, MBEDTLS_MD_SHA256,
641 NULL, 0,
642 buf, buf_size, &buf_size,
643 NULL, NULL,
644 NULL));
Tomi Fontanilles81746622023-07-16 13:06:06 +0300645 TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
646 mbedtls_pk_sign_ext(pk_type, &ctx, MBEDTLS_MD_NONE,
647 NULL, buf_size,
648 buf, buf_size, &buf_size,
649 NULL, NULL));
650 TEST_EQUAL(MBEDTLS_ERR_PK_BAD_INPUT_DATA,
651 mbedtls_pk_sign_ext(pk_type, &ctx, MBEDTLS_MD_SHA256,
652 NULL, 0,
653 buf, buf_size, &buf_size,
654 NULL, NULL));
Tuvshinzaya Erdenekhuu79bf51a2022-07-29 15:06:52 +0100655exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100656 mbedtls_pk_free(&ctx);
Valerio Settib79f7db2023-04-19 14:25:52 +0200657 USE_PSA_DONE();
Tuvshinzaya Erdenekhuu79bf51a2022-07-29 15:06:52 +0100658}
659/* END_CASE */
660
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200661/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100662void valid_parameters()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500663{
664 mbedtls_pk_context pk;
665 unsigned char buf[1];
666 size_t len;
667 void *options = NULL;
668
Gilles Peskine449bd832023-01-11 14:50:10 +0100669 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +0200670 USE_PSA_INIT();
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500671
Gilles Peskine449bd832023-01-11 14:50:10 +0100672 TEST_ASSERT(mbedtls_pk_setup(&pk, NULL) ==
673 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500674
675 /* In informational functions, we accept NULL where a context pointer
676 * is expected because that's what the library has done forever.
677 * We do not document that NULL is accepted, so we may wish to change
678 * the behavior in a future version. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100679 TEST_ASSERT(mbedtls_pk_get_bitlen(NULL) == 0);
680 TEST_ASSERT(mbedtls_pk_get_len(NULL) == 0);
681 TEST_ASSERT(mbedtls_pk_can_do(NULL, MBEDTLS_PK_NONE) == 0);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500682
Gilles Peskine449bd832023-01-11 14:50:10 +0100683 TEST_ASSERT(mbedtls_pk_sign_restartable(&pk,
684 MBEDTLS_MD_NONE,
685 NULL, 0,
686 buf, sizeof(buf), &len,
687 mbedtls_test_rnd_std_rand, NULL,
688 NULL) ==
689 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
690
Gilles Peskine449bd832023-01-11 14:50:10 +0100691 TEST_ASSERT(mbedtls_pk_sign(&pk,
692 MBEDTLS_MD_NONE,
693 NULL, 0,
694 buf, sizeof(buf), &len,
695 mbedtls_test_rnd_std_rand, NULL) ==
696 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
697
Tomi Fontanilles81746622023-07-16 13:06:06 +0300698 TEST_ASSERT(mbedtls_pk_sign_ext(MBEDTLS_PK_NONE, &pk,
699 MBEDTLS_MD_NONE,
700 NULL, 0,
701 buf, sizeof(buf), &len,
702 mbedtls_test_rnd_std_rand, NULL) ==
703 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
704
Gilles Peskine449bd832023-01-11 14:50:10 +0100705 TEST_ASSERT(mbedtls_pk_verify_restartable(&pk,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500706 MBEDTLS_MD_NONE,
707 NULL, 0,
Gilles Peskine449bd832023-01-11 14:50:10 +0100708 buf, sizeof(buf),
709 NULL) ==
710 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500711
Gilles Peskine449bd832023-01-11 14:50:10 +0100712 TEST_ASSERT(mbedtls_pk_verify(&pk,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500713 MBEDTLS_MD_NONE,
714 NULL, 0,
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 buf, sizeof(buf)) ==
716 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500717
Gilles Peskine449bd832023-01-11 14:50:10 +0100718 TEST_ASSERT(mbedtls_pk_verify_ext(MBEDTLS_PK_NONE, options,
719 &pk,
720 MBEDTLS_MD_NONE,
721 NULL, 0,
722 buf, sizeof(buf)) ==
723 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500724
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 TEST_ASSERT(mbedtls_pk_encrypt(&pk,
726 NULL, 0,
727 NULL, &len, 0,
728 mbedtls_test_rnd_std_rand, NULL) ==
729 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500730
Gilles Peskine449bd832023-01-11 14:50:10 +0100731 TEST_ASSERT(mbedtls_pk_decrypt(&pk,
732 NULL, 0,
733 NULL, &len, 0,
734 mbedtls_test_rnd_std_rand, NULL) ==
735 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500736
737#if defined(MBEDTLS_PK_PARSE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100738 TEST_ASSERT(mbedtls_pk_parse_key(&pk, NULL, 0, NULL, 1,
739 mbedtls_test_rnd_std_rand, NULL) ==
740 MBEDTLS_ERR_PK_KEY_INVALID_FORMAT);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500741
Gilles Peskine449bd832023-01-11 14:50:10 +0100742 TEST_ASSERT(mbedtls_pk_parse_public_key(&pk, NULL, 0) ==
743 MBEDTLS_ERR_PK_KEY_INVALID_FORMAT);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500744#endif /* MBEDTLS_PK_PARSE_C */
Valerio Settib79f7db2023-04-19 14:25:52 +0200745 USE_PSA_DONE();
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500746}
747/* END_CASE */
748
749/* BEGIN_CASE depends_on:MBEDTLS_PK_WRITE_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100750void valid_parameters_pkwrite(data_t *key_data)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500751{
752 mbedtls_pk_context pk;
753
754 /* For the write tests to be effective, we need a valid key pair. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100755 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +0200756 USE_PSA_INIT();
757
Gilles Peskine449bd832023-01-11 14:50:10 +0100758 TEST_ASSERT(mbedtls_pk_parse_key(&pk,
759 key_data->x, key_data->len, NULL, 0,
760 mbedtls_test_rnd_std_rand, NULL) == 0);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500761
Gilles Peskine449bd832023-01-11 14:50:10 +0100762 TEST_ASSERT(mbedtls_pk_write_key_der(&pk, NULL, 0) ==
763 MBEDTLS_ERR_ASN1_BUF_TOO_SMALL);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500764
Gilles Peskine449bd832023-01-11 14:50:10 +0100765 TEST_ASSERT(mbedtls_pk_write_pubkey_der(&pk, NULL, 0) ==
766 MBEDTLS_ERR_ASN1_BUF_TOO_SMALL);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500767
768#if defined(MBEDTLS_PEM_WRITE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100769 TEST_ASSERT(mbedtls_pk_write_key_pem(&pk, NULL, 0) ==
770 MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500771
Gilles Peskine449bd832023-01-11 14:50:10 +0100772 TEST_ASSERT(mbedtls_pk_write_pubkey_pem(&pk, NULL, 0) ==
773 MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500774#endif /* MBEDTLS_PEM_WRITE_C */
775
776exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100777 mbedtls_pk_free(&pk);
Valerio Settib79f7db2023-04-19 14:25:52 +0200778 USE_PSA_DONE();
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500779}
780/* END_CASE */
781
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500782/* BEGIN_CASE */
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200783void pk_utils(int type, int curve_or_keybits, int bitlen, int len, char *name)
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200784{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200785 mbedtls_pk_context pk;
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200786
Gilles Peskine449bd832023-01-11 14:50:10 +0100787 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +0200788 USE_PSA_INIT();
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200789
Gilles Peskine449bd832023-01-11 14:50:10 +0100790 TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
Tomi Fontanilles9c693482023-12-14 21:40:54 +0200791 TEST_ASSERT(pk_genkey(&pk, curve_or_keybits) == 0);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200792
Gilles Peskine449bd832023-01-11 14:50:10 +0100793 TEST_ASSERT((int) mbedtls_pk_get_type(&pk) == type);
794 TEST_ASSERT(mbedtls_pk_can_do(&pk, type));
795 TEST_ASSERT(mbedtls_pk_get_bitlen(&pk) == (unsigned) bitlen);
796 TEST_ASSERT(mbedtls_pk_get_len(&pk) == (unsigned) len);
797 TEST_ASSERT(strcmp(mbedtls_pk_get_name(&pk), name) == 0);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200798
Paul Bakkerbd51b262014-07-10 15:26:12 +0200799exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100800 mbedtls_pk_free(&pk);
Valerio Setti12a063a2023-04-04 11:13:06 +0200801 USE_PSA_DONE();
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200802}
803/* END_CASE */
804
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200805/* BEGIN_CASE depends_on:MBEDTLS_PK_PARSE_C:MBEDTLS_FS_IO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100806void mbedtls_pk_check_pair(char *pub_file, char *prv_file, int ret)
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +0100807{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808 mbedtls_pk_context pub, prv, alt;
valerio6c666c62023-06-01 10:59:42 +0200809#if defined(MBEDTLS_USE_PSA_CRYPTO)
810 mbedtls_svc_key_id_t opaque_key_id = MBEDTLS_SVC_KEY_ID_INIT;
811#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +0100812
Gilles Peskine449bd832023-01-11 14:50:10 +0100813 mbedtls_pk_init(&pub);
814 mbedtls_pk_init(&prv);
815 mbedtls_pk_init(&alt);
valerio32f2ac92023-04-20 11:59:52 +0200816 USE_PSA_INIT();
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +0100817
Valerio Setti0fe1ee22023-04-03 14:42:22 +0200818#if defined(MBEDTLS_USE_PSA_CRYPTO)
819 /* mbedtls_pk_check_pair() returns either PK or ECP error codes depending
820 on MBEDTLS_USE_PSA_CRYPTO so here we dynamically translate between the
821 two */
822 if (ret == MBEDTLS_ERR_ECP_BAD_INPUT_DATA) {
823 ret = MBEDTLS_ERR_PK_BAD_INPUT_DATA;
824 }
valerio6c666c62023-06-01 10:59:42 +0200825#endif /* MBEDTLS_USE_PSA_CRYPTO */
Valerio Setti0fe1ee22023-04-03 14:42:22 +0200826
Gilles Peskine449bd832023-01-11 14:50:10 +0100827 TEST_ASSERT(mbedtls_pk_parse_public_keyfile(&pub, pub_file) == 0);
828 TEST_ASSERT(mbedtls_pk_parse_keyfile(&prv, prv_file, NULL,
829 mbedtls_test_rnd_std_rand, NULL)
830 == 0);
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +0100831
Gilles Peskine449bd832023-01-11 14:50:10 +0100832 TEST_ASSERT(mbedtls_pk_check_pair(&pub, &prv,
833 mbedtls_test_rnd_std_rand, NULL)
834 == ret);
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +0100835
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200836#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100837 if (mbedtls_pk_get_type(&prv) == MBEDTLS_PK_RSA) {
838 TEST_ASSERT(mbedtls_pk_setup_rsa_alt(&alt, mbedtls_pk_rsa(prv),
839 mbedtls_rsa_decrypt_func, mbedtls_rsa_sign_func,
840 mbedtls_rsa_key_len_func) == 0);
841 TEST_ASSERT(mbedtls_pk_check_pair(&pub, &alt,
842 mbedtls_test_rnd_std_rand, NULL)
843 == ret);
Manuel Pégourié-Gonnarda1efcb02014-11-08 17:08:08 +0100844 }
Manuel Pégourié-Gonnard7c13d692014-11-12 00:01:34 +0100845#endif
valerio6c666c62023-06-01 10:59:42 +0200846#if defined(MBEDTLS_USE_PSA_CRYPTO)
847 if (mbedtls_pk_get_type(&prv) == MBEDTLS_PK_ECKEY) {
848 TEST_EQUAL(mbedtls_pk_wrap_as_opaque(&prv, &opaque_key_id,
849 PSA_ALG_ANY_HASH,
850 PSA_KEY_USAGE_EXPORT, 0), 0);
851 TEST_EQUAL(mbedtls_pk_check_pair(&pub, &prv, mbedtls_test_rnd_std_rand,
852 NULL), ret);
853 }
854#endif
Manuel Pégourié-Gonnarda1efcb02014-11-08 17:08:08 +0100855
valerio6c666c62023-06-01 10:59:42 +0200856exit:
857#if defined(MBEDTLS_USE_PSA_CRYPTO)
858 psa_destroy_key(opaque_key_id);
859#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +0100860 mbedtls_pk_free(&pub);
861 mbedtls_pk_free(&prv);
862 mbedtls_pk_free(&alt);
Neil Armstrong56d51272022-02-22 15:29:05 +0100863 USE_PSA_DONE();
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +0100864}
865/* END_CASE */
866
Manuel Pégourié-Gonnard2d08ea42022-07-08 10:48:18 +0200867/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100868void pk_rsa_verify_test_vec(data_t *message_str, int digest, int mod,
869 char *input_N, char *input_E,
870 data_t *result_str, int result)
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200871{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200872 mbedtls_rsa_context *rsa;
873 mbedtls_pk_context pk;
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +0200874 mbedtls_pk_restart_ctx *rs_ctx = NULL;
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +0200875#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +0200876 mbedtls_pk_restart_ctx ctx;
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +0200877
878 rs_ctx = &ctx;
Gilles Peskine449bd832023-01-11 14:50:10 +0100879 mbedtls_pk_restart_init(rs_ctx);
Manuel Pégourié-Gonnard4edb9cb2018-07-02 12:23:23 +0200880 // this setting would ensure restart would happen if ECC was used
Gilles Peskine449bd832023-01-11 14:50:10 +0100881 mbedtls_ecp_set_max_ops(1);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +0200882#endif
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200883
Gilles Peskine449bd832023-01-11 14:50:10 +0100884 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +0200885 USE_PSA_INIT();
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200886
Gilles Peskine449bd832023-01-11 14:50:10 +0100887 TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
888 rsa = mbedtls_pk_rsa(pk);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200889
Paul Bakker42099c32014-01-27 11:45:49 +0100890 rsa->len = mod / 8;
Gilles Peskine449bd832023-01-11 14:50:10 +0100891 TEST_ASSERT(mbedtls_test_read_mpi(&rsa->N, input_N) == 0);
892 TEST_ASSERT(mbedtls_test_read_mpi(&rsa->E, input_E) == 0);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200893
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 TEST_ASSERT(mbedtls_pk_verify(&pk, digest, message_str->x, 0,
895 result_str->x, mbedtls_pk_get_len(&pk)) == result);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200896
Gilles Peskine449bd832023-01-11 14:50:10 +0100897 TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, digest, message_str->x, 0,
898 result_str->x, mbedtls_pk_get_len(
899 &pk), rs_ctx) == result);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +0200900
Paul Bakkerbd51b262014-07-10 15:26:12 +0200901exit:
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +0200902#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
Gilles Peskine449bd832023-01-11 14:50:10 +0100903 mbedtls_pk_restart_free(rs_ctx);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +0200904#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100905 mbedtls_pk_free(&pk);
Neil Armstrong56d51272022-02-22 15:29:05 +0100906 USE_PSA_DONE();
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200907}
908/* END_CASE */
909
Manuel Pégourié-Gonnard2d08ea42022-07-08 10:48:18 +0200910/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100911void pk_rsa_verify_ext_test_vec(data_t *message_str, int digest,
912 int mod, char *input_N,
913 char *input_E, data_t *result_str,
914 int pk_type, int mgf1_hash_id,
915 int salt_len, int sig_len,
916 int result)
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200917{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200918 mbedtls_rsa_context *rsa;
919 mbedtls_pk_context pk;
920 mbedtls_pk_rsassa_pss_options pss_opts;
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200921 void *options;
Neil Armstrong655725a2022-04-15 12:00:16 +0200922 int ret;
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200923
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +0200925 MD_OR_USE_PSA_INIT();
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200926
Gilles Peskine449bd832023-01-11 14:50:10 +0100927 TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
928 rsa = mbedtls_pk_rsa(pk);
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200929
930 rsa->len = mod / 8;
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 TEST_ASSERT(mbedtls_test_read_mpi(&rsa->N, input_N) == 0);
932 TEST_ASSERT(mbedtls_test_read_mpi(&rsa->E, input_E) == 0);
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200933
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200934
Gilles Peskine449bd832023-01-11 14:50:10 +0100935 if (mgf1_hash_id < 0) {
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200936 options = NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +0100937 } else {
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200938 options = &pss_opts;
939
940 pss_opts.mgf1_hash_id = mgf1_hash_id;
941 pss_opts.expected_salt_len = salt_len;
942 }
943
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 ret = mbedtls_pk_verify_ext(pk_type, options, &pk,
945 digest, message_str->x, message_str->len,
946 result_str->x, sig_len);
Neil Armstrong655725a2022-04-15 12:00:16 +0200947
Neil Armstrong655725a2022-04-15 12:00:16 +0200948#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100949 if (result == MBEDTLS_ERR_RSA_INVALID_PADDING) {
Neil Armstrong1c9eb722022-04-25 14:38:18 +0200950 /* Mbed TLS distinguishes "invalid padding" from "valid padding but
Neil Armstrong6e6967f2022-04-22 11:32:18 +0200951 * the rest of the signature is invalid". This has little use in
952 * practice and PSA doesn't report this distinction.
953 * In this case, PSA returns PSA_ERROR_INVALID_SIGNATURE translated
Neil Armstrong1c9eb722022-04-25 14:38:18 +0200954 * to MBEDTLS_ERR_RSA_VERIFY_FAILED.
955 * However, currently `mbedtls_pk_verify_ext()` may use either the
956 * PSA or the Mbed TLS API, depending on the PSS options used.
957 * So, it may return either INVALID_PADDING or INVALID_SIGNATURE.
Neil Armstrong6e6967f2022-04-22 11:32:18 +0200958 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 TEST_ASSERT(ret == result || ret == MBEDTLS_ERR_RSA_VERIFY_FAILED);
960 } else
Neil Armstrong655725a2022-04-15 12:00:16 +0200961#endif
Neil Armstrong6e6967f2022-04-22 11:32:18 +0200962 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100963 TEST_EQUAL(ret, result);
Neil Armstrong6e6967f2022-04-22 11:32:18 +0200964 }
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200965
Paul Bakkerbd51b262014-07-10 15:26:12 +0200966exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100967 mbedtls_pk_free(&pk);
Manuel Pégourié-Gonnardfa99afa2023-03-17 11:59:12 +0100968 MD_OR_USE_PSA_DONE();
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200969}
970/* END_CASE */
971
Valerio Setti48363742023-01-26 16:53:01 +0100972/* BEGIN_CASE depends_on:MBEDTLS_PK_CAN_ECDSA_VERIFY */
Gilles Peskine449bd832023-01-11 14:50:10 +0100973void pk_ec_test_vec(int type, int id, data_t *key, data_t *hash,
974 data_t *sig, int ret)
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200975{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976 mbedtls_pk_context pk;
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200977
Valerio Settib79f7db2023-04-19 14:25:52 +0200978 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +0200979 USE_PSA_INIT();
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200980
Gilles Peskine449bd832023-01-11 14:50:10 +0100981 TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200982
Gilles Peskine449bd832023-01-11 14:50:10 +0100983 TEST_ASSERT(mbedtls_pk_can_do(&pk, MBEDTLS_PK_ECDSA));
Valerio Setti483738e2023-05-17 15:37:29 +0200984#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Valerio Setti30fdc032023-06-14 14:57:46 +0200985 TEST_ASSERT(key->len <= MBEDTLS_PK_MAX_EC_PUBKEY_RAW_LEN);
986 memcpy(pk.pub_raw, key->x, key->len);
987 pk.ec_family = mbedtls_ecc_group_to_psa(id, &(pk.ec_bits));
988 pk.pub_raw_len = key->len;
Valerio Setti483738e2023-05-17 15:37:29 +0200989#else
990 mbedtls_ecp_keypair *eckey = (mbedtls_ecp_keypair *) mbedtls_pk_ec(pk);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200991
Gilles Peskine449bd832023-01-11 14:50:10 +0100992 TEST_ASSERT(mbedtls_ecp_group_load(&eckey->grp, id) == 0);
993 TEST_ASSERT(mbedtls_ecp_point_read_binary(&eckey->grp, &eckey->Q,
994 key->x, key->len) == 0);
Valerio Setti483738e2023-05-17 15:37:29 +0200995#endif
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200996
John Durkopd4efa8d2020-09-08 05:58:28 -0700997 // MBEDTLS_MD_NONE is used since it will be ignored.
Gilles Peskine449bd832023-01-11 14:50:10 +0100998 TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_NONE,
999 hash->x, hash->len, sig->x, sig->len) == ret);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001000
Paul Bakkerbd51b262014-07-10 15:26:12 +02001001exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001002 mbedtls_pk_free(&pk);
1003 USE_PSA_DONE();
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001004}
1005/* END_CASE */
1006
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001007/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE:MBEDTLS_ECDSA_C:MBEDTLS_ECDSA_DETERMINISTIC */
Gilles Peskine449bd832023-01-11 14:50:10 +01001008void pk_sign_verify_restart(int pk_type, int grp_id, char *d_str,
1009 char *QX_str, char *QY_str,
1010 int md_alg, data_t *hash, data_t *sig_check,
1011 int max_ops, int min_restart, int max_restart)
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001012{
1013 int ret, cnt_restart;
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02001014 mbedtls_pk_restart_ctx rs_ctx;
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001015 mbedtls_pk_context prv, pub;
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001016 unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];
Manuel Pégourié-Gonnard4608c482022-07-18 10:55:56 +02001017 size_t slen;
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001018
Gilles Peskine449bd832023-01-11 14:50:10 +01001019 mbedtls_pk_restart_init(&rs_ctx);
1020 mbedtls_pk_init(&prv);
1021 mbedtls_pk_init(&pub);
valerio32f2ac92023-04-20 11:59:52 +02001022 USE_PSA_INIT();
1023
Gilles Peskine449bd832023-01-11 14:50:10 +01001024 memset(sig, 0, sizeof(sig));
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001025
Gilles Peskine449bd832023-01-11 14:50:10 +01001026 TEST_ASSERT(mbedtls_pk_setup(&prv, mbedtls_pk_info_from_type(pk_type)) == 0);
Valerio Setti77a75682023-05-15 11:18:46 +02001027 TEST_ASSERT(mbedtls_ecp_group_load(&mbedtls_pk_ec_rw(prv)->grp, grp_id) == 0);
1028 TEST_ASSERT(mbedtls_test_read_mpi(&mbedtls_pk_ec_rw(prv)->d, d_str) == 0);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001029
Gilles Peskine449bd832023-01-11 14:50:10 +01001030 TEST_ASSERT(mbedtls_pk_setup(&pub, mbedtls_pk_info_from_type(pk_type)) == 0);
Valerio Setti77a75682023-05-15 11:18:46 +02001031 TEST_ASSERT(mbedtls_ecp_group_load(&mbedtls_pk_ec_rw(pub)->grp, grp_id) == 0);
1032 TEST_ASSERT(mbedtls_ecp_point_read_string(&mbedtls_pk_ec_rw(pub)->Q, 16, QX_str, QY_str) == 0);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001033
Gilles Peskine449bd832023-01-11 14:50:10 +01001034 mbedtls_ecp_set_max_ops(max_ops);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001035
Gilles Peskine449bd832023-01-11 14:50:10 +01001036 slen = sizeof(sig);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001037 cnt_restart = 0;
1038 do {
Gilles Peskine449bd832023-01-11 14:50:10 +01001039 ret = mbedtls_pk_sign_restartable(&prv, md_alg, hash->x, hash->len,
1040 sig, sizeof(sig), &slen,
1041 mbedtls_test_rnd_std_rand, NULL,
1042 &rs_ctx);
1043 } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001044
Gilles Peskine449bd832023-01-11 14:50:10 +01001045 TEST_ASSERT(ret == 0);
1046 TEST_ASSERT(slen == sig_check->len);
1047 TEST_ASSERT(memcmp(sig, sig_check->x, slen) == 0);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001048
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 TEST_ASSERT(cnt_restart >= min_restart);
1050 TEST_ASSERT(cnt_restart <= max_restart);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001051
1052 cnt_restart = 0;
1053 do {
Gilles Peskine449bd832023-01-11 14:50:10 +01001054 ret = mbedtls_pk_verify_restartable(&pub, md_alg,
1055 hash->x, hash->len, sig, slen, &rs_ctx);
1056 } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001057
Gilles Peskine449bd832023-01-11 14:50:10 +01001058 TEST_ASSERT(ret == 0);
1059 TEST_ASSERT(cnt_restart >= min_restart);
1060 TEST_ASSERT(cnt_restart <= max_restart);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001061
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001062 sig[0]++;
1063 do {
Gilles Peskine449bd832023-01-11 14:50:10 +01001064 ret = mbedtls_pk_verify_restartable(&pub, md_alg,
1065 hash->x, hash->len, sig, slen, &rs_ctx);
1066 } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
1067 TEST_ASSERT(ret != 0);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001068 sig[0]--;
1069
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +02001070 /* Do we leak memory when aborting? try verify then sign
1071 * This test only makes sense when we actually restart */
Gilles Peskine449bd832023-01-11 14:50:10 +01001072 if (min_restart > 0) {
1073 ret = mbedtls_pk_verify_restartable(&pub, md_alg,
1074 hash->x, hash->len, sig, slen, &rs_ctx);
1075 TEST_ASSERT(ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
1076 mbedtls_pk_restart_free(&rs_ctx);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001077
Gilles Peskine449bd832023-01-11 14:50:10 +01001078 slen = sizeof(sig);
1079 ret = mbedtls_pk_sign_restartable(&prv, md_alg, hash->x, hash->len,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001080 sig, sizeof(sig), &slen,
Gilles Peskine449bd832023-01-11 14:50:10 +01001081 mbedtls_test_rnd_std_rand, NULL,
1082 &rs_ctx);
1083 TEST_ASSERT(ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +02001084 }
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001085
1086exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001087 mbedtls_pk_restart_free(&rs_ctx);
1088 mbedtls_pk_free(&prv);
1089 mbedtls_pk_free(&pub);
Neil Armstrong56d51272022-02-22 15:29:05 +01001090 USE_PSA_DONE();
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001091}
1092/* END_CASE */
1093
Gilles Peskine74860dd2024-02-12 14:25:18 +01001094/* BEGIN_CASE depends_on:MBEDTLS_MD_CAN_SHA256:PK_CAN_SIGN_SOME */
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001095void pk_sign_verify(int type, int curve_or_keybits, int sign_ret, int verify_ret)
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001096{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001097 mbedtls_pk_context pk;
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001098 size_t sig_len;
Gilles Peskine6e3187b2021-06-22 18:39:53 +02001099 unsigned char hash[32]; // Hard-coded for SHA256
Gilles Peskine449bd832023-01-11 14:50:10 +01001100 size_t hash_len = sizeof(hash);
Gilles Peskineeba088a2019-11-05 16:32:32 +01001101 unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001102 void *rs_ctx = NULL;
1103#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02001104 mbedtls_pk_restart_ctx ctx;
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001105
1106 rs_ctx = &ctx;
Gilles Peskine449bd832023-01-11 14:50:10 +01001107 mbedtls_pk_restart_init(rs_ctx);
Manuel Pégourié-Gonnard4edb9cb2018-07-02 12:23:23 +02001108 /* This value is large enough that the operation will complete in one run.
1109 * See comments at the top of ecp_test_vect_restart in
1110 * test_suite_ecp.function for estimates of operation counts. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001111 mbedtls_ecp_set_max_ops(42000);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001112#endif
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001113
Valerio Settib79f7db2023-04-19 14:25:52 +02001114 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +02001115 MD_OR_USE_PSA_INIT();
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001116
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001117 memset(hash, 0x2a, sizeof(hash));
1118 memset(sig, 0, sizeof(sig));
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001119
Gilles Peskine449bd832023-01-11 14:50:10 +01001120 TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001121 TEST_ASSERT(pk_genkey(&pk, curve_or_keybits) == 0);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001122
Gilles Peskine449bd832023-01-11 14:50:10 +01001123 TEST_ASSERT(mbedtls_pk_sign_restartable(&pk, MBEDTLS_MD_SHA256,
1124 hash, hash_len,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001125 sig, sizeof(sig), &sig_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001126 mbedtls_test_rnd_std_rand, NULL,
1127 rs_ctx) == sign_ret);
1128 if (sign_ret == 0) {
1129 TEST_ASSERT(sig_len <= MBEDTLS_PK_SIGNATURE_MAX_SIZE);
1130 } else {
Gilles Peskinef85e4e62019-11-12 11:08:23 +01001131 sig_len = MBEDTLS_PK_SIGNATURE_MAX_SIZE;
Gilles Peskine449bd832023-01-11 14:50:10 +01001132 }
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001133
Gilles Peskine449bd832023-01-11 14:50:10 +01001134 TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1135 hash, hash_len, sig, sig_len) == verify_ret);
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001136
Gilles Peskine449bd832023-01-11 14:50:10 +01001137 if (verify_ret == 0) {
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001138 hash[0]++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001139 TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1140 hash, hash_len, sig, sig_len) != 0);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001141 hash[0]--;
1142
1143 sig[0]++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001144 TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1145 hash, hash_len, sig, sig_len) != 0);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001146 sig[0]--;
1147 }
1148
Gilles Peskine449bd832023-01-11 14:50:10 +01001149 TEST_ASSERT(mbedtls_pk_sign(&pk, MBEDTLS_MD_SHA256, hash, hash_len,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001150 sig, sizeof(sig), &sig_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001151 mbedtls_test_rnd_std_rand,
1152 NULL) == sign_ret);
1153 if (sign_ret == 0) {
1154 TEST_ASSERT(sig_len <= MBEDTLS_PK_SIGNATURE_MAX_SIZE);
1155 } else {
Gilles Peskinef85e4e62019-11-12 11:08:23 +01001156 sig_len = MBEDTLS_PK_SIGNATURE_MAX_SIZE;
Gilles Peskine449bd832023-01-11 14:50:10 +01001157 }
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001158
Gilles Peskine449bd832023-01-11 14:50:10 +01001159 TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, MBEDTLS_MD_SHA256,
1160 hash, hash_len, sig, sig_len, rs_ctx) == verify_ret);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001161
Gilles Peskine449bd832023-01-11 14:50:10 +01001162 if (verify_ret == 0) {
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001163 hash[0]++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001164 TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, MBEDTLS_MD_SHA256,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001165 hash, sizeof(hash), sig, sig_len, rs_ctx) != 0);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001166 hash[0]--;
1167
1168 sig[0]++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001169 TEST_ASSERT(mbedtls_pk_verify_restartable(&pk, MBEDTLS_MD_SHA256,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001170 hash, sizeof(hash), sig, sig_len, rs_ctx) != 0);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001171 sig[0]--;
1172 }
1173
Paul Bakkerbd51b262014-07-10 15:26:12 +02001174exit:
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001175#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
Gilles Peskine449bd832023-01-11 14:50:10 +01001176 mbedtls_pk_restart_free(rs_ctx);
Manuel Pégourié-Gonnardc4ee9ac2017-05-08 10:09:36 +02001177#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001178 mbedtls_pk_free(&pk);
Manuel Pégourié-Gonnardc584c272023-03-22 00:32:04 +01001179 MD_OR_USE_PSA_DONE();
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001180}
1181/* END_CASE */
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001182
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001183/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
Gilles Peskine449bd832023-01-11 14:50:10 +01001184void pk_rsa_encrypt_decrypt_test(data_t *message, int mod,
1185 char *input_P, char *input_Q,
1186 char *input_N, char *input_E,
1187 int ret)
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001188{
Neil Armstronge0df42c2022-02-22 14:26:49 +01001189 unsigned char output[300], result[300];
Ronald Cron351f0ee2020-06-10 12:12:18 +02001190 mbedtls_test_rnd_pseudo_info rnd_info;
Neil Armstronge0df42c2022-02-22 14:26:49 +01001191 mbedtls_mpi N, P, Q, E;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001192 mbedtls_rsa_context *rsa;
1193 mbedtls_pk_context pk;
Neil Armstronge0df42c2022-02-22 14:26:49 +01001194 size_t olen, rlen;
1195
Gilles Peskine449bd832023-01-11 14:50:10 +01001196 mbedtls_pk_init(&pk);
1197 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1198 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
valerio32f2ac92023-04-20 11:59:52 +02001199 USE_PSA_INIT();
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001200
Gilles Peskine449bd832023-01-11 14:50:10 +01001201 memset(&rnd_info, 0, sizeof(mbedtls_test_rnd_pseudo_info));
1202 memset(output, 0, sizeof(output));
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001203
Neil Armstronge0df42c2022-02-22 14:26:49 +01001204 /* encryption test */
1205
1206 /* init pk-rsa context */
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1208 rsa = mbedtls_pk_rsa(pk);
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001209
Neil Armstronge0df42c2022-02-22 14:26:49 +01001210 /* load public key */
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001211 rsa->len = mod / 8;
Gilles Peskine449bd832023-01-11 14:50:10 +01001212 TEST_ASSERT(mbedtls_test_read_mpi(&rsa->N, input_N) == 0);
1213 TEST_ASSERT(mbedtls_test_read_mpi(&rsa->E, input_E) == 0);
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001214
Gilles Peskine449bd832023-01-11 14:50:10 +01001215 TEST_ASSERT(mbedtls_pk_encrypt(&pk, message->x, message->len,
1216 output, &olen, sizeof(output),
1217 mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
Neil Armstronge0df42c2022-02-22 14:26:49 +01001218
1219 /* decryption test */
Gilles Peskine449bd832023-01-11 14:50:10 +01001220 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1221 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
Neil Armstronge0df42c2022-02-22 14:26:49 +01001222
1223 /* init pk-rsa context */
Gilles Peskine449bd832023-01-11 14:50:10 +01001224 mbedtls_pk_free(&pk);
1225 TEST_ASSERT(mbedtls_pk_setup(&pk,
1226 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1227 rsa = mbedtls_pk_rsa(pk);
Neil Armstronge0df42c2022-02-22 14:26:49 +01001228
1229 /* load public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01001230 TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
1231 TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
Neil Armstronge0df42c2022-02-22 14:26:49 +01001232
1233 /* load private key */
Gilles Peskine449bd832023-01-11 14:50:10 +01001234 TEST_ASSERT(mbedtls_test_read_mpi(&P, input_P) == 0);
1235 TEST_ASSERT(mbedtls_test_read_mpi(&Q, input_Q) == 0);
1236 TEST_ASSERT(mbedtls_rsa_import(rsa, &N, &P, &Q, NULL, &E) == 0);
1237 TEST_ASSERT(mbedtls_rsa_get_len(rsa) == (size_t) (mod / 8));
1238 TEST_ASSERT(mbedtls_rsa_complete(rsa) == 0);
Neil Armstronge0df42c2022-02-22 14:26:49 +01001239
Gilles Peskine449bd832023-01-11 14:50:10 +01001240 memset(result, 0, sizeof(result));
Neil Armstronge0df42c2022-02-22 14:26:49 +01001241 rlen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001242 TEST_ASSERT(mbedtls_pk_decrypt(&pk, output, olen,
1243 result, &rlen, sizeof(result),
1244 mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1245 if (ret == 0) {
1246 TEST_ASSERT(rlen == message->len);
1247 TEST_ASSERT(memcmp(result, message->x, rlen) == 0);
Neil Armstronge0df42c2022-02-22 14:26:49 +01001248 }
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001249
Paul Bakkerbd51b262014-07-10 15:26:12 +02001250exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001251 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
1252 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
1253 mbedtls_pk_free(&pk);
1254 USE_PSA_DONE();
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001255}
1256/* END_CASE */
1257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001258/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
Gilles Peskine449bd832023-01-11 14:50:10 +01001259void pk_rsa_decrypt_test_vec(data_t *cipher, int mod,
1260 char *input_P, char *input_Q,
1261 char *input_N, char *input_E,
1262 data_t *clear, int ret)
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001263{
Ron Eldor58e3f692018-11-21 13:44:31 +02001264 unsigned char output[256];
Ronald Cron351f0ee2020-06-10 12:12:18 +02001265 mbedtls_test_rnd_pseudo_info rnd_info;
Hanno Beckerd71dc152017-08-23 06:32:42 +01001266 mbedtls_mpi N, P, Q, E;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001267 mbedtls_rsa_context *rsa;
1268 mbedtls_pk_context pk;
Azim Khanf1aaec92017-05-30 14:23:15 +01001269 size_t olen;
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001270
Gilles Peskine449bd832023-01-11 14:50:10 +01001271 mbedtls_pk_init(&pk);
1272 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1273 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
valerio32f2ac92023-04-20 11:59:52 +02001274 USE_PSA_INIT();
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001275
Gilles Peskine449bd832023-01-11 14:50:10 +01001276 memset(&rnd_info, 0, sizeof(mbedtls_test_rnd_pseudo_info));
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001277
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001278 /* init pk-rsa context */
Gilles Peskine449bd832023-01-11 14:50:10 +01001279 TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1280 rsa = mbedtls_pk_rsa(pk);
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001281
1282 /* load public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01001283 TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
1284 TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001285
1286 /* load private key */
Gilles Peskine449bd832023-01-11 14:50:10 +01001287 TEST_ASSERT(mbedtls_test_read_mpi(&P, input_P) == 0);
1288 TEST_ASSERT(mbedtls_test_read_mpi(&Q, input_Q) == 0);
1289 TEST_ASSERT(mbedtls_rsa_import(rsa, &N, &P, &Q, NULL, &E) == 0);
1290 TEST_ASSERT(mbedtls_rsa_get_len(rsa) == (size_t) (mod / 8));
1291 TEST_ASSERT(mbedtls_rsa_complete(rsa) == 0);
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001292
1293 /* decryption test */
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 memset(output, 0, sizeof(output));
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001295 olen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001296 TEST_ASSERT(mbedtls_pk_decrypt(&pk, cipher->x, cipher->len,
1297 output, &olen, sizeof(output),
1298 mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
1299 if (ret == 0) {
1300 TEST_ASSERT(olen == clear->len);
1301 TEST_ASSERT(memcmp(output, clear->x, olen) == 0);
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001302 }
1303
Paul Bakkerbd51b262014-07-10 15:26:12 +02001304exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001305 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
1306 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
1307 mbedtls_pk_free(&pk);
1308 USE_PSA_DONE();
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +02001309}
1310/* END_CASE */
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001311
Neil Armstrongb32ae722022-04-22 15:02:47 +02001312/* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01001313void pk_wrap_rsa_decrypt_test_vec(data_t *cipher, int mod,
1314 char *input_P, char *input_Q,
1315 char *input_N, char *input_E,
1316 data_t *clear, int ret)
Neil Armstrongb32ae722022-04-22 15:02:47 +02001317{
1318 unsigned char output[256];
1319 mbedtls_test_rnd_pseudo_info rnd_info;
1320 mbedtls_mpi N, P, Q, E;
1321 mbedtls_rsa_context *rsa;
1322 mbedtls_pk_context pk;
1323 mbedtls_svc_key_id_t key_id;
1324 size_t olen;
1325
Gilles Peskine449bd832023-01-11 14:50:10 +01001326 mbedtls_pk_init(&pk);
1327 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
1328 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
valerio32f2ac92023-04-20 11:59:52 +02001329 USE_PSA_INIT();
Neil Armstrongb32ae722022-04-22 15:02:47 +02001330
Gilles Peskine449bd832023-01-11 14:50:10 +01001331 memset(&rnd_info, 0, sizeof(mbedtls_test_rnd_pseudo_info));
Neil Armstrongb32ae722022-04-22 15:02:47 +02001332
1333 /* init pk-rsa context */
Gilles Peskine449bd832023-01-11 14:50:10 +01001334 TEST_EQUAL(mbedtls_pk_setup(&pk,
1335 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)), 0);
1336 rsa = mbedtls_pk_rsa(pk);
Neil Armstrongb32ae722022-04-22 15:02:47 +02001337
1338 /* load public key */
Gilles Peskine449bd832023-01-11 14:50:10 +01001339 TEST_EQUAL(mbedtls_test_read_mpi(&N, input_N), 0);
1340 TEST_EQUAL(mbedtls_test_read_mpi(&E, input_E), 0);
Neil Armstrongb32ae722022-04-22 15:02:47 +02001341
1342 /* load private key */
Gilles Peskine449bd832023-01-11 14:50:10 +01001343 TEST_EQUAL(mbedtls_test_read_mpi(&P, input_P), 0);
1344 TEST_EQUAL(mbedtls_test_read_mpi(&Q, input_Q), 0);
1345 TEST_EQUAL(mbedtls_rsa_import(rsa, &N, &P, &Q, NULL, &E), 0);
1346 TEST_EQUAL(mbedtls_rsa_get_len(rsa), (size_t) (mod / 8));
1347 TEST_EQUAL(mbedtls_rsa_complete(rsa), 0);
Neil Armstrongb32ae722022-04-22 15:02:47 +02001348
1349 /* Turn PK context into an opaque one. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001350 TEST_EQUAL(mbedtls_pk_wrap_as_opaque(&pk, &key_id,
1351 PSA_ALG_RSA_PKCS1V15_CRYPT,
1352 PSA_KEY_USAGE_DECRYPT,
1353 PSA_ALG_NONE), 0);
Neil Armstrongb32ae722022-04-22 15:02:47 +02001354
1355 /* decryption test */
Gilles Peskine449bd832023-01-11 14:50:10 +01001356 memset(output, 0, sizeof(output));
Neil Armstrongb32ae722022-04-22 15:02:47 +02001357 olen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001358 TEST_EQUAL(mbedtls_pk_decrypt(&pk, cipher->x, cipher->len,
1359 output, &olen, sizeof(output),
1360 mbedtls_test_rnd_pseudo_rand, &rnd_info), ret);
1361 if (ret == 0) {
1362 TEST_EQUAL(olen, clear->len);
1363 TEST_EQUAL(memcmp(output, clear->x, olen), 0);
Neil Armstrongb32ae722022-04-22 15:02:47 +02001364 }
1365
Gilles Peskine449bd832023-01-11 14:50:10 +01001366 TEST_EQUAL(PSA_SUCCESS, psa_destroy_key(key_id));
Neil Armstrongb32ae722022-04-22 15:02:47 +02001367
1368exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001369 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
1370 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
1371 mbedtls_pk_free(&pk);
1372 USE_PSA_DONE();
Neil Armstrongb32ae722022-04-22 15:02:47 +02001373}
1374/* END_CASE */
1375
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001376/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001377void pk_ec_nocrypt(int type)
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001378{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001379 mbedtls_pk_context pk;
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001380 unsigned char output[100];
1381 unsigned char input[100];
Ronald Cron351f0ee2020-06-10 12:12:18 +02001382 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001383 size_t olen = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001384 int ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001385
Gilles Peskine449bd832023-01-11 14:50:10 +01001386 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +02001387 USE_PSA_INIT();
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001388
Gilles Peskine449bd832023-01-11 14:50:10 +01001389 memset(&rnd_info, 0, sizeof(mbedtls_test_rnd_pseudo_info));
1390 memset(output, 0, sizeof(output));
1391 memset(input, 0, sizeof(input));
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001392
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 TEST_ASSERT(mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(type)) == 0);
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001394
Gilles Peskine449bd832023-01-11 14:50:10 +01001395 TEST_ASSERT(mbedtls_pk_encrypt(&pk, input, sizeof(input),
1396 output, &olen, sizeof(output),
1397 mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001398
Gilles Peskine449bd832023-01-11 14:50:10 +01001399 TEST_ASSERT(mbedtls_pk_decrypt(&pk, input, sizeof(input),
1400 output, &olen, sizeof(output),
1401 mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001402
Paul Bakkerbd51b262014-07-10 15:26:12 +02001403exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001404 mbedtls_pk_free(&pk);
Valerio Settib79f7db2023-04-19 14:25:52 +02001405 USE_PSA_DONE();
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +02001406}
1407/* END_CASE */
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001408
Andres Amaya Garcia7ea67272017-05-08 11:15:49 +01001409/* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
Gilles Peskine449bd832023-01-11 14:50:10 +01001410void pk_rsa_overflow()
Andres AG5c79d252017-02-15 10:52:32 +00001411{
1412 mbedtls_pk_context pk;
Valerio Setti8bb93bb2023-04-24 09:19:45 +02001413 size_t hash_len = UINT_MAX + 1, sig_len = UINT_MAX + 1;
itayzafrir693a1d92018-02-26 12:02:10 +02001414 unsigned char hash[50], sig[100];
Andres Amaya Garcia7ea67272017-05-08 11:15:49 +01001415
valerio32f2ac92023-04-20 11:59:52 +02001416 mbedtls_pk_init(&pk);
Valerio Settib79f7db2023-04-19 14:25:52 +02001417 USE_PSA_INIT();
valerio32f2ac92023-04-20 11:59:52 +02001418
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001419 memset(hash, 0x2a, sizeof(hash));
1420 memset(sig, 0, sizeof(sig));
Andres AG5c79d252017-02-15 10:52:32 +00001421
Tomi Fontanilles81746622023-07-16 13:06:06 +03001422 TEST_EQUAL(mbedtls_pk_setup(&pk,
1423 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)), 0);
Andres AG5c79d252017-02-15 10:52:32 +00001424
1425#if defined(MBEDTLS_PKCS1_V21)
Tomi Fontanilles81746622023-07-16 13:06:06 +03001426 TEST_EQUAL(mbedtls_pk_verify_ext(MBEDTLS_PK_RSASSA_PSS, NULL, &pk,
1427 MBEDTLS_MD_NONE, hash, hash_len, sig, sig_len),
1428 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Andres AG5c79d252017-02-15 10:52:32 +00001429#endif /* MBEDTLS_PKCS1_V21 */
1430
Tomi Fontanilles81746622023-07-16 13:06:06 +03001431 TEST_EQUAL(mbedtls_pk_verify(&pk, MBEDTLS_MD_NONE, hash, hash_len,
1432 sig, sig_len),
1433 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Andres AG5c79d252017-02-15 10:52:32 +00001434
Tomi Fontanilles81746622023-07-16 13:06:06 +03001435#if defined(MBEDTLS_PKCS1_V21)
1436 TEST_EQUAL(mbedtls_pk_sign_ext(MBEDTLS_PK_RSASSA_PSS, &pk,
1437 MBEDTLS_MD_NONE, hash, hash_len,
1438 sig, sizeof(sig), &sig_len,
1439 mbedtls_test_rnd_std_rand, NULL),
1440 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
1441#endif /* MBEDTLS_PKCS1_V21 */
1442
1443 TEST_EQUAL(mbedtls_pk_sign(&pk, MBEDTLS_MD_NONE, hash, hash_len,
1444 sig, sizeof(sig), &sig_len,
1445 mbedtls_test_rnd_std_rand, NULL),
1446 MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Andres AG5c79d252017-02-15 10:52:32 +00001447
1448exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001449 mbedtls_pk_free(&pk);
Valerio Settib79f7db2023-04-19 14:25:52 +02001450 USE_PSA_DONE();
Andres AG5c79d252017-02-15 10:52:32 +00001451}
1452/* END_CASE */
1453
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001454/* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_PK_RSA_ALT_SUPPORT */
Gilles Peskine449bd832023-01-11 14:50:10 +01001455void pk_rsa_alt()
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001456{
1457 /*
1458 * An rsa_alt context can only do private operations (decrypt, sign).
1459 * Test it against the public operations (encrypt, verify) of a
1460 * corresponding rsa context.
1461 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001462 mbedtls_rsa_context raw;
1463 mbedtls_pk_context rsa, alt;
1464 mbedtls_pk_debug_item dbg_items[10];
Waleed Elmelegy76336c32023-06-30 16:48:19 +01001465 unsigned char hash[50], sig[RSA_KEY_LEN];
1466 unsigned char msg[50], ciph[RSA_KEY_LEN], test[50];
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001467 size_t sig_len, ciph_len, test_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468 int ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001469
Gilles Peskine449bd832023-01-11 14:50:10 +01001470 mbedtls_rsa_init(&raw);
valerio32f2ac92023-04-20 11:59:52 +02001471 mbedtls_pk_init(&rsa);
1472 mbedtls_pk_init(&alt);
1473 USE_PSA_INIT();
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001474
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001475 memset(hash, 0x2a, sizeof(hash));
1476 memset(sig, 0, sizeof(sig));
1477 memset(msg, 0x2a, sizeof(msg));
1478 memset(ciph, 0, sizeof(ciph));
1479 memset(test, 0, sizeof(test));
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001480
Shaun Case8b0ecbc2021-12-20 21:14:10 -08001481 /* Initialize PK RSA context with random key */
Gilles Peskine449bd832023-01-11 14:50:10 +01001482 TEST_ASSERT(mbedtls_pk_setup(&rsa,
1483 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1484 TEST_ASSERT(pk_genkey(&rsa, RSA_KEY_SIZE) == 0);
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001485
1486 /* Extract key to the raw rsa context */
Gilles Peskine449bd832023-01-11 14:50:10 +01001487 TEST_ASSERT(mbedtls_rsa_copy(&raw, mbedtls_pk_rsa(rsa)) == 0);
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001488
1489 /* Initialize PK RSA_ALT context */
Gilles Peskine449bd832023-01-11 14:50:10 +01001490 TEST_ASSERT(mbedtls_pk_setup_rsa_alt(&alt, (void *) &raw,
1491 mbedtls_rsa_decrypt_func, mbedtls_rsa_sign_func,
1492 mbedtls_rsa_key_len_func) == 0);
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001493
1494 /* Test administrative functions */
Gilles Peskine449bd832023-01-11 14:50:10 +01001495 TEST_ASSERT(mbedtls_pk_can_do(&alt, MBEDTLS_PK_RSA));
1496 TEST_ASSERT(mbedtls_pk_get_bitlen(&alt) == RSA_KEY_SIZE);
1497 TEST_ASSERT(mbedtls_pk_get_len(&alt) == RSA_KEY_LEN);
1498 TEST_ASSERT(mbedtls_pk_get_type(&alt) == MBEDTLS_PK_RSA_ALT);
1499 TEST_ASSERT(strcmp(mbedtls_pk_get_name(&alt), "RSA-alt") == 0);
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001500
Gilles Peskine0b172552024-01-18 14:11:26 +01001501#if defined(MBEDTLS_PSA_CRYPTO_C)
1502 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1503 TEST_EQUAL(mbedtls_pk_get_psa_attributes(&alt,
1504 PSA_KEY_USAGE_ENCRYPT,
1505 &attributes),
1506 MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE);
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001507 mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
1508 TEST_EQUAL(mbedtls_pk_import_into_psa(&alt, &attributes, &key_id),
1509 MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE);
Gilles Peskine0b172552024-01-18 14:11:26 +01001510#endif /* MBEDTLS_PSA_CRYPTO_C */
1511
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001512 /* Test signature */
Dave Rodgmand26d7442023-02-11 17:14:54 +00001513#if SIZE_MAX > UINT_MAX
Gilles Peskine449bd832023-01-11 14:50:10 +01001514 TEST_ASSERT(mbedtls_pk_sign(&alt, MBEDTLS_MD_NONE, hash, SIZE_MAX,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001515 sig, sizeof(sig), &sig_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001516 mbedtls_test_rnd_std_rand, NULL)
1517 == MBEDTLS_ERR_PK_BAD_INPUT_DATA);
Dave Rodgmand26d7442023-02-11 17:14:54 +00001518#endif /* SIZE_MAX > UINT_MAX */
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001519 TEST_ASSERT(mbedtls_pk_sign(&alt, MBEDTLS_MD_NONE, hash, sizeof(hash),
1520 sig, sizeof(sig), &sig_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001521 mbedtls_test_rnd_std_rand, NULL)
1522 == 0);
1523 TEST_ASSERT(sig_len == RSA_KEY_LEN);
1524 TEST_ASSERT(mbedtls_pk_verify(&rsa, MBEDTLS_MD_NONE,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001525 hash, sizeof(hash), sig, sig_len) == 0);
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001526
1527 /* Test decrypt */
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001528 TEST_ASSERT(mbedtls_pk_encrypt(&rsa, msg, sizeof(msg),
1529 ciph, &ciph_len, sizeof(ciph),
Gilles Peskine449bd832023-01-11 14:50:10 +01001530 mbedtls_test_rnd_std_rand, NULL) == 0);
1531 TEST_ASSERT(mbedtls_pk_decrypt(&alt, ciph, ciph_len,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001532 test, &test_len, sizeof(test),
Gilles Peskine449bd832023-01-11 14:50:10 +01001533 mbedtls_test_rnd_std_rand, NULL) == 0);
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001534 TEST_ASSERT(test_len == sizeof(msg));
Gilles Peskine449bd832023-01-11 14:50:10 +01001535 TEST_ASSERT(memcmp(test, msg, test_len) == 0);
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001536
1537 /* Test forbidden operations */
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001538 TEST_ASSERT(mbedtls_pk_encrypt(&alt, msg, sizeof(msg),
1539 ciph, &ciph_len, sizeof(ciph),
Gilles Peskine449bd832023-01-11 14:50:10 +01001540 mbedtls_test_rnd_std_rand, NULL) == ret);
1541 TEST_ASSERT(mbedtls_pk_verify(&alt, MBEDTLS_MD_NONE,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001542 hash, sizeof(hash), sig, sig_len) == ret);
Gilles Peskine449bd832023-01-11 14:50:10 +01001543 TEST_ASSERT(mbedtls_pk_debug(&alt, dbg_items) == ret);
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001544
Paul Bakkerbd51b262014-07-10 15:26:12 +02001545exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001546 mbedtls_rsa_free(&raw);
1547 mbedtls_pk_free(&rsa); mbedtls_pk_free(&alt);
1548 USE_PSA_DONE();
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02001549}
1550/* END_CASE */
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001551
Yanray Wang61f96602023-09-25 14:13:22 +08001552/* BEGIN_CASE depends_on:MBEDTLS_MD_CAN_SHA256:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_TEST_PK_PSA_SIGN */
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001553void pk_psa_sign(int curve_or_keybits, int psa_type, int expected_bits)
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001554{
1555 mbedtls_pk_context pk;
Gilles Peskine33b1c692019-12-19 00:09:47 +01001556 unsigned char hash[32];
Neil Armstrong67fc0362022-03-15 14:48:52 +01001557 unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
Gilles Peskine33b1c692019-12-19 00:09:47 +01001558 unsigned char pkey_legacy[200];
1559 unsigned char pkey_psa[200];
Hanno Becker56104ea2019-02-01 11:48:19 +00001560 unsigned char *pkey_legacy_start, *pkey_psa_start;
Neil Armstrong95974972022-04-22 13:57:44 +02001561 psa_algorithm_t alg_psa;
Hanno Becker56104ea2019-02-01 11:48:19 +00001562 size_t sig_len, klen_legacy, klen_psa;
1563 int ret;
Ronald Cron5425a212020-08-04 14:58:35 +02001564 mbedtls_svc_key_id_t key_id;
Gilles Peskine85f47c92019-12-18 20:44:15 +01001565 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001566
1567 /*
1568 * This tests making signatures with a wrapped PSA key:
Neil Armstrong67fc0362022-03-15 14:48:52 +01001569 * - generate a fresh ECP/RSA legacy PK context
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001570 * - wrap it in a PK context and make a signature this way
1571 * - extract the public key
1572 * - parse it to a PK context and verify the signature this way
1573 */
1574
valerio32f2ac92023-04-20 11:59:52 +02001575 mbedtls_pk_init(&pk);
Valerio Settib79f7db2023-04-19 14:25:52 +02001576 USE_PSA_INIT();
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001577
Neil Armstrong67fc0362022-03-15 14:48:52 +01001578#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001579 if (PSA_KEY_TYPE_IS_RSA(psa_type)) {
Neil Armstrong67fc0362022-03-15 14:48:52 +01001580 /* Create legacy RSA public/private key in PK context. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001581 TEST_ASSERT(mbedtls_pk_setup(&pk,
1582 mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) == 0);
1583 TEST_ASSERT(mbedtls_rsa_gen_key(mbedtls_pk_rsa(pk),
1584 mbedtls_test_rnd_std_rand, NULL,
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001585 curve_or_keybits, 3) == 0);
Gilles Peskine449bd832023-01-11 14:50:10 +01001586 alg_psa = PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_256);
1587 } else
Neil Armstrong67fc0362022-03-15 14:48:52 +01001588#endif /* MBEDTLS_RSA_C && MBEDTLS_GENPRIME */
Valerio Setti48363742023-01-26 16:53:01 +01001589#if defined(MBEDTLS_PK_CAN_ECDSA_SIGN)
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001590 if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(psa_type)) {
1591 mbedtls_ecp_group_id grpid = curve_or_keybits;
Neil Armstrong67fc0362022-03-15 14:48:52 +01001592
1593 /* Create legacy EC public/private key in PK context. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001594 TEST_ASSERT(mbedtls_pk_setup(&pk,
1595 mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)) == 0);
Valerio Settib6891b12023-04-03 16:01:47 +02001596 TEST_ASSERT(pk_genkey(&pk, grpid) == 0);
1597
Gilles Peskine449bd832023-01-11 14:50:10 +01001598 alg_psa = PSA_ALG_ECDSA(PSA_ALG_SHA_256);
1599 } else
Valerio Setti48363742023-01-26 16:53:01 +01001600#endif /* MBEDTLS_PK_CAN_ECDSA_SIGN */
Neil Armstrong67fc0362022-03-15 14:48:52 +01001601 {
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001602 (void) curve_or_keybits;
Gilles Peskine449bd832023-01-11 14:50:10 +01001603 TEST_ASSUME(!"Opaque PK key not supported in this configuration");
Neil Armstrong67fc0362022-03-15 14:48:52 +01001604 }
Hanno Becker56104ea2019-02-01 11:48:19 +00001605
1606 /* Export underlying public key for re-importing in a legacy context. */
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001607#if defined(MBEDTLS_PK_WRITE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001608 ret = mbedtls_pk_write_pubkey_der(&pk, pkey_legacy,
1609 sizeof(pkey_legacy));
1610 TEST_ASSERT(ret >= 0);
Hanno Becker56104ea2019-02-01 11:48:19 +00001611 klen_legacy = (size_t) ret;
1612 /* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001613 pkey_legacy_start = pkey_legacy + sizeof(pkey_legacy) - klen_legacy;
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001614#else
Valerio Setti77a75682023-05-15 11:18:46 +02001615 ret = mbedtls_ecp_point_write_binary(&(mbedtls_pk_ec_ro(pk)->grp),
1616 &(mbedtls_pk_ec_ro(pk)->Q),
Valerio Setti683a4322023-02-08 09:52:40 +01001617 MBEDTLS_ECP_PF_UNCOMPRESSED,
1618 &klen_legacy, pkey_legacy,
1619 sizeof(pkey_legacy));
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001620 TEST_EQUAL(ret, 0);
1621 pkey_legacy_start = pkey_legacy;
1622#endif /* MBEDTLS_PK_WRITE_C */
Hanno Becker56104ea2019-02-01 11:48:19 +00001623
1624 /* Turn PK context into an opaque one. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001625 TEST_ASSERT(mbedtls_pk_wrap_as_opaque(&pk, &key_id, alg_psa,
1626 PSA_KEY_USAGE_SIGN_HASH,
1627 PSA_ALG_NONE) == 0);
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001628
Gilles Peskine449bd832023-01-11 14:50:10 +01001629 PSA_ASSERT(psa_get_key_attributes(key_id, &attributes));
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001630 TEST_EQUAL(psa_get_key_type(&attributes), (psa_key_type_t) psa_type);
1631 TEST_EQUAL(psa_get_key_bits(&attributes), (size_t) expected_bits);
Gilles Peskine449bd832023-01-11 14:50:10 +01001632 TEST_EQUAL(psa_get_key_lifetime(&attributes),
1633 PSA_KEY_LIFETIME_VOLATILE);
Gilles Peskine85f47c92019-12-18 20:44:15 +01001634
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001635 memset(hash, 0x2a, sizeof(hash));
1636 memset(sig, 0, sizeof(sig));
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001637
Gilles Peskine449bd832023-01-11 14:50:10 +01001638 TEST_ASSERT(mbedtls_pk_sign(&pk, MBEDTLS_MD_SHA256,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001639 hash, sizeof(hash), sig, sizeof(sig), &sig_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01001640 NULL, NULL) == 0);
Valerio Settie7730772023-06-21 16:58:40 +02001641 /* Only opaque EC keys support verification. */
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001642 if (PSA_KEY_TYPE_IS_ECC_KEY_PAIR(psa_type)) {
Valerio Settie7730772023-06-21 16:58:40 +02001643 TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
1644 hash, sizeof(hash), sig, sig_len) == 0);
1645 }
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001646
Hanno Becker56104ea2019-02-01 11:48:19 +00001647 /* Export underlying public key for re-importing in a psa context. */
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001648#if defined(MBEDTLS_PK_WRITE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01001649 ret = mbedtls_pk_write_pubkey_der(&pk, pkey_psa,
1650 sizeof(pkey_psa));
1651 TEST_ASSERT(ret >= 0);
Hanno Becker56104ea2019-02-01 11:48:19 +00001652 klen_psa = (size_t) ret;
1653 /* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001654 pkey_psa_start = pkey_psa + sizeof(pkey_psa) - klen_psa;
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001655#else
1656 psa_status_t status;
1657
1658 status = psa_export_public_key(key_id, pkey_psa, sizeof(pkey_psa),
Valerio Setti683a4322023-02-08 09:52:40 +01001659 &klen_psa);
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001660 TEST_EQUAL(status, PSA_SUCCESS);
1661 pkey_psa_start = pkey_psa;
1662#endif /* MBEDTLS_PK_WRITE_C */
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001663
Gilles Peskine449bd832023-01-11 14:50:10 +01001664 TEST_ASSERT(klen_psa == klen_legacy);
1665 TEST_ASSERT(memcmp(pkey_psa_start, pkey_legacy_start, klen_psa) == 0);
Hanno Becker56104ea2019-02-01 11:48:19 +00001666
Gilles Peskine449bd832023-01-11 14:50:10 +01001667 mbedtls_pk_free(&pk);
1668 TEST_ASSERT(PSA_SUCCESS == psa_destroy_key(key_id));
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001669
Gilles Peskine449bd832023-01-11 14:50:10 +01001670 mbedtls_pk_init(&pk);
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001671
1672 /* If we used "pk_write" previously, then we go for a "pk_parse" here;
1673 * otherwise if we went for "ecp_point_write_binary" then we'll go
1674 * for a "ecp_point_read_binary" here. This allows to drop dependencies
1675 * on "PK_WRITE" and "PK_PARSE" if required */
1676#if defined(MBEDTLS_PK_WRITE_C) && defined(MBEDTLS_PK_PARSE_C)
1677 TEST_EQUAL(mbedtls_pk_parse_public_key(&pk, pkey_legacy_start,
Valerio Setti683a4322023-02-08 09:52:40 +01001678 klen_legacy), 0);
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001679#else
1680 TEST_EQUAL(mbedtls_pk_setup(&pk,
Valerio Setti683a4322023-02-08 09:52:40 +01001681 mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)), 0);
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001682 TEST_EQUAL(mbedtls_ecp_group_load(
Valerio Setti77a75682023-05-15 11:18:46 +02001683 &(mbedtls_pk_ec_rw(pk)->grp),
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001684 (mbedtls_ecp_group_id) curve_or_keybits), 0);
Valerio Setti77a75682023-05-15 11:18:46 +02001685 TEST_EQUAL(mbedtls_ecp_point_read_binary(&(mbedtls_pk_ec_ro(pk)->grp),
1686 &(mbedtls_pk_ec_rw(pk)->Q),
Valerio Setti683a4322023-02-08 09:52:40 +01001687 pkey_legacy_start, klen_legacy), 0);
Valerio Settia1e3e3a2023-02-02 15:21:48 +01001688#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001689 TEST_ASSERT(mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
Dave Rodgman6dd757a2023-02-02 12:40:50 +00001690 hash, sizeof(hash), sig, sig_len) == 0);
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001691
1692exit:
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001693 /*
1694 * Key attributes may have been returned by psa_get_key_attributes()
1695 * thus reset them as required.
1696 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001697 psa_reset_key_attributes(&attributes);
Ronald Cron3a4f0e32020-11-19 17:55:23 +01001698
Gilles Peskine449bd832023-01-11 14:50:10 +01001699 mbedtls_pk_free(&pk);
1700 USE_PSA_DONE();
Manuel Pégourié-Gonnard36867712018-10-31 16:22:49 +01001701}
1702/* END_CASE */
Jerry Yu1f45b672022-03-12 19:24:50 +08001703
Tomi Fontanilles81746622023-07-16 13:06:06 +03001704/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001705void pk_sign_ext(int pk_type, int curve_or_keybits, int key_pk_type, int md_alg)
Jerry Yu1f45b672022-03-12 19:24:50 +08001706{
1707 mbedtls_pk_context pk;
1708 size_t sig_len;
1709 unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
Tomi Fontanilles81746622023-07-16 13:06:06 +03001710 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Manuel Pégourié-Gonnard9b41eb82023-03-28 11:14:24 +02001711 size_t hash_len = mbedtls_md_get_size_from_type(md_alg);
Jerry Yub3bfe9f2022-03-22 13:20:39 +08001712 void const *options = NULL;
Jerry Yub3bfe9f2022-03-22 13:20:39 +08001713 mbedtls_pk_rsassa_pss_options rsassa_pss_options;
Gilles Peskine449bd832023-01-11 14:50:10 +01001714 memset(hash, 0x2a, sizeof(hash));
1715 memset(sig, 0, sizeof(sig));
Jerry Yu1f45b672022-03-12 19:24:50 +08001716
Valerio Settib79f7db2023-04-19 14:25:52 +02001717 mbedtls_pk_init(&pk);
Tomi Fontanilles81746622023-07-16 13:06:06 +03001718 MD_OR_USE_PSA_INIT();
Jerry Yu1f45b672022-03-12 19:24:50 +08001719
Tomi Fontanilles81746622023-07-16 13:06:06 +03001720 TEST_EQUAL(mbedtls_pk_setup(&pk,
1721 mbedtls_pk_info_from_type(pk_type)), 0);
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001722 TEST_EQUAL(pk_genkey(&pk, curve_or_keybits), 0);
Jerry Yu1f45b672022-03-12 19:24:50 +08001723
Tomi Fontanilles81746622023-07-16 13:06:06 +03001724 TEST_EQUAL(mbedtls_pk_sign_ext(key_pk_type, &pk, md_alg, hash, hash_len,
1725 sig, sizeof(sig), &sig_len,
1726 mbedtls_test_rnd_std_rand, NULL), 0);
Jerry Yucef3f332022-03-22 23:00:13 +08001727
Gilles Peskine449bd832023-01-11 14:50:10 +01001728 if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
Jerry Yub3bfe9f2022-03-22 13:20:39 +08001729 rsassa_pss_options.mgf1_hash_id = md_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001730 TEST_ASSERT(hash_len != 0);
Manuel Pégourié-Gonnard6a0a1602022-07-05 12:09:04 +02001731 rsassa_pss_options.expected_salt_len = hash_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001732 options = (const void *) &rsassa_pss_options;
Jerry Yub3bfe9f2022-03-22 13:20:39 +08001733 }
Tomi Fontanilles81746622023-07-16 13:06:06 +03001734 TEST_EQUAL(mbedtls_pk_verify_ext(key_pk_type, options, &pk, md_alg,
1735 hash, hash_len, sig, sig_len), 0);
Jerry Yu1f45b672022-03-12 19:24:50 +08001736exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001737 mbedtls_pk_free(&pk);
Tomi Fontanilles81746622023-07-16 13:06:06 +03001738 MD_OR_USE_PSA_DONE();
Jerry Yu1f45b672022-03-12 19:24:50 +08001739}
1740/* END_CASE */
1741
Neil Armstrong999930e2022-04-12 15:12:43 +02001742/* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_GENPRIME:MBEDTLS_USE_PSA_CRYPTO */
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001743void pk_psa_wrap_sign_ext(int pk_type, int key_bits, int key_pk_type, int md_alg)
Neil Armstrong999930e2022-04-12 15:12:43 +02001744{
Neil Armstrong999930e2022-04-12 15:12:43 +02001745 mbedtls_pk_context pk;
1746 size_t sig_len, pkey_len;
1747 mbedtls_svc_key_id_t key_id;
1748 unsigned char sig[MBEDTLS_PK_SIGNATURE_MAX_SIZE];
Neil Armstrong843795a2022-04-21 12:23:28 +02001749 unsigned char pkey[PSA_EXPORT_PUBLIC_KEY_MAX_SIZE];
Neil Armstrong999930e2022-04-12 15:12:43 +02001750 unsigned char *pkey_start;
Manuel Pégourié-Gonnard043c8c52022-07-08 10:33:44 +02001751 unsigned char hash[PSA_HASH_MAX_SIZE];
Manuel Pégourié-Gonnard2d6d9932023-03-28 11:38:08 +02001752 psa_algorithm_t psa_md_alg = mbedtls_md_psa_alg_from_type(md_alg);
Neil Armstrong95974972022-04-22 13:57:44 +02001753 psa_algorithm_t psa_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001754 size_t hash_len = PSA_HASH_LENGTH(psa_md_alg);
Neil Armstrong999930e2022-04-12 15:12:43 +02001755 void const *options = NULL;
1756 mbedtls_pk_rsassa_pss_options rsassa_pss_options;
1757 int ret;
1758
Valerio Settib79f7db2023-04-19 14:25:52 +02001759 mbedtls_pk_init(&pk);
valerio32f2ac92023-04-20 11:59:52 +02001760 PSA_INIT();
Neil Armstrong999930e2022-04-12 15:12:43 +02001761
1762 /* Create legacy RSA public/private key in PK context. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001763 mbedtls_pk_init(&pk);
1764 TEST_EQUAL(mbedtls_pk_setup(&pk,
1765 mbedtls_pk_info_from_type(pk_type)), 0);
1766 TEST_EQUAL(mbedtls_rsa_gen_key(mbedtls_pk_rsa(pk),
1767 mbedtls_test_rnd_std_rand, NULL,
Tomi Fontanilles9c693482023-12-14 21:40:54 +02001768 key_bits, 3), 0);
Neil Armstrong999930e2022-04-12 15:12:43 +02001769
1770 /* Export underlying public key for re-importing in a legacy context. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001771 ret = mbedtls_pk_write_pubkey_der(&pk, pkey, sizeof(pkey));
1772 TEST_ASSERT(ret >= 0);
Neil Armstrong999930e2022-04-12 15:12:43 +02001773
1774 pkey_len = (size_t) ret;
1775 /* mbedtls_pk_write_pubkey_der() writes backwards in the data buffer. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001776 pkey_start = pkey + sizeof(pkey) - pkey_len;
Neil Armstrong999930e2022-04-12 15:12:43 +02001777
Gilles Peskine449bd832023-01-11 14:50:10 +01001778 if (key_pk_type == MBEDTLS_PK_RSA) {
1779 psa_alg = PSA_ALG_RSA_PKCS1V15_SIGN(psa_md_alg);
1780 } else if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
1781 psa_alg = PSA_ALG_RSA_PSS(psa_md_alg);
1782 } else {
1783 TEST_ASSUME(!"PK key type not supported in this configuration");
1784 }
Neil Armstrong95974972022-04-22 13:57:44 +02001785
Neil Armstrong999930e2022-04-12 15:12:43 +02001786 /* Turn PK context into an opaque one. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001787 TEST_EQUAL(mbedtls_pk_wrap_as_opaque(&pk, &key_id, psa_alg,
1788 PSA_KEY_USAGE_SIGN_HASH,
1789 PSA_ALG_NONE), 0);
Neil Armstrong999930e2022-04-12 15:12:43 +02001790
Gilles Peskine449bd832023-01-11 14:50:10 +01001791 memset(hash, 0x2a, sizeof(hash));
1792 memset(sig, 0, sizeof(sig));
Neil Armstrong999930e2022-04-12 15:12:43 +02001793
Gilles Peskine449bd832023-01-11 14:50:10 +01001794 TEST_EQUAL(mbedtls_pk_sign_ext(key_pk_type, &pk, md_alg, hash, hash_len,
1795 sig, sizeof(sig), &sig_len,
1796 mbedtls_test_rnd_std_rand, NULL), 0);
Neil Armstrong999930e2022-04-12 15:12:43 +02001797
Gilles Peskine449bd832023-01-11 14:50:10 +01001798 mbedtls_pk_free(&pk);
1799 TEST_EQUAL(PSA_SUCCESS, psa_destroy_key(key_id));
Neil Armstrong999930e2022-04-12 15:12:43 +02001800
Gilles Peskine449bd832023-01-11 14:50:10 +01001801 mbedtls_pk_init(&pk);
1802 TEST_EQUAL(mbedtls_pk_parse_public_key(&pk, pkey_start, pkey_len), 0);
Neil Armstrong999930e2022-04-12 15:12:43 +02001803
Gilles Peskine449bd832023-01-11 14:50:10 +01001804 if (key_pk_type == MBEDTLS_PK_RSASSA_PSS) {
Neil Armstrong999930e2022-04-12 15:12:43 +02001805 rsassa_pss_options.mgf1_hash_id = md_alg;
Gilles Peskine449bd832023-01-11 14:50:10 +01001806 TEST_ASSERT(hash_len != 0);
Manuel Pégourié-Gonnarde496c622022-07-05 13:11:13 +02001807 rsassa_pss_options.expected_salt_len = hash_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001808 options = (const void *) &rsassa_pss_options;
Neil Armstrong999930e2022-04-12 15:12:43 +02001809 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001810 TEST_EQUAL(mbedtls_pk_verify_ext(key_pk_type, options, &pk, md_alg,
1811 hash, hash_len, sig, sig_len), 0);
Neil Armstrong999930e2022-04-12 15:12:43 +02001812
1813exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001814 mbedtls_pk_free(&pk);
1815 PSA_DONE();
Neil Armstrong999930e2022-04-12 15:12:43 +02001816}
1817/* END_CASE */
Gilles Peskine0b172552024-01-18 14:11:26 +01001818
1819/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
Gilles Peskine6ea18362024-01-18 14:16:27 +01001820void pk_get_psa_attributes(int pk_type, int from_pair,
1821 int usage_arg,
1822 int to_pair, int expected_alg)
1823{
1824 mbedtls_pk_context pk;
1825 mbedtls_pk_init(&pk);
1826 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1827 psa_key_usage_t usage = usage_arg;
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001828 mbedtls_svc_key_id_t new_key_id = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine6ea18362024-01-18 14:16:27 +01001829
Gilles Peskine3da3c0a2024-01-30 10:22:29 +01001830 PSA_INIT();
Gilles Peskine6ea18362024-01-18 14:16:27 +01001831
1832 psa_key_type_t expected_psa_type = 0;
Gilles Peskine03aa9bc2024-01-30 11:08:44 +01001833 TEST_EQUAL(pk_setup_for_type(pk_type, from_pair,
1834 &pk, &expected_psa_type), 0);
Gilles Peskine6ea18362024-01-18 14:16:27 +01001835 if (!to_pair) {
1836 expected_psa_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(expected_psa_type);
1837 }
1838
1839 psa_key_lifetime_t lifetime = PSA_KEY_LIFETIME_VOLATILE; //TODO: diversity
1840 mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT; //TODO: diversity
1841 psa_set_key_id(&attributes, key_id);
1842 psa_set_key_lifetime(&attributes, lifetime);
Gilles Peskine19411632024-02-01 20:42:28 +01001843 psa_set_key_enrollment_algorithm(&attributes, 42);
Gilles Peskine7e353ba2024-02-01 20:46:19 +01001844 psa_key_usage_t expected_usage = pk_get_psa_attributes_implied_usage(usage);
Gilles Peskine6ea18362024-01-18 14:16:27 +01001845
Gilles Peskineace7c772024-01-18 17:47:54 +01001846#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
1847 /* When the resulting algorithm is ECDSA, the compile-time configuration
1848 * can cause it to be either deterministic or randomized ECDSA.
1849 * Rather than have two near-identical sets of test data depending on
1850 * the configuration, always use randomized in the test data and
1851 * tweak the expected result here. */
1852 if (expected_alg == PSA_ALG_ECDSA(PSA_ALG_ANY_HASH)) {
1853 expected_alg = PSA_ALG_DETERMINISTIC_ECDSA(PSA_ALG_ANY_HASH);
1854 }
1855#endif
1856
Gilles Peskine6ea18362024-01-18 14:16:27 +01001857 TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, usage, &attributes), 0);
1858
1859 TEST_EQUAL(psa_get_key_lifetime(&attributes), lifetime);
1860 TEST_ASSERT(mbedtls_svc_key_id_equal(psa_get_key_id(&attributes),
1861 key_id));
1862 TEST_EQUAL(psa_get_key_type(&attributes), expected_psa_type);
1863 TEST_EQUAL(psa_get_key_bits(&attributes),
1864 mbedtls_pk_get_bitlen(&pk));
1865 TEST_EQUAL(psa_get_key_usage_flags(&attributes), expected_usage);
1866 TEST_EQUAL(psa_get_key_algorithm(&attributes), expected_alg);
1867 TEST_EQUAL(psa_get_key_enrollment_algorithm(&attributes), PSA_ALG_NONE);
1868
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001869 TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &new_key_id), 0);
1870
Gilles Peskine6ea18362024-01-18 14:16:27 +01001871exit:
1872 mbedtls_pk_free(&pk);
1873 psa_reset_key_attributes(&attributes);
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001874 psa_destroy_key(new_key_id);
Gilles Peskine3da3c0a2024-01-30 10:22:29 +01001875 PSA_DONE();
Gilles Peskine6ea18362024-01-18 14:16:27 +01001876}
1877/* END_CASE */
1878
Gilles Peskine77faddf2024-01-24 10:50:17 +01001879/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:MBEDTLS_RSA_C:MBEDTLS_PKCS1_V21:MBEDTLS_GENPRIME */
Gilles Peskine6ea18362024-01-18 14:16:27 +01001880void pk_rsa_v21_get_psa_attributes(int md_type, int from_pair,
1881 int usage_arg,
1882 int to_pair, int expected_alg)
1883{
1884 mbedtls_pk_context pk;
1885 mbedtls_pk_init(&pk);
1886 psa_key_usage_t usage = usage_arg;
1887 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001888 mbedtls_svc_key_id_t new_key_id = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine6ea18362024-01-18 14:16:27 +01001889
Gilles Peskine3da3c0a2024-01-30 10:22:29 +01001890 PSA_INIT();
Gilles Peskine6ea18362024-01-18 14:16:27 +01001891
1892 psa_key_type_t expected_psa_type = 0;
Gilles Peskine03aa9bc2024-01-30 11:08:44 +01001893 TEST_EQUAL(pk_setup_for_type(MBEDTLS_PK_RSA, from_pair,
1894 &pk, &expected_psa_type), 0);
Gilles Peskine6ea18362024-01-18 14:16:27 +01001895 mbedtls_rsa_context *rsa = mbedtls_pk_rsa(pk);
1896 TEST_EQUAL(mbedtls_rsa_set_padding(rsa, MBEDTLS_RSA_PKCS_V21, md_type), 0);
1897 if (!to_pair) {
1898 expected_psa_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(expected_psa_type);
1899 }
Gilles Peskine7e353ba2024-02-01 20:46:19 +01001900 psa_key_usage_t expected_usage = pk_get_psa_attributes_implied_usage(usage);
Gilles Peskine6ea18362024-01-18 14:16:27 +01001901
1902 TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, usage, &attributes), 0);
1903
1904 TEST_EQUAL(psa_get_key_lifetime(&attributes), PSA_KEY_LIFETIME_VOLATILE);
1905 TEST_ASSERT(mbedtls_svc_key_id_equal(psa_get_key_id(&attributes),
1906 MBEDTLS_SVC_KEY_ID_INIT));
1907 TEST_EQUAL(psa_get_key_type(&attributes), expected_psa_type);
1908 TEST_EQUAL(psa_get_key_bits(&attributes),
1909 mbedtls_pk_get_bitlen(&pk));
1910 TEST_EQUAL(psa_get_key_usage_flags(&attributes), expected_usage);
1911 TEST_EQUAL(psa_get_key_algorithm(&attributes), expected_alg);
1912 TEST_EQUAL(psa_get_key_enrollment_algorithm(&attributes), PSA_ALG_NONE);
1913
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001914 TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &new_key_id), 0);
1915
Gilles Peskine6ea18362024-01-18 14:16:27 +01001916exit:
1917 mbedtls_pk_free(&pk);
1918 psa_reset_key_attributes(&attributes);
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001919 psa_destroy_key(new_key_id);
Gilles Peskine3da3c0a2024-01-30 10:22:29 +01001920 PSA_DONE();
Gilles Peskine6ea18362024-01-18 14:16:27 +01001921}
1922/* END_CASE */
1923
1924/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
Gilles Peskine0b172552024-01-18 14:11:26 +01001925void pk_get_psa_attributes_fail(int pk_type, int from_pair,
1926 int usage_arg,
1927 int expected_ret)
1928{
1929 mbedtls_pk_context pk;
1930 mbedtls_pk_init(&pk);
1931 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1932 psa_key_usage_t usage = usage_arg;
1933
Gilles Peskine3da3c0a2024-01-30 10:22:29 +01001934 PSA_INIT();
Gilles Peskine0b172552024-01-18 14:11:26 +01001935
1936 psa_key_type_t expected_psa_type;
Gilles Peskine03aa9bc2024-01-30 11:08:44 +01001937 TEST_EQUAL(pk_setup_for_type(pk_type, from_pair,
1938 &pk, &expected_psa_type), 0);
Gilles Peskine0b172552024-01-18 14:11:26 +01001939
1940 TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, usage, &attributes),
1941 expected_ret);
1942
1943exit:
1944 mbedtls_pk_free(&pk);
1945 psa_reset_key_attributes(&attributes);
Gilles Peskine3da3c0a2024-01-30 10:22:29 +01001946 PSA_DONE();
Gilles Peskine0b172552024-01-18 14:11:26 +01001947}
1948/* END_CASE */
Gilles Peskine758d8c72024-01-22 20:53:21 +01001949
1950/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskinee45d51f2024-02-01 20:53:11 +01001951void pk_get_psa_attributes_opaque(int from_type_arg, int from_bits_arg,
1952 int from_usage_arg, int from_alg_arg,
Gilles Peskine758d8c72024-01-22 20:53:21 +01001953 int usage_arg,
1954 int expected_ret,
1955 int to_pair, int expected_usage_arg)
1956{
1957 mbedtls_pk_context pk;
1958 mbedtls_pk_init(&pk);
1959 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001960 mbedtls_svc_key_id_t old_key_id = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskinee45d51f2024-02-01 20:53:11 +01001961 psa_key_type_t from_type = from_type_arg;
1962 size_t bits = from_bits_arg;
1963 psa_key_usage_t from_usage = from_usage_arg;
1964 psa_algorithm_t alg = from_alg_arg;
Gilles Peskine758d8c72024-01-22 20:53:21 +01001965 psa_key_usage_t usage = usage_arg;
1966 psa_key_usage_t expected_usage = expected_usage_arg;
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001967 mbedtls_svc_key_id_t new_key_id = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine758d8c72024-01-22 20:53:21 +01001968
Gilles Peskinee2a77f22024-02-01 20:50:24 +01001969 PSA_INIT();
Gilles Peskine758d8c72024-01-22 20:53:21 +01001970
Gilles Peskinee45d51f2024-02-01 20:53:11 +01001971 psa_set_key_type(&attributes, from_type);
Gilles Peskine758d8c72024-01-22 20:53:21 +01001972 psa_set_key_bits(&attributes, bits);
Gilles Peskinee45d51f2024-02-01 20:53:11 +01001973 psa_set_key_usage_flags(&attributes, from_usage);
Gilles Peskine758d8c72024-01-22 20:53:21 +01001974 psa_set_key_algorithm(&attributes, alg);
1975 psa_set_key_enrollment_algorithm(&attributes, 42);
1976 //TODO: test with persistent key
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001977 PSA_ASSERT(psa_generate_key(&attributes, &old_key_id));
1978 TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, old_key_id), 0);
Gilles Peskine758d8c72024-01-22 20:53:21 +01001979
1980 psa_key_type_t expected_psa_type =
Gilles Peskinee45d51f2024-02-01 20:53:11 +01001981 to_pair ? from_type : PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(from_type);
Gilles Peskine758d8c72024-01-22 20:53:21 +01001982
1983 TEST_EQUAL(mbedtls_pk_get_psa_attributes(&pk, usage, &attributes),
1984 expected_ret);
1985
1986 if (expected_ret == 0) {
1987 TEST_EQUAL(psa_get_key_lifetime(&attributes), PSA_KEY_LIFETIME_VOLATILE);
1988 TEST_ASSERT(mbedtls_svc_key_id_equal(psa_get_key_id(&attributes),
1989 MBEDTLS_SVC_KEY_ID_INIT));
1990 TEST_EQUAL(psa_get_key_type(&attributes), expected_psa_type);
1991 TEST_EQUAL(psa_get_key_bits(&attributes), bits);
1992 TEST_EQUAL(psa_get_key_usage_flags(&attributes), expected_usage);
1993 TEST_EQUAL(psa_get_key_algorithm(&attributes), alg);
1994 TEST_EQUAL(psa_get_key_enrollment_algorithm(&attributes), PSA_ALG_NONE);
Gilles Peskinefc3d8662024-02-09 19:26:37 +01001995
1996 int expected_import_ret = 0;
1997 if (to_pair &&
1998 !(from_usage & (PSA_KEY_USAGE_COPY | PSA_KEY_USAGE_EXPORT))) {
1999 expected_import_ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
2000 }
2001 TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &new_key_id),
2002 expected_import_ret);
Gilles Peskine758d8c72024-01-22 20:53:21 +01002003 }
2004
2005exit:
2006 mbedtls_pk_free(&pk);
Gilles Peskinefc3d8662024-02-09 19:26:37 +01002007 psa_destroy_key(old_key_id);
2008 psa_destroy_key(new_key_id);
Gilles Peskine758d8c72024-01-22 20:53:21 +01002009 psa_reset_key_attributes(&attributes);
Gilles Peskinee2a77f22024-02-01 20:50:24 +01002010 PSA_DONE();
Gilles Peskine758d8c72024-01-22 20:53:21 +01002011}
2012/* END_CASE */
Gilles Peskinefc3d8662024-02-09 19:26:37 +01002013
2014/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
2015void pk_import_into_psa_fail(int pk_type, int from_pair,
2016 int type_arg,
2017 int expected_ret)
2018{
2019 mbedtls_pk_context pk;
2020 mbedtls_pk_init(&pk);
2021 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
2022 psa_key_type_t type = type_arg;
2023 mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make(0, 42);
2024
2025 PSA_INIT();
2026
2027 psa_key_type_t expected_psa_type;
2028 TEST_EQUAL(pk_setup_for_type(pk_type, from_pair,
2029 &pk, &expected_psa_type), 0);
2030
2031 psa_set_key_type(&attributes, type);
2032
2033 TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &attributes, &key_id),
2034 expected_ret);
2035 TEST_ASSERT(mbedtls_svc_key_id_equal(key_id, MBEDTLS_SVC_KEY_ID_INIT));
2036
2037exit:
2038 psa_destroy_key(key_id);
2039 mbedtls_pk_free(&pk);
2040 psa_reset_key_attributes(&attributes);
2041 PSA_DONE();
2042}
2043/* END_CASE */
2044
2045/* BEGIN_CASE depends_on:MBEDTLS_USE_PSA_CRYPTO */
2046void pk_import_into_psa_opaque(int from_type, int from_bits,
2047 int from_usage, int from_alg,
2048 int to_type, int to_bits,
2049 int to_usage, int to_alg,
2050 int expected_ret)
2051{
2052 mbedtls_pk_context pk;
2053 mbedtls_pk_init(&pk);
2054 psa_key_attributes_t from_attributes = PSA_KEY_ATTRIBUTES_INIT;
2055 mbedtls_svc_key_id_t from_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2056 psa_key_attributes_t to_attributes = PSA_KEY_ATTRIBUTES_INIT;
2057 mbedtls_svc_key_id_t to_key_id = MBEDTLS_SVC_KEY_ID_INIT;
2058 psa_key_attributes_t actual_attributes = PSA_KEY_ATTRIBUTES_INIT;
2059
2060 PSA_INIT();
2061
2062 psa_set_key_type(&from_attributes, from_type);
2063 psa_set_key_bits(&from_attributes, from_bits);
2064 psa_set_key_usage_flags(&from_attributes, from_usage);
2065 psa_set_key_algorithm(&from_attributes, from_alg);
2066 PSA_ASSERT(psa_generate_key(&from_attributes, &from_key_id));
2067 TEST_EQUAL(mbedtls_pk_setup_opaque(&pk, from_key_id), 0);
2068
2069 psa_set_key_type(&to_attributes, to_type);
2070 psa_set_key_bits(&to_attributes, to_bits);
2071 psa_set_key_usage_flags(&to_attributes, to_usage);
2072 psa_set_key_algorithm(&to_attributes, to_alg);
2073
2074 TEST_EQUAL(mbedtls_pk_import_into_psa(&pk, &to_attributes, &to_key_id),
2075 expected_ret);
2076
2077 if (expected_ret == 0) {
2078 PSA_ASSERT(psa_get_key_attributes(to_key_id, &actual_attributes));
2079 TEST_EQUAL(to_type, psa_get_key_type(&actual_attributes));
2080 if (to_bits != 0) {
2081 TEST_EQUAL(to_bits, psa_get_key_bits(&actual_attributes));
2082 }
2083 TEST_EQUAL(to_alg, psa_get_key_algorithm(&actual_attributes));
2084 psa_key_usage_t expected_usage = to_usage;
2085 if (expected_usage & PSA_KEY_USAGE_SIGN_HASH) {
2086 expected_usage |= PSA_KEY_USAGE_SIGN_MESSAGE;
2087 }
2088 if (expected_usage & PSA_KEY_USAGE_VERIFY_HASH) {
2089 expected_usage |= PSA_KEY_USAGE_VERIFY_MESSAGE;
2090 }
2091 TEST_EQUAL(expected_usage, psa_get_key_usage_flags(&actual_attributes));
2092 } else {
2093 TEST_ASSERT(mbedtls_svc_key_id_equal(to_key_id, MBEDTLS_SVC_KEY_ID_INIT));
2094 }
2095
2096exit:
2097 mbedtls_pk_free(&pk);
2098 psa_destroy_key(from_key_id);
2099 psa_destroy_key(to_key_id);
2100 psa_reset_key_attributes(&from_attributes);
2101 psa_reset_key_attributes(&to_attributes);
2102 psa_reset_key_attributes(&actual_attributes);
2103 PSA_DONE();
2104}
2105/* END_CASE */