1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /***********************************************************************;
3*758e9fbaSOystein Eftevaag * Copyright (c) 2015-2018, 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 <string.h>
13*758e9fbaSOystein Eftevaag
14*758e9fbaSOystein Eftevaag #include "tss2_mu.h"
15*758e9fbaSOystein Eftevaag #include "sysapi_util.h"
16*758e9fbaSOystein Eftevaag #include "util/tss2_endian.h"
17*758e9fbaSOystein Eftevaag #define LOGMODULE sys
18*758e9fbaSOystein Eftevaag #include "util/log.h"
19*758e9fbaSOystein Eftevaag
InitSysContextFields(_TSS2_SYS_CONTEXT_BLOB * ctx)20*758e9fbaSOystein Eftevaag void InitSysContextFields(_TSS2_SYS_CONTEXT_BLOB *ctx)
21*758e9fbaSOystein Eftevaag {
22*758e9fbaSOystein Eftevaag ctx->decryptAllowed = 0;
23*758e9fbaSOystein Eftevaag ctx->encryptAllowed = 0;
24*758e9fbaSOystein Eftevaag ctx->decryptNull = 0;
25*758e9fbaSOystein Eftevaag ctx->authAllowed = 0;
26*758e9fbaSOystein Eftevaag ctx->nextData = 0;
27*758e9fbaSOystein Eftevaag }
28*758e9fbaSOystein Eftevaag
InitSysContextPtrs(_TSS2_SYS_CONTEXT_BLOB * ctx,size_t contextSize)29*758e9fbaSOystein Eftevaag void InitSysContextPtrs(
30*758e9fbaSOystein Eftevaag _TSS2_SYS_CONTEXT_BLOB *ctx,
31*758e9fbaSOystein Eftevaag size_t contextSize)
32*758e9fbaSOystein Eftevaag {
33*758e9fbaSOystein Eftevaag ctx->cmdBuffer = (UINT8 *)ctx + sizeof(_TSS2_SYS_CONTEXT_BLOB);
34*758e9fbaSOystein Eftevaag ctx->maxCmdSize = contextSize - sizeof(_TSS2_SYS_CONTEXT_BLOB);
35*758e9fbaSOystein Eftevaag }
36*758e9fbaSOystein Eftevaag
GetCommandSize(_TSS2_SYS_CONTEXT_BLOB * ctx)37*758e9fbaSOystein Eftevaag UINT32 GetCommandSize(_TSS2_SYS_CONTEXT_BLOB *ctx)
38*758e9fbaSOystein Eftevaag {
39*758e9fbaSOystein Eftevaag return BE_TO_HOST_32(req_header_from_cxt(ctx)->commandSize);
40*758e9fbaSOystein Eftevaag }
41*758e9fbaSOystein Eftevaag
CopyCommandHeader(_TSS2_SYS_CONTEXT_BLOB * ctx,TPM2_CC commandCode)42*758e9fbaSOystein Eftevaag TSS2_RC CopyCommandHeader(_TSS2_SYS_CONTEXT_BLOB *ctx, TPM2_CC commandCode)
43*758e9fbaSOystein Eftevaag {
44*758e9fbaSOystein Eftevaag TSS2_RC rval;
45*758e9fbaSOystein Eftevaag
46*758e9fbaSOystein Eftevaag if (!ctx)
47*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_REFERENCE;
48*758e9fbaSOystein Eftevaag
49*758e9fbaSOystein Eftevaag ctx->nextData = 0;
50*758e9fbaSOystein Eftevaag
51*758e9fbaSOystein Eftevaag rval = Tss2_MU_TPM2_ST_Marshal(TPM2_ST_NO_SESSIONS, ctx->cmdBuffer,
52*758e9fbaSOystein Eftevaag ctx->maxCmdSize,
53*758e9fbaSOystein Eftevaag &ctx->nextData);
54*758e9fbaSOystein Eftevaag if (rval)
55*758e9fbaSOystein Eftevaag return rval;
56*758e9fbaSOystein Eftevaag
57*758e9fbaSOystein Eftevaag req_header_from_cxt(ctx)->commandCode = HOST_TO_BE_32(commandCode);
58*758e9fbaSOystein Eftevaag ctx->nextData = sizeof(TPM20_Header_In);
59*758e9fbaSOystein Eftevaag return rval;
60*758e9fbaSOystein Eftevaag }
61*758e9fbaSOystein Eftevaag
62*758e9fbaSOystein Eftevaag static int GetNumCommandHandles(TPM2_CC commandCode);
63*758e9fbaSOystein Eftevaag static int GetNumResponseHandles(TPM2_CC commandCode);
64*758e9fbaSOystein Eftevaag
CommonPreparePrologue(_TSS2_SYS_CONTEXT_BLOB * ctx,TPM2_CC commandCode)65*758e9fbaSOystein Eftevaag TSS2_RC CommonPreparePrologue(
66*758e9fbaSOystein Eftevaag _TSS2_SYS_CONTEXT_BLOB *ctx,
67*758e9fbaSOystein Eftevaag TPM2_CC commandCode)
68*758e9fbaSOystein Eftevaag {
69*758e9fbaSOystein Eftevaag int numCommandHandles;
70*758e9fbaSOystein Eftevaag TSS2_RC rval;
71*758e9fbaSOystein Eftevaag
72*758e9fbaSOystein Eftevaag if (!ctx)
73*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_REFERENCE;
74*758e9fbaSOystein Eftevaag
75*758e9fbaSOystein Eftevaag InitSysContextFields(ctx);
76*758e9fbaSOystein Eftevaag
77*758e9fbaSOystein Eftevaag /* Need to check stage here. */
78*758e9fbaSOystein Eftevaag if (ctx->previousStage != CMD_STAGE_INITIALIZE &&
79*758e9fbaSOystein Eftevaag ctx->previousStage != CMD_STAGE_RECEIVE_RESPONSE &&
80*758e9fbaSOystein Eftevaag ctx->previousStage != CMD_STAGE_PREPARE)
81*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_SEQUENCE;
82*758e9fbaSOystein Eftevaag
83*758e9fbaSOystein Eftevaag rval = CopyCommandHeader(ctx, commandCode);
84*758e9fbaSOystein Eftevaag if (rval)
85*758e9fbaSOystein Eftevaag return rval;
86*758e9fbaSOystein Eftevaag
87*758e9fbaSOystein Eftevaag ctx->commandCode = commandCode;
88*758e9fbaSOystein Eftevaag ctx->numResponseHandles = GetNumResponseHandles(commandCode);
89*758e9fbaSOystein Eftevaag ctx->rspParamsSize = (UINT32 *)(ctx->cmdBuffer + sizeof(TPM20_Header_Out) +
90*758e9fbaSOystein Eftevaag (GetNumResponseHandles(commandCode) * sizeof(UINT32)));
91*758e9fbaSOystein Eftevaag
92*758e9fbaSOystein Eftevaag numCommandHandles = GetNumCommandHandles(commandCode);
93*758e9fbaSOystein Eftevaag ctx->cpBuffer = ctx->cmdBuffer + ctx->nextData +
94*758e9fbaSOystein Eftevaag (numCommandHandles * sizeof(UINT32));
95*758e9fbaSOystein Eftevaag return rval;
96*758e9fbaSOystein Eftevaag }
97*758e9fbaSOystein Eftevaag
CommonPrepareEpilogue(_TSS2_SYS_CONTEXT_BLOB * ctx)98*758e9fbaSOystein Eftevaag TSS2_RC CommonPrepareEpilogue(_TSS2_SYS_CONTEXT_BLOB *ctx)
99*758e9fbaSOystein Eftevaag {
100*758e9fbaSOystein Eftevaag ctx->cpBufferUsedSize = ctx->cmdBuffer + ctx->nextData - ctx->cpBuffer;
101*758e9fbaSOystein Eftevaag req_header_from_cxt(ctx)->commandSize = HOST_TO_BE_32(ctx->nextData);
102*758e9fbaSOystein Eftevaag ctx->previousStage = CMD_STAGE_PREPARE;
103*758e9fbaSOystein Eftevaag
104*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
105*758e9fbaSOystein Eftevaag }
106*758e9fbaSOystein Eftevaag
CommonComplete(_TSS2_SYS_CONTEXT_BLOB * ctx)107*758e9fbaSOystein Eftevaag TSS2_RC CommonComplete(_TSS2_SYS_CONTEXT_BLOB *ctx)
108*758e9fbaSOystein Eftevaag {
109*758e9fbaSOystein Eftevaag UINT32 rspSize;
110*758e9fbaSOystein Eftevaag TPM2_ST tag;
111*758e9fbaSOystein Eftevaag size_t next = 0;
112*758e9fbaSOystein Eftevaag TSS2_RC rval;
113*758e9fbaSOystein Eftevaag
114*758e9fbaSOystein Eftevaag if (!ctx)
115*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_REFERENCE;
116*758e9fbaSOystein Eftevaag
117*758e9fbaSOystein Eftevaag rspSize = BE_TO_HOST_32(resp_header_from_cxt(ctx)->responseSize);
118*758e9fbaSOystein Eftevaag
119*758e9fbaSOystein Eftevaag if(rspSize > ctx->maxCmdSize) {
120*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_MALFORMED_RESPONSE;
121*758e9fbaSOystein Eftevaag }
122*758e9fbaSOystein Eftevaag
123*758e9fbaSOystein Eftevaag if (ctx->previousStage != CMD_STAGE_RECEIVE_RESPONSE)
124*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_SEQUENCE;
125*758e9fbaSOystein Eftevaag
126*758e9fbaSOystein Eftevaag ctx->nextData = (UINT8 *)ctx->rspParamsSize - ctx->cmdBuffer;
127*758e9fbaSOystein Eftevaag
128*758e9fbaSOystein Eftevaag rval = Tss2_MU_TPM2_ST_Unmarshal(ctx->cmdBuffer,
129*758e9fbaSOystein Eftevaag ctx->maxCmdSize,
130*758e9fbaSOystein Eftevaag &next, &tag);
131*758e9fbaSOystein Eftevaag if (rval)
132*758e9fbaSOystein Eftevaag return rval;
133*758e9fbaSOystein Eftevaag
134*758e9fbaSOystein Eftevaag /* Skipping over response params size field */
135*758e9fbaSOystein Eftevaag if (tag == TPM2_ST_SESSIONS)
136*758e9fbaSOystein Eftevaag rval = Tss2_MU_UINT32_Unmarshal(ctx->cmdBuffer,
137*758e9fbaSOystein Eftevaag ctx->maxCmdSize,
138*758e9fbaSOystein Eftevaag &ctx->nextData,
139*758e9fbaSOystein Eftevaag NULL);
140*758e9fbaSOystein Eftevaag
141*758e9fbaSOystein Eftevaag return rval;
142*758e9fbaSOystein Eftevaag }
143*758e9fbaSOystein Eftevaag
CommonOneCall(_TSS2_SYS_CONTEXT_BLOB * ctx,TSS2L_SYS_AUTH_COMMAND const * cmdAuthsArray,TSS2L_SYS_AUTH_RESPONSE * rspAuthsArray)144*758e9fbaSOystein Eftevaag TSS2_RC CommonOneCall(
145*758e9fbaSOystein Eftevaag _TSS2_SYS_CONTEXT_BLOB *ctx,
146*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND const *cmdAuthsArray,
147*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE *rspAuthsArray)
148*758e9fbaSOystein Eftevaag {
149*758e9fbaSOystein Eftevaag TSS2_RC rval;
150*758e9fbaSOystein Eftevaag
151*758e9fbaSOystein Eftevaag if (cmdAuthsArray) {
152*758e9fbaSOystein Eftevaag rval = Tss2_Sys_SetCmdAuths((TSS2_SYS_CONTEXT *)ctx, cmdAuthsArray);
153*758e9fbaSOystein Eftevaag if (rval)
154*758e9fbaSOystein Eftevaag return rval;
155*758e9fbaSOystein Eftevaag }
156*758e9fbaSOystein Eftevaag
157*758e9fbaSOystein Eftevaag rval = Tss2_Sys_Execute((TSS2_SYS_CONTEXT *)ctx);
158*758e9fbaSOystein Eftevaag if (rval)
159*758e9fbaSOystein Eftevaag return rval;
160*758e9fbaSOystein Eftevaag
161*758e9fbaSOystein Eftevaag if (ctx->rsp_header.responseCode)
162*758e9fbaSOystein Eftevaag return ctx->rsp_header.responseCode;
163*758e9fbaSOystein Eftevaag
164*758e9fbaSOystein Eftevaag if (BE_TO_HOST_16(resp_header_from_cxt(ctx)->tag) ==
165*758e9fbaSOystein Eftevaag TPM2_ST_SESSIONS && rspAuthsArray)
166*758e9fbaSOystein Eftevaag rval = Tss2_Sys_GetRspAuths((TSS2_SYS_CONTEXT *)ctx, rspAuthsArray);
167*758e9fbaSOystein Eftevaag
168*758e9fbaSOystein Eftevaag return rval;
169*758e9fbaSOystein Eftevaag }
170*758e9fbaSOystein Eftevaag
171*758e9fbaSOystein Eftevaag static const COMMAND_HANDLES commandArray[] =
172*758e9fbaSOystein Eftevaag {
173*758e9fbaSOystein Eftevaag { TPM2_CC_Startup, 0, 0 },
174*758e9fbaSOystein Eftevaag { TPM2_CC_Shutdown, 0, 0 },
175*758e9fbaSOystein Eftevaag { TPM2_CC_SelfTest, 0, 0 },
176*758e9fbaSOystein Eftevaag { TPM2_CC_IncrementalSelfTest, 0, 0 },
177*758e9fbaSOystein Eftevaag { TPM2_CC_GetTestResult, 0, 0 },
178*758e9fbaSOystein Eftevaag { TPM2_CC_StartAuthSession, 2, 1 },
179*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyRestart, 1, 0 },
180*758e9fbaSOystein Eftevaag { TPM2_CC_Create, 1, 0 },
181*758e9fbaSOystein Eftevaag { TPM2_CC_Load, 1, 1 },
182*758e9fbaSOystein Eftevaag { TPM2_CC_LoadExternal, 0, 1 },
183*758e9fbaSOystein Eftevaag { TPM2_CC_ReadPublic, 1, 0 },
184*758e9fbaSOystein Eftevaag { TPM2_CC_ActivateCredential, 2, 0 },
185*758e9fbaSOystein Eftevaag { TPM2_CC_MakeCredential, 1, 0 },
186*758e9fbaSOystein Eftevaag { TPM2_CC_Unseal, 1, 0 },
187*758e9fbaSOystein Eftevaag { TPM2_CC_ObjectChangeAuth, 2, 0 },
188*758e9fbaSOystein Eftevaag { TPM2_CC_Duplicate, 2, 0 },
189*758e9fbaSOystein Eftevaag { TPM2_CC_Rewrap, 2, 0 },
190*758e9fbaSOystein Eftevaag { TPM2_CC_Import, 1, 0 },
191*758e9fbaSOystein Eftevaag { TPM2_CC_RSA_Encrypt, 1, 0 },
192*758e9fbaSOystein Eftevaag { TPM2_CC_RSA_Decrypt, 1, 0 },
193*758e9fbaSOystein Eftevaag { TPM2_CC_ECDH_KeyGen, 1, 0 },
194*758e9fbaSOystein Eftevaag { TPM2_CC_ECDH_ZGen, 1, 0 },
195*758e9fbaSOystein Eftevaag { TPM2_CC_ECC_Parameters, 0, 0 },
196*758e9fbaSOystein Eftevaag { TPM2_CC_ZGen_2Phase, 1, 0 },
197*758e9fbaSOystein Eftevaag { TPM2_CC_EncryptDecrypt, 1, 0 },
198*758e9fbaSOystein Eftevaag { TPM2_CC_EncryptDecrypt2, 1, 0 },
199*758e9fbaSOystein Eftevaag { TPM2_CC_Hash, 0, 0 },
200*758e9fbaSOystein Eftevaag { TPM2_CC_HMAC, 1, 0 },
201*758e9fbaSOystein Eftevaag { TPM2_CC_GetRandom, 0, 0 },
202*758e9fbaSOystein Eftevaag { TPM2_CC_StirRandom, 0, 0 },
203*758e9fbaSOystein Eftevaag { TPM2_CC_HMAC_Start, 1, 1 },
204*758e9fbaSOystein Eftevaag { TPM2_CC_HashSequenceStart, 0, 1 },
205*758e9fbaSOystein Eftevaag { TPM2_CC_SequenceUpdate, 1, 0 },
206*758e9fbaSOystein Eftevaag { TPM2_CC_SequenceComplete, 1, 0 },
207*758e9fbaSOystein Eftevaag { TPM2_CC_EventSequenceComplete, 2, 0 },
208*758e9fbaSOystein Eftevaag { TPM2_CC_Certify, 2, 0 },
209*758e9fbaSOystein Eftevaag { TPM2_CC_CertifyCreation, 2, 0 },
210*758e9fbaSOystein Eftevaag { TPM2_CC_Quote, 1, 0 },
211*758e9fbaSOystein Eftevaag { TPM2_CC_GetSessionAuditDigest, 3, 0 },
212*758e9fbaSOystein Eftevaag { TPM2_CC_GetCommandAuditDigest, 2, 0 },
213*758e9fbaSOystein Eftevaag { TPM2_CC_GetTime, 2, 0 },
214*758e9fbaSOystein Eftevaag { TPM2_CC_Commit, 1, 0 },
215*758e9fbaSOystein Eftevaag { TPM2_CC_EC_Ephemeral, 0, 0 },
216*758e9fbaSOystein Eftevaag { TPM2_CC_VerifySignature, 1, 0 },
217*758e9fbaSOystein Eftevaag { TPM2_CC_Sign, 1, 0 },
218*758e9fbaSOystein Eftevaag { TPM2_CC_SetCommandCodeAuditStatus, 1, 0 },
219*758e9fbaSOystein Eftevaag { TPM2_CC_PCR_Extend, 1, 0 },
220*758e9fbaSOystein Eftevaag { TPM2_CC_PCR_Event, 1, 0 },
221*758e9fbaSOystein Eftevaag { TPM2_CC_PCR_Read, 0, 0 },
222*758e9fbaSOystein Eftevaag { TPM2_CC_PCR_Allocate, 1, 0 },
223*758e9fbaSOystein Eftevaag { TPM2_CC_PCR_SetAuthPolicy, 1, 0 },
224*758e9fbaSOystein Eftevaag { TPM2_CC_PCR_SetAuthValue, 1, 0 },
225*758e9fbaSOystein Eftevaag { TPM2_CC_PCR_Reset, 1, 0 },
226*758e9fbaSOystein Eftevaag { TPM2_CC_PolicySigned, 2, 0 },
227*758e9fbaSOystein Eftevaag { TPM2_CC_PolicySecret, 2, 0 },
228*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyTicket, 1, 0 },
229*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyOR, 1, 0 },
230*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyPCR, 1, 0 },
231*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyLocality, 1, 0 },
232*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyNV, 3, 0 },
233*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyNvWritten, 1, 0 },
234*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyCounterTimer, 1, 0 },
235*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyCommandCode, 1, 0 },
236*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyPhysicalPresence, 1, 0 },
237*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyCpHash, 1, 0 },
238*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyNameHash, 1, 0 },
239*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyDuplicationSelect, 1, 0 },
240*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyAuthorize, 1, 0 },
241*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyAuthValue, 1, 0 },
242*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyPassword, 1, 0 },
243*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyGetDigest, 1, 0 },
244*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyTemplate, 1, 0 },
245*758e9fbaSOystein Eftevaag { TPM2_CC_CreatePrimary, 1, 1 },
246*758e9fbaSOystein Eftevaag { TPM2_CC_HierarchyControl, 1, 0 },
247*758e9fbaSOystein Eftevaag { TPM2_CC_SetPrimaryPolicy, 1, 0 },
248*758e9fbaSOystein Eftevaag { TPM2_CC_ChangePPS, 1, 0 },
249*758e9fbaSOystein Eftevaag { TPM2_CC_ChangeEPS, 1, 0 },
250*758e9fbaSOystein Eftevaag { TPM2_CC_Clear, 1, 0 },
251*758e9fbaSOystein Eftevaag { TPM2_CC_ClearControl, 1, 0 },
252*758e9fbaSOystein Eftevaag { TPM2_CC_HierarchyChangeAuth, 1, 0 },
253*758e9fbaSOystein Eftevaag { TPM2_CC_DictionaryAttackLockReset, 1, 0 },
254*758e9fbaSOystein Eftevaag { TPM2_CC_DictionaryAttackParameters, 1, 0 },
255*758e9fbaSOystein Eftevaag { TPM2_CC_PP_Commands, 1, 0 },
256*758e9fbaSOystein Eftevaag { TPM2_CC_SetAlgorithmSet, 1, 0 },
257*758e9fbaSOystein Eftevaag { TPM2_CC_FieldUpgradeStart, 2, 0 },
258*758e9fbaSOystein Eftevaag { TPM2_CC_FieldUpgradeData, 0, 0 },
259*758e9fbaSOystein Eftevaag { TPM2_CC_FirmwareRead, 0, 0 },
260*758e9fbaSOystein Eftevaag { TPM2_CC_ContextSave, 1, 0 },
261*758e9fbaSOystein Eftevaag { TPM2_CC_ContextLoad, 0, 1 },
262*758e9fbaSOystein Eftevaag { TPM2_CC_FlushContext, 1, 0 },
263*758e9fbaSOystein Eftevaag { TPM2_CC_EvictControl, 2, 0 },
264*758e9fbaSOystein Eftevaag { TPM2_CC_ReadClock, 0, 0 },
265*758e9fbaSOystein Eftevaag { TPM2_CC_ClockSet, 1, 0 },
266*758e9fbaSOystein Eftevaag { TPM2_CC_ClockRateAdjust, 1, 0 },
267*758e9fbaSOystein Eftevaag { TPM2_CC_GetCapability, 0, 0 },
268*758e9fbaSOystein Eftevaag { TPM2_CC_TestParms, 0, 0 },
269*758e9fbaSOystein Eftevaag { TPM2_CC_NV_DefineSpace, 1, 0 },
270*758e9fbaSOystein Eftevaag { TPM2_CC_NV_UndefineSpace, 2, 0 },
271*758e9fbaSOystein Eftevaag { TPM2_CC_NV_UndefineSpaceSpecial, 2, 0 },
272*758e9fbaSOystein Eftevaag { TPM2_CC_NV_ReadPublic, 1, 0 },
273*758e9fbaSOystein Eftevaag { TPM2_CC_NV_Write, 2, 0 },
274*758e9fbaSOystein Eftevaag { TPM2_CC_NV_Increment, 2, 0 },
275*758e9fbaSOystein Eftevaag { TPM2_CC_NV_Extend, 2, 0 },
276*758e9fbaSOystein Eftevaag { TPM2_CC_NV_SetBits, 2, 0 },
277*758e9fbaSOystein Eftevaag { TPM2_CC_NV_WriteLock, 2, 0 },
278*758e9fbaSOystein Eftevaag { TPM2_CC_NV_GlobalWriteLock, 1, 0 },
279*758e9fbaSOystein Eftevaag { TPM2_CC_NV_Read, 2, 0 },
280*758e9fbaSOystein Eftevaag { TPM2_CC_NV_ReadLock, 2, 0 },
281*758e9fbaSOystein Eftevaag { TPM2_CC_NV_ChangeAuth, 1, 0 },
282*758e9fbaSOystein Eftevaag { TPM2_CC_NV_Certify, 3, 0 },
283*758e9fbaSOystein Eftevaag { TPM2_CC_CreateLoaded, 1, 1 },
284*758e9fbaSOystein Eftevaag { TPM2_CC_PolicyAuthorizeNV, 3, 0 },
285*758e9fbaSOystein Eftevaag { TPM2_CC_AC_GetCapability, 1, 0 },
286*758e9fbaSOystein Eftevaag { TPM2_CC_AC_Send, 3, 0 },
287*758e9fbaSOystein Eftevaag { TPM2_CC_Policy_AC_SendSelect, 1, 0 }
288*758e9fbaSOystein Eftevaag };
289*758e9fbaSOystein Eftevaag
GetNumHandles(TPM2_CC commandCode,bool req)290*758e9fbaSOystein Eftevaag static int GetNumHandles(TPM2_CC commandCode, bool req)
291*758e9fbaSOystein Eftevaag {
292*758e9fbaSOystein Eftevaag uint8_t i;
293*758e9fbaSOystein Eftevaag
294*758e9fbaSOystein Eftevaag for (i = 0; i < sizeof(commandArray) / sizeof(COMMAND_HANDLES); i++) {
295*758e9fbaSOystein Eftevaag if (commandCode == commandArray[i].commandCode) {
296*758e9fbaSOystein Eftevaag if (req)
297*758e9fbaSOystein Eftevaag return commandArray[i].numCommandHandles;
298*758e9fbaSOystein Eftevaag else
299*758e9fbaSOystein Eftevaag return commandArray[i].numResponseHandles;
300*758e9fbaSOystein Eftevaag }
301*758e9fbaSOystein Eftevaag }
302*758e9fbaSOystein Eftevaag
303*758e9fbaSOystein Eftevaag return 0;
304*758e9fbaSOystein Eftevaag }
305*758e9fbaSOystein Eftevaag
GetNumCommandHandles(TPM2_CC commandCode)306*758e9fbaSOystein Eftevaag static int GetNumCommandHandles(TPM2_CC commandCode)
307*758e9fbaSOystein Eftevaag {
308*758e9fbaSOystein Eftevaag return GetNumHandles(commandCode, 1);
309*758e9fbaSOystein Eftevaag }
310*758e9fbaSOystein Eftevaag
GetNumResponseHandles(TPM2_CC commandCode)311*758e9fbaSOystein Eftevaag static int GetNumResponseHandles(TPM2_CC commandCode)
312*758e9fbaSOystein Eftevaag {
313*758e9fbaSOystein Eftevaag return GetNumHandles(commandCode, 0);
314*758e9fbaSOystein Eftevaag }
315*758e9fbaSOystein Eftevaag
316*758e9fbaSOystein Eftevaag #ifdef DISABLE_WEAK_CRYPTO
IsAlgorithmWeak(TPM2_ALG_ID algorithm,TPM2_KEY_SIZE key_size)317*758e9fbaSOystein Eftevaag bool IsAlgorithmWeak(TPM2_ALG_ID algorithm, TPM2_KEY_SIZE key_size)
318*758e9fbaSOystein Eftevaag {
319*758e9fbaSOystein Eftevaag switch (algorithm) {
320*758e9fbaSOystein Eftevaag case TPM2_ALG_RSA:
321*758e9fbaSOystein Eftevaag if (key_size < 2048) {
322*758e9fbaSOystein Eftevaag LOG_ERROR("Error: weak algorithm");
323*758e9fbaSOystein Eftevaag return true;
324*758e9fbaSOystein Eftevaag }
325*758e9fbaSOystein Eftevaag break;
326*758e9fbaSOystein Eftevaag case TPM2_ALG_AES:
327*758e9fbaSOystein Eftevaag case TPM2_ALG_SM4:
328*758e9fbaSOystein Eftevaag case TPM2_ALG_CAMELLIA:
329*758e9fbaSOystein Eftevaag case TPM2_ALG_SYMCIPHER:
330*758e9fbaSOystein Eftevaag if (key_size < 128) {
331*758e9fbaSOystein Eftevaag LOG_ERROR("Error: weak algorithm");
332*758e9fbaSOystein Eftevaag return true;
333*758e9fbaSOystein Eftevaag }
334*758e9fbaSOystein Eftevaag break;
335*758e9fbaSOystein Eftevaag case TPM2_ALG_SHA1:
336*758e9fbaSOystein Eftevaag LOG_ERROR("Error: weak algorithm");
337*758e9fbaSOystein Eftevaag return true;
338*758e9fbaSOystein Eftevaag break;
339*758e9fbaSOystein Eftevaag }
340*758e9fbaSOystein Eftevaag
341*758e9fbaSOystein Eftevaag return false;
342*758e9fbaSOystein Eftevaag }
343*758e9fbaSOystein Eftevaag
ValidatePublicTemplate(const TPM2B_PUBLIC * pub)344*758e9fbaSOystein Eftevaag TSS2_RC ValidatePublicTemplate(const TPM2B_PUBLIC *pub)
345*758e9fbaSOystein Eftevaag {
346*758e9fbaSOystein Eftevaag const TPMT_PUBLIC *tmpl = &pub->publicArea;
347*758e9fbaSOystein Eftevaag
348*758e9fbaSOystein Eftevaag switch (tmpl->type) {
349*758e9fbaSOystein Eftevaag case TPM2_ALG_RSA:
350*758e9fbaSOystein Eftevaag if (IsAlgorithmWeak(tmpl->type, tmpl->parameters.rsaDetail.keyBits) ||
351*758e9fbaSOystein Eftevaag IsAlgorithmWeak(tmpl->parameters.rsaDetail.symmetric.algorithm,
352*758e9fbaSOystein Eftevaag tmpl->parameters.rsaDetail.symmetric.keyBits.sym))
353*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
354*758e9fbaSOystein Eftevaag break;
355*758e9fbaSOystein Eftevaag case TPM2_ALG_ECC:
356*758e9fbaSOystein Eftevaag if (IsAlgorithmWeak(tmpl->parameters.eccDetail.symmetric.algorithm,
357*758e9fbaSOystein Eftevaag tmpl->parameters.eccDetail.symmetric.keyBits.sym))
358*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
359*758e9fbaSOystein Eftevaag break;
360*758e9fbaSOystein Eftevaag case TPM2_ALG_AES:
361*758e9fbaSOystein Eftevaag case TPM2_ALG_SM4:
362*758e9fbaSOystein Eftevaag case TPM2_ALG_CAMELLIA:
363*758e9fbaSOystein Eftevaag case TPM2_ALG_SYMCIPHER:
364*758e9fbaSOystein Eftevaag if (IsAlgorithmWeak(tmpl->type,
365*758e9fbaSOystein Eftevaag tmpl->parameters.symDetail.sym.keyBits.sym))
366*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
367*758e9fbaSOystein Eftevaag break;
368*758e9fbaSOystein Eftevaag default:
369*758e9fbaSOystein Eftevaag if (IsAlgorithmWeak(tmpl->type, 0))
370*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
371*758e9fbaSOystein Eftevaag
372*758e9fbaSOystein Eftevaag if (IsAlgorithmWeak(tmpl->nameAlg, 0))
373*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
374*758e9fbaSOystein Eftevaag
375*758e9fbaSOystein Eftevaag }
376*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
377*758e9fbaSOystein Eftevaag }
378*758e9fbaSOystein Eftevaag
ValidateNV_Public(const TPM2B_NV_PUBLIC * nv_public_info)379*758e9fbaSOystein Eftevaag TSS2_RC ValidateNV_Public(const TPM2B_NV_PUBLIC *nv_public_info)
380*758e9fbaSOystein Eftevaag {
381*758e9fbaSOystein Eftevaag const TPMS_NV_PUBLIC *nv_public = &nv_public_info->nvPublic;
382*758e9fbaSOystein Eftevaag
383*758e9fbaSOystein Eftevaag if (IsAlgorithmWeak(nv_public->nameAlg, 0))
384*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
385*758e9fbaSOystein Eftevaag
386*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
387*758e9fbaSOystein Eftevaag }
388*758e9fbaSOystein Eftevaag
ValidateTPML_PCR_SELECTION(const TPML_PCR_SELECTION * pcr_selection)389*758e9fbaSOystein Eftevaag TSS2_RC ValidateTPML_PCR_SELECTION(const TPML_PCR_SELECTION *pcr_selection)
390*758e9fbaSOystein Eftevaag {
391*758e9fbaSOystein Eftevaag
392*758e9fbaSOystein Eftevaag UINT16 i;
393*758e9fbaSOystein Eftevaag
394*758e9fbaSOystein Eftevaag for (i = 0; i < pcr_selection->count; i++) {
395*758e9fbaSOystein Eftevaag const TPMS_PCR_SELECTION *selection = &pcr_selection->pcrSelections[i];
396*758e9fbaSOystein Eftevaag
397*758e9fbaSOystein Eftevaag if (IsAlgorithmWeak(selection->hash, 0))
398*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
399*758e9fbaSOystein Eftevaag }
400*758e9fbaSOystein Eftevaag
401*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
402*758e9fbaSOystein Eftevaag }
403*758e9fbaSOystein Eftevaag
404*758e9fbaSOystein Eftevaag #else
IsAlgorithmWeak(TPM2_ALG_ID algorithm,TPM2_KEY_SIZE key_size)405*758e9fbaSOystein Eftevaag bool IsAlgorithmWeak(TPM2_ALG_ID algorithm, TPM2_KEY_SIZE key_size)
406*758e9fbaSOystein Eftevaag {
407*758e9fbaSOystein Eftevaag (void) algorithm;
408*758e9fbaSOystein Eftevaag (void) key_size;
409*758e9fbaSOystein Eftevaag
410*758e9fbaSOystein Eftevaag return false;
411*758e9fbaSOystein Eftevaag }
412*758e9fbaSOystein Eftevaag
ValidateNV_Public(const TPM2B_NV_PUBLIC * nv_public_info)413*758e9fbaSOystein Eftevaag TSS2_RC ValidateNV_Public(const TPM2B_NV_PUBLIC *nv_public_info)
414*758e9fbaSOystein Eftevaag {
415*758e9fbaSOystein Eftevaag (void) nv_public_info;
416*758e9fbaSOystein Eftevaag
417*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
418*758e9fbaSOystein Eftevaag }
419*758e9fbaSOystein Eftevaag
ValidatePublicTemplate(const TPM2B_PUBLIC * pub)420*758e9fbaSOystein Eftevaag TSS2_RC ValidatePublicTemplate(const TPM2B_PUBLIC *pub)
421*758e9fbaSOystein Eftevaag {
422*758e9fbaSOystein Eftevaag (void) pub;
423*758e9fbaSOystein Eftevaag
424*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
425*758e9fbaSOystein Eftevaag }
426*758e9fbaSOystein Eftevaag
ValidateTPML_PCR_SELECTION(const TPML_PCR_SELECTION * pcr_selection)427*758e9fbaSOystein Eftevaag TSS2_RC ValidateTPML_PCR_SELECTION(const TPML_PCR_SELECTION *pcr_selection)
428*758e9fbaSOystein Eftevaag {
429*758e9fbaSOystein Eftevaag (void) pcr_selection;
430*758e9fbaSOystein Eftevaag
431*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
432*758e9fbaSOystein Eftevaag }
433*758e9fbaSOystein Eftevaag #endif
434