alder_lake_bios/Insyde/InsydeModulePkg/Library/PeiH2OFvHashLib/PeiH2OFvHashLib.c

145 lines
4.7 KiB
C

/** @file
PEI H2O FV Hash library. It provides functionalities to Set and Get FV Hash
value.
;******************************************************************************
;* Copyright (c) 2018, Insyde Software Corporation. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include <Uefi.h>
#include <Library/H2OFvHashLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/PeiServicesLib.h>
#include <Library/HobLib.h>
#define H2O_FV_HASH_INFO_SIGNATURE SIGNATURE_32 ('H', 'F', 'H', 'I')
typedef struct _INTERNAL_H2O_FV_HASH_INFO {
UINT32 Signature;
UINT32 HashType;
EFI_PHYSICAL_ADDRESS FvBase;
UINT64 FvLength;
//
//
// UINT8 HashBuffer[];
} INTERNAL_H2O_FV_HASH_INFO;
typedef struct _INTERNAL_H2O_FV_HASH_MAP {
UINT32 HashType;
UINTN HashSize;
} INTERNAL_H2O_FV_HASH_MAP;
STATIC EFI_GUID mInternalH2OPeiFvHashInfoGuid = {0x3e7780a, 0x3436, 0x4705, 0xa7, 0x47, 0xff, 0x7e, 0xbb, 0x72, 0x3f, 0xe0};
STATIC INTERNAL_H2O_FV_HASH_MAP mFvHashInfoMap [H2O_FV_HASH_MAX] = {
{ H2O_SHA1_FV_HASH, 0x14},
{ H2O_SHA224_FV_HASH, 0x1C},
{ H2O_SHA256_FV_HASH, 0x20},
{ H2O_SHA384_FV_HASH, 0x30},
{ H2O_SHA512_FV_HASH, 0x40},
{ H2O_SM3_256_FV_HASH, 0x20}
};
STATIC
UINTN
GetHashSize (
IN UINT32 HashType
)
{
UINTN Index;
for (Index = 0; Index < H2O_SHA512_FV_HASH; Index++) {
if (mFvHashInfoMap[Index].HashType == HashType) {
return mFvHashInfoMap[Index].HashSize;
}
}
return 0;
}
/**
This function sets FV hash value the database which is controlled by this library. User can use
H2OGetFvHash () to get FV hash value.
@param[in] HashType Hash type to be set.
@param[in] FvBase Firmware volume base address.
@param[in] FvLength Firmware volume size.
@param[in] Buffer Pointer to hash buffer.
@retval EFI_SUCCESS Set hash buffer successfully.
@retval EFI_INVALID_PARAMETER Input HashType is invalid or Buffer is NULL.
@retval EFI_ALREADY_STARTED Can find FV hash in the database.
@retval EFI_OUT_OF_RESOURCES Unable allocate resource to save information.
**/
EFI_STATUS
H2OSetFvHash (
IN UINT32 HashType,
IN EFI_PHYSICAL_ADDRESS FvBase,
IN UINT64 FvLength,
IN CONST VOID *Buffer
)
{
UINTN HashSize;
INTERNAL_H2O_FV_HASH_INFO *FvHashInfo;
if (HashType > H2O_SHA512_FV_HASH || Buffer == NULL) {
return EFI_INVALID_PARAMETER;
}
if (H2OGetFvHash (HashType, FvBase, FvLength)) {
return EFI_ALREADY_STARTED;
}
HashSize = GetHashSize (HashType);
FvHashInfo = BuildGuidHob (&mInternalH2OPeiFvHashInfoGuid, sizeof (INTERNAL_H2O_FV_HASH_INFO) + HashSize);
if (FvHashInfo == NULL) {
return EFI_OUT_OF_RESOURCES;
}
FvHashInfo->Signature = H2O_FV_HASH_INFO_SIGNATURE;
FvHashInfo->HashType = HashType;
FvHashInfo->FvBase = FvBase;
FvHashInfo->FvLength = FvLength;
CopyMem (FvHashInfo + 1, Buffer, HashSize);
return EFI_SUCCESS;
}
/**
This function get FV hash value
@param[in] HashType Hash type to be set.
@param[in] FvBase Firmware volume base address.
@param[in] FvLength Firmware volume size.
@return Pointer to the FV hash value or NULL if not found.
**/
VOID *
H2OGetFvHash (
IN UINT32 HashType,
IN EFI_PHYSICAL_ADDRESS FvBase,
IN UINT64 FvLength
)
{
EFI_HOB_GUID_TYPE *GuidHob;
INTERNAL_H2O_FV_HASH_INFO *FvHashInfo;
for (GuidHob = GetFirstGuidHob (&mInternalH2OPeiFvHashInfoGuid);
GuidHob != NULL;
GuidHob = GetNextGuidHob (&mInternalH2OPeiFvHashInfoGuid, GET_NEXT_HOB (GuidHob))) {
FvHashInfo = GET_GUID_HOB_DATA (GuidHob);
if (FvHashInfo->HashType == HashType && FvHashInfo->FvBase == FvBase &&
FvHashInfo->FvLength == FvLength) {
return (VOID *) (FvHashInfo + 1);
}
}
return NULL;
}