OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
AppleEfiSignTool.c
Go to the documentation of this file.
1
19#include <Library/BaseMemoryLib.h>
20#include <Library/DebugLib.h>
21#include <Library/MemoryAllocationLib.h>
22#include <Library/OcMachoLib.h>
24#include <Library/OcStringLib.h>
25#include <Library/PcdLib.h>
26
27#include <UserFile.h>
28
29#define APPLE_EFI_SIGN_TOOL_VERSION "1.1"
30
36
37STATIC
38VOID
40 VOID
41 )
42{
43 DEBUG ((
44 DEBUG_ERROR,
45 "AppleEfiSignTool v%a – Tool for verifying Apple EFI binaries\n",
47 ));
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"));
51
52 DEBUG ((DEBUG_ERROR, "\nUsage: ./AppleEfiSignTool [-f] <path/to/image>\n"));
53 DEBUG ((DEBUG_ERROR, " -f force FixupAppleEfiImages quirk\n"));
54
55 DEBUG ((DEBUG_ERROR, "\nExample: ./AppleEfiSignTool path/to/apfs.efi\n"));
56}
57
68STATIC
69INT32
71 IN OUT UINT8 *Image,
72 IN UINT32 ImageSize,
73 IN OUT BOOLEAN *IsFat,
74 IN BOOLEAN ForceFixup,
75 IN PE_IMAGE_ARCH Arch
76 )
77{
78 EFI_STATUS Status;
79 EFI_STATUS ApfsStatus;
80 UINT32 OrgImageSize;
81 CONST CHAR8 *Slice;
82 PE_COFF_LOADER_IMAGE_CONTEXT Context;
83 RETURN_STATUS ContextStatus;
84 APFS_DRIVER_VERSION *DriverVersion;
85
86 Status = EFI_SUCCESS;
87 OrgImageSize = ImageSize;
88
89 if (Arch == PE_ARCH_32) {
90 Status = FatFilterArchitecture32 (&Image, &ImageSize);
91 Slice = "32-bit";
92 } else if (Arch == PE_ARCH_64) {
93 Status = FatFilterArchitecture64 (&Image, &ImageSize);
94 Slice = "64-bit";
95 } else {
96 Slice = "raw";
97 }
98
99 if (EFI_ERROR (Status)) {
100 return 0;
101 }
102
103 if ((OrgImageSize == ImageSize) && (Arch != PE_ARCH_ANY)) {
104 return 0;
105 }
106
107 if (OrgImageSize != ImageSize) {
108 *IsFat = TRUE;
109 }
110
111 DEBUG ((DEBUG_ERROR, "SIGN: Discovered %a slice\n", Slice));
112 OrgImageSize = ImageSize;
113
114 if (ForceFixup) {
115 ContextStatus = RETURN_VOLUME_CORRUPTED;
116 } else {
117 ContextStatus = PeCoffInitializeContext (
118 &Context,
119 Image,
120 ImageSize,
121 UefiImageOriginUserImage
122 );
123 }
124
125 if (ContextStatus == RETURN_VOLUME_CORRUPTED) {
126 DEBUG ((DEBUG_ERROR, "SIGN: %r - Trying again using FixupAppleEfiImages quirk\n", ContextStatus));
127 ContextStatus = OcPeCoffFixupInitializeContext (
128 &Context,
129 Image,
130 ImageSize,
131 FALSE
132 );
133 }
134
135 if (EFI_ERROR (ContextStatus)) {
136 Status = EFI_UNSUPPORTED;
137 } else {
139 &Context,
140 &ImageSize
141 );
142 }
143
144 DEBUG ((
145 DEBUG_ERROR,
146 "SIGN: Signature check (%u -> %u) - %r\n",
147 OrgImageSize,
148 ImageSize,
149 Status
150 ));
151
152 if (!EFI_ERROR (ContextStatus)) {
153 ApfsStatus = InternalPeCoffGetApfsDriverVersionFromContext (&Context, ImageSize, &DriverVersion);
154
155 if (!EFI_ERROR (ApfsStatus)) {
156 DEBUG ((
157 DEBUG_ERROR,
158 "SIGN: Got APFS %Lu (%-16a %-16a)\n",
159 DriverVersion->Version,
160 DriverVersion->Date,
161 DriverVersion->Time
162 ));
163 }
164 }
165
166 if (EFI_ERROR (Status)) {
167 return EXIT_FAILURE;
168 }
169
170 return 0;
171}
172
173int
175 int argc,
176 char *argv[]
177 )
178{
179 CONST CHAR8 *ImageFileName;
180 UINT32 ImageSize;
181 UINT8 *ImageFileBuffer;
182 BOOLEAN IsFat;
183 BOOLEAN ForceFixup;
184 INT32 RetVal;
185
186 //
187 // Enable PCD debug logging.
188 //
189 PcdGet32 (PcdFixedDebugPrintErrorLevel) |= DEBUG_INFO;
190 PcdGet32 (PcdDebugPrintErrorLevel) |= DEBUG_INFO;
191
192 //
193 // Match PcdImageProtectionPolicy defined in OpenCore.dsc.
194 // Apple images (supplied by user) may be not 4KBi aligned.
195 //
196 PcdGet32 (PcdImageProtectionPolicy) = 0x03;
197
198 //
199 // Process args or print usage.
200 //
201 if (argc == 2) {
202 ForceFixup = FALSE;
203 ImageFileName = argv[1];
204 } else if ((argc == 3) && (AsciiStrCmp ("-f", argv[1]) == 0)) {
205 ForceFixup = TRUE;
206 ImageFileName = argv[2];
207 } else {
208 PrintHelp ();
209 return EXIT_FAILURE;
210 }
211
212 ImageFileBuffer = UserReadFile (ImageFileName, &ImageSize);
213 if (ImageFileBuffer == NULL) {
214 DEBUG ((DEBUG_ERROR, "Failed to read %a\n", ImageFileName));
215 return EXIT_FAILURE;
216 }
217
218 IsFat = FALSE;
219 RetVal = EXIT_SUCCESS;
220 RetVal |= VerifySignatureAndApfs (ImageFileBuffer, ImageSize, &IsFat, ForceFixup, PE_ARCH_32);
221 if (IsFat) {
222 DEBUG ((DEBUG_ERROR, "\n"));
223 }
224
225 RetVal |= VerifySignatureAndApfs (ImageFileBuffer, ImageSize, &IsFat, ForceFixup, PE_ARCH_64);
226 if (!IsFat) {
227 RetVal |= VerifySignatureAndApfs (ImageFileBuffer, ImageSize, &IsFat, ForceFixup, PE_ARCH_ANY);
228 }
229
230 FreePool (ImageFileBuffer);
231
232 return RetVal;
233}
234
235int
237 const uint8_t *Data,
238 size_t Size
239 )
240{
241 #if 0
242 APFS_DRIVER_VERSION *DriverVersion;
243 EFI_STATUS Status;
244 volatile UINTN Walker;
245 UINTN Index;
246
247 Status = PeCoffGetApfsDriverVersion ((UINT8 *)Data, (UINT32)Size, &DriverVersion);
248 if (!EFI_ERROR (Status)) {
249 Walker = 0;
250 for (Index = 0; Index < sizeof (*DriverVersion); ++Index) {
251 Walker += ((UINT8 *)DriverVersion)[Index];
252 }
253 }
254
255 #endif
256
257 VOID *Copy;
258 UINT32 NewSize;
259
260 if ((Size > 0) && (Size <= 1024*1024*1024)) {
261 Copy = AllocatePool (Size);
262 if (Copy != NULL) {
263 CopyMem (Copy, Data, Size);
264
265 NewSize = (UINT32)Size;
266 PeCoffVerifyAppleSignature (Copy, &NewSize);
267 FreePool (Copy);
268 }
269 }
270
271 return 0;
272}
#define APPLE_EFI_SIGN_TOOL_VERSION
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
STATIC VOID PrintHelp(VOID)
PE_IMAGE_ARCH
@ PE_ARCH_32
@ PE_ARCH_ANY
@ PE_ARCH_64
STATIC INT32 VerifySignatureAndApfs(IN OUT UINT8 *Image, IN UINT32 ImageSize, IN OUT BOOLEAN *IsFat, IN BOOLEAN ForceFixup, IN PE_IMAGE_ARCH Arch)
DMG_SIZE_DEVICE_PATH Size
EFI_STATUS FatFilterArchitecture64(IN OUT UINT8 **FileData, IN OUT UINT32 *FileSize)
Definition MachoFat.c:151
EFI_STATUS FatFilterArchitecture32(IN OUT UINT8 **FileData, IN OUT UINT32 *FileSize)
Definition MachoFat.c:142
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)
Definition UserFile.c:62
UINT8 uint8_t
int ENTRY_POINT(void)
CHAR8 Date[16]
Definition Apfs.h:116
CHAR8 Time[16]
Definition Apfs.h:120