diff --git a/digest-to-efi-sig-list/main.c b/digest-to-efi-sig-list/main.c index 68e2a59..1879674 100644 --- a/digest-to-efi-sig-list/main.c +++ b/digest-to-efi-sig-list/main.c @@ -8,25 +8,24 @@ #include #include -#define SHA256_DIGEST_SIZE (32) -#define HASH_SIZE (SHA256_DIGEST_SIZE) -#define HASH_LENGTH (HASH_SIZE*2) +#define HASH_SIZE (sizeof(EFI_SHA256_HASH)) +#define HASH_LENGTH (HASH_SIZE*2) EFI_GUID EFI_CERT_SHA256_GUID = { 0xc1c41626, 0x504c, 0x4092, { 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 } }; EFI_GUID MOK_OWNER = { 0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23} }; #pragma pack(1) typedef struct { - EFI_GUID SignatureOwner; - UINT8 SignatureData[1]; -} EFI_SIGNATURE_DATA; - -typedef struct { + // Signature list EFI_GUID SignatureType; UINT32 SignatureListSize; UINT32 SignatureHeaderSize; UINT32 SignatureSize; -} EFI_SIGNATURE_LIST; + + // Signature data + EFI_GUID SignatureOwner; + EFI_SHA256_HASH SignatureData; +} EFI_SIGNATURE; #pragma pack() void usage(const char *str) { @@ -44,29 +43,25 @@ int main(int argc, char *argv[]) { exit(1); } + EFI_SIGNATURE sig = { + EFI_CERT_SHA256_GUID, + sizeof(EFI_SIGNATURE), + 0, + 16 + 32, /* UEFI defined */ + MOK_OWNER, + {0}, + }; + /* Read digest */ - unsigned char digest[HASH_SIZE]; char buffer[3] = {0, 0, '\0'}; char *ptr; for (size_t i = 0; i < HASH_SIZE; ++i) { buffer[0] = argv[1][i*2]; buffer[1] = argv[1][(i*2) + 1]; - digest[i] = (unsigned char)strtoul(buffer, &ptr, 16); + sig.SignatureData[i] = (UINT8)strtoul(buffer, &ptr, 16); } - /* Convert to signature list */ - unsigned char sig[sizeof(EFI_SIGNATURE_LIST) + (sizeof(EFI_SIGNATURE_DATA) - 1 + SHA256_DIGEST_SIZE)]; - EFI_SIGNATURE_LIST *l = (void *)sig; - - memset(sig, 0, sizeof(sig)); - l->SignatureType = EFI_CERT_SHA256_GUID; - l->SignatureListSize = sizeof(sig); - l->SignatureSize = 16 + 32; /* UEFI defined */ - EFI_SIGNATURE_DATA *d = (void *)sig + sizeof(EFI_SIGNATURE_LIST); - d->SignatureOwner = MOK_OWNER; - memcpy(&d->SignatureData, digest, sizeof(digest)); - /* Write file */ int fdoutfile = open(argv[2], O_CREAT|O_WRONLY|O_TRUNC, S_IWUSR|S_IRUSR); if (fdoutfile == -1) { @@ -74,7 +69,7 @@ int main(int argc, char *argv[]) { perror(""); exit(1); } - write(fdoutfile, sig, sizeof(sig)); + write(fdoutfile, &sig, sizeof(sig)); close(fdoutfile); return 0;