alder_lake_bios/Insyde/InsydeModulePkg/Include/Library/VariableSupportLib.h

708 lines
22 KiB
C

/** @file
Common variable supports functions for user can extract whole variables
(including variable header) from variable store.
;******************************************************************************
;* Copyright (c) 2012 - 2019, Insyde Software Corp. 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.
;*
;******************************************************************************
*/
#ifndef _VARIABLE_SUPPORT_LIB_H_
#define _VARIABLE_SUPPORT_LIB_H_
#include <Uefi.h>
#include <Guid/AuthenticatedVariableFormat.h>
#include <SensitiveVariableFormat.h>
#include <H2OBoardId.h>
#define GET_VARIABLE_NAME_PTR(a) (CHAR16 *) ((UINTN) (a) + sizeof (VARIABLE_HEADER))
#define MAX_HARDWARE_ERROR_VARIABLE_SIZE MAX_VARIABLE_SIZE
//
// Put these globally variables here temporarily. If EDKII updates these variables, we
// should remove these definitions.
//
///
/// Globally "PKDefault" variable for the OEM's default public Platform Key Signature Database.
///
#define EFI_PK_DEFAULT_VARIABLE_NAME L"PKDefault"
///
/// Globally "KEKDefault" variable for the OEM's default Key Exchange Key Signature Database
///
#define EFI_KEK_DEFAULT_VARIABLE_NAME L"KEKDefault"
///
/// Globally "dbDefault" variable for the OEM's default secure boot signature store.
///
#define EFI_DB_DEFAULT_VARIABLE_NAME L"dbDefault"
///
/// Globally "dbxDefault" variable for the OEM's default secure boot blacklist signature store.
///
#define EFI_DBX_DEFAULT_VARIABLE_NAME L"dbxDefault"
///
/// Globally "dbtDefault" variable for the OEM's default authenticated timestamp signature store.
///
#define EFI_DBT_DEFAULT_VARIABLE_NAME L"dbtDefault"
///
/// Globally "dbrDefault" variable for the OEM's default public authenticated recovery signature database.
///
#define EFI_DBR_DEFAULT_VARIABLE_NAME L"dbrDefault"
///
/// Globally "VendorKeys" variable is an 8-bit unsigned integer that defines whether the PK, KEK, db and
/// dbx databases have been modified by anyone other than the platform vendor or a holder of the
/// vendor-provided keys. A value of 0 indicates that someone other than the platform vendor used a
/// mechanism not defined by the UEFI Specification to transition the system to setup mode or to update
/// PK, KEK, db or dbx. Otherwise, the value will be 1.
///
#define EFI_VENDOR_KEYS_VARIABLE_NAME L"VendorKeys"
///
/// Variable name with guid EFI_IMAGE_SECURITY_DATABASE_GUID
/// for the recovery signature database.
///
#define EFI_IMAGE_SECURITY_DATABASE3 L"dbr"
///
/// OS-specified recovery options.
/// Its attribute is NV+BS+RT.
///
#define EFI_OS_RECOVERY_ORDER_VARIABLE_NAME L"OsRecoveryOrder"
///
/// Whether the system is operating in Audit Mode (1) or not (0). All other values are reserved.
/// Should be treated as read-only except when DeployedMode is 0. Always becomes read-only after
/// ExitBootServices() is called.
/// Its attribute is BS+RT.
///
#define EFI_AUDIT_MODE_VARIABLE_NAME L"AuditMode"
///
/// Whether the system is operating in Deployed Mode (1) or not (0). All other values are reserved.
/// Should be treated as read-only when its value is 1. Always becomes read-only after
/// ExitBootServices() is called.
/// Its attribute is BS+RT.
///
#define EFI_DEPLOYED_MODE_VARIABLE_NAME L"DeployedMode"
typedef
BOOLEAN
(*SPECIFIC_VARIABLE) (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
This code gets the current status of Variable Store.
@param[in] VarStoreHeader Pointer to the Variable Store Header.
@retval EfiRaw Variable store status is raw.
@retval EfiValid Variable store status is valid.
@retval EfiInvalid Variable store status is invalid.
**/
VARIABLE_STORE_STATUS
GetVariableStoreStatus (
IN CONST VARIABLE_STORE_HEADER *VarStoreHeader
);
/**
This code checks if variable header is valid or not.
@param[in] Variable Pointer to the Variable Header.
@retval TRUE Variable header is valid.
@retval FALSE Variable header is not valid.
**/
BOOLEAN
IsValidVariableHeader (
IN CONST VARIABLE_HEADER *Variable
);
/**
This code gets the size of name of variable.
@param[in] Variable Pointer to the Variable Header.
@return UINTN Size of variable in bytes.
**/
UINTN
NameSizeOfVariable (
IN CONST VARIABLE_HEADER *Variable
);
/**
This code gets the pointer to the variable data.
@param[in] Variable Pointer to the Variable Header.
@retval NULL Variable start id is incorrect.
@return UINT8* Pointer to Variable Data.
**/
UINT8 *
GetVariableDataPtr (
IN CONST VARIABLE_HEADER *Variable
);
/**
This code gets the pointer to the next variable header.
@param[in] Variable Pointer to the Variable Header.
@return VARIABLE_HEADER* Pointer to next variable header.
**/
VARIABLE_HEADER *
GetNextVariablePtr (
IN CONST VARIABLE_HEADER *Variable
);
/**
Gets the pointer to the first variable header in given variable store area.
@param[in] VarStoreHeader Pointer to the Variable Store Header.
@return VARIABLE_HEADER* Pointer to the first variable header.
**/
VARIABLE_HEADER *
GetStartPointer (
IN CONST VARIABLE_STORE_HEADER *VarStoreHeader
);
/**
Gets the pointer to the end of the variable storage area.
This function gets pointer to the end of the variable storage
area, according to the input variable store header.
@param[in] VarStoreHeader Pointer to the Variable Store Header.
@return VARIABLE_HEADER* Pointer to the end of the variable storage area.
**/
VARIABLE_HEADER *
GetEndPointer (
IN CONST VARIABLE_STORE_HEADER *VarStoreHeader
);
/**
This code gets the size of variable data.
@param[in] Variable Pointer to the Variable Header.
@return UINTN Size of variable in bytes.
**/
UINTN
DataSizeOfVariable (
IN CONST VARIABLE_HEADER *Variable
);
/**
This code gets the size of variable store.
@param[in] VarStoreHeader Pointer to the Variable Store Header.
@return UINT32 Total size of variable store.
**/
UINT32
GetVariableStoreSize (
IN CONST VARIABLE_STORE_HEADER *VariableStoreHeader
);
/**
This code gets the Size of extension variable store header.
@param[in] VarStoreHeader Pointer to the Variable Store Header.
@return UINT16 Size of extension variable store header.
**/
UINT16
GetExtVariableHeaderSize (
IN CONST VARIABLE_STORE_HEADER *VariableStoreHeader
);
/**
Helper function to get the Board ID from variable store.
Get SKUID from EXT variable store header or variable store Header if EXT
variable store header doesn't exist.
@param[in] Buffer Pointer to variable store header.
@return the board ID in this variable store.
**/
H2O_BOARD_ID
GetBoardIdFromVariableStore (
IN CONST VARIABLE_STORE_HEADER *VariableStoreHeader
);
/**
Gets the size of variable store header.
@return UINTN size by byte of variable store header.
**/
UINTN
GetVariableStoreHeaderSize (
VOID
);
/**
According to variable name and GUID to find this variable is whether in input buffer.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@param[in] Buffer Pointer to variable buffer.
@param[in] BufferSize the size in bytes of the buffer
@retval TRUE The function completed successfully.
@retval FALSE The function could not complete successfully.
**/
BOOLEAN
DoesVariableExist (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid,
IN CONST UINT8 *Buffer,
IN UINTN BufferSize
);
/**
According to variable name and GUID to Determine the variable is secure database relative variable.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is secure database relative variable.
@retval FALSE This isn't secure database relative variable.
--*/
BOOLEAN
IsSecureDatabaseVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is image secure database relative variable.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is image secure database relative variable.
@retval FALSE This isn't image secure database relative variable.
--*/
BOOLEAN
IsImageSecureDatabaseVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is AuditMode or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is AuditMode variable.
@retval FALSE This isn't AuditMode variable.
--*/
BOOLEAN
IsAuditModeVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is DeployedMode or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is DeployedMode variable.
@retval FALSE This isn't DeployedMode variable.
--*/
BOOLEAN
IsDeployedModeVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is PK or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is PK variable.
@retval FALSE This isn't PK variable.
--*/
BOOLEAN
IsPkVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is KEK or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is KEK variable.
@retval FALSE This isn't KEK variable.
--*/
BOOLEAN
IsKekVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is db or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is db variable.
@retval FALSE This isn't db variable.
--*/
BOOLEAN
IsDbVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is dbx or not.
@param VariableName Name of Variable to be found.
@param VendorGuid Variable vendor GUID.
@retval TRUE This is dbx variable.
@retval FALSE This isn't dbx variable.
--*/
BOOLEAN
IsDbxVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is dbt or not.
@param VariableName Name of Variable to be found.
@param VendorGuid Variable vendor GUID.
@retval TRUE This is dbt variable.
@retval FALSE This isn't dbt variable.
--*/
BOOLEAN
IsDbtVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is dbr or not.
@param VariableName Name of Variable to be found.
@param VendorGuid Variable vendor GUID.
@retval TRUE This is dbr variable.
@retval FALSE This isn't dbt variable.
--*/
BOOLEAN
IsDbrVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is secure database default
relative variable.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is secure database default relative variable.
@retval FALSE This isn't secure database default relative variable.
--*/
BOOLEAN
IsSecureDatabaseDefaultVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is image secure database default relative variable.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is image secure database default relative variable.
@retval FALSE This isn't image secure database default relative variable.
--*/
BOOLEAN
IsImageSecureDatabaseDefaultVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is PKDefault or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is PKDefault variable.
@retval FALSE This isn't PKDefault variable.
--*/
BOOLEAN
IsPkDefaultVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is KEKDefault or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is KEKDefault variable.
@retval FALSE This isn't KEKDefault variable.
--*/
BOOLEAN
IsKekDefaultVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is dbDefault or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is dbDefault variable.
@retval FALSE This isn't dbDefault variable.
--*/
BOOLEAN
IsDbDefaultVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is dbxDefault or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is dbxDefault variable.
@retval FALSE This isn't dbxDefault variable.
--*/
BOOLEAN
IsDbxDefaultVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is dbtDefault or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is dbtDefault variable.
@retval FALSE This isn't dbtDefault variable.
--*/
BOOLEAN
IsDbtDefaultVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is dbrDefault or not.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE This is dbrDefault variable.
@retval FALSE This isn't dbrDefault variable.
--*/
BOOLEAN
IsDbrDefaultVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is OsRecovery#### or not.
@param VariableName Name of Variable to be found.
@retval TRUE This is OsRecovery#### variable.
@retval FALSE This isn't OsRecovery#### variable.
--*/
BOOLEAN
IsOsRecoveryVariable (
IN CONST CHAR16 *VariableName
);
/**
According to variable name and GUID to Determine the variable is OsRecoveryOrder or not.
@param VariableName Name of Variable to be found.
@param VendorGuid Variable vendor GUID.
@retval TRUE This is OsRecoveryOrder variable.
@retval FALSE This isn't OsRecoveryOrder variable.
--*/
BOOLEAN
IsOsRecoveryOrderVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
According to variable name and GUID to Determine the variable is secure boot policy variable or not.
@param VariableName Name of Variable to be found.
@param VendorGuid Variable vendor GUID.
@retval TRUE This is secure boot policy variable variable.
@retval FALSE This isn't secure boot policy variable variable.
--*/
BOOLEAN
IsSecureBootPolicyVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
);
/**
Merge all of variables aren't secure boot relative variables and doesn't saved in factory copy
region from variable store to factory copy region.
@param[in, out] FactorycopyBuffer [in]:The buffer contained all of factory copy data.
[out]:The buffer has been appended data from VariableBuffer.
@param[in, out] FactoryBufferLength [in]:The size of FactorycopyBuffer.
[out]:The total used size in FactorycopyBuffer.
@param[in] VariableBuffer Buffer to save all of variable data.
@param[in] VariableBufferLength The size of VariableBuffer.
@retval EFI_SUCCESS Merge varialbe data to factory copy region successful.
@retval EFI_INVALID_PARAMETER FactorycopyBuffer, FactoryBufferLength or VariableBuffer is NULL.
The data in FactorycopyBuffer in incorrect.
@retval EFI_BUFFER_TOO_SMALL FactoryBufferLength is too small to contain merged data.
--*/
EFI_STATUS
MergeVariableToFactoryCopy (
IN OUT UINT8 *FactorycopyBuffer,
IN OUT UINTN *FactoryBufferLength,
IN CONST UINT8 *VariableBuffer,
IN UINTN VariableBufferLength
);
/**
This code uses to initialize secure variable header.
User can use this function set variable header to set Insyde secure variable.
@param[in] DataSize Input buffer size by byte.
@param[out] Data Buffer to save initialized variable header data.
@retval EFI_SUCCESS Setting secure variable header successful.
@retval EFI_INVALID_PARAMETER Data is NULL or DataSize is too small.
--*/
EFI_STATUS
InitSecureVariableHeader (
IN UINTN DataSize,
OUT VOID *Data
);
/**
According to variable name and GUID to Determine the variable is whether a read-only variable.
@param[in] VariableName Name of Variable to be found.
@param[in] VendorGuid Variable vendor GUID.
@retval TRUE Setting secure variable header successful.
@retval FALSE Data is NULL or DataSize is too small.
--*/
BOOLEAN
IsReadOnlyVariable (
IN CONST CHAR16 *VariableName,
IN CONST EFI_GUID *VendorGuid
)
;
/**
Function to get password combined data.
@param[in] Data Buffer to save input data.
@param[in] DataLen Length of input data in bytes.
@param[out] CombinedData Output buffer to save combined data.
@retval EFI_SUCCESS Get Combined data successfully.
@retval EFI_INVALID_PARAMETER Data is NULL or CombinedData is NULL.
--*/
EFI_STATUS
GetCombinedData (
IN CONST UINT8 *Data,
IN UINTN DataLen,
OUT CHAR8 *CombinedData
)
;
/**
Function uses to get next sensitive variable and return the current variable number in sensitive variable.
@param[in] StoreHeader Pointer to SENSITIVE_VARIABLE_STORE_HEADER instance.
@param[in] VariableHeader Pointer to SENSITIVE_VARIABLE_HEADER instance.
@param[in, out] VariableNum [in]: Supplies the last variable number returned by GetNextSensitiveVariable().
[out]: Returns the variable number of the current variable.
@return Pointer to SENSITIVE_VARIABLE_HEADER instance, or NULL if cannot find next sensitive variable.
--*/
SENSITIVE_VARIABLE_HEADER *
GetNextSensitiveVariable (
IN CONST SENSITIVE_VARIABLE_STORE_HEADER *StoreHeader,
IN CONST SENSITIVE_VARIABLE_HEADER *VariableHeader,
IN OUT UINT16 *VariableNum
)
;
/**
This code gets the pointer to the sensitive variable data.
@param[in] Variable Pointer to SENSITIVE_VARIABLE_HEADER instance.
@return Pointer to sensitive variable data, or NULL if VariableHeader is invalid.
**/
UINT8 *
GetSensitiveVariableDataPtr (
IN CONST SENSITIVE_VARIABLE_HEADER *Variable
)
;
/**
Get whole single sensitive variable size. This size includes header size, name size and data size.
@param[in] VariableHeader Pointer to SENSITIVE_VARIABLE_HEADER instance.
@return Size of sensitive variable data size in bytes, or 0 if the VariableHeader is invalid.
--*/
UINTN
GetSensitiveVariableSize (
IN CONST SENSITIVE_VARIABLE_HEADER *VariableHeader
)
;
#endif