1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag * Copyright 2019, Intel Corporation
4*758e9fbaSOystein Eftevaag *
5*758e9fbaSOystein Eftevaag * All rights reserved.
6*758e9fbaSOystein Eftevaag ******************************************************************************/
7*758e9fbaSOystein Eftevaag
8*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
9*758e9fbaSOystein Eftevaag #include <config.h>
10*758e9fbaSOystein Eftevaag #endif
11*758e9fbaSOystein Eftevaag
12*758e9fbaSOystein Eftevaag #include <stdarg.h>
13*758e9fbaSOystein Eftevaag #include <inttypes.h>
14*758e9fbaSOystein Eftevaag #include <string.h>
15*758e9fbaSOystein Eftevaag #include <stdlib.h>
16*758e9fbaSOystein Eftevaag #include <setjmp.h>
17*758e9fbaSOystein Eftevaag #include <cmocka.h>
18*758e9fbaSOystein Eftevaag
19*758e9fbaSOystein Eftevaag #include "tss2_sys.h"
20*758e9fbaSOystein Eftevaag #include "sysapi_util.h"
21*758e9fbaSOystein Eftevaag #include "tss2-tcti/tcti-common.h"
22*758e9fbaSOystein Eftevaag
23*758e9fbaSOystein Eftevaag
24*758e9fbaSOystein Eftevaag #define LOGMODULE test
25*758e9fbaSOystein Eftevaag #include "util/log.h"
26*758e9fbaSOystein Eftevaag
27*758e9fbaSOystein Eftevaag /**
28*758e9fbaSOystein Eftevaag * Test calls Tss2_Sys_Execute() many times after receiving TPM2_RC_RETRY
29*758e9fbaSOystein Eftevaag */
30*758e9fbaSOystein Eftevaag
31*758e9fbaSOystein Eftevaag const uint8_t ok_response[] = {
32*758e9fbaSOystein Eftevaag 0x80, 0x01, /* TPM_ST_NO_SESSION */
33*758e9fbaSOystein Eftevaag 0x00, 0x00, 0x00, 0x2C, /* Response Size 10 + 2 + 32 */
34*758e9fbaSOystein Eftevaag 0x00, 0x00, 0x00, 0x00, /* TPM_RC_SUCCESS */
35*758e9fbaSOystein Eftevaag 0x00, 0x20, /* size of buffer */
36*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef,
37*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef,
38*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef,
39*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef,
40*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef,
41*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef,
42*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef,
43*758e9fbaSOystein Eftevaag 0xde, 0xad, 0xbe, 0xef,
44*758e9fbaSOystein Eftevaag };
45*758e9fbaSOystein Eftevaag
46*758e9fbaSOystein Eftevaag const uint8_t retry_response[] = {
47*758e9fbaSOystein Eftevaag 0x80, 0x01, /* TPM_ST_NO_SESSION */
48*758e9fbaSOystein Eftevaag 0x00, 0x00, 0x00, 0x0A, /* Response Size 10 */
49*758e9fbaSOystein Eftevaag 0x00, 0x00, 0x09, 0x22 /* TPM2_RC_RETRY */
50*758e9fbaSOystein Eftevaag };
51*758e9fbaSOystein Eftevaag
52*758e9fbaSOystein Eftevaag static TSS2_RC
tcti_transmit(TSS2_TCTI_CONTEXT * tctiContext,size_t size,uint8_t const * command)53*758e9fbaSOystein Eftevaag tcti_transmit(
54*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
55*758e9fbaSOystein Eftevaag size_t size,
56*758e9fbaSOystein Eftevaag uint8_t const *command)
57*758e9fbaSOystein Eftevaag {
58*758e9fbaSOystein Eftevaag TSS2_RC r = 0;
59*758e9fbaSOystein Eftevaag tpm_header_t hdr;
60*758e9fbaSOystein Eftevaag
61*758e9fbaSOystein Eftevaag LOG_DEBUG ("%s: transmiting %zu bytes", __func__, size);
62*758e9fbaSOystein Eftevaag r = header_unmarshal (command, &hdr);
63*758e9fbaSOystein Eftevaag if (r)
64*758e9fbaSOystein Eftevaag return r;
65*758e9fbaSOystein Eftevaag
66*758e9fbaSOystein Eftevaag LOG_DEBUG ("%s request_hdr.tag = %x", __func__, hdr.tag);
67*758e9fbaSOystein Eftevaag LOG_DEBUG ("%s request_hdr.size = %x", __func__, hdr.size);
68*758e9fbaSOystein Eftevaag LOG_DEBUG ("%s request_hdr.code = %x", __func__, hdr.code);
69*758e9fbaSOystein Eftevaag
70*758e9fbaSOystein Eftevaag if (hdr.tag != TPM2_ST_NO_SESSIONS || hdr.size != 0xC || hdr.code != 0x17B)
71*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_VALUE;
72*758e9fbaSOystein Eftevaag
73*758e9fbaSOystein Eftevaag return r;
74*758e9fbaSOystein Eftevaag }
75*758e9fbaSOystein Eftevaag
76*758e9fbaSOystein Eftevaag #define NUM_OF_RETRIES 4
77*758e9fbaSOystein Eftevaag
78*758e9fbaSOystein Eftevaag static TSS2_RC
tcti_receive(TSS2_TCTI_CONTEXT * tctiContext,size_t * size,uint8_t * response,int32_t timeout)79*758e9fbaSOystein Eftevaag tcti_receive(
80*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext,
81*758e9fbaSOystein Eftevaag size_t *size,
82*758e9fbaSOystein Eftevaag uint8_t *response,
83*758e9fbaSOystein Eftevaag int32_t timeout)
84*758e9fbaSOystein Eftevaag {
85*758e9fbaSOystein Eftevaag static int i;
86*758e9fbaSOystein Eftevaag
87*758e9fbaSOystein Eftevaag LOG_DEBUG ("%s: receiving response, size %zu, buff %p",
88*758e9fbaSOystein Eftevaag __func__, sizeof(ok_response), response);
89*758e9fbaSOystein Eftevaag
90*758e9fbaSOystein Eftevaag if (response == NULL) {
91*758e9fbaSOystein Eftevaag *size = sizeof(ok_response);
92*758e9fbaSOystein Eftevaag return TPM2_RC_SUCCESS;
93*758e9fbaSOystein Eftevaag }
94*758e9fbaSOystein Eftevaag
95*758e9fbaSOystein Eftevaag if (i++ < NUM_OF_RETRIES) {
96*758e9fbaSOystein Eftevaag LOG_DEBUG ("%s: return RC_RETRY", __func__);
97*758e9fbaSOystein Eftevaag memcpy(response, retry_response, sizeof(retry_response));
98*758e9fbaSOystein Eftevaag *size = sizeof(retry_response);
99*758e9fbaSOystein Eftevaag return TPM2_RC_SUCCESS;
100*758e9fbaSOystein Eftevaag }
101*758e9fbaSOystein Eftevaag memcpy(response, ok_response, sizeof(ok_response));
102*758e9fbaSOystein Eftevaag *size = sizeof(ok_response);
103*758e9fbaSOystein Eftevaag return TPM2_RC_SUCCESS;
104*758e9fbaSOystein Eftevaag }
105*758e9fbaSOystein Eftevaag
106*758e9fbaSOystein Eftevaag static TSS2_ABI_VERSION ver = TSS2_ABI_VERSION_CURRENT;
107*758e9fbaSOystein Eftevaag static TSS2_TCTI_CONTEXT_COMMON_V1 _tcti_v1_ctx;
108*758e9fbaSOystein Eftevaag
109*758e9fbaSOystein Eftevaag static int
setup(void ** state)110*758e9fbaSOystein Eftevaag setup(void **state)
111*758e9fbaSOystein Eftevaag {
112*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sys_ctx;
113*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti_ctx = (TSS2_TCTI_CONTEXT *) &_tcti_v1_ctx;
114*758e9fbaSOystein Eftevaag UINT32 size_ctx;
115*758e9fbaSOystein Eftevaag TSS2_RC r;
116*758e9fbaSOystein Eftevaag
117*758e9fbaSOystein Eftevaag size_ctx = Tss2_Sys_GetContextSize(0);
118*758e9fbaSOystein Eftevaag sys_ctx = calloc (1, size_ctx);
119*758e9fbaSOystein Eftevaag assert_non_null (sys_ctx);
120*758e9fbaSOystein Eftevaag _tcti_v1_ctx.version = 1;
121*758e9fbaSOystein Eftevaag _tcti_v1_ctx.transmit = tcti_transmit;
122*758e9fbaSOystein Eftevaag _tcti_v1_ctx.receive = tcti_receive;
123*758e9fbaSOystein Eftevaag
124*758e9fbaSOystein Eftevaag r = Tss2_Sys_Initialize(sys_ctx, size_ctx, tcti_ctx, &ver);
125*758e9fbaSOystein Eftevaag assert_int_equal (r, TSS2_RC_SUCCESS);
126*758e9fbaSOystein Eftevaag
127*758e9fbaSOystein Eftevaag *state = sys_ctx;
128*758e9fbaSOystein Eftevaag
129*758e9fbaSOystein Eftevaag return 0;
130*758e9fbaSOystein Eftevaag }
131*758e9fbaSOystein Eftevaag
132*758e9fbaSOystein Eftevaag static int
teardown(void ** state)133*758e9fbaSOystein Eftevaag teardown(void **state)
134*758e9fbaSOystein Eftevaag {
135*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sys_ctx = (TSS2_SYS_CONTEXT *)*state;
136*758e9fbaSOystein Eftevaag
137*758e9fbaSOystein Eftevaag if (sys_ctx)
138*758e9fbaSOystein Eftevaag free (sys_ctx);
139*758e9fbaSOystein Eftevaag
140*758e9fbaSOystein Eftevaag return 0;
141*758e9fbaSOystein Eftevaag }
142*758e9fbaSOystein Eftevaag
143*758e9fbaSOystein Eftevaag static void
test_resubmit(void ** state)144*758e9fbaSOystein Eftevaag test_resubmit(void **state)
145*758e9fbaSOystein Eftevaag {
146*758e9fbaSOystein Eftevaag TSS2_RC r = 0;
147*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sys_ctx = (TSS2_SYS_CONTEXT *)*state;
148*758e9fbaSOystein Eftevaag int ctr = 0;
149*758e9fbaSOystein Eftevaag
150*758e9fbaSOystein Eftevaag r = Tss2_Sys_GetRandom_Prepare(sys_ctx, 32);
151*758e9fbaSOystein Eftevaag assert_int_equal(r, TSS2_RC_SUCCESS);
152*758e9fbaSOystein Eftevaag do {
153*758e9fbaSOystein Eftevaag r = Tss2_Sys_Execute(sys_ctx);
154*758e9fbaSOystein Eftevaag } while (r == TPM2_RC_RETRY && ctr++ < 10);
155*758e9fbaSOystein Eftevaag
156*758e9fbaSOystein Eftevaag assert_int_equal(r, TSS2_RC_SUCCESS);
157*758e9fbaSOystein Eftevaag assert_int_equal(ctr, NUM_OF_RETRIES);
158*758e9fbaSOystein Eftevaag return;
159*758e9fbaSOystein Eftevaag }
160*758e9fbaSOystein Eftevaag
161*758e9fbaSOystein Eftevaag int
main(int argc,char * argv[])162*758e9fbaSOystein Eftevaag main(int argc, char *argv[])
163*758e9fbaSOystein Eftevaag {
164*758e9fbaSOystein Eftevaag const struct CMUnitTest tests[] = {
165*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown(test_resubmit, setup, teardown),
166*758e9fbaSOystein Eftevaag };
167*758e9fbaSOystein Eftevaag return cmocka_run_group_tests(tests, NULL, NULL);
168*758e9fbaSOystein Eftevaag }
169