test_tpm2_alg_util.c 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273
  1. /* SPDX-License-Identifier: BSD-3-Clause */
  2. #include <stdbool.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <setjmp.h>
  6. #include <cmocka.h>
  7. #include "tpm2_util.h"
  8. #include "tpm2_alg_util.h"
  9. #define xstr(s) str(s)
  10. #define str(s) #s
  11. #define single_item_test_get(friendly) \
  12. cmocka_unit_test(test_tpm2_alg_util_convert_##friendly)
  13. #define nv_single_item_test2(friendly, value, flags) \
  14. static void test_tpm2_alg_util_convert_##friendly(void **state) { \
  15. \
  16. (void)state; \
  17. \
  18. TPM2_ALG_ID found_id = tpm2_alg_util_strtoalg(str(friendly), flags); \
  19. const char *found_str = tpm2_alg_util_algtostr(value, flags); \
  20. char str_value[256]; \
  21. snprintf(str_value, sizeof(str_value), "0x%X", value); \
  22. TPM2_ALG_ID from_hex_str = tpm2_alg_util_from_optarg(str_value, flags); \
  23. TPM2_ALG_ID from_nice_str = tpm2_alg_util_from_optarg(str(friendly), flags); \
  24. \
  25. assert_ptr_not_equal(found_id, NULL); \
  26. assert_string_equal(str(friendly), found_str); \
  27. assert_int_equal(value, found_id); \
  28. assert_int_equal(value, from_hex_str); \
  29. assert_int_equal(value, from_nice_str); \
  30. }
  31. #define nv_single_item_test(friendly, value) nv_single_item_test2(friendly, value, tpm2_alg_util_flags_any)
  32. nv_single_item_test(rsa, TPM2_ALG_RSA)
  33. /*
  34. * sha sha1 is it's own test, as alg to string
  35. * can return either, based on the map ordering.
  36. *
  37. */
  38. nv_single_item_test(hmac, TPM2_ALG_HMAC)
  39. nv_single_item_test(aes, TPM2_ALG_AES)
  40. nv_single_item_test(mgf1, TPM2_ALG_MGF1)
  41. nv_single_item_test(keyedhash, TPM2_ALG_KEYEDHASH)
  42. nv_single_item_test(xor, TPM2_ALG_XOR)
  43. nv_single_item_test(sha256, TPM2_ALG_SHA256)
  44. nv_single_item_test(sha384, TPM2_ALG_SHA384)
  45. nv_single_item_test(sha512, TPM2_ALG_SHA512)
  46. nv_single_item_test(null, TPM2_ALG_NULL)
  47. nv_single_item_test(sm3_256, TPM2_ALG_SM3_256)
  48. nv_single_item_test(sm4, TPM2_ALG_SM4)
  49. nv_single_item_test(rsassa, TPM2_ALG_RSASSA)
  50. nv_single_item_test(rsaes, TPM2_ALG_RSAES)
  51. nv_single_item_test(rsapss, TPM2_ALG_RSAPSS)
  52. nv_single_item_test(oaep, TPM2_ALG_OAEP)
  53. nv_single_item_test(ecdsa, TPM2_ALG_ECDSA)
  54. nv_single_item_test(ecdh, TPM2_ALG_ECDH)
  55. nv_single_item_test(ecdaa, TPM2_ALG_ECDAA)
  56. nv_single_item_test(sm2, TPM2_ALG_SM2)
  57. nv_single_item_test(ecschnorr, TPM2_ALG_ECSCHNORR)
  58. nv_single_item_test(ecmqv, TPM2_ALG_ECMQV)
  59. nv_single_item_test(kdf1_sp800_56a, TPM2_ALG_KDF1_SP800_56A)
  60. nv_single_item_test(kdf2, TPM2_ALG_KDF2)
  61. nv_single_item_test(kdf1_sp800_108, TPM2_ALG_KDF1_SP800_108)
  62. nv_single_item_test(ecc, TPM2_ALG_ECC)
  63. nv_single_item_test(symcipher, TPM2_ALG_SYMCIPHER)
  64. nv_single_item_test(camellia, TPM2_ALG_CAMELLIA)
  65. nv_single_item_test(sha3_256, TPM2_ALG_SHA3_256)
  66. nv_single_item_test(sha3_384, TPM2_ALG_SHA3_384)
  67. nv_single_item_test(sha3_512, TPM2_ALG_SHA3_512)
  68. nv_single_item_test(ctr, TPM2_ALG_CTR)
  69. nv_single_item_test(ofb, TPM2_ALG_OFB)
  70. nv_single_item_test(cbc, TPM2_ALG_CBC)
  71. nv_single_item_test(cfb, TPM2_ALG_CFB)
  72. nv_single_item_test(ecb, TPM2_ALG_ECB)
  73. typedef struct find_unk_data find_unk_data;
  74. struct find_unk_data {
  75. TPM2_ALG_ID *ids;
  76. size_t len;
  77. };
  78. static void test_tpm2_alg_util_sha1_test(void **state) {
  79. (void) state;
  80. TPM2_ALG_ID sha1_found_id = tpm2_alg_util_strtoalg("sha1",
  81. tpm2_alg_util_flags_hash);
  82. const char *sha1_found_str = tpm2_alg_util_algtostr(TPM2_ALG_SHA1,
  83. tpm2_alg_util_flags_hash);
  84. char buf[256];
  85. TPM2_ALG_ID sha1_from_hex_str = tpm2_alg_util_from_optarg("sha1",
  86. tpm2_alg_util_flags_hash);
  87. snprintf(buf, sizeof(buf), "0x%X", TPM2_ALG_SHA1);
  88. TPM2_ALG_ID sha1_from_nice_str = tpm2_alg_util_from_optarg(buf,
  89. tpm2_alg_util_flags_hash);
  90. assert_int_equal(TPM2_ALG_SHA1, sha1_found_id);
  91. assert_int_equal(TPM2_ALG_SHA1, sha1_from_hex_str);
  92. assert_int_equal(TPM2_ALG_SHA1, sha1_from_nice_str);
  93. bool sha1_pass = false;
  94. sha1_pass = !strcmp(sha1_found_str, "sha1");
  95. assert_true(sha1_pass);
  96. }
  97. /* Test the digest specification language */
  98. #define HASH_SHA1 "f1d2d2f924e986ac86fdf7b36c94bcdf32beec15"
  99. #define HASH_SHA256 "c324d5e9514f00b1a42052666721fb0911090ca197bf831f6568e735bc8522c3"
  100. #define HASH_SHA384 "8effdabfe14416214a250f935505250bd991f106065d899db6e19bdc8bf648f3ac0f1935c4f65fe8f798289b1a0d1e06"
  101. #define HASH_SHA512 "0cf9180a764aba863a67b6d72f0918bc131c6772642cb2dce5a34f0a702f9470ddc2bf125c12198b1995c233c34b4afd346c54a2334c350a948a51b6e8b4e6b6"
  102. #define test_digest(digest, expected_hash_str, expected_alg, expected_hash_len) \
  103. do { \
  104. UINT16 _expected_hash_len = expected_hash_len; \
  105. BYTE expected_hash[expected_hash_len]; \
  106. int rc = tpm2_util_hex_to_byte_structure(expected_hash_str, &_expected_hash_len, expected_hash); \
  107. assert_true(rc == 0); \
  108. \
  109. assert_int_equal(digest->hashAlg, expected_alg); \
  110. assert_memory_equal((BYTE *)&digest->digest, expected_hash, \
  111. expected_hash_len); \
  112. } while (0)
  113. #define test_digest_sha1(digest) test_digest(digest, HASH_SHA1, TPM2_ALG_SHA1, TPM2_SHA1_DIGEST_SIZE)
  114. #define test_digest_sha256(digest) test_digest(digest, HASH_SHA256, TPM2_ALG_SHA256, TPM2_SHA256_DIGEST_SIZE)
  115. #define test_digest_sha384(digest) test_digest(digest, HASH_SHA384, TPM2_ALG_SHA384, TPM2_SHA384_DIGEST_SIZE)
  116. #define test_digest_sha512(digest) test_digest(digest, HASH_SHA512, TPM2_ALG_SHA512, TPM2_SHA512_DIGEST_SIZE)
  117. #define get_single_digest_pcr_parse_test(friendly_hash) \
  118. cmocka_unit_test(test_pcr_parse_digest_list_##friendly_hash)
  119. #define add_single_digest_pcr_parse_test(pcrindex, friendly_hash, hash_value, hash_id, hash_size) \
  120. static void test_pcr_parse_digest_list_##friendly_hash(void **state) { \
  121. (void) state; \
  122. \
  123. char mutable_1[] = str(pcrindex)":"str(friendly_hash)"="hash_value; \
  124. tpm2_pcr_digest_spec digest_spec[1]; \
  125. char *optstr[1] = { \
  126. mutable_1 \
  127. }; \
  128. \
  129. bool res = pcr_parse_digest_list(optstr, 1, digest_spec); \
  130. assert_true(res); \
  131. \
  132. TPMT_HA *digest = &digest_spec->digests.digests[0]; \
  133. test_digest(digest, hash_value, hash_id, hash_size); \
  134. }
  135. add_single_digest_pcr_parse_test(4, sha1, HASH_SHA1, TPM2_ALG_SHA1,
  136. TPM2_SHA1_DIGEST_SIZE)
  137. add_single_digest_pcr_parse_test(9, sha256, HASH_SHA256, TPM2_ALG_SHA256,
  138. TPM2_SHA256_DIGEST_SIZE)
  139. add_single_digest_pcr_parse_test(6, sha384, HASH_SHA384, TPM2_ALG_SHA384,
  140. TPM2_SHA384_DIGEST_SIZE)
  141. add_single_digest_pcr_parse_test(21, sha512, HASH_SHA512, TPM2_ALG_SHA512,
  142. TPM2_SHA512_DIGEST_SIZE)
  143. static void test_pcr_parse_digest_list_many_items(void **state) {
  144. (void) state;
  145. char mutable_1[] = "12:sha1="HASH_SHA1;
  146. char mutable_2[] = "5:sha256="HASH_SHA256;
  147. char mutable_3[] = "7:sha512="HASH_SHA512;
  148. char *optstr[] = { mutable_1, mutable_2, mutable_3 };
  149. tpm2_pcr_digest_spec digest_spec[ARRAY_LEN(optstr)];
  150. bool res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec),
  151. digest_spec);
  152. assert_true(res);
  153. size_t i;
  154. for (i = 0; i < ARRAY_LEN(digest_spec); i++) {
  155. tpm2_pcr_digest_spec *dspec = &digest_spec[i];
  156. /* each pcr only has 1 alg hash specified */
  157. assert_int_equal(dspec->digests.count, 1);
  158. TPMT_HA *digest = &dspec->digests.digests[0];
  159. switch (i) {
  160. case 0:
  161. assert_int_equal(dspec->pcr_index, 12);
  162. test_digest_sha1(digest);
  163. break;
  164. case 1:
  165. assert_int_equal(dspec->pcr_index, 5);
  166. test_digest_sha256(digest);
  167. break;
  168. case 2:
  169. assert_int_equal(dspec->pcr_index, 7);
  170. test_digest_sha512(digest);
  171. break;
  172. default:
  173. fail_msg("Missing algorithm test for: %s", optstr[i]);
  174. }
  175. }
  176. }
  177. static void test_pcr_parse_digest_list_compound(void **state) {
  178. (void) state;
  179. char mutable_1[] =
  180. "12:sha1="HASH_SHA1",sha256="HASH_SHA256",sha512="HASH_SHA512;
  181. char *optstr[] = { mutable_1, };
  182. tpm2_pcr_digest_spec digest_spec[ARRAY_LEN(optstr)];
  183. bool res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec),
  184. digest_spec);
  185. assert_true(res);
  186. tpm2_pcr_digest_spec *dspec = &digest_spec[0];
  187. assert_int_equal(12, dspec->pcr_index);
  188. assert_int_equal(3, dspec->digests.count);
  189. size_t i;
  190. for (i = 0; i < dspec->digests.count && i < TPM2_NUM_PCR_BANKS; i++) {
  191. TPMT_HA *digest = &dspec->digests.digests[i];
  192. switch (i) {
  193. case 0:
  194. test_digest_sha1(digest);
  195. break;
  196. case 1:
  197. test_digest_sha256(digest);
  198. break;
  199. case 2:
  200. test_digest_sha512(digest);
  201. break;
  202. default:
  203. fail_msg("Missing algorithm test for: %u", digest->hashAlg);
  204. }
  205. }
  206. }
  207. static void test_pcr_parse_digest_list_bad(void **state) {
  208. (void) state;
  209. char mutable_1[] = "12";
  210. char *optstr[] = { mutable_1, };
  211. tpm2_pcr_digest_spec digest_spec[ARRAY_LEN(optstr)];
  212. bool res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec),
  213. digest_spec);
  214. assert_false(res);
  215. char mutable_2[] = "12:sha256";
  216. optstr[0] = mutable_2;
  217. res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec), digest_spec);
  218. assert_false(res);
  219. char mutable_3[] = "12:sha256=";
  220. optstr[0] = mutable_3;
  221. res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec), digest_spec);
  222. assert_false(res);
  223. char mutable_4[] = "12:sha256="HASH_SHA1;
  224. optstr[0] = mutable_4;
  225. res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec), digest_spec);
  226. assert_false(res);
  227. char mutable_5[] = "12:sha256="HASH_SHA512;
  228. optstr[0] = mutable_5;
  229. res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec), digest_spec);
  230. assert_false(res);
  231. char mutable_6[] = "12:";
  232. optstr[0] = mutable_6;
  233. res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec), digest_spec);
  234. assert_false(res);
  235. }
  236. static void test_pcr_parse_digest_list_bad_alg(void **state) {
  237. (void) state;
  238. char mutable_1[] = "12";
  239. char *optstr[] = { mutable_1, };
  240. tpm2_pcr_digest_spec digest_spec[ARRAY_LEN(optstr)];
  241. bool res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec),
  242. digest_spec);
  243. assert_false(res);
  244. char mutable_2[] = "12:rsa="HASH_SHA1;
  245. optstr[0] = mutable_2;
  246. res = pcr_parse_digest_list(optstr, ARRAY_LEN(digest_spec), digest_spec);
  247. assert_false(res);
  248. }
  249. static void test_tpm2_alg_util_get_hash_size(void **state) {
  250. (void) state;
  251. UINT16 hsize = tpm2_alg_util_get_hash_size(TPM2_ALG_SHA1);
  252. assert_int_equal(hsize, TPM2_SHA1_DIGEST_SIZE);
  253. hsize = tpm2_alg_util_get_hash_size(TPM2_ALG_SHA256);
  254. assert_int_equal(hsize, TPM2_SHA256_DIGEST_SIZE);
  255. hsize = tpm2_alg_util_get_hash_size(TPM2_ALG_SHA384);
  256. assert_int_equal(hsize, TPM2_SHA384_DIGEST_SIZE);
  257. hsize = tpm2_alg_util_get_hash_size(TPM2_ALG_SHA512);
  258. assert_int_equal(hsize, TPM2_SHA512_DIGEST_SIZE);
  259. hsize = tpm2_alg_util_get_hash_size(TPM2_ALG_SM3_256);
  260. assert_int_equal(hsize, TPM2_SM3_256_DIGEST_SIZE);
  261. hsize = tpm2_alg_util_get_hash_size(TPM2_ALG_RSA);
  262. assert_int_equal(hsize, 0);
  263. }
  264. static void test_tpm2_alg_util_flags_sig(void **state) {
  265. UNUSED(state);
  266. TPM2_ALG_ID good_algs[] = {
  267. TPM2_ALG_RSASSA,
  268. TPM2_ALG_RSAPSS,
  269. TPM2_ALG_HMAC,
  270. };
  271. size_t i;
  272. for (i = 0; i < ARRAY_LEN(good_algs); i++) {
  273. TPM2_ALG_ID id = good_algs[i];
  274. const char *name = tpm2_alg_util_algtostr(id, tpm2_alg_util_flags_sig);
  275. assert_non_null(name);
  276. }
  277. const char *name = tpm2_alg_util_algtostr(TPM2_ALG_AES,
  278. tpm2_alg_util_flags_sig);
  279. assert_null(name);
  280. }
  281. static void test_tpm2_alg_util_flags_enc_scheme(void **state) {
  282. UNUSED(state);
  283. TPM2_ALG_ID good_algs[] = {
  284. TPM2_ALG_RSAES,
  285. TPM2_ALG_OAEP,
  286. };
  287. size_t i;
  288. for (i = 0; i < ARRAY_LEN(good_algs); i++) {
  289. TPM2_ALG_ID id = good_algs[i];
  290. const char *name = tpm2_alg_util_algtostr(id,
  291. tpm2_alg_util_flags_enc_scheme);
  292. assert_non_null(name);
  293. }
  294. const char *name = tpm2_alg_util_algtostr(TPM2_ALG_AES,
  295. tpm2_alg_util_flags_enc_scheme);
  296. assert_null(name);
  297. }
  298. static void test_tpm2_alg_util_flags_hash(void **state) {
  299. UNUSED(state);
  300. TPM2_ALG_ID good_algs[] = {
  301. TPM2_ALG_SHA1,
  302. TPM2_ALG_SHA256,
  303. TPM2_ALG_SHA384,
  304. TPM2_ALG_SHA512,
  305. TPM2_ALG_SM3_256
  306. };
  307. size_t i;
  308. for (i = 0; i < ARRAY_LEN(good_algs); i++) {
  309. TPM2_ALG_ID id = good_algs[i];
  310. const char *name = tpm2_alg_util_algtostr(id, tpm2_alg_util_flags_hash);
  311. assert_non_null(name);
  312. }
  313. const char *name = tpm2_alg_util_algtostr(TPM2_ALG_AES,
  314. tpm2_alg_util_flags_hash);
  315. assert_null(name);
  316. }
  317. static void test_extended_alg_rsa2048_non_restricted(void **state) {
  318. UNUSED(state);
  319. TPM2B_PUBLIC pub = { 0 };
  320. bool res = tpm2_alg_util_handle_ext_alg("rsa2048", &pub);
  321. assert_true(res);
  322. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  323. assert_int_equal(pub.publicArea.objectAttributes, 0);
  324. TPMS_RSA_PARMS *r = &pub.publicArea.parameters.rsaDetail;
  325. assert_int_equal(r->exponent, 0);
  326. assert_int_equal(r->keyBits, 2048);
  327. assert_int_equal(r->scheme.scheme, TPM2_ALG_NULL);
  328. }
  329. static void test_extended_alg_rsa2048_aes128cfb_non_restricted(void **state) {
  330. UNUSED(state);
  331. TPM2B_PUBLIC pub = { 0 };
  332. bool res = tpm2_alg_util_handle_ext_alg("rsa2048:aes128cfb", &pub);
  333. assert_true(res);
  334. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  335. assert_int_equal(pub.publicArea.objectAttributes, 0);
  336. TPMS_RSA_PARMS *r = &pub.publicArea.parameters.rsaDetail;
  337. assert_int_equal(r->exponent, 0);
  338. assert_int_equal(r->keyBits, 2048);
  339. assert_int_equal(r->scheme.scheme, TPM2_ALG_NULL);
  340. TPMT_SYM_DEF_OBJECT *s = &r->symmetric;
  341. assert_int_equal(s->keyBits.aes, 128);
  342. assert_int_equal(s->mode.sym, TPM2_ALG_CFB);
  343. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  344. }
  345. static void test_extended_alg_rsa2048_restricted(void **state) {
  346. UNUSED(state);
  347. TPM2B_PUBLIC pub = {
  348. .publicArea = {
  349. .objectAttributes = TPMA_OBJECT_RESTRICTED
  350. }
  351. };
  352. bool res = tpm2_alg_util_handle_ext_alg("rsa2048", &pub);
  353. assert_true(res);
  354. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  355. assert_int_equal(pub.publicArea.objectAttributes, TPMA_OBJECT_RESTRICTED);
  356. TPMS_RSA_PARMS *r = &pub.publicArea.parameters.rsaDetail;
  357. assert_int_equal(r->exponent, 0);
  358. assert_int_equal(r->keyBits, 2048);
  359. assert_int_equal(r->scheme.scheme, TPM2_ALG_NULL);
  360. TPMT_SYM_DEF_OBJECT *s = &r->symmetric;
  361. assert_int_equal(s->keyBits.aes, 128);
  362. assert_int_equal(s->mode.sym, TPM2_ALG_CFB);
  363. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  364. }
  365. static void test_extended_alg_rsa_non_restricted(void **state) {
  366. UNUSED(state);
  367. TPM2B_PUBLIC pub = { 0 };
  368. bool res = tpm2_alg_util_handle_ext_alg("rsa", &pub);
  369. assert_true(res);
  370. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  371. assert_int_equal(pub.publicArea.objectAttributes, 0);
  372. TPMS_RSA_PARMS *r = &pub.publicArea.parameters.rsaDetail;
  373. assert_int_equal(r->exponent, 0);
  374. assert_int_equal(r->keyBits, 2048);
  375. assert_int_equal(r->scheme.scheme, TPM2_ALG_NULL);
  376. TPMT_SYM_DEF_OBJECT *s = &r->symmetric;
  377. assert_int_equal(s->algorithm, TPM2_ALG_NULL);
  378. }
  379. static void test_extended_alg_rsa1024_rsaes_restricted(void **state) {
  380. UNUSED(state);
  381. TPM2B_PUBLIC pub = {
  382. .publicArea = {
  383. .objectAttributes = TPMA_OBJECT_RESTRICTED
  384. }
  385. };
  386. bool res = tpm2_alg_util_handle_ext_alg("rsa1024:rsaes", &pub);
  387. assert_true(res);
  388. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  389. assert_int_equal(pub.publicArea.objectAttributes, TPMA_OBJECT_RESTRICTED);
  390. TPMS_RSA_PARMS *r = &pub.publicArea.parameters.rsaDetail;
  391. assert_int_equal(r->exponent, 0);
  392. assert_int_equal(r->keyBits, 1024);
  393. assert_int_equal(r->scheme.scheme, TPM2_ALG_RSAES);
  394. TPMT_SYM_DEF_OBJECT *s = &r->symmetric;
  395. assert_int_equal(s->keyBits.aes, 128);
  396. assert_int_equal(s->mode.sym, TPM2_ALG_CFB);
  397. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  398. }
  399. static void test_extended_alg_rsa1024_rsaes(void **state) {
  400. UNUSED(state);
  401. TPM2B_PUBLIC pub = { 0 };
  402. bool res = tpm2_alg_util_handle_ext_alg("rsa1024:rsaes", &pub);
  403. assert_true(res);
  404. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  405. assert_int_equal(pub.publicArea.objectAttributes, 0);
  406. TPMS_RSA_PARMS *r = &pub.publicArea.parameters.rsaDetail;
  407. assert_int_equal(r->exponent, 0);
  408. assert_int_equal(r->keyBits, 1024);
  409. assert_int_equal(r->scheme.scheme, TPM2_ALG_RSAES);
  410. TPMT_SYM_DEF_OBJECT *s = &r->symmetric;
  411. assert_int_equal(s->algorithm, TPM2_ALG_NULL);
  412. }
  413. static void test_extended_alg_rsa_restricted(void **state) {
  414. UNUSED(state);
  415. TPM2B_PUBLIC pub = {
  416. .publicArea = {
  417. .objectAttributes = TPMA_OBJECT_RESTRICTED
  418. }
  419. };
  420. bool res = tpm2_alg_util_handle_ext_alg("rsa", &pub);
  421. assert_true(res);
  422. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  423. TPMS_RSA_PARMS *r = &pub.publicArea.parameters.rsaDetail;
  424. assert_int_equal(r->exponent, 0);
  425. assert_int_equal(r->keyBits, 2048);
  426. assert_int_equal(r->scheme.scheme, TPM2_ALG_NULL);
  427. TPMT_SYM_DEF_OBJECT *s = &r->symmetric;
  428. assert_int_equal(s->keyBits.aes, 128);
  429. assert_int_equal(s->mode.aes, TPM2_ALG_CFB);
  430. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  431. }
  432. static void test_extended_alg_rsa_rsapss(void **state) {
  433. UNUSED(state);
  434. TPM2B_PUBLIC pub = { 0 };
  435. bool res = tpm2_alg_util_handle_ext_alg("rsa:rsapss", &pub);
  436. assert_true(res);
  437. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  438. TPMS_RSA_PARMS *r = &pub.publicArea.parameters.rsaDetail;
  439. assert_int_equal(r->exponent, 0);
  440. assert_int_equal(r->keyBits, 2048);
  441. assert_int_equal(r->scheme.scheme, TPM2_ALG_RSAPSS);
  442. TPMT_SYM_DEF_OBJECT *s = &r->symmetric;
  443. assert_int_equal(s->keyBits.aes, 128);
  444. assert_int_equal(s->mode.aes, TPM2_ALG_CFB);
  445. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  446. }
  447. static void test_extended_alg_rsa_rsassa_non_restricted(void **state) {
  448. UNUSED(state);
  449. TPM2B_PUBLIC pub = { 0 };
  450. bool res = tpm2_alg_util_handle_ext_alg("rsa:rsassa", &pub);
  451. assert_true(res);
  452. assert_int_equal(pub.publicArea.objectAttributes, 0);
  453. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  454. TPMS_RSA_PARMS *r = &pub.publicArea.parameters.rsaDetail;
  455. assert_int_equal(r->exponent, 0);
  456. assert_int_equal(r->keyBits, 2048);
  457. assert_int_equal(r->scheme.scheme, TPM2_ALG_RSASSA);
  458. TPMS_SIG_SCHEME_RSASSA *s = &r->scheme.details.rsassa;
  459. assert_int_equal(s->hashAlg, TPM2_ALG_SHA256);
  460. }
  461. static void test_extended_alg_ecc256_non_restricted(void **state) {
  462. UNUSED(state);
  463. TPM2B_PUBLIC pub = { 0 };
  464. bool res = tpm2_alg_util_handle_ext_alg("ecc256", &pub);
  465. assert_true(res);
  466. assert_int_equal(pub.publicArea.type, TPM2_ALG_ECC);
  467. assert_int_equal(pub.publicArea.objectAttributes, 0);
  468. TPMS_ECC_PARMS *e = &pub.publicArea.parameters.eccDetail;
  469. assert_int_equal(e->scheme.scheme, TPM2_ALG_NULL);
  470. assert_int_equal(e->curveID, TPM2_ECC_NIST_P256);
  471. assert_int_equal(e->kdf.scheme, TPM2_ALG_NULL);
  472. assert_int_equal(e->kdf.details.mgf1.hashAlg, 0);
  473. }
  474. static void test_extended_alg_ecc256_aes128cbc_non_restricted(void **state) {
  475. UNUSED(state);
  476. TPM2B_PUBLIC pub = { 0 };
  477. bool res = tpm2_alg_util_handle_ext_alg("ecc256:aes128cbc", &pub);
  478. assert_true(res);
  479. assert_int_equal(pub.publicArea.type, TPM2_ALG_ECC);
  480. assert_int_equal(pub.publicArea.objectAttributes, 0);
  481. TPMS_ECC_PARMS *e = &pub.publicArea.parameters.eccDetail;
  482. assert_int_equal(e->scheme.scheme, TPM2_ALG_NULL);
  483. assert_int_equal(e->curveID, TPM2_ECC_NIST_P256);
  484. assert_int_equal(e->kdf.scheme, TPM2_ALG_NULL);
  485. assert_int_equal(e->kdf.details.mgf1.hashAlg, 0);
  486. TPMT_SYM_DEF_OBJECT *s = &e->symmetric;
  487. assert_int_equal(s->keyBits.aes, 128);
  488. assert_int_equal(s->mode.sym, TPM2_ALG_CBC);
  489. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  490. }
  491. static void test_extended_alg_ecc384_ecdaa4_sha256_non_restricted(void **state) {
  492. UNUSED(state);
  493. TPM2B_PUBLIC pub = { 0 };
  494. bool res = tpm2_alg_util_handle_ext_alg("ecc384:ecdaa4-sha256", &pub);
  495. assert_true(res);
  496. assert_int_equal(pub.publicArea.type, TPM2_ALG_ECC);
  497. assert_int_equal(pub.publicArea.objectAttributes, 0);
  498. TPMS_ECC_PARMS *e = &pub.publicArea.parameters.eccDetail;
  499. assert_int_equal(e->scheme.scheme, TPM2_ALG_ECDAA);
  500. assert_int_equal(e->curveID, TPM2_ECC_NIST_P384);
  501. assert_int_equal(e->kdf.scheme, TPM2_ALG_NULL);
  502. assert_int_equal(e->kdf.details.mgf1.hashAlg, 0);
  503. TPMS_SIG_SCHEME_ECDAA *a = &e->scheme.details.ecdaa;
  504. assert_int_equal(a->count, 4);
  505. assert_int_equal(a->hashAlg, TPM2_ALG_SHA256);
  506. }
  507. static void test_extended_alg_ecc384_ecdaa4_sha256(void **state) {
  508. UNUSED(state);
  509. TPM2B_PUBLIC pub = {
  510. .publicArea = {
  511. .objectAttributes = TPMA_OBJECT_RESTRICTED
  512. }
  513. };
  514. bool res = tpm2_alg_util_handle_ext_alg("ecc384:ecdaa4-sha256", &pub);
  515. assert_true(res);
  516. assert_int_equal(pub.publicArea.type, TPM2_ALG_ECC);
  517. TPMS_ECC_PARMS *e = &pub.publicArea.parameters.eccDetail;
  518. assert_int_equal(e->scheme.scheme, TPM2_ALG_ECDAA);
  519. assert_int_equal(e->curveID, TPM2_ECC_NIST_P384);
  520. assert_int_equal(e->kdf.scheme, TPM2_ALG_NULL);
  521. assert_int_equal(e->kdf.details.mgf1.hashAlg, 0);
  522. TPMS_SIG_SCHEME_ECDAA *a = &e->scheme.details.ecdaa;
  523. assert_int_equal(a->count, 4);
  524. assert_int_equal(a->hashAlg, TPM2_ALG_SHA256);
  525. TPMT_SYM_DEF_OBJECT *s = &e->symmetric;
  526. assert_int_equal(s->keyBits.aes, 128);
  527. assert_int_equal(s->mode.sym, TPM2_ALG_CFB);
  528. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  529. }
  530. static void test_extended_alg_ecc256_restricted(void **state) {
  531. UNUSED(state);
  532. TPM2B_PUBLIC pub = {
  533. .publicArea = {
  534. .objectAttributes = TPMA_OBJECT_RESTRICTED
  535. }
  536. };
  537. bool res = tpm2_alg_util_handle_ext_alg("ecc256", &pub);
  538. assert_true(res);
  539. assert_int_equal(pub.publicArea.objectAttributes, TPMA_OBJECT_RESTRICTED);
  540. assert_int_equal(pub.publicArea.type, TPM2_ALG_ECC);
  541. TPMS_ECC_PARMS *e = &pub.publicArea.parameters.eccDetail;
  542. assert_int_equal(e->scheme.scheme, TPM2_ALG_NULL);
  543. assert_int_equal(e->curveID, TPM2_ECC_NIST_P256);
  544. assert_int_equal(e->kdf.scheme, TPM2_ALG_NULL);
  545. assert_int_equal(e->kdf.details.mgf1.hashAlg, 0);
  546. }
  547. static void test_extended_alg_ecc_non_restricted(void **state) {
  548. UNUSED(state);
  549. TPM2B_PUBLIC pub = { 0 };
  550. bool res = tpm2_alg_util_handle_ext_alg("ecc", &pub);
  551. assert_true(res);
  552. assert_int_equal(pub.publicArea.objectAttributes, 0);
  553. assert_int_equal(pub.publicArea.type, TPM2_ALG_ECC);
  554. TPMS_ECC_PARMS *e = &pub.publicArea.parameters.eccDetail;
  555. assert_int_equal(e->scheme.scheme, TPM2_ALG_NULL);
  556. assert_int_equal(e->curveID, TPM2_ECC_NIST_P256);
  557. assert_int_equal(e->kdf.scheme, TPM2_ALG_NULL);
  558. assert_int_equal(e->kdf.details.mgf1.hashAlg, 0);
  559. }
  560. static void test_extended_alg_ecc_restricted(void **state) {
  561. UNUSED(state);
  562. TPM2B_PUBLIC pub = {
  563. .publicArea = {
  564. .objectAttributes = TPMA_OBJECT_RESTRICTED
  565. }
  566. };
  567. bool res = tpm2_alg_util_handle_ext_alg("ecc", &pub);
  568. assert_true(res);
  569. assert_int_equal(pub.publicArea.objectAttributes, TPMA_OBJECT_RESTRICTED);
  570. assert_int_equal(pub.publicArea.type, TPM2_ALG_ECC);
  571. TPMS_ECC_PARMS *e = &pub.publicArea.parameters.eccDetail;
  572. assert_int_equal(e->scheme.scheme, TPM2_ALG_NULL);
  573. assert_int_equal(e->curveID, TPM2_ECC_NIST_P256);
  574. assert_int_equal(e->kdf.scheme, TPM2_ALG_NULL);
  575. assert_int_equal(e->kdf.details.mgf1.hashAlg, 0);
  576. }
  577. static void test_extended_alg_ecc_ecdsa_restricted(void **state) {
  578. UNUSED(state);
  579. TPM2B_PUBLIC pub = {
  580. .publicArea = {
  581. .objectAttributes = TPMA_OBJECT_RESTRICTED
  582. }
  583. };
  584. bool res = tpm2_alg_util_handle_ext_alg("ecc:ecdaa", &pub);
  585. assert_true(res);
  586. assert_int_equal(pub.publicArea.objectAttributes, TPMA_OBJECT_RESTRICTED);
  587. assert_int_equal(pub.publicArea.type, TPM2_ALG_ECC);
  588. TPMS_ECC_PARMS *e = &pub.publicArea.parameters.eccDetail;
  589. assert_int_equal(e->scheme.scheme, TPM2_ALG_ECDAA);
  590. assert_int_equal(e->curveID, TPM2_ECC_NIST_P256);
  591. assert_int_equal(e->kdf.scheme, TPM2_ALG_NULL);
  592. assert_int_equal(e->kdf.details.mgf1.hashAlg, 0);
  593. TPMS_SIG_SCHEME_ECDAA *a = &e->scheme.details.ecdaa;
  594. assert_int_equal(a->count, 0);
  595. assert_int_equal(a->hashAlg, TPM2_ALG_SHA256);
  596. }
  597. static void test_extended_alg_xor_restricted(void **state) {
  598. UNUSED(state);
  599. TPM2B_PUBLIC pub = {
  600. .publicArea = {
  601. .objectAttributes = TPMA_OBJECT_RESTRICTED
  602. }
  603. };
  604. bool res = tpm2_alg_util_handle_ext_alg("xor", &pub);
  605. assert_true(res);
  606. assert_int_equal(pub.publicArea.objectAttributes, TPMA_OBJECT_RESTRICTED);
  607. assert_int_equal(pub.publicArea.type, TPM2_ALG_KEYEDHASH);
  608. TPMT_KEYEDHASH_SCHEME *s = &pub.publicArea.parameters.keyedHashDetail.scheme;
  609. assert_int_equal(s->scheme, TPM2_ALG_XOR);
  610. assert_int_equal(s->details.exclusiveOr.hashAlg, TPM2_ALG_SHA256);
  611. assert_int_equal(s->details.exclusiveOr.kdf, TPM2_ALG_KDF1_SP800_108);
  612. }
  613. static void test_extended_alg_xorsha256_restricted(void **state) {
  614. UNUSED(state);
  615. TPM2B_PUBLIC pub = {
  616. .publicArea = {
  617. .objectAttributes = TPMA_OBJECT_RESTRICTED
  618. }
  619. };
  620. bool res = tpm2_alg_util_handle_ext_alg("xor:sha256", &pub);
  621. assert_true(res);
  622. assert_int_equal(pub.publicArea.objectAttributes, TPMA_OBJECT_RESTRICTED);
  623. assert_int_equal(pub.publicArea.type, TPM2_ALG_KEYEDHASH);
  624. TPMT_KEYEDHASH_SCHEME *s = &pub.publicArea.parameters.keyedHashDetail.scheme;
  625. assert_int_equal(s->scheme, TPM2_ALG_XOR);
  626. assert_int_equal(s->details.exclusiveOr.hashAlg, TPM2_ALG_SHA256);
  627. assert_int_equal(s->details.exclusiveOr.kdf, TPM2_ALG_KDF1_SP800_108);
  628. }
  629. static void test_extended_alg_xor(void **state) {
  630. UNUSED(state);
  631. TPM2B_PUBLIC pub = { 0 };
  632. bool res = tpm2_alg_util_handle_ext_alg("xor", &pub);
  633. assert_true(res);
  634. assert_int_equal(pub.publicArea.objectAttributes, 0);
  635. assert_int_equal(pub.publicArea.type, TPM2_ALG_KEYEDHASH);
  636. TPMT_KEYEDHASH_SCHEME *s = &pub.publicArea.parameters.keyedHashDetail.scheme;
  637. assert_int_equal(s->scheme, TPM2_ALG_XOR);
  638. assert_int_equal(s->details.exclusiveOr.hashAlg, TPM2_ALG_SHA256);
  639. assert_int_equal(s->details.exclusiveOr.kdf, TPM2_ALG_KDF1_SP800_108);
  640. }
  641. static void test_extended_alg_xorsha256(void **state) {
  642. UNUSED(state);
  643. TPM2B_PUBLIC pub = { 0 };
  644. bool res = tpm2_alg_util_handle_ext_alg("xor:sha256", &pub);
  645. assert_true(res);
  646. assert_int_equal(pub.publicArea.objectAttributes, 0);
  647. assert_int_equal(pub.publicArea.type, TPM2_ALG_KEYEDHASH);
  648. TPMT_KEYEDHASH_SCHEME *s = &pub.publicArea.parameters.keyedHashDetail.scheme;
  649. assert_int_equal(s->scheme, TPM2_ALG_XOR);
  650. assert_int_equal(s->details.exclusiveOr.hashAlg, TPM2_ALG_SHA256);
  651. assert_int_equal(s->details.exclusiveOr.kdf, TPM2_ALG_KDF1_SP800_108);
  652. }
  653. static void test_extended_alg_hmac_restricted(void **state) {
  654. UNUSED(state);
  655. TPM2B_PUBLIC pub = {
  656. .publicArea = {
  657. .objectAttributes = TPMA_OBJECT_RESTRICTED
  658. }
  659. };
  660. bool res = tpm2_alg_util_handle_ext_alg("hmac", &pub);
  661. assert_true(res);
  662. assert_int_equal(pub.publicArea.objectAttributes, TPMA_OBJECT_RESTRICTED);
  663. assert_int_equal(pub.publicArea.type, TPM2_ALG_KEYEDHASH);
  664. TPMI_ALG_HASH alg =
  665. pub.publicArea.parameters.keyedHashDetail.scheme.details.hmac.hashAlg;
  666. assert_int_equal(alg, TPM2_ALG_SHA256);
  667. }
  668. static void test_extended_alg_hmac(void **state) {
  669. UNUSED(state);
  670. TPM2B_PUBLIC pub = { 0 };
  671. bool res = tpm2_alg_util_handle_ext_alg("hmac", &pub);
  672. assert_true(res);
  673. assert_int_equal(pub.publicArea.objectAttributes, 0);
  674. assert_int_equal(pub.publicArea.type, TPM2_ALG_KEYEDHASH);
  675. TPMI_ALG_HASH alg =
  676. pub.publicArea.parameters.keyedHashDetail.scheme.details.hmac.hashAlg;
  677. assert_int_equal(alg, TPM2_ALG_SHA256);
  678. }
  679. static void test_extended_alg_hmacsha384_restricted(void **state) {
  680. UNUSED(state);
  681. TPM2B_PUBLIC pub = {
  682. .publicArea = {
  683. .objectAttributes = TPMA_OBJECT_RESTRICTED
  684. }
  685. };
  686. bool res = tpm2_alg_util_handle_ext_alg("hmac:sha384", &pub);
  687. assert_true(res);
  688. assert_int_equal(pub.publicArea.objectAttributes, TPMA_OBJECT_RESTRICTED);
  689. assert_int_equal(pub.publicArea.type, TPM2_ALG_KEYEDHASH);
  690. TPMI_ALG_HASH alg =
  691. pub.publicArea.parameters.keyedHashDetail.scheme.details.hmac.hashAlg;
  692. assert_int_equal(alg, TPM2_ALG_SHA384);
  693. }
  694. static void test_extended_alg_hmacsha384(void **state) {
  695. UNUSED(state);
  696. TPM2B_PUBLIC pub = { 0 };
  697. bool res = tpm2_alg_util_handle_ext_alg("hmac:sha384", &pub);
  698. assert_true(res);
  699. assert_int_equal(pub.publicArea.objectAttributes, 0);
  700. assert_int_equal(pub.publicArea.type, TPM2_ALG_KEYEDHASH);
  701. TPMI_ALG_HASH alg =
  702. pub.publicArea.parameters.keyedHashDetail.scheme.details.hmac.hashAlg;
  703. assert_int_equal(alg, TPM2_ALG_SHA384);
  704. }
  705. static void test_extended_alg_aes_restricted(void **state) {
  706. UNUSED(state);
  707. TPM2B_PUBLIC pub = {
  708. .publicArea = {
  709. .objectAttributes = TPMA_OBJECT_RESTRICTED
  710. }
  711. };
  712. bool res = tpm2_alg_util_handle_ext_alg("aes", &pub);
  713. assert_true(res);
  714. assert_int_equal(pub.publicArea.type, TPM2_ALG_SYMCIPHER);
  715. TPMT_SYM_DEF_OBJECT *s = &pub.publicArea.parameters.symDetail.sym;
  716. assert_int_equal(s->keyBits.aes, 128);
  717. assert_int_equal(s->mode.aes, TPM2_ALG_NULL);
  718. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  719. }
  720. static void test_extended_alg_aes(void **state) {
  721. UNUSED(state);
  722. TPM2B_PUBLIC pub = {
  723. .publicArea = {
  724. .objectAttributes = TPMA_OBJECT_RESTRICTED
  725. }
  726. };
  727. bool res = tpm2_alg_util_handle_ext_alg("aes", &pub);
  728. assert_true(res);
  729. assert_int_equal(pub.publicArea.type, TPM2_ALG_SYMCIPHER);
  730. TPMT_SYM_DEF_OBJECT *s = &pub.publicArea.parameters.symDetail.sym;
  731. assert_int_equal(s->keyBits.aes, 128);
  732. assert_int_equal(s->mode.aes, TPM2_ALG_NULL);
  733. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  734. }
  735. static void test_extended_alg_aes256_restricted(void **state) {
  736. UNUSED(state);
  737. TPM2B_PUBLIC pub = {
  738. .publicArea = {
  739. .objectAttributes = TPMA_OBJECT_RESTRICTED
  740. }
  741. };
  742. bool res = tpm2_alg_util_handle_ext_alg("aes256", &pub);
  743. assert_true(res);
  744. assert_int_equal(pub.publicArea.type, TPM2_ALG_SYMCIPHER);
  745. TPMT_SYM_DEF_OBJECT *s = &pub.publicArea.parameters.symDetail.sym;
  746. assert_int_equal(s->keyBits.aes, 256);
  747. assert_int_equal(s->mode.aes, TPM2_ALG_NULL);
  748. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  749. }
  750. static void test_extended_alg_aes256(void **state) {
  751. UNUSED(state);
  752. TPM2B_PUBLIC pub = {
  753. .publicArea = {
  754. .objectAttributes = TPMA_OBJECT_RESTRICTED
  755. }
  756. };
  757. bool res = tpm2_alg_util_handle_ext_alg("aes256", &pub);
  758. assert_true(res);
  759. assert_int_equal(pub.publicArea.type, TPM2_ALG_SYMCIPHER);
  760. TPMT_SYM_DEF_OBJECT *s = &pub.publicArea.parameters.symDetail.sym;
  761. assert_int_equal(s->keyBits.aes, 256);
  762. assert_int_equal(s->mode.aes, TPM2_ALG_NULL);
  763. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  764. }
  765. static void test_extended_alg_aes256cbc_restricted(void **state) {
  766. UNUSED(state);
  767. TPM2B_PUBLIC pub = {
  768. .publicArea = {
  769. .objectAttributes = TPMA_OBJECT_RESTRICTED
  770. }
  771. };
  772. bool res = tpm2_alg_util_handle_ext_alg("aes256cbc", &pub);
  773. assert_true(res);
  774. assert_int_equal(pub.publicArea.type, TPM2_ALG_SYMCIPHER);
  775. TPMT_SYM_DEF_OBJECT *s = &pub.publicArea.parameters.symDetail.sym;
  776. assert_int_equal(s->keyBits.aes, 256);
  777. assert_int_equal(s->mode.aes, TPM2_ALG_CBC);
  778. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  779. }
  780. static void test_extended_alg_aes256cbc(void **state) {
  781. UNUSED(state);
  782. TPM2B_PUBLIC pub = {
  783. .publicArea = {
  784. .objectAttributes = TPMA_OBJECT_RESTRICTED
  785. }
  786. };
  787. bool res = tpm2_alg_util_handle_ext_alg("aes256cbc", &pub);
  788. assert_true(res);
  789. assert_int_equal(pub.publicArea.type, TPM2_ALG_SYMCIPHER);
  790. TPMT_SYM_DEF_OBJECT *s = &pub.publicArea.parameters.symDetail.sym;
  791. assert_int_equal(s->keyBits.aes, 256);
  792. assert_int_equal(s->mode.aes, TPM2_ALG_CBC);
  793. assert_int_equal(s->algorithm, TPM2_ALG_AES);
  794. }
  795. static void test_extended_alg_keyedhash(void **state) {
  796. UNUSED(state);
  797. TPM2B_PUBLIC pub = { 0 };
  798. bool res = tpm2_alg_util_handle_ext_alg("keyedhash", &pub);
  799. assert_true(res);
  800. assert_int_equal(pub.publicArea.type, TPM2_ALG_KEYEDHASH);
  801. TPMS_KEYEDHASH_PARMS *k = &pub.publicArea.parameters.keyedHashDetail;
  802. assert_int_equal(k->scheme.scheme, TPM2_ALG_NULL);
  803. }
  804. static void test_extended_rsa_camellia(void **state) {
  805. UNUSED(state);
  806. TPM2B_PUBLIC pub = { 0 };
  807. bool res = tpm2_alg_util_handle_ext_alg("rsa:camellia", &pub);
  808. assert_true(res);
  809. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  810. TPMT_SYM_DEF_OBJECT *s = &pub.publicArea.parameters.rsaDetail.symmetric;
  811. assert_int_equal(s->keyBits.aes, 128);
  812. assert_int_equal(s->mode.aes, TPM2_ALG_NULL);
  813. assert_int_equal(s->algorithm, TPM2_ALG_CAMELLIA);
  814. }
  815. static void test_extended_rsa_camellia256cbc(void **state) {
  816. UNUSED(state);
  817. TPM2B_PUBLIC pub = { 0 };
  818. bool res = tpm2_alg_util_handle_ext_alg("rsa:camellia256cbc", &pub);
  819. assert_true(res);
  820. assert_int_equal(pub.publicArea.type, TPM2_ALG_RSA);
  821. TPMT_SYM_DEF_OBJECT *s = &pub.publicArea.parameters.rsaDetail.symmetric;
  822. assert_int_equal(s->keyBits.aes, 256);
  823. assert_int_equal(s->mode.aes, TPM2_ALG_CBC);
  824. assert_int_equal(s->algorithm, TPM2_ALG_CAMELLIA);
  825. }
  826. static void test_extended_camellia192cbc(void **state) {
  827. UNUSED(state);
  828. TPM2B_PUBLIC pub = { 0 };
  829. bool res = tpm2_alg_util_handle_ext_alg("camellia192cbc", &pub);
  830. assert_true(res);
  831. assert_int_equal(pub.publicArea.type, TPM2_ALG_SYMCIPHER);
  832. TPMT_SYM_DEF_OBJECT *s = &pub.publicArea.parameters.symDetail.sym;
  833. assert_int_equal(s->keyBits.aes, 192);
  834. assert_int_equal(s->mode.aes, TPM2_ALG_CBC);
  835. assert_int_equal(s->algorithm, TPM2_ALG_CAMELLIA);
  836. }
  837. static void test_extended_alg_bad(void **state) {
  838. UNUSED(state);
  839. TPM2B_PUBLIC pub = { 0 };
  840. bool res = tpm2_alg_util_handle_ext_alg("ecc256funnytexthere", &pub);
  841. assert_false(res);
  842. res = tpm2_alg_util_handle_ext_alg("ecc256:funnytexthere", &pub);
  843. assert_false(res);
  844. res = tpm2_alg_util_handle_ext_alg("rsafunnytexthere", &pub);
  845. assert_false(res);
  846. res = tpm2_alg_util_handle_ext_alg("rsa:funnytexthere", &pub);
  847. assert_false(res);
  848. res = tpm2_alg_util_handle_ext_alg("rsa2048funnytexthere", &pub);
  849. assert_false(res);
  850. res = tpm2_alg_util_handle_ext_alg("rsa2048:funnytexthere", &pub);
  851. assert_false(res);
  852. res = tpm2_alg_util_handle_ext_alg("aesfunnytexthere", &pub);
  853. assert_false(res);
  854. res = tpm2_alg_util_handle_ext_alg("aes:funnytexthere", &pub);
  855. assert_false(res);
  856. res = tpm2_alg_util_handle_ext_alg("aes128funnytexthere", &pub);
  857. assert_false(res);
  858. res = tpm2_alg_util_handle_ext_alg("aes128:funnytexthere", &pub);
  859. assert_false(res);
  860. res = tpm2_alg_util_handle_ext_alg("xorfunnytexthere", &pub);
  861. assert_false(res);
  862. res = tpm2_alg_util_handle_ext_alg("xor:funnytexthere", &pub);
  863. assert_false(res);
  864. res = tpm2_alg_util_handle_ext_alg("hmacfunnytexthere", &pub);
  865. assert_false(res);
  866. res = tpm2_alg_util_handle_ext_alg("hmac:funnytexthere", &pub);
  867. assert_false(res);
  868. res = tpm2_alg_util_handle_ext_alg("keyedhashfunytexthere", &pub);
  869. assert_false(res);
  870. res = tpm2_alg_util_handle_ext_alg("keyedhash:funnytexthere", &pub);
  871. assert_false(res);
  872. }
  873. /* link required symbol, but tpm2_tool.c declares it AND main, which
  874. * we have a main below for cmocka tests.
  875. */
  876. bool output_enabled = true;
  877. int main(int argc, char* argv[]) {
  878. (void) argc;
  879. (void) argv;
  880. const struct CMUnitTest tests[] = {
  881. single_item_test_get(rsa),
  882. cmocka_unit_test(test_tpm2_alg_util_sha1_test),
  883. single_item_test_get(hmac),
  884. single_item_test_get(aes),
  885. single_item_test_get(mgf1),
  886. single_item_test_get(keyedhash),
  887. single_item_test_get(xor),
  888. single_item_test_get(sha256),
  889. single_item_test_get(sha384),
  890. single_item_test_get(sha512),
  891. single_item_test_get(null),
  892. single_item_test_get(sm3_256),
  893. single_item_test_get(sm4),
  894. single_item_test_get(rsassa),
  895. single_item_test_get(rsaes),
  896. single_item_test_get(rsapss),
  897. single_item_test_get(oaep),
  898. single_item_test_get(ecdsa),
  899. single_item_test_get(ecdh),
  900. single_item_test_get(ecdaa),
  901. single_item_test_get(sm2),
  902. single_item_test_get(ecschnorr),
  903. single_item_test_get(ecmqv),
  904. single_item_test_get(kdf1_sp800_56a),
  905. single_item_test_get(kdf2),
  906. single_item_test_get(kdf1_sp800_108),
  907. single_item_test_get(ecc),
  908. single_item_test_get(symcipher),
  909. single_item_test_get(camellia),
  910. single_item_test_get(sha3_256),
  911. single_item_test_get(sha3_384),
  912. single_item_test_get(sha3_512),
  913. single_item_test_get(ctr),
  914. single_item_test_get(ofb),
  915. single_item_test_get(cbc),
  916. single_item_test_get(cfb),
  917. single_item_test_get(ecb),
  918. get_single_digest_pcr_parse_test(sha1),
  919. get_single_digest_pcr_parse_test(sha256),
  920. get_single_digest_pcr_parse_test(sha384),
  921. get_single_digest_pcr_parse_test(sha512),
  922. cmocka_unit_test(test_pcr_parse_digest_list_many_items),
  923. cmocka_unit_test(test_pcr_parse_digest_list_compound),
  924. cmocka_unit_test(test_pcr_parse_digest_list_bad),
  925. cmocka_unit_test(test_pcr_parse_digest_list_bad_alg),
  926. cmocka_unit_test(test_tpm2_alg_util_get_hash_size),
  927. cmocka_unit_test(test_tpm2_alg_util_flags_sig),
  928. cmocka_unit_test(test_tpm2_alg_util_flags_enc_scheme),
  929. cmocka_unit_test(test_tpm2_alg_util_flags_hash),
  930. cmocka_unit_test(test_extended_alg_rsa2048_non_restricted),
  931. cmocka_unit_test(test_extended_alg_rsa2048_restricted),
  932. cmocka_unit_test(test_extended_alg_rsa_non_restricted),
  933. cmocka_unit_test(test_extended_alg_rsa_restricted),
  934. cmocka_unit_test(test_extended_alg_rsa1024_rsaes_restricted),
  935. cmocka_unit_test(test_extended_alg_rsa1024_rsaes),
  936. cmocka_unit_test(test_extended_alg_rsa_rsapss),
  937. cmocka_unit_test(test_extended_alg_rsa_rsassa_non_restricted),
  938. cmocka_unit_test(test_extended_alg_rsa2048_aes128cfb_non_restricted),
  939. cmocka_unit_test(test_extended_alg_ecc256_non_restricted),
  940. cmocka_unit_test(test_extended_alg_ecc256_aes128cbc_non_restricted),
  941. cmocka_unit_test(test_extended_alg_ecc384_ecdaa4_sha256_non_restricted),
  942. cmocka_unit_test(test_extended_alg_ecc384_ecdaa4_sha256),
  943. cmocka_unit_test(test_extended_alg_ecc256_restricted),
  944. cmocka_unit_test(test_extended_alg_ecc_non_restricted),
  945. cmocka_unit_test(test_extended_alg_ecc_restricted),
  946. cmocka_unit_test(test_extended_alg_ecc_ecdsa_restricted),
  947. cmocka_unit_test(test_extended_alg_xor_restricted),
  948. cmocka_unit_test(test_extended_alg_xor),
  949. cmocka_unit_test(test_extended_alg_xorsha256_restricted),
  950. cmocka_unit_test(test_extended_alg_xorsha256),
  951. cmocka_unit_test(test_extended_alg_hmac_restricted),
  952. cmocka_unit_test(test_extended_alg_hmac),
  953. cmocka_unit_test(test_extended_alg_hmacsha384_restricted),
  954. cmocka_unit_test(test_extended_alg_hmacsha384),
  955. cmocka_unit_test(test_extended_alg_aes_restricted),
  956. cmocka_unit_test(test_extended_alg_aes),
  957. cmocka_unit_test(test_extended_alg_aes256_restricted),
  958. cmocka_unit_test(test_extended_alg_aes256),
  959. cmocka_unit_test(test_extended_alg_aes256cbc_restricted),
  960. cmocka_unit_test(test_extended_alg_aes256cbc),
  961. cmocka_unit_test(test_extended_alg_keyedhash),
  962. cmocka_unit_test(test_extended_rsa_camellia),
  963. cmocka_unit_test(test_extended_rsa_camellia256cbc),
  964. cmocka_unit_test(test_extended_camellia192cbc),
  965. cmocka_unit_test(test_extended_alg_bad),
  966. };
  967. return cmocka_run_group_tests(tests, NULL, NULL);
  968. }