test_tpm2_eventlog.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  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 <tss2/tss2_tpm2_types.h>
  8. #include "tpm2_eventlog.h"
  9. #define TCG_DIGEST2_SHA1_SIZE (sizeof(TCG_DIGEST2) + TPM2_SHA_DIGEST_SIZE)
  10. #define TCG_DIGEST2_SHA256_SIZE (sizeof(TCG_DIGEST2) + TPM2_SHA256_DIGEST_SIZE)
  11. static bool foreach_digest2_test_callback(TCG_DIGEST2 const *digest, size_t size, void *data){
  12. (void)digest;
  13. (void)size;
  14. (void)data;
  15. return mock_type(bool);
  16. }
  17. static void test_foreach_digest2_null(void **state){
  18. (void)state;
  19. tpm2_eventlog_context ctx = {0};
  20. assert_false(foreach_digest2(&ctx, 0, NULL, 0, sizeof(TCG_DIGEST2)));
  21. }
  22. static void test_foreach_digest2_size(void **state) {
  23. (void)state;
  24. uint8_t buf [sizeof(TCG_DIGEST2) - 1] = { 0, };
  25. TCG_DIGEST2 *digest = (TCG_DIGEST2*)buf;
  26. tpm2_eventlog_context ctx = { .digest2_cb = foreach_digest2_test_callback };
  27. assert_false(foreach_digest2(&ctx, 0, digest, 1, sizeof(TCG_DIGEST2) - 1));
  28. }
  29. static void test_foreach_digest2(void **state) {
  30. (void)state;
  31. uint8_t buf [TCG_DIGEST2_SHA1_SIZE] = { 0, };
  32. TCG_DIGEST2* digest = (TCG_DIGEST2*)buf;
  33. will_return(foreach_digest2_test_callback, true);
  34. tpm2_eventlog_context ctx = { .digest2_cb = foreach_digest2_test_callback };
  35. assert_true(foreach_digest2(&ctx, 0, digest, 1, TCG_DIGEST2_SHA1_SIZE));
  36. }
  37. static void test_foreach_digest2_cbnull(void **state){
  38. (void)state;
  39. uint8_t buf [TCG_DIGEST2_SHA1_SIZE] = {0};
  40. TCG_DIGEST2* digest = (TCG_DIGEST2*)buf;
  41. tpm2_eventlog_context ctx = {0};
  42. assert_true(foreach_digest2(&ctx, 0, digest, 1, TCG_DIGEST2_SHA1_SIZE));
  43. }
  44. static void test_sha1(void **state){
  45. (void)state;
  46. uint8_t buf [TCG_DIGEST2_SHA1_SIZE] = { 0, };
  47. const uint8_t sha1sum[] = {
  48. 0x31,0x19,0x5d,0x69,0x35,0x16,0x3c,0x79,0xa9,0x67,
  49. 0x22,0xba,0x7d,0x4b,0x11,0x35,0x24,0x89,0xf4,0x8b,
  50. };
  51. const int pcr_index = 3;
  52. TCG_DIGEST2 * digest = (TCG_DIGEST2*) buf;
  53. digest->AlgorithmId = TPM2_ALG_SHA1,
  54. memcpy(digest->Digest, "the magic words are:", TPM2_SHA1_DIGEST_SIZE);
  55. tpm2_eventlog_context ctx = {0};
  56. assert_true(foreach_digest2(&ctx, pcr_index, digest, 1, TCG_DIGEST2_SHA1_SIZE));
  57. assert_memory_equal(ctx.sha1_pcrs[pcr_index], sha1sum, sizeof(sha1sum));
  58. }
  59. static void test_sha256(void **state){
  60. (void)state;
  61. uint8_t buf [TCG_DIGEST2_SHA256_SIZE] = {0};
  62. const uint8_t sha256sum[] = {
  63. 0x51,0xea,0x4e,0xa4,0x98,0xaa,0xe2,0x52,
  64. 0xf4,0xe7,0xff,0x4b,0x13,0xb6,0x3f,0xe5,
  65. 0xb5,0x7a,0xf8,0x21,0xa4,0x84,0x4e,0xe2,
  66. 0x6f,0xd8,0xdd,0x25,0xa4,0x2b,0x33,0x23,
  67. };
  68. const int pcr_index = 3;
  69. TCG_DIGEST2 * digest = (TCG_DIGEST2*) buf;
  70. digest->AlgorithmId = TPM2_ALG_SHA256,
  71. memcpy(digest->Digest, "The Magic Words are Squeamish Ossifrage, for RSA-129 (from 1977)", TPM2_SHA256_DIGEST_SIZE);
  72. tpm2_eventlog_context ctx = {0};
  73. assert_true(foreach_digest2(&ctx, pcr_index, digest, 1, TCG_DIGEST2_SHA256_SIZE));
  74. assert_memory_equal(ctx.sha256_pcrs[pcr_index], sha256sum, sizeof(sha256sum));
  75. }
  76. static void test_foreach_digest2_cbfail(void **state){
  77. (void)state;
  78. uint8_t buf [TCG_DIGEST2_SHA1_SIZE] = { 0, };
  79. TCG_DIGEST2* digest = (TCG_DIGEST2*)buf;
  80. will_return(foreach_digest2_test_callback, false);
  81. tpm2_eventlog_context ctx = { .digest2_cb = foreach_digest2_test_callback };
  82. assert_false(foreach_digest2(&ctx, 0, digest, 1, TCG_DIGEST2_SHA1_SIZE));
  83. }
  84. static void test_digest2_accumulator_callback(void **state) {
  85. (void)state;
  86. char buf[TCG_DIGEST2_SHA1_SIZE];
  87. TCG_DIGEST2 *digest = (TCG_DIGEST2*)buf;
  88. size_t size = TPM2_SHA1_DIGEST_SIZE, accumulated = 0;
  89. digest->AlgorithmId = TPM2_ALG_SHA1;
  90. assert_true(digest2_accumulator_callback (digest, size, &accumulated));
  91. assert_int_equal(accumulated, TCG_DIGEST2_SHA1_SIZE);
  92. }
  93. static void test_digest2_accumulator_callback_null(void **state) {
  94. (void)state;
  95. assert_false(digest2_accumulator_callback (NULL, 0, NULL));
  96. }
  97. static bool test_event2hdr_callback(TCG_EVENT_HEADER2 const *eventhdr, size_t size, void *data) {
  98. (void)eventhdr;
  99. (void)size;
  100. (void)data;
  101. return mock_type(bool);
  102. }
  103. static bool test_event2_callback(TCG_EVENT2 const *event, UINT32 type,
  104. void *data, uint32_t eventlog_version) {
  105. (void)event;
  106. (void)type;
  107. (void)data;
  108. (void)eventlog_version;
  109. return mock_type(bool);
  110. }
  111. static void test_parse_event2_badhdr(void **state){
  112. (void)state;
  113. char buf[sizeof(TCG_EVENT_HEADER2) - 1] = { 0, };
  114. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  115. size_t size_event = 0, size_digest = 0;
  116. assert_false(parse_event2(eventhdr, sizeof(buf), &size_event, &size_digest));
  117. }
  118. static void test_parse_event2_baddigest(void **state){
  119. (void)state;
  120. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE - 1] = { 0, };
  121. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  122. TCG_DIGEST2 *digest = eventhdr->Digests;
  123. size_t size_event = 0, size_digest = 0;
  124. eventhdr->DigestCount = 1;
  125. digest->AlgorithmId = TPM2_ALG_SHA1;
  126. assert_false(parse_event2(eventhdr, sizeof(buf), &size_event, &size_digest));
  127. }
  128. static void test_parse_event2_badeventsize(void **state){
  129. (void)state;
  130. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE + sizeof(TCG_EVENT2) - 1] = { 0, };
  131. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  132. TCG_DIGEST2 *digest = eventhdr->Digests;
  133. size_t size_event = 0, size_digest = 0;
  134. eventhdr->DigestCount = 1;
  135. digest->AlgorithmId = TPM2_ALG_SHA1;
  136. assert_false(parse_event2(eventhdr, sizeof(buf), &size_event, &size_digest));
  137. }
  138. static void test_parse_event2_badeventbuf(void **state){
  139. (void)state;
  140. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE + sizeof(TCG_EVENT2)] = { 0, };
  141. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  142. TCG_DIGEST2 *digest = eventhdr->Digests;
  143. TCG_EVENT2 *event = (TCG_EVENT2*)(buf + sizeof(*eventhdr) + TCG_DIGEST2_SHA1_SIZE);
  144. size_t size_event = 0, size_digest = 0;
  145. eventhdr->DigestCount = 1;
  146. digest->AlgorithmId = TPM2_ALG_SHA1;
  147. event->EventSize = 1;
  148. assert_false(parse_event2(eventhdr, sizeof(buf), &size_event, &size_digest));
  149. }
  150. static void test_foreach_event2_version1(void **state){
  151. (void)state;
  152. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE + sizeof(TCG_EVENT2) + 6] = { 0, };
  153. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  154. TCG_DIGEST2 *digest = eventhdr->Digests;
  155. TCG_EVENT2 *event = (TCG_EVENT2*)((uintptr_t)digest + TCG_DIGEST2_SHA1_SIZE);
  156. eventhdr->DigestCount = 1;
  157. digest->AlgorithmId = TPM2_ALG_SHA1;
  158. event->EventSize = 6;
  159. will_return(test_event2hdr_callback, true);
  160. will_return(foreach_digest2_test_callback, true);
  161. will_return(test_event2_callback, true);
  162. tpm2_eventlog_context ctx = {
  163. .digest2_cb = foreach_digest2_test_callback,
  164. .event2_cb = test_event2_callback,
  165. .event2hdr_cb = test_event2hdr_callback,
  166. .eventlog_version = 1,
  167. };
  168. assert_true(foreach_event2(&ctx, eventhdr, sizeof(buf)));
  169. }
  170. static void test_foreach_event2_version2(void **state){
  171. (void)state;
  172. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE + sizeof(TCG_EVENT2) + 6] = { 0, };
  173. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  174. TCG_DIGEST2 *digest = eventhdr->Digests;
  175. TCG_EVENT2 *event = (TCG_EVENT2*)((uintptr_t)digest + TCG_DIGEST2_SHA1_SIZE);
  176. eventhdr->DigestCount = 1;
  177. digest->AlgorithmId = TPM2_ALG_SHA1;
  178. event->EventSize = 6;
  179. will_return(test_event2hdr_callback, true);
  180. will_return(foreach_digest2_test_callback, true);
  181. will_return(test_event2_callback, true);
  182. tpm2_eventlog_context ctx = {
  183. .digest2_cb = foreach_digest2_test_callback,
  184. .event2_cb = test_event2_callback,
  185. .event2hdr_cb = test_event2hdr_callback,
  186. .eventlog_version = 2,
  187. };
  188. assert_true(foreach_event2(&ctx, eventhdr, sizeof(buf)));
  189. }
  190. static void test_foreach_event2_event2hdr_fail(void **state){
  191. (void)state;
  192. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE + sizeof(TCG_EVENT2) + 1] = { 0, };
  193. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  194. TCG_DIGEST2 *digest = eventhdr->Digests;
  195. TCG_EVENT2 *event = (TCG_EVENT2*)(buf + sizeof(*eventhdr) + TCG_DIGEST2_SHA1_SIZE);
  196. eventhdr->DigestCount = 1;
  197. digest->AlgorithmId = TPM2_ALG_SHA1;
  198. event->EventSize = 1;
  199. will_return(test_event2hdr_callback, false);
  200. tpm2_eventlog_context ctx = {
  201. .event2hdr_cb = test_event2hdr_callback,
  202. };
  203. assert_false(foreach_event2(&ctx, eventhdr, sizeof(buf)));
  204. }
  205. static void test_foreach_event2_digest2_fail(void **state){
  206. (void)state;
  207. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE + sizeof(TCG_EVENT2) + 1] = { 0, };
  208. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  209. TCG_DIGEST2 *digest = eventhdr->Digests;
  210. TCG_EVENT2 *event = (TCG_EVENT2*)(buf + sizeof(*eventhdr) + TCG_DIGEST2_SHA1_SIZE);
  211. eventhdr->DigestCount = 1;
  212. digest->AlgorithmId = TPM2_ALG_SHA1;
  213. event->EventSize = 1;
  214. will_return(test_event2hdr_callback, true);
  215. will_return(foreach_digest2_test_callback, false);
  216. tpm2_eventlog_context ctx = {
  217. .digest2_cb = foreach_digest2_test_callback,
  218. .event2hdr_cb = test_event2hdr_callback,
  219. };
  220. assert_false(foreach_event2(&ctx, eventhdr, sizeof(buf)));
  221. }
  222. static void test_foreach_event2_parse_event2body_fail(void **state){
  223. (void)state;
  224. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE + sizeof(TCG_EVENT2) + 1] = { 0, };
  225. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  226. TCG_DIGEST2 *digest = eventhdr->Digests;
  227. TCG_EVENT2 *event = (TCG_EVENT2*)(buf + sizeof(*eventhdr) + TCG_DIGEST2_SHA1_SIZE);
  228. eventhdr->DigestCount = 1;
  229. eventhdr->EventType = EV_EFI_VARIABLE_BOOT;
  230. digest->AlgorithmId = TPM2_ALG_SHA1;
  231. event->EventSize = 1;
  232. will_return(test_event2hdr_callback, true);
  233. will_return(foreach_digest2_test_callback, true);
  234. tpm2_eventlog_context ctx = {
  235. .digest2_cb = foreach_digest2_test_callback,
  236. .event2hdr_cb = test_event2hdr_callback,
  237. };
  238. assert_false(foreach_event2(&ctx, eventhdr, sizeof(buf)));
  239. }
  240. static void test_foreach_event2_event2body_version1_fail(void **state){
  241. (void)state;
  242. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE + sizeof(TCG_EVENT2) + 1] = { 0, };
  243. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  244. TCG_DIGEST2 *digest = eventhdr->Digests;
  245. TCG_EVENT2 *event = (TCG_EVENT2*)(buf + sizeof(*eventhdr) + TCG_DIGEST2_SHA1_SIZE);
  246. eventhdr->DigestCount = 1;
  247. digest->AlgorithmId = TPM2_ALG_SHA1;
  248. event->EventSize = 1;
  249. will_return(test_event2hdr_callback, true);
  250. will_return(foreach_digest2_test_callback, true);
  251. will_return(test_event2_callback, false);
  252. tpm2_eventlog_context ctx = {
  253. .event2hdr_cb = test_event2hdr_callback,
  254. .digest2_cb = foreach_digest2_test_callback,
  255. .event2_cb = test_event2_callback,
  256. .eventlog_version = 1,
  257. };
  258. assert_false(foreach_event2(&ctx, eventhdr, sizeof(buf)));
  259. }
  260. static void test_foreach_event2_event2body_version2_fail(void **state){
  261. (void)state;
  262. char buf[sizeof(TCG_EVENT_HEADER2) + TCG_DIGEST2_SHA1_SIZE + sizeof(TCG_EVENT2) + 1] = { 0, };
  263. TCG_EVENT_HEADER2 *eventhdr = (TCG_EVENT_HEADER2*)buf;
  264. TCG_DIGEST2 *digest = eventhdr->Digests;
  265. TCG_EVENT2 *event = (TCG_EVENT2*)(buf + sizeof(*eventhdr) + TCG_DIGEST2_SHA1_SIZE);
  266. eventhdr->DigestCount = 1;
  267. digest->AlgorithmId = TPM2_ALG_SHA1;
  268. event->EventSize = 1;
  269. will_return(test_event2hdr_callback, true);
  270. will_return(foreach_digest2_test_callback, true);
  271. will_return(test_event2_callback, false);
  272. tpm2_eventlog_context ctx = {
  273. .event2hdr_cb = test_event2hdr_callback,
  274. .digest2_cb = foreach_digest2_test_callback,
  275. .event2_cb = test_event2_callback,
  276. .eventlog_version = 2,
  277. };
  278. assert_false(foreach_event2(&ctx, eventhdr, sizeof(buf)));
  279. }
  280. static void test_parse_event2body_uefivar_badsize(void **state){
  281. (void)state;
  282. TCG_EVENT2 event = { 0, };
  283. assert_false(parse_event2body(&event, EV_EFI_VARIABLE_DRIVER_CONFIG));
  284. }
  285. #include <inttypes.h>
  286. static void test_parse_event2body_uefivar_badlength(void **state){
  287. (void)state;
  288. char buf[sizeof(TCG_EVENT2) + sizeof(UEFI_VARIABLE_DATA) + sizeof(char16_t)] = { 0, };
  289. TCG_EVENT2 *event = (TCG_EVENT2*)buf;
  290. event->EventSize = sizeof(UEFI_VARIABLE_DATA) + sizeof(char16_t) - 1;
  291. UEFI_VARIABLE_DATA *data = (UEFI_VARIABLE_DATA*)event->Event;
  292. data->UnicodeNameLength = 1;
  293. assert_false(parse_event2body(event, EV_EFI_VARIABLE_DRIVER_CONFIG));
  294. }
  295. static void test_parse_event2body_firmware_blob_badlength(void **state){
  296. (void)state;
  297. char buf[sizeof(TCG_EVENT2)] = { 0, };
  298. TCG_EVENT2 *event = (TCG_EVENT2*)buf;
  299. event->EventSize = sizeof(UEFI_PLATFORM_FIRMWARE_BLOB) - 1;
  300. assert_false(parse_event2body(event, EV_EFI_PLATFORM_FIRMWARE_BLOB));
  301. }
  302. static void test_specid_event_nohdr(void **state){
  303. (void)state;
  304. TCG_EVENT event = { 0, };
  305. TCG_EVENT_HEADER2 *next = NULL;
  306. assert_false(specid_event(&event, sizeof(event) - 1, &next));
  307. }
  308. static void test_specid_event_badeventtype(void **state){
  309. (void)state;
  310. TCG_EVENT event = { .eventType = EV_ACTION, };
  311. TCG_EVENT_HEADER2 *next = NULL;
  312. assert_false(specid_event(&event, sizeof(event), &next));
  313. }
  314. static void test_specid_event_badpcrindex(void **state){
  315. (void)state;
  316. TCG_EVENT event = {
  317. .eventType = EV_NO_ACTION,
  318. .pcrIndex = 1,
  319. };
  320. TCG_EVENT_HEADER2 *next = NULL;
  321. assert_false(specid_event(&event, sizeof(event), &next));
  322. }
  323. static void test_specid_event_baddigest(void **state){
  324. (void)state;
  325. TCG_EVENT event = {
  326. .eventType = EV_NO_ACTION,
  327. .digest = { 0x01, },
  328. };
  329. TCG_EVENT_HEADER2 *next = NULL;
  330. assert_false(specid_event(&event, sizeof(event), &next));
  331. }
  332. static void test_specid_event_badeventsize(void **state) {
  333. (void)state;
  334. TCG_EVENT *event;
  335. TCG_SPECID_EVENT *event_specid;
  336. TCG_EVENT_HEADER2 *next = NULL;
  337. char buf[sizeof(*event) + sizeof(*event_specid)] = { 0, };
  338. event = (TCG_EVENT*)buf;
  339. event->eventType = EV_NO_ACTION;
  340. event->eventDataSize = 1;
  341. assert_false(specid_event(event, sizeof(buf), &next));
  342. }
  343. static void test_specid_event_badsize(void **state){
  344. (void)state;
  345. TCG_EVENT *event;
  346. TCG_SPECID_EVENT *event_specid;
  347. TCG_EVENT_HEADER2 *next = NULL;
  348. char buf[sizeof(*event) + 1] = { 0, };
  349. event = (TCG_EVENT*)buf;
  350. event->eventType = EV_NO_ACTION;
  351. event->eventDataSize = sizeof(*event_specid);
  352. assert_false(specid_event(event, sizeof(buf), &next));
  353. }
  354. static void test_specid_event_noalgs(void **state) {
  355. (void)state;
  356. TCG_EVENT *event;
  357. TCG_SPECID_EVENT *event_specid;
  358. TCG_EVENT_HEADER2 *next = NULL;
  359. char buf[sizeof(*event) + sizeof(*event_specid)] = { 0, };
  360. event = (TCG_EVENT*)buf;
  361. event->eventType = EV_NO_ACTION;
  362. event->eventDataSize = sizeof(*event_specid);
  363. assert_false(specid_event(event, sizeof(buf), &next));
  364. }
  365. static void test_specid_event_nosizeforalgs(void **state) {
  366. (void)state;
  367. TCG_EVENT *event;
  368. TCG_SPECID_EVENT *event_specid;
  369. TCG_EVENT_HEADER2 *next = NULL;
  370. char buf[sizeof(*event) + sizeof(*event_specid)] = { 0, };
  371. event = (TCG_EVENT*)buf;
  372. event->eventType = EV_NO_ACTION;
  373. event->eventDataSize = sizeof(*event_specid);
  374. event_specid = (TCG_SPECID_EVENT*)event->event;
  375. event_specid->numberOfAlgorithms = 5;
  376. assert_false(specid_event(event, sizeof(buf), &next));
  377. }
  378. static void test_specid_event_nosizeforvendorstruct(void **state) {
  379. (void)state;
  380. TCG_EVENT *event;
  381. TCG_SPECID_EVENT *event_specid;
  382. TCG_SPECID_ALG *alg;
  383. TCG_EVENT_HEADER2 *next = NULL;
  384. char buf[sizeof(*event) + sizeof(*event_specid) + sizeof(*alg)] = { 0, };
  385. event = (TCG_EVENT*)buf;
  386. event->eventType = EV_NO_ACTION;
  387. event->eventDataSize = sizeof(*event_specid);
  388. event_specid = (TCG_SPECID_EVENT*)event->event;
  389. event_specid->numberOfAlgorithms = 1;
  390. assert_false(specid_event(event, sizeof(buf), &next));
  391. }
  392. static void test_specid_event_nosizeforvendordata(void **state) {
  393. (void)state;
  394. TCG_EVENT *event;
  395. TCG_SPECID_EVENT *event_specid;
  396. TCG_SPECID_ALG *alg;
  397. TCG_VENDOR_INFO *vendor;
  398. TCG_EVENT_HEADER2 *next = NULL;
  399. char buf[sizeof(*event) + sizeof(*event_specid) + sizeof(*alg) + sizeof(*vendor)] = { 0, };
  400. event = (TCG_EVENT*)buf;
  401. event->eventType = EV_NO_ACTION;
  402. event->eventDataSize = sizeof(*event_specid);
  403. event_specid = (TCG_SPECID_EVENT*)event->event;
  404. event_specid->numberOfAlgorithms = 1;
  405. vendor = (TCG_VENDOR_INFO*)((uintptr_t)event_specid->digestSizes + sizeof(*alg) * event_specid->numberOfAlgorithms);
  406. vendor->vendorInfoSize = 1;
  407. printf("data size: %zu\n", sizeof(buf));
  408. assert_false(specid_event(event, sizeof(buf), &next));
  409. }
  410. static void test_specid_event(void **state) {
  411. (void)state;
  412. TCG_EVENT *event;
  413. TCG_SPECID_EVENT *event_specid;
  414. TCG_SPECID_ALG *alg;
  415. TCG_VENDOR_INFO *vendor;
  416. TCG_EVENT_HEADER2 *next = NULL;
  417. char buf[sizeof(*event) + sizeof(*event_specid) + sizeof(*alg) + sizeof(*vendor) + 5] = { 0, };
  418. event = (TCG_EVENT*)buf;
  419. event->eventType = EV_NO_ACTION;
  420. event->eventDataSize = sizeof(*event_specid);
  421. event_specid = (TCG_SPECID_EVENT*)event->event;
  422. event_specid->numberOfAlgorithms = 1;
  423. vendor = (TCG_VENDOR_INFO*)((uintptr_t)event_specid->digestSizes + sizeof(*alg) * event_specid->numberOfAlgorithms);
  424. vendor->vendorInfoSize = 5;
  425. printf("sizeof(buf): %zu\n", sizeof(buf));
  426. assert_true(specid_event(event, sizeof(buf), &next));
  427. }
  428. int main(void) {
  429. const struct CMUnitTest tests[] = {
  430. cmocka_unit_test(test_foreach_digest2_null),
  431. cmocka_unit_test(test_foreach_digest2_size),
  432. cmocka_unit_test(test_foreach_digest2),
  433. cmocka_unit_test(test_foreach_digest2_cbfail),
  434. cmocka_unit_test(test_foreach_digest2_cbnull),
  435. cmocka_unit_test(test_sha1),
  436. cmocka_unit_test(test_sha256),
  437. cmocka_unit_test(test_digest2_accumulator_callback),
  438. cmocka_unit_test(test_digest2_accumulator_callback_null),
  439. cmocka_unit_test(test_parse_event2_badhdr),
  440. cmocka_unit_test(test_parse_event2_baddigest),
  441. cmocka_unit_test(test_parse_event2_badeventsize),
  442. cmocka_unit_test(test_parse_event2_badeventbuf),
  443. cmocka_unit_test(test_foreach_event2_version1),
  444. cmocka_unit_test(test_foreach_event2_version2),
  445. cmocka_unit_test(test_foreach_event2_event2hdr_fail),
  446. cmocka_unit_test(test_foreach_event2_event2body_version1_fail),
  447. cmocka_unit_test(test_foreach_event2_event2body_version2_fail),
  448. cmocka_unit_test(test_foreach_event2_digest2_fail),
  449. cmocka_unit_test(test_foreach_event2_parse_event2body_fail),
  450. cmocka_unit_test(test_parse_event2body_uefivar_badsize),
  451. cmocka_unit_test(test_parse_event2body_uefivar_badlength),
  452. cmocka_unit_test(test_parse_event2body_firmware_blob_badlength),
  453. cmocka_unit_test(test_specid_event_nohdr),
  454. cmocka_unit_test(test_specid_event_badeventtype),
  455. cmocka_unit_test(test_specid_event_badpcrindex),
  456. cmocka_unit_test(test_specid_event_baddigest),
  457. cmocka_unit_test(test_specid_event_badeventsize),
  458. cmocka_unit_test(test_specid_event_badsize),
  459. cmocka_unit_test(test_specid_event_noalgs),
  460. cmocka_unit_test(test_specid_event_nosizeforalgs),
  461. cmocka_unit_test(test_specid_event_nosizeforvendorstruct),
  462. cmocka_unit_test(test_specid_event_nosizeforvendordata),
  463. cmocka_unit_test(test_specid_event),
  464. };
  465. return cmocka_run_group_tests(tests, NULL, NULL);
  466. }