+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006 - 2007, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- Crc32SectionExtract.c\r
-\r
-Abstract:\r
-\r
- Implements GUIDed section extraction protocol interface with \r
- a specific GUID: CRC32.\r
-\r
- Please refer to the Framewokr Firmware Volume Specification 0.9.\r
-\r
---*/\r
-\r
-\r
-#include <Crc32SectionExtract.h>\r
-\r
-EFI_STATUS\r
-GuidedSectionExtractionProtocolConstructor (\r
- OUT EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL **GuidedSep,\r
- IN EFI_EXTRACT_GUIDED_SECTION ExtractSection\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Constructor for the GUIDed section extraction protocol. Initializes\r
- instance data.\r
-\r
-Arguments:\r
-\r
- This Instance to construct\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS: Instance initialized.\r
-\r
---*/\r
-// TODO: GuidedSep - add argument and description to function comment\r
-// TODO: ExtractSection - add argument and description to function comment\r
-// TODO: EFI_OUT_OF_RESOURCES - add return value to function comment\r
-{\r
- *GuidedSep = AllocatePool (sizeof (EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL));\r
- if (*GuidedSep == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- (*GuidedSep)->ExtractSection = ExtractSection;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-InitializeCrc32GuidedSectionExtractionProtocol (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Entry point of the CRC32 GUIDed section extraction protocol. \r
- Creates and initializes an instance of the GUIDed section \r
- extraction protocol with CRC32 GUID.\r
-\r
-Arguments: \r
-\r
- ImageHandle EFI_HANDLE: A handle for the image that is initializing \r
- this driver\r
- SystemTable EFI_SYSTEM_TABLE: A pointer to the EFI system table \r
-\r
-Returns: \r
-\r
- EFI_SUCCESS: Driver initialized successfully\r
- EFI_LOAD_ERROR: Failed to Initialize or has been loaded \r
- EFI_OUT_OF_RESOURCES: Could not allocate needed resources\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL *Crc32GuidedSep;\r
- EFI_HANDLE Handle;\r
-\r
- //\r
- // Call all constructors per produced protocols\r
- //\r
- Status = GuidedSectionExtractionProtocolConstructor (\r
- &Crc32GuidedSep,\r
- (EFI_EXTRACT_GUIDED_SECTION) Crc32ExtractSection\r
- );\r
- if (EFI_ERROR (Status)) {\r
- if (Crc32GuidedSep != NULL) {\r
- FreePool (Crc32GuidedSep);\r
- }\r
-\r
- return Status;\r
- }\r
- //\r
- // Pass in a NULL to install to a new handle\r
- //\r
- Handle = NULL;\r
- Status = gBS->InstallProtocolInterface (\r
- &Handle,\r
- &gEfiCrc32GuidedSectionExtractionProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- Crc32GuidedSep\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreePool (Crc32GuidedSep);\r
- return EFI_LOAD_ERROR;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-UINT32\r
-EFIAPI\r
-GetSectionLength (\r
- IN EFI_COMMON_SECTION_HEADER *CommonHeader\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Get a length of section.\r
-\r
- Parameters:\r
- CommonHeader - Pointer to the common section header.\r
-\r
- Return Value:\r
- The length of the section, including the section header.\r
-\r
---*/\r
-// TODO: function comment is missing 'Arguments:'\r
-// TODO: function comment is missing 'Returns:'\r
-// TODO: CommonHeader - add argument and description to function comment\r
-{\r
- UINT32 Size;\r
-\r
- Size = *(UINT32 *) CommonHeader->Size & 0x00FFFFFF;\r
-\r
- return Size;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-Crc32ExtractSection (\r
- IN EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL *This,\r
- IN VOID *InputSection,\r
- OUT VOID **OutputBuffer,\r
- OUT UINTN *OutputSize,\r
- OUT UINT32 *AuthenticationStatus\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- This function reads and extracts contents of a section from an\r
- encapsulating section.\r
-\r
- Parameters:\r
- This - Indicates the calling context.\r
- InputSection - Buffer containing the input GUIDed section \r
- to be processed.\r
- OutputBuffer - *OutputBuffer is allocated from boot services\r
- pool memory and containing the new section\r
- stream. The caller is responsible for freeing\r
- this buffer.\r
- AuthenticationStatus - Pointer to a caller allocated UINT32 that\r
- indicates the authentication status of the\r
- output buffer\r
-\r
- Return Value:\r
- EFI_SUCCESS\r
- EFI_OUT_OF_RESOURCES\r
- EFI_INVALID_PARAMETER\r
- EFI_NOT_AVAILABLE_YET\r
-\r
---*/\r
-// TODO: function comment is missing 'Arguments:'\r
-// TODO: function comment is missing 'Returns:'\r
-// TODO: This - add argument and description to function comment\r
-// TODO: InputSection - add argument and description to function comment\r
-// TODO: OutputBuffer - add argument and description to function comment\r
-// TODO: OutputSize - add argument and description to function comment\r
-// TODO: AuthenticationStatus - add argument and description to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
-// TODO: EFI_OUT_OF_RESOURCES - add return value to function comment\r
-// TODO: EFI_SUCCESS - add return value to function comment\r
-{\r
- EFI_STATUS Status;\r
- CRC32_SECTION_HEADER *Crc32SectionHeader;\r
- EFI_GUID_DEFINED_SECTION *GuidedSectionHeader;\r
- UINT8 *Image;\r
- UINT32 Crc32Checksum;\r
- VOID *DummyInterface;\r
-\r
- if (OutputBuffer == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- *OutputBuffer = NULL;\r
-\r
- //\r
- // Points to the section header\r
- //\r
- Crc32SectionHeader = (CRC32_SECTION_HEADER *) InputSection;\r
- GuidedSectionHeader = (EFI_GUID_DEFINED_SECTION *) InputSection;\r
-\r
- //\r
- // Check if the GUID is a CRC32 section GUID\r
- //\r
- if (!CompareGuid (\r
- &(GuidedSectionHeader->SectionDefinitionGuid),\r
- &gEfiCrc32GuidedSectionExtractionProtocolGuid\r
- )) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Image = (UINT8 *) InputSection + (UINT32) (GuidedSectionHeader->DataOffset);\r
- *OutputSize = GetSectionLength ((EFI_COMMON_SECTION_HEADER *) InputSection) - (UINT32) GuidedSectionHeader->DataOffset;\r
-\r
- *OutputBuffer = AllocatePool (*OutputSize);\r
- if (*OutputBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // Implictly CRC32 GUIDed section should have STATUS_VALID bit set\r
- //\r
- ASSERT (GuidedSectionHeader->Attributes & EFI_GUIDED_SECTION_AUTH_STATUS_VALID);\r
- *AuthenticationStatus = EFI_AUTH_STATUS_IMAGE_SIGNED;\r
-\r
- //\r
- // Check whether there exists EFI_SECURITY_POLICY_PROTOCOL_GUID.\r
- //\r
- Status = gBS->LocateProtocol (&gEfiSecurityPolicyProtocolGuid, NULL, &DummyInterface);\r
- if (!EFI_ERROR (Status)) {\r
- *AuthenticationStatus |= EFI_AUTH_STATUS_PLATFORM_OVERRIDE;\r
- } else {\r
- //\r
- // Calculate CRC32 Checksum of Image\r
- //\r
- gBS->CalculateCrc32 (Image, *OutputSize, &Crc32Checksum);\r
- if (Crc32Checksum != Crc32SectionHeader->CRC32Checksum) {\r
- *AuthenticationStatus |= EFI_AUTH_STATUS_TEST_FAILED;\r
- }\r
- }\r
-\r
- CopyMem (*OutputBuffer, Image, *OutputSize);\r
-\r
- return EFI_SUCCESS;\r
-}\r