19#include <Library/BaseMemoryLib.h>
20#include <Library/DebugLib.h>
21#include <Library/MemoryAllocationLib.h>
25#include <Library/PcdLib.h>
29#define APPLE_EFI_SIGN_TOOL_VERSION "1.1"
45 "AppleEfiSignTool v%a – Tool for verifying Apple EFI binaries\n",
48 DEBUG ((DEBUG_ERROR,
"Supports PE and Fat binaries.\n"));
49 DEBUG ((DEBUG_ERROR,
"Displays signing info. Displays APFS info if image is APFS driver.\n"));
50 DEBUG ((DEBUG_ERROR,
"Also shows PE COFF image fixups when -f is specified.\n"));
52 DEBUG ((DEBUG_ERROR,
"\nUsage: ./AppleEfiSignTool [-f] <path/to/image>\n"));
53 DEBUG ((DEBUG_ERROR,
" -f force FixupAppleEfiImages quirk\n"));
55 DEBUG ((DEBUG_ERROR,
"\nExample: ./AppleEfiSignTool path/to/apfs.efi\n"));
73 IN OUT BOOLEAN *IsFat,
74 IN BOOLEAN ForceFixup,
79 EFI_STATUS ApfsStatus;
82 PE_COFF_LOADER_IMAGE_CONTEXT Context;
83 RETURN_STATUS ContextStatus;
87 OrgImageSize = ImageSize;
99 if (EFI_ERROR (Status)) {
103 if ((OrgImageSize == ImageSize) && (Arch !=
PE_ARCH_ANY)) {
107 if (OrgImageSize != ImageSize) {
111 DEBUG ((DEBUG_ERROR,
"SIGN: Discovered %a slice\n", Slice));
112 OrgImageSize = ImageSize;
115 ContextStatus = RETURN_VOLUME_CORRUPTED;
117 ContextStatus = PeCoffInitializeContext (
121 UefiImageOriginUserImage
125 if (ContextStatus == RETURN_VOLUME_CORRUPTED) {
126 DEBUG ((DEBUG_ERROR,
"SIGN: %r - Trying again using FixupAppleEfiImages quirk\n", ContextStatus));
135 if (EFI_ERROR (ContextStatus)) {
136 Status = EFI_UNSUPPORTED;
146 "SIGN: Signature check (%u -> %u) - %r\n",
152 if (!EFI_ERROR (ContextStatus)) {
155 if (!EFI_ERROR (ApfsStatus)) {
158 "SIGN: Got APFS %Lu (%-16a %-16a)\n",
166 if (EFI_ERROR (Status)) {
179 CONST CHAR8 *ImageFileName;
181 UINT8 *ImageFileBuffer;
189 PcdGet32 (PcdFixedDebugPrintErrorLevel) |= DEBUG_INFO;
190 PcdGet32 (PcdDebugPrintErrorLevel) |= DEBUG_INFO;
196 PcdGet32 (PcdImageProtectionPolicy) = 0x03;
203 ImageFileName = argv[1];
204 }
else if ((argc == 3) && (AsciiStrCmp (
"-f", argv[1]) == 0)) {
206 ImageFileName = argv[2];
212 ImageFileBuffer =
UserReadFile (ImageFileName, &ImageSize);
213 if (ImageFileBuffer == NULL) {
214 DEBUG ((DEBUG_ERROR,
"Failed to read %a\n", ImageFileName));
219 RetVal = EXIT_SUCCESS;
222 DEBUG ((DEBUG_ERROR,
"\n"));
230 FreePool (ImageFileBuffer);
244 volatile UINTN Walker;
248 if (!EFI_ERROR (Status)) {
250 for (Index = 0; Index <
sizeof (*DriverVersion); ++Index) {
251 Walker += ((UINT8 *)DriverVersion)[Index];
260 if ((
Size > 0) && (
Size <= 1024*1024*1024)) {
261 Copy = AllocatePool (
Size);
265 NewSize = (UINT32)
Size;
DMG_SIZE_DEVICE_PATH Size
EFI_STATUS FatFilterArchitecture64(IN OUT UINT8 **FileData, IN OUT UINT32 *FileSize)
EFI_STATUS FatFilterArchitecture32(IN OUT UINT8 **FileData, IN OUT UINT32 *FileSize)
STATIC EFI_STATUS InternalPeCoffGetApfsDriverVersionFromContext(IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, IN UINT32 DriverSize, OUT APFS_DRIVER_VERSION **DriverVersionPtr)
STATIC EFI_STATUS InternalPeCoffVerifyAppleSignatureFromContext(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, IN OUT UINT32 *ImageSize)
EFI_STATUS PeCoffVerifyAppleSignature(IN OUT VOID *PeImage, IN OUT UINT32 *ImageSize)
EFI_STATUS PeCoffGetApfsDriverVersion(IN VOID *DriverBuffer, IN UINT32 DriverSize, OUT APFS_DRIVER_VERSION **DriverVersionPtr)
RETURN_STATUS OcPeCoffFixupInitializeContext(OUT PE_COFF_LOADER_IMAGE_CONTEXT *Context, IN CONST VOID *FileBuffer, IN UINT32 FileSize, IN BOOLEAN InMemoryFixup)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
UINT8 * UserReadFile(IN CONST CHAR8 *FileName, OUT UINT32 *Size)