OvmfPkg: Add custom SecureBootConfigDxe that doesn't reset
We don't force a platform reset for OVMF when PK is changed in custom mode setup. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Lee Rosenbaum <lee.g.rosenbaum@intel.com> Reviewed-by: Erik Bjorge <erik.c.bjorge@intel.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13635 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
334
OvmfPkg/SecureBootConfigDxe/SecureBootConfigMisc.c
Normal file
334
OvmfPkg/SecureBootConfigDxe/SecureBootConfigMisc.c
Normal file
@@ -0,0 +1,334 @@
|
||||
/** @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;
|
||||
}
|
Reference in New Issue
Block a user