4 Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include <IndustryStandard/UefiTcgPlatform.h>
16 #include <Library/Tpm2CommandLib.h>
17 #include <Library/Tpm2DeviceLib.h>
18 #include <Library/BaseMemoryLib.h>
19 #include <Library/BaseLib.h>
20 #include <Library/DebugLib.h>
23 TPMI_ALG_HASH HashAlgo
;
27 STATIC INTERNAL_HASH_INFO mHashInfo
[] = {
28 {TPM_ALG_SHA1
, SHA1_DIGEST_SIZE
},
29 {TPM_ALG_SHA256
, SHA256_DIGEST_SIZE
},
30 {TPM_ALG_SM3_256
, SM3_256_DIGEST_SIZE
},
31 {TPM_ALG_SHA384
, SHA384_DIGEST_SIZE
},
32 {TPM_ALG_SHA512
, SHA512_DIGEST_SIZE
},
36 Return size of digest.
38 @param[in] HashAlgo Hash algorithm
40 @return size of digest
45 IN TPMI_ALG_HASH HashAlgo
50 for (Index
= 0; Index
< sizeof(mHashInfo
)/sizeof(mHashInfo
[0]); Index
++) {
51 if (mHashInfo
[Index
].HashAlgo
== HashAlgo
) {
52 return mHashInfo
[Index
].HashSize
;
59 Copy AuthSessionIn to TPM2 command buffer.
61 @param [in] AuthSessionIn Input AuthSession data
62 @param [out] AuthSessionOut Output AuthSession data in TPM2 command buffer
64 @return AuthSession size
68 CopyAuthSessionCommand (
69 IN TPMS_AUTH_COMMAND
*AuthSessionIn
, OPTIONAL
70 OUT UINT8
*AuthSessionOut
75 Buffer
= (UINT8
*)AuthSessionOut
;
78 // Add in Auth session
80 if (AuthSessionIn
!= NULL
) {
82 WriteUnaligned32 ((UINT32
*)Buffer
, SwapBytes32(AuthSessionIn
->sessionHandle
));
83 Buffer
+= sizeof(UINT32
);
86 WriteUnaligned16 ((UINT16
*)Buffer
, SwapBytes16 (AuthSessionIn
->nonce
.size
));
87 Buffer
+= sizeof(UINT16
);
89 CopyMem (Buffer
, AuthSessionIn
->nonce
.buffer
, AuthSessionIn
->nonce
.size
);
90 Buffer
+= AuthSessionIn
->nonce
.size
;
93 *(UINT8
*)Buffer
= *(UINT8
*)&AuthSessionIn
->sessionAttributes
;
97 WriteUnaligned16 ((UINT16
*)Buffer
, SwapBytes16 (AuthSessionIn
->hmac
.size
));
98 Buffer
+= sizeof(UINT16
);
100 CopyMem (Buffer
, AuthSessionIn
->hmac
.buffer
, AuthSessionIn
->hmac
.size
);
101 Buffer
+= AuthSessionIn
->hmac
.size
;
104 WriteUnaligned32 ((UINT32
*)Buffer
, SwapBytes32(TPM_RS_PW
));
105 Buffer
+= sizeof(UINT32
);
108 WriteUnaligned16 ((UINT16
*)Buffer
, SwapBytes16(0));
109 Buffer
+= sizeof(UINT16
);
111 // sessionAttributes = 0
112 *(UINT8
*)Buffer
= 0x00;
116 WriteUnaligned16 ((UINT16
*)Buffer
, SwapBytes16(0));
117 Buffer
+= sizeof(UINT16
);
120 return (UINT32
)(UINTN
)(Buffer
- (UINT8
*)AuthSessionOut
);
124 Copy AuthSessionIn from TPM2 response buffer.
126 @param [in] AuthSessionIn Input AuthSession data in TPM2 response buffer
127 @param [out] AuthSessionOut Output AuthSession data
129 @return AuthSession size
133 CopyAuthSessionResponse (
134 IN UINT8
*AuthSessionIn
,
135 OUT TPMS_AUTH_RESPONSE
*AuthSessionOut OPTIONAL
139 TPMS_AUTH_RESPONSE LocalAuthSessionOut
;
141 if (AuthSessionOut
== NULL
) {
142 AuthSessionOut
= &LocalAuthSessionOut
;
145 Buffer
= (UINT8
*)AuthSessionIn
;
148 AuthSessionOut
->nonce
.size
= SwapBytes16 (ReadUnaligned16 ((UINT16
*)Buffer
));
149 Buffer
+= sizeof(UINT16
);
151 CopyMem (AuthSessionOut
->nonce
.buffer
, Buffer
, AuthSessionOut
->nonce
.size
);
152 Buffer
+= AuthSessionOut
->nonce
.size
;
155 *(UINT8
*)&AuthSessionOut
->sessionAttributes
= *(UINT8
*)Buffer
;
159 AuthSessionOut
->hmac
.size
= SwapBytes16 (ReadUnaligned16 ((UINT16
*)Buffer
));
160 Buffer
+= sizeof(UINT16
);
162 CopyMem (AuthSessionOut
->hmac
.buffer
, Buffer
, AuthSessionOut
->hmac
.size
);
163 Buffer
+= AuthSessionOut
->hmac
.size
;
165 return (UINT32
)(UINTN
)(Buffer
- (UINT8
*)AuthSessionIn
);
169 Return if hash alg is supported in HashAlgorithmMask.
171 @param HashAlg Hash algorithm to be checked.
172 @param HashAlgorithmMask Bitfield of allowed hash algorithms.
174 @retval TRUE Hash algorithm is supported.
175 @retval FALSE Hash algorithm is not supported.
178 IsHashAlgSupportedInHashAlgorithmMask(
179 IN TPMI_ALG_HASH HashAlg
,
180 IN UINT32 HashAlgorithmMask
185 if ((HashAlgorithmMask
& HASH_ALG_SHA1
) != 0) {
190 if ((HashAlgorithmMask
& HASH_ALG_SHA256
) != 0) {
195 if ((HashAlgorithmMask
& HASH_ALG_SHA384
) != 0) {
200 if ((HashAlgorithmMask
& HASH_ALG_SHA512
) != 0) {
204 case TPM_ALG_SM3_256
:
205 if ((HashAlgorithmMask
& HASH_ALG_SM3_256
) != 0) {
215 Copy TPML_DIGEST_VALUES into a buffer
217 @param[in,out] Buffer Buffer to hold TPML_DIGEST_VALUES.
218 @param[in] DigestList TPML_DIGEST_VALUES to be copied.
219 @param[in] HashAlgorithmMask HASH bits corresponding to the desired digests to copy.
221 @return The end of buffer to hold TPML_DIGEST_VALUES.
225 CopyDigestListToBuffer (
227 IN TPML_DIGEST_VALUES
*DigestList
,
228 IN UINT32 HashAlgorithmMask
234 CopyMem (Buffer
, &DigestList
->count
, sizeof(DigestList
->count
));
235 Buffer
= (UINT8
*)Buffer
+ sizeof(DigestList
->count
);
236 for (Index
= 0; Index
< DigestList
->count
; Index
++) {
237 if (!IsHashAlgSupportedInHashAlgorithmMask(DigestList
->digests
[Index
].hashAlg
, HashAlgorithmMask
)) {
238 DEBUG ((EFI_D_ERROR
, "WARNING: TPM2 Event log has HashAlg unsupported by PCR bank (0x%x)\n", DigestList
->digests
[Index
].hashAlg
));
241 CopyMem (Buffer
, &DigestList
->digests
[Index
].hashAlg
, sizeof(DigestList
->digests
[Index
].hashAlg
));
242 Buffer
= (UINT8
*)Buffer
+ sizeof(DigestList
->digests
[Index
].hashAlg
);
243 DigestSize
= GetHashSizeFromAlgo (DigestList
->digests
[Index
].hashAlg
);
244 CopyMem (Buffer
, &DigestList
->digests
[Index
].digest
, DigestSize
);
245 Buffer
= (UINT8
*)Buffer
+ DigestSize
;
252 Get TPML_DIGEST_VALUES data size.
254 @param[in] DigestList TPML_DIGEST_VALUES data.
256 @return TPML_DIGEST_VALUES data size.
261 IN TPML_DIGEST_VALUES
*DigestList
268 TotalSize
= sizeof(DigestList
->count
);
269 for (Index
= 0; Index
< DigestList
->count
; Index
++) {
270 DigestSize
= GetHashSizeFromAlgo (DigestList
->digests
[Index
].hashAlg
);
271 TotalSize
+= sizeof(DigestList
->digests
[Index
].hashAlg
) + DigestSize
;
278 This function get digest from digest list.
280 @param[in] HashAlg Digest algorithm
281 @param[in] DigestList Digest list
282 @param[out] Digest Digest
284 @retval EFI_SUCCESS Digest is found and returned.
285 @retval EFI_NOT_FOUND Digest is not found.
289 GetDigestFromDigestList (
290 IN TPMI_ALG_HASH HashAlg
,
291 IN TPML_DIGEST_VALUES
*DigestList
,
298 DigestSize
= GetHashSizeFromAlgo (HashAlg
);
299 for (Index
= 0; Index
< DigestList
->count
; Index
++) {
300 if (DigestList
->digests
[Index
].hashAlg
== HashAlg
) {
303 &DigestList
->digests
[Index
].digest
,
310 return EFI_NOT_FOUND
;