blob: febc35f354cbccba35f6e5c8de582feef55df937 [file] [log] [blame]
Philip Tricca81223f42016-07-28 19:50:08 -07001#include <stdlib.h>
2#include <stdio.h>
3#include <arpa/inet.h>
4
5#include <setjmp.h>
6#include <cmocka.h>
7
Philip Tricca910f17c2018-03-15 12:38:37 -07008#include "tss2_sys.h"
Philip Tricca81223f42016-07-28 19:50:08 -07009#include "sysapi_util.h"
10
11#define MAX_SIZE_CTX 4096
12/**
13 *
14 */
Tadeusz Struk2147c492017-08-09 13:40:31 -070015static int
Philip Tricca81223f42016-07-28 19:50:08 -070016CopyCommandHeader_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 Struke79d9862017-10-23 13:06:59 -070029 sys_ctx->cmdBuffer = (UINT8*) (sys_ctx + sizeof (_TSS2_SYS_CONTEXT_BLOB));
Tadeusz Struk5acc5042017-11-16 14:02:26 -080030 InitSysContextFields (sys_ctx);
31 InitSysContextPtrs (sys_ctx, size_ctx);
Philip Tricca81223f42016-07-28 19:50:08 -070032
33 *state = sys_ctx;
Tadeusz Struk2147c492017-08-09 13:40:31 -070034 return 0;
Philip Tricca81223f42016-07-28 19:50:08 -070035}
36
Tadeusz Struk2147c492017-08-09 13:40:31 -070037static int
Philip Tricca81223f42016-07-28 19:50:08 -070038CopyCommandHeader_sys_teardown (void **state)
39{
Tadeusz Strukb5d6a432017-10-18 12:21:40 -070040 TSS2_SYS_CONTEXT *sys_ctx = (TSS2_SYS_CONTEXT*)*state;
Philip Tricca81223f42016-07-28 19:50:08 -070041
42 if (sys_ctx)
43 free (sys_ctx);
Tadeusz Struk2147c492017-08-09 13:40:31 -070044
45 return 0;
Philip Tricca81223f42016-07-28 19:50:08 -070046}
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 */
54static void
55CopyCommandHeader_nextData_unit (void **state)
56{
Tadeusz Struk5acc5042017-11-16 14:02:26 -080057 _TSS2_SYS_CONTEXT_BLOB *sys_ctx = (_TSS2_SYS_CONTEXT_BLOB *)*state;
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010058 TPM2_CC cc = TPM2_CC_GetCapability;
Philip Tricca81223f42016-07-28 19:50:08 -070059
60 CopyCommandHeader (sys_ctx, cc);
Tadeusz Struk5acc5042017-11-16 14:02:26 -080061 assert_int_equal (sys_ctx->nextData, sizeof (TPM20_Header_In));
Philip Tricca81223f42016-07-28 19:50:08 -070062}
63
64/**
65 * After a call to CopyCommandHeader the tag in the TPM20_Header_In portion of
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010066 * the cmdBuffer member of the sys context should be TPM2_ST_NO_SESSIONS
Philip Tricca81223f42016-07-28 19:50:08 -070067 * transformed into network byte order.
68 */
69static void
70CopyCommandHeader_tag_unit (void **state)
71{
72 _TSS2_SYS_CONTEXT_BLOB *sys_ctx = (_TSS2_SYS_CONTEXT_BLOB*)*state;
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010073 TPM2_CC cc = TPM2_CC_GetCapability;
Tadeusz Struke79d9862017-10-23 13:06:59 -070074 TPM20_Header_In *header = (TPM20_Header_In*)sys_ctx->cmdBuffer;
Philip Tricca81223f42016-07-28 19:50:08 -070075 /* 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 Fuchsbe5899d2017-11-13 17:14:36 +010079 TPMI_ST_COMMAND_TAG tag_net = htons (TPM2_ST_NO_SESSIONS);
Philip Tricca81223f42016-07-28 19:50:08 -070080
Tadeusz Struk5acc5042017-11-16 14:02:26 -080081 CopyCommandHeader (sys_ctx, cc);
Philip Tricca81223f42016-07-28 19:50:08 -070082 assert_int_equal (tag_net, header->tag);
83}
84/**
85 * After a call to CopyCommandHeader the commandCode in the TPM20_Header_In
Tadeusz Struke79d9862017-10-23 13:06:59 -070086 * portion of the cmdBuffer member of the sys context should be the command
Philip Tricca81223f42016-07-28 19:50:08 -070087 * code parameter in network byte order.
88 */
89static void
90CopyCommandHeader_commandcode_unit (void **state)
91{
92 _TSS2_SYS_CONTEXT_BLOB *sys_ctx = (_TSS2_SYS_CONTEXT_BLOB*)*state;
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010093 TPM2_CC cc = TPM2_CC_GetCapability;
94 TPM2_CC cc_net = htonl (cc);
Tadeusz Struke79d9862017-10-23 13:06:59 -070095 TPM20_Header_In *header = (TPM20_Header_In*)sys_ctx->cmdBuffer;
Philip Tricca81223f42016-07-28 19:50:08 -070096
Tadeusz Struk5acc5042017-11-16 14:02:26 -080097 CopyCommandHeader (sys_ctx, cc);
Philip Tricca81223f42016-07-28 19:50:08 -070098 assert_int_equal (cc_net, header->commandCode);
99}
100
101int
102main (int argc, char* argv[])
103{
Tadeusz Struk2147c492017-08-09 13:40:31 -0700104 const struct CMUnitTest tests[] = {
105 cmocka_unit_test_setup_teardown (CopyCommandHeader_nextData_unit,
Philip Tricca81223f42016-07-28 19:50:08 -0700106 CopyCommandHeader_sys_setup,
107 CopyCommandHeader_sys_teardown),
Tadeusz Struk2147c492017-08-09 13:40:31 -0700108 cmocka_unit_test_setup_teardown (CopyCommandHeader_tag_unit,
Philip Tricca81223f42016-07-28 19:50:08 -0700109 CopyCommandHeader_sys_setup,
110 CopyCommandHeader_sys_teardown),
Tadeusz Struk2147c492017-08-09 13:40:31 -0700111 cmocka_unit_test_setup_teardown (CopyCommandHeader_commandcode_unit,
Philip Tricca81223f42016-07-28 19:50:08 -0700112 CopyCommandHeader_sys_setup,
113 CopyCommandHeader_sys_teardown),
114 };
Tadeusz Struk2147c492017-08-09 13:40:31 -0700115 return cmocka_run_group_tests (tests, NULL, NULL);
Philip Tricca81223f42016-07-28 19:50:08 -0700116}