2012-03-27 10:17:23 +02:00
|
|
|
/** @file
|
|
|
|
Internal file explorer functions for SecureBoot configuration module.
|
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
Copyright (c) 2012 - 2016, Intel Corporation. All rights reserved.<BR>
|
2012-03-27 10:17:23 +02:00
|
|
|
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"
|
|
|
|
|
|
|
|
VOID *mStartOpCodeHandle = NULL;
|
|
|
|
VOID *mEndOpCodeHandle = NULL;
|
|
|
|
EFI_IFR_GUID_LABEL *mStartLabel = NULL;
|
|
|
|
EFI_IFR_GUID_LABEL *mEndLabel = NULL;
|
|
|
|
|
|
|
|
/**
|
2016-01-28 02:36:43 +01:00
|
|
|
Refresh the global UpdateData structure.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
|
|
|
**/
|
2016-01-28 02:36:43 +01:00
|
|
|
VOID
|
|
|
|
RefreshUpdateData (
|
|
|
|
VOID
|
2012-03-27 10:17:23 +02:00
|
|
|
)
|
|
|
|
{
|
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
// Free current updated date
|
2012-03-27 10:17:23 +02:00
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
if (mStartOpCodeHandle != NULL) {
|
|
|
|
HiiFreeOpCodeHandle (mStartOpCodeHandle);
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
// Create new OpCode Handle
|
2012-03-27 10:17:23 +02:00
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
mStartOpCodeHandle = HiiAllocateOpCodeHandle ();
|
2012-03-27 10:17:23 +02:00
|
|
|
|
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
// Create Hii Extend Label OpCode as the start opcode
|
2012-03-27 10:17:23 +02:00
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
|
|
|
|
mStartOpCodeHandle,
|
|
|
|
&gEfiIfrTianoGuid,
|
|
|
|
NULL,
|
|
|
|
sizeof (EFI_IFR_GUID_LABEL)
|
2012-03-27 10:17:23 +02:00
|
|
|
);
|
2016-01-28 02:36:43 +01:00
|
|
|
mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-01-28 02:36:43 +01:00
|
|
|
Clean up the dynamic opcode at label and form specified by both LabelId.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@param[in] LabelId It is both the Form ID and Label ID for opcode deletion.
|
|
|
|
@param[in] PrivateData Module private data.
|
2014-11-14 09:41:12 +01:00
|
|
|
|
2012-03-27 10:17:23 +02:00
|
|
|
**/
|
|
|
|
VOID
|
2016-01-28 02:36:43 +01:00
|
|
|
CleanUpPage (
|
|
|
|
IN UINT16 LabelId,
|
|
|
|
IN SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData
|
2012-03-27 10:17:23 +02:00
|
|
|
)
|
|
|
|
{
|
2016-01-28 02:36:43 +01:00
|
|
|
RefreshUpdateData ();
|
2012-03-27 10:17:23 +02:00
|
|
|
|
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
// Remove all op-codes from dynamic page
|
2012-03-27 10:17:23 +02:00
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
mStartLabel->Number = LabelId;
|
|
|
|
HiiUpdateForm (
|
|
|
|
PrivateData->HiiHandle,
|
|
|
|
&gSecureBootConfigFormSetGuid,
|
|
|
|
LabelId,
|
|
|
|
mStartOpCodeHandle, // Label LabelId
|
|
|
|
mEndOpCodeHandle // LABEL_END
|
|
|
|
);
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
This function will open a file or directory referenced by DevicePath.
|
|
|
|
|
|
|
|
This function opens a file with the open mode according to the file path. The
|
|
|
|
Attributes is valid only for EFI_FILE_MODE_CREATE.
|
|
|
|
|
2014-11-14 09:41:12 +01:00
|
|
|
@param[in, out] FilePath On input, the device path to the file.
|
2012-03-27 10:17:23 +02:00
|
|
|
On output, the remaining device path.
|
|
|
|
@param[out] FileHandle Pointer to the file handle.
|
|
|
|
@param[in] OpenMode The mode to open the file with.
|
|
|
|
@param[in] Attributes The file's file attributes.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The information was set.
|
|
|
|
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
|
|
|
|
@retval EFI_UNSUPPORTED Could not open the file path.
|
|
|
|
@retval EFI_NOT_FOUND The specified file could not be found on the
|
|
|
|
device or the file system could not be found on
|
|
|
|
the device.
|
|
|
|
@retval EFI_NO_MEDIA The device has no medium.
|
|
|
|
@retval EFI_MEDIA_CHANGED The device has a different medium in it or the
|
|
|
|
medium is no longer supported.
|
|
|
|
@retval EFI_DEVICE_ERROR The device reported an error.
|
|
|
|
@retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
|
|
|
|
@retval EFI_WRITE_PROTECTED The file or medium is write protected.
|
|
|
|
@retval EFI_ACCESS_DENIED The file was opened read only.
|
|
|
|
@retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the
|
|
|
|
file.
|
|
|
|
@retval EFI_VOLUME_FULL The volume is full.
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
OpenFileByDevicePath(
|
|
|
|
IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath,
|
|
|
|
OUT EFI_FILE_HANDLE *FileHandle,
|
|
|
|
IN UINT64 OpenMode,
|
|
|
|
IN UINT64 Attributes
|
|
|
|
)
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *EfiSimpleFileSystemProtocol;
|
|
|
|
EFI_FILE_PROTOCOL *Handle1;
|
|
|
|
EFI_FILE_PROTOCOL *Handle2;
|
2014-11-14 09:41:12 +01:00
|
|
|
EFI_HANDLE DeviceHandle;
|
2012-03-27 10:17:23 +02:00
|
|
|
|
|
|
|
if ((FilePath == NULL || FileHandle == NULL)) {
|
|
|
|
return EFI_INVALID_PARAMETER;
|
|
|
|
}
|
|
|
|
|
|
|
|
Status = gBS->LocateDevicePath (
|
|
|
|
&gEfiSimpleFileSystemProtocolGuid,
|
|
|
|
FilePath,
|
|
|
|
&DeviceHandle
|
|
|
|
);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
Status = gBS->OpenProtocol(
|
|
|
|
DeviceHandle,
|
|
|
|
&gEfiSimpleFileSystemProtocolGuid,
|
|
|
|
(VOID**)&EfiSimpleFileSystemProtocol,
|
|
|
|
gImageHandle,
|
|
|
|
NULL,
|
|
|
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
|
|
|
);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
Status = EfiSimpleFileSystemProtocol->OpenVolume(EfiSimpleFileSystemProtocol, &Handle1);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
FileHandle = NULL;
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// go down directories one node at a time.
|
|
|
|
//
|
|
|
|
while (!IsDevicePathEnd (*FilePath)) {
|
|
|
|
//
|
|
|
|
// For file system access each node should be a file path component
|
|
|
|
//
|
|
|
|
if (DevicePathType (*FilePath) != MEDIA_DEVICE_PATH ||
|
|
|
|
DevicePathSubType (*FilePath) != MEDIA_FILEPATH_DP
|
|
|
|
) {
|
|
|
|
FileHandle = NULL;
|
|
|
|
return (EFI_INVALID_PARAMETER);
|
|
|
|
}
|
|
|
|
//
|
|
|
|
// Open this file path node
|
|
|
|
//
|
|
|
|
Handle2 = Handle1;
|
|
|
|
Handle1 = NULL;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Try to test opening an existing file
|
|
|
|
//
|
|
|
|
Status = Handle2->Open (
|
|
|
|
Handle2,
|
|
|
|
&Handle1,
|
|
|
|
((FILEPATH_DEVICE_PATH*)*FilePath)->PathName,
|
|
|
|
OpenMode &~EFI_FILE_MODE_CREATE,
|
|
|
|
0
|
|
|
|
);
|
|
|
|
|
|
|
|
//
|
|
|
|
// see if the error was that it needs to be created
|
|
|
|
//
|
|
|
|
if ((EFI_ERROR (Status)) && (OpenMode != (OpenMode &~EFI_FILE_MODE_CREATE))) {
|
|
|
|
Status = Handle2->Open (
|
|
|
|
Handle2,
|
|
|
|
&Handle1,
|
|
|
|
((FILEPATH_DEVICE_PATH*)*FilePath)->PathName,
|
|
|
|
OpenMode,
|
|
|
|
Attributes
|
|
|
|
);
|
|
|
|
}
|
|
|
|
//
|
|
|
|
// Close the last node
|
|
|
|
//
|
|
|
|
Handle2->Close (Handle2);
|
|
|
|
|
|
|
|
if (EFI_ERROR(Status)) {
|
|
|
|
return (Status);
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Get the next node
|
|
|
|
//
|
|
|
|
*FilePath = NextDevicePathNode (*FilePath);
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// This is a weak spot since if the undefined SHELL_FILE_HANDLE format changes this must change also!
|
|
|
|
//
|
|
|
|
*FileHandle = (VOID*)Handle1;
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
|
2012-03-27 10:17:23 +02:00
|
|
|
/**
|
2016-01-28 02:36:43 +01:00
|
|
|
Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.
|
2016-02-29 07:37:07 +01:00
|
|
|
The caller is responsible for freeing the allocated buffer using FreePool(). If return NULL
|
|
|
|
means not enough memory resource.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@param DevicePath Device path.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-02-29 07:37:07 +01:00
|
|
|
@retval NULL Not enough memory resourece for AllocateCopyPool.
|
|
|
|
@retval Other A new allocated string that represents the file name.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
|
|
|
**/
|
2016-01-28 02:36:43 +01:00
|
|
|
CHAR16 *
|
|
|
|
ExtractFileNameFromDevicePath (
|
|
|
|
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
2012-03-27 10:17:23 +02:00
|
|
|
)
|
|
|
|
{
|
2016-01-28 02:36:43 +01:00
|
|
|
CHAR16 *String;
|
|
|
|
CHAR16 *MatchString;
|
|
|
|
CHAR16 *LastMatch;
|
|
|
|
CHAR16 *FileName;
|
|
|
|
UINTN Length;
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
ASSERT(DevicePath != NULL);
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
String = DevicePathToStr(DevicePath);
|
|
|
|
MatchString = String;
|
|
|
|
LastMatch = String;
|
2016-02-29 07:37:07 +01:00
|
|
|
FileName = NULL;
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
while(MatchString != NULL){
|
|
|
|
LastMatch = MatchString + 1;
|
|
|
|
MatchString = StrStr(LastMatch,L"\\");
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
Length = StrLen(LastMatch);
|
|
|
|
FileName = AllocateCopyPool ((Length + 1) * sizeof(CHAR16), LastMatch);
|
2016-02-29 07:37:07 +01:00
|
|
|
if (FileName != NULL) {
|
|
|
|
*(FileName + Length) = 0;
|
|
|
|
}
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
FreePool(String);
|
2014-11-14 09:41:12 +01:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
return FileName;
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2016-01-28 02:36:43 +01:00
|
|
|
Update the form base on the selected file.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@param FilePath Point to the file path.
|
|
|
|
@param FormId The form need to display.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@retval TRUE Exit caller function.
|
|
|
|
@retval FALSE Not exit caller function.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
|
|
|
**/
|
2016-01-28 02:36:43 +01:00
|
|
|
BOOLEAN
|
|
|
|
UpdatePage(
|
|
|
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
|
|
|
IN EFI_FORM_ID FormId
|
2012-03-27 10:17:23 +02:00
|
|
|
)
|
|
|
|
{
|
2016-01-28 02:36:43 +01:00
|
|
|
CHAR16 *FileName;
|
|
|
|
EFI_STRING_ID StringToken;
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-02-29 07:37:07 +01:00
|
|
|
FileName = NULL;
|
|
|
|
|
|
|
|
if (FilePath != NULL) {
|
2016-01-28 02:36:43 +01:00
|
|
|
FileName = ExtractFileNameFromDevicePath(FilePath);
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
2016-02-29 07:37:07 +01:00
|
|
|
if (FileName == NULL) {
|
|
|
|
//
|
|
|
|
// FileName = NULL has two case:
|
|
|
|
// 1. FilePath == NULL, not select file.
|
|
|
|
// 2. FilePath != NULL, but ExtractFileNameFromDevicePath return NULL not enough memory resource.
|
|
|
|
// In these two case, no need to update the form, and exit the caller function.
|
|
|
|
//
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
StringToken = HiiSetString (gSecureBootPrivateData->HiiHandle, 0, FileName, NULL);
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
gSecureBootPrivateData->FileContext->FileName = FileName;
|
2014-11-14 09:41:12 +01:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
OpenFileByDevicePath(
|
|
|
|
&FilePath,
|
|
|
|
&gSecureBootPrivateData->FileContext->FHandle,
|
|
|
|
EFI_FILE_MODE_READ,
|
|
|
|
0
|
|
|
|
);
|
2012-03-27 10:17:23 +02:00
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
// Create Subtitle op-code for the display string of the option.
|
2012-03-27 10:17:23 +02:00
|
|
|
//
|
2016-01-28 02:36:43 +01:00
|
|
|
RefreshUpdateData ();
|
|
|
|
mStartLabel->Number = FormId;
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
HiiCreateSubTitleOpCode (
|
|
|
|
mStartOpCodeHandle,
|
|
|
|
StringToken,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0
|
|
|
|
);
|
|
|
|
|
|
|
|
HiiUpdateForm (
|
|
|
|
gSecureBootPrivateData->HiiHandle,
|
|
|
|
&gSecureBootConfigFormSetGuid,
|
|
|
|
FormId,
|
|
|
|
mStartOpCodeHandle, // Label FormId
|
|
|
|
mEndOpCodeHandle // LABEL_END
|
|
|
|
);
|
|
|
|
|
|
|
|
return TRUE;
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-01-28 02:36:43 +01:00
|
|
|
Update the PK form base on the input file path info.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@param FilePath Point to the file path.
|
|
|
|
|
|
|
|
@retval TRUE Exit caller function.
|
|
|
|
@retval FALSE Not exit caller function.
|
2012-03-27 10:17:23 +02:00
|
|
|
**/
|
2016-01-28 02:36:43 +01:00
|
|
|
BOOLEAN
|
SecurityPkg/SecureBootConfigDxe: Declare EFIAPI for the ChooseFile handlers
The SecureBootConfig now uses ChooseFile() from FileExplorerLib
to select the certificates to be enrolled into PK, KEK, DB, DBX,
or DBT, and the corresponding handlers to get the content of the
file. Per the definition of CHOOSE_HANDLER, the handler must use
EFIAPI as the calling convention. However, the calling convention
was not specified the following handlers: UpdatePKFromFile(),
UpdateKEKFromFile(), UpdateDBFromFile(), UpdateDBXFromFile(), and
UpdateDBTFromFile(). When compiling the firmware with gcc, the
default calling convention is not compatible with EFIAPI, so the
handlers interpreted the argument the wrong way and passed the
wrong device path to UpdatePage(), and the system crashed when
the user tried to enroll a certificate into the key database.
This commit specifies the calling convention for those functions
so that gcc can generate the right code.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Dandan Bi <dandan.bi@intel.com>
2016-03-21 10:04:36 +01:00
|
|
|
EFIAPI
|
2016-01-28 02:36:43 +01:00
|
|
|
UpdatePKFromFile (
|
|
|
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath
|
2012-03-27 10:17:23 +02:00
|
|
|
)
|
|
|
|
{
|
2016-01-28 02:36:43 +01:00
|
|
|
return UpdatePage(FilePath, FORMID_ENROLL_PK_FORM);
|
2012-03-27 10:17:23 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-01-28 02:36:43 +01:00
|
|
|
Update the KEK form base on the input file path info.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@param FilePath Point to the file path.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@retval TRUE Exit caller function.
|
|
|
|
@retval FALSE Not exit caller function.
|
2012-03-27 10:17:23 +02:00
|
|
|
**/
|
2016-01-28 02:36:43 +01:00
|
|
|
BOOLEAN
|
SecurityPkg/SecureBootConfigDxe: Declare EFIAPI for the ChooseFile handlers
The SecureBootConfig now uses ChooseFile() from FileExplorerLib
to select the certificates to be enrolled into PK, KEK, DB, DBX,
or DBT, and the corresponding handlers to get the content of the
file. Per the definition of CHOOSE_HANDLER, the handler must use
EFIAPI as the calling convention. However, the calling convention
was not specified the following handlers: UpdatePKFromFile(),
UpdateKEKFromFile(), UpdateDBFromFile(), UpdateDBXFromFile(), and
UpdateDBTFromFile(). When compiling the firmware with gcc, the
default calling convention is not compatible with EFIAPI, so the
handlers interpreted the argument the wrong way and passed the
wrong device path to UpdatePage(), and the system crashed when
the user tried to enroll a certificate into the key database.
This commit specifies the calling convention for those functions
so that gcc can generate the right code.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Dandan Bi <dandan.bi@intel.com>
2016-03-21 10:04:36 +01:00
|
|
|
EFIAPI
|
2016-01-28 02:36:43 +01:00
|
|
|
UpdateKEKFromFile (
|
|
|
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath
|
2012-03-27 10:17:23 +02:00
|
|
|
)
|
|
|
|
{
|
2016-01-28 02:36:43 +01:00
|
|
|
return UpdatePage(FilePath, FORMID_ENROLL_KEK_FORM);
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-01-28 02:36:43 +01:00
|
|
|
Update the DB form base on the input file path info.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@param FilePath Point to the file path.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@retval TRUE Exit caller function.
|
|
|
|
@retval FALSE Not exit caller function.
|
2012-03-27 10:17:23 +02:00
|
|
|
**/
|
|
|
|
BOOLEAN
|
SecurityPkg/SecureBootConfigDxe: Declare EFIAPI for the ChooseFile handlers
The SecureBootConfig now uses ChooseFile() from FileExplorerLib
to select the certificates to be enrolled into PK, KEK, DB, DBX,
or DBT, and the corresponding handlers to get the content of the
file. Per the definition of CHOOSE_HANDLER, the handler must use
EFIAPI as the calling convention. However, the calling convention
was not specified the following handlers: UpdatePKFromFile(),
UpdateKEKFromFile(), UpdateDBFromFile(), UpdateDBXFromFile(), and
UpdateDBTFromFile(). When compiling the firmware with gcc, the
default calling convention is not compatible with EFIAPI, so the
handlers interpreted the argument the wrong way and passed the
wrong device path to UpdatePage(), and the system crashed when
the user tried to enroll a certificate into the key database.
This commit specifies the calling convention for those functions
so that gcc can generate the right code.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Dandan Bi <dandan.bi@intel.com>
2016-03-21 10:04:36 +01:00
|
|
|
EFIAPI
|
2016-01-28 02:36:43 +01:00
|
|
|
UpdateDBFromFile (
|
|
|
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath
|
2012-03-27 10:17:23 +02:00
|
|
|
)
|
|
|
|
{
|
2016-01-28 02:36:43 +01:00
|
|
|
return UpdatePage(FilePath, SECUREBOOT_ENROLL_SIGNATURE_TO_DB);
|
|
|
|
}
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
/**
|
|
|
|
Update the DBX form base on the input file path info.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@param FilePath Point to the file path.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@retval TRUE Exit caller function.
|
|
|
|
@retval FALSE Not exit caller function.
|
|
|
|
**/
|
|
|
|
BOOLEAN
|
SecurityPkg/SecureBootConfigDxe: Declare EFIAPI for the ChooseFile handlers
The SecureBootConfig now uses ChooseFile() from FileExplorerLib
to select the certificates to be enrolled into PK, KEK, DB, DBX,
or DBT, and the corresponding handlers to get the content of the
file. Per the definition of CHOOSE_HANDLER, the handler must use
EFIAPI as the calling convention. However, the calling convention
was not specified the following handlers: UpdatePKFromFile(),
UpdateKEKFromFile(), UpdateDBFromFile(), UpdateDBXFromFile(), and
UpdateDBTFromFile(). When compiling the firmware with gcc, the
default calling convention is not compatible with EFIAPI, so the
handlers interpreted the argument the wrong way and passed the
wrong device path to UpdatePage(), and the system crashed when
the user tried to enroll a certificate into the key database.
This commit specifies the calling convention for those functions
so that gcc can generate the right code.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Dandan Bi <dandan.bi@intel.com>
2016-03-21 10:04:36 +01:00
|
|
|
EFIAPI
|
2016-01-28 02:36:43 +01:00
|
|
|
UpdateDBXFromFile (
|
|
|
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath
|
|
|
|
)
|
|
|
|
{
|
|
|
|
return UpdatePage(FilePath, SECUREBOOT_ENROLL_SIGNATURE_TO_DBX);
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-01-28 02:36:43 +01:00
|
|
|
Update the DBT form base on the input file path info.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@param FilePath Point to the file path.
|
2012-03-27 10:17:23 +02:00
|
|
|
|
2016-01-28 02:36:43 +01:00
|
|
|
@retval TRUE Exit caller function.
|
|
|
|
@retval FALSE Not exit caller function.
|
2012-03-27 10:17:23 +02:00
|
|
|
**/
|
2016-01-28 02:36:43 +01:00
|
|
|
BOOLEAN
|
SecurityPkg/SecureBootConfigDxe: Declare EFIAPI for the ChooseFile handlers
The SecureBootConfig now uses ChooseFile() from FileExplorerLib
to select the certificates to be enrolled into PK, KEK, DB, DBX,
or DBT, and the corresponding handlers to get the content of the
file. Per the definition of CHOOSE_HANDLER, the handler must use
EFIAPI as the calling convention. However, the calling convention
was not specified the following handlers: UpdatePKFromFile(),
UpdateKEKFromFile(), UpdateDBFromFile(), UpdateDBXFromFile(), and
UpdateDBTFromFile(). When compiling the firmware with gcc, the
default calling convention is not compatible with EFIAPI, so the
handlers interpreted the argument the wrong way and passed the
wrong device path to UpdatePage(), and the system crashed when
the user tried to enroll a certificate into the key database.
This commit specifies the calling convention for those functions
so that gcc can generate the right code.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Dandan Bi <dandan.bi@intel.com>
2016-03-21 10:04:36 +01:00
|
|
|
EFIAPI
|
2016-01-28 02:36:43 +01:00
|
|
|
UpdateDBTFromFile (
|
|
|
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath
|
2012-03-27 10:17:23 +02:00
|
|
|
)
|
|
|
|
{
|
2016-01-28 02:36:43 +01:00
|
|
|
return UpdatePage(FilePath, SECUREBOOT_ENROLL_SIGNATURE_TO_DBT);
|
2012-03-27 10:17:23 +02:00
|
|
|
}
|
2016-01-28 02:36:43 +01:00
|
|
|
|