/** @file | |
Internal file explorer functions for SecureBoot configuration module. | |
Copyright (c) 2012 - 2016, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include "SecureBootConfigImpl.h" | |
VOID *mStartOpCodeHandle = NULL; | |
VOID *mEndOpCodeHandle = NULL; | |
EFI_IFR_GUID_LABEL *mStartLabel = NULL; | |
EFI_IFR_GUID_LABEL *mEndLabel = NULL; | |
/** | |
Refresh the global UpdateData structure. | |
**/ | |
VOID | |
RefreshUpdateData ( | |
VOID | |
) | |
{ | |
// | |
// Free current updated date | |
// | |
if (mStartOpCodeHandle != NULL) { | |
HiiFreeOpCodeHandle (mStartOpCodeHandle); | |
} | |
// | |
// Create new OpCode Handle | |
// | |
mStartOpCodeHandle = HiiAllocateOpCodeHandle (); | |
// | |
// Create Hii Extend Label OpCode as the start opcode | |
// | |
mStartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode ( | |
mStartOpCodeHandle, | |
&gEfiIfrTianoGuid, | |
NULL, | |
sizeof (EFI_IFR_GUID_LABEL) | |
); | |
mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; | |
} | |
/** | |
Clean up the dynamic opcode at label and form specified by both LabelId. | |
@param[in] LabelId It is both the Form ID and Label ID for opcode deletion. | |
@param[in] PrivateData Module private data. | |
**/ | |
VOID | |
CleanUpPage ( | |
IN UINT16 LabelId, | |
IN SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData | |
) | |
{ | |
RefreshUpdateData (); | |
// | |
// Remove all op-codes from dynamic page | |
// | |
mStartLabel->Number = LabelId; | |
HiiUpdateForm ( | |
PrivateData->HiiHandle, | |
&gSecureBootConfigFormSetGuid, | |
LabelId, | |
mStartOpCodeHandle, // Label LabelId | |
mEndOpCodeHandle // LABEL_END | |
); | |
} | |
/** | |
Extract filename from device path. The returned buffer is allocated using AllocateCopyPool. | |
The caller is responsible for freeing the allocated buffer using FreePool(). If return NULL | |
means not enough memory resource. | |
@param DevicePath Device path. | |
@retval NULL Not enough memory resource for AllocateCopyPool. | |
@retval Other A new allocated string that represents the file name. | |
**/ | |
CHAR16 * | |
ExtractFileNameFromDevicePath ( | |
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath | |
) | |
{ | |
CHAR16 *String; | |
CHAR16 *MatchString; | |
CHAR16 *LastMatch; | |
CHAR16 *FileName; | |
UINTN Length; | |
ASSERT (DevicePath != NULL); | |
String = DevicePathToStr (DevicePath); | |
MatchString = String; | |
LastMatch = String; | |
FileName = NULL; | |
while (MatchString != NULL) { | |
LastMatch = MatchString + 1; | |
MatchString = StrStr (LastMatch, L"\\"); | |
} | |
Length = StrLen (LastMatch); | |
FileName = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), LastMatch); | |
if (FileName != NULL) { | |
*(FileName + Length) = 0; | |
} | |
FreePool (String); | |
return FileName; | |
} | |
/** | |
Update the form base on the selected file. | |
@param FilePath Point to the file path. | |
@param FormId The form need to display. | |
@retval TRUE Exit caller function. | |
@retval FALSE Not exit caller function. | |
**/ | |
BOOLEAN | |
UpdatePage ( | |
IN EFI_DEVICE_PATH_PROTOCOL *FilePath, | |
IN EFI_FORM_ID FormId | |
) | |
{ | |
CHAR16 *FileName; | |
EFI_STRING_ID StringToken; | |
FileName = NULL; | |
if (FilePath != NULL) { | |
FileName = ExtractFileNameFromDevicePath (FilePath); | |
} | |
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); | |
gSecureBootPrivateData->FileContext->FileName = FileName; | |
EfiOpenFileByDevicePath ( | |
&FilePath, | |
&gSecureBootPrivateData->FileContext->FHandle, | |
EFI_FILE_MODE_READ, | |
0 | |
); | |
// | |
// Create Subtitle op-code for the display string of the option. | |
// | |
RefreshUpdateData (); | |
mStartLabel->Number = FormId; | |
HiiCreateSubTitleOpCode ( | |
mStartOpCodeHandle, | |
StringToken, | |
0, | |
0, | |
0 | |
); | |
HiiUpdateForm ( | |
gSecureBootPrivateData->HiiHandle, | |
&gSecureBootConfigFormSetGuid, | |
FormId, | |
mStartOpCodeHandle, // Label FormId | |
mEndOpCodeHandle // LABEL_END | |
); | |
return TRUE; | |
} | |
/** | |
Update the PK form base on the input file path info. | |
@param FilePath Point to the file path. | |
@retval TRUE Exit caller function. | |
@retval FALSE Not exit caller function. | |
**/ | |
BOOLEAN | |
EFIAPI | |
UpdatePKFromFile ( | |
IN EFI_DEVICE_PATH_PROTOCOL *FilePath | |
) | |
{ | |
return UpdatePage (FilePath, FORMID_ENROLL_PK_FORM); | |
} | |
/** | |
Update the KEK form base on the input file path info. | |
@param FilePath Point to the file path. | |
@retval TRUE Exit caller function. | |
@retval FALSE Not exit caller function. | |
**/ | |
BOOLEAN | |
EFIAPI | |
UpdateKEKFromFile ( | |
IN EFI_DEVICE_PATH_PROTOCOL *FilePath | |
) | |
{ | |
return UpdatePage (FilePath, FORMID_ENROLL_KEK_FORM); | |
} | |
/** | |
Update the DB form base on the input file path info. | |
@param FilePath Point to the file path. | |
@retval TRUE Exit caller function. | |
@retval FALSE Not exit caller function. | |
**/ | |
BOOLEAN | |
EFIAPI | |
UpdateDBFromFile ( | |
IN EFI_DEVICE_PATH_PROTOCOL *FilePath | |
) | |
{ | |
return UpdatePage (FilePath, SECUREBOOT_ENROLL_SIGNATURE_TO_DB); | |
} | |
/** | |
Update the DBX form base on the input file path info. | |
@param FilePath Point to the file path. | |
@retval TRUE Exit caller function. | |
@retval FALSE Not exit caller function. | |
**/ | |
BOOLEAN | |
EFIAPI | |
UpdateDBXFromFile ( | |
IN EFI_DEVICE_PATH_PROTOCOL *FilePath | |
) | |
{ | |
return UpdatePage (FilePath, SECUREBOOT_ENROLL_SIGNATURE_TO_DBX); | |
} | |
/** | |
Update the DBT form base on the input file path info. | |
@param FilePath Point to the file path. | |
@retval TRUE Exit caller function. | |
@retval FALSE Not exit caller function. | |
**/ | |
BOOLEAN | |
EFIAPI | |
UpdateDBTFromFile ( | |
IN EFI_DEVICE_PATH_PROTOCOL *FilePath | |
) | |
{ | |
return UpdatePage (FilePath, SECUREBOOT_ENROLL_SIGNATURE_TO_DBT); | |
} |