Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 1 | #include <stdlib.h> |
| 2 | #include <stdio.h> |
| 3 | #include <arpa/inet.h> |
| 4 | |
| 5 | #include <setjmp.h> |
| 6 | #include <cmocka.h> |
| 7 | |
Philip Tricca | 910f17c | 2018-03-15 12:38:37 -0700 | [diff] [blame] | 8 | #include "tss2_sys.h" |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 9 | #include "sysapi_util.h" |
| 10 | |
| 11 | #define MAX_SIZE_CTX 4096 |
| 12 | /** |
| 13 | * |
| 14 | */ |
Tadeusz Struk | 2147c49 | 2017-08-09 13:40:31 -0700 | [diff] [blame] | 15 | static int |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 16 | CopyCommandHeader_sys_setup (void **state) |
| 17 | { |
| 18 | _TSS2_SYS_CONTEXT_BLOB *sys_ctx; |
| 19 | UINT32 size_ctx; |
| 20 | |
| 21 | size_ctx = Tss2_Sys_GetContextSize (MAX_SIZE_CTX); |
| 22 | sys_ctx = calloc (1, size_ctx); |
| 23 | assert_non_null (sys_ctx); |
| 24 | /** |
| 25 | * This is the important part: the CopyCommandHeader function builds up |
| 26 | * the command buffer in the memory pointed to by tpmInitBuffPtr. This |
| 27 | * must point to the data after the context structure. |
| 28 | */ |
Tadeusz Struk | e79d986 | 2017-10-23 13:06:59 -0700 | [diff] [blame] | 29 | sys_ctx->cmdBuffer = (UINT8*) (sys_ctx + sizeof (_TSS2_SYS_CONTEXT_BLOB)); |
Tadeusz Struk | 5acc504 | 2017-11-16 14:02:26 -0800 | [diff] [blame] | 30 | InitSysContextFields (sys_ctx); |
| 31 | InitSysContextPtrs (sys_ctx, size_ctx); |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 32 | |
| 33 | *state = sys_ctx; |
Tadeusz Struk | 2147c49 | 2017-08-09 13:40:31 -0700 | [diff] [blame] | 34 | return 0; |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 35 | } |
| 36 | |
Tadeusz Struk | 2147c49 | 2017-08-09 13:40:31 -0700 | [diff] [blame] | 37 | static int |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 38 | CopyCommandHeader_sys_teardown (void **state) |
| 39 | { |
Tadeusz Struk | b5d6a43 | 2017-10-18 12:21:40 -0700 | [diff] [blame] | 40 | TSS2_SYS_CONTEXT *sys_ctx = (TSS2_SYS_CONTEXT*)*state; |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 41 | |
| 42 | if (sys_ctx) |
| 43 | free (sys_ctx); |
Tadeusz Struk | 2147c49 | 2017-08-09 13:40:31 -0700 | [diff] [blame] | 44 | |
| 45 | return 0; |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 46 | } |
| 47 | |
| 48 | /** |
| 49 | * CopyCommandHeader creates the standard TPM command header (tag, size, |
| 50 | * command_code) to the data buffer in the context structure. It also |
| 51 | * advances the 'nextData' pointer to the address after the header. This |
| 52 | * test will fail if the nextData pointer isn't set as expected |
| 53 | */ |
| 54 | static void |
| 55 | CopyCommandHeader_nextData_unit (void **state) |
| 56 | { |
Tadeusz Struk | 5acc504 | 2017-11-16 14:02:26 -0800 | [diff] [blame] | 57 | _TSS2_SYS_CONTEXT_BLOB *sys_ctx = (_TSS2_SYS_CONTEXT_BLOB *)*state; |
Andreas Fuchs | be5899d | 2017-11-13 17:14:36 +0100 | [diff] [blame] | 58 | TPM2_CC cc = TPM2_CC_GetCapability; |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 59 | |
| 60 | CopyCommandHeader (sys_ctx, cc); |
Tadeusz Struk | 5acc504 | 2017-11-16 14:02:26 -0800 | [diff] [blame] | 61 | assert_int_equal (sys_ctx->nextData, sizeof (TPM20_Header_In)); |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 62 | } |
| 63 | |
| 64 | /** |
| 65 | * After a call to CopyCommandHeader the tag in the TPM20_Header_In portion of |
Andreas Fuchs | be5899d | 2017-11-13 17:14:36 +0100 | [diff] [blame] | 66 | * the cmdBuffer member of the sys context should be TPM2_ST_NO_SESSIONS |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 67 | * transformed into network byte order. |
| 68 | */ |
| 69 | static void |
| 70 | CopyCommandHeader_tag_unit (void **state) |
| 71 | { |
| 72 | _TSS2_SYS_CONTEXT_BLOB *sys_ctx = (_TSS2_SYS_CONTEXT_BLOB*)*state; |
Andreas Fuchs | be5899d | 2017-11-13 17:14:36 +0100 | [diff] [blame] | 73 | TPM2_CC cc = TPM2_CC_GetCapability; |
Tadeusz Struk | e79d986 | 2017-10-23 13:06:59 -0700 | [diff] [blame] | 74 | TPM20_Header_In *header = (TPM20_Header_In*)sys_ctx->cmdBuffer; |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 75 | /* The TSS code uses a custom function to convert stuff to network byte |
| 76 | * order but we can just use htons. Not sure why we don't use htons/l |
| 77 | * everywhere. |
| 78 | */ |
Andreas Fuchs | be5899d | 2017-11-13 17:14:36 +0100 | [diff] [blame] | 79 | TPMI_ST_COMMAND_TAG tag_net = htons (TPM2_ST_NO_SESSIONS); |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 80 | |
Tadeusz Struk | 5acc504 | 2017-11-16 14:02:26 -0800 | [diff] [blame] | 81 | CopyCommandHeader (sys_ctx, cc); |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 82 | assert_int_equal (tag_net, header->tag); |
| 83 | } |
| 84 | /** |
| 85 | * After a call to CopyCommandHeader the commandCode in the TPM20_Header_In |
Tadeusz Struk | e79d986 | 2017-10-23 13:06:59 -0700 | [diff] [blame] | 86 | * portion of the cmdBuffer member of the sys context should be the command |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 87 | * code parameter in network byte order. |
| 88 | */ |
| 89 | static void |
| 90 | CopyCommandHeader_commandcode_unit (void **state) |
| 91 | { |
| 92 | _TSS2_SYS_CONTEXT_BLOB *sys_ctx = (_TSS2_SYS_CONTEXT_BLOB*)*state; |
Andreas Fuchs | be5899d | 2017-11-13 17:14:36 +0100 | [diff] [blame] | 93 | TPM2_CC cc = TPM2_CC_GetCapability; |
| 94 | TPM2_CC cc_net = htonl (cc); |
Tadeusz Struk | e79d986 | 2017-10-23 13:06:59 -0700 | [diff] [blame] | 95 | TPM20_Header_In *header = (TPM20_Header_In*)sys_ctx->cmdBuffer; |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 96 | |
Tadeusz Struk | 5acc504 | 2017-11-16 14:02:26 -0800 | [diff] [blame] | 97 | CopyCommandHeader (sys_ctx, cc); |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 98 | assert_int_equal (cc_net, header->commandCode); |
| 99 | } |
| 100 | |
| 101 | int |
| 102 | main (int argc, char* argv[]) |
| 103 | { |
Tadeusz Struk | 2147c49 | 2017-08-09 13:40:31 -0700 | [diff] [blame] | 104 | const struct CMUnitTest tests[] = { |
| 105 | cmocka_unit_test_setup_teardown (CopyCommandHeader_nextData_unit, |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 106 | CopyCommandHeader_sys_setup, |
| 107 | CopyCommandHeader_sys_teardown), |
Tadeusz Struk | 2147c49 | 2017-08-09 13:40:31 -0700 | [diff] [blame] | 108 | cmocka_unit_test_setup_teardown (CopyCommandHeader_tag_unit, |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 109 | CopyCommandHeader_sys_setup, |
| 110 | CopyCommandHeader_sys_teardown), |
Tadeusz Struk | 2147c49 | 2017-08-09 13:40:31 -0700 | [diff] [blame] | 111 | cmocka_unit_test_setup_teardown (CopyCommandHeader_commandcode_unit, |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 112 | CopyCommandHeader_sys_setup, |
| 113 | CopyCommandHeader_sys_teardown), |
| 114 | }; |
Tadeusz Struk | 2147c49 | 2017-08-09 13:40:31 -0700 | [diff] [blame] | 115 | return cmocka_run_group_tests (tests, NULL, NULL); |
Philip Tricca | 81223f4 | 2016-07-28 19:50:08 -0700 | [diff] [blame] | 116 | } |