From eec38fd3834ccdebc1dee1019f42ee5baaa72f36 Mon Sep 17 00:00:00 2001 From: Patrick Rudolph Date: Wed, 1 Apr 2020 15:05:54 +0200 Subject: [PATCH] UefiPayloadPkg: Add Secureboot support Must use RuntimeVariableDxe instead of EmuVariableDxe. Currently doesn't boot on qemu. Signed-off-by: Patrick Rudolph --- .../SecureBootSetup.c | 644 ++++++++++++++++++ .../SecureBootSetup.inf | 54 ++ .../SecureBootSetup.uni | 21 + .../SecureBootSetupExtra.uni | 17 + .../SecureBootEnrollDefaultKeys/keys/README | 8 + .../SecureBootEnrollDefaultKeys/keys/crl.bin | Bin 0 -> 7085 bytes .../SecureBootEnrollDefaultKeys/keys/db-1.crt | Bin 0 -> 1499 bytes .../SecureBootEnrollDefaultKeys/keys/db-2.crt | Bin 0 -> 1556 bytes .../SecureBootEnrollDefaultKeys/keys/kek.crt | Bin 0 -> 1516 bytes .../SecureBootEnrollDefaultKeys/keys/pk.crt | Bin 0 -> 1053 bytes UefiPayloadPkg/UefiPayloadPkg.dsc | 69 +- UefiPayloadPkg/UefiPayloadPkg.fdf | 46 ++ 12 files changed, 856 insertions(+), 3 deletions(-) create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.c create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.inf create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.uni create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetupExtra.uni create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/README create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/crl.bin create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/db-1.crt create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/db-2.crt create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/kek.crt create mode 100644 UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/pk.crt diff --git a/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.c b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.c new file mode 100644 index 0000000000..8741780899 --- /dev/null +++ b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.c @@ -0,0 +1,644 @@ +/** @file + Enroll default PK, KEK, DB and DBX + + Copyright (C) 2014, Red Hat, Inc. + + 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. + + 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define EFI_MICROSOFT_KEK_CERT_GUID \ + { 0xA23665E3, 0xACA6, 0x4F6D, {0x80, 0xCC, 0x34, 0x1E, 0x7D, 0x7B, 0x8C, 0xC6} } + +#define EFI_SECUREBOOT_PK_CERT_GUID \ + { 0xF8104268, 0xA364, 0x45F5, {0x8E, 0x00, 0xAB, 0xA3, 0xFD, 0xEA, 0x12, 0xBE} } + +#define EFI_MICROSOFT_DB1_CERT_GUID \ + { 0x26A517B0, 0xE3FD, 0x46C2, {0x89, 0x32, 0xE9, 0x26, 0xBF, 0x98, 0x94, 0x1F} } + +#define EFI_MICROSOFT_DB2_CERT_GUID \ + { 0x91D2E32B, 0x0134, 0x4306, {0xBA, 0x90, 0x54, 0xED, 0xCB, 0xF3, 0x49, 0xCA} } + +#define EFI_MICROSOFT_DBX_GUID \ + { 0x74BB6E72, 0x2A56, 0x4D0E, {0xA5, 0xB3, 0x5D, 0x39, 0xFC, 0x2E, 0xE3, 0x46} } + +#define EFI_MICROSOFT_OWNER_GUID \ + { 0x77FA9ABD, 0x0359, 0x4D32, {0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B} } + +EFI_GUID gEfiSecureBootDb1CertGuid = EFI_MICROSOFT_DB1_CERT_GUID; +EFI_GUID gEfiSecureBootDb2CertGuid = EFI_MICROSOFT_DB2_CERT_GUID; +EFI_GUID gEfiSecureBootDbxCrlGuid = EFI_MICROSOFT_DBX_GUID; +EFI_GUID gEfiSecureBootKekCertGuid = EFI_MICROSOFT_KEK_CERT_GUID; +EFI_GUID gEfiSecureBootPkCertGuid = EFI_SECUREBOOT_PK_CERT_GUID; +EFI_GUID gEfiMicrosoftOwnerGuid = EFI_MICROSOFT_OWNER_GUID; + +// +// The most important thing about the variable payload is that it is a list of +// lists, where the element size of any given *inner* list is constant. +// +// Since X509 certificates vary in size, each of our *inner* lists will contain +// one element only (one X.509 certificate). This is explicitly mentioned in +// the UEFI specification, in "28.4.1 Signature Database", in a Note. +// +// The list structure looks as follows: +// +// struct EFI_VARIABLE_AUTHENTICATION_2 { | +// struct EFI_TIME { | +// UINT16 Year; | +// UINT8 Month; | +// UINT8 Day; | +// UINT8 Hour; | +// UINT8 Minute; | +// UINT8 Second; | +// UINT8 Pad1; | +// UINT32 Nanosecond; | +// INT16 TimeZone; | +// UINT8 Daylight; | +// UINT8 Pad2; | +// } TimeStamp; | +// | +// struct WIN_CERTIFICATE_UEFI_GUID { | | +// struct WIN_CERTIFICATE { | | +// UINT32 dwLength; ----------------------------------------+ | +// UINT16 wRevision; | | +// UINT16 wCertificateType; | | +// } Hdr; | +- DataSize +// | | +// EFI_GUID CertType; | | +// UINT8 CertData[1] = { <--- "struct hack" | | +// struct EFI_SIGNATURE_LIST { | | | +// EFI_GUID SignatureType; | | | +// UINT32 SignatureListSize; -------------------------+ | | +// UINT32 SignatureHeaderSize; | | | +// UINT32 SignatureSize; ---------------------------+ | | | +// UINT8 SignatureHeader[SignatureHeaderSize]; | | | | +// v | | | +// struct EFI_SIGNATURE_DATA { | | | | +// EFI_GUID SignatureOwner; | | | | +// UINT8 SignatureData[1] = { <--- "struct hack" | | | | +// X.509 payload | | | | +// } | | | | +// } Signatures[]; | | | +// } SigLists[]; | | +// }; | | +// } AuthInfo; | | +// }; | +// +// Given that the "struct hack" invokes undefined behavior (which is why C99 +// introduced the flexible array member), and because subtracting those pesky +// sizes of 1 is annoying, and because the format is fully specified in the +// UEFI specification, we'll introduce two matching convenience structures that +// are customized for our X.509 purposes. +// + +#pragma pack(1) +typedef struct { + EFI_TIME TimeStamp; + + // + // dwLength covers data below + // + UINT32 dwLength; + UINT16 wRevision; + UINT16 wCertificateType; + EFI_GUID CertType; +} SINGLE_HEADER; + +typedef struct { + // + // SignatureListSize covers data below + // + EFI_GUID SignatureType; + UINT32 SignatureListSize; + UINT32 SignatureHeaderSize; // constant 0 + UINT32 SignatureSize; + + // + // SignatureSize covers data below + // + EFI_GUID SignatureOwner; + + // + // X.509 certificate follows + // +} REPEATING_HEADER; +#pragma pack() + +/** + Enroll a set of certificates in a global variable, overwriting it. + + The variable will be rewritten with NV+BS+RT+AT attributes. + + @param[in] VariableName The name of the variable to overwrite. + + @param[in] VendorGuid The namespace (ie. vendor GUID) of the variable to + overwrite. + + @param[in] CertType The GUID determining the type of all the + certificates in the set that is passed in. For + example, gEfiCertX509Guid stands for DER-encoded + X.509 certificates, while gEfiCertSha256Guid stands + for SHA256 image hashes. + + @param[in] ... A list of + + IN CONST UINT8 *Cert, + IN UINTN CertSize, + IN CONST EFI_GUID *OwnerGuid + + triplets. If the first component of a triplet is + NULL, then the other two components are not + accessed, and processing is terminated. The list of + certificates is enrolled in the variable specified, + overwriting it. The OwnerGuid component identifies + the agent installing the certificate. + + @retval EFI_INVALID_PARAMETER The triplet list is empty (ie. the first Cert + value is NULL), or one of the CertSize values + is 0, or one of the CertSize values would + overflow the accumulated UINT32 data size. + + @retval EFI_OUT_OF_RESOURCES Out of memory while formatting variable + payload. + + @retval EFI_SUCCESS Enrollment successful; the variable has been + overwritten (or created). + + @return Error codes from gRT->GetTime() and + gRT->SetVariable(). + **/ +STATIC +EFI_STATUS +EFIAPI +EnrollListOfCerts ( + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN EFI_GUID *CertType, + ... + ) +{ + UINTN DataSize; + SINGLE_HEADER *SingleHeader; + REPEATING_HEADER *RepeatingHeader; + VA_LIST Marker; + CONST UINT8 *Cert; + EFI_STATUS Status; + UINT8 *Data; + UINT8 *Position; + + Status = EFI_SUCCESS; + + // + // compute total size first, for UINT32 range check, and allocation + // + DataSize = sizeof *SingleHeader; + VA_START (Marker, CertType); + for (Cert = VA_ARG (Marker, CONST UINT8 *); + Cert != NULL; + Cert = VA_ARG (Marker, CONST UINT8 *)) { + UINTN CertSize; + + CertSize = VA_ARG (Marker, UINTN); + (VOID)VA_ARG (Marker, CONST EFI_GUID *); + + if (CertSize == 0 || + CertSize > MAX_UINT32 - sizeof *RepeatingHeader || + DataSize > MAX_UINT32 - sizeof *RepeatingHeader - CertSize) { + Status = EFI_INVALID_PARAMETER; + break; + } + DataSize += sizeof *RepeatingHeader + CertSize; + } + VA_END (Marker); + + if (DataSize == sizeof *SingleHeader) { + Status = EFI_INVALID_PARAMETER; + } + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: Invalid certificate parameters\n")); + goto Out; + } + + Data = AllocatePool (DataSize); + if (Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Out; + } + + Position = Data; + + SingleHeader = (SINGLE_HEADER *)Position; + Status = gRT->GetTime (&SingleHeader->TimeStamp, NULL); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_INFO, "SecureBootSetup: GetTime failed\n")); + // Fill in dummy values + SingleHeader->TimeStamp.Year = 2018; + SingleHeader->TimeStamp.Month = 1; + SingleHeader->TimeStamp.Day = 1; + SingleHeader->TimeStamp.Hour = 0; + SingleHeader->TimeStamp.Minute = 0; + SingleHeader->TimeStamp.Second = 0; + Status = EFI_SUCCESS; + } + SingleHeader->TimeStamp.Pad1 = 0; + SingleHeader->TimeStamp.Nanosecond = 0; + SingleHeader->TimeStamp.TimeZone = 0; + SingleHeader->TimeStamp.Daylight = 0; + SingleHeader->TimeStamp.Pad2 = 0; + + // + // This looks like a bug in edk2. According to the UEFI specification, + // dwLength is "The length of the entire certificate, including the length of + // the header, in bytes". That shouldn't stop right after CertType -- it + // should include everything below it. + // + SingleHeader->dwLength = sizeof *SingleHeader - sizeof SingleHeader->TimeStamp; + SingleHeader->wRevision = 0x0200; + SingleHeader->wCertificateType = WIN_CERT_TYPE_EFI_GUID; + CopyGuid (&SingleHeader->CertType, &gEfiCertPkcs7Guid); + Position += sizeof *SingleHeader; + + VA_START (Marker, CertType); + for (Cert = VA_ARG (Marker, CONST UINT8 *); + Cert != NULL; + Cert = VA_ARG (Marker, CONST UINT8 *)) { + UINTN CertSize; + CONST EFI_GUID *OwnerGuid; + + CertSize = VA_ARG (Marker, UINTN); + OwnerGuid = VA_ARG (Marker, CONST EFI_GUID *); + + RepeatingHeader = (REPEATING_HEADER *)Position; + CopyGuid (&RepeatingHeader->SignatureType, CertType); + RepeatingHeader->SignatureListSize = + (UINT32)(sizeof *RepeatingHeader + CertSize); + RepeatingHeader->SignatureHeaderSize = 0; + RepeatingHeader->SignatureSize = + (UINT32)(sizeof RepeatingHeader->SignatureOwner + CertSize); + CopyGuid (&RepeatingHeader->SignatureOwner, OwnerGuid); + Position += sizeof *RepeatingHeader; + + CopyMem (Position, Cert, CertSize); + Position += CertSize; + } + VA_END (Marker); + + ASSERT (Data + DataSize == Position); + + Status = gRT->SetVariable (VariableName, VendorGuid, + (EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS), + DataSize, Data); + + FreePool (Data); + +Out: + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: %a(\"%s\", %g): %r\n", __FUNCTION__, VariableName, + VendorGuid, Status)); + } + return Status; +} + + +STATIC +EFI_STATUS +EFIAPI +GetExact ( + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + OUT VOID *Data, + IN UINTN DataSize, + IN BOOLEAN AllowMissing + ) +{ + UINTN Size; + EFI_STATUS Status; + + Size = DataSize; + Status = gRT->GetVariable (VariableName, VendorGuid, NULL, &Size, Data); + if (EFI_ERROR (Status)) { + if (Status == EFI_NOT_FOUND && AllowMissing) { + ZeroMem (Data, DataSize); + return EFI_SUCCESS; + } + + DEBUG ((EFI_D_ERROR, "SecureBootSetup: GetVariable(\"%s\", %g): %r\n", VariableName, + VendorGuid, Status)); + return Status; + } + + if (Size != DataSize) { + DEBUG ((EFI_D_INFO, "SecureBootSetup: GetVariable(\"%s\", %g): expected size 0x%Lx, " + "got 0x%Lx\n", VariableName, VendorGuid, (UINT64)DataSize, (UINT64)Size)); + return EFI_PROTOCOL_ERROR; + } + + return EFI_SUCCESS; +} + +typedef struct { + UINT8 SetupMode; + UINT8 SecureBoot; + UINT8 SecureBootEnable; + UINT8 CustomMode; + UINT8 VendorKeys; +} SETTINGS; + +STATIC +EFI_STATUS +EFIAPI +GetSettings ( + OUT SETTINGS *Settings, + BOOLEAN AllowMissing + ) +{ + EFI_STATUS Status; + + ZeroMem (Settings, sizeof(SETTINGS)); + + Status = GetExact (EFI_SETUP_MODE_NAME, &gEfiGlobalVariableGuid, + &Settings->SetupMode, sizeof Settings->SetupMode, AllowMissing); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = GetExact (EFI_SECURE_BOOT_MODE_NAME, &gEfiGlobalVariableGuid, + &Settings->SecureBoot, sizeof Settings->SecureBoot, AllowMissing); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = GetExact (EFI_SECURE_BOOT_ENABLE_NAME, + &gEfiSecureBootEnableDisableGuid, &Settings->SecureBootEnable, + sizeof Settings->SecureBootEnable, AllowMissing); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = GetExact (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, + &Settings->CustomMode, sizeof Settings->CustomMode, AllowMissing); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = GetExact (EFI_VENDOR_KEYS_VARIABLE_NAME, &gEfiGlobalVariableGuid, + &Settings->VendorKeys, sizeof Settings->VendorKeys, AllowMissing); + return Status; +} + +STATIC +VOID +EFIAPI +PrintSettings ( + IN CONST SETTINGS *Settings + ) +{ + DEBUG ((EFI_D_INFO, "SecureBootSetup: SetupMode=%d SecureBoot=%d SecureBootEnable=%d " + "CustomMode=%d VendorKeys=%d\n", Settings->SetupMode, Settings->SecureBoot, + Settings->SecureBootEnable, Settings->CustomMode, Settings->VendorKeys)); +} + +/** + Install SecureBoot certificates once the VariableDriver is running. + + @param[in] Event Event whose notification function is being invoked + @param[in] Context Pointer to the notification function's context +**/ +VOID +EFIAPI +InstallSecureBootHook ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + VOID *Protocol; + SETTINGS Settings; + + UINT8 *MicrosoftPCA = 0; + UINTN MicrosoftPCASize; + UINT8 *MicrosoftUefiCA = 0; + UINTN MicrosoftUefiCASize; + UINT8 *MicrosoftKEK = 0; + UINTN MicrosoftKEKSize; + UINT8 *SecureBootPk = 0; + UINTN SecureBootPkSize; + UINT8 *MicrosoftDbx = 0; + UINTN MicrosoftDbxSize; + + Status = gBS->LocateProtocol (&gEfiVariableWriteArchProtocolGuid, NULL, (VOID **)&Protocol); + if (EFI_ERROR (Status)) { + return; + } + + Status = GetSettings (&Settings, TRUE); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: Failed to get current settings\n")); + return; + } + + if (Settings.SetupMode != SETUP_MODE) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: already in User Mode\n")); + return; + } + PrintSettings (&Settings); + + if (Settings.CustomMode != CUSTOM_SECURE_BOOT_MODE) { + Settings.CustomMode = CUSTOM_SECURE_BOOT_MODE; + Status = gRT->SetVariable (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, + (EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS), + sizeof Settings.CustomMode, &Settings.CustomMode); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: SetVariable(\"%s\", %g): %r\n", EFI_CUSTOM_MODE_NAME, + &gEfiCustomModeEnableGuid, Status)); + ASSERT_EFI_ERROR (Status); + } + } + + Status = GetSectionFromAnyFv(&gEfiSecureBootDb1CertGuid, EFI_SECTION_RAW, 0, (void **)&MicrosoftPCA, &MicrosoftPCASize); + ASSERT_EFI_ERROR (Status); + + Status = GetSectionFromAnyFv(&gEfiSecureBootDb2CertGuid, EFI_SECTION_RAW, 0, (void **)&MicrosoftUefiCA, &MicrosoftUefiCASize); + ASSERT_EFI_ERROR (Status); + + Status = GetSectionFromAnyFv(&gEfiSecureBootKekCertGuid, EFI_SECTION_RAW, 0, (void **)&MicrosoftKEK, &MicrosoftKEKSize); + ASSERT_EFI_ERROR (Status); + + Status = GetSectionFromAnyFv(&gEfiSecureBootPkCertGuid, EFI_SECTION_RAW, 0, (void **)&SecureBootPk, &SecureBootPkSize); + ASSERT_EFI_ERROR (Status); + + Status = GetSectionFromAnyFv(&gEfiSecureBootDbxCrlGuid, EFI_SECTION_RAW, 0, (void **)&MicrosoftDbx, &MicrosoftDbxSize); + ASSERT_EFI_ERROR (Status); + + Status = gRT->SetVariable (EFI_IMAGE_SECURITY_DATABASE1, &gEfiImageSecurityDatabaseGuid, + (EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS), + MicrosoftDbxSize, MicrosoftDbx); + ASSERT_EFI_ERROR (Status); + + Status = EnrollListOfCerts ( + EFI_IMAGE_SECURITY_DATABASE, + &gEfiImageSecurityDatabaseGuid, + &gEfiCertX509Guid, + MicrosoftPCA, MicrosoftPCASize, &gEfiMicrosoftOwnerGuid, + MicrosoftUefiCA, MicrosoftUefiCASize, &gEfiMicrosoftOwnerGuid, + NULL); + ASSERT_EFI_ERROR (Status); + + Status = EnrollListOfCerts ( + EFI_KEY_EXCHANGE_KEY_NAME, + &gEfiGlobalVariableGuid, + &gEfiCertX509Guid, + SecureBootPk, SecureBootPkSize, &gEfiCallerIdGuid, + MicrosoftKEK, MicrosoftKEKSize, &gEfiMicrosoftOwnerGuid, + NULL); + ASSERT_EFI_ERROR (Status); + + Status = EnrollListOfCerts ( + EFI_PLATFORM_KEY_NAME, + &gEfiGlobalVariableGuid, + &gEfiCertX509Guid, + SecureBootPk, SecureBootPkSize, &gEfiGlobalVariableGuid, + NULL); + ASSERT_EFI_ERROR (Status); + + FreePool (MicrosoftPCA); + FreePool (MicrosoftUefiCA); + FreePool (MicrosoftKEK); + FreePool (SecureBootPk); + FreePool (MicrosoftDbx); + + Settings.CustomMode = STANDARD_SECURE_BOOT_MODE; + Status = gRT->SetVariable (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof Settings.CustomMode, &Settings.CustomMode); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: SetVariable(\"%s\", %g): %r\n", EFI_CUSTOM_MODE_NAME, + &gEfiCustomModeEnableGuid, Status)); + ASSERT_EFI_ERROR (Status); + } + + // FIXME: Force SecureBoot to ON. The AuthService will do this if authenticated variables + // are supported, which aren't as the SMM handler isn't able to verify them. + + Settings.SecureBootEnable = SECURE_BOOT_ENABLE; + Status = gRT->SetVariable (EFI_SECURE_BOOT_ENABLE_NAME, &gEfiSecureBootEnableDisableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof Settings.SecureBootEnable, &Settings.SecureBootEnable); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: SetVariable(\"%s\", %g): %r\n", EFI_SECURE_BOOT_ENABLE_NAME, + &gEfiSecureBootEnableDisableGuid, Status)); + ASSERT_EFI_ERROR (Status); + } + + Settings.SecureBoot = SECURE_BOOT_ENABLE; + Status = gRT->SetVariable (EFI_SECURE_BOOT_MODE_NAME, &gEfiGlobalVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + sizeof Settings.SecureBoot, &Settings.SecureBoot); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: SetVariable(\"%s\", %g): %r\n", EFI_SECURE_BOOT_MODE_NAME, + &gEfiGlobalVariableGuid, Status)); + ASSERT_EFI_ERROR (Status); + } + + Status = GetSettings (&Settings, FALSE); + ASSERT_EFI_ERROR (Status); + + // + // Final sanity check: + // + // [SetupMode] + // (read-only, standardized by UEFI) + // / \_ + // 0 1, default + // / \_ + // PK enrolled no PK enrolled yet, + // (this is called "User Mode") PK enrollment possible + // | + // | + // [SecureBootEnable] + // (read-write, edk2-specific, boot service only) + // / \_ + // 0 1, default + // / \_ + // [SecureBoot]=0 [SecureBoot]=1 + // (read-only, standardized by UEFI) (read-only, standardized by UEFI) + // images are not verified images are verified, platform is + // operating in Secure Boot mode + // | + // | + // [CustomMode] + // (read-write, edk2-specific, boot service only) + // / \_ + // 0, default 1 + // / \_ + // PK, KEK, db, dbx PK, KEK, db, dbx + // updates are verified updates are not verified + // + + PrintSettings (&Settings); + + if (Settings.SetupMode != 0 || Settings.SecureBoot != 1 || + Settings.SecureBootEnable != 1 || Settings.CustomMode != 0 || + Settings.VendorKeys != 0) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: disabled\n")); + return; + } + + DEBUG ((EFI_D_INFO, "SecureBootSetup: SecureBoot enabled\n")); +} + +EFI_STATUS +EFIAPI +DriverEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + VOID *TcgProtocol; + VOID *Registration; + + Status = gBS->LocateProtocol (&gEfiTcgProtocolGuid, NULL, (VOID **) &TcgProtocol); + if (!EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "SecureBootSetup: Started too late." + "TPM is already running!\n")); + return EFI_DEVICE_ERROR; + } + + // + // Create event callback, because we need access variable on SecureBootPolicyVariable + // We should use VariableWriteArch instead of VariableArch, because Variable driver + // may update SecureBoot value based on last setting. + // + EfiCreateProtocolNotifyEvent ( + &gEfiVariableWriteArchProtocolGuid, + TPL_CALLBACK, + InstallSecureBootHook, + NULL, + &Registration); + + return EFI_SUCCESS; +} diff --git a/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.inf b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.inf new file mode 100644 index 0000000000..c7b14556a0 --- /dev/null +++ b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.inf @@ -0,0 +1,54 @@ +## @file +# This file handels SecureBoot setup. +# +# Copyright (c) 2013 - 2019, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = SecureBootSetup + MODULE_UNI_FILE = SecureBootSetup.uni + FILE_GUID = 14693BD4-D114-4177-979E-37F279BAD620 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 0.1 + ENTRY_POINT = DriverEntry + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + SecureBootSetup.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + SecurityPkg/SecurityPkg.dec + +[Guids] + gEfiCertPkcs7Guid + gEfiCertX509Guid + gEfiCustomModeEnableGuid + gEfiGlobalVariableGuid + gEfiImageSecurityDatabaseGuid + gEfiSecureBootEnableDisableGuid + +[LibraryClasses] + BaseMemoryLib + DebugLib + MemoryAllocationLib + UefiRuntimeServicesTableLib + UefiDriverEntryPoint + DxeServicesLib + UefiBootServicesTableLib + +[Protocols] + gEfiTcgProtocolGuid ## CONSUMES + gEfiVariableWriteArchProtocolGuid ## NOTIFY + +[Depex] + AFTER gEfiVariableWriteArchProtocolGuid \ No newline at end of file diff --git a/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.uni b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.uni new file mode 100644 index 0000000000..0ea5d32872 --- /dev/null +++ b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetup.uni @@ -0,0 +1,21 @@ +// /** @file +// Provides authenticated variable service for IPF platform +// +// This module installs variable arch protocol and variable write arch protocol to provide +// four EFI_RUNTIME_SERVICES: SetVariable, GetVariable, GetNextVariableName and QueryVariableInfo. +// +// Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.
+// +// 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. +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "Provides authenticated variable service for IPF platform" + +#string STR_MODULE_DESCRIPTION #language en-US "This module installs variable arch protocol and variable write arch protocol to provide four EFI_RUNTIME_SERVICES: SetVariable, GetVariable, GetNextVariableName and QueryVariableInfo." diff --git a/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetupExtra.uni b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetupExtra.uni new file mode 100644 index 0000000000..9811340573 --- /dev/null +++ b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/SecureBootSetupExtra.uni @@ -0,0 +1,17 @@ +// /** @file +// EsalVariableDxeSal Localized Strings and Content +// +// Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.
+// +// 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. +// +// **/ + +#string STR_PROPERTIES_MODULE_NAME +#language en-US +"9elements Secure Boot DXE" diff --git a/UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/README b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/README new file mode 100644 index 0000000000..5182454b97 --- /dev/null +++ b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/README @@ -0,0 +1,8 @@ +# PK certificate generation + +* Do not save private key for re-usage. +* Generate a RSA 2048 / SHA256 x509 certificate +* Exponent should be 65537 +* Microsoft certificates can be found here: https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance + +openssl req -outform DER -newkey rsa:2048 -keyout /dev/null -passout file:<(head -c 40 /dev/urandom) -x509 -days 365 -out pk.crt diff --git a/UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/crl.bin b/UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/crl.bin new file mode 100644 index 0000000000000000000000000000000000000000..728316fd8d68052e0252ffc1c58c6b81fa10387f GIT binary patch literal 7085 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 literal 0 HcmV?d00001 diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 8a88865d3f..2b18049603 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -101,6 +101,10 @@ DEFINE RTC_TARGET_REGISTER = 0x71 DEFINE SERIAL_DRIVER_ENABLE = TRUE + # + # Security options: + # + DEFINE SECURE_BOOT_ENABLE = FALSE [BuildOptions] *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES @@ -163,6 +167,10 @@ CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf DxeHobListLib|UefiPayloadPkg/Library/DxeHobListLib/DxeHobListLib.inf +!if $(SECURE_BOOT_ENABLE) == TRUE + SecureBootVariableLib|SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.inf + SecureBootVariableProvisionLib|SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.inf +!endif !if $(UNIVERSAL_PAYLOAD) == TRUE HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf @@ -244,7 +252,6 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf LockBoxLib|MdeModulePkg/Library/LockBoxNullLib/LockBoxNullLib.inf FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf - AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.inf @@ -255,6 +262,9 @@ SmmStoreLib|UefiPayloadPkg/Library/SblSMMStoreLib/SblSMMStoreLib.inf !endif +[LibraryClasses.common] + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf + [LibraryClasses.common.SEC] HobLib|UefiPayloadPkg/Library/PayloadEntryHobLib/HobLib.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf @@ -272,6 +282,17 @@ !endif CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf + IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf + RngLib|MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf + +!if $(SECURE_BOOT_ENABLE) == TRUE + AuthVariableLib|SecurityPkg/Library/AuthVariableLib/AuthVariableLib.inf + # re-use the UserPhysicalPresent() dummy implementation from the ovmf tree + PlatformSecureLib|OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf +!else + AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf +!endif [LibraryClasses.common.DXE_DRIVER] PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf @@ -284,12 +305,35 @@ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf + IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf + RngLib|MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf + +!if $(SECURE_BOOT_ENABLE) == TRUE + AuthVariableLib|SecurityPkg/Library/AuthVariableLib/AuthVariableLib.inf + # re-use the UserPhysicalPresent() dummy implementation from the ovmf tree + PlatformSecureLib|OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf +!else + AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf +!endif [LibraryClasses.common.DXE_RUNTIME_DRIVER] PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLibRuntimeDxe.inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf + IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf + RngLib|MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf + +!if $(SECURE_BOOT_ENABLE) == TRUE + AuthVariableLib|SecurityPkg/Library/AuthVariableLib/AuthVariableLib.inf + # re-use the UserPhysicalPresent() dummy implementation from the ovmf tree + PlatformSecureLib|OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf +!else + AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf +!endif [LibraryClasses.common.UEFI_DRIVER,LibraryClasses.common.UEFI_APPLICATION] PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf @@ -454,7 +498,22 @@ # # Components that produce the architectural protocols # - MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf + MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf { + +!if $(SECURE_BOOT_ENABLE) == TRUE + NULL|SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf +!endif +!if $(TPM_ENABLE) == TRUE + NULL|SecurityPkg/Library/DxeTpmMeasureBootLib/DxeTpmMeasureBootLib.inf + NULL|SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf +!endif + } + +!if $(SECURE_BOOT_ENABLE) == TRUE + SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf + SecurityPkg/VariableAuthenticated/SecureBootDefaultKeysDxe/SecureBootDefaultKeysDxe.inf +!endif + UefiCpuPkg/CpuDxe/CpuDxe.inf MdeModulePkg/Universal/BdsDxe/BdsDxe.inf MdeModulePkg/Logo/LogoDxe.inf @@ -476,8 +535,12 @@ PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf !if $(EMU_VARIABLE_ENABLE) == TRUE MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf { + + NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf + } !endif + # # Following are the DXE drivers # diff --git a/UefiPayloadPkg/UefiPayloadPkg.fdf b/UefiPayloadPkg/UefiPayloadPkg.fdf index 5b3e0e6159..5cdf6cce1c 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.fdf +++ b/UefiPayloadPkg/UefiPayloadPkg.fdf @@ -92,6 +92,10 @@ APRIORI DXE { INF UefiPayloadPkg/BlSMMStoreDxe/BlSMMStoreDxe.inf # After DevicePathDxe INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf # After BlSMMStoreDxe, RuntimeDxe INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf # After FaultTolerantWriteDxe +!if $(SECURE_BOOT_ENABLE) == TRUE + INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf + INF SecurityPkg/VariableAuthenticated/SecureBootDefaultKeysDxe/SecureBootDefaultKeysDxe.inf # After SMBusConfigLoader and PcatRealTimeClockRuntimeDxe, before Tcg2Dxe +!endif } # @@ -226,6 +230,35 @@ INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf # INF SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf +# +# Security +# +!if $(SECURE_BOOT_ENABLE) == TRUE + INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf + INF SecurityPkg/VariableAuthenticated/SecureBootDefaultKeysDxe/SecureBootDefaultKeysDxe.inf + + FILE FREEFORM = 85254ea7-4759-4fc4-82d4-5eed5fb0a4a0 { + SECTION RAW = UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/pk.crt + SECTION UI = "PK Default" + } + + FILE FREEFORM = 6f64916e-9f7a-4c35-b952-cd041efb05a3 { + SECTION RAW = UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/kek.crt + SECTION UI = "KEK Default" + } + + FILE FREEFORM = c491d352-7623-4843-accc-2791a7574421 { + SECTION RAW = UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/db-1.crt + SECTION RAW = UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/db-2.crt + SECTION UI = "DB Default" + } + + FILE FREEFORM = 5740766a-718e-4dc0-9935-c36f7d3f884f { + SECTION RAW = UefiPayloadPkg/SecureBootEnrollDefaultKeys/keys/crl.bin + SECTION UI = "DBX Default" + } +!endif + # # Shell # @@ -346,3 +379,16 @@ SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize = $(BLOCK_SIZE) FILE RAW = $(NAMED_GUID) { RAW RAW |.raw } + +[RULE.COMMON.USER_DEFINED] + FILE FREEFORM = $(NAMED_GUID) { + RAW BIN |.crt + RAW BIN |.bin + } + +[RULE.COMMON.USER_DEFINED.BINARY] + FILE FREEFORM = $(NAMED_GUID) { + RAW BIN |.crt + RAW BIN |.bin + UI STRING="$(MODULE_NAME)" Optional + }