]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/Tpm2CommandLib/Tpm2DictionaryAttack.c
SecurityPkg: Apply uncrustify changes
[mirror_edk2.git] / SecurityPkg / Library / Tpm2CommandLib / Tpm2DictionaryAttack.c
CommitLineData
c1d93242
JY
1/** @file\r
2 Implement TPM2 DictionaryAttack related command.\r
3\r
7ae130da 4Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>\r
289b714b 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
c1d93242
JY
6\r
7**/\r
8\r
9#include <IndustryStandard/UefiTcgPlatform.h>\r
10#include <Library/Tpm2CommandLib.h>\r
11#include <Library/Tpm2DeviceLib.h>\r
12#include <Library/BaseMemoryLib.h>\r
13#include <Library/BaseLib.h>\r
14#include <Library/DebugLib.h>\r
15\r
16#pragma pack(1)\r
17\r
18typedef struct {\r
c411b485
MK
19 TPM2_COMMAND_HEADER Header;\r
20 TPMI_RH_LOCKOUT LockHandle;\r
21 UINT32 AuthSessionSize;\r
22 TPMS_AUTH_COMMAND AuthSession;\r
c1d93242
JY
23} TPM2_DICTIONARY_ATTACK_LOCK_RESET_COMMAND;\r
24\r
25typedef struct {\r
c411b485
MK
26 TPM2_RESPONSE_HEADER Header;\r
27 UINT32 AuthSessionSize;\r
28 TPMS_AUTH_RESPONSE AuthSession;\r
c1d93242
JY
29} TPM2_DICTIONARY_ATTACK_LOCK_RESET_RESPONSE;\r
30\r
31typedef struct {\r
c411b485
MK
32 TPM2_COMMAND_HEADER Header;\r
33 TPMI_RH_LOCKOUT LockHandle;\r
34 UINT32 AuthSessionSize;\r
35 TPMS_AUTH_COMMAND AuthSession;\r
36 UINT32 NewMaxTries;\r
37 UINT32 NewRecoveryTime;\r
38 UINT32 LockoutRecovery;\r
c1d93242
JY
39} TPM2_DICTIONARY_ATTACK_PARAMETERS_COMMAND;\r
40\r
41typedef struct {\r
c411b485
MK
42 TPM2_RESPONSE_HEADER Header;\r
43 UINT32 AuthSessionSize;\r
44 TPMS_AUTH_RESPONSE AuthSession;\r
c1d93242
JY
45} TPM2_DICTIONARY_ATTACK_PARAMETERS_RESPONSE;\r
46\r
47#pragma pack()\r
48\r
49/**\r
50 This command cancels the effect of a TPM lockout due to a number of successive authorization failures.\r
51 If this command is properly authorized, the lockout counter is set to zero.\r
52\r
53 @param[in] LockHandle TPM_RH_LOCKOUT\r
54 @param[in] AuthSession Auth Session context\r
55\r
56 @retval EFI_SUCCESS Operation completed successfully.\r
57 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
58**/\r
59EFI_STATUS\r
60EFIAPI\r
61Tpm2DictionaryAttackLockReset (\r
c411b485
MK
62 IN TPMI_RH_LOCKOUT LockHandle,\r
63 IN TPMS_AUTH_COMMAND *AuthSession\r
c1d93242
JY
64 )\r
65{\r
c411b485
MK
66 EFI_STATUS Status;\r
67 TPM2_DICTIONARY_ATTACK_LOCK_RESET_COMMAND SendBuffer;\r
68 TPM2_DICTIONARY_ATTACK_LOCK_RESET_RESPONSE RecvBuffer;\r
69 UINT32 SendBufferSize;\r
70 UINT32 RecvBufferSize;\r
71 UINT8 *Buffer;\r
72 UINT32 SessionInfoSize;\r
c1d93242
JY
73\r
74 //\r
75 // Construct command\r
76 //\r
c411b485
MK
77 SendBuffer.Header.tag = SwapBytes16 (TPM_ST_SESSIONS);\r
78 SendBuffer.Header.commandCode = SwapBytes32 (TPM_CC_DictionaryAttackLockReset);\r
c1d93242
JY
79\r
80 SendBuffer.LockHandle = SwapBytes32 (LockHandle);\r
81\r
82 //\r
83 // Add in Auth session\r
84 //\r
85 Buffer = (UINT8 *)&SendBuffer.AuthSession;\r
86\r
87 // sessionInfoSize\r
c411b485
MK
88 SessionInfoSize = CopyAuthSessionCommand (AuthSession, Buffer);\r
89 Buffer += SessionInfoSize;\r
90 SendBuffer.AuthSessionSize = SwapBytes32 (SessionInfoSize);\r
c1d93242 91\r
c411b485 92 SendBufferSize = (UINT32)((UINTN)Buffer - (UINTN)&SendBuffer);\r
c1d93242
JY
93 SendBuffer.Header.paramSize = SwapBytes32 (SendBufferSize);\r
94\r
95 //\r
96 // send Tpm command\r
97 //\r
98 RecvBufferSize = sizeof (RecvBuffer);\r
c411b485 99 Status = Tpm2SubmitCommand (SendBufferSize, (UINT8 *)&SendBuffer, &RecvBufferSize, (UINT8 *)&RecvBuffer);\r
c1d93242 100 if (EFI_ERROR (Status)) {\r
7ae130da 101 goto Done;\r
c1d93242
JY
102 }\r
103\r
104 if (RecvBufferSize < sizeof (TPM2_RESPONSE_HEADER)) {\r
e905fbb0 105 DEBUG ((DEBUG_ERROR, "Tpm2DictionaryAttackLockReset - RecvBufferSize Error - %x\n", RecvBufferSize));\r
7ae130da
JY
106 Status = EFI_DEVICE_ERROR;\r
107 goto Done;\r
c1d93242 108 }\r
c411b485
MK
109\r
110 if (SwapBytes32 (RecvBuffer.Header.responseCode) != TPM_RC_SUCCESS) {\r
111 DEBUG ((DEBUG_ERROR, "Tpm2DictionaryAttackLockReset - responseCode - %x\n", SwapBytes32 (RecvBuffer.Header.responseCode)));\r
7ae130da
JY
112 Status = EFI_DEVICE_ERROR;\r
113 goto Done;\r
c1d93242
JY
114 }\r
115\r
7ae130da
JY
116Done:\r
117 //\r
118 // Clear AuthSession Content\r
119 //\r
c411b485
MK
120 ZeroMem (&SendBuffer, sizeof (SendBuffer));\r
121 ZeroMem (&RecvBuffer, sizeof (RecvBuffer));\r
7ae130da 122 return Status;\r
c1d93242
JY
123}\r
124\r
125/**\r
126 This command cancels the effect of a TPM lockout due to a number of successive authorization failures.\r
127 If this command is properly authorized, the lockout counter is set to zero.\r
128\r
129 @param[in] LockHandle TPM_RH_LOCKOUT\r
130 @param[in] AuthSession Auth Session context\r
131 @param[in] NewMaxTries Count of authorization failures before the lockout is imposed\r
132 @param[in] NewRecoveryTime Time in seconds before the authorization failure count is automatically decremented\r
133 @param[in] LockoutRecovery Time in seconds after a lockoutAuth failure before use of lockoutAuth is allowed\r
134\r
135 @retval EFI_SUCCESS Operation completed successfully.\r
136 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
137**/\r
138EFI_STATUS\r
139EFIAPI\r
140Tpm2DictionaryAttackParameters (\r
c411b485
MK
141 IN TPMI_RH_LOCKOUT LockHandle,\r
142 IN TPMS_AUTH_COMMAND *AuthSession,\r
143 IN UINT32 NewMaxTries,\r
144 IN UINT32 NewRecoveryTime,\r
145 IN UINT32 LockoutRecovery\r
c1d93242
JY
146 )\r
147{\r
c411b485
MK
148 EFI_STATUS Status;\r
149 TPM2_DICTIONARY_ATTACK_PARAMETERS_COMMAND SendBuffer;\r
150 TPM2_DICTIONARY_ATTACK_PARAMETERS_RESPONSE RecvBuffer;\r
151 UINT32 SendBufferSize;\r
152 UINT32 RecvBufferSize;\r
153 UINT8 *Buffer;\r
154 UINT32 SessionInfoSize;\r
c1d93242
JY
155\r
156 //\r
157 // Construct command\r
158 //\r
c411b485
MK
159 SendBuffer.Header.tag = SwapBytes16 (TPM_ST_SESSIONS);\r
160 SendBuffer.Header.commandCode = SwapBytes32 (TPM_CC_DictionaryAttackParameters);\r
c1d93242
JY
161\r
162 SendBuffer.LockHandle = SwapBytes32 (LockHandle);\r
163\r
164 //\r
165 // Add in Auth session\r
166 //\r
167 Buffer = (UINT8 *)&SendBuffer.AuthSession;\r
168\r
169 // sessionInfoSize\r
c411b485
MK
170 SessionInfoSize = CopyAuthSessionCommand (AuthSession, Buffer);\r
171 Buffer += SessionInfoSize;\r
172 SendBuffer.AuthSessionSize = SwapBytes32 (SessionInfoSize);\r
c1d93242
JY
173\r
174 //\r
175 // Real data\r
176 //\r
c411b485
MK
177 WriteUnaligned32 ((UINT32 *)Buffer, SwapBytes32 (NewMaxTries));\r
178 Buffer += sizeof (UINT32);\r
179 WriteUnaligned32 ((UINT32 *)Buffer, SwapBytes32 (NewRecoveryTime));\r
180 Buffer += sizeof (UINT32);\r
181 WriteUnaligned32 ((UINT32 *)Buffer, SwapBytes32 (LockoutRecovery));\r
182 Buffer += sizeof (UINT32);\r
c1d93242 183\r
c411b485 184 SendBufferSize = (UINT32)((UINTN)Buffer - (UINTN)&SendBuffer);\r
c1d93242
JY
185 SendBuffer.Header.paramSize = SwapBytes32 (SendBufferSize);\r
186\r
187 //\r
188 // send Tpm command\r
189 //\r
190 RecvBufferSize = sizeof (RecvBuffer);\r
c411b485 191 Status = Tpm2SubmitCommand (SendBufferSize, (UINT8 *)&SendBuffer, &RecvBufferSize, (UINT8 *)&RecvBuffer);\r
c1d93242 192 if (EFI_ERROR (Status)) {\r
7ae130da 193 goto Done;\r
c1d93242
JY
194 }\r
195\r
196 if (RecvBufferSize < sizeof (TPM2_RESPONSE_HEADER)) {\r
e905fbb0 197 DEBUG ((DEBUG_ERROR, "Tpm2DictionaryAttackParameters - RecvBufferSize Error - %x\n", RecvBufferSize));\r
7ae130da
JY
198 Status = EFI_DEVICE_ERROR;\r
199 goto Done;\r
c1d93242 200 }\r
c411b485
MK
201\r
202 if (SwapBytes32 (RecvBuffer.Header.responseCode) != TPM_RC_SUCCESS) {\r
203 DEBUG ((DEBUG_ERROR, "Tpm2DictionaryAttackParameters - responseCode - %x\n", SwapBytes32 (RecvBuffer.Header.responseCode)));\r
7ae130da
JY
204 Status = EFI_DEVICE_ERROR;\r
205 goto Done;\r
c1d93242
JY
206 }\r
207\r
7ae130da
JY
208Done:\r
209 //\r
210 // Clear AuthSession Content\r
211 //\r
c411b485
MK
212 ZeroMem (&SendBufferSize, sizeof (SendBufferSize));\r
213 ZeroMem (&RecvBuffer, sizeof (RecvBuffer));\r
7ae130da 214 return Status;\r
c1d93242 215}\r