test_suite_pk.function 52 KB

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