summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--include/mock-variables.h170
-rw-r--r--include/test-data-efivars-0.h554
-rw-r--r--include/test.h124
-rw-r--r--include/test.mk8
-rw-r--r--mock-variables.c1022
-rw-r--r--test-data/efivars-0/AMD_PBS_SETUP-a339d746-f678-49b3-9fc7-54ce0f9df226bin0 -> 132 bytes
-rw-r--r--test-data/efivars-0/AMD_RAID-fe26a894-d199-47d4-8afa-070e3d54ba86bin0 -> 12 bytes
-rw-r--r--test-data/efivars-0/AMITCGPPIVAR-a8a2093b-fefa-43c1-8e62-ce526847265ebin0 -> 28 bytes
-rw-r--r--test-data/efivars-0/Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 122 bytes
-rw-r--r--test-data/efivars-0/db-d719b2cb-3d3a-4596-a3bc-dad00e67656fbin0 -> 7421 bytes
-rw-r--r--test-data/efivars-0/dbDefault-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 6326 bytes
-rw-r--r--test-data/efivars-0/dbx-d719b2cb-3d3a-4596-a3bc-dad00e67656fbin0 -> 3728 bytes
-rw-r--r--test-data/efivars-0/dbxDefault-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 3728 bytes
-rw-r--r--test-data/efivars-1/AMD_PBS_SETUP-a339d746-f678-49b3-9fc7-54ce0f9df226bin0 -> 132 bytes
-rw-r--r--test-data/efivars-1/AMD_RAID-fe26a894-d199-47d4-8afa-070e3d54ba86bin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/AMITCGPPIVAR-a8a2093b-fefa-43c1-8e62-ce526847265ebin0 -> 28 bytes
-rw-r--r--test-data/efivars-1/AMITSESetup-c811fa38-42c8-4579-a9bb-60e94eddfb34bin0 -> 85 bytes
-rw-r--r--test-data/efivars-1/AOD_SETUP-5ed15dc0-edef-4161-9151-6014c4cc630cbin0 -> 437 bytes
-rw-r--r--test-data/efivars-1/AmdAcpiVar-79941ecd-ed36-49d0-8124-e4c31ac75cd4bin0 -> 14 bytes
-rw-r--r--test-data/efivars-1/AmdSetup-3a997502-647a-4c82-998e-52ef9486a247bin0 -> 1557 bytes
-rw-r--r--test-data/efivars-1/AmiHardwareSignatureSetupUpdateCountVar-81c76078-bfde-4368-9790-570914c01a65bin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/ApSyncFlagNv-ad3f6761-f0a3-46c8-a4cb-19b70ffdb305bin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/AsbkpInfo-cb825795-feb1-4c0b-894f-cc70f8064395bin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/AsusExtFancard-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/AsusFanSetupFeatures-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 18 bytes
-rw-r--r--test-data/efivars-1/AsusHwmSetupOneof-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 40 bytes
-rw-r--r--test-data/efivars-1/AsusNodePsu-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/AsusQFanSetupData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 340 bytes
-rw-r--r--test-data/efivars-1/AsusRomLayout-7186d975-2dba-4413-81a8-9f1538faef5ebin0 -> 20 bytes
-rw-r--r--test-data/efivars-1/AsusSetupDataBackup-1111b056-c5e9-40ca-aba3-ec172533d814bin0 -> 9 bytes
-rw-r--r--test-data/efivars-1/AutoDetectData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 40 bytes
-rw-r--r--test-data/efivars-1/BiosEventLog-4034591c-48ea-4cdc-864f-e7cb61cfd0f2bin0 -> 884 bytes
-rw-r--r--test-data/efivars-1/Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 122 bytes
-rw-r--r--test-data/efivars-1/Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 124 bytes
-rw-r--r--test-data/efivars-1/Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 120 bytes
-rw-r--r--test-data/efivars-1/Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 59 bytes
-rw-r--r--test-data/efivars-1/Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 67 bytes
-rw-r--r--test-data/efivars-1/Boot0005-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 63 bytes
-rw-r--r--test-data/efivars-1/Boot0006-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 158 bytes
-rw-r--r--test-data/efivars-1/BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 6 bytes
-rw-r--r--test-data/efivars-1/BootFromUSB-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/BootOptionSupport-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 16 bytes
-rw-r--r--test-data/efivars-1/CMOSfailflag-c89dc9c7-5105-472c-a743-b1621e142b41bin0 -> 6 bytes
-rw-r--r--test-data/efivars-1/ConIn-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 282 bytes
-rw-r--r--test-data/efivars-1/ConInDev-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 276 bytes
-rw-r--r--test-data/efivars-1/ConOut-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 40 bytes
-rw-r--r--test-data/efivars-1/ConOutDev-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 40 bytes
-rw-r--r--test-data/efivars-1/CurrentPolicy-77fa9abd-0359-4d32-bd60-28f4e78f784bbin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/DefaultBootOrder-45cf35f6-0d6e-4d04-856a-0370a5b16f53bin0 -> 10 bytes
-rw-r--r--test-data/efivars-1/DeploymentModeNv-97e8965f-c761-4f48-b6e4-9ffa9cb2a2d6bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/DownCoreStatus-29749bad-401b-4f6d-b124-cece8c590c48bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/EnWpData-cbab171f-f356-4009-baaa-6628353a0a29bin0 -> 68 bytes
-rw-r--r--test-data/efivars-1/ErrOut-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 40 bytes
-rw-r--r--test-data/efivars-1/FPLayoutOrder-4db88a62-6721-47a0-9082-280b00323594bin0 -> 14 bytes
-rw-r--r--test-data/efivars-1/FTMActiveFlag-4034591c-48ea-4cdc-864f-e7cb61cfd0f2bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/FastBootOption-b540a530-6978-4da7-91cb-7207d764d262bin0 -> 146 bytes
-rw-r--r--test-data/efivars-1/FirstBootFlag-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/HddSmartInfo-a6f44860-b2e8-4fda-bd45-78368994b6aebin0 -> 6 bytes
-rw-r--r--test-data/efivars-1/HiiDB-1b838190-4625-4ead-abc9-cd5e6af18fe0bin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/HwErrRecSupport-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 6 bytes
-rw-r--r--test-data/efivars-1/KEK-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 2651 bytes
-rw-r--r--test-data/efivars-1/KEKDefault-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 3577 bytes
-rw-r--r--test-data/efivars-1/Kernel_ATPSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784bbin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/Kernel_DriverSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784bbin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/Kernel_RvkSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784bbin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/Kernel_SiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784bbin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/Kernel_SkuSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784bbin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/Kernel_WinSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784bbin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/LastBoot-b540a530-6978-4da7-91cb-7207d764d262bin0 -> 39 bytes
-rw-r--r--test-data/efivars-1/MaximumTableSize-4b3082a3-80c6-4d7e-9cd0-583917265df1bin0 -> 6 bytes
-rw-r--r--test-data/efivars-1/MemoryOverwriteRequestControl-e20939be-32d4-41be-a150-897f85d49829bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/MemoryOverwriteRequestControlLock-bb983ccf-151d-40e1-a07b-4a17be168292bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/MokList-605dab50-e046-4300-abb6-3dd810dd8b23bin0 -> 924 bytes
-rw-r--r--test-data/efivars-1/MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23bin0 -> 924 bytes
-rw-r--r--test-data/efivars-1/MokListX-605dab50-e046-4300-abb6-3dd810dd8b23bin0 -> 80 bytes
-rw-r--r--test-data/efivars-1/MokListXRT-605dab50-e046-4300-abb6-3dd810dd8b23bin0 -> 80 bytes
-rw-r--r--test-data/efivars-1/MonotonicCounter-01368881-c4ad-4b1d-b631-d57a8ec8db6bbin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/MyFav-4034591c-48ea-4cdc-864f-e7cb61cfd0f2bin0 -> 82 bytes
-rw-r--r--test-data/efivars-1/NVRAM_Verify-15a9dd61-e4f8-4a99-80db-353b13d76490bin0 -> 6 bytes
-rw-r--r--test-data/efivars-1/NetworkStackVar-d1405d16-7afc-4695-bb12-41459d3695a2bin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/NvHdd0-e57abcbd-9456-4639-8f65-06aab41d840fbin0 -> 32 bytes
-rw-r--r--test-data/efivars-1/NvHdd8-e57abcbd-9456-4639-8f65-06aab41d840fbin0 -> 26 bytes
-rw-r--r--test-data/efivars-1/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/PCI_COMMON-aca9f304-21e2-4852-9875-7ff4881d67a5bin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/PK-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 1094 bytes
-rw-r--r--test-data/efivars-1/PKDefault-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 890 bytes
-rw-r--r--test-data/efivars-1/PcieSataModVar-5e9a565f-cdc0-413b-ad13-1fe8713ffdcdbin0 -> 7 bytes
-rw-r--r--test-data/efivars-1/PlatformLang-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 10 bytes
-rw-r--r--test-data/efivars-1/PlatformLangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 60 bytes
-rw-r--r--test-data/efivars-1/PreVgaInfo-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/RsdpAddr-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/SIDSUPPORT-7d3dceee-cbce-4ea7-8709-6e552f1edbdebin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/SbatLevel-605dab50-e046-4300-abb6-3dd810dd8b23bin0 -> 22 bytes
-rw-r--r--test-data/efivars-1/SbatLevelRT-605dab50-e046-4300-abb6-3dd810dd8b23bin0 -> 22 bytes
-rw-r--r--test-data/efivars-1/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/SecureBootSetup-7b59104a-c00d-4158-87ff-f04d6396a915bin0 -> 11 bytes
-rw-r--r--test-data/efivars-1/Setup-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 468 bytes
-rw-r--r--test-data/efivars-1/SetupLedData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 6 bytes
-rw-r--r--test-data/efivars-1/SetupMode-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/SignatureSupport-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 148 bytes
-rw-r--r--test-data/efivars-1/SmbiosEntryPointTable-4b3082a3-80c6-4d7e-9cd0-583917265df1bin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/SmbiosScratchBuffer-4b3082a3-80c6-4d7e-9cd0-583917265df1bin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/SmbiosV3EntryPointTable-4b3082a3-80c6-4d7e-9cd0-583917265df1bin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/StdDefaults-4599d26f-1a11-49b8-b91f-858745cff824bin0 -> 7179 bytes
-rw-r--r--test-data/efivars-1/TPMPERBIOSFLAGS-7d3dceee-cbce-4ea7-8709-6e552f1edbdebin0 -> 10 bytes
-rw-r--r--test-data/efivars-1/Timeout-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 6 bytes
-rw-r--r--test-data/efivars-1/TotalNumberOfRootBridges-fb5703f5-f8a7-f401-18b4-3f108deb2612bin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/TpmServFlags-7d3dceee-cbce-4ea7-8709-6e552f1edbdebin0 -> 12 bytes
-rw-r--r--test-data/efivars-1/UsbSupport-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9bin0 -> 53 bytes
-rw-r--r--test-data/efivars-1/VARSTORE_OCMR_SETTINGS_NAME-c05fba7d-7a92-49e0-bcee-233b14dca803bin0 -> 5663 bytes
-rw-r--r--test-data/efivars-1/VendorKeys-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 5 bytes
-rw-r--r--test-data/efivars-1/WpBufAddr-cba83c4a-a5fc-48a8-b3a6-d33636166544bin0 -> 8 bytes
-rw-r--r--test-data/efivars-1/WriteOnceStatus-4b3082a3-80c6-4d7e-9cd0-583917265df1bin0 -> 68 bytes
-rw-r--r--test-data/efivars-1/db-d719b2cb-3d3a-4596-a3bc-dad00e67656fbin0 -> 7421 bytes
-rw-r--r--test-data/efivars-1/dbDefault-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 6326 bytes
-rw-r--r--test-data/efivars-1/dbx-d719b2cb-3d3a-4596-a3bc-dad00e67656fbin0 -> 3728 bytes
-rw-r--r--test-data/efivars-1/dbxDefault-8be4df61-93ca-11d2-aa0d-00e098032b8cbin0 -> 3728 bytes
-rw-r--r--test-mock-variables.c421
-rw-r--r--test.c8
122 files changed, 2299 insertions, 9 deletions
diff --git a/.gitignore b/.gitignore
index 727951a3..7fc55bce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,5 +42,6 @@ Make.local
shim_cert.h
/test-*
!/test-*.c
+!/test-data/
/test-random.h
version.c
diff --git a/include/mock-variables.h b/include/mock-variables.h
new file mode 100644
index 00000000..7ba00847
--- /dev/null
+++ b/include/mock-variables.h
@@ -0,0 +1,170 @@
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+/*
+ * mock-variables.h - a mock GetVariable/SetVariable/GNVN/etc
+ * implementation for testing.
+ * Copyright Peter Jones <pjones@redhat.com>
+ */
+
+#ifndef SHIM_MOCK_VARIABLES_H_
+#define SHIM_MOCK_VARIABLES_H_
+
+#include "test.h"
+
+EFI_STATUS EFIAPI mock_get_variable(CHAR16 *name, EFI_GUID *guid, UINT32 *attrs,
+ UINTN *size, VOID *data);
+EFI_STATUS EFIAPI mock_get_next_variable_name(UINTN *size, CHAR16 *name,
+ EFI_GUID *guid);
+EFI_STATUS EFIAPI mock_set_variable(CHAR16 *name, EFI_GUID *guid, UINT32 attrs,
+ UINTN size, VOID *data);
+EFI_STATUS EFIAPI mock_query_variable_info(UINT32 attrs,
+ UINT64 *max_var_storage,
+ UINT64 *remaining_var_storage,
+ UINT64 *max_var_size);
+
+struct mock_variable_limits {
+ UINT32 attrs;
+ UINT64 *max_var_storage;
+ UINT64 *remaining_var_storage;
+ UINT64 *max_var_size;
+ EFI_STATUS status;
+
+ list_t list;
+};
+
+typedef enum {
+ MOCK_SORT_DESCENDING,
+ MOCK_SORT_PREPEND,
+ MOCK_SORT_APPEND,
+ MOCK_SORT_ASCENDING,
+ MOCK_SORT_MAX_SENTINEL
+} mock_sort_policy_t;
+
+extern mock_sort_policy_t mock_variable_sort_policy;
+
+extern list_t mock_default_variable_limits;
+extern list_t *mock_qvi_limits;
+extern list_t *mock_sv_limits;
+
+struct mock_variable {
+ CHAR16 *name;
+ EFI_GUID guid;
+ void *data;
+ size_t size;
+ uint32_t attrs;
+
+ list_t list;
+};
+
+extern list_t mock_variables;
+
+static inline void
+dump_mock_variables(const char * const file,
+ const int line,
+ const char * const func)
+{
+ list_t *pos = NULL;
+ printf("%s:%d:%s(): dumping variables\n", file, line, func);
+ list_for_each(pos, &mock_variables) {
+ struct mock_variable *var;
+
+ var = list_entry(pos, struct mock_variable, list);
+ printf("%s:%d:%s(): "GUID_FMT"-%s\n", file, line, func,
+ GUID_ARGS(var->guid), Str2str(var->name));
+ }
+}
+
+static inline void
+dump_mock_variables_if_wrong(const char * const file,
+ const int line,
+ const char * const func,
+ EFI_GUID *guid, CHAR16 *first)
+{
+ UINTN size = 0;
+ CHAR16 buf[8192] = { 0, };
+ EFI_STATUS status;
+
+ size = sizeof(buf);
+ buf[0] = L'\0';
+ status = RT->GetNextVariableName(&size, buf, guid);
+ if (EFI_ERROR(status)) {
+ printf("%s:%d:%s() Can't dump variables: %lx\n",
+ __FILE__, __LINE__, __func__,
+ (unsigned long)status);
+ return;
+ }
+ buf[size] = L'\0';
+ if (StrCmp(buf, first) == 0)
+ return;
+ printf("%s:%d:%s():expected \"%s\" but got \"%s\". Variables:\n",
+ file, line, func, Str2str(first), Str2str(buf));
+ dump_mock_variables(file, line, func);
+}
+
+void mock_load_variables(const char *const dirname, const char *filters[],
+ bool filter_out);
+void mock_install_query_variable_info(void);
+void mock_uninstall_query_variable_info(void);
+void mock_reset_variables(void);
+void mock_finalize_vars(void);
+
+typedef enum {
+ NONE = 0,
+ CREATE,
+ DELETE,
+ APPEND,
+ REPLACE,
+} mock_variable_op_t;
+
+typedef EFI_STATUS (mock_set_variable_pre_hook_t)(CHAR16 *name, EFI_GUID *guid,
+ UINT32 attrs, UINTN size,
+ VOID *data);
+extern mock_set_variable_pre_hook_t *mock_set_variable_pre_hook;
+
+typedef void (mock_set_variable_post_hook_t)(CHAR16 *name, EFI_GUID *guid,
+ UINT32 attrs, UINTN size,
+ VOID *data, EFI_STATUS *status,
+ mock_variable_op_t op,
+ const char * const file,
+ const int line,
+ const char * const func);
+extern mock_set_variable_post_hook_t *mock_set_variable_post_hook;
+
+typedef EFI_STATUS (mock_get_variable_pre_hook_t)(CHAR16 *name, EFI_GUID *guid,
+ UINT32 *attrs, UINTN *size,
+ VOID *data);
+extern mock_get_variable_pre_hook_t *mock_get_variable_pre_hook;
+
+typedef void (mock_get_variable_post_hook_t)(CHAR16 *name, EFI_GUID *guid,
+ UINT32 *attrs, UINTN *size,
+ VOID *data, EFI_STATUS *status,
+ const char * const file,
+ const int line,
+ const char * const func);
+extern mock_get_variable_post_hook_t *mock_get_variable_post_hook;
+
+typedef EFI_STATUS (mock_get_next_variable_name_pre_hook_t)(UINTN *size,
+ CHAR16 *name,
+ EFI_GUID *guid);
+extern mock_get_next_variable_name_pre_hook_t
+ *mock_get_next_variable_name_pre_hook;
+
+typedef void (mock_get_next_variable_name_post_hook_t)(
+ UINTN *size, CHAR16 *name, EFI_GUID *guid,
+ EFI_STATUS *status, const char * const file,
+ const int line, const char * const func);
+extern mock_get_next_variable_name_post_hook_t
+ *mock_get_next_variable_name_post_hook;
+
+typedef EFI_STATUS (mock_query_variable_info_pre_hook_t)(
+ UINT32 attrs, UINT64 *max_var_storage,
+ UINT64 *remaining_var_storage, UINT64 *max_var_size);
+extern mock_query_variable_info_pre_hook_t *mock_query_variable_info_pre_hook;
+
+typedef void (mock_query_variable_info_post_hook_t)(
+ UINT32 attrs, UINT64 *max_var_storage, UINT64 *remaining_var_storage,
+ UINT64 *max_var_size, EFI_STATUS *status, const char * const file,
+ const int line, const char * const func);
+extern mock_query_variable_info_post_hook_t *mock_query_variable_info_post_hook;
+
+#endif /* !SHIM_MOCK_VARIABLES_H_ */
+// vim:fenc=utf-8:tw=75:noet
diff --git a/include/test-data-efivars-0.h b/include/test-data-efivars-0.h
new file mode 100644
index 00000000..b3e7c8c5
--- /dev/null
+++ b/include/test-data-efivars-0.h
@@ -0,0 +1,554 @@
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+/*
+ * test-data-efivars-0.h - test data
+ * Copyright Peter Jones <pjones@redhat.com>
+ */
+
+#ifndef TEST_DATA_EFIVARS_0_H_
+#define TEST_DATA_EFIVARS_0_H_
+
+static const unsigned char test_data_efivars_0_Boot0000[] = {
+ 0x01, 0x00, 0x00, 0x00, 0x62, 0x00, 0x46, 0x00, 0x65, 0x00, 0x64, 0x00,
+ 0x6f, 0x00, 0x72, 0x00, 0x61, 0x00, 0x00, 0x00, 0x04, 0x01, 0x2a, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x58, 0x7f, 0x92,
+ 0x54, 0xdc, 0xf4, 0x4f, 0x82, 0x1c, 0xd2, 0x9b, 0x59, 0xc4, 0x8a, 0xb1,
+ 0x02, 0x02, 0x04, 0x04, 0x34, 0x00, 0x5c, 0x00, 0x45, 0x00, 0x46, 0x00,
+ 0x49, 0x00, 0x5c, 0x00, 0x46, 0x00, 0x45, 0x00, 0x44, 0x00, 0x4f, 0x00,
+ 0x52, 0x00, 0x41, 0x00, 0x5c, 0x00, 0x53, 0x00, 0x48, 0x00, 0x49, 0x00,
+ 0x4d, 0x00, 0x58, 0x00, 0x36, 0x00, 0x34, 0x00, 0x2e, 0x00, 0x45, 0x00,
+ 0x46, 0x00, 0x49, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x04, 0x00
+};
+
+static const unsigned char test_data_efivars_0_dbDefault[] = {
+ 0xa1, 0x59, 0xc0, 0xa5, 0xe4, 0x94, 0xa7, 0x4a, 0x87, 0xb5, 0xab, 0x15,
+ 0x5c, 0x2b, 0xf0, 0x72, 0x82, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x66, 0x03, 0x00, 0x00, 0x91, 0x30, 0x05, 0x3b, 0x9f, 0x6c, 0xcc, 0x04,
+ 0xb1, 0xac, 0xe2, 0xa5, 0x1e, 0x3b, 0xe5, 0xf5, 0x30, 0x82, 0x03, 0x52,
+ 0x30, 0x82, 0x02, 0x3a, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0xda,
+ 0x83, 0xb9, 0x90, 0x42, 0x2e, 0xbc, 0x8c, 0x44, 0x1f, 0x8d, 0x8b, 0x03,
+ 0x9a, 0x65, 0xa2, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d,
+ 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, 0x41, 0x53, 0x55, 0x53, 0x54,
+ 0x65, 0x4b, 0x20, 0x4d, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x42, 0x6f, 0x61,
+ 0x72, 0x64, 0x20, 0x53, 0x57, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x43, 0x65,
+ 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x30, 0x1e, 0x17,
+ 0x0d, 0x31, 0x31, 0x31, 0x32, 0x32, 0x36, 0x32, 0x33, 0x33, 0x35, 0x30,
+ 0x35, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x31, 0x32, 0x32, 0x36, 0x32, 0x33,
+ 0x33, 0x35, 0x30, 0x34, 0x5a, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, 0x41, 0x53, 0x55, 0x53, 0x54, 0x65,
+ 0x4b, 0x20, 0x4d, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x42, 0x6f, 0x61, 0x72,
+ 0x64, 0x20, 0x53, 0x57, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x43, 0x65, 0x72,
+ 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x30, 0x82, 0x01, 0x22,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a,
+ 0x02, 0x82, 0x01, 0x01, 0x00, 0x8c, 0xf6, 0xa6, 0xeb, 0x77, 0xfc, 0x83,
+ 0x8a, 0xa4, 0x9f, 0xd5, 0xf8, 0xcf, 0x3f, 0x37, 0xf2, 0x6e, 0x2d, 0x0a,
+ 0x62, 0xc5, 0xd8, 0x9b, 0x1d, 0x16, 0x0b, 0x22, 0x7f, 0x29, 0x5f, 0x3a,
+ 0x26, 0xdf, 0x53, 0x97, 0x8c, 0x78, 0x94, 0x19, 0x90, 0x42, 0x73, 0x0f,
+ 0x85, 0xc2, 0xff, 0xa4, 0x85, 0x7c, 0x81, 0x2e, 0x0b, 0x51, 0xba, 0x56,
+ 0x23, 0x27, 0x92, 0x3d, 0xa3, 0xf2, 0xdc, 0xe2, 0x77, 0x84, 0x9e, 0x50,
+ 0xbe, 0x8a, 0xeb, 0x51, 0x34, 0xa4, 0xf8, 0xef, 0x5d, 0xd7, 0x51, 0xfe,
+ 0x70, 0x42, 0x4c, 0x42, 0x06, 0xef, 0x69, 0x2c, 0xa2, 0xd3, 0x25, 0xe1,
+ 0x26, 0x57, 0x23, 0x85, 0x6d, 0xd0, 0xa7, 0x7b, 0xc0, 0x45, 0x28, 0x7e,
+ 0x89, 0xd5, 0xb4, 0x0a, 0xeb, 0xaf, 0x41, 0x79, 0x21, 0xd2, 0xd7, 0x00,
+ 0xec, 0x48, 0xf9, 0x44, 0xf6, 0x5b, 0xbe, 0xb6, 0x25, 0x24, 0xf0, 0x8e,
+ 0x2e, 0xb4, 0x52, 0x3e, 0xe1, 0x0e, 0xc1, 0xa4, 0x67, 0xea, 0xfe, 0xe5,
+ 0x93, 0xcc, 0xb9, 0xc4, 0x36, 0x21, 0xcb, 0x54, 0xfa, 0xaf, 0x9d, 0x9c,
+ 0x85, 0x78, 0xcc, 0xe5, 0x88, 0xf3, 0x84, 0x0c, 0x67, 0xdb, 0x26, 0x69,
+ 0x58, 0xca, 0xde, 0x47, 0x34, 0xec, 0xcf, 0x2f, 0xb6, 0x49, 0x59, 0xb5,
+ 0x56, 0xdb, 0x58, 0x45, 0x7b, 0x21, 0x9d, 0x99, 0x0b, 0x5f, 0xde, 0x57,
+ 0x16, 0xa6, 0xab, 0xc8, 0x79, 0x3f, 0x9d, 0x76, 0x89, 0xe2, 0x09, 0xf9,
+ 0x8d, 0xe2, 0x63, 0x37, 0xfc, 0x74, 0xea, 0x73, 0x7e, 0x70, 0xac, 0x15,
+ 0x16, 0xa5, 0xed, 0x88, 0x60, 0x5f, 0x33, 0xed, 0x94, 0x9e, 0x0a, 0x05,
+ 0xde, 0xc7, 0x85, 0xc3, 0xc1, 0x7a, 0x54, 0xfb, 0x4e, 0xcb, 0xcb, 0xe8,
+ 0x5e, 0x44, 0x7c, 0x39, 0xdb, 0x2d, 0xb2, 0xb7, 0x6c, 0xce, 0xca, 0x2f,
+ 0x63, 0x9d, 0x16, 0x4e, 0xa6, 0xe5, 0xef, 0xd6, 0xcf, 0x02, 0x03, 0x01,
+ 0x00, 0x01, 0xa3, 0x66, 0x30, 0x64, 0x30, 0x62, 0x06, 0x03, 0x55, 0x1d,
+ 0x01, 0x04, 0x5b, 0x30, 0x59, 0x80, 0x10, 0x56, 0xb0, 0x8b, 0x2a, 0xa7,
+ 0xfe, 0xcc, 0xf1, 0x0c, 0xed, 0x87, 0x62, 0xdc, 0xd5, 0x1d, 0xc3, 0xa1,
+ 0x33, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x13, 0x26, 0x41, 0x53, 0x55, 0x53, 0x54, 0x65, 0x4b, 0x20, 0x4d, 0x6f,
+ 0x74, 0x68, 0x65, 0x72, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x53, 0x57,
+ 0x20, 0x4b, 0x65, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x74, 0x65, 0x82, 0x10, 0xda, 0x83, 0xb9, 0x90, 0x42, 0x2e,
+ 0xbc, 0x8c, 0x44, 0x1f, 0x8d, 0x8b, 0x03, 0x9a, 0x65, 0xa2, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
+ 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x02, 0xcf, 0x52, 0x6f, 0x0b, 0x91,
+ 0xeb, 0xe4, 0x3b, 0xb2, 0x70, 0x0c, 0x07, 0x2d, 0x79, 0x80, 0x01, 0x9e,
+ 0x4b, 0x4d, 0x92, 0xbb, 0xdc, 0x9e, 0xe5, 0xe5, 0x31, 0x85, 0xe3, 0x9a,
+ 0x75, 0xed, 0xca, 0xde, 0x8c, 0xee, 0x28, 0x34, 0x01, 0x83, 0x14, 0x47,
+ 0x9e, 0x3a, 0xd4, 0x43, 0x5b, 0x2c, 0xc4, 0x41, 0xc8, 0x40, 0x7d, 0xb5,
+ 0x08, 0x76, 0x86, 0x80, 0x2b, 0xa8, 0x00, 0x9f, 0xb7, 0xd3, 0xb1, 0xe6,
+ 0x60, 0x5c, 0x32, 0xb0, 0xa0, 0x01, 0x0f, 0xba, 0x36, 0x8b, 0xb7, 0xb5,
+ 0x4e, 0x87, 0xd5, 0xb7, 0x0a, 0x2c, 0xbd, 0xbc, 0x6a, 0x43, 0x3c, 0xee,
+ 0x76, 0x7c, 0x76, 0x20, 0xed, 0x39, 0x91, 0xa8, 0xbf, 0x70, 0x1e, 0xd6,
+ 0xa8, 0x1a, 0x3e, 0x81, 0x36, 0x6b, 0x7d, 0x1d, 0x8d, 0xf6, 0xf8, 0xaf,
+ 0x5b, 0x38, 0x53, 0x6a, 0x04, 0x0d, 0x7e, 0xae, 0x4d, 0xee, 0xab, 0x02,
+ 0xd4, 0xa4, 0xa2, 0xa9, 0xcf, 0xb6, 0xe3, 0x66, 0xa3, 0xca, 0x4d, 0x5d,
+ 0xd4, 0x18, 0x61, 0x4d, 0xda, 0x83, 0x28, 0x4e, 0xaa, 0x2a, 0xaf, 0xda,
+ 0xeb, 0xdf, 0x2a, 0x20, 0xbd, 0x78, 0x80, 0xef, 0xd1, 0xb0, 0xdd, 0x9b,
+ 0x77, 0xdb, 0xc9, 0x25, 0x39, 0x4b, 0xcf, 0xa2, 0x86, 0x1a, 0xac, 0xcc,
+ 0x32, 0xe7, 0x87, 0xd4, 0x59, 0xb2, 0x03, 0xc4, 0x69, 0x02, 0x8f, 0x17,
+ 0xc9, 0xde, 0x52, 0xcb, 0xe7, 0xab, 0xb8, 0x35, 0xc5, 0xf8, 0x33, 0x06,
+ 0x03, 0x93, 0x52, 0xcf, 0xb3, 0x68, 0xd2, 0xb3, 0x5c, 0x1c, 0xe8, 0x19,
+ 0xfe, 0x75, 0x26, 0xed, 0xd1, 0x65, 0x72, 0x13, 0x4d, 0x69, 0x34, 0x5a,
+ 0x9b, 0x0c, 0xb4, 0xe3, 0x56, 0x53, 0x3c, 0xb4, 0x67, 0x27, 0xf8, 0xfa,
+ 0xd3, 0x20, 0xda, 0x37, 0x58, 0xf6, 0xad, 0xe2, 0x82, 0x59, 0xa2, 0xb8,
+ 0x22, 0x2f, 0x9e, 0x56, 0xfe, 0xbc, 0x17, 0x49, 0x1d, 0xaf, 0xa1, 0x59,
+ 0xc0, 0xa5, 0xe4, 0x94, 0xa7, 0x4a, 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b,
+ 0xf0, 0x72, 0x79, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x03,
+ 0x00, 0x00, 0x91, 0x30, 0x05, 0x3b, 0x9f, 0x6c, 0xcc, 0x04, 0xb1, 0xac,
+ 0xe2, 0xa5, 0x1e, 0x3b, 0xe5, 0xf5, 0x30, 0x82, 0x03, 0x49, 0x30, 0x82,
+ 0x02, 0x31, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0xb8, 0xe5, 0x81,
+ 0xe4, 0xdf, 0x77, 0xa5, 0xbb, 0x42, 0x82, 0xd5, 0xcc, 0xfc, 0x00, 0xc0,
+ 0x71, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
+ 0x01, 0x0b, 0x05, 0x00, 0x30, 0x2e, 0x31, 0x2c, 0x30, 0x2a, 0x06, 0x03,
+ 0x55, 0x04, 0x03, 0x13, 0x23, 0x41, 0x53, 0x55, 0x53, 0x54, 0x65, 0x4b,
+ 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x20, 0x53, 0x57,
+ 0x20, 0x4b, 0x65, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x74, 0x65, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x31, 0x32,
+ 0x32, 0x37, 0x30, 0x30, 0x31, 0x38, 0x35, 0x33, 0x5a, 0x17, 0x0d, 0x33,
+ 0x31, 0x31, 0x32, 0x32, 0x37, 0x30, 0x30, 0x31, 0x38, 0x35, 0x32, 0x5a,
+ 0x30, 0x2e, 0x31, 0x2c, 0x30, 0x2a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
+ 0x23, 0x41, 0x53, 0x55, 0x53, 0x54, 0x65, 0x4b, 0x20, 0x4e, 0x6f, 0x74,
+ 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x20, 0x53, 0x57, 0x20, 0x4b, 0x65, 0x79,
+ 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
+ 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,
+ 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x9e, 0x61, 0xfa,
+ 0x74, 0x2c, 0x2a, 0x88, 0x17, 0xc4, 0xbd, 0x77, 0x19, 0x0d, 0xb3, 0x33,
+ 0x27, 0x0c, 0x0e, 0x94, 0xec, 0xb0, 0x8b, 0x71, 0xb3, 0x08, 0x77, 0xb7,
+ 0xd2, 0x08, 0x9d, 0x32, 0x4f, 0x5c, 0xf7, 0x0c, 0xcf, 0xe0, 0x29, 0x53,
+ 0x56, 0xed, 0x24, 0x91, 0xd8, 0xbd, 0x53, 0x2a, 0x89, 0x89, 0x8c, 0x74,
+ 0x28, 0xab, 0x16, 0x2d, 0x4f, 0x9b, 0x65, 0xfc, 0x63, 0x7d, 0xed, 0x23,
+ 0xb6, 0x97, 0x5c, 0x6d, 0x04, 0xe4, 0x15, 0x7f, 0xdc, 0xf8, 0xba, 0x6b,
+ 0x08, 0xcc, 0xc9, 0x21, 0xe9, 0xb5, 0xde, 0x8e, 0x03, 0x28, 0x12, 0x63,
+ 0xf0, 0x6a, 0xb6, 0xe5, 0xdf, 0x1d, 0x72, 0x28, 0xcc, 0x64, 0xd6, 0x63,
+ 0x66, 0x2f, 0x04, 0x52, 0x6a, 0x1d, 0x25, 0x7d, 0xc7, 0xbd, 0xe0, 0x78,
+ 0xfb, 0x0c, 0xb7, 0x37, 0xe5, 0xae, 0xf7, 0x0d, 0xd6, 0xb5, 0xb4, 0xbf,
+ 0xf5, 0xf1, 0xc6, 0x82, 0x56, 0x78, 0x5c, 0xa8, 0xf3, 0x53, 0x2e, 0xf5,
+ 0xec, 0x15, 0x3f, 0x12, 0x62, 0x2f, 0xeb, 0xb6, 0x79, 0x79, 0x86, 0xac,
+ 0x76, 0xff, 0xb6, 0x66, 0x45, 0xf5, 0x33, 0xda, 0xdd, 0x25, 0xd6, 0xa7,
+ 0xbf, 0xf8, 0xd9, 0xdb, 0xd3, 0xf1, 0xfa, 0xce, 0x0e, 0x22, 0x30, 0xd7,
+ 0xd4, 0x80, 0x02, 0xbd, 0xd3, 0x2c, 0x1e, 0xec, 0x46, 0x2e, 0x2f, 0xca,
+ 0x0f, 0x7a, 0xfa, 0xb9, 0x5c, 0xff, 0x2b, 0x16, 0xc6, 0x6a, 0x6b, 0x8d,
+ 0x94, 0x64, 0x92, 0x7e, 0xf9, 0x55, 0xee, 0x96, 0x00, 0x4d, 0x04, 0x2e,
+ 0x4b, 0x15, 0xed, 0xf1, 0x08, 0x49, 0x6a, 0x07, 0x86, 0x69, 0xc8, 0xc5,
+ 0x64, 0xfa, 0xad, 0x2c, 0x4f, 0x02, 0x50, 0xe4, 0x1f, 0x83, 0xc7, 0x2f,
+ 0x19, 0x9f, 0xe8, 0xa5, 0x62, 0xd9, 0x51, 0x32, 0x18, 0xb6, 0x83, 0xca,
+ 0x08, 0x0a, 0xa1, 0xab, 0xa7, 0x65, 0x70, 0x9c, 0x1e, 0x48, 0xc3, 0x0f,
+ 0x49, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x5f,
+ 0x06, 0x03, 0x55, 0x1d, 0x01, 0x04, 0x58, 0x30, 0x56, 0x80, 0x10, 0x00,
+ 0x65, 0x11, 0xe3, 0xca, 0x0f, 0x96, 0xe8, 0x8d, 0x5b, 0x04, 0xa4, 0xe7,
+ 0xfe, 0xce, 0xaa, 0xa1, 0x30, 0x30, 0x2e, 0x31, 0x2c, 0x30, 0x2a, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x13, 0x23, 0x41, 0x53, 0x55, 0x53, 0x54, 0x65,
+ 0x4b, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x20, 0x53,
+ 0x57, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,
+ 0x69, 0x63, 0x61, 0x74, 0x65, 0x82, 0x10, 0xb8, 0xe5, 0x81, 0xe4, 0xdf,
+ 0x77, 0xa5, 0xbb, 0x42, 0x82, 0xd5, 0xcc, 0xfc, 0x00, 0xc0, 0x71, 0x30,
+ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
+ 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x31, 0x18, 0xf4, 0xee, 0xe3,
+ 0x72, 0xba, 0xbe, 0x33, 0x44, 0x61, 0x74, 0x19, 0x1f, 0x66, 0xac, 0x5c,
+ 0xfd, 0x1d, 0x9a, 0x26, 0x75, 0xd0, 0x14, 0xcd, 0x68, 0x38, 0xb3, 0xa8,
+ 0x3f, 0x4f, 0xb4, 0x4a, 0xe9, 0x1e, 0x21, 0xf2, 0xc9, 0xee, 0x37, 0x96,
+ 0x26, 0xbe, 0x1d, 0x58, 0x9b, 0xad, 0x21, 0xce, 0x58, 0x79, 0x53, 0xd3,
+ 0xff, 0x38, 0xef, 0x8f, 0x22, 0xcd, 0x90, 0x0e, 0xc6, 0x32, 0x21, 0x75,
+ 0x9b, 0x5a, 0xab, 0xaf, 0x08, 0xff, 0x05, 0xcd, 0x2b, 0xf8, 0x8c, 0xe7,
+ 0x97, 0x47, 0xbb, 0x78, 0xe4, 0x5f, 0x56, 0x47, 0xd2, 0xbc, 0xc8, 0xa5,
+ 0x95, 0xcb, 0x76, 0x89, 0x5c, 0x65, 0x24, 0x02, 0x18, 0x06, 0x9c, 0x12,
+ 0x5f, 0xef, 0xe0, 0x5c, 0x19, 0x45, 0x38, 0x96, 0xdf, 0x7a, 0x60, 0x5d,
+ 0x61, 0xba, 0x4d, 0xc8, 0x7b, 0x6e, 0x8d, 0x8c, 0x6e, 0x1d, 0xa9, 0xe5,
+ 0x92, 0x35, 0xa2, 0x4f, 0x36, 0xd3, 0x40, 0xad, 0xd7, 0x40, 0x12, 0xab,
+ 0x6c, 0x48, 0x8d, 0x18, 0x92, 0xe4, 0x00, 0x52, 0x03, 0xdf, 0x14, 0xac,
+ 0x66, 0x3f, 0x6a, 0xae, 0x42, 0x3a, 0x06, 0x50, 0xaa, 0xa5, 0x0d, 0x40,
+ 0xa7, 0x7b, 0xeb, 0xfd, 0x41, 0x49, 0xff, 0xeb, 0xa3, 0xb4, 0x50, 0x4f,
+ 0xf7, 0x54, 0x13, 0x3b, 0x1f, 0x8e, 0xb4, 0x45, 0x04, 0x20, 0x42, 0x74,
+ 0xfe, 0x78, 0x3d, 0xbe, 0x7c, 0xdb, 0xa7, 0x2a, 0x2a, 0x9d, 0x06, 0x48,
+ 0xc0, 0x9a, 0x02, 0x23, 0xaf, 0xf2, 0x98, 0x07, 0x95, 0xde, 0x3b, 0x30,
+ 0x73, 0xec, 0x3e, 0x73, 0x58, 0x8f, 0x07, 0x53, 0x40, 0x96, 0xd8, 0x24,
+ 0xd9, 0x66, 0x80, 0x7a, 0x75, 0x8d, 0xb7, 0x39, 0x27, 0x10, 0x89, 0x7a,
+ 0xb4, 0x53, 0xbf, 0x3b, 0xc2, 0xe2, 0x97, 0x93, 0x37, 0x8a, 0x9d, 0x4d,
+ 0x23, 0x6e, 0xac, 0xeb, 0x0d, 0x53, 0x21, 0x4d, 0x0b, 0x34, 0x13, 0xa1,
+ 0x59, 0xc0, 0xa5, 0xe4, 0x94, 0xa7, 0x4a, 0x87, 0xb5, 0xab, 0x15, 0x5c,
+ 0x2b, 0xf0, 0x72, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24,
+ 0x06, 0x00, 0x00, 0xbd, 0x9a, 0xfa, 0x77, 0x59, 0x03, 0x32, 0x4d, 0xbd,
+ 0x60, 0x28, 0xf4, 0xe7, 0x8f, 0x78, 0x4b, 0x30, 0x82, 0x06, 0x10, 0x30,
+ 0x82, 0x03, 0xf8, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0a, 0x61, 0x08,
+ 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,
+ 0x81, 0x91, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
+ 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
+ 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e,
+ 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52,
+ 0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03,
+ 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f,
+ 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
+ 0x32, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43,
+ 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54,
+ 0x68, 0x69, 0x72, 0x64, 0x20, 0x50, 0x61, 0x72, 0x74, 0x79, 0x20, 0x4d,
+ 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x52,
+ 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, 0x36, 0x32,
+ 0x37, 0x32, 0x31, 0x32, 0x32, 0x34, 0x35, 0x5a, 0x17, 0x0d, 0x32, 0x36,
+ 0x30, 0x36, 0x32, 0x37, 0x32, 0x31, 0x33, 0x32, 0x34, 0x35, 0x5a, 0x30,
+ 0x81, 0x81, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
+ 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
+ 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e,
+ 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52,
+ 0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03,
+ 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f,
+ 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
+ 0x22, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43,
+ 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55,
+ 0x45, 0x46, 0x49, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30,
+ 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,
+ 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0x08, 0x6c, 0x4c,
+ 0xc7, 0x45, 0x09, 0x6a, 0x4b, 0x0c, 0xa4, 0xc0, 0x87, 0x7f, 0x06, 0x75,
+ 0x0c, 0x43, 0x01, 0x54, 0x64, 0xe0, 0x16, 0x7f, 0x07, 0xed, 0x92, 0x7d,
+ 0x0b, 0xb2, 0x73, 0xbf, 0x0c, 0x0a, 0xc6, 0x4a, 0x45, 0x61, 0xa0, 0xc5,
+ 0x16, 0x2d, 0x96, 0xd3, 0xf5, 0x2b, 0xa0, 0xfb, 0x4d, 0x49, 0x9b, 0x41,
+ 0x80, 0x90, 0x3c, 0xb9, 0x54, 0xfd, 0xe6, 0xbc, 0xd1, 0x9d, 0xc4, 0xa4,
+ 0x18, 0x8a, 0x7f, 0x41, 0x8a, 0x5c, 0x59, 0x83, 0x68, 0x32, 0xbb, 0x8c,
+ 0x47, 0xc9, 0xee, 0x71, 0xbc, 0x21, 0x4f, 0x9a, 0x8a, 0x7c, 0xff, 0x44,
+ 0x3f, 0x8d, 0x8f, 0x32, 0xb2, 0x26, 0x48, 0xae, 0x75, 0xb5, 0xee, 0xc9,
+ 0x4c, 0x1e, 0x4a, 0x19, 0x7e, 0xe4, 0x82, 0x9a, 0x1d, 0x78, 0x77, 0x4d,
+ 0x0c, 0xb0, 0xbd, 0xf6, 0x0f, 0xd3, 0x16, 0xd3, 0xbc, 0xfa, 0x2b, 0xa5,
+ 0x51, 0x38, 0x5d, 0xf5, 0xfb, 0xba, 0xdb, 0x78, 0x02, 0xdb, 0xff, 0xec,
+ 0x0a, 0x1b, 0x96, 0xd5, 0x83, 0xb8, 0x19, 0x13, 0xe9, 0xb6, 0xc0, 0x7b,
+ 0x40, 0x7b, 0xe1, 0x1f, 0x28, 0x27, 0xc9, 0xfa, 0xef, 0x56, 0x5e, 0x1c,
+ 0xe6, 0x7e, 0x94, 0x7e, 0xc0, 0xf0, 0x44, 0xb2, 0x79, 0x39, 0xe5, 0xda,
+ 0xb2, 0x62, 0x8b, 0x4d, 0xbf, 0x38, 0x70, 0xe2, 0x68, 0x24, 0x14, 0xc9,
+ 0x33, 0xa4, 0x08, 0x37, 0xd5, 0x58, 0x69, 0x5e, 0xd3, 0x7c, 0xed, 0xc1,
+ 0x04, 0x53, 0x08, 0xe7, 0x4e, 0xb0, 0x2a, 0x87, 0x63, 0x08, 0x61, 0x6f,
+ 0x63, 0x15, 0x59, 0xea, 0xb2, 0x2b, 0x79, 0xd7, 0x0c, 0x61, 0x67, 0x8a,
+ 0x5b, 0xfd, 0x5e, 0xad, 0x87, 0x7f, 0xba, 0x86, 0x67, 0x4f, 0x71, 0x58,
+ 0x12, 0x22, 0x04, 0x22, 0x22, 0xce, 0x8b, 0xef, 0x54, 0x71, 0x00, 0xce,
+ 0x50, 0x35, 0x58, 0x76, 0x95, 0x08, 0xee, 0x6a, 0xb1, 0xa2, 0x01, 0xd5,
+ 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x76, 0x30, 0x82, 0x01,
+ 0x72, 0x30, 0x12, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37,
+ 0x15, 0x01, 0x04, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x23, 0x06,
+ 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x02, 0x04, 0x16,
+ 0x04, 0x14, 0xf8, 0xc1, 0x6b, 0xb7, 0x7f, 0x77, 0x53, 0x4a, 0xf3, 0x25,
+ 0x37, 0x1d, 0x4e, 0xa1, 0x26, 0x7b, 0x0f, 0x20, 0x70, 0x80, 0x30, 0x1d,
+ 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x13, 0xad, 0xbf,
+ 0x43, 0x09, 0xbd, 0x82, 0x70, 0x9c, 0x8c, 0xd5, 0x4f, 0x31, 0x6e, 0xd5,
+ 0x22, 0x98, 0x8a, 0x1b, 0xd4, 0x30, 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01,
+ 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53,
+ 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03,
+ 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06,
+ 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,
+ 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30,
+ 0x16, 0x80, 0x14, 0x45, 0x66, 0x52, 0x43, 0xe1, 0x7e, 0x58, 0x11, 0xbf,
+ 0xd6, 0x4e, 0x9e, 0x23, 0x55, 0x08, 0x3b, 0x3a, 0x22, 0x6a, 0xa8, 0x30,
+ 0x5c, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x55, 0x30, 0x53, 0x30, 0x51,
+ 0xa0, 0x4f, 0xa0, 0x4d, 0x86, 0x4b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f,
+ 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63,
+ 0x72, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f,
+ 0x4d, 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, 0x61, 0x72,
+ 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d,
+ 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x60, 0x06,
+ 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x54, 0x30,
+ 0x52, 0x30, 0x50, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30,
+ 0x02, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e,
+ 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, 0x72, 0x74,
+ 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50,
+ 0x61, 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31,
+ 0x30, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x74, 0x30,
+ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
+ 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x35, 0x08, 0x42, 0xff, 0x30,
+ 0xcc, 0xce, 0xf7, 0x76, 0x0c, 0xad, 0x10, 0x68, 0x58, 0x35, 0x29, 0x46,
+ 0x32, 0x76, 0x27, 0x7c, 0xef, 0x12, 0x41, 0x27, 0x42, 0x1b, 0x4a, 0xaa,
+ 0x6d, 0x81, 0x38, 0x48, 0x59, 0x13, 0x55, 0xf3, 0xe9, 0x58, 0x34, 0xa6,
+ 0x16, 0x0b, 0x82, 0xaa, 0x5d, 0xad, 0x82, 0xda, 0x80, 0x83, 0x41, 0x06,
+ 0x8f, 0xb4, 0x1d, 0xf2, 0x03, 0xb9, 0xf3, 0x1a, 0x5d, 0x1b, 0xf1, 0x50,
+ 0x90, 0xf9, 0xb3, 0x55, 0x84, 0x42, 0x28, 0x1c, 0x20, 0xbd, 0xb2, 0xae,
+ 0x51, 0x14, 0xc5, 0xc0, 0xac, 0x97, 0x95, 0x21, 0x1c, 0x90, 0xdb, 0x0f,
+ 0xfc, 0x77, 0x9e, 0x95, 0x73, 0x91, 0x88, 0xca, 0xbd, 0xbd, 0x52, 0xb9,
+ 0x05, 0x50, 0x0d, 0xdf, 0x57, 0x9e, 0xa0, 0x61, 0xed, 0x0d, 0xe5, 0x6d,
+ 0x25, 0xd9, 0x40, 0x0f, 0x17, 0x40, 0xc8, 0xce, 0xa3, 0x4a, 0xc2, 0x4d,
+ 0xaf, 0x9a, 0x12, 0x1d, 0x08, 0x54, 0x8f, 0xbd, 0xc7, 0xbc, 0xb9, 0x2b,
+ 0x3d, 0x49, 0x2b, 0x1f, 0x32, 0xfc, 0x6a, 0x21, 0x69, 0x4f, 0x9b, 0xc8,
+ 0x7e, 0x42, 0x34, 0xfc, 0x36, 0x06, 0x17, 0x8b, 0x8f, 0x20, 0x40, 0xc0,
+ 0xb3, 0x9a, 0x25, 0x75, 0x27, 0xcd, 0xc9, 0x03, 0xa3, 0xf6, 0x5d, 0xd1,
+ 0xe7, 0x36, 0x54, 0x7a, 0xb9, 0x50, 0xb5, 0xd3, 0x12, 0xd1, 0x07, 0xbf,
+ 0xbb, 0x74, 0xdf, 0xdc, 0x1e, 0x8f, 0x80, 0xd5, 0xed, 0x18, 0xf4, 0x2f,
+ 0x14, 0x16, 0x6b, 0x2f, 0xde, 0x66, 0x8c, 0xb0, 0x23, 0xe5, 0xc7, 0x84,
+ 0xd8, 0xed, 0xea, 0xc1, 0x33, 0x82, 0xad, 0x56, 0x4b, 0x18, 0x2d, 0xf1,
+ 0x68, 0x95, 0x07, 0xcd, 0xcf, 0xf0, 0x72, 0xf0, 0xae, 0xbb, 0xdd, 0x86,
+ 0x85, 0x98, 0x2c, 0x21, 0x4c, 0x33, 0x2b, 0xf0, 0x0f, 0x4a, 0xf0, 0x68,
+ 0x87, 0xb5, 0x92, 0x55, 0x32, 0x75, 0xa1, 0x6a, 0x82, 0x6a, 0x3c, 0xa3,
+ 0x25, 0x11, 0xa4, 0xed, 0xad, 0xd7, 0x04, 0xae, 0xcb, 0xd8, 0x40, 0x59,
+ 0xa0, 0x84, 0xd1, 0x95, 0x4c, 0x62, 0x91, 0x22, 0x1a, 0x74, 0x1d, 0x8c,
+ 0x3d, 0x47, 0x0e, 0x44, 0xa6, 0xe4, 0xb0, 0x9b, 0x34, 0x35, 0xb1, 0xfa,
+ 0xb6, 0x53, 0xa8, 0x2c, 0x81, 0xec, 0xa4, 0x05, 0x71, 0xc8, 0x9d, 0xb8,
+ 0xba, 0xe8, 0x1b, 0x44, 0x66, 0xe4, 0x47, 0x54, 0x0e, 0x8e, 0x56, 0x7f,
+ 0xb3, 0x9f, 0x16, 0x98, 0xb2, 0x86, 0xd0, 0x68, 0x3e, 0x90, 0x23, 0xb5,
+ 0x2f, 0x5e, 0x8f, 0x50, 0x85, 0x8d, 0xc6, 0x8d, 0x82, 0x5f, 0x41, 0xa1,
+ 0xf4, 0x2e, 0x0d, 0xe0, 0x99, 0xd2, 0x6c, 0x75, 0xe4, 0xb6, 0x69, 0xb5,
+ 0x21, 0x86, 0xfa, 0x07, 0xd1, 0xf6, 0xe2, 0x4d, 0xd1, 0xda, 0xad, 0x2c,
+ 0x77, 0x53, 0x1e, 0x25, 0x32, 0x37, 0xc7, 0x6c, 0x52, 0x72, 0x95, 0x86,
+ 0xb0, 0xf1, 0x35, 0x61, 0x6a, 0x19, 0xf5, 0xb2, 0x3b, 0x81, 0x50, 0x56,
+ 0xa6, 0x32, 0x2d, 0xfe, 0xa2, 0x89, 0xf9, 0x42, 0x86, 0x27, 0x18, 0x55,
+ 0xa1, 0x82, 0xca, 0x5a, 0x9b, 0xf8, 0x30, 0x98, 0x54, 0x14, 0xa6, 0x47,
+ 0x96, 0x25, 0x2f, 0xc8, 0x26, 0xe4, 0x41, 0x94, 0x1a, 0x5c, 0x02, 0x3f,
+ 0xe5, 0x96, 0xe3, 0x85, 0x5b, 0x3c, 0x3e, 0x3f, 0xbb, 0x47, 0x16, 0x72,
+ 0x55, 0xe2, 0x25, 0x22, 0xb1, 0xd9, 0x7b, 0xe7, 0x03, 0x06, 0x2a, 0xa3,
+ 0xf7, 0x1e, 0x90, 0x46, 0xc3, 0x00, 0x0d, 0xd6, 0x19, 0x89, 0xe3, 0x0e,
+ 0x35, 0x27, 0x62, 0x03, 0x71, 0x15, 0xa6, 0xef, 0xd0, 0x27, 0xa0, 0xa0,
+ 0x59, 0x37, 0x60, 0xf8, 0x38, 0x94, 0xb8, 0xe0, 0x78, 0x70, 0xf8, 0xba,
+ 0x4c, 0x86, 0x87, 0x94, 0xf6, 0xe0, 0xae, 0x02, 0x45, 0xee, 0x65, 0xc2,
+ 0xb6, 0xa3, 0x7e, 0x69, 0x16, 0x75, 0x07, 0x92, 0x9b, 0xf5, 0xa6, 0xbc,
+ 0x59, 0x83, 0x58, 0xa1, 0x59, 0xc0, 0xa5, 0xe4, 0x94, 0xa7, 0x4a, 0x87,
+ 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72, 0x07, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xeb, 0x05, 0x00, 0x00, 0xbd, 0x9a, 0xfa, 0x77, 0x59,
+ 0x03, 0x32, 0x4d, 0xbd, 0x60, 0x28, 0xf4, 0xe7, 0x8f, 0x78, 0x4b, 0x30,
+ 0x82, 0x05, 0xd7, 0x30, 0x82, 0x03, 0xbf, 0xa0, 0x03, 0x02, 0x01, 0x02,
+ 0x02, 0x0a, 0x61, 0x07, 0x76, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x0b, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
+ 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06,
+ 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e,
+ 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04,
+ 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e,
+ 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63,
+ 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03,
+ 0x55, 0x04, 0x03, 0x13, 0x29, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f,
+ 0x66, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68,
+ 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x30, 0x30, 0x1e,
+ 0x17, 0x0d, 0x31, 0x31, 0x31, 0x30, 0x31, 0x39, 0x31, 0x38, 0x34, 0x31,
+ 0x34, 0x32, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x30, 0x31, 0x39, 0x31,
+ 0x38, 0x35, 0x31, 0x34, 0x32, 0x5a, 0x30, 0x81, 0x84, 0x31, 0x0b, 0x30,
+ 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13,
+ 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73,
+ 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06,
+ 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f, 0x6e,
+ 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15,
+ 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f,
+ 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x2e, 0x30,
+ 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x4d, 0x69, 0x63, 0x72,
+ 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77,
+ 0x73, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x20, 0x50, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, 0x82, 0x01,
+ 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
+ 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,
+ 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xdd, 0x0c, 0xbb, 0xa2, 0xe4, 0x2e,
+ 0x09, 0xe3, 0xe7, 0xc5, 0xf7, 0x96, 0x69, 0xbc, 0x00, 0x21, 0xbd, 0x69,
+ 0x33, 0x33, 0xef, 0xad, 0x04, 0xcb, 0x54, 0x80, 0xee, 0x06, 0x83, 0xbb,
+ 0xc5, 0x20, 0x84, 0xd9, 0xf7, 0xd2, 0x8b, 0xf3, 0x38, 0xb0, 0xab, 0xa4,
+ 0xad, 0x2d, 0x7c, 0x62, 0x79, 0x05, 0xff, 0xe3, 0x4a, 0x3f, 0x04, 0x35,
+ 0x20, 0x70, 0xe3, 0xc4, 0xe7, 0x6b, 0xe0, 0x9c, 0xc0, 0x36, 0x75, 0xe9,
+ 0x8a, 0x31, 0xdd, 0x8d, 0x70, 0xe5, 0xdc, 0x37, 0xb5, 0x74, 0x46, 0x96,
+ 0x28, 0x5b, 0x87, 0x60, 0x23, 0x2c, 0xbf, 0xdc, 0x47, 0xa5, 0x67, 0xf7,
+ 0x51, 0x27, 0x9e, 0x72, 0xeb, 0x07, 0xa6, 0xc9, 0xb9, 0x1e, 0x3b, 0x53,
+ 0x35, 0x7c, 0xe5, 0xd3, 0xec, 0x27, 0xb9, 0x87, 0x1c, 0xfe, 0xb9, 0xc9,
+ 0x23, 0x09, 0x6f, 0xa8, 0x46, 0x91, 0xc1, 0x6e, 0x96, 0x3c, 0x41, 0xd3,
+ 0xcb, 0xa3, 0x3f, 0x5d, 0x02, 0x6a, 0x4d, 0xec, 0x69, 0x1f, 0x25, 0x28,
+ 0x5c, 0x36, 0xff, 0xfd, 0x43, 0x15, 0x0a, 0x94, 0xe0, 0x19, 0xb4, 0xcf,
+ 0xdf, 0xc2, 0x12, 0xe2, 0xc2, 0x5b, 0x27, 0xee, 0x27, 0x78, 0x30, 0x8b,
+ 0x5b, 0x2a, 0x09, 0x6b, 0x22, 0x89, 0x53, 0x60, 0x16, 0x2c, 0xc0, 0x68,
+ 0x1d, 0x53, 0xba, 0xec, 0x49, 0xf3, 0x9d, 0x61, 0x8c, 0x85, 0x68, 0x09,
+ 0x73, 0x44, 0x5d, 0x7d, 0xa2, 0x54, 0x2b, 0xdd, 0x79, 0xf7, 0x15, 0xcf,
+ 0x35, 0x5d, 0x6c, 0x1c, 0x2b, 0x5c, 0xce, 0xbc, 0x9c, 0x23, 0x8b, 0x6f,
+ 0x6e, 0xb5, 0x26, 0xd9, 0x36, 0x13, 0xc3, 0x4f, 0xd6, 0x27, 0xae, 0xb9,
+ 0x32, 0x3b, 0x41, 0x92, 0x2c, 0xe1, 0xc7, 0xcd, 0x77, 0xe8, 0xaa, 0x54,
+ 0x4e, 0xf7, 0x5c, 0x0b, 0x04, 0x87, 0x65, 0xb4, 0x43, 0x18, 0xa8, 0xb2,
+ 0xe0, 0x6d, 0x19, 0x77, 0xec, 0x5a, 0x24, 0xfa, 0x48, 0x03, 0x02, 0x03,
+ 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x43, 0x30, 0x82, 0x01, 0x3f, 0x30,
+ 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01,
+ 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,
+ 0x04, 0x16, 0x04, 0x14, 0xa9, 0x29, 0x02, 0x39, 0x8e, 0x16, 0xc4, 0x97,
+ 0x78, 0xcd, 0x90, 0xf9, 0x9e, 0x4f, 0x9a, 0xe1, 0x7c, 0x55, 0xaf, 0x53,
+ 0x30, 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14,
+ 0x02, 0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00,
+ 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04,
+ 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,
+ 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06,
+ 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xd5, 0xf6,
+ 0x56, 0xcb, 0x8f, 0xe8, 0xa2, 0x5c, 0x62, 0x68, 0xd1, 0x3d, 0x94, 0x90,
+ 0x5b, 0xd7, 0xce, 0x9a, 0x18, 0xc4, 0x30, 0x56, 0x06, 0x03, 0x55, 0x1d,
+ 0x1f, 0x04, 0x4f, 0x30, 0x4d, 0x30, 0x4b, 0xa0, 0x49, 0xa0, 0x47, 0x86,
+ 0x45, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e,
+ 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x52, 0x6f,
+ 0x6f, 0x43, 0x65, 0x72, 0x41, 0x75, 0x74, 0x5f, 0x32, 0x30, 0x31, 0x30,
+ 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x33, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x5a,
+ 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x4e,
+ 0x30, 0x4c, 0x30, 0x4a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
+ 0x30, 0x02, 0x86, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, 0x72,
+ 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x52, 0x6f, 0x6f, 0x43, 0x65, 0x72,
+ 0x41, 0x75, 0x74, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x30, 0x36, 0x2d,
+ 0x32, 0x33, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02,
+ 0x01, 0x00, 0x14, 0xfc, 0x7c, 0x71, 0x51, 0xa5, 0x79, 0xc2, 0x6e, 0xb2,
+ 0xef, 0x39, 0x3e, 0xbc, 0x3c, 0x52, 0x0f, 0x6e, 0x2b, 0x3f, 0x10, 0x13,
+ 0x73, 0xfe, 0xa8, 0x68, 0xd0, 0x48, 0xa6, 0x34, 0x4d, 0x8a, 0x96, 0x05,
+ 0x26, 0xee, 0x31, 0x46, 0x90, 0x61, 0x79, 0xd6, 0xff, 0x38, 0x2e, 0x45,
+ 0x6b, 0xf4, 0xc0, 0xe5, 0x28, 0xb8, 0xda, 0x1d, 0x8f, 0x8a, 0xdb, 0x09,
+ 0xd7, 0x1a, 0xc7, 0x4c, 0x0a, 0x36, 0x66, 0x6a, 0x8c, 0xec, 0x1b, 0xd7,
+ 0x04, 0x90, 0xa8, 0x18, 0x17, 0xa4, 0x9b, 0xb9, 0xe2, 0x40, 0x32, 0x36,
+ 0x76, 0xc4, 0xc1, 0x5a, 0xc6, 0xbf, 0xe4, 0x04, 0xc0, 0xea, 0x16, 0xd3,
+ 0xac, 0xc3, 0x68, 0xef, 0x62, 0xac, 0xdd, 0x54, 0x6c, 0x50, 0x30, 0x58,
+ 0xa6, 0xeb, 0x7c, 0xfe, 0x94, 0xa7, 0x4e, 0x8e, 0xf4, 0xec, 0x7c, 0x86,
+ 0x73, 0x57, 0xc2, 0x52, 0x21, 0x73, 0x34, 0x5a, 0xf3, 0xa3, 0x8a, 0x56,
+ 0xc8, 0x04, 0xda, 0x07, 0x09, 0xed, 0xf8, 0x8b, 0xe3, 0xce, 0xf4, 0x7e,
+ 0x8e, 0xae, 0xf0, 0xf6, 0x0b, 0x8a, 0x08, 0xfb, 0x3f, 0xc9, 0x1d, 0x72,
+ 0x7f, 0x53, 0xb8, 0xeb, 0xbe, 0x63, 0xe0, 0xe3, 0x3d, 0x31, 0x65, 0xb0,
+ 0x81, 0xe5, 0xf2, 0xac, 0xcd, 0x16, 0xa4, 0x9f, 0x3d, 0xa8, 0xb1, 0x9b,
+ 0xc2, 0x42, 0xd0, 0x90, 0x84, 0x5f, 0x54, 0x1d, 0xff, 0x89, 0xea, 0xba,
+ 0x1d, 0x47, 0x90, 0x6f, 0xb0, 0x73, 0x4e, 0x41, 0x9f, 0x40, 0x9f, 0x5f,
+ 0xe5, 0xa1, 0x2a, 0xb2, 0x11, 0x91, 0x73, 0x8a, 0x21, 0x28, 0xf0, 0xce,
+ 0xde, 0x73, 0x39, 0x5f, 0x3e, 0xab, 0x5c, 0x60, 0xec, 0xdf, 0x03, 0x10,
+ 0xa8, 0xd3, 0x09, 0xe9, 0xf4, 0xf6, 0x96, 0x85, 0xb6, 0x7f, 0x51, 0x88,
+ 0x66, 0x47, 0x19, 0x8d, 0xa2, 0xb0, 0x12, 0x3d, 0x81, 0x2a, 0x68, 0x05,
+ 0x77, 0xbb, 0x91, 0x4c, 0x62, 0x7b, 0xb6, 0xc1, 0x07, 0xc7, 0xba, 0x7a,
+ 0x87, 0x34, 0x03, 0x0e, 0x4b, 0x62, 0x7a, 0x99, 0xe9, 0xca, 0xfc, 0xce,
+ 0x4a, 0x37, 0xc9, 0x2d, 0xa4, 0x57, 0x7c, 0x1c, 0xfe, 0x3d, 0xdc, 0xb8,
+ 0x0f, 0x5a, 0xfa, 0xd6, 0xc4, 0xb3, 0x02, 0x85, 0x02, 0x3a, 0xea, 0xb3,
+ 0xd9, 0x6e, 0xe4, 0x69, 0x21, 0x37, 0xde, 0x81, 0xd1, 0xf6, 0x75, 0x19,
+ 0x05, 0x67, 0xd3, 0x93, 0x57, 0x5e, 0x29, 0x1b, 0x39, 0xc8, 0xee, 0x2d,
+ 0xe1, 0xcd, 0xe4, 0x45, 0x73, 0x5b, 0xd0, 0xd2, 0xce, 0x7a, 0xab, 0x16,
+ 0x19, 0x82, 0x46, 0x58, 0xd0, 0x5e, 0x9d, 0x81, 0xb3, 0x67, 0xaf, 0x6c,
+ 0x35, 0xf2, 0xbc, 0xe5, 0x3f, 0x24, 0xe2, 0x35, 0xa2, 0x0a, 0x75, 0x06,
+ 0xf6, 0x18, 0x56, 0x99, 0xd4, 0x78, 0x2c, 0xd1, 0x05, 0x1b, 0xeb, 0xd0,
+ 0x88, 0x01, 0x9d, 0xaa, 0x10, 0xf1, 0x05, 0xdf, 0xba, 0x7e, 0x2c, 0x63,
+ 0xb7, 0x06, 0x9b, 0x23, 0x21, 0xc4, 0xf9, 0x78, 0x6c, 0xe2, 0x58, 0x17,
+ 0x06, 0x36, 0x2b, 0x91, 0x12, 0x03, 0xcc, 0xa4, 0xd9, 0xf2, 0x2d, 0xba,
+ 0xf9, 0x94, 0x9d, 0x40, 0xed, 0x18, 0x45, 0xf1, 0xce, 0x8a, 0x5c, 0x6b,
+ 0x3e, 0xab, 0x03, 0xd3, 0x70, 0x18, 0x2a, 0x0a, 0x6a, 0xe0, 0x5f, 0x47,
+ 0xd1, 0xd5, 0x63, 0x0a, 0x32, 0xf2, 0xaf, 0xd7, 0x36, 0x1f, 0x2a, 0x70,
+ 0x5a, 0xe5, 0x42, 0x59, 0x08, 0x71, 0x4b, 0x57, 0xba, 0x7e, 0x83, 0x81,
+ 0xf0, 0x21, 0x3c, 0xf4, 0x1c, 0xc1, 0xc5, 0xb9, 0x90, 0x93, 0x0e, 0x88,
+ 0x45, 0x93, 0x86, 0xe9, 0xb1, 0x20, 0x99, 0xbe, 0x98, 0xcb, 0xc5, 0x95,
+ 0xa4, 0x5d, 0x62, 0xd6, 0xa0, 0x63, 0x08, 0x20, 0xbd, 0x75, 0x10, 0x77,
+ 0x7d, 0x3d, 0xf3, 0x45, 0xb9, 0x9f, 0x97, 0x9f, 0xcb, 0x57, 0x80, 0x6f,
+ 0x33, 0xa9, 0x04, 0xcf, 0x77, 0xa4, 0x62, 0x1c, 0x59, 0x7e, 0xa1, 0x59,
+ 0xc0, 0xa5, 0xe4, 0x94, 0xa7, 0x4a, 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b,
+ 0xf0, 0x72, 0x64, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x04,
+ 0x00, 0x00, 0xe4, 0x0a, 0xc4, 0x6d, 0xe8, 0x2e, 0x4c, 0x9c, 0xa3, 0x14,
+ 0x0f, 0xc7, 0xb2, 0x00, 0x87, 0x10, 0x30, 0x82, 0x04, 0x34, 0x30, 0x82,
+ 0x03, 0x1c, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xb9, 0x41,
+ 0x24, 0xa0, 0x18, 0x2c, 0x92, 0x67, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x84,
+ 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47,
+ 0x42, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0b,
+ 0x49, 0x73, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x61, 0x6e, 0x31,
+ 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x44, 0x6f,
+ 0x75, 0x67, 0x6c, 0x61, 0x73, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55,
+ 0x04, 0x0a, 0x0c, 0x0e, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61,
+ 0x6c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x34, 0x30, 0x32, 0x06, 0x03,
+ 0x55, 0x04, 0x03, 0x0c, 0x2b, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63,
+ 0x61, 0x6c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x20, 0x4d, 0x61, 0x73, 0x74,
+ 0x65, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
+ 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,
+ 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x34, 0x31, 0x32, 0x31, 0x31,
+ 0x31, 0x32, 0x35, 0x31, 0x5a, 0x17, 0x0d, 0x34, 0x32, 0x30, 0x34, 0x31,
+ 0x31, 0x31, 0x31, 0x31, 0x32, 0x35, 0x31, 0x5a, 0x30, 0x81, 0x84, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42,
+ 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0b, 0x49,
+ 0x73, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x61, 0x6e, 0x31, 0x10,
+ 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x44, 0x6f, 0x75,
+ 0x67, 0x6c, 0x61, 0x73, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x0c, 0x0e, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c,
+ 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x34, 0x30, 0x32, 0x06, 0x03, 0x55,
+ 0x04, 0x03, 0x0c, 0x2b, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61,
+ 0x6c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x20, 0x4d, 0x61, 0x73, 0x74, 0x65,
+ 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+ 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30,
+ 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,
+ 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0x5b, 0x3a, 0x16,
+ 0x74, 0xee, 0x21, 0x5d, 0xae, 0x61, 0xed, 0x9d, 0x56, 0xac, 0xbd, 0xde,
+ 0xde, 0x72, 0xf3, 0xdd, 0x7e, 0x2d, 0x4c, 0x62, 0x0f, 0xac, 0xc0, 0x6d,
+ 0x48, 0x08, 0x11, 0xcf, 0x8d, 0x8b, 0xfb, 0x61, 0x1f, 0x27, 0xcc, 0x11,
+ 0x6e, 0xd9, 0x55, 0x3d, 0x39, 0x54, 0xeb, 0x40, 0x3b, 0xb1, 0xbb, 0xe2,
+ 0x85, 0x34, 0x79, 0xca, 0xf7, 0x7b, 0xbf, 0xba, 0x7a, 0xc8, 0x10, 0x2d,
+ 0x19, 0x7d, 0xad, 0x59, 0xcf, 0xa6, 0xd4, 0xe9, 0x4e, 0x0f, 0xda, 0xae,
+ 0x52, 0xea, 0x4c, 0x9e, 0x90, 0xce, 0xc6, 0x99, 0x0d, 0x4e, 0x67, 0x65,
+ 0x78, 0x5d, 0xf9, 0xd1, 0xd5, 0x38, 0x4a, 0x4a, 0x7a, 0x8f, 0x93, 0x9c,
+ 0x7f, 0x1a, 0xa3, 0x85, 0xdb, 0xce, 0xfa, 0x8b, 0xf7, 0xc2, 0xa2, 0x21,
+ 0x2d, 0x9b, 0x54, 0x41, 0x35, 0x10, 0x57, 0x13, 0x8d, 0x6c, 0xbc, 0x29,
+ 0x06, 0x50, 0x4a, 0x7e, 0xea, 0x99, 0xa9, 0x68, 0xa7, 0x3b, 0xc7, 0x07,
+ 0x1b, 0x32, 0x9e, 0xa0, 0x19, 0x87, 0x0e, 0x79, 0xbb, 0x68, 0x99, 0x2d,
+ 0x7e, 0x93, 0x52, 0xe5, 0xf6, 0xeb, 0xc9, 0x9b, 0xf9, 0x2b, 0xed, 0xb8,
+ 0x68, 0x49, 0xbc, 0xd9, 0x95, 0x50, 0x40, 0x5b, 0xc5, 0xb2, 0x71, 0xaa,
+ 0xeb, 0x5c, 0x57, 0xde, 0x71, 0xf9, 0x40, 0x0a, 0xdd, 0x5b, 0xac, 0x1e,
+ 0x84, 0x2d, 0x50, 0x1a, 0x52, 0xd6, 0xe1, 0xf3, 0x6b, 0x6e, 0x90, 0x64,
+ 0x4f, 0x5b, 0xb4, 0xeb, 0x20, 0xe4, 0x61, 0x10, 0xda, 0x5a, 0xf0, 0xea,
+ 0xe4, 0x42, 0xd7, 0x01, 0xc4, 0xfe, 0x21, 0x1f, 0xd9, 0xb9, 0xc0, 0x54,
+ 0x95, 0x42, 0x81, 0x52, 0x72, 0x1f, 0x49, 0x64, 0x7a, 0xc8, 0x6c, 0x24,
+ 0xf1, 0x08, 0x70, 0x0b, 0x4d, 0xa5, 0xa0, 0x32, 0xd1, 0xa0, 0x1c, 0x57,
+ 0xa8, 0x4d, 0xe3, 0xaf, 0xa5, 0x8e, 0x05, 0x05, 0x3e, 0x10, 0x43, 0xa1,
+ 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xa6, 0x30, 0x81, 0xa3, 0x30,
+ 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xad, 0x91,
+ 0x99, 0x0b, 0xc2, 0x2a, 0xb1, 0xf5, 0x17, 0x04, 0x8c, 0x23, 0xb6, 0x65,
+ 0x5a, 0x26, 0x8e, 0x34, 0x5a, 0x63, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d,
+ 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xad, 0x91, 0x99, 0x0b, 0xc2,
+ 0x2a, 0xb1, 0xf5, 0x17, 0x04, 0x8c, 0x23, 0xb6, 0x65, 0x5a, 0x26, 0x8e,
+ 0x34, 0x5a, 0x63, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,
+ 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0b, 0x06, 0x03,
+ 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x43, 0x06,
+ 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x3c, 0x30, 0x3a, 0x30, 0x38, 0xa0, 0x36,
+ 0xa0, 0x34, 0x86, 0x32, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x2d,
+ 0x62, 0x6f, 0x6f, 0x74, 0x2d, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x2d,
+ 0x63, 0x61, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01,
+ 0x01, 0x00, 0x3f, 0x7d, 0xf6, 0x76, 0xa5, 0xb3, 0x83, 0xb4, 0x2b, 0x7a,
+ 0xd0, 0x6d, 0x52, 0x1a, 0x03, 0x83, 0xc4, 0x12, 0xa7, 0x50, 0x9c, 0x47,
+ 0x92, 0xcc, 0xc0, 0x94, 0x77, 0x82, 0xd2, 0xae, 0x57, 0xb3, 0x99, 0x04,
+ 0xf5, 0x32, 0x3a, 0xc6, 0x55, 0x1d, 0x07, 0xdb, 0x12, 0xa9, 0x56, 0xfa,
+ 0xd8, 0xd4, 0x76, 0x20, 0xeb, 0xe4, 0xc3, 0x51, 0xdb, 0x9a, 0x5c, 0x9c,
+ 0x92, 0x3f, 0x18, 0x73, 0xda, 0x94, 0x6a, 0xa1, 0x99, 0x38, 0x8c, 0xa4,
+ 0x88, 0x6d, 0xc1, 0xfc, 0x39, 0x71, 0xd0, 0x74, 0x76, 0x16, 0x03, 0x3e,
+ 0x56, 0x23, 0x35, 0xd5, 0x55, 0x47, 0x5b, 0x1a, 0x1d, 0x41, 0xc2, 0xd3,
+ 0x12, 0x4c, 0xdc, 0xff, 0xae, 0x0a, 0x92, 0x9c, 0x62, 0x0a, 0x17, 0x01,
+ 0x9c, 0x73, 0xe0, 0x5e, 0xb1, 0xfd, 0xbc, 0xd6, 0xb5, 0x19, 0x11, 0x7a,
+ 0x7e, 0xcd, 0x3e, 0x03, 0x7e, 0x66, 0xdb, 0x5b, 0xa8, 0xc9, 0x39, 0x48,
+ 0x51, 0xff, 0x53, 0xe1, 0x9c, 0x31, 0x53, 0x91, 0x1b, 0x3b, 0x10, 0x75,
+ 0x03, 0x17, 0xba, 0xe6, 0x81, 0x02, 0x80, 0x94, 0x70, 0x4c, 0x46, 0xb7,
+ 0x94, 0xb0, 0x3d, 0x15, 0xcd, 0x1f, 0x8e, 0x02, 0xe0, 0x68, 0x02, 0x8f,
+ 0xfb, 0xf9, 0x47, 0x1d, 0x7d, 0xa2, 0x01, 0xc6, 0x07, 0x51, 0xc4, 0x9a,
+ 0xcc, 0xed, 0xdd, 0xcf, 0xa3, 0x5d, 0xed, 0x92, 0xbb, 0xbe, 0xd1, 0xfd,
+ 0xe6, 0xec, 0x1f, 0x33, 0x51, 0x73, 0x04, 0xbe, 0x3c, 0x72, 0xb0, 0x7d,
+ 0x08, 0xf8, 0x01, 0xff, 0x98, 0x7d, 0xcb, 0x9c, 0xe0, 0x69, 0x39, 0x77,
+ 0x25, 0x47, 0x71, 0x88, 0xb1, 0x8d, 0x27, 0xa5, 0x2e, 0xa8, 0xf7, 0x3f,
+ 0x5f, 0x80, 0x69, 0x97, 0x3e, 0xa9, 0xf4, 0x99, 0x14, 0xdb, 0xce, 0x03,
+ 0x0e, 0x0b, 0x66, 0xc4, 0x1c, 0x6d, 0xbd, 0xb8, 0x27, 0x77, 0xc1, 0x42,
+ 0x94, 0xbd, 0xfc, 0x6a, 0x0a, 0xbc, 0x26, 0x16, 0xc4, 0xc1, 0x4c, 0x50,
+ 0x92, 0x40, 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28, 0x0c, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf5, 0x8f, 0xbd, 0xf7, 0x1b, 0xe8, 0xc3, 0x7c, 0xbb, 0xd6,
+ 0x94, 0x4e, 0x47, 0x2c, 0x45, 0x0b, 0x10, 0x43, 0x81, 0x7b, 0x97, 0x29,
+ 0x14, 0x48, 0x7c, 0x22, 0x10, 0x33, 0xf3, 0x07, 0x9e, 0x43, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x97, 0x01, 0x57, 0xde, 0x52, 0xcd, 0xae, 0x14, 0xcf,
+ 0x17, 0xee, 0x36, 0x98, 0x81, 0xd6, 0x24, 0x5b, 0x3a, 0x6a, 0xb6, 0x35,
+ 0x2e, 0xab, 0xae, 0xe5, 0x88, 0xa0, 0x58, 0x4b, 0x03, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0x6b, 0x5f, 0xc3, 0x61, 0x18, 0x3f, 0x58, 0x71, 0x20,
+ 0xe6, 0x02, 0xc0, 0xd6, 0x57, 0x73, 0xaf, 0xdf, 0xe7, 0x86, 0x12, 0x41,
+ 0x84, 0xfa, 0x70, 0x80, 0x52, 0x58, 0xd7, 0x6d, 0x59, 0x4c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7e, 0x02, 0x1f, 0x15, 0xe3, 0xa6, 0x7b, 0x75, 0xac, 0xe8,
+ 0x84, 0x99, 0x9b, 0xed, 0xff, 0xe3, 0x42, 0x13, 0x79, 0x2a, 0x61, 0x1e,
+ 0x40, 0xe5, 0x62, 0xe8, 0x7e, 0x6b, 0x9a, 0x0c, 0xb2, 0x82, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xa5, 0xd1, 0x09, 0xb2, 0xaf, 0xa3, 0xfa, 0x90, 0x87, 0x8f,
+ 0x70, 0x38, 0x2b, 0x23, 0x88, 0xfc, 0xd2, 0xfe, 0xae, 0xae, 0x8a, 0x51,
+ 0xb8, 0x0a, 0xdd, 0x04, 0x8e, 0x9f, 0x87, 0x6b, 0x2a, 0x4e
+};
+
+#endif /* !TEST_DATA_EFIVARS_0_H_ */
+// vim:fenc=utf-8:tw=75:noet
diff --git a/include/test.h b/include/test.h
index fcaa1cdf..5261dbd9 100644
--- a/include/test.h
+++ b/include/test.h
@@ -43,21 +43,27 @@
#include <stdlib.h>
-#define ZeroMem(buf, sz) memset(buf, 0, sz)
-#define SetMem(buf, sz, value) memset(buf, value, sz)
-#define CopyMem(dest, src, len) memcpy(dest, src, len)
-#define CompareMem(dest, src, len) memcmp(dest, src, len)
+#include <assert.h>
+
+#include <efiui.h>
+#include <efilib.h>
+
+#include <efivar/efivar.h>
#include <assert.h>
-#define AllocateZeroPool(x) calloc(1, (x))
-#define AllocatePool(x) malloc(x)
-#define FreePool(x) free(x)
-#define ReallocatePool(old, oldsz, newsz) realloc(old, newsz)
+#include "list.h"
+INTN StrCmp(IN CONST CHAR16 *s1,
+ IN CONST CHAR16 *s2);
INTN StrnCmp(IN CONST CHAR16 *s1,
IN CONST CHAR16 *s2,
IN UINTN len);
+VOID StrCpy(IN CHAR16 *Dest,
+ IN CONST CHAR16 *Src);
+VOID StrnCpy(IN CHAR16 *Dest,
+ IN CONST CHAR16 *Src,
+ IN UINTN Len);
CHAR16 *StrDuplicate(IN CONST CHAR16 *Src);
UINTN StrLen(IN CONST CHAR16 *s1);
UINTN StrSize(IN CONST CHAR16 *s1);
@@ -298,6 +304,108 @@ efi_strerror(EFI_STATUS status)
return out;
}
+static inline char *
+Str2str(CHAR16 *in)
+{
+ static char buf0[1024];
+ static char buf1[1024];
+ char *out;
+ static int n;
+
+ out = n++ % 2 ? buf0 : buf1;
+ if (n > 1)
+ n -= 2;
+ SetMem(out, 1024, 0);
+ for (UINTN i = 0; i < 1023 && in[i]; i++)
+ out[i] = in[i];
+ return out;
+}
+
+static inline char *
+format_var_attrs(UINT32 attr)
+{
+ static char buf0[1024];
+ static char buf1[1024];
+ static int n;
+ int pos = 0;
+ bool found = false;
+ char *buf, *bufp;
+
+ buf = n++ % 2 ? buf0 : buf1;
+ if (n > 1)
+ n -= 2;
+ SetMem(buf, sizeof(buf0), 0);
+ bufp = &buf[0];
+ for (UINT32 i = 0; i < 8; i++) {
+ switch((1ul << i) & attr) {
+ case EFI_VARIABLE_NON_VOLATILE:
+ if (found)
+ bufp = stpcpy(bufp, "|");
+ bufp = stpcpy(bufp, "NV");
+ attr &= ~EFI_VARIABLE_NON_VOLATILE;
+ found = true;
+ break;
+ case EFI_VARIABLE_BOOTSERVICE_ACCESS:
+ if (found)
+ bufp = stpcpy(bufp, "|");
+ bufp = stpcpy(bufp, "BS");
+ attr &= ~EFI_VARIABLE_BOOTSERVICE_ACCESS;
+ found = true;
+ break;
+ case EFI_VARIABLE_RUNTIME_ACCESS:
+ if (found)
+ bufp = stpcpy(bufp, "|");
+ bufp = stpcpy(bufp, "RT");
+ attr &= ~EFI_VARIABLE_RUNTIME_ACCESS;
+ found = true;
+ break;
+ case EFI_VARIABLE_HARDWARE_ERROR_RECORD:
+ if (found)
+ bufp = stpcpy(bufp, "|");
+ bufp = stpcpy(bufp, "HER");
+ attr &= ~EFI_VARIABLE_HARDWARE_ERROR_RECORD;
+ found = true;
+ break;
+ case EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS:
+ if (found)
+ bufp = stpcpy(bufp, "|");
+ bufp = stpcpy(bufp, "AUTH");
+ attr &= ~EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS;
+ found = true;
+ break;
+ case EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS:
+ if (found)
+ bufp = stpcpy(bufp, "|");
+ bufp = stpcpy(bufp, "TIMEAUTH");
+ attr &= ~EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;
+ found = true;
+ break;
+ case EFI_VARIABLE_APPEND_WRITE:
+ if (found)
+ bufp = stpcpy(bufp, "|");
+ bufp = stpcpy(bufp, "APPEND");
+ attr &= ~EFI_VARIABLE_APPEND_WRITE;
+ found = true;
+ break;
+ case EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS:
+ if (found)
+ bufp = stpcpy(bufp, "|");
+ bufp = stpcpy(bufp, "ENHANCED_AUTH");
+ attr &= ~EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS;
+ found = true;
+ break;
+ default:
+ break;
+ }
+ }
+ if (attr) {
+ if (found)
+ bufp = stpcpy(bufp, "|");
+ snprintf(bufp, bufp - buf - 1, "0x%x", attr);
+ }
+ return &buf[0];
+}
+
extern int debug;
#ifdef dprint
#undef dprint
diff --git a/include/test.mk b/include/test.mk
index 86f1a9d8..d362253b 100644
--- a/include/test.mk
+++ b/include/test.mk
@@ -79,6 +79,12 @@ $(patsubst %.c,%.o,$(wildcard test-*.c)) : | test-random.h
test-load-options_FILES = lib/guid.c
test-load-options : CFLAGS+=-DHAVE_SHIM_LOCK_GUID
+test-mock-variables_FILES = mok.c globals.c tpm.c lib/guid.c lib/variables.c mock-variables.c
+test-mock-variables: CFLAGS+=-DHAVE_SHIM_LOCK_GUID
+
+test-mok-mirror_FILES = mok.c globals.c tpm.c lib/guid.c lib/variables.c
+test-mok-mirror: CFLAGS+=-DHAVE_START_IMAGE -DHAVE_SHIM_LOCK_GUID
+
test-sbat_FILES = csv.c lib/variables.c lib/guid.c
test-sbat :: CFLAGS+=-DHAVE_GET_VARIABLE -DHAVE_GET_VARIABLE_ATTR -DHAVE_SHIM_LOCK_GUID
@@ -89,7 +95,7 @@ tests := $(patsubst %.c,%,$(wildcard test-*.c))
$(tests) :: test-% : | libefi-test.a
$(tests) :: test-% : test.c test-%.c $(test-%_FILES)
- $(CC) $(CFLAGS) -o $@ $^ $(wildcard $*.c) $(test-$*_FILES) libefi-test.a -lefivar
+ $(CC) $(CFLAGS) -o $@ $(sort $^ $(wildcard $*.c) $(test-$*_FILES)) libefi-test.a -lefivar
$(VALGRIND) ./$@
test : $(tests)
diff --git a/mock-variables.c b/mock-variables.c
new file mode 100644
index 00000000..d8342d59
--- /dev/null
+++ b/mock-variables.c
@@ -0,0 +1,1022 @@
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+/*
+ * mock-variables.c - a mock GetVariable/SetVariable/GNVN/etc
+ * implementation for testing.
+ * Copyright Peter Jones <pjones@redhat.com>
+ */
+#include "shim.h"
+#include "mock-variables.h"
+
+#include <dirent.h>
+#include <efivar/efivar.h>
+#include <err.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-function"
+
+list_t mock_default_variable_limits;
+list_t *mock_qvi_limits = &mock_default_variable_limits;
+list_t *mock_sv_limits = &mock_default_variable_limits;
+
+list_t mock_variables = LIST_HEAD_INIT(mock_variables);
+
+mock_sort_policy_t mock_variable_sort_policy = MOCK_SORT_APPEND;
+
+static const size_t guidstr_size = sizeof("8be4df61-93ca-11d2-aa0d-00e098032b8c");
+
+static int
+variable_limits_cmp(const struct mock_variable_limits * const v0,
+ const struct mock_variable_limits * const v1)
+{
+ UINT32 mask = EFI_VARIABLE_NON_VOLATILE |
+ EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS;
+
+ return (v0->attrs & mask) - (v1->attrs & mask);
+}
+
+static INT64
+variable_cmp(const struct mock_variable * const v0,
+ const struct mock_variable * const v1)
+{
+ INT64 ret;
+ if (v0 == NULL || v1 == NULL)
+ return (uintptr_t)v0 - (uintptr_t)v1;
+
+ ret = CompareGuid(&v0->guid, &v1->guid);
+ ret <<= 8ul;
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): "GUID_FMT" %s "GUID_FMT" (0x%011"PRIx64" %"PRId64")\n",
+ __FILE__, __LINE__-1, __func__,
+ GUID_ARGS(v0->guid),
+ ret < 0 ? "<" : (ret > 0 ? ">" : "="),
+ GUID_ARGS(v1->guid),
+ (UINT64)ret & 0x1fffffffffful,
+ ret);
+#endif
+ if (ret != 0) {
+ return ret;
+ }
+
+ ret = StrCmp(v0->name, v1->name);
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): \"%s\" %s \"%s\" (0x%02hhx (%d)\n",
+ __FILE__, __LINE__-1, __func__,
+ Str2str(v0->name),
+ ret < 0 ? "<" : (ret > 0 ? ">" : "=="),
+ Str2str(v1->name),
+ ret, ret);
+#endif
+ return ret;
+}
+
+static char *
+list2var(list_t *pos)
+{
+ static char buf0[1024];
+ static char buf1[1024];
+ char *out;
+ static int n;
+ struct mock_variable *var;
+
+ out = n++ % 2 ? buf0 : buf1;
+ if (n > 1)
+ n -= 2;
+ SetMem(out, 1024, 0);
+ if (pos == &mock_variables) {
+ strcpy(out, "list tail");
+ return out;
+ }
+ var = list_entry(pos, struct mock_variable, list);
+ snprintf(out, 1023, GUID_FMT"-%s",
+ GUID_ARGS(var->guid),
+ Str2str(var->name));
+ return out;
+}
+
+EFI_STATUS EFIAPI
+mock_get_variable(CHAR16 *name, EFI_GUID *guid, UINT32 *attrs, UINTN *size,
+ VOID *data)
+{
+ list_t *pos = NULL;
+ struct mock_variable goal = {
+ .name = name,
+ .guid = *guid,
+ };
+ struct mock_variable *result = NULL;
+ EFI_STATUS status;
+
+ if (name == NULL || guid == NULL || size == NULL) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+
+ list_for_each(pos, &mock_variables) {
+ struct mock_variable *var;
+
+ var = list_entry(pos, struct mock_variable, list);
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): varcmp("GUID_FMT"-%s, "GUID_FMT"-%s)\n",
+ __FILE__, __LINE__-1, __func__,
+ GUID_ARGS(goal.guid), Str2str(goal.name),
+ GUID_ARGS(var->guid), Str2str(var->name));
+#endif
+ if (variable_cmp(&goal, var) == 0) {
+ if (attrs != NULL)
+ *attrs = var->attrs;
+ if (var->size > *size) {
+ *size = var->size;
+ status = EFI_BUFFER_TOO_SMALL;
+ return status;
+ }
+ if (data == NULL) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+ *size = var->size;
+ memcpy(data, var->data, var->size);
+ status = EFI_SUCCESS;
+ return status;
+ }
+ }
+
+ status = EFI_NOT_FOUND;
+ return status;
+}
+
+static EFI_STATUS
+mock_gnvn_set_result(UINTN *size, CHAR16 *name, EFI_GUID *guid,
+ struct mock_variable *result)
+{
+ EFI_STATUS status;
+
+ if (*size < StrSize(result->name)) {
+ *size = StrSize(result->name);
+ status = EFI_BUFFER_TOO_SMALL;
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): returning %lx\n",
+ __FILE__, __LINE__-1, __func__, status);
+#endif
+ return status;
+ }
+
+ *size = StrLen(result->name) + 1;
+ StrCpy(name, result->name);
+ memcpy(guid, &result->guid, sizeof(EFI_GUID));
+
+ status = EFI_SUCCESS;
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): returning %lx\n",
+ __FILE__, __LINE__-1, __func__, status);
+#endif
+ return status;
+}
+
+EFI_STATUS EFIAPI
+mock_get_next_variable_name(UINTN *size, CHAR16 *name, EFI_GUID *guid)
+{
+ list_t *pos = NULL;
+ struct mock_variable goal = {
+ .name = name,
+ .guid = *guid,
+ };
+ struct mock_variable *result = NULL;
+ bool found = false;
+ EFI_STATUS status;
+
+ if (size == NULL || name == NULL || guid == NULL) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+
+ for (size_t i = 0; i < *size; i++) {
+ if (name[i] == 0) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found == false) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+
+ found = false;
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s():searching for "GUID_FMT"%s%s\n",
+ __FILE__, __LINE__-1, __func__,
+ GUID_ARGS(*guid),
+ name[0] == 0 ? "" : "-",
+ name[0] == 0 ? "" : Str2str(name));
+#endif
+ list_for_each(pos, &mock_variables) {
+ struct mock_variable *var;
+
+ var = list_entry(pos, struct mock_variable, list);
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): candidate var:%p &var->guid:%p &var->list:%p\n",
+ __FILE__, __LINE__-1, __func__, var, &var->guid, &var->list);
+#endif
+ if (name[0] == 0) {
+ if (CompareGuid(&var->guid, guid) == 0) {
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): found\n",
+ __FILE__, __LINE__-1, __func__);
+#endif
+ result = var;
+ found = true;
+ break;
+ }
+ } else {
+ if (found) {
+ if (CompareGuid(&var->guid, guid) == 0) {
+ result = var;
+ break;
+ }
+ continue;
+ }
+
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): varcmp("GUID_FMT"-%s, "GUID_FMT"-%s)\n",
+ __FILE__, __LINE__-1, __func__,
+ GUID_ARGS(goal.guid), Str2str(goal.name),
+ GUID_ARGS(var->guid), Str2str(var->name));
+#endif
+ if (variable_cmp(&goal, var) == 0) {
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): found\n",
+ __FILE__, __LINE__-1, __func__);
+#endif
+ found = true;
+ }
+ }
+ }
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ if (result) {
+ printf("%s:%d:%s(): found:%d result:%p &result->guid:%p &result->list:%p\n"
+ __FILE__, __LINE__-1, __func__, found, result,
+ &result->guid, &result->list);
+ printf("%s:%d:%s(): "GUID_FMT"-%s\n",
+ __FILE__, __LINE__-1, __func__, GUID_ARGS(result->guid),
+ Str2str(result->name));
+ } else {
+ printf("%s:%d:%s(): not found\n",
+ __FILE__, __LINE__-1, __func__);
+ }
+#endif
+
+ if (!found) {
+ if (name[0] == 0)
+ status = EFI_NOT_FOUND;
+ else
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+
+ if (!result) {
+ status = EFI_NOT_FOUND;
+ return status;
+ }
+
+ return mock_gnvn_set_result(size, name, guid, result);
+}
+
+static void
+free_var(struct mock_variable *var)
+{
+ if (!var)
+ return;
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): var:%p &var->guid:%p ",
+ __FILE__, __LINE__-1, __func__,
+ var, var ? &var->guid : NULL);
+ if (var)
+ printf(GUID_FMT"-%s", GUID_ARGS(var->guid),
+ var->name ? Str2str(var->name) : "");
+ printf("\n");
+#endif
+ list_del(&var->list);
+ if (var->size && var->data)
+ free(var->data);
+ SetMem(var, sizeof(*var), 0);
+ free(var);
+}
+
+static bool
+mock_sv_attrs_match(UINT32 old, UINT32 new)
+{
+ UINT32 mask = ~EFI_VARIABLE_APPEND_WRITE;
+
+ return (old & mask) == (new & mask);
+}
+
+static EFI_STATUS
+mock_sv_adjust_usage_data(UINT32 attrs, size_t size, ssize_t change)
+{
+ const UINT32 bs = EFI_VARIABLE_BOOTSERVICE_ACCESS;
+ const UINT32 bs_nv = bs | EFI_VARIABLE_NON_VOLATILE;
+ const UINT32 bs_rt = bs | EFI_VARIABLE_RUNTIME_ACCESS;
+ const UINT32 bs_rt_nv = bs_nv | bs_rt;
+ struct mock_variable_limits goal = {
+ .attrs = attrs & bs_rt_nv,
+ };
+ struct mock_variable_limits *qvi_limits = NULL;
+ struct mock_variable_limits *sv_limits = NULL;
+ list_t var, *pos = NULL;
+ UINT64 remaining;
+
+ list_for_each(pos, mock_qvi_limits) {
+ struct mock_variable_limits *candidate;
+
+ candidate = list_entry(pos, struct mock_variable_limits, list);
+ if (variable_limits_cmp(&goal, candidate) == 0) {
+ qvi_limits = candidate;
+ break;
+ }
+ }
+
+ list_for_each(pos, mock_sv_limits) {
+ struct mock_variable_limits *candidate;
+
+ candidate = list_entry(pos, struct mock_variable_limits, list);
+ if (variable_limits_cmp(&goal, candidate) == 0) {
+ sv_limits = candidate;
+ break;
+ }
+ }
+ if (!sv_limits) {
+ return EFI_UNSUPPORTED;
+ }
+
+ if (sv_limits->status != EFI_SUCCESS)
+ return sv_limits->status;
+
+ if (*sv_limits->max_var_size < size) {
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s():*sv_limits->max_var_size:%zu size:%zu\n",
+ __FILE__, __LINE__, __func__,
+ *sv_limits->max_var_size, size);
+#endif
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ if (change > 0 && (UINT64)change > *sv_limits->remaining_var_storage) {
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s():*sv_limits->remaining_var_storage:%zu change:%zd\n",
+ __FILE__, __LINE__, __func__,
+ *sv_limits->remaining_var_storage, change);
+#endif
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ *sv_limits->remaining_var_storage += change;
+
+ if (qvi_limits) {
+ /*
+ * If the adjustment here is wrong, we don't want to not do
+ * the set variable, we also don't want to not account
+ * for it, and of course we can't have any integer UB. So
+ * just limit it safely and move on, even though that may
+ * result in wrong checks against QueryVariableInfo() later.
+ *
+ * As if there are correct checks against QueryVariableInfo()...
+ */
+ if (qvi_limits->remaining_var_storage == sv_limits->remaining_var_storage)
+ ;
+ else if (change < 0 && (UINT64)-change > *qvi_limits->remaining_var_storage)
+ *qvi_limits->remaining_var_storage = 0;
+ else if (change > 0 && UINT64_MAX - *qvi_limits->remaining_var_storage < (UINT64)change)
+ *qvi_limits->remaining_var_storage = UINT64_MAX;
+ else
+ *qvi_limits->remaining_var_storage += change;
+ }
+ return EFI_SUCCESS;
+}
+
+static EFI_STATUS
+mock_delete_variable(struct mock_variable *var)
+{
+ EFI_STATUS status;
+
+ status = mock_sv_adjust_usage_data(var->attrs, 0, - var->size);
+ if (EFI_ERROR(status)) {
+ printf("%s:%d:%s(): status:0x%lx\n",
+ __FILE__, __LINE__ - 1, __func__, status);
+ return status;
+ }
+
+ status = EFI_SUCCESS;
+ free_var(var);
+ return status;
+}
+
+static EFI_STATUS
+mock_replace_variable(struct mock_variable *var, VOID *data, UINTN size)
+{
+ EFI_STATUS status;
+ VOID *new;
+
+ status = mock_sv_adjust_usage_data(var->attrs, size,
+ - var->size + size);
+ if (EFI_ERROR(status)) {
+ return status;
+ }
+
+ new = calloc(1, size);
+ if (!new) {
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s():calloc(1, %zu) failed\n",
+ __FILE__, __LINE__, __func__,
+ size);
+#endif
+ status = EFI_OUT_OF_RESOURCES;
+ return status;
+ }
+ memcpy(new, data, size);
+ free(var->data);
+ var->data = new;
+ var->size = size;
+
+ status = EFI_SUCCESS;
+ return status;
+}
+
+static EFI_STATUS
+mock_sv_extend(struct mock_variable *var, VOID *data, UINTN size)
+{
+ EFI_STATUS status;
+ uint8_t *new;
+
+ if (size == 0) {
+ status = EFI_SUCCESS;
+ return status;
+ }
+
+ status = mock_sv_adjust_usage_data(var->attrs, var->size + size, size);
+ if (EFI_ERROR(status)) {
+ return status;
+ }
+
+ new = realloc(var->data, var->size + size);
+ if (!new) {
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s():realloc(%zu) failed\n",
+ __FILE__, __LINE__, __func__,
+ var->size + size);
+#endif
+ status = EFI_OUT_OF_RESOURCES;
+ return status;
+ }
+
+ memcpy(&new[var->size], data, size);
+ var->data = (void *)new;
+ var->size += size;
+
+ status = EFI_SUCCESS;
+ return status;
+}
+
+void
+mock_print_var_list(list_t *head)
+{
+ list_t *pos = NULL;
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s():variables so far:\n", __FILE__, __LINE__, __func__);
+#endif
+ list_for_each(pos, head) {
+ struct mock_variable *var = NULL;
+
+ var = list_entry(pos, struct mock_variable, list);
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): "GUID_FMT"-%s (%lu bytes)\n",
+ __FILE__, __LINE__ - 1, __func__,
+ GUID_ARGS(var->guid), Str2str(var->name), var->size);
+#endif
+ }
+}
+
+static EFI_STATUS
+mock_new_variable(CHAR16 *name, EFI_GUID *guid, UINT32 attrs, UINTN size,
+ VOID *data, struct mock_variable **out)
+{
+ EFI_STATUS status;
+ struct mock_variable *var;
+ uint8_t *buf;
+
+ if (size == 0) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+
+ status = EFI_OUT_OF_RESOURCES;
+ buf = calloc(1, sizeof(struct mock_variable) + StrSize(name));
+ if (!buf) {
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): calloc(1, %zu) failed\n",
+ __FILE__, __LINE__, __func__,
+ sizeof(struct mock_variable) + StrSize(name));
+#endif
+ goto err;
+ }
+ var = (struct mock_variable *)buf;
+
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): var:%p &var->guid:%p &var->list:%p\n",
+ __FILE__, __LINE__-1, __func__, var, &var->guid, &var->list);
+#endif
+
+ var->data = malloc(size);
+ if (!var->data)
+ goto err_free;
+
+ var->name = (CHAR16 *)&buf[sizeof(*var)];
+ StrCpy(var->name, name);
+ memcpy(&var->guid, guid, sizeof(EFI_GUID));
+ memcpy(var->data, data, size);
+ var->size = size;
+ var->attrs = attrs;
+ INIT_LIST_HEAD(&var->list);
+
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): var: "GUID_FMT"-%s\n",
+ __FILE__, __LINE__-1, __func__,
+ GUID_ARGS(var->guid), Str2str(var->name));
+#endif
+
+ *out = var;
+ status = EFI_SUCCESS;
+err_free:
+ if (EFI_ERROR(status))
+ free_var(var);
+err:
+ return status;
+}
+
+EFI_STATUS EFIAPI
+mock_set_variable(CHAR16 *name, EFI_GUID *guid, UINT32 attrs, UINTN size,
+ VOID *data)
+{
+ list_t *pos = NULL, *tmp = NULL, *var_list = NULL;
+ struct mock_variable goal = {
+ .name = name,
+ .guid = *guid,
+ };
+ struct mock_variable *var = NULL;
+ bool found = false;
+ bool add_tail = true;
+ EFI_STATUS status;
+ long cmp = -1;
+
+ if (!name || name[0] == 0 || !guid) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+
+ if ((attrs & EFI_VARIABLE_RUNTIME_ACCESS) &&
+ !(attrs & EFI_VARIABLE_BOOTSERVICE_ACCESS)) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+
+#if 0
+ /*
+ * We don't ever operate after ExitBootServices(), so I'm not
+ * checking for the missing EFI_VARIABLE_RUNTIME_ACCESS case
+ */
+ if (has_exited_boot_services() && !(attrs & EFI_VARIABLE_RUNTIME_ACCESS)) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+#endif
+
+#if 0
+ /*
+ * For now, we're ignoring that we don't support these.
+ */
+ if (attrs & (EFI_VARIABLE_HARDWARE_ERROR_RECORD |
+ EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS |
+ EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS |
+ EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS)) {
+ status = EFI_UNSUPPORTED;
+ return status;
+ }
+#endif
+
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s():Setting "GUID_FMT"-%s\n",
+ __FILE__, __LINE__ - 1, __func__,
+ GUID_ARGS(*guid), Str2str(name));
+#endif
+ switch (mock_variable_sort_policy) {
+ case MOCK_SORT_PREPEND:
+ var_list = &mock_variables;
+ add_tail = false;
+ break;
+ case MOCK_SORT_APPEND:
+ var_list = &mock_variables;
+ add_tail = true;
+ break;
+ case MOCK_SORT_DESCENDING:
+ add_tail = true;
+ break;
+ case MOCK_SORT_ASCENDING:
+ add_tail = true;
+ break;
+ default:
+ break;
+ }
+
+ pos = &mock_variables;
+ list_for_each_safe(pos, tmp, &mock_variables) {
+ found = false;
+ var = list_entry(pos, struct mock_variable, list);
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s(): varcmp("GUID_FMT"-%s, "GUID_FMT"-%s)\n",
+ __FILE__, __LINE__-1, __func__,
+ GUID_ARGS(goal.guid), Str2str(goal.name),
+ GUID_ARGS(var->guid), Str2str(var->name));
+#endif
+ cmp = variable_cmp(&goal, var);
+ cmp = cmp < 0 ? -1 : (cmp > 0 ? 1 : 0);
+
+ switch (mock_variable_sort_policy) {
+ case MOCK_SORT_DESCENDING:
+ if (cmp >= 0) {
+ var_list = pos;
+ found = true;
+ }
+ break;
+ case MOCK_SORT_ASCENDING:
+ if (cmp <= 0) {
+ var_list = pos;
+ found = true;
+ }
+ break;
+ default:
+ if (cmp == 0) {
+ var_list = pos;
+ found = true;
+ }
+ break;
+ }
+ if (found)
+ break;
+ }
+#if defined(SHIM_DEBUG) && SHIM_DEBUG != 0
+ printf("%s:%d:%s():var_list:%p &mock_variables:%p cmp:%ld\n",
+ __FILE__, __LINE__ - 1, __func__,
+ var_list, &mock_variables, cmp);
+#endif
+ if (cmp != 0 || (cmp == 0 && var_list == &mock_variables)) {
+ size_t totalsz = size + StrSize(name);
+#if defined(SHIM_DEBUG) && SHIM_DEBUG != 0
+ printf("%s:%d:%s():var:%p attrs:0x%lx\n",
+ __FILE__, __LINE__ - 1, __func__, var, attrs);
+#endif
+ status = mock_new_variable(name, guid, attrs, size, data, &var);
+ if (EFI_ERROR(status)) {
+ return status;
+ }
+ mock_sv_adjust_usage_data(attrs, size, totalsz);
+ if (EFI_ERROR(status)) {
+ mock_sv_adjust_usage_data(attrs, 0, -totalsz);
+ return status;
+ }
+
+#if defined(SHIM_DEBUG) && SHIM_DEBUG != 0
+ printf("%s:%d:%s(): Adding "GUID_FMT"-%s %s %s\n",
+ __FILE__, __LINE__ - 1, __func__,
+ GUID_ARGS(var->guid), Str2str(var->name),
+ add_tail ? "after" : "before",
+ list2var(pos));
+#endif
+ if (add_tail)
+ list_add_tail(&var->list, pos);
+ else
+ list_add(&var->list, pos);
+ return status;
+ }
+
+ var = list_entry(var_list, struct mock_variable, list);
+#if defined(SHIM_DEBUG) && SHIM_DEBUG != 0
+ printf("%s:%d:%s():var:%p attrs:%s cmp:%ld size:%ld\n",
+ __FILE__, __LINE__ - 1, __func__,
+ var, format_var_attrs(var->attrs), cmp, size);
+#endif
+ if (!mock_sv_attrs_match(var->attrs, attrs) && !(attrs == 0 && size == 0)) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+
+ if (attrs & EFI_VARIABLE_APPEND_WRITE)
+ return mock_sv_extend(var, data, size);
+
+ if (size == 0) {
+ UINT32 mask = EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS
+ | EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS;
+ /*
+ * We can't process deletes on these correctly unless we
+ * parse the header.
+ */
+ if (attrs & mask) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ return mock_delete_variable(var);
+ }
+
+ return mock_replace_variable(var, data, size);
+}
+
+EFI_STATUS EFIAPI
+mock_query_variable_info(UINT32 attrs, UINT64 *max_var_storage,
+ UINT64 *remaining_var_storage, UINT64 *max_var_size)
+{
+ list_t mvl, *pos = NULL;
+ struct mock_variable_limits goal = {
+ .attrs = attrs,
+ };
+ struct mock_variable_limits *limits = NULL;
+ EFI_STATUS status;
+
+ if (max_var_storage == NULL ||
+ remaining_var_storage == NULL ||
+ max_var_size == NULL) {
+ status = EFI_INVALID_PARAMETER;
+ return status;
+ }
+
+ list_for_each(pos, mock_qvi_limits) {
+ limits = list_entry(pos, struct mock_variable_limits, list);
+ if (variable_limits_cmp(&goal, limits) == 0) {
+ *max_var_storage = *limits->max_var_storage;
+ *remaining_var_storage = *limits->remaining_var_storage;
+ *max_var_size = *limits->max_var_size;
+ status = EFI_SUCCESS;
+ return status;
+ }
+ }
+
+ status = EFI_UNSUPPORTED;
+ return status;
+}
+
+static UINT64 default_max_var_storage;
+static UINT64 default_remaining_var_storage;
+static UINT64 default_max_var_size;
+
+static struct mock_variable_limits default_limits[] = {
+ {.attrs = EFI_VARIABLE_BOOTSERVICE_ACCESS,
+ .max_var_storage = &default_max_var_storage,
+ .remaining_var_storage = &default_remaining_var_storage,
+ .max_var_size = &default_max_var_size,
+ .status = EFI_SUCCESS,
+ },
+ {.attrs = EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS,
+ .max_var_storage = &default_max_var_storage,
+ .remaining_var_storage = &default_remaining_var_storage,
+ .max_var_size = &default_max_var_size,
+ .status = EFI_SUCCESS,
+ },
+ {.attrs = EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_NON_VOLATILE,
+ .max_var_storage = &default_max_var_storage,
+ .remaining_var_storage = &default_remaining_var_storage,
+ .max_var_size = &default_max_var_size,
+ .status = EFI_SUCCESS,
+ },
+ {.attrs = EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS |
+ EFI_VARIABLE_NON_VOLATILE,
+ .max_var_storage = &default_max_var_storage,
+ .remaining_var_storage = &default_remaining_var_storage,
+ .max_var_size = &default_max_var_size,
+ .status = EFI_SUCCESS,
+ },
+ {.attrs = 0, }
+};
+
+void
+mock_set_default_usage_limits(void)
+{
+ default_max_var_storage = 65536;
+ default_remaining_var_storage = 65536;
+ default_max_var_size = 32768;
+
+ INIT_LIST_HEAD(&mock_default_variable_limits);
+ for (size_t i = 0; default_limits[i].attrs != 0; i++) {
+ INIT_LIST_HEAD(&default_limits[i].list);
+ list_add_tail(&default_limits[i].list,
+ &mock_default_variable_limits);
+ }
+}
+
+void
+mock_load_one_variable(int dfd, const char * const dirname, char * const name)
+{
+ int fd;
+ FILE *f;
+ int rc;
+ struct stat statbuf;
+ size_t guidlen, namelen;
+ efi_guid_t guid;
+ size_t sz;
+ ssize_t offset = 0;
+ EFI_STATUS status;
+ UINT32 attrs;
+
+ rc = fstatat(dfd, name, &statbuf, 0);
+ if (rc < 0)
+ err(2, "Could not stat \"%s/%s\"", dirname, name);
+
+ if (!(S_ISREG(statbuf.st_mode)))
+ return;
+
+ if (statbuf.st_size < 5)
+ errx(2, "Test data variable \"%s/%s\" is too small (%ld bytes)",
+ dirname, name, statbuf.st_size);
+
+#if 0
+ mock_print_var_list(&mock_variables);
+#endif
+
+ uint8_t buf[statbuf.st_size];
+
+ fd = openat(dfd, name, O_RDONLY);
+ if (fd < 0)
+ err(2, "Could not open \"%s/%s\"", dirname, name);
+
+ f = fdopen(fd, "r");
+ if (!f)
+ err(2, "Could not open \"%s/%s\"", dirname, name);
+
+ while (offset != statbuf.st_size) {
+ sz = fread(buf + offset, 1, statbuf.st_size - offset, f);
+ if (sz == 0) {
+ if (ferror(f))
+ err(2, "Could not read from \"%s/%s\"",
+ dirname, name);
+ if (feof(f))
+ errx(2, "Unexpected end of file reading \"%s/%s\"",
+ dirname, name);
+ }
+
+ offset += sz;
+ }
+
+ guidlen = strlen("8be4df61-93ca-11d2-aa0d-00e098032b8c");
+ namelen = strlen(name) - guidlen;
+
+ if (namelen < 2)
+ errx(2, "namelen for \"%s\" is %zu!?!", name, namelen);
+
+ CHAR16 namebuf[namelen];
+
+ name[namelen-1] = 0;
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("loading %s-%s\n", &name[namelen], name);
+#endif
+ for (size_t i = 0; i < namelen; i++)
+ namebuf[i] = name[i];
+
+ rc = efi_str_to_guid(&name[namelen], &guid);
+ if (rc < 0)
+ err(2, "Could not parse \"%s\" as EFI GUID", &name[namelen]);
+
+ memcpy(&attrs, (UINT32 *)buf, sizeof(UINT32));
+
+ status = RT->SetVariable(namebuf, (EFI_GUID *)&guid, attrs,
+ statbuf.st_size - sizeof(attrs),
+ &buf[sizeof(attrs)]);
+ if (EFI_ERROR(status))
+ errx(2, "%s:%d:%s(): Could not set variable: 0x%llx",
+ __FILE__, __LINE__ - 1, __func__,
+ (unsigned long long)status);
+
+ fclose(f);
+}
+
+void
+mock_load_variables(const char *const dirname, const char *filters[],
+ bool filter_out)
+{
+ int dfd;
+ DIR *d;
+ struct dirent *entry;
+
+ d = opendir(dirname);
+ if (!d)
+ err(1, "Could not open directory \"%s\"", dirname);
+
+ dfd = dirfd(d);
+ if (dfd < 0)
+ err(1, "Could not get directory file descriptor for \"%s\"",
+ dirname);
+
+ while ((entry = readdir(d)) != NULL) {
+ size_t len = strlen(entry->d_name);
+ bool found = false;
+ if (filters && len > guidstr_size + 1) {
+ char spacebuf[len];
+
+ len -= guidstr_size;
+ SetMem(spacebuf, sizeof(spacebuf)-1, ' ');
+ spacebuf[len] = '\0';
+ for (size_t i = 0; filters[i]; i++) {
+ if (strlen(filters[i]) > len)
+ continue;
+ if (!strncmp(entry->d_name, filters[i], len)) {
+ found = true;
+ break;
+ }
+ }
+ }
+ if ((found == false && filter_out == true) ||
+ (found == true && filter_out == false)) {
+ mock_load_one_variable(dfd, dirname, entry->d_name);
+ }
+ }
+
+ closedir(d);
+#if 0
+ mock_print_var_list(&mock_variables);
+#endif
+}
+
+static bool qvi_installed = false;
+
+void
+mock_install_query_variable_info(void)
+{
+ qvi_installed = true;
+ RT->Hdr.Revision = 2ul << 16ul;
+ RT->QueryVariableInfo = mock_query_variable_info;
+}
+
+void
+mock_uninstall_query_variable_info(void)
+{
+ qvi_installed = false;
+ RT->Hdr.Revision = EFI_1_10_SYSTEM_TABLE_REVISION;
+ RT->QueryVariableInfo = mock_efi_unsupported;
+}
+
+void CONSTRUCTOR
+mock_reset_variables(void)
+{
+ list_t *pos = NULL, *tmp = NULL;
+ static bool once = true;
+
+ init_efi_system_table();
+
+ if (once) {
+ INIT_LIST_HEAD(&mock_variables);
+ once = false;
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s():mock_variables = {%p,%p};\n",
+ __FILE__, __LINE__-1, __func__,
+ mock_variables.next,
+ mock_variables.prev);
+ printf("%s:%d:%s():list_empty(&mock_variables):%d\n",
+ __FILE__, __LINE__-1, __func__, list_empty(&mock_variables));
+ printf("%s:%d:%s():list_size(&mock_variables):%d\n",
+ __FILE__, __LINE__-1, __func__, list_size(&mock_variables));
+#endif
+ }
+
+ list_for_each_safe(pos, tmp, &mock_variables) {
+ struct mock_variable *var = NULL;
+ var = list_entry(pos, struct mock_variable, list);
+
+#if (defined(SHIM_DEBUG) && SHIM_DEBUG != 0)
+ printf("%s:%d:%s():var:"GUID_FMT"-%s\n",
+ __FILE__, __LINE__-1, __func__,
+ GUID_ARGS(var->guid), Str2str(var->name));
+#endif
+ mock_delete_variable(var);
+ }
+ INIT_LIST_HEAD(&mock_variables);
+ mock_set_default_usage_limits();
+
+ RT->GetVariable = mock_get_variable;
+ RT->GetNextVariableName = mock_get_next_variable_name;
+ RT->SetVariable = mock_set_variable;
+ if (qvi_installed)
+ mock_install_query_variable_info();
+ else
+ mock_uninstall_query_variable_info();
+}
+
+void DESTRUCTOR
+mock_finalize_vars(void)
+{
+ mock_reset_variables();
+}
+
+// vim:fenc=utf-8:tw=75:noet
diff --git a/test-data/efivars-0/AMD_PBS_SETUP-a339d746-f678-49b3-9fc7-54ce0f9df226 b/test-data/efivars-0/AMD_PBS_SETUP-a339d746-f678-49b3-9fc7-54ce0f9df226
new file mode 100644
index 00000000..3e375f03
--- /dev/null
+++ b/test-data/efivars-0/AMD_PBS_SETUP-a339d746-f678-49b3-9fc7-54ce0f9df226
Binary files differ
diff --git a/test-data/efivars-0/AMD_RAID-fe26a894-d199-47d4-8afa-070e3d54ba86 b/test-data/efivars-0/AMD_RAID-fe26a894-d199-47d4-8afa-070e3d54ba86
new file mode 100644
index 00000000..ad58e851
--- /dev/null
+++ b/test-data/efivars-0/AMD_RAID-fe26a894-d199-47d4-8afa-070e3d54ba86
Binary files differ
diff --git a/test-data/efivars-0/AMITCGPPIVAR-a8a2093b-fefa-43c1-8e62-ce526847265e b/test-data/efivars-0/AMITCGPPIVAR-a8a2093b-fefa-43c1-8e62-ce526847265e
new file mode 100644
index 00000000..480c8c8d
--- /dev/null
+++ b/test-data/efivars-0/AMITCGPPIVAR-a8a2093b-fefa-43c1-8e62-ce526847265e
Binary files differ
diff --git a/test-data/efivars-0/Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-0/Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..1bebe830
--- /dev/null
+++ b/test-data/efivars-0/Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-0/db-d719b2cb-3d3a-4596-a3bc-dad00e67656f b/test-data/efivars-0/db-d719b2cb-3d3a-4596-a3bc-dad00e67656f
new file mode 100644
index 00000000..794e2236
--- /dev/null
+++ b/test-data/efivars-0/db-d719b2cb-3d3a-4596-a3bc-dad00e67656f
Binary files differ
diff --git a/test-data/efivars-0/dbDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-0/dbDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..caa92886
--- /dev/null
+++ b/test-data/efivars-0/dbDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-0/dbx-d719b2cb-3d3a-4596-a3bc-dad00e67656f b/test-data/efivars-0/dbx-d719b2cb-3d3a-4596-a3bc-dad00e67656f
new file mode 100644
index 00000000..7fe70233
--- /dev/null
+++ b/test-data/efivars-0/dbx-d719b2cb-3d3a-4596-a3bc-dad00e67656f
Binary files differ
diff --git a/test-data/efivars-0/dbxDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-0/dbxDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..b747b47c
--- /dev/null
+++ b/test-data/efivars-0/dbxDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/AMD_PBS_SETUP-a339d746-f678-49b3-9fc7-54ce0f9df226 b/test-data/efivars-1/AMD_PBS_SETUP-a339d746-f678-49b3-9fc7-54ce0f9df226
new file mode 100644
index 00000000..3e375f03
--- /dev/null
+++ b/test-data/efivars-1/AMD_PBS_SETUP-a339d746-f678-49b3-9fc7-54ce0f9df226
Binary files differ
diff --git a/test-data/efivars-1/AMD_RAID-fe26a894-d199-47d4-8afa-070e3d54ba86 b/test-data/efivars-1/AMD_RAID-fe26a894-d199-47d4-8afa-070e3d54ba86
new file mode 100644
index 00000000..ad58e851
--- /dev/null
+++ b/test-data/efivars-1/AMD_RAID-fe26a894-d199-47d4-8afa-070e3d54ba86
Binary files differ
diff --git a/test-data/efivars-1/AMITCGPPIVAR-a8a2093b-fefa-43c1-8e62-ce526847265e b/test-data/efivars-1/AMITCGPPIVAR-a8a2093b-fefa-43c1-8e62-ce526847265e
new file mode 100644
index 00000000..480c8c8d
--- /dev/null
+++ b/test-data/efivars-1/AMITCGPPIVAR-a8a2093b-fefa-43c1-8e62-ce526847265e
Binary files differ
diff --git a/test-data/efivars-1/AMITSESetup-c811fa38-42c8-4579-a9bb-60e94eddfb34 b/test-data/efivars-1/AMITSESetup-c811fa38-42c8-4579-a9bb-60e94eddfb34
new file mode 100644
index 00000000..ccf2dc2d
--- /dev/null
+++ b/test-data/efivars-1/AMITSESetup-c811fa38-42c8-4579-a9bb-60e94eddfb34
Binary files differ
diff --git a/test-data/efivars-1/AOD_SETUP-5ed15dc0-edef-4161-9151-6014c4cc630c b/test-data/efivars-1/AOD_SETUP-5ed15dc0-edef-4161-9151-6014c4cc630c
new file mode 100644
index 00000000..77b1eede
--- /dev/null
+++ b/test-data/efivars-1/AOD_SETUP-5ed15dc0-edef-4161-9151-6014c4cc630c
Binary files differ
diff --git a/test-data/efivars-1/AmdAcpiVar-79941ecd-ed36-49d0-8124-e4c31ac75cd4 b/test-data/efivars-1/AmdAcpiVar-79941ecd-ed36-49d0-8124-e4c31ac75cd4
new file mode 100644
index 00000000..269345bd
--- /dev/null
+++ b/test-data/efivars-1/AmdAcpiVar-79941ecd-ed36-49d0-8124-e4c31ac75cd4
Binary files differ
diff --git a/test-data/efivars-1/AmdSetup-3a997502-647a-4c82-998e-52ef9486a247 b/test-data/efivars-1/AmdSetup-3a997502-647a-4c82-998e-52ef9486a247
new file mode 100644
index 00000000..ea257e23
--- /dev/null
+++ b/test-data/efivars-1/AmdSetup-3a997502-647a-4c82-998e-52ef9486a247
Binary files differ
diff --git a/test-data/efivars-1/AmiHardwareSignatureSetupUpdateCountVar-81c76078-bfde-4368-9790-570914c01a65 b/test-data/efivars-1/AmiHardwareSignatureSetupUpdateCountVar-81c76078-bfde-4368-9790-570914c01a65
new file mode 100644
index 00000000..78bf6592
--- /dev/null
+++ b/test-data/efivars-1/AmiHardwareSignatureSetupUpdateCountVar-81c76078-bfde-4368-9790-570914c01a65
Binary files differ
diff --git a/test-data/efivars-1/ApSyncFlagNv-ad3f6761-f0a3-46c8-a4cb-19b70ffdb305 b/test-data/efivars-1/ApSyncFlagNv-ad3f6761-f0a3-46c8-a4cb-19b70ffdb305
new file mode 100644
index 00000000..c100358e
--- /dev/null
+++ b/test-data/efivars-1/ApSyncFlagNv-ad3f6761-f0a3-46c8-a4cb-19b70ffdb305
Binary files differ
diff --git a/test-data/efivars-1/AsbkpInfo-cb825795-feb1-4c0b-894f-cc70f8064395 b/test-data/efivars-1/AsbkpInfo-cb825795-feb1-4c0b-894f-cc70f8064395
new file mode 100644
index 00000000..e673fc1e
--- /dev/null
+++ b/test-data/efivars-1/AsbkpInfo-cb825795-feb1-4c0b-894f-cc70f8064395
Binary files differ
diff --git a/test-data/efivars-1/AsusExtFancard-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/AsusExtFancard-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..f37b1b76
--- /dev/null
+++ b/test-data/efivars-1/AsusExtFancard-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/AsusFanSetupFeatures-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/AsusFanSetupFeatures-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..1f4faec7
--- /dev/null
+++ b/test-data/efivars-1/AsusFanSetupFeatures-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/AsusHwmSetupOneof-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/AsusHwmSetupOneof-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..0f3fe32f
--- /dev/null
+++ b/test-data/efivars-1/AsusHwmSetupOneof-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/AsusNodePsu-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/AsusNodePsu-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..f37b1b76
--- /dev/null
+++ b/test-data/efivars-1/AsusNodePsu-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/AsusQFanSetupData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/AsusQFanSetupData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..974cea30
--- /dev/null
+++ b/test-data/efivars-1/AsusQFanSetupData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/AsusRomLayout-7186d975-2dba-4413-81a8-9f1538faef5e b/test-data/efivars-1/AsusRomLayout-7186d975-2dba-4413-81a8-9f1538faef5e
new file mode 100644
index 00000000..efdb73d0
--- /dev/null
+++ b/test-data/efivars-1/AsusRomLayout-7186d975-2dba-4413-81a8-9f1538faef5e
Binary files differ
diff --git a/test-data/efivars-1/AsusSetupDataBackup-1111b056-c5e9-40ca-aba3-ec172533d814 b/test-data/efivars-1/AsusSetupDataBackup-1111b056-c5e9-40ca-aba3-ec172533d814
new file mode 100644
index 00000000..418e63b8
--- /dev/null
+++ b/test-data/efivars-1/AsusSetupDataBackup-1111b056-c5e9-40ca-aba3-ec172533d814
Binary files differ
diff --git a/test-data/efivars-1/AutoDetectData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/AutoDetectData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..730e919f
--- /dev/null
+++ b/test-data/efivars-1/AutoDetectData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/BiosEventLog-4034591c-48ea-4cdc-864f-e7cb61cfd0f2 b/test-data/efivars-1/BiosEventLog-4034591c-48ea-4cdc-864f-e7cb61cfd0f2
new file mode 100644
index 00000000..4ef95072
--- /dev/null
+++ b/test-data/efivars-1/BiosEventLog-4034591c-48ea-4cdc-864f-e7cb61cfd0f2
Binary files differ
diff --git a/test-data/efivars-1/Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..1bebe830
--- /dev/null
+++ b/test-data/efivars-1/Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..fdbf58aa
--- /dev/null
+++ b/test-data/efivars-1/Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..395525be
--- /dev/null
+++ b/test-data/efivars-1/Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..d4a6326b
--- /dev/null
+++ b/test-data/efivars-1/Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..9a151ed7
--- /dev/null
+++ b/test-data/efivars-1/Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/Boot0005-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/Boot0005-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..aa8ba6f1
--- /dev/null
+++ b/test-data/efivars-1/Boot0005-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/Boot0006-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/Boot0006-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..cb32ae74
--- /dev/null
+++ b/test-data/efivars-1/Boot0006-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..4be6b177
--- /dev/null
+++ b/test-data/efivars-1/BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/BootFromUSB-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/BootFromUSB-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..f37b1b76
--- /dev/null
+++ b/test-data/efivars-1/BootFromUSB-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/BootOptionSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/BootOptionSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..f06270d6
--- /dev/null
+++ b/test-data/efivars-1/BootOptionSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..97119095
--- /dev/null
+++ b/test-data/efivars-1/BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/CMOSfailflag-c89dc9c7-5105-472c-a743-b1621e142b41 b/test-data/efivars-1/CMOSfailflag-c89dc9c7-5105-472c-a743-b1621e142b41
new file mode 100644
index 00000000..7cfdbd29
--- /dev/null
+++ b/test-data/efivars-1/CMOSfailflag-c89dc9c7-5105-472c-a743-b1621e142b41
Binary files differ
diff --git a/test-data/efivars-1/ConIn-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/ConIn-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..c6875549
--- /dev/null
+++ b/test-data/efivars-1/ConIn-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/ConInDev-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/ConInDev-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..1530945f
--- /dev/null
+++ b/test-data/efivars-1/ConInDev-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/ConOut-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/ConOut-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..1f8a9503
--- /dev/null
+++ b/test-data/efivars-1/ConOut-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/ConOutDev-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/ConOutDev-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..2dcf180c
--- /dev/null
+++ b/test-data/efivars-1/ConOutDev-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/CurrentPolicy-77fa9abd-0359-4d32-bd60-28f4e78f784b b/test-data/efivars-1/CurrentPolicy-77fa9abd-0359-4d32-bd60-28f4e78f784b
new file mode 100644
index 00000000..88c1ba07
--- /dev/null
+++ b/test-data/efivars-1/CurrentPolicy-77fa9abd-0359-4d32-bd60-28f4e78f784b
Binary files differ
diff --git a/test-data/efivars-1/DefaultBootOrder-45cf35f6-0d6e-4d04-856a-0370a5b16f53 b/test-data/efivars-1/DefaultBootOrder-45cf35f6-0d6e-4d04-856a-0370a5b16f53
new file mode 100644
index 00000000..e8844a33
--- /dev/null
+++ b/test-data/efivars-1/DefaultBootOrder-45cf35f6-0d6e-4d04-856a-0370a5b16f53
Binary files differ
diff --git a/test-data/efivars-1/DeploymentModeNv-97e8965f-c761-4f48-b6e4-9ffa9cb2a2d6 b/test-data/efivars-1/DeploymentModeNv-97e8965f-c761-4f48-b6e4-9ffa9cb2a2d6
new file mode 100644
index 00000000..f37b1b76
--- /dev/null
+++ b/test-data/efivars-1/DeploymentModeNv-97e8965f-c761-4f48-b6e4-9ffa9cb2a2d6
Binary files differ
diff --git a/test-data/efivars-1/DownCoreStatus-29749bad-401b-4f6d-b124-cece8c590c48 b/test-data/efivars-1/DownCoreStatus-29749bad-401b-4f6d-b124-cece8c590c48
new file mode 100644
index 00000000..f37b1b76
--- /dev/null
+++ b/test-data/efivars-1/DownCoreStatus-29749bad-401b-4f6d-b124-cece8c590c48
Binary files differ
diff --git a/test-data/efivars-1/EnWpData-cbab171f-f356-4009-baaa-6628353a0a29 b/test-data/efivars-1/EnWpData-cbab171f-f356-4009-baaa-6628353a0a29
new file mode 100644
index 00000000..6f0c2f14
--- /dev/null
+++ b/test-data/efivars-1/EnWpData-cbab171f-f356-4009-baaa-6628353a0a29
Binary files differ
diff --git a/test-data/efivars-1/ErrOut-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/ErrOut-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..1f8a9503
--- /dev/null
+++ b/test-data/efivars-1/ErrOut-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/FPLayoutOrder-4db88a62-6721-47a0-9082-280b00323594 b/test-data/efivars-1/FPLayoutOrder-4db88a62-6721-47a0-9082-280b00323594
new file mode 100644
index 00000000..6d032958
--- /dev/null
+++ b/test-data/efivars-1/FPLayoutOrder-4db88a62-6721-47a0-9082-280b00323594
Binary files differ
diff --git a/test-data/efivars-1/FTMActiveFlag-4034591c-48ea-4cdc-864f-e7cb61cfd0f2 b/test-data/efivars-1/FTMActiveFlag-4034591c-48ea-4cdc-864f-e7cb61cfd0f2
new file mode 100644
index 00000000..f37b1b76
--- /dev/null
+++ b/test-data/efivars-1/FTMActiveFlag-4034591c-48ea-4cdc-864f-e7cb61cfd0f2
Binary files differ
diff --git a/test-data/efivars-1/FastBootOption-b540a530-6978-4da7-91cb-7207d764d262 b/test-data/efivars-1/FastBootOption-b540a530-6978-4da7-91cb-7207d764d262
new file mode 100644
index 00000000..502ad840
--- /dev/null
+++ b/test-data/efivars-1/FastBootOption-b540a530-6978-4da7-91cb-7207d764d262
Binary files differ
diff --git a/test-data/efivars-1/FirstBootFlag-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/FirstBootFlag-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..a652cc86
--- /dev/null
+++ b/test-data/efivars-1/FirstBootFlag-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/HddSmartInfo-a6f44860-b2e8-4fda-bd45-78368994b6ae b/test-data/efivars-1/HddSmartInfo-a6f44860-b2e8-4fda-bd45-78368994b6ae
new file mode 100644
index 00000000..7cfdbd29
--- /dev/null
+++ b/test-data/efivars-1/HddSmartInfo-a6f44860-b2e8-4fda-bd45-78368994b6ae
Binary files differ
diff --git a/test-data/efivars-1/HiiDB-1b838190-4625-4ead-abc9-cd5e6af18fe0 b/test-data/efivars-1/HiiDB-1b838190-4625-4ead-abc9-cd5e6af18fe0
new file mode 100644
index 00000000..89e10eab
--- /dev/null
+++ b/test-data/efivars-1/HiiDB-1b838190-4625-4ead-abc9-cd5e6af18fe0
Binary files differ
diff --git a/test-data/efivars-1/HwErrRecSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/HwErrRecSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..60f8feb8
--- /dev/null
+++ b/test-data/efivars-1/HwErrRecSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/KEK-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/KEK-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..062abae1
--- /dev/null
+++ b/test-data/efivars-1/KEK-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/KEKDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/KEKDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..2ebd5c58
--- /dev/null
+++ b/test-data/efivars-1/KEKDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/Kernel_ATPSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b b/test-data/efivars-1/Kernel_ATPSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
new file mode 100644
index 00000000..78bf6592
--- /dev/null
+++ b/test-data/efivars-1/Kernel_ATPSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
Binary files differ
diff --git a/test-data/efivars-1/Kernel_DriverSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b b/test-data/efivars-1/Kernel_DriverSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
new file mode 100644
index 00000000..78bf6592
--- /dev/null
+++ b/test-data/efivars-1/Kernel_DriverSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
Binary files differ
diff --git a/test-data/efivars-1/Kernel_RvkSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b b/test-data/efivars-1/Kernel_RvkSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
new file mode 100644
index 00000000..78bf6592
--- /dev/null
+++ b/test-data/efivars-1/Kernel_RvkSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
Binary files differ
diff --git a/test-data/efivars-1/Kernel_SiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b b/test-data/efivars-1/Kernel_SiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
new file mode 100644
index 00000000..78bf6592
--- /dev/null
+++ b/test-data/efivars-1/Kernel_SiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
Binary files differ
diff --git a/test-data/efivars-1/Kernel_SkuSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b b/test-data/efivars-1/Kernel_SkuSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
new file mode 100644
index 00000000..78bf6592
--- /dev/null
+++ b/test-data/efivars-1/Kernel_SkuSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
Binary files differ
diff --git a/test-data/efivars-1/Kernel_WinSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b b/test-data/efivars-1/Kernel_WinSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
new file mode 100644
index 00000000..78bf6592
--- /dev/null
+++ b/test-data/efivars-1/Kernel_WinSiStatus-77fa9abd-0359-4d32-bd60-28f4e78f784b
Binary files differ
diff --git a/test-data/efivars-1/LastBoot-b540a530-6978-4da7-91cb-7207d764d262 b/test-data/efivars-1/LastBoot-b540a530-6978-4da7-91cb-7207d764d262
new file mode 100644
index 00000000..ef1bad0a
--- /dev/null
+++ b/test-data/efivars-1/LastBoot-b540a530-6978-4da7-91cb-7207d764d262
Binary files differ
diff --git a/test-data/efivars-1/MaximumTableSize-4b3082a3-80c6-4d7e-9cd0-583917265df1 b/test-data/efivars-1/MaximumTableSize-4b3082a3-80c6-4d7e-9cd0-583917265df1
new file mode 100644
index 00000000..b4637d81
--- /dev/null
+++ b/test-data/efivars-1/MaximumTableSize-4b3082a3-80c6-4d7e-9cd0-583917265df1
Binary files differ
diff --git a/test-data/efivars-1/MemoryOverwriteRequestControl-e20939be-32d4-41be-a150-897f85d49829 b/test-data/efivars-1/MemoryOverwriteRequestControl-e20939be-32d4-41be-a150-897f85d49829
new file mode 100644
index 00000000..f37b1b76
--- /dev/null
+++ b/test-data/efivars-1/MemoryOverwriteRequestControl-e20939be-32d4-41be-a150-897f85d49829
Binary files differ
diff --git a/test-data/efivars-1/MemoryOverwriteRequestControlLock-bb983ccf-151d-40e1-a07b-4a17be168292 b/test-data/efivars-1/MemoryOverwriteRequestControlLock-bb983ccf-151d-40e1-a07b-4a17be168292
new file mode 100644
index 00000000..f37b1b76
--- /dev/null
+++ b/test-data/efivars-1/MemoryOverwriteRequestControlLock-bb983ccf-151d-40e1-a07b-4a17be168292
Binary files differ
diff --git a/test-data/efivars-1/MokList-605dab50-e046-4300-abb6-3dd810dd8b23 b/test-data/efivars-1/MokList-605dab50-e046-4300-abb6-3dd810dd8b23
new file mode 100644
index 00000000..7567e40c
--- /dev/null
+++ b/test-data/efivars-1/MokList-605dab50-e046-4300-abb6-3dd810dd8b23
Binary files differ
diff --git a/test-data/efivars-1/MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23 b/test-data/efivars-1/MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23
new file mode 100644
index 00000000..a4024770
--- /dev/null
+++ b/test-data/efivars-1/MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23
Binary files differ
diff --git a/test-data/efivars-1/MokListX-605dab50-e046-4300-abb6-3dd810dd8b23 b/test-data/efivars-1/MokListX-605dab50-e046-4300-abb6-3dd810dd8b23
new file mode 100644
index 00000000..d6de49f1
--- /dev/null
+++ b/test-data/efivars-1/MokListX-605dab50-e046-4300-abb6-3dd810dd8b23
Binary files differ
diff --git a/test-data/efivars-1/MokListXRT-605dab50-e046-4300-abb6-3dd810dd8b23 b/test-data/efivars-1/MokListXRT-605dab50-e046-4300-abb6-3dd810dd8b23
new file mode 100644
index 00000000..6c058bfc
--- /dev/null
+++ b/test-data/efivars-1/MokListXRT-605dab50-e046-4300-abb6-3dd810dd8b23
Binary files differ
diff --git a/test-data/efivars-1/MonotonicCounter-01368881-c4ad-4b1d-b631-d57a8ec8db6b b/test-data/efivars-1/MonotonicCounter-01368881-c4ad-4b1d-b631-d57a8ec8db6b
new file mode 100644
index 00000000..92182fea
--- /dev/null
+++ b/test-data/efivars-1/MonotonicCounter-01368881-c4ad-4b1d-b631-d57a8ec8db6b
Binary files differ
diff --git a/test-data/efivars-1/MyFav-4034591c-48ea-4cdc-864f-e7cb61cfd0f2 b/test-data/efivars-1/MyFav-4034591c-48ea-4cdc-864f-e7cb61cfd0f2
new file mode 100644
index 00000000..4ecf019d
--- /dev/null
+++ b/test-data/efivars-1/MyFav-4034591c-48ea-4cdc-864f-e7cb61cfd0f2
Binary files differ
diff --git a/test-data/efivars-1/NVRAM_Verify-15a9dd61-e4f8-4a99-80db-353b13d76490 b/test-data/efivars-1/NVRAM_Verify-15a9dd61-e4f8-4a99-80db-353b13d76490
new file mode 100644
index 00000000..e055de8b
--- /dev/null
+++ b/test-data/efivars-1/NVRAM_Verify-15a9dd61-e4f8-4a99-80db-353b13d76490
Binary files differ
diff --git a/test-data/efivars-1/NetworkStackVar-d1405d16-7afc-4695-bb12-41459d3695a2 b/test-data/efivars-1/NetworkStackVar-d1405d16-7afc-4695-bb12-41459d3695a2
new file mode 100644
index 00000000..ab120d7d
--- /dev/null
+++ b/test-data/efivars-1/NetworkStackVar-d1405d16-7afc-4695-bb12-41459d3695a2
Binary files differ
diff --git a/test-data/efivars-1/NvHdd0-e57abcbd-9456-4639-8f65-06aab41d840f b/test-data/efivars-1/NvHdd0-e57abcbd-9456-4639-8f65-06aab41d840f
new file mode 100644
index 00000000..230f3f60
--- /dev/null
+++ b/test-data/efivars-1/NvHdd0-e57abcbd-9456-4639-8f65-06aab41d840f
Binary files differ
diff --git a/test-data/efivars-1/NvHdd8-e57abcbd-9456-4639-8f65-06aab41d840f b/test-data/efivars-1/NvHdd8-e57abcbd-9456-4639-8f65-06aab41d840f
new file mode 100644
index 00000000..137dd654
--- /dev/null
+++ b/test-data/efivars-1/NvHdd8-e57abcbd-9456-4639-8f65-06aab41d840f
Binary files differ
diff --git a/test-data/efivars-1/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..ad58e851
--- /dev/null
+++ b/test-data/efivars-1/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..65902d34
--- /dev/null
+++ b/test-data/efivars-1/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/PCI_COMMON-aca9f304-21e2-4852-9875-7ff4881d67a5 b/test-data/efivars-1/PCI_COMMON-aca9f304-21e2-4852-9875-7ff4881d67a5
new file mode 100644
index 00000000..1484033a
--- /dev/null
+++ b/test-data/efivars-1/PCI_COMMON-aca9f304-21e2-4852-9875-7ff4881d67a5
Binary files differ
diff --git a/test-data/efivars-1/PK-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/PK-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..2a784c4c
--- /dev/null
+++ b/test-data/efivars-1/PK-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/PKDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/PKDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..38d00e83
--- /dev/null
+++ b/test-data/efivars-1/PKDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/PcieSataModVar-5e9a565f-cdc0-413b-ad13-1fe8713ffdcd b/test-data/efivars-1/PcieSataModVar-5e9a565f-cdc0-413b-ad13-1fe8713ffdcd
new file mode 100644
index 00000000..7b89b915
--- /dev/null
+++ b/test-data/efivars-1/PcieSataModVar-5e9a565f-cdc0-413b-ad13-1fe8713ffdcd
Binary files differ
diff --git a/test-data/efivars-1/PlatformLang-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/PlatformLang-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..456f5e7d
--- /dev/null
+++ b/test-data/efivars-1/PlatformLang-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/PlatformLangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/PlatformLangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..aacb9a6f
--- /dev/null
+++ b/test-data/efivars-1/PlatformLangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/PreVgaInfo-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/PreVgaInfo-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..e85f1be7
--- /dev/null
+++ b/test-data/efivars-1/PreVgaInfo-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/RsdpAddr-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/RsdpAddr-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..b6949db9
--- /dev/null
+++ b/test-data/efivars-1/RsdpAddr-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/SIDSUPPORT-7d3dceee-cbce-4ea7-8709-6e552f1edbde b/test-data/efivars-1/SIDSUPPORT-7d3dceee-cbce-4ea7-8709-6e552f1edbde
new file mode 100644
index 00000000..a652cc86
--- /dev/null
+++ b/test-data/efivars-1/SIDSUPPORT-7d3dceee-cbce-4ea7-8709-6e552f1edbde
Binary files differ
diff --git a/test-data/efivars-1/SbatLevel-605dab50-e046-4300-abb6-3dd810dd8b23 b/test-data/efivars-1/SbatLevel-605dab50-e046-4300-abb6-3dd810dd8b23
new file mode 100644
index 00000000..8a889d31
--- /dev/null
+++ b/test-data/efivars-1/SbatLevel-605dab50-e046-4300-abb6-3dd810dd8b23
Binary files differ
diff --git a/test-data/efivars-1/SbatLevelRT-605dab50-e046-4300-abb6-3dd810dd8b23 b/test-data/efivars-1/SbatLevelRT-605dab50-e046-4300-abb6-3dd810dd8b23
new file mode 100644
index 00000000..29c9a9b7
--- /dev/null
+++ b/test-data/efivars-1/SbatLevelRT-605dab50-e046-4300-abb6-3dd810dd8b23
Binary files differ
diff --git a/test-data/efivars-1/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..687e5611
--- /dev/null
+++ b/test-data/efivars-1/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/SecureBootSetup-7b59104a-c00d-4158-87ff-f04d6396a915 b/test-data/efivars-1/SecureBootSetup-7b59104a-c00d-4158-87ff-f04d6396a915
new file mode 100644
index 00000000..65869b98
--- /dev/null
+++ b/test-data/efivars-1/SecureBootSetup-7b59104a-c00d-4158-87ff-f04d6396a915
Binary files differ
diff --git a/test-data/efivars-1/Setup-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/Setup-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..8c8e7c37
--- /dev/null
+++ b/test-data/efivars-1/Setup-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/SetupLedData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/SetupLedData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..4c6a2858
--- /dev/null
+++ b/test-data/efivars-1/SetupLedData-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/SetupMode-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/SetupMode-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..39e28582
--- /dev/null
+++ b/test-data/efivars-1/SetupMode-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/SignatureSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/SignatureSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..c71572cf
--- /dev/null
+++ b/test-data/efivars-1/SignatureSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/SmbiosEntryPointTable-4b3082a3-80c6-4d7e-9cd0-583917265df1 b/test-data/efivars-1/SmbiosEntryPointTable-4b3082a3-80c6-4d7e-9cd0-583917265df1
new file mode 100644
index 00000000..58fad41d
--- /dev/null
+++ b/test-data/efivars-1/SmbiosEntryPointTable-4b3082a3-80c6-4d7e-9cd0-583917265df1
Binary files differ
diff --git a/test-data/efivars-1/SmbiosScratchBuffer-4b3082a3-80c6-4d7e-9cd0-583917265df1 b/test-data/efivars-1/SmbiosScratchBuffer-4b3082a3-80c6-4d7e-9cd0-583917265df1
new file mode 100644
index 00000000..7b65c3a6
--- /dev/null
+++ b/test-data/efivars-1/SmbiosScratchBuffer-4b3082a3-80c6-4d7e-9cd0-583917265df1
Binary files differ
diff --git a/test-data/efivars-1/SmbiosV3EntryPointTable-4b3082a3-80c6-4d7e-9cd0-583917265df1 b/test-data/efivars-1/SmbiosV3EntryPointTable-4b3082a3-80c6-4d7e-9cd0-583917265df1
new file mode 100644
index 00000000..43056920
--- /dev/null
+++ b/test-data/efivars-1/SmbiosV3EntryPointTable-4b3082a3-80c6-4d7e-9cd0-583917265df1
Binary files differ
diff --git a/test-data/efivars-1/StdDefaults-4599d26f-1a11-49b8-b91f-858745cff824 b/test-data/efivars-1/StdDefaults-4599d26f-1a11-49b8-b91f-858745cff824
new file mode 100644
index 00000000..da3d726a
--- /dev/null
+++ b/test-data/efivars-1/StdDefaults-4599d26f-1a11-49b8-b91f-858745cff824
Binary files differ
diff --git a/test-data/efivars-1/TPMPERBIOSFLAGS-7d3dceee-cbce-4ea7-8709-6e552f1edbde b/test-data/efivars-1/TPMPERBIOSFLAGS-7d3dceee-cbce-4ea7-8709-6e552f1edbde
new file mode 100644
index 00000000..60e62642
--- /dev/null
+++ b/test-data/efivars-1/TPMPERBIOSFLAGS-7d3dceee-cbce-4ea7-8709-6e552f1edbde
Binary files differ
diff --git a/test-data/efivars-1/Timeout-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/Timeout-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..60f8feb8
--- /dev/null
+++ b/test-data/efivars-1/Timeout-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/TotalNumberOfRootBridges-fb5703f5-f8a7-f401-18b4-3f108deb2612 b/test-data/efivars-1/TotalNumberOfRootBridges-fb5703f5-f8a7-f401-18b4-3f108deb2612
new file mode 100644
index 00000000..ba508349
--- /dev/null
+++ b/test-data/efivars-1/TotalNumberOfRootBridges-fb5703f5-f8a7-f401-18b4-3f108deb2612
Binary files differ
diff --git a/test-data/efivars-1/TpmServFlags-7d3dceee-cbce-4ea7-8709-6e552f1edbde b/test-data/efivars-1/TpmServFlags-7d3dceee-cbce-4ea7-8709-6e552f1edbde
new file mode 100644
index 00000000..c40690de
--- /dev/null
+++ b/test-data/efivars-1/TpmServFlags-7d3dceee-cbce-4ea7-8709-6e552f1edbde
Binary files differ
diff --git a/test-data/efivars-1/UsbSupport-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9 b/test-data/efivars-1/UsbSupport-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
new file mode 100644
index 00000000..8b3fa282
--- /dev/null
+++ b/test-data/efivars-1/UsbSupport-ec87d643-eba4-4bb5-a1e5-3f3e36b20da9
Binary files differ
diff --git a/test-data/efivars-1/VARSTORE_OCMR_SETTINGS_NAME-c05fba7d-7a92-49e0-bcee-233b14dca803 b/test-data/efivars-1/VARSTORE_OCMR_SETTINGS_NAME-c05fba7d-7a92-49e0-bcee-233b14dca803
new file mode 100644
index 00000000..bec6d587
--- /dev/null
+++ b/test-data/efivars-1/VARSTORE_OCMR_SETTINGS_NAME-c05fba7d-7a92-49e0-bcee-233b14dca803
Binary files differ
diff --git a/test-data/efivars-1/VendorKeys-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/VendorKeys-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..39e28582
--- /dev/null
+++ b/test-data/efivars-1/VendorKeys-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/WpBufAddr-cba83c4a-a5fc-48a8-b3a6-d33636166544 b/test-data/efivars-1/WpBufAddr-cba83c4a-a5fc-48a8-b3a6-d33636166544
new file mode 100644
index 00000000..c2632ec0
--- /dev/null
+++ b/test-data/efivars-1/WpBufAddr-cba83c4a-a5fc-48a8-b3a6-d33636166544
Binary files differ
diff --git a/test-data/efivars-1/WriteOnceStatus-4b3082a3-80c6-4d7e-9cd0-583917265df1 b/test-data/efivars-1/WriteOnceStatus-4b3082a3-80c6-4d7e-9cd0-583917265df1
new file mode 100644
index 00000000..65648ca3
--- /dev/null
+++ b/test-data/efivars-1/WriteOnceStatus-4b3082a3-80c6-4d7e-9cd0-583917265df1
Binary files differ
diff --git a/test-data/efivars-1/db-d719b2cb-3d3a-4596-a3bc-dad00e67656f b/test-data/efivars-1/db-d719b2cb-3d3a-4596-a3bc-dad00e67656f
new file mode 100644
index 00000000..794e2236
--- /dev/null
+++ b/test-data/efivars-1/db-d719b2cb-3d3a-4596-a3bc-dad00e67656f
Binary files differ
diff --git a/test-data/efivars-1/dbDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/dbDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..caa92886
--- /dev/null
+++ b/test-data/efivars-1/dbDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-data/efivars-1/dbx-d719b2cb-3d3a-4596-a3bc-dad00e67656f b/test-data/efivars-1/dbx-d719b2cb-3d3a-4596-a3bc-dad00e67656f
new file mode 100644
index 00000000..7fe70233
--- /dev/null
+++ b/test-data/efivars-1/dbx-d719b2cb-3d3a-4596-a3bc-dad00e67656f
Binary files differ
diff --git a/test-data/efivars-1/dbxDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c b/test-data/efivars-1/dbxDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
new file mode 100644
index 00000000..b747b47c
--- /dev/null
+++ b/test-data/efivars-1/dbxDefault-8be4df61-93ca-11d2-aa0d-00e098032b8c
Binary files differ
diff --git a/test-mock-variables.c b/test-mock-variables.c
new file mode 100644
index 00000000..5ea5a981
--- /dev/null
+++ b/test-mock-variables.c
@@ -0,0 +1,421 @@
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+/*
+ * test-mock-variables.c - test our mock variable implementation (irony)
+ * Copyright Peter Jones <pjones@redhat.com>
+ */
+
+#include "shim.h"
+#include "mock-variables.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "test-data-efivars-0.h"
+
+#pragma GCC diagnostic ignored "-Wunused-label"
+
+void mock_print_guidname(EFI_GUID *guid, CHAR16 *name);
+void mock_print_var_list(list_t *head);
+
+static int
+test_filter_out_helper(size_t nvars, const CHAR16 *varnames[nvars],
+ bool filter_out, UINTN expected_count)
+{
+ const char *mok_rt_vars[n_mok_state_variables];
+ EFI_STATUS status;
+ EFI_GUID guid = SHIM_LOCK_GUID;
+ CHAR16 name[1024] = L"";
+ UINTN sz;
+ char asciiname[1024];
+ bool found = false;
+ int ret = 0;
+ UINTN count = 0;
+
+ for (size_t i = 0; i < n_mok_state_variables; i++) {
+ mok_rt_vars[i] = mok_state_variables[i].rtname8;
+ }
+
+ sz = sizeof(name);
+ status = RT->GetNextVariableName(&sz, name, &guid);
+ assert_equal_return(status, EFI_NOT_FOUND, -1, "got %lx, expected %lx");
+
+ mock_load_variables("test-data/efivars-1", mok_rt_vars, filter_out);
+
+ while (true) {
+ int rc = 0;
+
+ sz = sizeof(name);
+ status = RT->GetNextVariableName(&sz, name, &guid);
+ if (status == EFI_NOT_FOUND)
+ break;
+ if (EFI_ERROR(status))
+ return -1;
+
+ count += 1;
+ SetMem(asciiname, sizeof(asciiname), 0);
+ for (UINTN i = 0; i < sizeof(asciiname); i++)
+ asciiname[i] = name[i];
+ for (UINTN i = 0; varnames[i] != NULL; i++) {
+ if (sz == 0 || StrLen(varnames[i]) != sz-1)
+ continue;
+ if (StrCmp(name, varnames[i]) == 0) {
+ found = true;
+ if (filter_out) {
+ rc = assert_false_as_expr(found, -1,
+ "found=%u for undesired variable \"%s\"\n",
+ asciiname);
+ break;
+ }
+ }
+ }
+ if (!filter_out)
+ rc = assert_true_as_expr(found, -1,
+ "found=%u for undesired variable \"%s\"\n",
+ asciiname);
+ if (ret >= 0 && rc < 0)
+ ret = rc;
+ }
+
+ mock_reset_variables();
+ assert_equal_return(count, expected_count, -1, "%lu != %lu\n");
+ assert_true_return(list_empty(&mock_variables), -1, "%lu != %lu\n");
+
+ return ret;
+}
+
+static int
+test_filter_out_true(void)
+{
+ const CHAR16 *varnames[] = {
+ L"MokListRT",
+ L"MokListXRT",
+ L"SbatLevelRT",
+ NULL
+ };
+ size_t nvars = sizeof(varnames) / sizeof(varnames[0]);
+
+ return test_filter_out_helper(nvars, varnames, true, 3);
+}
+
+static int
+test_filter_out_false(void)
+{
+ const CHAR16 *varnames[] = {
+ L"MokListRT",
+ L"MokListXRT",
+ L"SbatLevelRT",
+ NULL
+ };
+ size_t nvars = sizeof(varnames) / sizeof(varnames[0]);
+
+ return test_filter_out_helper(nvars, varnames, false, 3);
+}
+
+static int
+test_gnvn_buf_size_0(void)
+{
+ UINTN size = 0;
+ CHAR16 buf[6] = { 0, };
+ EFI_STATUS status;
+ EFI_GUID empty_guid = { 0, };
+ int ret = -1;
+
+ status = RT->GetNextVariableName(&size, &buf[0], &GV_GUID);
+ assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "0x%lx != 0x%lx\n");
+
+ size = 1;
+ status = RT->GetNextVariableName(&size, &buf[0], &GV_GUID);
+ assert_equal_return(status, EFI_NOT_FOUND, -1, "0x%lx != 0x%lx\n");
+
+ status = RT->SetVariable(L"test", &GV_GUID,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS, 5, "test");
+ assert_equal_return(status, EFI_SUCCESS, -1, "0x%lx != 0x%lx\n");
+
+ size = 1;
+ status = RT->GetNextVariableName(&size, &buf[0], &empty_guid);
+ assert_equal_goto(status, EFI_NOT_FOUND, err, "0x%lx != 0x%lx\n");
+
+ size = 1;
+ status = RT->GetNextVariableName(&size, &buf[0], &GV_GUID);
+ assert_equal_goto(status, EFI_BUFFER_TOO_SMALL, err, "0x%lx != 0x%lx\n");
+ assert_equal_goto(size, StrSize(L"test"), err, "%zu != %zu\n");
+
+ size = StrSize(L"test");
+ status = RT->GetNextVariableName(&size, &buf[0], &GV_GUID);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+
+ status = RT->SetVariable(L"testa", &GV_GUID,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS, 5, "test");
+ assert_equal_return(status, EFI_SUCCESS, -1, "0x%lx != 0x%lx\n");
+
+ buf[0] = 0;
+ size = 1;
+ status = RT->GetNextVariableName(&size, &buf[0], &empty_guid);
+ assert_equal_goto(status, EFI_NOT_FOUND, err, "0x%lx != 0x%lx\n");
+
+ size = StrSize(L"test");
+ StrCpy(buf, L"test");
+ status = RT->GetNextVariableName(&size, &buf[0], &GV_GUID);
+ switch (mock_variable_sort_policy) {
+ case MOCK_SORT_DESCENDING:
+ case MOCK_SORT_PREPEND:
+ assert_equal_goto(status, EFI_NOT_FOUND, err, "0x%lx != 0x%lx\n");
+ break;
+ case MOCK_SORT_APPEND:
+ case MOCK_SORT_ASCENDING:
+ assert_equal_goto(status, EFI_BUFFER_TOO_SMALL, err, "0x%lx != 0x%lx\n");
+ break;
+ default:
+ break;
+ }
+
+ size = StrSize(L"testa");
+ StrCpy(buf, L"test");
+ status = RT->GetNextVariableName(&size, &buf[0], &GV_GUID);
+ switch (mock_variable_sort_policy) {
+ case MOCK_SORT_DESCENDING:
+ case MOCK_SORT_PREPEND:
+ assert_equal_goto(status, EFI_NOT_FOUND, err, "0x%lx != 0x%lx\n");
+ break;
+ case MOCK_SORT_APPEND:
+ case MOCK_SORT_ASCENDING:
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+ break;
+ default:
+ break;
+ }
+
+ ret = 0;
+err:
+ mock_reset_variables();
+ return ret;
+}
+
+static int
+test_gnvn_helper(char *testvars)
+{
+ UINTN size = 0;
+ CHAR16 buf[8192] = { 0, };
+ EFI_STATUS status;
+ EFI_GUID empty_guid = { 0, };
+ int ret = -1;
+ const char *mok_rt_vars[n_mok_state_variables];
+
+ for (size_t i = 0; i < n_mok_state_variables; i++) {
+ mok_rt_vars[i] = mok_state_variables[i].rtname8;
+ }
+
+ mock_load_variables(testvars, mok_rt_vars, true);
+
+ size = sizeof(buf);
+ buf[0] = L'\0';
+ status = RT->GetNextVariableName(&size, buf, &GV_GUID);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+
+#if defined(SHIM_DEBUG) && SHIM_DEBUG != 0
+ dump_mock_variables(__FILE__, __LINE__, __func__);
+#endif
+ switch (mock_variable_sort_policy) {
+ case MOCK_SORT_DESCENDING:
+ dump_mock_variables_if_wrong(__FILE__, __LINE__, __func__,
+ &GV_GUID, L"dbxDefault");
+ assert_zero_goto(StrCmp(buf, L"dbxDefault"), err, "0x%lx != 0x%lx\n");
+ break;
+ case MOCK_SORT_ASCENDING:
+ dump_mock_variables_if_wrong(__FILE__, __LINE__, __func__,
+ &GV_GUID, L"Boot0000");
+ assert_zero_goto(StrCmp(buf, L"Boot0000"), err, "0x%lx != 0x%lx buf:\"%s\"\n",
+ 0, Str2str(buf));
+ break;
+ default:
+ break;
+ }
+
+ size = sizeof(buf);
+ buf[0] = 0;
+ status = RT->GetNextVariableName(&size, buf, &EFI_SECURE_BOOT_DB_GUID);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+ switch (mock_variable_sort_policy) {
+ case MOCK_SORT_DESCENDING:
+ assert_zero_goto(StrCmp(buf, L"dbx"), err, "0x%lx != 0x%lx\n");
+ break;
+ case MOCK_SORT_ASCENDING:
+ assert_zero_goto(StrCmp(buf, L"db"), err, "0x%lx != 0x%lx\n");
+ break;
+ default:
+ break;
+ }
+
+ ret = 0;
+err:
+ if (ret)
+ mock_print_var_list(&mock_variables);
+ mock_reset_variables();
+ return ret;
+}
+
+static int
+test_gnvn_0(void)
+{
+ return test_gnvn_helper("test-data/efivars-0");
+}
+
+static int
+test_gnvn_1(void)
+{
+ return test_gnvn_helper("test-data/efivars-1");
+}
+
+static int
+test_get_variable_0(void)
+{
+ UINTN size = 0;
+ uint8_t buf[8192] = { 0, };
+ EFI_STATUS status;
+ EFI_GUID empty_guid = { 0, };
+ UINT32 attrs = 0;
+ int ret = -1;
+ int cmp;
+ const char *mok_rt_vars[n_mok_state_variables];
+
+ for (size_t i = 0; i < n_mok_state_variables; i++) {
+ mok_rt_vars[i] = mok_state_variables[i].rtname8;
+ }
+
+ mock_load_variables("test-data/efivars-1", mok_rt_vars, true);
+
+ size = 0;
+ status = RT->GetVariable(L"Boot0000", &GV_GUID, &attrs, &size, buf);
+ assert_equal_goto(status, EFI_BUFFER_TOO_SMALL, err, "0x%lx != 0x%lx\n");
+
+ size = sizeof(buf);
+ status = RT->GetVariable(L"Boot0000", &GV_GUID, &attrs, &size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+ assert_equal_goto(size, sizeof(test_data_efivars_0_Boot0000), err, "%zu != %zu\n");
+ assert_zero_goto(memcmp(buf, test_data_efivars_0_Boot0000, size), err, "%zu != %zu\n");
+
+ ret = 0;
+err:
+ if (ret)
+ mock_print_var_list(&mock_variables);
+ mock_reset_variables();
+ return ret;
+}
+
+static int
+test_set_variable_0(void)
+{
+ UINTN size = 0;
+ uint8_t buf[8192] = { 0, };
+ EFI_STATUS status;
+ EFI_GUID empty_guid = { 0, };
+ UINT32 attrs = 0;
+ int ret = -1;
+ UINT32 bs_rt_nv = EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS |
+ EFI_VARIABLE_NON_VOLATILE;
+
+ size = 4;
+ strcpy(buf, "foo");
+ status = RT->SetVariable(L"tmp", &GV_GUID, bs_rt_nv, size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+
+ size = sizeof(buf);
+ SetMem(buf, sizeof(buf), 0);
+ status = RT->GetVariable(L"tmp", &GV_GUID, &attrs, &size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+ assert_equal_goto(size, 4, err, "%zu != %zu\n");
+ assert_zero_goto(memcmp(buf, "foo", 4), err, "0x%lx != 0x%lx\n");
+
+ size = 5;
+ strcpy(buf, "bang");
+ status = RT->SetVariable(L"tmp", &GV_GUID,
+ EFI_VARIABLE_NON_VOLATILE |
+ EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS,
+ size, buf);
+ size = sizeof(buf);
+ SetMem(buf, sizeof(buf), 0);
+ status = RT->GetVariable(L"tmp", &GV_GUID, &attrs, &size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+ assert_equal_goto(size, 5, err, "%zu != %zu\n");
+ assert_zero_goto(memcmp(buf, "bang", 5), err, "%d != %d\n");
+
+ size = 5;
+ strcpy(buf, "foop");
+ status = RT->SetVariable(L"tmp", &GV_GUID, bs_rt_nv, size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+
+ size = sizeof(buf);
+ SetMem(buf, sizeof(buf), 0);
+ status = RT->GetVariable(L"tmp", &GV_GUID, &attrs, &size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+ assert_equal_goto(size, 5, err, "%zu != %zu\n");
+ assert_zero_goto(memcmp(buf, "foop", 5), err, "%d != %d\n");
+
+ size = 0;
+ strcpy(buf, "");
+ status = RT->SetVariable(L"tmp", &GV_GUID, bs_rt_nv | EFI_VARIABLE_APPEND_WRITE, size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+
+ size = sizeof(buf);
+ SetMem(buf, sizeof(buf), 0);
+ status = RT->GetVariable(L"tmp", &GV_GUID, &attrs, &size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+ assert_equal_goto(size, 5, err, "%zu != %zu\n");
+ assert_zero_goto(memcmp(buf, "foop", 5), err, "%d != %d\n");
+
+ size = 5;
+ strcpy(buf, "poof");
+ status = RT->SetVariable(L"tmp", &GV_GUID, bs_rt_nv | EFI_VARIABLE_APPEND_WRITE, size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+
+ size = sizeof(buf);
+ SetMem(buf, sizeof(buf), 0);
+ status = RT->GetVariable(L"tmp", &GV_GUID, &attrs, &size, buf);
+ assert_equal_goto(status, EFI_SUCCESS, err, "0x%lx != 0x%lx\n");
+ assert_equal_goto(size, 10, err, "%zu != %zu\n");
+ assert_zero_goto(memcmp(buf, "foop\0poof", 10), err, "%d != %d\n");
+ ret = 0;
+err:
+ if (ret)
+ mock_print_var_list(&mock_variables);
+ mock_reset_variables();
+ return ret;
+}
+
+int
+main(void)
+{
+ int status = 0;
+ setbuf(stdout, NULL);
+
+ const char *policies[] = {
+ "MOCK_SORT_DESCENDING",
+ "MOCK_SORT_PREPEND",
+ "MOCK_SORT_APPEND",
+ "MOCK_SORT_ASCENDING",
+ "MOCK_SORT_MAX_SENTINEL"
+ };
+
+ test(test_filter_out_true);
+ test(test_filter_out_false);
+
+ for (int i = 0; i < MOCK_SORT_MAX_SENTINEL; i++) {
+ mock_variable_sort_policy = i;
+ printf("%s: setting variable sort policy to %s\n",
+ program_invocation_short_name, policies[i]);
+
+ test(test_gnvn_buf_size_0);
+ test(test_gnvn_0);
+ test(test_gnvn_1);
+ }
+
+ test(test_get_variable_0);
+ test(test_set_variable_0);
+ return status;
+}
+
+// vim:fenc=utf-8:tw=75:noet
diff --git a/test.c b/test.c
index 8a4a72ff..46cab533 100644
--- a/test.c
+++ b/test.c
@@ -259,4 +259,12 @@ console_print(const CHAR16 *fmt, ...)
return 0;
}
+#ifndef HAVE_START_IMAGE
+EFI_STATUS
+start_image(EFI_HANDLE image_handle, CHAR16 *ImagePath)
+{
+ return EFI_UNSUPPORTED;
+}
+#endif
+
// vim:fenc=utf-8:tw=75:noet