2 Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
3 SPDX-License-Identifier: BSD-2-Clause-Patent
7 #include <Library/BaseLib.h>
8 #include <Library/BaseMemoryLib.h>
9 #include <Library/DebugLib.h>
10 #include <Guid/VariableFormat.h>
11 #include <Guid/SystemNvDataGuid.h>
12 #include "PeilessStartupInternal.h"
15 Check padding data all bit should be 1.
17 @param[in] Buffer - A pointer to buffer header
18 @param[in] BufferSize - Buffer size
20 @retval TRUE - The padding data is valid.
21 @retval TRUE - The padding data is invalid.
32 for (index
= 0; index
< BufferSize
; index
++) {
33 if (Buffer
[index
] != 0xFF) {
42 Check the integrity of CFV data.
44 @param[in] TdxCfvBase - A pointer to CFV header
45 @param[in] TdxCfvSize - CFV data size
47 @retval TRUE - The CFV data is valid.
48 @retval FALSE - The CFV data is invalid.
60 UINT32 VariableOffset
;
61 UINT32 VariableOffsetBeforeAlign
;
62 EFI_FIRMWARE_VOLUME_HEADER
*CfvFvHeader
;
63 VARIABLE_STORE_HEADER
*CfvVariableStoreHeader
;
64 AUTHENTICATED_VARIABLE_HEADER
*VariableHeader
;
66 static EFI_GUID FvHdrGUID
= EFI_SYSTEM_NV_DATA_FV_GUID
;
67 static EFI_GUID VarStoreHdrGUID
= EFI_AUTHENTICATED_VARIABLE_GUID
;
71 if (TdxCfvBase
== NULL
) {
72 DEBUG ((DEBUG_ERROR
, "TDX CFV: CFV pointer is NULL\n"));
77 // Verify the header zerovetor, filesystemguid,
78 // revision, signature, attributes, fvlength, checksum
79 // HeaderLength cannot be an odd number
81 CfvFvHeader
= (EFI_FIRMWARE_VOLUME_HEADER
*)TdxCfvBase
;
83 if ((!IsZeroBuffer (CfvFvHeader
->ZeroVector
, 16)) ||
84 (!CompareGuid (&FvHdrGUID
, &CfvFvHeader
->FileSystemGuid
)) ||
85 (CfvFvHeader
->Signature
!= EFI_FVH_SIGNATURE
) ||
86 (CfvFvHeader
->Attributes
!= 0x4feff) ||
87 (CfvFvHeader
->Revision
!= EFI_FVH_REVISION
) ||
88 (CfvFvHeader
->FvLength
!= TdxCfvSize
)
91 DEBUG ((DEBUG_ERROR
, "TDX CFV: Basic FV headers were invalid\n"));
96 // Verify the header checksum
98 Checksum
= CalculateSum16 ((VOID
*)CfvFvHeader
, CfvFvHeader
->HeaderLength
);
101 DEBUG ((DEBUG_ERROR
, "TDX CFV: FV checksum was invalid\n"));
106 // Verify the header signature, size, format, state
108 CfvVariableStoreHeader
= (VARIABLE_STORE_HEADER
*)(TdxCfvBase
+ CfvFvHeader
->HeaderLength
);
109 if ((!CompareGuid (&VarStoreHdrGUID
, &CfvVariableStoreHeader
->Signature
)) ||
110 (CfvVariableStoreHeader
->Format
!= VARIABLE_STORE_FORMATTED
) ||
111 (CfvVariableStoreHeader
->State
!= VARIABLE_STORE_HEALTHY
) ||
112 (CfvVariableStoreHeader
->Size
> (CfvFvHeader
->FvLength
- CfvFvHeader
->HeaderLength
)) ||
113 (CfvVariableStoreHeader
->Size
< sizeof (VARIABLE_STORE_HEADER
))
116 DEBUG ((DEBUG_ERROR
, "TDX CFV: Variable Store header was invalid\n"));
121 // Verify the header startId, state
122 // Verify data to the end
124 VariableBase
= (UINTN
)TdxCfvBase
+ CfvFvHeader
->HeaderLength
+ sizeof (VARIABLE_STORE_HEADER
);
125 while (VariableOffset
< (CfvVariableStoreHeader
->Size
- sizeof (VARIABLE_STORE_HEADER
))) {
126 VariableHeader
= (AUTHENTICATED_VARIABLE_HEADER
*)(VariableBase
+ VariableOffset
);
127 if (VariableHeader
->StartId
!= VARIABLE_DATA
) {
128 if (!CheckPaddingData ((UINT8
*)VariableHeader
, CfvVariableStoreHeader
->Size
- sizeof (VARIABLE_STORE_HEADER
) - VariableOffset
)) {
129 DEBUG ((DEBUG_ERROR
, "TDX CFV: Variable header was invalid\n"));
133 VariableOffset
= CfvVariableStoreHeader
->Size
- sizeof (VARIABLE_STORE_HEADER
);
135 if (!((VariableHeader
->State
== VAR_IN_DELETED_TRANSITION
) ||
136 (VariableHeader
->State
== VAR_DELETED
) ||
137 (VariableHeader
->State
== VAR_HEADER_VALID_ONLY
) ||
138 (VariableHeader
->State
== VAR_ADDED
)))
140 DEBUG ((DEBUG_ERROR
, "TDX CFV: Variable header was invalid\n"));
144 VariableOffset
+= sizeof (AUTHENTICATED_VARIABLE_HEADER
) + VariableHeader
->NameSize
+ VariableHeader
->DataSize
;
145 // Verify VariableOffset should be less than or equal CfvVariableStoreHeader->Size - sizeof(VARIABLE_STORE_HEADER)
146 if (VariableOffset
> (CfvVariableStoreHeader
->Size
- sizeof (VARIABLE_STORE_HEADER
))) {
147 DEBUG ((DEBUG_ERROR
, "TDX CFV: Variable header was invalid\n"));
151 VariableOffsetBeforeAlign
= VariableOffset
;
153 VariableOffset
= (VariableOffset
+ 3) & (UINTN
)(~3);
155 if (!CheckPaddingData ((UINT8
*)(VariableBase
+ VariableOffsetBeforeAlign
), VariableOffset
- VariableOffsetBeforeAlign
)) {
156 DEBUG ((DEBUG_ERROR
, "TDX CFV: Variable header was invalid\n"));