/** @file | |
Helper functions for SecureBoot configuration module. | |
Copyright (c) 2012, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include "SecureBootConfigImpl.h" | |
/** | |
Read file content into BufferPtr, the size of the allocate buffer | |
is *FileSize plus AddtionAllocateSize. | |
@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] AddtionAllocateSize Addtion 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 AddtionAllocateSize | |
) | |
{ | |
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 + AddtionAllocateSize; | |
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; | |
} | |
/** | |
Convert a String to Guid Value. | |
@param[in] Str Specifies the String to be converted. | |
@param[in] StrLen Number of Unicode Characters of String (exclusive \0) | |
@param[out] Guid Return the result Guid value. | |
@retval EFI_SUCCESS The operation is finished successfully. | |
@retval EFI_NOT_FOUND Invalid string. | |
**/ | |
EFI_STATUS | |
StringToGuid ( | |
IN CHAR16 *Str, | |
IN UINTN StrLen, | |
OUT EFI_GUID *Guid | |
) | |
{ | |
CHAR16 *PtrBuffer; | |
CHAR16 *PtrPosition; | |
UINT16 *Buffer; | |
UINTN Data; | |
UINTN Index; | |
UINT16 Digits[3]; | |
Buffer = (CHAR16 *) AllocateZeroPool (sizeof (CHAR16) * (StrLen + 1)); | |
if (Buffer == NULL) { | |
return EFI_OUT_OF_RESOURCES; | |
} | |
StrCpy (Buffer, Str); | |
// | |
// Data1 | |
// | |
PtrBuffer = Buffer; | |
PtrPosition = PtrBuffer; | |
while (*PtrBuffer != L'\0') { | |
if (*PtrBuffer == L'-') { | |
break; | |
} | |
PtrBuffer++; | |
} | |
if (*PtrBuffer == L'\0') { | |
FreePool (Buffer); | |
return EFI_NOT_FOUND; | |
} | |
*PtrBuffer = L'\0'; | |
Data = StrHexToUintn (PtrPosition); | |
Guid->Data1 = (UINT32)Data; | |
// | |
// Data2 | |
// | |
PtrBuffer++; | |
PtrPosition = PtrBuffer; | |
while (*PtrBuffer != L'\0') { | |
if (*PtrBuffer == L'-') { | |
break; | |
} | |
PtrBuffer++; | |
} | |
if (*PtrBuffer == L'\0') { | |
FreePool (Buffer); | |
return EFI_NOT_FOUND; | |
} | |
*PtrBuffer = L'\0'; | |
Data = StrHexToUintn (PtrPosition); | |
Guid->Data2 = (UINT16)Data; | |
// | |
// Data3 | |
// | |
PtrBuffer++; | |
PtrPosition = PtrBuffer; | |
while (*PtrBuffer != L'\0') { | |
if (*PtrBuffer == L'-') { | |
break; | |
} | |
PtrBuffer++; | |
} | |
if (*PtrBuffer == L'\0') { | |
FreePool (Buffer); | |
return EFI_NOT_FOUND; | |
} | |
*PtrBuffer = L'\0'; | |
Data = StrHexToUintn (PtrPosition); | |
Guid->Data3 = (UINT16)Data; | |
// | |
// Data4[0..1] | |
// | |
for ( Index = 0 ; Index < 2 ; Index++) { | |
PtrBuffer++; | |
if ((*PtrBuffer == L'\0') || ( *(PtrBuffer + 1) == L'\0')) { | |
FreePool (Buffer); | |
return EFI_NOT_FOUND; | |
} | |
Digits[0] = *PtrBuffer; | |
PtrBuffer++; | |
Digits[1] = *PtrBuffer; | |
Digits[2] = L'\0'; | |
Data = StrHexToUintn (Digits); | |
Guid->Data4[Index] = (UINT8)Data; | |
} | |
// | |
// skip the '-' | |
// | |
PtrBuffer++; | |
if ((*PtrBuffer != L'-' ) || ( *PtrBuffer == L'\0')) { | |
return EFI_NOT_FOUND; | |
} | |
// | |
// Data4[2..7] | |
// | |
for ( ; Index < 8; Index++) { | |
PtrBuffer++; | |
if ((*PtrBuffer == L'\0') || ( *(PtrBuffer + 1) == L'\0')) { | |
FreePool (Buffer); | |
return EFI_NOT_FOUND; | |
} | |
Digits[0] = *PtrBuffer; | |
PtrBuffer++; | |
Digits[1] = *PtrBuffer; | |
Digits[2] = L'\0'; | |
Data = StrHexToUintn (Digits); | |
Guid->Data4[Index] = (UINT8)Data; | |
} | |
FreePool (Buffer); | |
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; | |
} |