test_suite_psa_crypto_metadata.function 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. /* BEGIN_HEADER */
  2. /* Test macros that provide metadata about algorithms and key types.
  3. * This test suite only contains tests that don't require executing
  4. * code. Other test suites validate macros that require creating a key
  5. * and using it. */
  6. #if defined(MBEDTLS_PSA_CRYPTO_SPM)
  7. #include "spm/psa_defs.h"
  8. #endif
  9. #include "psa/crypto.h"
  10. #include "psa_crypto_invasive.h"
  11. /* Flags for algorithm classification macros. There is a flag for every
  12. * algorithm classification macro PSA_ALG_IS_xxx except for the
  13. * category test macros, which are hard-coded in each
  14. * category-specific function. The name of the flag is the name of the
  15. * classification macro without the PSA_ prefix. */
  16. #define ALG_IS_VENDOR_DEFINED (1u << 0)
  17. #define ALG_IS_HMAC (1u << 1)
  18. #define ALG_IS_BLOCK_CIPHER_MAC (1u << 2)
  19. #define ALG_IS_STREAM_CIPHER (1u << 3)
  20. #define ALG_IS_RSA_PKCS1V15_SIGN (1u << 4)
  21. #define ALG_IS_RSA_PSS (1u << 5)
  22. #define ALG_IS_RSA_PSS_ANY_SALT (1u << 6)
  23. #define ALG_IS_RSA_PSS_STANDARD_SALT (1u << 7)
  24. #define ALG_IS_DSA (1u << 8)
  25. #define ALG_DSA_IS_DETERMINISTIC (1u << 9)
  26. #define ALG_IS_DETERMINISTIC_DSA (1u << 10)
  27. #define ALG_IS_RANDOMIZED_DSA (1u << 11)
  28. #define ALG_IS_ECDSA (1u << 12)
  29. #define ALG_ECDSA_IS_DETERMINISTIC (1u << 13)
  30. #define ALG_IS_DETERMINISTIC_ECDSA (1u << 14)
  31. #define ALG_IS_RANDOMIZED_ECDSA (1u << 15)
  32. #define ALG_IS_HASH_EDDSA (1u << 16)
  33. #define ALG_IS_SIGN_HASH (1u << 17)
  34. #define ALG_IS_HASH_AND_SIGN (1u << 18)
  35. #define ALG_IS_RSA_OAEP (1u << 19)
  36. #define ALG_IS_HKDF (1u << 20)
  37. #define ALG_IS_HKDF_EXTRACT (1u << 21)
  38. #define ALG_IS_HKDF_EXPAND (1u << 22)
  39. #define ALG_IS_FFDH (1u << 23)
  40. #define ALG_IS_ECDH (1u << 24)
  41. #define ALG_IS_WILDCARD (1u << 25)
  42. #define ALG_IS_RAW_KEY_AGREEMENT (1u << 26)
  43. #define ALG_IS_AEAD_ON_BLOCK_CIPHER (1u << 27)
  44. #define ALG_IS_TLS12_PRF (1u << 28)
  45. #define ALG_IS_TLS12_PSK_TO_MS (1u << 29)
  46. #define ALG_FLAG_MASK_PLUS_ONE (1u << 30) /* must be last! */
  47. /* Flags for key type classification macros. There is a flag for every
  48. * key type classification macro PSA_KEY_TYPE_IS_xxx except for some that
  49. * are tested as derived from other macros. The name of the flag is
  50. * the name of the classification macro without the PSA_ prefix. */
  51. #define KEY_TYPE_IS_VENDOR_DEFINED (1u << 0)
  52. #define KEY_TYPE_IS_UNSTRUCTURED (1u << 1)
  53. #define KEY_TYPE_IS_PUBLIC_KEY (1u << 2)
  54. #define KEY_TYPE_IS_KEY_PAIR (1u << 3)
  55. #define KEY_TYPE_IS_RSA (1u << 4)
  56. #define KEY_TYPE_IS_DSA (1u << 5)
  57. #define KEY_TYPE_IS_ECC (1u << 6)
  58. #define KEY_TYPE_IS_DH (1u << 7)
  59. #define KEY_TYPE_FLAG_MASK_PLUS_ONE (1u << 8) /* must be last! */
  60. /* Flags for lifetime classification macros. There is a flag for every
  61. * lifetime classification macro PSA_KEY_LIFETIME_IS_xxx. The name of the
  62. * flag is the name of the classification macro without the PSA_ prefix. */
  63. #define KEY_LIFETIME_IS_VOLATILE (1u << 0)
  64. #define KEY_LIFETIME_IS_READ_ONLY (1u << 1)
  65. #define KEY_LIFETIME_FLAG_MASK_PLUS_ONE (1u << 2) /* must be last! */
  66. /* Check that in the value of flags, the bit flag (which should be a macro
  67. * expanding to a number of the form 1 << k) is set if and only if
  68. * PSA_##flag(alg) is true.
  69. *
  70. * Only perform this check if cond is true. Typically cond is 1, but it can
  71. * be different if the value of the flag bit is only specified under specific
  72. * conditions.
  73. *
  74. * Unconditionally mask flag into the ambient variable
  75. * classification_flags_tested.
  76. */
  77. #define TEST_CLASSIFICATION_MACRO(cond, flag, alg, flags) \
  78. do \
  79. { \
  80. if (cond) \
  81. { \
  82. if ((flags) & (flag)) \
  83. TEST_ASSERT(PSA_##flag(alg)); \
  84. else \
  85. TEST_ASSERT(!PSA_##flag(alg)); \
  86. } \
  87. classification_flags_tested |= (flag); \
  88. } \
  89. while (0)
  90. /* Check the parity of value.
  91. *
  92. * There are several numerical encodings for which the PSA Cryptography API
  93. * specification deliberately defines encodings that all have the same
  94. * parity. This way, a data glitch that flips one bit in the data cannot
  95. * possibly turn a valid encoding into another valid encoding. Here in
  96. * the tests, we check that the values (including Mbed TLS vendor-specific
  97. * values) have the expected parity.
  98. *
  99. * The expected parity is even so that 0 is considered a valid encoding.
  100. *
  101. * Return a nonzero value if value has even parity and 0 otherwise. */
  102. int has_even_parity(uint32_t value)
  103. {
  104. value ^= value >> 16;
  105. value ^= value >> 8;
  106. value ^= value >> 4;
  107. return 0x9669 & 1 << (value & 0xf);
  108. }
  109. #define TEST_PARITY(value) \
  110. TEST_ASSERT(has_even_parity(value))
  111. void algorithm_classification(psa_algorithm_t alg, unsigned flags)
  112. {
  113. unsigned classification_flags_tested = 0;
  114. TEST_CLASSIFICATION_MACRO(1, ALG_IS_VENDOR_DEFINED, alg, flags);
  115. TEST_CLASSIFICATION_MACRO(1, ALG_IS_HMAC, alg, flags);
  116. TEST_CLASSIFICATION_MACRO(1, ALG_IS_BLOCK_CIPHER_MAC, alg, flags);
  117. TEST_CLASSIFICATION_MACRO(1, ALG_IS_STREAM_CIPHER, alg, flags);
  118. TEST_CLASSIFICATION_MACRO(1, ALG_IS_RSA_PKCS1V15_SIGN, alg, flags);
  119. TEST_CLASSIFICATION_MACRO(1, ALG_IS_RSA_PSS, alg, flags);
  120. TEST_CLASSIFICATION_MACRO(1, ALG_IS_RSA_PSS_ANY_SALT, alg, flags);
  121. TEST_CLASSIFICATION_MACRO(1, ALG_IS_RSA_PSS_STANDARD_SALT, alg, flags);
  122. TEST_CLASSIFICATION_MACRO(1, ALG_IS_DSA, alg, flags);
  123. TEST_CLASSIFICATION_MACRO(PSA_ALG_IS_DSA(alg),
  124. ALG_DSA_IS_DETERMINISTIC, alg, flags);
  125. TEST_CLASSIFICATION_MACRO(1, ALG_IS_DETERMINISTIC_DSA, alg, flags);
  126. TEST_CLASSIFICATION_MACRO(1, ALG_IS_RANDOMIZED_DSA, alg, flags);
  127. TEST_CLASSIFICATION_MACRO(1, ALG_IS_ECDSA, alg, flags);
  128. TEST_CLASSIFICATION_MACRO(PSA_ALG_IS_ECDSA(alg),
  129. ALG_ECDSA_IS_DETERMINISTIC, alg, flags);
  130. TEST_CLASSIFICATION_MACRO(1, ALG_IS_DETERMINISTIC_ECDSA, alg, flags);
  131. TEST_CLASSIFICATION_MACRO(1, ALG_IS_RANDOMIZED_ECDSA, alg, flags);
  132. TEST_CLASSIFICATION_MACRO(1, ALG_IS_HASH_EDDSA, alg, flags);
  133. TEST_CLASSIFICATION_MACRO(1, ALG_IS_SIGN_HASH, alg, flags);
  134. TEST_CLASSIFICATION_MACRO(1, ALG_IS_HASH_AND_SIGN, alg, flags);
  135. TEST_CLASSIFICATION_MACRO(1, ALG_IS_RSA_OAEP, alg, flags);
  136. TEST_CLASSIFICATION_MACRO(1, ALG_IS_HKDF, alg, flags);
  137. TEST_CLASSIFICATION_MACRO(1, ALG_IS_HKDF_EXTRACT, alg, flags);
  138. TEST_CLASSIFICATION_MACRO(1, ALG_IS_HKDF_EXPAND, alg, flags);
  139. TEST_CLASSIFICATION_MACRO(1, ALG_IS_WILDCARD, alg, flags);
  140. TEST_CLASSIFICATION_MACRO(1, ALG_IS_ECDH, alg, flags);
  141. TEST_CLASSIFICATION_MACRO(1, ALG_IS_FFDH, alg, flags);
  142. TEST_CLASSIFICATION_MACRO(1, ALG_IS_RAW_KEY_AGREEMENT, alg, flags);
  143. TEST_CLASSIFICATION_MACRO(1, ALG_IS_AEAD_ON_BLOCK_CIPHER, alg, flags);
  144. TEST_CLASSIFICATION_MACRO(1, ALG_IS_TLS12_PRF, alg, flags);
  145. TEST_CLASSIFICATION_MACRO(1, ALG_IS_TLS12_PSK_TO_MS, alg, flags);
  146. TEST_EQUAL(classification_flags_tested, ALG_FLAG_MASK_PLUS_ONE - 1);
  147. exit:;
  148. }
  149. void key_type_classification(psa_key_type_t type, unsigned flags)
  150. {
  151. unsigned classification_flags_tested = 0;
  152. /* Macros tested based on the test case parameter */
  153. TEST_CLASSIFICATION_MACRO(1, KEY_TYPE_IS_VENDOR_DEFINED, type, flags);
  154. TEST_CLASSIFICATION_MACRO(1, KEY_TYPE_IS_UNSTRUCTURED, type, flags);
  155. TEST_CLASSIFICATION_MACRO(1, KEY_TYPE_IS_PUBLIC_KEY, type, flags);
  156. TEST_CLASSIFICATION_MACRO(1, KEY_TYPE_IS_KEY_PAIR, type, flags);
  157. TEST_CLASSIFICATION_MACRO(1, KEY_TYPE_IS_RSA, type, flags);
  158. TEST_CLASSIFICATION_MACRO(1, KEY_TYPE_IS_DSA, type, flags);
  159. TEST_CLASSIFICATION_MACRO(1, KEY_TYPE_IS_ECC, type, flags);
  160. TEST_CLASSIFICATION_MACRO(1, KEY_TYPE_IS_DH, type, flags);
  161. TEST_EQUAL(classification_flags_tested, KEY_TYPE_FLAG_MASK_PLUS_ONE - 1);
  162. /* Macros with derived semantics */
  163. TEST_EQUAL(PSA_KEY_TYPE_IS_ASYMMETRIC(type),
  164. (PSA_KEY_TYPE_IS_PUBLIC_KEY(type) ||
  165. PSA_KEY_TYPE_IS_KEY_PAIR(type)));
  166. TEST_EQUAL(PSA_KEY_TYPE_IS_ECC_KEY_PAIR(type),
  167. (PSA_KEY_TYPE_IS_ECC(type) &&
  168. PSA_KEY_TYPE_IS_KEY_PAIR(type)));
  169. TEST_EQUAL(PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY(type),
  170. (PSA_KEY_TYPE_IS_ECC(type) &&
  171. PSA_KEY_TYPE_IS_PUBLIC_KEY(type)));
  172. TEST_EQUAL(PSA_KEY_TYPE_IS_DH_KEY_PAIR(type),
  173. (PSA_KEY_TYPE_IS_DH(type) &&
  174. PSA_KEY_TYPE_IS_KEY_PAIR(type)));
  175. TEST_EQUAL(PSA_KEY_TYPE_IS_DH_PUBLIC_KEY(type),
  176. (PSA_KEY_TYPE_IS_DH(type) &&
  177. PSA_KEY_TYPE_IS_PUBLIC_KEY(type)));
  178. TEST_PARITY(type);
  179. exit:;
  180. }
  181. void mac_algorithm_core(psa_algorithm_t alg, int classification_flags,
  182. psa_key_type_t key_type, size_t key_bits,
  183. size_t length)
  184. {
  185. /* Algorithm classification */
  186. TEST_ASSERT(!PSA_ALG_IS_HASH(alg));
  187. TEST_ASSERT(PSA_ALG_IS_MAC(alg));
  188. TEST_ASSERT(!PSA_ALG_IS_CIPHER(alg));
  189. TEST_ASSERT(!PSA_ALG_IS_AEAD(alg));
  190. TEST_ASSERT(!PSA_ALG_IS_SIGN(alg));
  191. TEST_ASSERT(!PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg));
  192. TEST_ASSERT(!PSA_ALG_IS_KEY_AGREEMENT(alg));
  193. TEST_ASSERT(!PSA_ALG_IS_KEY_DERIVATION(alg));
  194. TEST_ASSERT(!PSA_ALG_IS_PAKE(alg));
  195. algorithm_classification(alg, classification_flags);
  196. /* Length */
  197. TEST_EQUAL(length, PSA_MAC_LENGTH(key_type, key_bits, alg));
  198. #if defined(MBEDTLS_TEST_HOOKS) && defined(MBEDTLS_PSA_CRYPTO_C)
  199. PSA_ASSERT(psa_mac_key_can_do(alg, key_type));
  200. #endif
  201. exit:;
  202. }
  203. void aead_algorithm_core(psa_algorithm_t alg, int classification_flags,
  204. psa_key_type_t key_type, size_t key_bits,
  205. size_t tag_length)
  206. {
  207. /* Algorithm classification */
  208. TEST_ASSERT(!PSA_ALG_IS_HASH(alg));
  209. TEST_ASSERT(!PSA_ALG_IS_MAC(alg));
  210. TEST_ASSERT(!PSA_ALG_IS_CIPHER(alg));
  211. TEST_ASSERT(PSA_ALG_IS_AEAD(alg));
  212. TEST_ASSERT(!PSA_ALG_IS_SIGN(alg));
  213. TEST_ASSERT(!PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg));
  214. TEST_ASSERT(!PSA_ALG_IS_KEY_AGREEMENT(alg));
  215. TEST_ASSERT(!PSA_ALG_IS_KEY_DERIVATION(alg));
  216. TEST_ASSERT(!PSA_ALG_IS_PAKE(alg));
  217. algorithm_classification(alg, classification_flags);
  218. /* Tag length */
  219. TEST_EQUAL(tag_length, PSA_AEAD_TAG_LENGTH(key_type, key_bits, alg));
  220. exit:;
  221. }
  222. /* END_HEADER */
  223. /* BEGIN_DEPENDENCIES
  224. * depends_on:MBEDTLS_PSA_CRYPTO_CLIENT
  225. * END_DEPENDENCIES
  226. */
  227. /* BEGIN_CASE */
  228. void hash_algorithm(int alg_arg, int length_arg)
  229. {
  230. psa_algorithm_t alg = alg_arg;
  231. size_t length = length_arg;
  232. psa_algorithm_t hmac_alg = PSA_ALG_HMAC(alg);
  233. psa_algorithm_t rsa_pkcs1v15_sign_alg = PSA_ALG_RSA_PKCS1V15_SIGN(alg);
  234. psa_algorithm_t rsa_pss_alg = PSA_ALG_RSA_PSS(alg);
  235. psa_algorithm_t dsa_alg = PSA_ALG_DSA(alg);
  236. psa_algorithm_t deterministic_dsa_alg = PSA_ALG_DETERMINISTIC_DSA(alg);
  237. psa_algorithm_t ecdsa_alg = PSA_ALG_ECDSA(alg);
  238. psa_algorithm_t deterministic_ecdsa_alg = PSA_ALG_DETERMINISTIC_ECDSA(alg);
  239. psa_algorithm_t rsa_oaep_alg = PSA_ALG_RSA_OAEP(alg);
  240. psa_algorithm_t hkdf_alg = PSA_ALG_HKDF(alg);
  241. /* Algorithm classification */
  242. TEST_ASSERT(PSA_ALG_IS_HASH(alg));
  243. TEST_ASSERT(!PSA_ALG_IS_MAC(alg));
  244. TEST_ASSERT(!PSA_ALG_IS_CIPHER(alg));
  245. TEST_ASSERT(!PSA_ALG_IS_AEAD(alg));
  246. TEST_ASSERT(!PSA_ALG_IS_SIGN(alg));
  247. TEST_ASSERT(!PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg));
  248. TEST_ASSERT(!PSA_ALG_IS_KEY_AGREEMENT(alg));
  249. TEST_ASSERT(!PSA_ALG_IS_KEY_DERIVATION(alg));
  250. TEST_ASSERT(!PSA_ALG_IS_PAKE(alg));
  251. algorithm_classification(alg, 0);
  252. /* Dependent algorithms */
  253. TEST_EQUAL(PSA_ALG_HMAC_GET_HASH(hmac_alg), alg);
  254. TEST_EQUAL(PSA_ALG_SIGN_GET_HASH(rsa_pkcs1v15_sign_alg), alg);
  255. TEST_EQUAL(PSA_ALG_SIGN_GET_HASH(rsa_pss_alg), alg);
  256. TEST_EQUAL(PSA_ALG_SIGN_GET_HASH(dsa_alg), alg);
  257. TEST_EQUAL(PSA_ALG_SIGN_GET_HASH(deterministic_dsa_alg), alg);
  258. TEST_EQUAL(PSA_ALG_SIGN_GET_HASH(ecdsa_alg), alg);
  259. TEST_EQUAL(PSA_ALG_SIGN_GET_HASH(deterministic_ecdsa_alg), alg);
  260. TEST_EQUAL(PSA_ALG_RSA_OAEP_GET_HASH(rsa_oaep_alg), alg);
  261. TEST_EQUAL(PSA_ALG_HKDF_GET_HASH(hkdf_alg), alg);
  262. /* Hash length */
  263. TEST_EQUAL(length, PSA_HASH_LENGTH(alg));
  264. TEST_ASSERT(length <= PSA_HASH_MAX_SIZE);
  265. }
  266. /* END_CASE */
  267. /* BEGIN_CASE */
  268. void mac_algorithm(int alg_arg, int classification_flags,
  269. int length_arg,
  270. int key_type_arg, int key_bits_arg)
  271. {
  272. psa_algorithm_t alg = alg_arg;
  273. size_t length = length_arg;
  274. size_t n;
  275. size_t key_type = key_type_arg;
  276. size_t key_bits = key_bits_arg;
  277. mac_algorithm_core(alg, classification_flags,
  278. key_type, key_bits, length);
  279. TEST_EQUAL(PSA_ALG_FULL_LENGTH_MAC(alg), alg);
  280. TEST_ASSERT(length <= PSA_MAC_MAX_SIZE);
  281. /* Truncated versions */
  282. for (n = 1; n <= length; n++) {
  283. psa_algorithm_t truncated_alg = PSA_ALG_TRUNCATED_MAC(alg, n);
  284. mac_algorithm_core(truncated_alg, classification_flags,
  285. key_type, key_bits, n);
  286. TEST_EQUAL(PSA_ALG_FULL_LENGTH_MAC(truncated_alg), alg);
  287. /* Check that calling PSA_ALG_TRUNCATED_MAC twice gives the length
  288. * of the outer truncation (even if the outer length is smaller than
  289. * the inner length). */
  290. TEST_EQUAL(PSA_ALG_TRUNCATED_MAC(truncated_alg, 1),
  291. PSA_ALG_TRUNCATED_MAC(alg, 1));
  292. TEST_EQUAL(PSA_ALG_TRUNCATED_MAC(truncated_alg, length - 1),
  293. PSA_ALG_TRUNCATED_MAC(alg, length - 1));
  294. TEST_EQUAL(PSA_ALG_TRUNCATED_MAC(truncated_alg, length),
  295. PSA_ALG_TRUNCATED_MAC(alg, length));
  296. /* Check that calling PSA_ALG_TRUNCATED_MAC on an algorithm
  297. * earlier constructed with PSA_ALG_AT_LEAST_THIS_LENGTH_MAC gives the
  298. * length of the outer truncation (even if the outer length is smaller
  299. * than the inner length). */
  300. TEST_EQUAL(PSA_ALG_TRUNCATED_MAC(
  301. PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(truncated_alg, n), 1),
  302. PSA_ALG_TRUNCATED_MAC(alg, 1));
  303. TEST_EQUAL(PSA_ALG_TRUNCATED_MAC(
  304. PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(truncated_alg, n), length - 1),
  305. PSA_ALG_TRUNCATED_MAC(alg, length - 1));
  306. TEST_EQUAL(PSA_ALG_TRUNCATED_MAC(
  307. PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(truncated_alg, n), length),
  308. PSA_ALG_TRUNCATED_MAC(alg, length));
  309. }
  310. /* At-leat-this-length versions */
  311. for (n = 1; n <= length; n++) {
  312. psa_algorithm_t policy_alg = PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(alg, n);
  313. mac_algorithm_core(policy_alg, classification_flags | ALG_IS_WILDCARD,
  314. key_type, key_bits, n);
  315. TEST_EQUAL(PSA_ALG_FULL_LENGTH_MAC(policy_alg), alg);
  316. /* Check that calling PSA_ALG_AT_LEAST_THIS_LENGTH_MAC twice gives the
  317. * length of the outer truncation (even if the outer length is smaller
  318. * than the inner length). */
  319. TEST_EQUAL(PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(policy_alg, 1),
  320. PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(alg, 1));
  321. TEST_EQUAL(PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(policy_alg, length - 1),
  322. PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(alg, length - 1));
  323. TEST_EQUAL(PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(policy_alg, length),
  324. PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(alg, length));
  325. /* Check that calling PSA_ALG_AT_LEAST_THIS_LENGTH_MAC on an algorithm
  326. * earlier constructed with PSA_ALG_TRUNCATED_MAC gives the length of
  327. * the outer truncation (even if the outer length is smaller than the
  328. * inner length). */
  329. TEST_EQUAL(PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(
  330. PSA_ALG_TRUNCATED_MAC(policy_alg, n), 1),
  331. PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(alg, 1));
  332. TEST_EQUAL(PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(
  333. PSA_ALG_TRUNCATED_MAC(policy_alg, n), length - 1),
  334. PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(alg, length - 1));
  335. TEST_EQUAL(PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(
  336. PSA_ALG_TRUNCATED_MAC(policy_alg, n), length),
  337. PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(alg, length));
  338. }
  339. }
  340. /* END_CASE */
  341. /* BEGIN_CASE */
  342. void hmac_algorithm(int alg_arg,
  343. int length_arg,
  344. int block_size_arg)
  345. {
  346. psa_algorithm_t alg = alg_arg;
  347. psa_algorithm_t hash_alg = PSA_ALG_HMAC_GET_HASH(alg);
  348. size_t block_size = block_size_arg;
  349. size_t length = length_arg;
  350. size_t n;
  351. TEST_ASSERT(PSA_ALG_IS_HASH(hash_alg));
  352. TEST_EQUAL(PSA_ALG_HMAC(hash_alg), alg);
  353. TEST_ASSERT(block_size == PSA_HASH_BLOCK_LENGTH(alg));
  354. TEST_ASSERT(block_size <= PSA_HMAC_MAX_HASH_BLOCK_SIZE);
  355. test_mac_algorithm(alg_arg, ALG_IS_HMAC, length,
  356. PSA_KEY_TYPE_HMAC, PSA_BYTES_TO_BITS(length));
  357. for (n = 1; n <= length; n++) {
  358. psa_algorithm_t truncated_alg = PSA_ALG_TRUNCATED_MAC(alg, n);
  359. TEST_EQUAL(PSA_ALG_HMAC_GET_HASH(truncated_alg), hash_alg);
  360. }
  361. }
  362. /* END_CASE */
  363. /* BEGIN_CASE */
  364. void cipher_algorithm(int alg_arg, int classification_flags)
  365. {
  366. psa_algorithm_t alg = alg_arg;
  367. /* Algorithm classification */
  368. TEST_ASSERT(!PSA_ALG_IS_HASH(alg));
  369. TEST_ASSERT(!PSA_ALG_IS_MAC(alg));
  370. TEST_ASSERT(PSA_ALG_IS_CIPHER(alg));
  371. TEST_ASSERT(!PSA_ALG_IS_AEAD(alg));
  372. TEST_ASSERT(!PSA_ALG_IS_SIGN(alg));
  373. TEST_ASSERT(!PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg));
  374. TEST_ASSERT(!PSA_ALG_IS_KEY_AGREEMENT(alg));
  375. TEST_ASSERT(!PSA_ALG_IS_KEY_DERIVATION(alg));
  376. TEST_ASSERT(!PSA_ALG_IS_PAKE(alg));
  377. algorithm_classification(alg, classification_flags);
  378. }
  379. /* END_CASE */
  380. /* BEGIN_CASE */
  381. void aead_algorithm(int alg_arg, int classification_flags,
  382. int tag_length_arg,
  383. int key_type_arg, int key_bits_arg)
  384. {
  385. psa_algorithm_t alg = alg_arg;
  386. size_t tag_length = tag_length_arg;
  387. size_t n;
  388. psa_key_type_t key_type = key_type_arg;
  389. size_t key_bits = key_bits_arg;
  390. aead_algorithm_core(alg, classification_flags,
  391. key_type, key_bits, tag_length);
  392. /* Truncated versions */
  393. for (n = 1; n <= tag_length; n++) {
  394. psa_algorithm_t truncated_alg = PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, n);
  395. aead_algorithm_core(truncated_alg, classification_flags,
  396. key_type, key_bits, n);
  397. TEST_EQUAL(PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(truncated_alg),
  398. alg);
  399. /* Check that calling PSA_ALG_AEAD_WITH_SHORTENED_TAG twice gives
  400. * the length of the outer truncation (even if the outer length is
  401. * smaller than the inner length). */
  402. TEST_EQUAL(PSA_ALG_AEAD_WITH_SHORTENED_TAG(truncated_alg, 1),
  403. PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, 1));
  404. TEST_EQUAL(PSA_ALG_AEAD_WITH_SHORTENED_TAG(truncated_alg, tag_length - 1),
  405. PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, tag_length - 1));
  406. TEST_EQUAL(PSA_ALG_AEAD_WITH_SHORTENED_TAG(truncated_alg, tag_length),
  407. PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, tag_length));
  408. /* Check that calling PSA_ALG_AEAD_WITH_SHORTENED_TAG on an algorithm
  409. * earlier constructed with PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG
  410. * gives the length of the outer truncation (even if the outer length is
  411. * smaller than the inner length). */
  412. TEST_EQUAL(PSA_ALG_AEAD_WITH_SHORTENED_TAG(
  413. PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(truncated_alg, n), 1),
  414. PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, 1));
  415. TEST_EQUAL(PSA_ALG_AEAD_WITH_SHORTENED_TAG(
  416. PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(truncated_alg,
  417. n), tag_length - 1),
  418. PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, tag_length - 1));
  419. TEST_EQUAL(PSA_ALG_AEAD_WITH_SHORTENED_TAG(
  420. PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(truncated_alg, n), tag_length),
  421. PSA_ALG_AEAD_WITH_SHORTENED_TAG(alg, tag_length));
  422. }
  423. /* At-leat-this-length versions */
  424. for (n = 1; n <= tag_length; n++) {
  425. psa_algorithm_t policy_alg = PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(alg, n);
  426. aead_algorithm_core(policy_alg, classification_flags | ALG_IS_WILDCARD,
  427. key_type, key_bits, n);
  428. TEST_EQUAL(PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(policy_alg),
  429. alg);
  430. /* Check that calling PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG twice
  431. * gives the length of the outer truncation (even if the outer length is
  432. * smaller than the inner length). */
  433. TEST_EQUAL(PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(policy_alg, 1),
  434. PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(alg, 1));
  435. TEST_EQUAL(PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(policy_alg, tag_length - 1),
  436. PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(alg, tag_length - 1));
  437. TEST_EQUAL(PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(policy_alg, tag_length),
  438. PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(alg, tag_length));
  439. /* Check that calling PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG on an
  440. * algorithm earlier constructed with PSA_ALG_AEAD_WITH_SHORTENED_TAG
  441. * gives the length of the outer truncation (even if the outer length is
  442. * smaller than the inner length). */
  443. TEST_EQUAL(PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(
  444. PSA_ALG_AEAD_WITH_SHORTENED_TAG(policy_alg, n), 1),
  445. PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(alg, 1));
  446. TEST_EQUAL(PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(
  447. PSA_ALG_AEAD_WITH_SHORTENED_TAG(policy_alg, n), tag_length - 1),
  448. PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(alg, tag_length - 1));
  449. TEST_EQUAL(PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(
  450. PSA_ALG_AEAD_WITH_SHORTENED_TAG(policy_alg, n), tag_length),
  451. PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(alg, tag_length));
  452. }
  453. }
  454. /* END_CASE */
  455. /* BEGIN_CASE */
  456. void asymmetric_signature_algorithm(int alg_arg, int classification_flags)
  457. {
  458. psa_algorithm_t alg = alg_arg;
  459. /* Algorithm classification */
  460. TEST_ASSERT(!PSA_ALG_IS_HASH(alg));
  461. TEST_ASSERT(!PSA_ALG_IS_MAC(alg));
  462. TEST_ASSERT(!PSA_ALG_IS_CIPHER(alg));
  463. TEST_ASSERT(!PSA_ALG_IS_AEAD(alg));
  464. TEST_ASSERT(PSA_ALG_IS_SIGN(alg));
  465. TEST_ASSERT(!PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg));
  466. TEST_ASSERT(!PSA_ALG_IS_KEY_AGREEMENT(alg));
  467. TEST_ASSERT(!PSA_ALG_IS_KEY_DERIVATION(alg));
  468. TEST_ASSERT(!PSA_ALG_IS_PAKE(alg));
  469. algorithm_classification(alg, classification_flags);
  470. }
  471. /* END_CASE */
  472. /* BEGIN_CASE */
  473. void asymmetric_signature_wildcard(int alg_arg, int classification_flags)
  474. {
  475. classification_flags |= ALG_IS_WILDCARD;
  476. classification_flags |= ALG_IS_SIGN_HASH;
  477. classification_flags |= ALG_IS_HASH_AND_SIGN;
  478. test_asymmetric_signature_algorithm(alg_arg, classification_flags);
  479. /* Any failure of this test function comes from
  480. * asymmetric_signature_algorithm. Pacify -Werror=unused-label. */
  481. goto exit;
  482. }
  483. /* END_CASE */
  484. /* BEGIN_CASE */
  485. void asymmetric_encryption_algorithm(int alg_arg, int classification_flags)
  486. {
  487. psa_algorithm_t alg = alg_arg;
  488. /* Algorithm classification */
  489. TEST_ASSERT(!PSA_ALG_IS_HASH(alg));
  490. TEST_ASSERT(!PSA_ALG_IS_MAC(alg));
  491. TEST_ASSERT(!PSA_ALG_IS_CIPHER(alg));
  492. TEST_ASSERT(!PSA_ALG_IS_AEAD(alg));
  493. TEST_ASSERT(!PSA_ALG_IS_SIGN(alg));
  494. TEST_ASSERT(PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg));
  495. TEST_ASSERT(!PSA_ALG_IS_KEY_AGREEMENT(alg));
  496. TEST_ASSERT(!PSA_ALG_IS_KEY_DERIVATION(alg));
  497. TEST_ASSERT(!PSA_ALG_IS_PAKE(alg));
  498. algorithm_classification(alg, classification_flags);
  499. }
  500. /* END_CASE */
  501. /* BEGIN_CASE */
  502. void key_derivation_algorithm(int alg_arg, int classification_flags)
  503. {
  504. psa_algorithm_t alg = alg_arg;
  505. psa_algorithm_t ecdh_alg = PSA_ALG_KEY_AGREEMENT(PSA_ALG_ECDH, alg);
  506. psa_algorithm_t ffdh_alg = PSA_ALG_KEY_AGREEMENT(PSA_ALG_FFDH, alg);
  507. /* Algorithm classification */
  508. TEST_ASSERT(!PSA_ALG_IS_HASH(alg));
  509. TEST_ASSERT(!PSA_ALG_IS_MAC(alg));
  510. TEST_ASSERT(!PSA_ALG_IS_CIPHER(alg));
  511. TEST_ASSERT(!PSA_ALG_IS_AEAD(alg));
  512. TEST_ASSERT(!PSA_ALG_IS_SIGN(alg));
  513. TEST_ASSERT(!PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg));
  514. TEST_ASSERT(!PSA_ALG_IS_KEY_AGREEMENT(alg));
  515. TEST_ASSERT(PSA_ALG_IS_KEY_DERIVATION(alg));
  516. TEST_ASSERT(!PSA_ALG_IS_PAKE(alg));
  517. algorithm_classification(alg, classification_flags);
  518. /* Check combinations with key agreements */
  519. TEST_ASSERT(PSA_ALG_IS_KEY_AGREEMENT(ecdh_alg));
  520. TEST_ASSERT(PSA_ALG_IS_KEY_AGREEMENT(ffdh_alg));
  521. TEST_EQUAL(PSA_ALG_KEY_AGREEMENT_GET_KDF(ecdh_alg), alg);
  522. TEST_EQUAL(PSA_ALG_KEY_AGREEMENT_GET_KDF(ffdh_alg), alg);
  523. }
  524. /* END_CASE */
  525. /* BEGIN_CASE */
  526. void key_agreement_algorithm(int alg_arg, int classification_flags,
  527. int ka_alg_arg, int kdf_alg_arg)
  528. {
  529. psa_algorithm_t alg = alg_arg;
  530. psa_algorithm_t actual_ka_alg = PSA_ALG_KEY_AGREEMENT_GET_BASE(alg);
  531. psa_algorithm_t expected_ka_alg = ka_alg_arg;
  532. psa_algorithm_t actual_kdf_alg = PSA_ALG_KEY_AGREEMENT_GET_KDF(alg);
  533. psa_algorithm_t expected_kdf_alg = kdf_alg_arg;
  534. /* Algorithm classification */
  535. TEST_ASSERT(!PSA_ALG_IS_HASH(alg));
  536. TEST_ASSERT(!PSA_ALG_IS_MAC(alg));
  537. TEST_ASSERT(!PSA_ALG_IS_CIPHER(alg));
  538. TEST_ASSERT(!PSA_ALG_IS_AEAD(alg));
  539. TEST_ASSERT(!PSA_ALG_IS_SIGN(alg));
  540. TEST_ASSERT(!PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg));
  541. TEST_ASSERT(PSA_ALG_IS_KEY_AGREEMENT(alg));
  542. TEST_ASSERT(!PSA_ALG_IS_KEY_DERIVATION(alg));
  543. TEST_ASSERT(!PSA_ALG_IS_PAKE(alg));
  544. algorithm_classification(alg, classification_flags);
  545. /* Shared secret derivation properties */
  546. TEST_EQUAL(actual_ka_alg, expected_ka_alg);
  547. TEST_EQUAL(actual_kdf_alg, expected_kdf_alg);
  548. }
  549. /* END_CASE */
  550. /* BEGIN_CASE */
  551. void pake_algorithm(int alg_arg)
  552. {
  553. psa_algorithm_t alg = alg_arg;
  554. /* Algorithm classification */
  555. TEST_ASSERT(!PSA_ALG_IS_HASH(alg));
  556. TEST_ASSERT(!PSA_ALG_IS_MAC(alg));
  557. TEST_ASSERT(!PSA_ALG_IS_CIPHER(alg));
  558. TEST_ASSERT(!PSA_ALG_IS_AEAD(alg));
  559. TEST_ASSERT(!PSA_ALG_IS_SIGN(alg));
  560. TEST_ASSERT(!PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg));
  561. TEST_ASSERT(!PSA_ALG_IS_KEY_AGREEMENT(alg));
  562. TEST_ASSERT(!PSA_ALG_IS_KEY_DERIVATION(alg));
  563. TEST_ASSERT(PSA_ALG_IS_PAKE(alg));
  564. }
  565. /* END_CASE */
  566. /* BEGIN_CASE */
  567. void key_type(int type_arg, int classification_flags)
  568. {
  569. psa_key_type_t type = type_arg;
  570. key_type_classification(type, classification_flags);
  571. /* For asymmetric types, check the corresponding pair/public type */
  572. if (classification_flags & KEY_TYPE_IS_PUBLIC_KEY) {
  573. psa_key_type_t pair_type = PSA_KEY_TYPE_KEY_PAIR_OF_PUBLIC_KEY(type);
  574. TEST_EQUAL(PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(pair_type), type);
  575. key_type_classification(pair_type,
  576. (classification_flags
  577. & ~KEY_TYPE_IS_PUBLIC_KEY)
  578. | KEY_TYPE_IS_KEY_PAIR);
  579. TEST_EQUAL(PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type), type);
  580. }
  581. if (classification_flags & KEY_TYPE_IS_KEY_PAIR) {
  582. psa_key_type_t public_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type);
  583. TEST_EQUAL(PSA_KEY_TYPE_KEY_PAIR_OF_PUBLIC_KEY(public_type), type);
  584. key_type_classification(public_type,
  585. (classification_flags
  586. & ~KEY_TYPE_IS_KEY_PAIR)
  587. | KEY_TYPE_IS_PUBLIC_KEY);
  588. TEST_EQUAL(PSA_KEY_TYPE_KEY_PAIR_OF_PUBLIC_KEY(type), type);
  589. }
  590. }
  591. /* END_CASE */
  592. /* BEGIN_CASE */
  593. void block_cipher_key_type(int type_arg, int block_size_arg)
  594. {
  595. psa_key_type_t type = type_arg;
  596. size_t block_size = block_size_arg;
  597. test_key_type(type_arg, KEY_TYPE_IS_UNSTRUCTURED);
  598. TEST_EQUAL(type & PSA_KEY_TYPE_CATEGORY_MASK,
  599. PSA_KEY_TYPE_CATEGORY_SYMMETRIC);
  600. TEST_EQUAL(PSA_BLOCK_CIPHER_BLOCK_LENGTH(type), block_size);
  601. /* Check that the block size is a power of 2. This is required, at least,
  602. for PSA_ROUND_UP_TO_MULTIPLE(block_size, length) in crypto_sizes.h. */
  603. TEST_ASSERT(((block_size - 1) & block_size) == 0);
  604. }
  605. /* END_CASE */
  606. /* BEGIN_CASE */
  607. void stream_cipher_key_type(int type_arg)
  608. {
  609. psa_key_type_t type = type_arg;
  610. test_key_type(type_arg, KEY_TYPE_IS_UNSTRUCTURED);
  611. TEST_EQUAL(type & PSA_KEY_TYPE_CATEGORY_MASK,
  612. PSA_KEY_TYPE_CATEGORY_SYMMETRIC);
  613. TEST_EQUAL(PSA_BLOCK_CIPHER_BLOCK_LENGTH(type), 1);
  614. }
  615. /* END_CASE */
  616. /* BEGIN_CASE depends_on:PSA_KEY_TYPE_ECC_PUBLIC_KEY:PSA_KEY_TYPE_ECC_KEY_PAIR */
  617. void ecc_key_family(int curve_arg)
  618. {
  619. psa_ecc_family_t curve = curve_arg;
  620. psa_key_type_t public_type = PSA_KEY_TYPE_ECC_PUBLIC_KEY(curve);
  621. psa_key_type_t pair_type = PSA_KEY_TYPE_ECC_KEY_PAIR(curve);
  622. TEST_PARITY(curve);
  623. test_key_type(public_type, KEY_TYPE_IS_ECC | KEY_TYPE_IS_PUBLIC_KEY);
  624. test_key_type(pair_type, KEY_TYPE_IS_ECC | KEY_TYPE_IS_KEY_PAIR);
  625. TEST_EQUAL(PSA_KEY_TYPE_ECC_GET_FAMILY(public_type), curve);
  626. TEST_EQUAL(PSA_KEY_TYPE_ECC_GET_FAMILY(pair_type), curve);
  627. }
  628. /* END_CASE */
  629. /* BEGIN_CASE depends_on:MBEDTLS_DHM_C */
  630. void dh_key_family(int group_arg)
  631. {
  632. psa_dh_family_t group = group_arg;
  633. psa_key_type_t public_type = PSA_KEY_TYPE_DH_PUBLIC_KEY(group);
  634. psa_key_type_t pair_type = PSA_KEY_TYPE_DH_KEY_PAIR(group);
  635. TEST_PARITY(group);
  636. test_key_type(public_type, KEY_TYPE_IS_DH | KEY_TYPE_IS_PUBLIC_KEY);
  637. test_key_type(pair_type, KEY_TYPE_IS_DH | KEY_TYPE_IS_KEY_PAIR);
  638. TEST_EQUAL(PSA_KEY_TYPE_DH_GET_FAMILY(public_type), group);
  639. TEST_EQUAL(PSA_KEY_TYPE_DH_GET_FAMILY(pair_type), group);
  640. }
  641. /* END_CASE */
  642. /* BEGIN_CASE */
  643. void lifetime(int lifetime_arg, int classification_flags,
  644. int persistence_arg, int location_arg)
  645. {
  646. psa_key_lifetime_t lifetime = lifetime_arg;
  647. psa_key_persistence_t persistence = persistence_arg;
  648. psa_key_location_t location = location_arg;
  649. unsigned flags = classification_flags;
  650. unsigned classification_flags_tested = 0;
  651. TEST_CLASSIFICATION_MACRO(1, KEY_LIFETIME_IS_VOLATILE, lifetime, flags);
  652. TEST_CLASSIFICATION_MACRO(1, KEY_LIFETIME_IS_READ_ONLY, lifetime, flags);
  653. TEST_EQUAL(classification_flags_tested,
  654. KEY_LIFETIME_FLAG_MASK_PLUS_ONE - 1);
  655. TEST_EQUAL(PSA_KEY_LIFETIME_GET_PERSISTENCE(lifetime), persistence);
  656. TEST_EQUAL(PSA_KEY_LIFETIME_GET_LOCATION(lifetime), location);
  657. }
  658. /* END_CASE */