xref: /aosp_15_r20/external/tpm2-tss/test/unit/sys-execute.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
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