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