1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag * Copyright (c) 2020, Intel Corporation
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 #include "test-esapi.h"
17*758e9fbaSOystein Eftevaag #define LOGDEFAULT LOGLEVEL_INFO
18*758e9fbaSOystein Eftevaag #define LOGMODULE test
19*758e9fbaSOystein Eftevaag #include "util/log.h"
20*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
21*758e9fbaSOystein Eftevaag
22*758e9fbaSOystein Eftevaag /** Test auth verification in clear command
23*758e9fbaSOystein Eftevaag *
24*758e9fbaSOystein Eftevaag * After TPM2_Clear command is executed all auth values for
25*758e9fbaSOystein Eftevaag * owner, platofrm and lockout are set to empty buffers and
26*758e9fbaSOystein Eftevaag * the empty auth values should be used fot HMAC verification
27*758e9fbaSOystein Eftevaag * in the response.
28*758e9fbaSOystein Eftevaag *
29*758e9fbaSOystein Eftevaag * @param[in,out] esys_context The ESYS_CONTEXT.
30*758e9fbaSOystein Eftevaag * @retval EXIT_SUCCESS
31*758e9fbaSOystein Eftevaag * @retval EXIT_SKIP
32*758e9fbaSOystein Eftevaag * @retval EXIT_FAILURE
33*758e9fbaSOystein Eftevaag */
34*758e9fbaSOystein Eftevaag int
test_esys_clear_auth(ESYS_CONTEXT * esys_context)35*758e9fbaSOystein Eftevaag test_esys_clear_auth(ESYS_CONTEXT * esys_context)
36*758e9fbaSOystein Eftevaag {
37*758e9fbaSOystein Eftevaag TSS2_RC r;
38*758e9fbaSOystein Eftevaag ESYS_TR session = ESYS_TR_NONE;
39*758e9fbaSOystein Eftevaag int failure_return = EXIT_FAILURE;
40*758e9fbaSOystein Eftevaag
41*758e9fbaSOystein Eftevaag TPMT_SYM_DEF symmetric = {.algorithm = TPM2_ALG_XOR,
42*758e9fbaSOystein Eftevaag .keyBits = { .exclusiveOr = TPM2_ALG_SHA1 },
43*758e9fbaSOystein Eftevaag .mode = {.aes = TPM2_ALG_CFB}};
44*758e9fbaSOystein Eftevaag
45*758e9fbaSOystein Eftevaag /* Test lockout authorization */
46*758e9fbaSOystein Eftevaag LOG_DEBUG("Test LOCKOUT authorization");
47*758e9fbaSOystein Eftevaag LOG_DEBUG("Start Auth Session");
48*758e9fbaSOystein Eftevaag r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
49*758e9fbaSOystein Eftevaag ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
50*758e9fbaSOystein Eftevaag NULL,
51*758e9fbaSOystein Eftevaag TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA1,
52*758e9fbaSOystein Eftevaag &session);
53*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During initialization of session", error);
54*758e9fbaSOystein Eftevaag
55*758e9fbaSOystein Eftevaag TPM2B_AUTH auth = {
56*758e9fbaSOystein Eftevaag .size = 16,
57*758e9fbaSOystein Eftevaag .buffer = "deadbeefdeadbeef",
58*758e9fbaSOystein Eftevaag };
59*758e9fbaSOystein Eftevaag
60*758e9fbaSOystein Eftevaag LOG_DEBUG("Set Auth");
61*758e9fbaSOystein Eftevaag r = Esys_HierarchyChangeAuth(esys_context, ESYS_TR_RH_LOCKOUT,
62*758e9fbaSOystein Eftevaag ESYS_TR_PASSWORD, ESYS_TR_NONE, ESYS_TR_NONE,
63*758e9fbaSOystein Eftevaag &auth);
64*758e9fbaSOystein Eftevaag
65*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During Esys_ObjectChangeAuth", error);
66*758e9fbaSOystein Eftevaag Esys_TR_SetAuth(esys_context, ESYS_TR_RH_LOCKOUT, &auth);
67*758e9fbaSOystein Eftevaag
68*758e9fbaSOystein Eftevaag LOG_DEBUG("Clear");
69*758e9fbaSOystein Eftevaag r = Esys_Clear(esys_context, ESYS_TR_RH_LOCKOUT, session,
70*758e9fbaSOystein Eftevaag ESYS_TR_NONE, ESYS_TR_NONE);
71*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During Esys_Clear", error);
72*758e9fbaSOystein Eftevaag
73*758e9fbaSOystein Eftevaag r = Esys_FlushContext(esys_context, session);
74*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During Esys_FlushContext", error);
75*758e9fbaSOystein Eftevaag
76*758e9fbaSOystein Eftevaag /* Test platform authorization */
77*758e9fbaSOystein Eftevaag LOG_DEBUG("Test PLATFORM authorization");
78*758e9fbaSOystein Eftevaag LOG_DEBUG("Start Auth Session");
79*758e9fbaSOystein Eftevaag r = Esys_StartAuthSession(esys_context, ESYS_TR_NONE, ESYS_TR_NONE,
80*758e9fbaSOystein Eftevaag ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
81*758e9fbaSOystein Eftevaag NULL,
82*758e9fbaSOystein Eftevaag TPM2_SE_HMAC, &symmetric, TPM2_ALG_SHA1,
83*758e9fbaSOystein Eftevaag &session);
84*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During initialization of session", error);
85*758e9fbaSOystein Eftevaag
86*758e9fbaSOystein Eftevaag LOG_DEBUG("Set Auth");
87*758e9fbaSOystein Eftevaag r = Esys_HierarchyChangeAuth(esys_context, ESYS_TR_RH_PLATFORM,
88*758e9fbaSOystein Eftevaag ESYS_TR_PASSWORD, ESYS_TR_NONE, ESYS_TR_NONE,
89*758e9fbaSOystein Eftevaag &auth);
90*758e9fbaSOystein Eftevaag
91*758e9fbaSOystein Eftevaag if ((r & ~TPM2_RC_N_MASK) == TPM2_RC_BAD_AUTH ||
92*758e9fbaSOystein Eftevaag (r & ~TPM2_RC_N_MASK) == TPM2_RC_HIERARCHY) {
93*758e9fbaSOystein Eftevaag /* Platform authorization not possible test will be skipped */
94*758e9fbaSOystein Eftevaag LOG_WARNING("Platform authorization not possible.");
95*758e9fbaSOystein Eftevaag failure_return = EXIT_SKIP;
96*758e9fbaSOystein Eftevaag goto error;
97*758e9fbaSOystein Eftevaag }
98*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During Esys_ObjectChangeAuth", error);
99*758e9fbaSOystein Eftevaag
100*758e9fbaSOystein Eftevaag Esys_TR_SetAuth(esys_context, ESYS_TR_RH_PLATFORM, &auth);
101*758e9fbaSOystein Eftevaag
102*758e9fbaSOystein Eftevaag LOG_DEBUG("Clear");
103*758e9fbaSOystein Eftevaag r = Esys_Clear(esys_context, ESYS_TR_RH_PLATFORM, session,
104*758e9fbaSOystein Eftevaag ESYS_TR_NONE, ESYS_TR_NONE);
105*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During Esys_Clear", error);
106*758e9fbaSOystein Eftevaag
107*758e9fbaSOystein Eftevaag r = Esys_FlushContext(esys_context, session);
108*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During Esys_FlushContext", error);
109*758e9fbaSOystein Eftevaag
110*758e9fbaSOystein Eftevaag Esys_TR_SetAuth(esys_context, ESYS_TR_RH_PLATFORM, &auth);
111*758e9fbaSOystein Eftevaag
112*758e9fbaSOystein Eftevaag LOG_DEBUG("Set Auth");
113*758e9fbaSOystein Eftevaag r = Esys_HierarchyChangeAuth(esys_context, ESYS_TR_RH_PLATFORM,
114*758e9fbaSOystein Eftevaag ESYS_TR_PASSWORD, ESYS_TR_NONE, ESYS_TR_NONE,
115*758e9fbaSOystein Eftevaag NULL);
116*758e9fbaSOystein Eftevaag
117*758e9fbaSOystein Eftevaag goto_if_error(r, "Error: During Esys_ObjectChangeAuth", error);
118*758e9fbaSOystein Eftevaag
119*758e9fbaSOystein Eftevaag return EXIT_SUCCESS;
120*758e9fbaSOystein Eftevaag
121*758e9fbaSOystein Eftevaag error:
122*758e9fbaSOystein Eftevaag LOG_ERROR("\nError Code: %x\n", r);
123*758e9fbaSOystein Eftevaag
124*758e9fbaSOystein Eftevaag if (session != ESYS_TR_NONE) {
125*758e9fbaSOystein Eftevaag if (Esys_FlushContext(esys_context, session) != TSS2_RC_SUCCESS) {
126*758e9fbaSOystein Eftevaag LOG_ERROR("Cleanup session failed.");
127*758e9fbaSOystein Eftevaag }
128*758e9fbaSOystein Eftevaag }
129*758e9fbaSOystein Eftevaag return failure_return;
130*758e9fbaSOystein Eftevaag }
131*758e9fbaSOystein Eftevaag
132*758e9fbaSOystein Eftevaag int
test_invoke_esapi(ESYS_CONTEXT * esys_context)133*758e9fbaSOystein Eftevaag test_invoke_esapi(ESYS_CONTEXT * esys_context) {
134*758e9fbaSOystein Eftevaag return test_esys_clear_auth(esys_context);
135*758e9fbaSOystein Eftevaag }
136