Add “VendorKeys” variable for indicating out of band key modification.
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> Reviewed-by: Dong Guo <guo.dong@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14660 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
AuthenticatedVariableFormat.h defines variable data headers
|
AuthenticatedVariableFormat.h defines variable data headers
|
||||||
and variable storage region headers.
|
and variable storage region headers.
|
||||||
|
|
||||||
Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@@ -29,6 +29,7 @@ extern EFI_GUID gEfiAuthenticatedVariableGuid;
|
|||||||
extern EFI_GUID gEfiSecureBootEnableDisableGuid;
|
extern EFI_GUID gEfiSecureBootEnableDisableGuid;
|
||||||
extern EFI_GUID gEfiCertDbGuid;
|
extern EFI_GUID gEfiCertDbGuid;
|
||||||
extern EFI_GUID gEfiCustomModeEnableGuid;
|
extern EFI_GUID gEfiCustomModeEnableGuid;
|
||||||
|
extern EFI_GUID gEfiVendorKeysNvGuid;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// "SecureBootEnable" variable for the Secure Boot feature enable/disable.
|
/// "SecureBootEnable" variable for the Secure Boot feature enable/disable.
|
||||||
@@ -51,6 +52,16 @@ extern EFI_GUID gEfiCustomModeEnableGuid;
|
|||||||
#define CUSTOM_SECURE_BOOT_MODE 1
|
#define CUSTOM_SECURE_BOOT_MODE 1
|
||||||
#define STANDARD_SECURE_BOOT_MODE 0
|
#define STANDARD_SECURE_BOOT_MODE 0
|
||||||
|
|
||||||
|
///
|
||||||
|
/// "VendorKeysNv" variable to record the out of band secure boot keys modification.
|
||||||
|
/// This variable is a read-only NV varaible that indicates whether someone other than
|
||||||
|
/// the platform vendor has used a mechanism not defined by the UEFI Specification to
|
||||||
|
/// transition the system to setup mode or to update secure boot keys.
|
||||||
|
///
|
||||||
|
#define EFI_VENDOR_KEYS_NV_VARIABLE_NAME L"VendorKeysNv"
|
||||||
|
#define VENDOR_KEYS_VALID 1
|
||||||
|
#define VENDOR_KEYS_MODIFIED 0
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Alignment of variable name and data, according to the architecture:
|
/// Alignment of variable name and data, according to the architecture:
|
||||||
/// * For IA-32 and Intel(R) 64 architectures: 1.
|
/// * For IA-32 and Intel(R) 64 architectures: 1.
|
||||||
|
@@ -41,6 +41,9 @@
|
|||||||
# Include/Guid/AuthenticatedVariableFormat.h
|
# Include/Guid/AuthenticatedVariableFormat.h
|
||||||
gEfiCustomModeEnableGuid = { 0xc076ec0c, 0x7028, 0x4399, { 0xa0, 0x72, 0x71, 0xee, 0x5c, 0x44, 0x8b, 0x9f } }
|
gEfiCustomModeEnableGuid = { 0xc076ec0c, 0x7028, 0x4399, { 0xa0, 0x72, 0x71, 0xee, 0x5c, 0x44, 0x8b, 0x9f } }
|
||||||
|
|
||||||
|
# Include/Guid/AuthenticatedVariableFormat.h
|
||||||
|
gEfiVendorKeysNvGuid = { 0x9073e4e0, 0x60ec, 0x4b6e, { 0x99, 0x3, 0x4c, 0x22, 0x3c, 0x26, 0xf, 0x3c } }
|
||||||
|
|
||||||
# Include/Guid/AuthenticatedVariableFormat.h
|
# Include/Guid/AuthenticatedVariableFormat.h
|
||||||
gEfiCertDbGuid = { 0xd9bee56e, 0x75dc, 0x49d9, { 0xb4, 0xd7, 0xb5, 0x34, 0x21, 0xf, 0x63, 0x7a } }
|
gEfiCertDbGuid = { 0xd9bee56e, 0x75dc, 0x49d9, { 0xb4, 0xd7, 0xb5, 0x34, 0x21, 0xf, 0x63, 0x7a } }
|
||||||
|
|
||||||
|
@@ -36,6 +36,8 @@ UINT8 mPubKeyStore[MAX_KEYDB_SIZE];
|
|||||||
UINT32 mPubKeyNumber;
|
UINT32 mPubKeyNumber;
|
||||||
UINT8 mCertDbStore[MAX_CERTDB_SIZE];
|
UINT8 mCertDbStore[MAX_CERTDB_SIZE];
|
||||||
UINT32 mPlatformMode;
|
UINT32 mPlatformMode;
|
||||||
|
UINT8 mVendorKeyState;
|
||||||
|
|
||||||
EFI_GUID mSignatureSupport[] = {EFI_CERT_SHA1_GUID, EFI_CERT_SHA256_GUID, EFI_CERT_RSA2048_GUID, EFI_CERT_X509_GUID};
|
EFI_GUID mSignatureSupport[] = {EFI_CERT_SHA1_GUID, EFI_CERT_SHA256_GUID, EFI_CERT_RSA2048_GUID, EFI_CERT_X509_GUID};
|
||||||
//
|
//
|
||||||
// Public Exponent of RSA Key.
|
// Public Exponent of RSA Key.
|
||||||
@@ -255,7 +257,7 @@ AutenticatedVariableServiceInitialize (
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create "SetupMode" varable with BS+RT attribute set.
|
// Create "SetupMode" variable with BS+RT attribute set.
|
||||||
//
|
//
|
||||||
FindVariable (EFI_SETUP_MODE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
FindVariable (EFI_SETUP_MODE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||||
if (PkVariable.CurrPtr == NULL) {
|
if (PkVariable.CurrPtr == NULL) {
|
||||||
@@ -279,7 +281,7 @@ AutenticatedVariableServiceInitialize (
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create "SignatureSupport" varable with BS+RT attribute set.
|
// Create "SignatureSupport" variable with BS+RT attribute set.
|
||||||
//
|
//
|
||||||
FindVariable (EFI_SIGNATURE_SUPPORT_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
FindVariable (EFI_SIGNATURE_SUPPORT_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||||
Status = UpdateVariable (
|
Status = UpdateVariable (
|
||||||
@@ -328,7 +330,7 @@ AutenticatedVariableServiceInitialize (
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create "SecureBoot" varable with BS+RT attribute set.
|
// Create "SecureBoot" variable with BS+RT attribute set.
|
||||||
//
|
//
|
||||||
if (SecureBootEnable == SECURE_BOOT_ENABLE && mPlatformMode == USER_MODE) {
|
if (SecureBootEnable == SECURE_BOOT_ENABLE && mPlatformMode == USER_MODE) {
|
||||||
SecureBootMode = SECURE_BOOT_MODE_ENABLE;
|
SecureBootMode = SECURE_BOOT_MODE_ENABLE;
|
||||||
@@ -409,6 +411,54 @@ AutenticatedVariableServiceInitialize (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check "VendorKeysNv" variable's existence and create "VendorKeys" variable accordingly.
|
||||||
|
//
|
||||||
|
FindVariable (EFI_VENDOR_KEYS_NV_VARIABLE_NAME, &gEfiVendorKeysNvGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||||
|
if (Variable.CurrPtr != NULL) {
|
||||||
|
mVendorKeyState = *(GetVariableDataPtr (Variable.CurrPtr));
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// "VendorKeysNv" not exist, initialize it in VENDOR_KEYS_VALID state.
|
||||||
|
//
|
||||||
|
mVendorKeyState = VENDOR_KEYS_VALID;
|
||||||
|
Status = UpdateVariable (
|
||||||
|
EFI_VENDOR_KEYS_NV_VARIABLE_NAME,
|
||||||
|
&gEfiVendorKeysNvGuid,
|
||||||
|
&mVendorKeyState,
|
||||||
|
sizeof (UINT8),
|
||||||
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&Variable,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create "VendorKeys" variable with BS+RT attribute set.
|
||||||
|
//
|
||||||
|
FindVariable (EFI_VENDOR_KEYS_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||||
|
Status = UpdateVariable (
|
||||||
|
EFI_VENDOR_KEYS_VARIABLE_NAME,
|
||||||
|
&gEfiGlobalVariableGuid,
|
||||||
|
&mVendorKeyState,
|
||||||
|
sizeof (UINT8),
|
||||||
|
EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&Variable,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG ((EFI_D_INFO, "Variable %s is %x\n", EFI_VENDOR_KEYS_VARIABLE_NAME, mVendorKeyState));
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -911,6 +961,56 @@ CheckSignatureListFormat(
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Update "VendorKeys" variable to record the out of band secure boot key modification.
|
||||||
|
|
||||||
|
@return EFI_SUCCESS Variable is updated successfully.
|
||||||
|
@return Others Failed to update variable.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
VendorKeyIsModified (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
VARIABLE_POINTER_TRACK Variable;
|
||||||
|
|
||||||
|
if (mVendorKeyState == VENDOR_KEYS_MODIFIED) {
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
mVendorKeyState = VENDOR_KEYS_MODIFIED;
|
||||||
|
|
||||||
|
FindVariable (EFI_VENDOR_KEYS_NV_VARIABLE_NAME, &gEfiVendorKeysNvGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||||
|
Status = UpdateVariable (
|
||||||
|
EFI_VENDOR_KEYS_NV_VARIABLE_NAME,
|
||||||
|
&gEfiVendorKeysNvGuid,
|
||||||
|
&mVendorKeyState,
|
||||||
|
sizeof (UINT8),
|
||||||
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&Variable,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
FindVariable (EFI_VENDOR_KEYS_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||||
|
return UpdateVariable (
|
||||||
|
EFI_VENDOR_KEYS_VARIABLE_NAME,
|
||||||
|
&gEfiGlobalVariableGuid,
|
||||||
|
&mVendorKeyState,
|
||||||
|
sizeof (UINT8),
|
||||||
|
EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&Variable,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Process variable with platform key for verification.
|
Process variable with platform key for verification.
|
||||||
|
|
||||||
@@ -985,6 +1085,13 @@ ProcessVarWithPk (
|
|||||||
Variable,
|
Variable,
|
||||||
&((EFI_VARIABLE_AUTHENTICATION_2 *) Data)->TimeStamp
|
&((EFI_VARIABLE_AUTHENTICATION_2 *) Data)->TimeStamp
|
||||||
);
|
);
|
||||||
|
if (EFI_ERROR(Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mPlatformMode != SETUP_MODE) {
|
||||||
|
Status = VendorKeyIsModified ();
|
||||||
|
}
|
||||||
} else if (mPlatformMode == USER_MODE) {
|
} else if (mPlatformMode == USER_MODE) {
|
||||||
//
|
//
|
||||||
// Verify against X509 Cert in PK database.
|
// Verify against X509 Cert in PK database.
|
||||||
@@ -1117,6 +1224,13 @@ ProcessVarWithKek (
|
|||||||
Variable,
|
Variable,
|
||||||
&((EFI_VARIABLE_AUTHENTICATION_2 *) Data)->TimeStamp
|
&((EFI_VARIABLE_AUTHENTICATION_2 *) Data)->TimeStamp
|
||||||
);
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mPlatformMode != SETUP_MODE) {
|
||||||
|
Status = VendorKeyIsModified ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
@@ -2500,7 +2500,8 @@ IsReadOnlyVariable (
|
|||||||
if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid)) {
|
if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid)) {
|
||||||
if ((StrCmp (VariableName, EFI_SETUP_MODE_NAME) == 0) ||
|
if ((StrCmp (VariableName, EFI_SETUP_MODE_NAME) == 0) ||
|
||||||
(StrCmp (VariableName, EFI_SIGNATURE_SUPPORT_NAME) == 0) ||
|
(StrCmp (VariableName, EFI_SIGNATURE_SUPPORT_NAME) == 0) ||
|
||||||
(StrCmp (VariableName, EFI_SECURE_BOOT_MODE_NAME) == 0)) {
|
(StrCmp (VariableName, EFI_SECURE_BOOT_MODE_NAME) == 0) ||
|
||||||
|
(StrCmp (VariableName, EFI_VENDOR_KEYS_VARIABLE_NAME) == 0)) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -80,6 +80,7 @@
|
|||||||
gEfiCertRsa2048Guid
|
gEfiCertRsa2048Guid
|
||||||
gEfiSecureBootEnableDisableGuid
|
gEfiSecureBootEnableDisableGuid
|
||||||
gEfiCustomModeEnableGuid
|
gEfiCustomModeEnableGuid
|
||||||
|
gEfiVendorKeysNvGuid
|
||||||
gEfiSystemNvDataFvGuid ## CONSUMES
|
gEfiSystemNvDataFvGuid ## CONSUMES
|
||||||
gEfiCertDbGuid
|
gEfiCertDbGuid
|
||||||
gEfiHardwareErrorVariableGuid ## SOMETIMES_CONSUMES
|
gEfiHardwareErrorVariableGuid ## SOMETIMES_CONSUMES
|
||||||
|
@@ -86,6 +86,7 @@
|
|||||||
gEfiCertRsa2048Guid
|
gEfiCertRsa2048Guid
|
||||||
gEfiSecureBootEnableDisableGuid
|
gEfiSecureBootEnableDisableGuid
|
||||||
gEfiCustomModeEnableGuid
|
gEfiCustomModeEnableGuid
|
||||||
|
gEfiVendorKeysNvGuid
|
||||||
gEfiSystemNvDataFvGuid ## CONSUMES
|
gEfiSystemNvDataFvGuid ## CONSUMES
|
||||||
gEfiCertDbGuid
|
gEfiCertDbGuid
|
||||||
gEfiHardwareErrorVariableGuid ## SOMETIMES_CONSUMES
|
gEfiHardwareErrorVariableGuid ## SOMETIMES_CONSUMES
|
||||||
|
Reference in New Issue
Block a user