1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
4*758e9fbaSOystein Eftevaag * All rights reserved.
5*758e9fbaSOystein Eftevaag *******************************************************************************/
6*758e9fbaSOystein Eftevaag
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag
11*758e9fbaSOystein Eftevaag #include <stdlib.h>
12*758e9fbaSOystein Eftevaag
13*758e9fbaSOystein Eftevaag #include "tss2_esys.h"
14*758e9fbaSOystein Eftevaag
15*758e9fbaSOystein Eftevaag #include "esys_iutil.h"
16*758e9fbaSOystein Eftevaag #define LOGMODULE test
17*758e9fbaSOystein Eftevaag #include "util/log.h"
18*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
19*758e9fbaSOystein Eftevaag
20*758e9fbaSOystein Eftevaag /** Test the ESAPI commands HashSequenceStart, SequenceUpdate,
21*758e9fbaSOystein Eftevaag * and SequenceComplete.
22*758e9fbaSOystein Eftevaag *
23*758e9fbaSOystein Eftevaag * Tested ESAPI commands:
24*758e9fbaSOystein Eftevaag * - Esys_FlushContext() (M)
25*758e9fbaSOystein Eftevaag * - Esys_HashSequenceStart() (M)
26*758e9fbaSOystein Eftevaag * - Esys_SequenceComplete() (M)
27*758e9fbaSOystein Eftevaag * - Esys_SequenceUpdate() (M)
28*758e9fbaSOystein Eftevaag * - Esys_StartAuthSession() (M)
29*758e9fbaSOystein Eftevaag *
30*758e9fbaSOystein Eftevaag * Used compiler defines: TEST_SESSION
31*758e9fbaSOystein Eftevaag *
32*758e9fbaSOystein Eftevaag * @param[in,out] esys_context The ESYS_CONTEXT.
33*758e9fbaSOystein Eftevaag * @retval EXIT_FAILURE
34*758e9fbaSOystein Eftevaag * @retval EXIT_SUCCESS
35*758e9fbaSOystein Eftevaag */
36*758e9fbaSOystein Eftevaag
37*758e9fbaSOystein Eftevaag int
test_esys_hashsequencestart(ESYS_CONTEXT * esys_context)38*758e9fbaSOystein Eftevaag test_esys_hashsequencestart(ESYS_CONTEXT * esys_context)
39*758e9fbaSOystein Eftevaag {
40*758e9fbaSOystein Eftevaag TSS2_RC r;
41*758e9fbaSOystein Eftevaag
42*758e9fbaSOystein Eftevaag TPM2B_DIGEST *result = NULL;
43*758e9fbaSOystein Eftevaag TPMT_TK_HASHCHECK *validation = NULL;
44*758e9fbaSOystein Eftevaag
45*758e9fbaSOystein Eftevaag #ifdef TEST_SESSION
46*758e9fbaSOystein Eftevaag ESYS_TR session = ESYS_TR_NONE;
47*758e9fbaSOystein Eftevaag TPMT_SYM_DEF symmetric = {.algorithm = TPM2_ALG_AES,
48*758e9fbaSOystein Eftevaag .keyBits = {.aes = 128},
49*758e9fbaSOystein Eftevaag .mode = {.aes = TPM2_ALG_CFB}
50*758e9fbaSOystein Eftevaag };
51*758e9fbaSOystein Eftevaag TPMA_SESSION sessionAttributes;
52*758e9fbaSOystein Eftevaag TPM2B_NONCE nonceCaller = {
53*758e9fbaSOystein Eftevaag .size = 20,
54*758e9fbaSOystein Eftevaag .buffer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
55*758e9fbaSOystein Eftevaag 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
56*758e9fbaSOystein Eftevaag };
57*758e9fbaSOystein Eftevaag
58*758e9fbaSOystein Eftevaag memset(&sessionAttributes, 0, sizeof sessionAttributes);
59*758e9fbaSOystein Eftevaag
60*758e9fbaSOystein Eftevaag r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
61*758e9fbaSOystein Eftevaag ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
62*758e9fbaSOystein Eftevaag &nonceCaller,
63*758e9fbaSOystein Eftevaag TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA1,
64*758e9fbaSOystein Eftevaag &session);
65*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During initialization of session", error);
66*758e9fbaSOystein Eftevaag #endif /* TEST_SESSION */
67*758e9fbaSOystein Eftevaag
68*758e9fbaSOystein Eftevaag TPM2B_AUTH auth = {.size = 20,
69*758e9fbaSOystein Eftevaag .buffer={10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
70*758e9fbaSOystein Eftevaag 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}};
71*758e9fbaSOystein Eftevaag
72*758e9fbaSOystein Eftevaag TPMI_ALG_HASH hashAlg = TPM2_ALG_SHA256;
73*758e9fbaSOystein Eftevaag ESYS_TR sequenceHandle_handle;
74*758e9fbaSOystein Eftevaag
75*758e9fbaSOystein Eftevaag r = Esys_HashSequenceStart(esys_context,
76*758e9fbaSOystein Eftevaag ESYS_TR_NONE,
77*758e9fbaSOystein Eftevaag ESYS_TR_NONE,
78*758e9fbaSOystein Eftevaag ESYS_TR_NONE,
79*758e9fbaSOystein Eftevaag &auth,
80*758e9fbaSOystein Eftevaag hashAlg,
81*758e9fbaSOystein Eftevaag &sequenceHandle_handle
82*758e9fbaSOystein Eftevaag );
83*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: HashSequenceStart", error);
84*758e9fbaSOystein Eftevaag
85*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER buffer = {.size = 20,
86*758e9fbaSOystein Eftevaag .buffer={10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
87*758e9fbaSOystein Eftevaag 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}};
88*758e9fbaSOystein Eftevaag
89*758e9fbaSOystein Eftevaag r = Esys_TR_SetAuth(esys_context, sequenceHandle_handle, &auth);
90*758e9fbaSOystein Eftevaag goto_if_error(r, "Error esys TR_SetAuth ", error);
91*758e9fbaSOystein Eftevaag
92*758e9fbaSOystein Eftevaag r = Esys_SequenceUpdate(esys_context,
93*758e9fbaSOystein Eftevaag sequenceHandle_handle,
94*758e9fbaSOystein Eftevaag #ifdef TEST_SESSION
95*758e9fbaSOystein Eftevaag session,
96*758e9fbaSOystein Eftevaag #else
97*758e9fbaSOystein Eftevaag ESYS_TR_PASSWORD,
98*758e9fbaSOystein Eftevaag #endif
99*758e9fbaSOystein Eftevaag ESYS_TR_NONE,
100*758e9fbaSOystein Eftevaag ESYS_TR_NONE,
101*758e9fbaSOystein Eftevaag &buffer
102*758e9fbaSOystein Eftevaag );
103*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: SequenceUpdate", error);
104*758e9fbaSOystein Eftevaag
105*758e9fbaSOystein Eftevaag r = Esys_SequenceComplete(esys_context,
106*758e9fbaSOystein Eftevaag sequenceHandle_handle,
107*758e9fbaSOystein Eftevaag #ifdef TEST_SESSION
108*758e9fbaSOystein Eftevaag session,
109*758e9fbaSOystein Eftevaag #else
110*758e9fbaSOystein Eftevaag ESYS_TR_PASSWORD,
111*758e9fbaSOystein Eftevaag #endif
112*758e9fbaSOystein Eftevaag ESYS_TR_NONE,
113*758e9fbaSOystein Eftevaag ESYS_TR_NONE,
114*758e9fbaSOystein Eftevaag &buffer,
115*758e9fbaSOystein Eftevaag TPM2_RH_OWNER,
116*758e9fbaSOystein Eftevaag &result,
117*758e9fbaSOystein Eftevaag &validation
118*758e9fbaSOystein Eftevaag );
119*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: SequenceComplete", error);
120*758e9fbaSOystein Eftevaag
121*758e9fbaSOystein Eftevaag #ifdef TEST_SESSION
122*758e9fbaSOystein Eftevaag r = Esys_FlushContext(esys_context, session);
123*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: FlushContext", error);
124*758e9fbaSOystein Eftevaag #endif
125*758e9fbaSOystein Eftevaag
126*758e9fbaSOystein Eftevaag Esys_Free(result);
127*758e9fbaSOystein Eftevaag Esys_Free(validation);
128*758e9fbaSOystein Eftevaag return EXIT_SUCCESS;
129*758e9fbaSOystein Eftevaag
130*758e9fbaSOystein Eftevaag error:
131*758e9fbaSOystein Eftevaag
132*758e9fbaSOystein Eftevaag #ifdef TEST_SESSION
133*758e9fbaSOystein Eftevaag if (session != ESYS_TR_NONE) {
134*758e9fbaSOystein Eftevaag if (Esys_FlushContext(esys_context, session) != TSS2_RC_SUCCESS) {
135*758e9fbaSOystein Eftevaag LOG_ERROR("Cleanup session failed.");
136*758e9fbaSOystein Eftevaag }
137*758e9fbaSOystein Eftevaag }
138*758e9fbaSOystein Eftevaag #endif
139*758e9fbaSOystein Eftevaag Esys_Free(result);
140*758e9fbaSOystein Eftevaag Esys_Free(validation);
141*758e9fbaSOystein Eftevaag return EXIT_FAILURE;
142*758e9fbaSOystein Eftevaag }
143*758e9fbaSOystein Eftevaag
144*758e9fbaSOystein Eftevaag int
test_invoke_esapi(ESYS_CONTEXT * esys_context)145*758e9fbaSOystein Eftevaag test_invoke_esapi(ESYS_CONTEXT * esys_context) {
146*758e9fbaSOystein Eftevaag return test_esys_hashsequencestart(esys_context);
147*758e9fbaSOystein Eftevaag }
148