EFI_STATUS show_signature_support(EFI_SYSTEM_TABLE *systab, UINTN showguid) { EFI_STATUS rc = EFI_SUCCESS; char *data = NULL; UINTN data_size = 0; UINTN found = 0; EFI_GUID *guid; int i, j; struct { EFI_GUID *guid; CHAR16 *name; int required; } hashes[] = { { &gEfiCertSha1Guid, L"SHA-1", 1 }, { &gEfiCertSha256Guid, L"SHA-256", 0 }, { &gEfiCertRsa2048Guid, L"RSA-2048", 0 }, { &gEfiCertRsa2048Sha1Guid, L"RSA-2048 + SHA-1", 0 }, { &gEfiCertRsa2048Sha256Guid, L"RSA-2048 + SHA-256", 0 }, { &gEfiCertX509Guid, L"X509", 1 }, { &gEfiCertPkcs7Guid, L"PKCS-7", 0 }, { NULL, L"" } }; data = LibGetVariableAndSize(L"SignatureSupport", &EfiGlobalVariable, &data_size); guid = (EFI_GUID *)data; Print(L"Supported hashes:\n"); for (i = 0; i < data_size / sizeof(*guid); i++, guid++) { found = 0; for (j = 0; hashes[j].guid != NULL; j++) { if (!CompareMem(hashes[j].guid, guid, sizeof(*guid))) { if (showguid) Print(L" %s (%g)\n", hashes[j].name, guid); else Print(L" %s\n", hashes[j].name); hashes[j].required = 0; found = 1; continue; } } if (!found) { Print(L" Unknown hash (%g)\n", guid); } } for (j = 0; hashes[j].guid != NULL; j++) { if (hashes[j].required) { Print(L"ERROR: Did not find required hash \"%s\"\n", hashes[j].name); rc = EFI_NOT_FOUND; } } FreePool(data); return rc; }
VOID * LibGetVariable ( IN CHAR16 *Name, IN EFI_GUID *VendorGuid ) { UINTN VarSize; return LibGetVariableAndSize (Name, VendorGuid, &VarSize); }
static void dumpvar(EFI_SYSTEM_TABLE *systab, EFI_GUID *guid, CHAR16 *name) { char *data = NULL; UINTN data_size = 0; Print(L"Dumping "); Print(name); Print(L"\n"); data = LibGetVariableAndSize(name, guid, &data_size); dumphex(data, data_size); FreePool(data); }
EFI_STATUS set_boot_order(void) { CHAR16 *oldbootorder; UINTN size; EFI_GUID global = EFI_GLOBAL_VARIABLE; oldbootorder = LibGetVariableAndSize(L"BootOrder", &global, &size); if (oldbootorder) { nbootorder = size / sizeof (CHAR16); bootorder = oldbootorder; } return EFI_SUCCESS; }
EFI_STATUS update_boot_order(void) { CHAR16 *oldbootorder; UINTN size; EFI_GUID global = EFI_GLOBAL_VARIABLE; CHAR16 *newbootorder = NULL; oldbootorder = LibGetVariableAndSize(L"BootOrder", &global, &size); if (oldbootorder) { int n = size / sizeof (CHAR16) + nbootorder; newbootorder = AllocateZeroPool(n * sizeof (CHAR16)); if (!newbootorder) return EFI_OUT_OF_RESOURCES; CopyMem(newbootorder, bootorder, nbootorder * sizeof (CHAR16)); CopyMem(newbootorder + nbootorder, oldbootorder, size); size = n * sizeof (CHAR16); } else { size = nbootorder * sizeof(CHAR16); newbootorder = AllocateZeroPool(size); if (!newbootorder) return EFI_OUT_OF_RESOURCES; CopyMem(newbootorder, bootorder, size); } #ifdef DEBUG_FALLBACK Print(L"nbootorder: %d\nBootOrder: ", size / sizeof (CHAR16)); int j; for (j = 0 ; j < size / sizeof (CHAR16); j++) Print(L"%04x ", newbootorder[j]); Print(L"\n"); #endif if (oldbootorder) { LibDeleteVariable(L"BootOrder", &global); FreePool(oldbootorder); } EFI_STATUS rc; rc = uefi_call_wrapper(RT->SetVariable, 5, L"BootOrder", &global, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, size, newbootorder); FreePool(newbootorder); return rc; }
EFI_STATUS LibInsertToTailOfBootOrder ( IN UINT16 BootOption, IN BOOLEAN OnlyInsertIfEmpty ) { UINT16 *BootOptionArray; UINT16 *NewBootOptionArray; UINTN VarSize; UINTN Index; EFI_STATUS Status; BootOptionArray = LibGetVariableAndSize (VarBootOrder, &EfiGlobalVariable, &VarSize); if (VarSize != 0 && OnlyInsertIfEmpty) { if (BootOptionArray) { FreePool (BootOptionArray); } return EFI_UNSUPPORTED; } VarSize += sizeof(UINT16); NewBootOptionArray = AllocatePool (VarSize); for (Index = 0; Index < ((VarSize/sizeof(UINT16)) - 1); Index++) { NewBootOptionArray[Index] = BootOptionArray[Index]; } // // Insert in the tail of the array // NewBootOptionArray[Index] = BootOption; Status = uefi_call_wrapper( RT->SetVariable, 5, VarBootOrder, &EfiGlobalVariable, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, VarSize, (VOID*) NewBootOptionArray ); if (NewBootOptionArray) { FreePool (NewBootOptionArray); } if (BootOptionArray) { FreePool (BootOptionArray); } return Status; }