1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/** @file
Unit tests for the implementation of DxeImageVerificationLib.
Copyright (c) 2025, Yandex. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Library/GoogleTestLib.h>
#include <GoogleTest/Library/MockUefiLib.h>
#include <GoogleTest/Library/MockUefiRuntimeServicesTableLib.h>
#include <GoogleTest/Library/MockUefiBootServicesTableLib.h>
#include <GoogleTest/Library/MockDevicePathLib.h>
extern "C" {
#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include "DxeImageVerificationLibGoogleTest.h"
}
//////////////////////////////////////////////////////////////////////////////
class CheckImageTypeResult : public ::testing::Test {
public:
EFI_DEVICE_PATH_PROTOCOL File;
protected:
MockUefiRuntimeServicesTableLib RtServicesMock;
MockUefiBootServicesTableLib BsMock;
MockDevicePathLib DevicePathMock;
EFI_STATUS Status;
UINT32 AuthenticationStatus;
VOID *FileBuffer;
UINTN FileSize;
BOOLEAN BootPolicy;
virtual void
SetUp (
)
{
AuthenticationStatus = 0;
FileBuffer = NULL;
FileSize = 0;
BootPolicy = FALSE;
}
};
TEST_F (CheckImageTypeResult, ImageTypeVerifySanity) {
// Sanity check
Status = DxeImageVerificationHandler (AuthenticationStatus, NULL, FileBuffer, FileSize, BootPolicy);
EXPECT_EQ (Status, EFI_INVALID_PARAMETER);
}
TEST_F (CheckImageTypeResult, ImageTypeVerifyImageFromFv) {
EXPECT_CALL (BsMock, gBS_LocateDevicePath)
.WillRepeatedly (testing::Return (EFI_SUCCESS));
EXPECT_CALL (BsMock, gBS_OpenProtocol)
.WillRepeatedly (testing::Return (EFI_SUCCESS));
Status = DxeImageVerificationHandler (AuthenticationStatus, &File, FileBuffer, FileSize, BootPolicy);
EXPECT_EQ (Status, EFI_SUCCESS);
}
TEST_F (CheckImageTypeResult, ImageTypeVerifyImageFromOptionRom) {
auto TestFunc = [&](EFI_STATUS ExpectedStatus) {
EXPECT_CALL (BsMock, gBS_LocateDevicePath)
.Times (3)
.WillRepeatedly (testing::Return (EFI_NOT_FOUND));
EXPECT_CALL (BsMock, gBS_OpenProtocol)
.WillRepeatedly (testing::Return (EFI_NOT_FOUND));
EXPECT_CALL (DevicePathMock, IsDevicePathEndType)
.WillOnce (testing::Return ((BOOLEAN)FALSE));
EXPECT_CALL (DevicePathMock, DevicePathType)
.WillOnce (testing::Return ((UINT8)MEDIA_DEVICE_PATH));
EXPECT_CALL (DevicePathMock, DevicePathSubType)
.WillOnce (testing::Return ((UINT8)MEDIA_RELATIVE_OFFSET_RANGE_DP));
Status = DxeImageVerificationHandler (AuthenticationStatus, &File, FileBuffer, FileSize, BootPolicy);
EXPECT_EQ (Status, ExpectedStatus);
};
PatchPcdSet32 (PcdOptionRomImageVerificationPolicy, ALWAYS_EXECUTE);
TestFunc (EFI_SUCCESS);
PatchPcdSet32 (PcdOptionRomImageVerificationPolicy, NEVER_EXECUTE);
TestFunc (EFI_ACCESS_DENIED);
}
TEST_F (CheckImageTypeResult, ImageTypeVerifyImageFromRemovableMedia) {
auto TestFunc = [&](EFI_STATUS ExpectedStatus) {
EXPECT_CALL (BsMock, gBS_LocateDevicePath)
.Times (3)
.WillRepeatedly (testing::Return (EFI_NOT_FOUND));
EXPECT_CALL (DevicePathMock, IsDevicePathEndType)
.WillOnce (testing::Return ((BOOLEAN)FALSE));
EXPECT_CALL (DevicePathMock, DevicePathType)
.WillOnce (testing::Return ((UINT8)MESSAGING_DEVICE_PATH));
EXPECT_CALL (DevicePathMock, DevicePathSubType)
.WillOnce (testing::Return ((UINT8)MSG_MAC_ADDR_DP));
Status = DxeImageVerificationHandler (AuthenticationStatus, &File, FileBuffer, FileSize, BootPolicy);
EXPECT_EQ (Status, ExpectedStatus);
};
PatchPcdSet32 (PcdRemovableMediaImageVerificationPolicy, ALWAYS_EXECUTE);
TestFunc (EFI_SUCCESS);
PatchPcdSet32 (PcdRemovableMediaImageVerificationPolicy, NEVER_EXECUTE);
TestFunc (EFI_ACCESS_DENIED);
}
TEST_F (CheckImageTypeResult, ImageTypeVerifyImageFromFixedMedia) {
auto TestFunc = [&](EFI_STATUS ExpectedStatus) {
EXPECT_CALL (BsMock, gBS_LocateDevicePath)
.WillOnce (testing::Return (EFI_NOT_FOUND))
.WillOnce (testing::Return (EFI_NOT_FOUND))
.WillOnce (testing::Return (EFI_SUCCESS));
Status = DxeImageVerificationHandler (AuthenticationStatus, &File, FileBuffer, FileSize, BootPolicy);
EXPECT_EQ (Status, ExpectedStatus);
};
PatchPcdSet32 (PcdFixedMediaImageVerificationPolicy, ALWAYS_EXECUTE);
TestFunc (EFI_SUCCESS);
PatchPcdSet32 (PcdFixedMediaImageVerificationPolicy, NEVER_EXECUTE);
TestFunc (EFI_ACCESS_DENIED);
}
int
main (
int argc,
char *argv[]
)
{
testing::InitGoogleTest (&argc, argv);
return RUN_ALL_TESTS ();
}
|