3 Copyright (c) 2006 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Implements GUIDed section extraction protocol interface with
19 a specific GUID: CRC32.
21 Please refer to the Framewokr Firmware Volume Specification 0.9.
26 #include <GuidedSection.h>
27 #include <Crc32SectionExtract.h>
31 InitializeCrc32GuidedSectionExtractionProtocol (
32 IN EFI_HANDLE ImageHandle
,
33 IN EFI_SYSTEM_TABLE
*SystemTable
39 Entry point of the CRC32 GUIDed section extraction protocol.
40 Creates and initializes an instance of the GUIDed section
41 extraction protocol with CRC32 GUID.
45 ImageHandle EFI_HANDLE: A handle for the image that is initializing
47 SystemTable EFI_SYSTEM_TABLE: A pointer to the EFI system table
51 EFI_SUCCESS: Driver initialized successfully
52 EFI_LOAD_ERROR: Failed to Initialize or has been loaded
53 EFI_OUT_OF_RESOURCES: Could not allocate needed resources
58 EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL
*Crc32GuidedSep
;
62 // Call all constructors per produced protocols
64 Status
= GuidedSectionExtractionProtocolConstructor (
66 (EFI_EXTRACT_GUIDED_SECTION
) Crc32ExtractSection
68 if (EFI_ERROR (Status
)) {
69 if (Crc32GuidedSep
!= NULL
) {
70 FreePool (Crc32GuidedSep
);
76 // Pass in a NULL to install to a new handle
79 Status
= gBS
->InstallProtocolInterface (
81 &gEfiCrc32GuidedSectionExtractionProtocolGuid
,
85 if (EFI_ERROR (Status
)) {
86 FreePool (Crc32GuidedSep
);
87 return EFI_LOAD_ERROR
;
97 IN EFI_COMMON_SECTION_HEADER
*CommonHeader
102 Get a length of section.
105 CommonHeader - Pointer to the common section header.
108 The length of the section, including the section header.
111 // TODO: function comment is missing 'Arguments:'
112 // TODO: function comment is missing 'Returns:'
113 // TODO: CommonHeader - add argument and description to function comment
117 Size
= *(UINT32
*) CommonHeader
->Size
& 0x00FFFFFF;
125 Crc32ExtractSection (
126 IN EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL
*This
,
127 IN VOID
*InputSection
,
128 OUT VOID
**OutputBuffer
,
129 OUT UINTN
*OutputSize
,
130 OUT UINT32
*AuthenticationStatus
135 This function reads and extracts contents of a section from an
136 encapsulating section.
139 This - Indicates the calling context.
140 InputSection - Buffer containing the input GUIDed section
142 OutputBuffer - *OutputBuffer is allocated from boot services
143 pool memory and containing the new section
144 stream. The caller is responsible for freeing
146 AuthenticationStatus - Pointer to a caller allocated UINT32 that
147 indicates the authentication status of the
153 EFI_INVALID_PARAMETER
154 EFI_NOT_AVAILABLE_YET
157 // TODO: function comment is missing 'Arguments:'
158 // TODO: function comment is missing 'Returns:'
159 // TODO: This - add argument and description to function comment
160 // TODO: InputSection - add argument and description to function comment
161 // TODO: OutputBuffer - add argument and description to function comment
162 // TODO: OutputSize - add argument and description to function comment
163 // TODO: AuthenticationStatus - add argument and description to function comment
164 // TODO: EFI_INVALID_PARAMETER - add return value to function comment
165 // TODO: EFI_INVALID_PARAMETER - add return value to function comment
166 // TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
167 // TODO: EFI_SUCCESS - add return value to function comment
170 CRC32_SECTION_HEADER
*Crc32SectionHeader
;
171 EFI_GUID_DEFINED_SECTION
*GuidedSectionHeader
;
173 UINT32 Crc32Checksum
;
174 VOID
*DummyInterface
;
176 if (OutputBuffer
== NULL
) {
177 return EFI_INVALID_PARAMETER
;
180 *OutputBuffer
= NULL
;
183 // Points to the section header
185 Crc32SectionHeader
= (CRC32_SECTION_HEADER
*) InputSection
;
186 GuidedSectionHeader
= (EFI_GUID_DEFINED_SECTION
*) InputSection
;
189 // Check if the GUID is a CRC32 section GUID
192 &(GuidedSectionHeader
->SectionDefinitionGuid
),
193 &gEfiCrc32GuidedSectionExtractionProtocolGuid
195 return EFI_INVALID_PARAMETER
;
198 Image
= (UINT8
*) InputSection
+ (UINT32
) (GuidedSectionHeader
->DataOffset
);
199 *OutputSize
= GetSectionLength ((EFI_COMMON_SECTION_HEADER
*) InputSection
) - (UINT32
) GuidedSectionHeader
->DataOffset
;
201 *OutputBuffer
= AllocatePool (*OutputSize
);
202 if (*OutputBuffer
== NULL
) {
203 return EFI_OUT_OF_RESOURCES
;
206 // Implictly CRC32 GUIDed section should have STATUS_VALID bit set
208 ASSERT (GuidedSectionHeader
->Attributes
& EFI_GUIDED_SECTION_AUTH_STATUS_VALID
);
209 *AuthenticationStatus
= EFI_LOCAL_AUTH_STATUS_IMAGE_SIGNED
| EFI_AGGREGATE_AUTH_STATUS_IMAGE_SIGNED
;
212 // Check whether there exists EFI_SECURITY_POLICY_PROTOCOL_GUID.
214 Status
= gBS
->LocateProtocol (&gEfiSecurityPolicyProtocolGuid
, NULL
, &DummyInterface
);
215 if (!EFI_ERROR (Status
)) {
216 *AuthenticationStatus
|= EFI_LOCAL_AUTH_STATUS_PLATFORM_OVERRIDE
| EFI_AGGREGATE_AUTH_STATUS_PLATFORM_OVERRIDE
;
219 // Calculate CRC32 Checksum of Image
221 gBS
->CalculateCrc32 (Image
, *OutputSize
, &Crc32Checksum
);
222 if (Crc32Checksum
!= Crc32SectionHeader
->CRC32Checksum
) {
223 *AuthenticationStatus
|= EFI_LOCAL_AUTH_STATUS_TEST_FAILED
| EFI_AGGREGATE_AUTH_STATUS_TEST_FAILED
;
227 CopyMem (*OutputBuffer
, Image
, *OutputSize
);