| /** @file | |
| Unit tests of the implementation of SecureBootVariableLib. | |
| Copyright (C) Microsoft Corporation. | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <stdarg.h> | |
| #include <stddef.h> | |
| #include <setjmp.h> | |
| #include <cmocka.h> | |
| #include <Uefi.h> | |
| #include <UefiSecureBoot.h> | |
| #include <Guid/GlobalVariable.h> | |
| #include <Guid/AuthenticatedVariableFormat.h> | |
| #include <Guid/ImageAuthentication.h> | |
| #include <Library/BaseLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| #include <Library/UnitTestLib.h> | |
| #include <Library/SecureBootVariableLib.h> | |
| #define UNIT_TEST_APP_NAME "SecureBootVariableLib Unit Tests" | |
| #define UNIT_TEST_APP_VERSION "1.0" | |
| #define VAR_AUTH_DESC_SIZE OFFSET_OF (EFI_VARIABLE_AUTHENTICATION_2, AuthInfo) + OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData) | |
| extern EFI_TIME mMaxTimestamp; | |
| extern EFI_TIME mDefaultPayloadTimestamp; | |
| /** | |
| Sets the value of a variable. | |
| @param[in] VariableName A Null-terminated string that is the name of the vendor's variable. | |
| Each VariableName is unique for each VendorGuid. VariableName must | |
| contain 1 or more characters. If VariableName is an empty string, | |
| then EFI_INVALID_PARAMETER is returned. | |
| @param[in] VendorGuid A unique identifier for the vendor. | |
| @param[in] Attributes Attributes bitmask to set for the variable. | |
| @param[in] DataSize The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE or | |
| EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero | |
| causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is | |
| set, then a SetVariable() call with a DataSize of zero will not cause any change to | |
| the variable value (the timestamp associated with the variable may be updated however | |
| even if no new data value is provided,see the description of the | |
| EFI_VARIABLE_AUTHENTICATION_2 descriptor below. In this case the DataSize will not | |
| be zero since the EFI_VARIABLE_AUTHENTICATION_2 descriptor will be populated). | |
| @param[in] Data The contents for the variable. | |
| @retval EFI_SUCCESS The firmware has successfully stored the variable and its data as | |
| defined by the Attributes. | |
| @retval EFI_INVALID_PARAMETER An invalid combination of attribute bits, name, and GUID was supplied, or the | |
| DataSize exceeds the maximum allowed. | |
| @retval EFI_INVALID_PARAMETER VariableName is an empty string. | |
| @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data. | |
| @retval EFI_DEVICE_ERROR The variable could not be retrieved due to a hardware error. | |
| @retval EFI_WRITE_PROTECTED The variable in question is read-only. | |
| @retval EFI_WRITE_PROTECTED The variable in question cannot be deleted. | |
| @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS being set, | |
| but the AuthInfo does NOT pass the validation check carried out by the firmware. | |
| @retval EFI_NOT_FOUND The variable trying to be updated or deleted was not found. | |
| **/ | |
| STATIC | |
| EFI_STATUS | |
| EFIAPI | |
| MockSetVariable ( | |
| IN CHAR16 *VariableName, | |
| IN EFI_GUID *VendorGuid, | |
| IN UINT32 Attributes, | |
| IN UINTN DataSize, | |
| IN VOID *Data | |
| ) | |
| { | |
| DEBUG (( | |
| DEBUG_INFO, | |
| "%a %s %g %x %x %p\n", | |
| __func__, | |
| VariableName, | |
| VendorGuid, | |
| Attributes, | |
| DataSize, | |
| Data | |
| )); | |
| check_expected_ptr (VariableName); | |
| check_expected_ptr (VendorGuid); | |
| check_expected_ptr (Attributes); | |
| check_expected (DataSize); | |
| check_expected (Data); | |
| return (EFI_STATUS)mock (); | |
| } | |
| /** | |
| Returns the value of a variable. | |
| @param[in] VariableName A Null-terminated string that is the name of the vendor's | |
| variable. | |
| @param[in] VendorGuid A unique identifier for the vendor. | |
| @param[out] Attributes If not NULL, a pointer to the memory location to return the | |
| attributes bitmask for the variable. | |
| @param[in, out] DataSize On input, the size in bytes of the return Data buffer. | |
| On output the size of data returned in Data. | |
| @param[out] Data The buffer to return the contents of the variable. May be NULL | |
| with a zero DataSize in order to determine the size buffer needed. | |
| @retval EFI_SUCCESS The function completed successfully. | |
| @retval EFI_NOT_FOUND The variable was not found. | |
| @retval EFI_BUFFER_TOO_SMALL The DataSize is too small for the result. | |
| @retval EFI_INVALID_PARAMETER VariableName is NULL. | |
| @retval EFI_INVALID_PARAMETER VendorGuid is NULL. | |
| @retval EFI_INVALID_PARAMETER DataSize is NULL. | |
| @retval EFI_INVALID_PARAMETER The DataSize is not too small and Data is NULL. | |
| @retval EFI_DEVICE_ERROR The variable could not be retrieved due to a hardware error. | |
| @retval EFI_SECURITY_VIOLATION The variable could not be retrieved due to an authentication failure. | |
| **/ | |
| STATIC | |
| EFI_STATUS | |
| EFIAPI | |
| MockGetVariable ( | |
| IN CHAR16 *VariableName, | |
| IN EFI_GUID *VendorGuid, | |
| OUT UINT32 *Attributes OPTIONAL, | |
| IN OUT UINTN *DataSize, | |
| OUT VOID *Data OPTIONAL | |
| ) | |
| { | |
| UINTN TargetSize; | |
| BOOLEAN Exist; | |
| DEBUG (( | |
| DEBUG_INFO, | |
| "%a %s %g %p %x %p\n", | |
| __func__, | |
| VariableName, | |
| VendorGuid, | |
| Attributes, | |
| *DataSize, | |
| Data | |
| )); | |
| assert_non_null (DataSize); | |
| check_expected_ptr (VariableName); | |
| check_expected_ptr (VendorGuid); | |
| check_expected (*DataSize); | |
| Exist = (BOOLEAN)mock (); | |
| if (!Exist) { | |
| return EFI_NOT_FOUND; | |
| } | |
| TargetSize = (UINTN)mock (); | |
| if (TargetSize > *DataSize) { | |
| *DataSize = TargetSize; | |
| return EFI_BUFFER_TOO_SMALL; | |
| } else { | |
| assert_non_null (Data); | |
| CopyMem (Data, (VOID *)(UINTN)mock (), TargetSize); | |
| } | |
| return EFI_SUCCESS; | |
| } | |
| /// | |
| /// Mock version of the UEFI Runtime Services Table | |
| /// | |
| EFI_RUNTIME_SERVICES gMockRuntime = { | |
| { | |
| EFI_RUNTIME_SERVICES_SIGNATURE, // Signature | |
| EFI_RUNTIME_SERVICES_REVISION, // Revision | |
| sizeof (EFI_RUNTIME_SERVICES), // HeaderSize | |
| 0, // CRC32 | |
| 0 // Reserved | |
| }, | |
| NULL, // GetTime | |
| NULL, // SetTime | |
| NULL, // GetWakeupTime | |
| NULL, // SetWakeupTime | |
| NULL, // SetVirtualAddressMap | |
| NULL, // ConvertPointer | |
| MockGetVariable, // GetVariable | |
| NULL, // GetNextVariableName | |
| MockSetVariable, // SetVariable | |
| NULL, // GetNextHighMonotonicCount | |
| NULL, // ResetSystem | |
| NULL, // UpdateCapsule | |
| NULL, // QueryCapsuleCapabilities | |
| NULL // QueryVariableInfo | |
| }; | |
| /** | |
| Unit test for SetSecureBootMode () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SetSecureBootModeShouldSetVar ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| UINT8 SecureBootMode; | |
| EFI_STATUS Status; | |
| SecureBootMode = 0xAB; // Any random magic number... | |
| expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, sizeof (SecureBootMode)); | |
| expect_memory (MockSetVariable, Data, &SecureBootMode, sizeof (SecureBootMode)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = SetSecureBootMode (SecureBootMode); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for GetSetupMode () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| GetSetupModeShouldGetVar ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 TargetMode; | |
| UINT8 SetupMode; | |
| TargetMode = 0xAB; // Any random magic number... | |
| expect_memory (MockGetVariable, VariableName, EFI_SETUP_MODE_NAME, sizeof (EFI_SETUP_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (SetupMode)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (SetupMode)); | |
| will_return (MockGetVariable, &TargetMode); | |
| Status = GetSetupMode (&SetupMode); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (SetupMode, TargetMode); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for GetSetupMode () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| IsSecureBootEnableShouldGetVar ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| BOOLEAN Enabled; | |
| UINT8 TargetMode; | |
| TargetMode = SECURE_BOOT_MODE_ENABLE; | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (TargetMode)); | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (TargetMode)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (TargetMode)); | |
| will_return (MockGetVariable, &TargetMode); | |
| Enabled = IsSecureBootEnabled (); | |
| UT_ASSERT_EQUAL (Enabled, SECURE_BOOT_MODE_ENABLE); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SecureBootCreateDataFromInput () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SecureBootCreateDataFromInputSimple ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_SIGNATURE_LIST *SigList = NULL; | |
| EFI_SIGNATURE_DATA *SigData = NULL; | |
| UINTN SigListSize = 0; | |
| EFI_STATUS Status; | |
| UINT8 TestData[] = { 0 }; | |
| SECURE_BOOT_CERTIFICATE_INFO KeyInfo; | |
| KeyInfo.Data = TestData; | |
| KeyInfo.DataSize = sizeof (TestData); | |
| Status = SecureBootCreateDataFromInput (&SigListSize, &SigList, 1, &KeyInfo); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_NOT_NULL (SigList); | |
| UT_ASSERT_TRUE (CompareGuid (&SigList->SignatureType, &gEfiCertX509Guid)); | |
| UT_ASSERT_EQUAL (SigList->SignatureSize, sizeof (EFI_SIGNATURE_DATA) - 1 + sizeof (TestData)); | |
| UT_ASSERT_EQUAL (SigList->SignatureHeaderSize, 0); | |
| UT_ASSERT_EQUAL (SigList->SignatureListSize, sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_SIGNATURE_DATA) - 1 + sizeof (TestData)); | |
| UT_ASSERT_EQUAL (SigList->SignatureListSize, SigListSize); | |
| SigData = (EFI_SIGNATURE_DATA *)((UINTN)SigList + sizeof (EFI_SIGNATURE_LIST)); | |
| UT_ASSERT_TRUE (CompareGuid (&SigData->SignatureOwner, &gEfiGlobalVariableGuid)); | |
| UT_ASSERT_MEM_EQUAL (SigData->SignatureData, TestData, sizeof (TestData)); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SecureBootCreateDataFromInput () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SecureBootCreateDataFromInputNull ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_SIGNATURE_LIST *SigList = NULL; | |
| UINTN SigListSize = 0; | |
| EFI_STATUS Status; | |
| SECURE_BOOT_CERTIFICATE_INFO KeyInfo = { | |
| .Data = NULL, | |
| .DataSize = 0 | |
| }; | |
| Status = SecureBootCreateDataFromInput (&SigListSize, &SigList, 0, NULL); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER); | |
| Status = SecureBootCreateDataFromInput (&SigListSize, &SigList, 1, &KeyInfo); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_NOT_FOUND); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SecureBootCreateDataFromInput () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SecureBootCreateDataFromInputMultiple ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_SIGNATURE_LIST *SigList = NULL; | |
| EFI_SIGNATURE_DATA *SigData = NULL; | |
| UINTN SigListSize = 0; | |
| UINTN TotalSize = 0; | |
| UINTN Index = 0; | |
| UINT8 TestData1[] = { 0 }; | |
| UINT8 TestData2[] = { 1, 2 }; | |
| EFI_STATUS Status; | |
| SECURE_BOOT_CERTIFICATE_INFO KeyInfo[2]; | |
| KeyInfo[0].Data = TestData1; | |
| KeyInfo[0].DataSize = sizeof (TestData1); | |
| KeyInfo[1].Data = TestData2; | |
| KeyInfo[1].DataSize = sizeof (TestData2); | |
| Status = SecureBootCreateDataFromInput (&SigListSize, &SigList, 2, KeyInfo); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_NOT_NULL (SigList); | |
| for (Index = 0; Index < 2; Index++) { | |
| UT_ASSERT_TRUE (SigListSize > TotalSize); | |
| UT_ASSERT_TRUE (CompareGuid (&SigList->SignatureType, &gEfiCertX509Guid)); | |
| UT_ASSERT_EQUAL (SigList->SignatureSize, sizeof (EFI_SIGNATURE_DATA) - 1 + KeyInfo[Index].DataSize); | |
| UT_ASSERT_EQUAL (SigList->SignatureHeaderSize, 0); | |
| UT_ASSERT_EQUAL (SigList->SignatureListSize, sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_SIGNATURE_DATA) - 1 + KeyInfo[Index].DataSize); | |
| SigData = (EFI_SIGNATURE_DATA *)((UINTN)SigList + sizeof (EFI_SIGNATURE_LIST)); | |
| UT_ASSERT_TRUE (CompareGuid (&SigData->SignatureOwner, &gEfiGlobalVariableGuid)); | |
| UT_ASSERT_MEM_EQUAL (SigData->SignatureData, KeyInfo[Index].Data, KeyInfo[Index].DataSize); | |
| TotalSize = TotalSize + SigList->SignatureListSize; | |
| SigList = (EFI_SIGNATURE_LIST *)((UINTN)SigList + SigList->SignatureListSize); | |
| } | |
| UT_ASSERT_EQUAL (SigListSize, TotalSize); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for CreateTimeBasedPayload () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| CreateTimeBasedPayloadShouldPopulateDescriptor ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| UINT8 Data[] = { 2 }; | |
| UINTN DataSize = sizeof (Data); | |
| UINT8 *CheckData; | |
| EFI_VARIABLE_AUTHENTICATION_2 *VarAuth; | |
| EFI_STATUS Status; | |
| EFI_TIME Time = { | |
| .Year = 2012, | |
| .Month = 3, | |
| .Day = 4, | |
| .Hour = 5, | |
| .Minute = 6, | |
| .Second = 7, | |
| .Pad1 = 0, | |
| .Nanosecond = 8910, | |
| .TimeZone = 1112, | |
| .Pad2 = 0 | |
| }; | |
| CheckData = AllocateCopyPool (DataSize, Data); | |
| Status = CreateTimeBasedPayload (&DataSize, &CheckData, &Time); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| // This is result that we did not pack this structure... | |
| // we cannot even use the sizeof (EFI_VARIABLE_AUTHENTICATION_2) - 1, | |
| // because the structure is not at the end of this structure, but partially | |
| // inside it... | |
| UT_ASSERT_EQUAL (DataSize, VAR_AUTH_DESC_SIZE + sizeof (Data)); | |
| UT_ASSERT_NOT_NULL (CheckData); | |
| VarAuth = (EFI_VARIABLE_AUTHENTICATION_2 *)CheckData; | |
| UT_ASSERT_MEM_EQUAL (&(VarAuth->TimeStamp), &Time, sizeof (EFI_TIME)); | |
| UT_ASSERT_EQUAL (VarAuth->AuthInfo.Hdr.dwLength, OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData)); | |
| UT_ASSERT_EQUAL (VarAuth->AuthInfo.Hdr.wRevision, 0x0200); | |
| UT_ASSERT_EQUAL (VarAuth->AuthInfo.Hdr.wCertificateType, WIN_CERT_TYPE_EFI_GUID); | |
| UT_ASSERT_TRUE (CompareGuid (&VarAuth->AuthInfo.CertType, &gEfiCertPkcs7Guid)); | |
| UT_ASSERT_MEM_EQUAL (VarAuth->AuthInfo.CertData, Data, sizeof (Data)); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for CreateTimeBasedPayload () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| CreateTimeBasedPayloadShouldCheckInput ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| UINTN DataSize = 0; | |
| UINT8 *Data = NULL; | |
| EFI_TIME Time; | |
| EFI_STATUS Status; | |
| Status = CreateTimeBasedPayload (NULL, &Data, &Time); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER); | |
| Status = CreateTimeBasedPayload (&DataSize, NULL, &Time); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER); | |
| Status = CreateTimeBasedPayload (&DataSize, &Data, NULL); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_INVALID_PARAMETER); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for DeleteDb () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| DeleteDbShouldDelete ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 Dummy = 3; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize = 0; | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = DeleteDb (); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for DeleteDbx () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| DeleteDbxShouldDelete ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 Dummy = 3; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize = 0; | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = DeleteDbx (); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for DeleteDbt () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| DeleteDbtShouldDelete ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 Dummy = 3; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize = 0; | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = DeleteDbt (); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for DeleteKEK () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| DeleteKEKShouldDelete ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 Dummy = 3; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize = 0; | |
| expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = DeleteKEK (); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for DeletePlatformKey () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| DeletePKShouldDelete ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 Dummy = 3; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize = 0; | |
| UINT8 BootMode = CUSTOM_SECURE_BOOT_MODE; | |
| expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, sizeof (BootMode)); | |
| expect_memory (MockSetVariable, Data, &BootMode, sizeof (BootMode)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = DeletePlatformKey (); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for DeleteSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| DeleteSecureBootVariablesShouldDelete ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 Dummy = 3; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize = 0; | |
| UINT8 BootMode = CUSTOM_SECURE_BOOT_MODE; | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); | |
| will_return (DisablePKProtection, EFI_SUCCESS); | |
| expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, sizeof (BootMode)); | |
| expect_memory (MockSetVariable, Data, &BootMode, sizeof (BootMode)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (Dummy)); | |
| will_return (MockGetVariable, &Dummy); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = DeleteSecureBootVariables (); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for DeleteSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| DeleteSecureBootVariablesShouldCheckProtection ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| will_return (DisablePKProtection, EFI_SECURITY_VIOLATION); | |
| Status = DeleteSecureBootVariables (); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_ABORTED); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for DeleteSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| DeleteSecureBootVariablesShouldProceedWithNotFound ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 BootMode = CUSTOM_SECURE_BOOT_MODE; | |
| will_return (DisablePKProtection, EFI_SUCCESS); | |
| expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, sizeof (BootMode)); | |
| expect_memory (MockSetVariable, Data, &BootMode, sizeof (BootMode)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| Status = DeleteSecureBootVariables (); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for DeleteSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| EnrollFromInputShouldComplete ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 Dummy = 3; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize = sizeof (Dummy); | |
| Payload = AllocateCopyPool (sizeof (Dummy), &Dummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (Dummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (Dummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (Dummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = EnrollFromInput (EFI_PLATFORM_KEY_NAME, &gEfiGlobalVariableGuid, sizeof (Dummy), &Dummy); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SetSecureBootVariablesShouldComplete ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 DbDummy = 0xDE; | |
| UINT8 DbtDummy = 0xAD; | |
| UINT8 DbxDummy[] = { | |
| // Valid Dbx value (SHA256 hash of all 0x00) | |
| 0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28, | |
| 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77, | |
| 0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
| }; | |
| UINT8 KekDummy = 0xEF; | |
| UINT8 PkDummy = 0xFE; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize; | |
| SECURE_BOOT_PAYLOAD_INFO PayloadInfo; | |
| PayloadInfo.DbPtr = &DbDummy; | |
| PayloadInfo.DbSize = sizeof (DbDummy); | |
| PayloadInfo.DbxPtr = &DbxDummy; | |
| PayloadInfo.DbxSize = sizeof (DbxDummy); | |
| PayloadInfo.DbtPtr = &DbtDummy; | |
| PayloadInfo.DbtSize = sizeof (DbtDummy); | |
| PayloadInfo.KekPtr = &KekDummy; | |
| PayloadInfo.KekSize = sizeof (KekDummy); | |
| PayloadInfo.PkPtr = &PkDummy; | |
| PayloadInfo.PkSize = sizeof (PkDummy); | |
| PayloadInfo.SecureBootKeyName = L"Food"; | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| Payload = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy); | |
| PayloadSize = sizeof (DbxDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbDummy, sizeof (DbDummy)); | |
| PayloadSize = sizeof (DbDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbtDummy, sizeof (DbtDummy)); | |
| PayloadSize = sizeof (DbtDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &KekDummy, sizeof (KekDummy)); | |
| PayloadSize = sizeof (KekDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &PkDummy, sizeof (PkDummy)); | |
| PayloadSize = sizeof (PkDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = SetSecureBootVariablesToDefault (&PayloadInfo); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SetSecureBootVariablesShouldStopWhenSecure ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 TargetMode = SECURE_BOOT_MODE_ENABLE; | |
| SECURE_BOOT_PAYLOAD_INFO PayloadInfo; | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (TargetMode)); | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, sizeof (TargetMode)); | |
| will_return (MockGetVariable, TRUE); | |
| will_return (MockGetVariable, sizeof (TargetMode)); | |
| will_return (MockGetVariable, &TargetMode); | |
| Status = SetSecureBootVariablesToDefault (&PayloadInfo); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_ABORTED); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SetSecureBootVariablesShouldStopFailDBX ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 DbxDummy[] = { | |
| // Valid Dbx value (SHA256 hash of all 0x00) | |
| 0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28, | |
| 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77, | |
| 0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
| }; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize = sizeof (DbxDummy); | |
| SECURE_BOOT_PAYLOAD_INFO PayloadInfo; | |
| PayloadInfo.DbxPtr = &DbxDummy; | |
| PayloadInfo.DbxSize = sizeof (DbxDummy); | |
| PayloadInfo.SecureBootKeyName = L"Fail DBX"; | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| Payload = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| will_return (MockSetVariable, EFI_WRITE_PROTECTED); | |
| Status = SetSecureBootVariablesToDefault (&PayloadInfo); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_WRITE_PROTECTED); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SetSecureBootVariablesShouldStopFailDB ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 DbDummy = 0xDE; | |
| UINT8 DbxDummy[] = { | |
| // Valid Dbx value (SHA256 hash of all 0x00) | |
| 0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28, | |
| 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77, | |
| 0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
| }; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize; | |
| SECURE_BOOT_PAYLOAD_INFO PayloadInfo; | |
| PayloadInfo.DbPtr = &DbDummy; | |
| PayloadInfo.DbSize = sizeof (DbDummy); | |
| PayloadInfo.DbxPtr = &DbxDummy; | |
| PayloadInfo.DbxSize = sizeof (DbxDummy); | |
| PayloadInfo.SecureBootKeyName = L"Fail DB"; | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| Payload = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy); | |
| PayloadSize = sizeof (DbxDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbDummy, sizeof (DbDummy)); | |
| PayloadSize = sizeof (DbDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| will_return (MockSetVariable, EFI_WRITE_PROTECTED); | |
| Status = SetSecureBootVariablesToDefault (&PayloadInfo); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_WRITE_PROTECTED); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SetSecureBootVariablesShouldStopFailDBT ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 DbDummy = 0xDE; | |
| UINT8 DbtDummy = 0xAD; | |
| UINT8 DbxDummy[] = { | |
| // Valid Dbx value (SHA256 hash of all 0x00) | |
| 0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28, | |
| 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77, | |
| 0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
| }; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize; | |
| SECURE_BOOT_PAYLOAD_INFO PayloadInfo; | |
| PayloadInfo.DbPtr = &DbDummy; | |
| PayloadInfo.DbSize = sizeof (DbDummy); | |
| PayloadInfo.DbxPtr = &DbxDummy; | |
| PayloadInfo.DbxSize = sizeof (DbxDummy); | |
| PayloadInfo.DbtPtr = &DbtDummy; | |
| PayloadInfo.DbtSize = sizeof (DbtDummy); | |
| PayloadInfo.SecureBootKeyName = L"Fail DBT"; | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| Payload = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy); | |
| PayloadSize = sizeof (DbxDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbDummy, sizeof (DbDummy)); | |
| PayloadSize = sizeof (DbDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbtDummy, sizeof (DbtDummy)); | |
| PayloadSize = sizeof (DbtDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| will_return (MockSetVariable, EFI_ACCESS_DENIED); | |
| Status = SetSecureBootVariablesToDefault (&PayloadInfo); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_ACCESS_DENIED); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SetSecureBootVariablesShouldStopFailKEK ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 DbDummy = 0xDE; | |
| UINT8 DbtDummy = 0xAD; | |
| UINT8 DbxDummy[] = { | |
| // Valid Dbx value (SHA256 hash of all 0x00) | |
| 0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28, | |
| 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77, | |
| 0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
| }; | |
| UINT8 KekDummy = 0xEF; | |
| UINT8 PkDummy = 0xFE; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize; | |
| SECURE_BOOT_PAYLOAD_INFO PayloadInfo; | |
| PayloadInfo.DbPtr = &DbDummy; | |
| PayloadInfo.DbSize = sizeof (DbDummy); | |
| PayloadInfo.DbxPtr = &DbxDummy; | |
| PayloadInfo.DbxSize = sizeof (DbxDummy); | |
| PayloadInfo.DbtPtr = &DbtDummy; | |
| PayloadInfo.DbtSize = sizeof (DbtDummy); | |
| PayloadInfo.KekPtr = &KekDummy; | |
| PayloadInfo.KekSize = sizeof (KekDummy); | |
| PayloadInfo.PkPtr = &PkDummy; | |
| PayloadInfo.PkSize = sizeof (PkDummy); | |
| PayloadInfo.SecureBootKeyName = L"Food"; | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| Payload = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy); | |
| PayloadSize = sizeof (DbxDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbDummy, sizeof (DbDummy)); | |
| PayloadSize = sizeof (DbDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbtDummy, sizeof (DbtDummy)); | |
| PayloadSize = sizeof (DbtDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &KekDummy, sizeof (KekDummy)); | |
| PayloadSize = sizeof (KekDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| will_return (MockSetVariable, EFI_DEVICE_ERROR); | |
| Status = SetSecureBootVariablesToDefault (&PayloadInfo); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_DEVICE_ERROR); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SetSecureBootVariablesShouldStopFailPK ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 DbDummy = 0xDE; | |
| UINT8 DbtDummy = 0xAD; | |
| UINT8 DbxDummy[] = { | |
| // Valid Dbx value (SHA256 hash of all 0x00) | |
| 0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28, | |
| 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77, | |
| 0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
| }; | |
| UINT8 KekDummy = 0xEF; | |
| UINT8 PkDummy = 0xFE; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize; | |
| SECURE_BOOT_PAYLOAD_INFO PayloadInfo; | |
| PayloadInfo.DbPtr = &DbDummy; | |
| PayloadInfo.DbSize = sizeof (DbDummy); | |
| PayloadInfo.DbxPtr = &DbxDummy; | |
| PayloadInfo.DbxSize = sizeof (DbxDummy); | |
| PayloadInfo.DbtPtr = &DbtDummy; | |
| PayloadInfo.DbtSize = sizeof (DbtDummy); | |
| PayloadInfo.KekPtr = &KekDummy; | |
| PayloadInfo.KekSize = sizeof (KekDummy); | |
| PayloadInfo.PkPtr = &PkDummy; | |
| PayloadInfo.PkSize = sizeof (PkDummy); | |
| PayloadInfo.SecureBootKeyName = L"Food"; | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| Payload = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy); | |
| PayloadSize = sizeof (DbxDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbDummy, sizeof (DbDummy)); | |
| PayloadSize = sizeof (DbDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbtDummy, sizeof (DbtDummy)); | |
| PayloadSize = sizeof (DbtDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &KekDummy, sizeof (KekDummy)); | |
| PayloadSize = sizeof (KekDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &PkDummy, sizeof (PkDummy)); | |
| PayloadSize = sizeof (PkDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); | |
| will_return (MockSetVariable, EFI_INVALID_PARAMETER); | |
| Status = SetSecureBootVariablesToDefault (&PayloadInfo); | |
| UT_ASSERT_STATUS_EQUAL (Status, EFI_SECURITY_VIOLATION); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Unit test for SetDefaultSecureBootVariables () API of the SecureBootVariableLib. | |
| @param[in] Context [Optional] An optional parameter that enables: | |
| 1) test-case reuse with varied parameters and | |
| 2) test-case re-entry for Target tests that need a | |
| reboot. This parameter is a VOID* and it is the | |
| responsibility of the test author to ensure that the | |
| contents are well understood by all test cases that may | |
| consume it. | |
| @retval UNIT_TEST_PASSED The Unit test has completed and the test | |
| case was successful. | |
| @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed. | |
| **/ | |
| UNIT_TEST_STATUS | |
| EFIAPI | |
| SetSecureBootVariablesDBTOptional ( | |
| IN UNIT_TEST_CONTEXT Context | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 DbDummy = 0xDE; | |
| UINT8 DbxDummy[] = { | |
| // Valid Dbx value (SHA256 hash of all 0x00) | |
| 0x26, 0x16, 0xC4, 0xC1, 0x4C, 0x50, 0x92, 0x40, 0xAC, 0xA9, 0x41, 0xF9, 0x36, 0x93, 0x43, 0x28, | |
| 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xBD, 0x9A, 0xFA, 0x77, | |
| 0x59, 0x03, 0x32, 0x4D, 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
| }; | |
| UINT8 KekDummy = 0xEF; | |
| UINT8 PkDummy = 0xFE; | |
| UINT8 *Payload = NULL; | |
| UINTN PayloadSize; | |
| SECURE_BOOT_PAYLOAD_INFO PayloadInfo; | |
| PayloadInfo.DbPtr = &DbDummy; | |
| PayloadInfo.DbSize = sizeof (DbDummy); | |
| PayloadInfo.DbxPtr = &DbxDummy; | |
| PayloadInfo.DbxSize = sizeof (DbxDummy); | |
| PayloadInfo.DbtPtr = NULL; | |
| PayloadInfo.DbtSize = 0; | |
| PayloadInfo.KekPtr = &KekDummy; | |
| PayloadInfo.KekSize = sizeof (KekDummy); | |
| PayloadInfo.PkPtr = &PkDummy; | |
| PayloadInfo.PkSize = sizeof (PkDummy); | |
| PayloadInfo.SecureBootKeyName = L"Food"; | |
| expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); | |
| expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockGetVariable, *DataSize, 0); | |
| will_return (MockGetVariable, FALSE); | |
| Payload = AllocateCopyPool (sizeof (DbxDummy), &DbxDummy); | |
| PayloadSize = sizeof (DbxDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &DbDummy, sizeof (DbDummy)); | |
| PayloadSize = sizeof (DbDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &KekDummy, sizeof (KekDummy)); | |
| PayloadSize = sizeof (KekDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| CopyMem (Payload, &PkDummy, sizeof (PkDummy)); | |
| PayloadSize = sizeof (PkDummy); | |
| Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mDefaultPayloadTimestamp); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); | |
| expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); | |
| expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); | |
| expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); | |
| expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); | |
| expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); | |
| will_return (MockSetVariable, EFI_SUCCESS); | |
| Status = SetSecureBootVariablesToDefault (&PayloadInfo); | |
| UT_ASSERT_NOT_EFI_ERROR (Status); | |
| return UNIT_TEST_PASSED; | |
| } | |
| /** | |
| Initialze the unit test framework, suite, and unit tests for the | |
| SecureBootVariableLib and run the SecureBootVariableLib unit test. | |
| @retval EFI_SUCCESS All test cases were dispatched. | |
| @retval EFI_OUT_OF_RESOURCES There are not enough resources available to | |
| initialize the unit tests. | |
| **/ | |
| STATIC | |
| EFI_STATUS | |
| EFIAPI | |
| UnitTestingEntry ( | |
| VOID | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UNIT_TEST_FRAMEWORK_HANDLE Framework; | |
| UNIT_TEST_SUITE_HANDLE SecureBootVarMiscTests; | |
| UNIT_TEST_SUITE_HANDLE SecureBootVarDeleteTests; | |
| UNIT_TEST_SUITE_HANDLE SecureBootVarEnrollTests; | |
| Framework = NULL; | |
| DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_APP_NAME, UNIT_TEST_APP_VERSION)); | |
| // | |
| // Start setting up the test framework for running the tests. | |
| // | |
| Status = InitUnitTestFramework (&Framework, UNIT_TEST_APP_NAME, gEfiCallerBaseName, UNIT_TEST_APP_VERSION); | |
| if (EFI_ERROR (Status)) { | |
| DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status)); | |
| goto EXIT; | |
| } | |
| // | |
| // Populate the SecureBootVariableLib Unit Test Suite. | |
| // | |
| Status = CreateUnitTestSuite (&SecureBootVarMiscTests, Framework, "SecureBootVariableLib Miscellaneous Tests", "SecureBootVariableLib.Miscellaneous", NULL, NULL); | |
| if (EFI_ERROR (Status)) { | |
| DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for SecureBootVariableLib\n")); | |
| Status = EFI_OUT_OF_RESOURCES; | |
| goto EXIT; | |
| } | |
| Status = CreateUnitTestSuite (&SecureBootVarDeleteTests, Framework, "SecureBootVariableLib Deletion Tests", "SecureBootVariableLib.Deletion", NULL, NULL); | |
| if (EFI_ERROR (Status)) { | |
| DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for SecureBootVariableLib\n")); | |
| Status = EFI_OUT_OF_RESOURCES; | |
| goto EXIT; | |
| } | |
| Status = CreateUnitTestSuite (&SecureBootVarEnrollTests, Framework, "SecureBootVariableLib Enrollment Tests", "SecureBootVariableLib.Enrollment", NULL, NULL); | |
| if (EFI_ERROR (Status)) { | |
| DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for SecureBootVariableLib\n")); | |
| Status = EFI_OUT_OF_RESOURCES; | |
| goto EXIT; | |
| } | |
| // | |
| // --------------Suite-----------Description--------------Name----------Function--------Pre---Post-------------------Context----------- | |
| // | |
| AddTestCase (SecureBootVarMiscTests, "SetSecureBootMode should propagate to set variable", "SetSecureBootMode", SetSecureBootModeShouldSetVar, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarMiscTests, "GetSetupMode should propagate to get variable", "GetSetupMode", GetSetupModeShouldGetVar, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarMiscTests, "IsSecureBootEnabled should propagate to get variable", "IsSecureBootEnabled", IsSecureBootEnableShouldGetVar, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarMiscTests, "SecureBootCreateDataFromInput with one input cert", "SecureBootCreateDataFromInput One Cert", SecureBootCreateDataFromInputSimple, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarMiscTests, "SecureBootCreateDataFromInput with no input cert", "SecureBootCreateDataFromInput No Cert", SecureBootCreateDataFromInputNull, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarMiscTests, "SecureBootCreateDataFromInput with multiple input cert", "SecureBootCreateDataFromInput No Cert", SecureBootCreateDataFromInputMultiple, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarMiscTests, "CreateTimeBasedPayload should populate descriptor data", "CreateTimeBasedPayload Normal", CreateTimeBasedPayloadShouldPopulateDescriptor, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarMiscTests, "CreateTimeBasedPayload should fail on NULL inputs", "CreateTimeBasedPayload NULL", CreateTimeBasedPayloadShouldCheckInput, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarDeleteTests, "DeleteDb should delete DB with auth info", "DeleteDb", DeleteDbShouldDelete, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarDeleteTests, "DeleteDbx should delete DBX with auth info", "DeleteDbx", DeleteDbxShouldDelete, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarDeleteTests, "DeleteDbt should delete DBT with auth info", "DeleteDbt", DeleteDbtShouldDelete, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarDeleteTests, "DeleteKEK should delete KEK with auth info", "DeleteKEK", DeleteKEKShouldDelete, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarDeleteTests, "DeletePlatformKey should delete PK with auth info", "DeletePlatformKey", DeletePKShouldDelete, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarDeleteTests, "DeleteSecureBootVariables should delete properly", "DeleteSecureBootVariables Normal", DeleteSecureBootVariablesShouldDelete, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarDeleteTests, "DeleteSecureBootVariables should fail if protection disable fails", "DeleteSecureBootVariables Fail", DeleteSecureBootVariablesShouldCheckProtection, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarDeleteTests, "DeleteSecureBootVariables should continue if any variable is not found", "DeleteSecureBootVariables Proceed", DeleteSecureBootVariablesShouldProceedWithNotFound, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarEnrollTests, "EnrollFromInput should supply with authenticated payload", "EnrollFromInput Normal", EnrollFromInputShouldComplete, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should complete", "SetSecureBootVariablesToDefault Normal", SetSecureBootVariablesShouldComplete, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when already enabled", "SetSecureBootVariablesToDefault Already Started", SetSecureBootVariablesShouldStopWhenSecure, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when DB failed", "SetSecureBootVariablesToDefault Fails DB", SetSecureBootVariablesShouldStopFailDB, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when DBT failed", "SetSecureBootVariablesToDefault Fails DBT", SetSecureBootVariablesShouldStopFailDBT, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when DBX failed", "SetSecureBootVariablesToDefault Fails DBX", SetSecureBootVariablesShouldStopFailDBX, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when KEK failed", "SetSecureBootVariablesToDefault Fails KEK", SetSecureBootVariablesShouldStopFailKEK, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should stop when PK failed", "SetSecureBootVariablesToDefault Fails PK", SetSecureBootVariablesShouldStopFailPK, NULL, NULL, NULL); | |
| AddTestCase (SecureBootVarEnrollTests, "SetSecureBootVariablesToDefault should only be optional", "SetSecureBootVariablesToDefault DBT Optional", SetSecureBootVariablesDBTOptional, NULL, NULL, NULL); | |
| // | |
| // Execute the tests. | |
| // | |
| Status = RunAllTestSuites (Framework); | |
| EXIT: | |
| if (Framework) { | |
| FreeUnitTestFramework (Framework); | |
| } | |
| return Status; | |
| } | |
| /** | |
| Standard POSIX C entry point for host based unit test execution. | |
| **/ | |
| int | |
| main ( | |
| int argc, | |
| char *argv[] | |
| ) | |
| { | |
| return UnitTestingEntry (); | |
| } |