arrfab / rpms / shim

Forked from rpms/shim 4 years ago
Clone

Blame SOURCES/0002-shim.c-Add-support-for-hashing-relocation-of-32-bit-.patch

f2fa6b
From 8e9d3af7b108cc76ce18017b3f58ad4b2e60989f Mon Sep 17 00:00:00 2001
f2fa6b
From: Mohanraj S <mohanrajx.sakkaraiappan@intel.com>
f2fa6b
Date: Tue, 27 Aug 2013 09:27:00 -0700
e97c83
Subject: [PATCH 02/74] shim.c: Add support for hashing/relocation of 32-bit
f2fa6b
 binaries
f2fa6b
f2fa6b
Change-Id: Ib93305f7f1691d1b142567507df1058de62dde06
f2fa6b
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
f2fa6b
---
f2fa6b
 shim.c | 72 +++++++++++++++++++++++++++++++++++++++++++++---------------------
f2fa6b
 1 file changed, 49 insertions(+), 23 deletions(-)
f2fa6b
f2fa6b
diff --git a/shim.c b/shim.c
f2fa6b
index dcb36d0..a043779 100644
f2fa6b
--- a/shim.c
f2fa6b
+++ b/shim.c
f2fa6b
@@ -126,7 +126,11 @@ static EFI_STATUS relocate_coff (PE_COFF_LOADER_IMAGE_CONTEXT *context,
f2fa6b
 	int size = context->ImageSize;
f2fa6b
 	void *ImageEnd = (char *)data + size;
f2fa6b
 
f2fa6b
+#if __LP64__
f2fa6b
 	context->PEHdr->Pe32Plus.OptionalHeader.ImageBase = (UINT64)data;
f2fa6b
+#else
f2fa6b
+	context->PEHdr->Pe32.OptionalHeader.ImageBase = (UINT32)data;
f2fa6b
+#endif
f2fa6b
 
f2fa6b
 	if (context->NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {
f2fa6b
 		Print(L"Image has no relocation entry\n");
f2fa6b
@@ -141,7 +145,7 @@ static EFI_STATUS relocate_coff (PE_COFF_LOADER_IMAGE_CONTEXT *context,
f2fa6b
 		return EFI_UNSUPPORTED;
f2fa6b
 	}
f2fa6b
 
f2fa6b
-	Adjust = (UINT64)data - context->ImageAddress;
f2fa6b
+	Adjust = (UINTN)data - context->ImageAddress;
f2fa6b
 
f2fa6b
 	if (Adjust == 0)
f2fa6b
 		return EFI_SUCCESS;
f2fa6b
@@ -549,9 +553,15 @@ static EFI_STATUS generate_hash (char *data, int datasize,
f2fa6b
 	}
f2fa6b
 
f2fa6b
 	/* Hash end of certificate table to end of image header */
f2fa6b
+#if __LP64__
f2fa6b
 	hashbase = (char *) &context->PEHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY + 1];
f2fa6b
 	hashsize = context->PEHdr->Pe32Plus.OptionalHeader.SizeOfHeaders -
f2fa6b
 		(int) ((char *) (&context->PEHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY + 1]) - data);
f2fa6b
+#else
f2fa6b
+	hashbase = (char *) &context->PEHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY + 1];
f2fa6b
+	hashsize = context->PEHdr->Pe32.OptionalHeader.SizeOfHeaders -
f2fa6b
+		(int) ((char *) (&context->PEHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY + 1]) - data);
f2fa6b
+#endif
f2fa6b
 
f2fa6b
 	if (!(Sha256Update(sha256ctx, hashbase, hashsize)) ||
f2fa6b
 	    !(Sha1Update(sha1ctx, hashbase, hashsize))) {
f2fa6b
@@ -561,7 +571,11 @@ static EFI_STATUS generate_hash (char *data, int datasize,
f2fa6b
 	}
f2fa6b
 
f2fa6b
 	/* Sort sections */
f2fa6b
+#if __LP64__
f2fa6b
 	SumOfBytesHashed = context->PEHdr->Pe32Plus.OptionalHeader.SizeOfHeaders;
f2fa6b
+#else
f2fa6b
+	SumOfBytesHashed = context->PEHdr->Pe32.OptionalHeader.SizeOfHeaders;
f2fa6b
+#endif
f2fa6b
 
f2fa6b
 	Section = (EFI_IMAGE_SECTION_HEADER *) (
f2fa6b
 		(char *)context->PEHdr + sizeof (UINT32) +
f2fa6b
@@ -628,7 +642,11 @@ static EFI_STATUS generate_hash (char *data, int datasize,
f2fa6b
 		hashbase = data + SumOfBytesHashed;
f2fa6b
 		hashsize = (unsigned int)(
f2fa6b
 			size -
f2fa6b
+#if __LP64__
f2fa6b
 			context->PEHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size -
f2fa6b
+#else
f2fa6b
+			context->PEHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size -
f2fa6b
+#endif
f2fa6b
 			SumOfBytesHashed);
f2fa6b
 
f2fa6b
 		if (!(Sha256Update(sha256ctx, hashbase, hashsize)) ||
f2fa6b
@@ -781,7 +799,7 @@ static EFI_STATUS read_header(void *data, unsigned int datasize,
f2fa6b
 {
f2fa6b
 	EFI_IMAGE_DOS_HEADER *DosHdr = data;
f2fa6b
 	EFI_IMAGE_OPTIONAL_HEADER_UNION *PEHdr = data;
f2fa6b
-	unsigned long HeaderWithoutDataDir, SectionHeaderOffset;
f2fa6b
+	unsigned long HeaderWithoutDataDir, SectionHeaderOffset, OptHeaderSize;
f2fa6b
 
f2fa6b
 	if (datasize < sizeof(EFI_IMAGE_DOS_HEADER)) {
f2fa6b
 		Print(L"Invalid image\n");
f2fa6b
@@ -790,18 +808,28 @@ static EFI_STATUS read_header(void *data, unsigned int datasize,
f2fa6b
 
f2fa6b
 	if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE)
f2fa6b
 		PEHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((char *)data + DosHdr->e_lfanew);
f2fa6b
+#if __LP64__
f2fa6b
+	context->NumberOfRvaAndSizes = PEHdr->Pe32Plus.OptionalHeader.NumberOfRvaAndSizes;
f2fa6b
+	context->SizeOfHeaders = PEHdr->Pe32Plus.OptionalHeader.SizeOfHeaders;
f2fa6b
+	context->ImageSize = PEHdr->Pe32Plus.OptionalHeader.SizeOfImage;
f2fa6b
+	OptHeaderSize = sizeof(EFI_IMAGE_OPTIONAL_HEADER64);
f2fa6b
+#else
f2fa6b
+	context->NumberOfRvaAndSizes = PEHdr->Pe32.OptionalHeader.NumberOfRvaAndSizes;
f2fa6b
+	context->SizeOfHeaders = PEHdr->Pe32.OptionalHeader.SizeOfHeaders;
f2fa6b
+	context->ImageSize = (UINT64)PEHdr->Pe32.OptionalHeader.SizeOfImage;
f2fa6b
+	OptHeaderSize = sizeof(EFI_IMAGE_OPTIONAL_HEADER32);
f2fa6b
+#endif
f2fa6b
+	context->NumberOfSections = PEHdr->Pe32.FileHeader.NumberOfSections;
f2fa6b
 
f2fa6b
-	if (EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES
f2fa6b
-			< PEHdr->Pe32Plus.OptionalHeader.NumberOfRvaAndSizes) {
f2fa6b
+	if (EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES < context->NumberOfRvaAndSizes) {
f2fa6b
 		Print(L"Image header too small\n");
f2fa6b
 		return EFI_UNSUPPORTED;
f2fa6b
 	}
f2fa6b
 
f2fa6b
-	HeaderWithoutDataDir = sizeof (EFI_IMAGE_OPTIONAL_HEADER64)
f2fa6b
+	HeaderWithoutDataDir = OptHeaderSize
f2fa6b
 			- sizeof (EFI_IMAGE_DATA_DIRECTORY) * EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES;
f2fa6b
-	if (((UINT32)PEHdr->Pe32Plus.FileHeader.SizeOfOptionalHeader - HeaderWithoutDataDir) !=
f2fa6b
-			PEHdr->Pe32Plus.OptionalHeader.NumberOfRvaAndSizes
f2fa6b
-				* sizeof (EFI_IMAGE_DATA_DIRECTORY)) {
f2fa6b
+	if (((UINT32)PEHdr->Pe32.FileHeader.SizeOfOptionalHeader - HeaderWithoutDataDir) !=
f2fa6b
+			context->NumberOfRvaAndSizes * sizeof (EFI_IMAGE_DATA_DIRECTORY)) {
f2fa6b
 		Print(L"Image header overflows data directory\n");
f2fa6b
 		return EFI_UNSUPPORTED;
f2fa6b
 	}
f2fa6b
@@ -809,15 +837,15 @@ static EFI_STATUS read_header(void *data, unsigned int datasize,
f2fa6b
 	SectionHeaderOffset = DosHdr->e_lfanew
f2fa6b
 				+ sizeof (UINT32)
f2fa6b
 				+ sizeof (EFI_IMAGE_FILE_HEADER)
f2fa6b
-				+ PEHdr->Pe32Plus.FileHeader.SizeOfOptionalHeader;
f2fa6b
-	if ((PEHdr->Pe32Plus.OptionalHeader.SizeOfImage - SectionHeaderOffset) / EFI_IMAGE_SIZEOF_SECTION_HEADER
f2fa6b
-			<= PEHdr->Pe32Plus.FileHeader.NumberOfSections) {
f2fa6b
+				+ PEHdr->Pe32.FileHeader.SizeOfOptionalHeader;
f2fa6b
+	if (((UINT32)context->ImageSize - SectionHeaderOffset) / EFI_IMAGE_SIZEOF_SECTION_HEADER
f2fa6b
+			<= context->NumberOfSections) {
f2fa6b
 		Print(L"Image sections overflow image size\n");
f2fa6b
 		return EFI_UNSUPPORTED;
f2fa6b
 	}
f2fa6b
 
f2fa6b
-	if ((PEHdr->Pe32Plus.OptionalHeader.SizeOfHeaders - SectionHeaderOffset) / EFI_IMAGE_SIZEOF_SECTION_HEADER
f2fa6b
-			< (UINT32)PEHdr->Pe32Plus.FileHeader.NumberOfSections) {
f2fa6b
+	if ((context->SizeOfHeaders - SectionHeaderOffset) / EFI_IMAGE_SIZEOF_SECTION_HEADER
f2fa6b
+			< (UINT32)context->NumberOfSections) {
f2fa6b
 		Print(L"Image sections overflow section headers\n");
f2fa6b
 		return EFI_UNSUPPORTED;
f2fa6b
 	}
f2fa6b
@@ -837,21 +865,19 @@ static EFI_STATUS read_header(void *data, unsigned int datasize,
f2fa6b
 		return EFI_UNSUPPORTED;
f2fa6b
 	}
f2fa6b
 
f2fa6b
-	if (PEHdr->Pe32.OptionalHeader.Magic != EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
f2fa6b
-		Print(L"Only 64-bit images supported\n");
f2fa6b
-		return EFI_UNSUPPORTED;
f2fa6b
-	}
f2fa6b
-
f2fa6b
 	context->PEHdr = PEHdr;
f2fa6b
+#if __LP64__
f2fa6b
 	context->ImageAddress = PEHdr->Pe32Plus.OptionalHeader.ImageBase;
f2fa6b
-	context->ImageSize = (UINT64)PEHdr->Pe32Plus.OptionalHeader.SizeOfImage;
f2fa6b
-	context->SizeOfHeaders = PEHdr->Pe32Plus.OptionalHeader.SizeOfHeaders;
f2fa6b
 	context->EntryPoint = PEHdr->Pe32Plus.OptionalHeader.AddressOfEntryPoint;
f2fa6b
 	context->RelocDir = &PEHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];
f2fa6b
-	context->NumberOfRvaAndSizes = PEHdr->Pe32Plus.OptionalHeader.NumberOfRvaAndSizes;
f2fa6b
-	context->NumberOfSections = PEHdr->Pe32.FileHeader.NumberOfSections;
f2fa6b
-	context->FirstSection = (EFI_IMAGE_SECTION_HEADER *)((char *)PEHdr + PEHdr->Pe32.FileHeader.SizeOfOptionalHeader + sizeof(UINT32) + sizeof(EFI_IMAGE_FILE_HEADER));
f2fa6b
 	context->SecDir = (EFI_IMAGE_DATA_DIRECTORY *) &PEHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY];
f2fa6b
+#else
f2fa6b
+	context->ImageAddress = PEHdr->Pe32.OptionalHeader.ImageBase;
f2fa6b
+	context->EntryPoint = PEHdr->Pe32.OptionalHeader.AddressOfEntryPoint;
f2fa6b
+	context->RelocDir = &PEHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];
f2fa6b
+	context->SecDir = (EFI_IMAGE_DATA_DIRECTORY *) &PEHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY];
f2fa6b
+#endif
f2fa6b
+	context->FirstSection = (EFI_IMAGE_SECTION_HEADER *)((char *)PEHdr + PEHdr->Pe32.FileHeader.SizeOfOptionalHeader + sizeof(UINT32) + sizeof(EFI_IMAGE_FILE_HEADER));
f2fa6b
 
f2fa6b
 	if (context->ImageSize < context->SizeOfHeaders) {
f2fa6b
 		Print(L"Invalid image\n");
f2fa6b
-- 
e97c83
1.9.3
f2fa6b