/** @file Helper functions for SecureBoot configuration module. Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "SecureBootConfigImpl.h" /** Read file content into BufferPtr, the size of the allocate buffer is *FileSize plus AdditionAllocateSize. @param[in] FileHandle The file to be read. @param[in, out] BufferPtr Pointers to the pointer of allocated buffer. @param[out] FileSize Size of input file @param[in] AdditionAllocateSize Addition size the buffer need to be allocated. In case the buffer need to contain others besides the file content. @retval EFI_SUCCESS The file was read into the buffer. @retval EFI_INVALID_PARAMETER A parameter was invalid. @retval EFI_OUT_OF_RESOURCES A memory allocation failed. @retval others Unexpected error. **/ EFI_STATUS ReadFileContent ( IN EFI_FILE_HANDLE FileHandle, IN OUT VOID **BufferPtr, OUT UINTN *FileSize, IN UINTN AdditionAllocateSize ) { UINTN BufferSize; UINT64 SourceFileSize; VOID *Buffer; EFI_STATUS Status; if ((FileHandle == NULL) || (FileSize == NULL)) { return EFI_INVALID_PARAMETER; } Buffer = NULL; // // Get the file size // Status = FileHandle->SetPosition (FileHandle, (UINT64) -1); if (EFI_ERROR (Status)) { goto ON_EXIT; } Status = FileHandle->GetPosition (FileHandle, &SourceFileSize); if (EFI_ERROR (Status)) { goto ON_EXIT; } Status = FileHandle->SetPosition (FileHandle, 0); if (EFI_ERROR (Status)) { goto ON_EXIT; } BufferSize = (UINTN) SourceFileSize + AdditionAllocateSize; Buffer = AllocateZeroPool(BufferSize); if (Buffer == NULL) { return EFI_OUT_OF_RESOURCES; } BufferSize = (UINTN) SourceFileSize; *FileSize = BufferSize; Status = FileHandle->Read (FileHandle, &BufferSize, Buffer); if (EFI_ERROR (Status) || BufferSize != *FileSize) { FreePool (Buffer); Buffer = NULL; Status = EFI_BAD_BUFFER_SIZE; goto ON_EXIT; } ON_EXIT: *BufferPtr = Buffer; return Status; } /** Close an open file handle. @param[in] FileHandle The file handle to close. **/ VOID CloseFile ( IN EFI_FILE_HANDLE FileHandle ) { if (FileHandle != NULL) { FileHandle->Close (FileHandle); } } /** Convert a nonnegative integer to an octet string of a specified length. @param[in] Integer Pointer to the nonnegative integer to be converted @param[in] IntSizeInWords Length of integer buffer in words @param[out] OctetString Converted octet string of the specified length @param[in] OSSizeInBytes Intended length of resulting octet string in bytes Returns: @retval EFI_SUCCESS Data conversion successfully @retval EFI_BUFFER_TOOL_SMALL Buffer is too small for output string **/ EFI_STATUS EFIAPI Int2OctStr ( IN CONST UINTN *Integer, IN UINTN IntSizeInWords, OUT UINT8 *OctetString, IN UINTN OSSizeInBytes ) { CONST UINT8 *Ptr1; UINT8 *Ptr2; for (Ptr1 = (CONST UINT8 *)Integer, Ptr2 = OctetString + OSSizeInBytes - 1; Ptr1 < (UINT8 *)(Integer + IntSizeInWords) && Ptr2 >= OctetString; Ptr1++, Ptr2--) { *Ptr2 = *Ptr1; } for (; Ptr1 < (CONST UINT8 *)(Integer + IntSizeInWords) && *Ptr1 == 0; Ptr1++); if (Ptr1 < (CONST UINT8 *)(Integer + IntSizeInWords)) { return EFI_BUFFER_TOO_SMALL; } if (Ptr2 >= OctetString) { ZeroMem (OctetString, Ptr2 - OctetString + 1); } return EFI_SUCCESS; } /** Worker function that prints an EFI_GUID into specified Buffer. @param[in] Guid Pointer to GUID to print. @param[in] Buffer Buffer to print Guid into. @param[in] BufferSize Size of Buffer. @retval Number of characters printed. **/ UINTN GuidToString ( IN EFI_GUID *Guid, IN CHAR16 *Buffer, IN UINTN BufferSize ) { UINTN Size; Size = UnicodeSPrint ( Buffer, BufferSize, L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", (UINTN)Guid->Data1, (UINTN)Guid->Data2, (UINTN)Guid->Data3, (UINTN)Guid->Data4[0], (UINTN)Guid->Data4[1], (UINTN)Guid->Data4[2], (UINTN)Guid->Data4[3], (UINTN)Guid->Data4[4], (UINTN)Guid->Data4[5], (UINTN)Guid->Data4[6], (UINTN)Guid->Data4[7] ); // // SPrint will null terminate the string. The -1 skips the null // return Size - 1; }