From bc1e30ee1e7940e0e70eab9afd55b6e355ef9899 Mon Sep 17 00:00:00 2001 From: Patrick Uiterwijk Date: Sat, 21 Jul 2018 03:27:26 +0200 Subject: [PATCH] Add vendor_esl Signed-off-by: Patrick Uiterwijk --- Makefile | 3 +++ cert.S | 30 ++++++++++++++++++++++++++++++ shim.c | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6ece282..78688e0 100644 --- a/Makefile +++ b/Makefile @@ -82,6 +82,9 @@ endif ifneq ($(origin VENDOR_CERT_FILE), undefined) CFLAGS += -DVENDOR_CERT_FILE=\"$(VENDOR_CERT_FILE)\" endif +ifneq ($(origin VENDOR_ESL_FILE), undefined) + CFLAGS += -DVENDOR_ESL_FILE=\"$(VENDOR_ESL_FILE)\" +endif ifneq ($(origin VENDOR_DBX_FILE), undefined) CFLAGS += -DVENDOR_DBX_FILE=\"$(VENDOR_DBX_FILE)\" endif diff --git a/cert.S b/cert.S index cfc4525..7ad782a 100644 --- a/cert.S +++ b/cert.S @@ -8,12 +8,18 @@ cert_table: #else .long 0 #endif +#if defined(VENDOR_ESL_FILE) + .long vendor_esl_priv_end - vendor_esl_priv +#else + .long 0 +#endif #if defined(VENDOR_DBX_FILE) .long vendor_dbx_priv_end - vendor_dbx_priv #else .long 0 #endif .long vendor_cert_priv - cert_table + .long vendor_esl_priv - cert_table .long vendor_dbx_priv - cert_table #if defined(VENDOR_CERT_FILE) .data @@ -39,6 +45,30 @@ vendor_cert_priv: .section .vendor_cert, "a", %progbits vendor_cert_priv_end: #endif +#if defined(VENDOR_ESL_FILE) + .data + .align 1 + .type vendor_esl_priv, %object + .size vendor_esl_priv, vendor_esl_priv_end-vendor_esl_priv + .section .vendor_cert, "a", %progbits +vendor_esl_priv: +.incbin VENDOR_ESL_FILE +vendor_esl_priv_end: +#else + .bss + .type vendor_esl_priv, %object + .size vendor_esl_priv, 1 + .section .vendor_cert, "a", %progbits +vendor_esl_priv: + .zero 1 + + .data + .align 4 + .type vendor_esl_size_priv, %object + .size vendor_esl_size_priv, 4 + .section .vendor_cert, "a", %progbits +vendor_esl_priv_end: +#endif #if defined(VENDOR_DBX_FILE) .data .align 1 diff --git a/shim.c b/shim.c index f8a1e67..d99134f 100644 --- a/shim.c +++ b/shim.c @@ -84,14 +84,18 @@ EFI_GUID SHIM_LOCK_GUID = { 0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, */ extern struct { UINT32 vendor_cert_size; + UINT32 vendor_esl_size; UINT32 vendor_dbx_size; UINT32 vendor_cert_offset; + UINT32 vendor_esl_offset; UINT32 vendor_dbx_offset; } cert_table; UINT32 vendor_cert_size; +UINT32 vendor_esl_size; UINT32 vendor_dbx_size; UINT8 *vendor_cert; +UINT8 *vendor_esl; UINT8 *vendor_dbx; /* @@ -1029,6 +1033,18 @@ static EFI_STATUS verify_buffer (char *data, int datasize, return status; } + /* + * Check if there's a vendor ESL built-in + */ + if (vendor_esl_size && + check_db_cert_in_ram((EFI_SIGNATURE_LIST*)vendor_esl, + vendor_esl_size, + cert, + sha256hash) == DATA_FOUND) { + status = EFI_SUCCESS; + return status; + } + /* * And finally, check against shim's built-in key */ @@ -1973,6 +1989,22 @@ EFI_STATUS mirror_mok_list() CertData->SignatureOwner = SHIM_LOCK_GUID; CopyMem(p, vendor_cert, vendor_cert_size); + } else if (vendor_esl_size) { + FullDataSize = DataSize + + vendor_esl_size + ; + FullData = AllocatePool(FullDataSize); + if (!FullData) { + perror(L"Failed to allocate space for MokListRT\n"); + return EFI_OUT_OF_RESOURCES; + } + p = FullData; + + if (efi_status == EFI_SUCCESS && DataSize > 0) { + CopyMem(p, Data, DataSize); + p += DataSize; + } + CopyMem(p, vendor_esl, vendor_esl_size); } else { FullDataSize = DataSize; FullData = Data; @@ -2606,7 +2638,7 @@ shim_init(void) set_second_stage (global_image_handle); if (secure_mode()) { - if (vendor_cert_size || vendor_dbx_size) { + if (vendor_cert_size || vendor_esl_size || vendor_dbx_size) { /* * If shim includes its own certificates then ensure * that anything it boots has performed some @@ -2706,8 +2738,10 @@ efi_main (EFI_HANDLE passed_image_handle, EFI_SYSTEM_TABLE *passed_systab) verification_method = VERIFIED_BY_NOTHING; vendor_cert_size = cert_table.vendor_cert_size; + vendor_esl_size = cert_table.vendor_esl_size; vendor_dbx_size = cert_table.vendor_dbx_size; vendor_cert = (UINT8 *)&cert_table + cert_table.vendor_cert_offset; + vendor_esl = (UINT8 *)&cert_table + cert_table.vendor_esl_offset; vendor_dbx = (UINT8 *)&cert_table + cert_table.vendor_dbx_offset; /* -- 2.18.0