/** @file | |
The EFI_BIS_PROTOCOL is used to check a digital signature of a data block | |
against a digital certificate for the purpose of an integrity and authorization check. | |
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
@par Revision Reference: | |
This Protocol is introduced in EFI Specification 1.10. | |
**/ | |
#ifndef __BIS_H__ | |
#define __BIS_H__ | |
#define EFI_BIS_PROTOCOL_GUID \ | |
{ \ | |
0x0b64aab0, 0x5429, 0x11d4, {0x98, 0x16, 0x00, 0xa0, 0xc9, 0x1f, 0xad, 0xcf } \ | |
} | |
// | |
// X-Intel-BIS-ParameterSet | |
// Attribute value | |
// Binary Value of X-Intel-BIS-ParameterSet Attribute. | |
// (Value is Base-64 encoded in actual signed manifest). | |
// | |
#define BOOT_OBJECT_AUTHORIZATION_PARMSET_GUID \ | |
{ \ | |
0xedd35e31, 0x7b9, 0x11d2, { 0x83,0xa3,0x0,0xa0,0xc9,0x1f,0xad,0xcf } \ | |
} | |
typedef struct _EFI_BIS_PROTOCOL EFI_BIS_PROTOCOL; | |
// | |
// Basic types | |
// | |
typedef VOID *BIS_APPLICATION_HANDLE; | |
typedef UINT16 BIS_ALG_ID; | |
typedef UINT32 BIS_CERT_ID; | |
/// | |
/// EFI_BIS_DATA instances obtained from BIS must be freed by calling Free( ). | |
/// | |
typedef struct { | |
UINT32 Length; ///< The length of Data in 8 bit bytes. | |
UINT8 *Data; ///< 32 Bit Flat Address of data. | |
} EFI_BIS_DATA; | |
/// | |
/// EFI_BIS_VERSION type. | |
/// | |
typedef struct { | |
UINT32 Major; ///< The major BIS version number. | |
UINT32 Minor; ///< A minor BIS version number. | |
} EFI_BIS_VERSION; | |
// | |
// ----------------------------------------------------// | |
// Use these values to initialize EFI_BIS_VERSION.Major | |
// and to interpret results of Initialize. | |
// ----------------------------------------------------// | |
// | |
#define BIS_CURRENT_VERSION_MAJOR BIS_VERSION_1 | |
#define BIS_VERSION_1 1 | |
/// | |
/// EFI_BIS_SIGNATURE_INFO type. | |
/// | |
typedef struct { | |
BIS_CERT_ID CertificateID; ///< Truncated hash of platform Boot Object | |
BIS_ALG_ID AlgorithmID; ///< A signature algorithm number. | |
UINT16 KeyLength; ///< The length of alg. keys in bits. | |
} EFI_BIS_SIGNATURE_INFO; | |
/// | |
/// values for EFI_BIS_SIGNATURE_INFO.AlgorithmID. | |
/// The exact numeric values come from the | |
/// "Common Data Security Architecture (CDSA) Specification". | |
/// | |
#define BIS_ALG_DSA (41) // CSSM_ALGID_DSA | |
#define BIS_ALG_RSA_MD5 (42) // CSSM_ALGID_MD5_WITH_RSA | |
/// | |
/// values for EFI_BIS_SIGNATURE_INFO.CertificateId. | |
/// | |
#define BIS_CERT_ID_DSA BIS_ALG_DSA // CSSM_ALGID_DSA | |
#define BIS_CERT_ID_RSA_MD5 BIS_ALG_RSA_MD5 // CSSM_ALGID_MD5_WITH_RSA | |
/// | |
/// The mask value that gets applied to the truncated hash of a | |
/// platform Boot Object Authorization Certificate to create the certificateID. | |
/// A certificateID must not have any bits set to the value 1 other than bits in | |
/// this mask. | |
/// | |
#define BIS_CERT_ID_MASK (0xFF7F7FFF) | |
/// | |
/// Macros for dealing with the EFI_BIS_DATA object obtained | |
/// from BIS_GetSignatureInfo(). | |
/// BIS_GET_SIGINFO_COUNT - tells how many EFI_BIS_SIGNATURE_INFO | |
/// elements are contained in a EFI_BIS_DATA struct pointed to | |
/// by the provided EFI_BIS_DATA*. | |
/// | |
#define BIS_GET_SIGINFO_COUNT(BisDataPtr) ((BisDataPtr)->Length / sizeof (EFI_BIS_SIGNATURE_INFO)) | |
/// | |
/// BIS_GET_SIGINFO_ARRAY - produces a EFI_BIS_SIGNATURE_INFO* | |
/// from a given EFI_BIS_DATA*. | |
/// | |
#define BIS_GET_SIGINFO_ARRAY(BisDataPtr) ((EFI_BIS_SIGNATURE_INFO *) (BisDataPtr)->Data) | |
/// | |
/// Support an old name for backward compatibility. | |
/// | |
#define BOOT_OBJECT_AUTHORIZATION_PARMSET_GUIDVALUE \ | |
BOOT_OBJECT_AUTHORIZATION_PARMSET_GUID | |
/** | |
Initializes the BIS service, checking that it is compatible with the version requested by the caller. | |
After this call, other BIS functions may be invoked. | |
@param This A pointer to the EFI_BIS_PROTOCOL object. | |
@param AppHandle The function writes the new BIS_APPLICATION_HANDLE if | |
successful, otherwise it writes NULL. The caller must eventually | |
destroy this handle by calling Shutdown(). | |
@param InterfaceVersion On input, the caller supplies the major version number of the | |
interface version desired. | |
On output, both the major and minor | |
version numbers are updated with the major and minor version | |
numbers of the interface. This update is done whether or not the | |
initialization was successful. | |
@param TargetAddress Indicates a network or device address of the BIS platform to connect to. | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_INCOMPATIBLE_VERSION The InterfaceVersion.Major requested by the | |
caller was not compatible with the interface version of the | |
implementation. The InterfaceVersion.Major has | |
been updated with the current interface version. | |
@retval EFI_UNSUPPORTED This is a local-platform implementation and | |
TargetAddress.Data was not NULL, or | |
TargetAddress.Data was any other value that was not | |
supported by the implementation. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_DEVICE_ERROR One of the following device errors: | |
* The function encountered an unexpected internal failure while initializing a cryptographic software module | |
* No cryptographic software module with compatible version was found | |
found | |
* A resource limitation was encountered while using a cryptographic software module. | |
@retval EFI_INVALID_PARAMETER The This parameter supplied by the caller is NULL or does not | |
reference a valid EFI_BIS_PROTOCOL object. Or, | |
the AppHandle parameter supplied by the caller is NULL or | |
an invalid memory reference. Or, | |
the InterfaceVersion parameter supplied by the caller | |
is NULL or an invalid memory reference. Or, | |
the TargetAddress parameter supplied by the caller is | |
NULL or an invalid memory reference. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_INITIALIZE)( | |
IN EFI_BIS_PROTOCOL *This, | |
OUT BIS_APPLICATION_HANDLE *AppHandle, | |
IN OUT EFI_BIS_VERSION *InterfaceVersion, | |
IN EFI_BIS_DATA *TargetAddress | |
); | |
/** | |
Frees memory structures allocated and returned by other functions in the EFI_BIS protocol. | |
@param AppHandle An opaque handle that identifies the caller's instance of initialization | |
of the BIS service. | |
@param ToFree An EFI_BIS_DATA* and associated memory block to be freed. | |
This EFI_BIS_DATA* must have been allocated by one of the other BIS functions. | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_NO_MAPPING The AppHandle parameter is not or is no longer a valid | |
application instance handle associated with the EFI_BIS protocol. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_INVALID_PARAMETER The ToFree parameter is not or is no longer a memory resource | |
associated with this AppHandle. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_FREE)( | |
IN BIS_APPLICATION_HANDLE AppHandle, | |
IN EFI_BIS_DATA *ToFree | |
); | |
/** | |
Shuts down an application's instance of the BIS service, invalidating the application handle. After | |
this call, other BIS functions may no longer be invoked using the application handle value. | |
@param AppHandle An opaque handle that identifies the caller's instance of initialization | |
of the BIS service. | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_NO_MAPPING The AppHandle parameter is not, or is no longer, a valid | |
application instance handle associated with the EFI_BIS protocol. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_DEVICE_ERROR The function encountered an unexpected internal failure while | |
returning resources associated with a cryptographic software module, or | |
while trying to shut down a cryptographic software module. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_SHUTDOWN)( | |
IN BIS_APPLICATION_HANDLE AppHandle | |
); | |
/** | |
Retrieves the certificate that has been configured as the identity of the organization designated as | |
the source of authorization for signatures of boot objects. | |
@param AppHandle An opaque handle that identifies the caller's instance of initialization | |
of the BIS service. | |
@param Certificate The function writes an allocated EFI_BIS_DATA* containing the Boot | |
Object Authorization Certificate object. The caller must | |
eventually free the memory allocated by this function using the function Free(). | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_NO_MAPPING The AppHandle parameter is not or is no longer a valid | |
application instance handle associated with the EFI_BIS protocol. | |
@retval EFI_NOT_FOUND There is no Boot Object Authorization Certificate currently installed. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_INVALID_PARAMETER The Certificate parameter supplied by the caller is NULL or | |
an invalid memory reference. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_GET_BOOT_OBJECT_AUTHORIZATION_CERTIFICATE)( | |
IN BIS_APPLICATION_HANDLE AppHandle, | |
OUT EFI_BIS_DATA **Certificate | |
); | |
/** | |
Verifies the integrity and authorization of the indicated data object according to the | |
indicated credentials. | |
@param AppHandle An opaque handle that identifies the caller's instance of initialization | |
of the BIS service. | |
@param Credentials A Signed Manifest containing verification information for the indicated | |
data object. | |
@param DataObject An in-memory copy of the raw data object to be verified. | |
@param IsVerified The function writes TRUE if the verification succeeded, otherwise | |
FALSE. | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_NO_MAPPING The AppHandle parameter is not or is no longer a valid | |
application instance handle associated with the EFI_BIS protocol. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_INVALID_PARAMETER One or more parameters are invalid. | |
@retval EFI_SECURITY_VIOLATION The signed manifest supplied as the Credentials parameter | |
was invalid (could not be parsed) or Platform-specific authorization failed, etc. | |
@retval EFI_DEVICE_ERROR An unexpected internal error occurred. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_VERIFY_BOOT_OBJECT)( | |
IN BIS_APPLICATION_HANDLE AppHandle, | |
IN EFI_BIS_DATA *Credentials, | |
IN EFI_BIS_DATA *DataObject, | |
OUT BOOLEAN *IsVerified | |
); | |
/** | |
Retrieves the current status of the Boot Authorization Check Flag. | |
@param AppHandle An opaque handle that identifies the caller's instance of initialization | |
of the BIS service. | |
@param CheckIsRequired The function writes the value TRUE if a Boot Authorization Check is | |
currently required on this platform, otherwise the function writes | |
FALSE. | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_NO_MAPPING The AppHandle parameter is not or is no longer a valid | |
application instance handle associated with the EFI_BIS protocol. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_INVALID_PARAMETER The CheckIsRequired parameter supplied by the caller is | |
NULL or an invalid memory reference. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_GET_BOOT_OBJECT_AUTHORIZATION_CHECKFLAG)( | |
IN BIS_APPLICATION_HANDLE AppHandle, | |
OUT BOOLEAN *CheckIsRequired | |
); | |
/** | |
Retrieves a unique token value to be included in the request credential for the next update of any | |
parameter in the Boot Object Authorization set | |
@param AppHandle An opaque handle that identifies the caller's | |
instance of initialization of the BIS service. | |
@param UpdateToken The function writes an allocated EFI_BIS_DATA* | |
containing the newunique update token value. | |
The caller musteventually free the memory allocated | |
by this function using the function Free(). | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_NO_MAPPING The AppHandle parameter is not or is no longer a valid | |
application instance handle associated with the EFI_BIS protocol. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_INVALID_PARAMETER The UpdateToken parameter supplied by the caller is NULL or | |
an invalid memory reference. | |
@retval EFI_DEVICE_ERROR An unexpected internal error occurred. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_GET_BOOT_OBJECT_AUTHORIZATION_UPDATE_TOKEN)( | |
IN BIS_APPLICATION_HANDLE AppHandle, | |
OUT EFI_BIS_DATA **UpdateToken | |
); | |
/** | |
Updates one of the configurable parameters of the Boot Object Authorization set. | |
@param AppHandle An opaque handle that identifies the caller's | |
instance of initialization of the BIS service. | |
@param RequestCredential This is a Signed Manifest with embedded attributes | |
that carry the details of the requested update. | |
@param NewUpdateToken The function writes an allocated EFI_BIS_DATA* | |
containing the new unique update token value. | |
The caller must eventually free the memory allocated | |
by this function using the function Free(). | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_NO_MAPPING The AppHandle parameter is not or is no longer a valid | |
application instance handle associated with the EFI_BIS protocol. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_INVALID_PARAMETER One or more parameters are invalid. | |
@retval EFI_SECURITY_VIOLATION The signed manifest supplied as the RequestCredential parameter | |
was invalid (could not be parsed) or Platform-specific authorization failed, etc. | |
@retval EFI_DEVICE_ERROR An unexpected internal error occurred while analyzing the new | |
certificate's key algorithm, or while attempting to retrieve | |
the public key algorithm of the manifest's signer's certificate, | |
or An unexpected internal error occurred in a cryptographic software module. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_UPDATE_BOOT_OBJECT_AUTHORIZATION)( | |
IN BIS_APPLICATION_HANDLE AppHandle, | |
IN EFI_BIS_DATA *RequestCredential, | |
OUT EFI_BIS_DATA **NewUpdateToken | |
); | |
/** | |
Verifies the integrity and authorization of the indicated data object according to the indicated | |
credentials and authority certificate. | |
@param AppHandle An opaque handle that identifies the caller's instance of initialization | |
of the BIS service. | |
@param Credentials A Signed Manifest containing verification information for the | |
indicated data object. | |
@param DataObject An in-memory copy of the raw data object to be verified. | |
@param SectionName An ASCII string giving the section name in the | |
manifest holding the verification information (in other words, | |
hash value) that corresponds to DataObject. | |
@param AuthorityCertificate A digital certificate whose public key must match the signer's | |
public key which is found in the credentials. | |
@param IsVerified The function writes TRUE if the verification was successful. | |
Otherwise, the function writes FALSE. | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_NO_MAPPING The AppHandle parameter is not or is no longer a valid | |
application instance handle associated with the EFI_BIS protocol. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_INVALID_PARAMETER One or more parameters are invalid. | |
@retval EFI_SECURITY_VIOLATION The Credentials.Data supplied by the caller is NULL, | |
or the AuthorityCertificate supplied by the caller was | |
invalid (could not be parsed), | |
or Platform-specific authorization failed, etc. | |
@retval EFI_DEVICE_ERROR An unexpected internal error occurred while attempting to retrieve | |
the public key algorithm of the manifest's signer's certificate, | |
or An unexpected internal error occurred in a cryptographic software module. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_VERIFY_OBJECT_WITH_CREDENTIAL)( | |
IN BIS_APPLICATION_HANDLE AppHandle, | |
IN EFI_BIS_DATA *Credentials, | |
IN EFI_BIS_DATA *DataObject, | |
IN EFI_BIS_DATA *SectionName, | |
IN EFI_BIS_DATA *AuthorityCertificate, | |
OUT BOOLEAN *IsVerified | |
); | |
/** | |
Retrieves a list of digital certificate identifier, digital signature algorithm, hash algorithm, and keylength | |
combinations that the platform supports. | |
@param AppHandle An opaque handle that identifies the caller's instance of initialization | |
of the BIS service. | |
@param SignatureInfo The function writes an allocated EFI_BIS_DATA* containing the array | |
of EFI_BIS_SIGNATURE_INFO structures representing the supported | |
digital certificate identifier, algorithm, and key length combinations. | |
The caller must eventually free the memory allocated by this function using the function Free(). | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_NO_MAPPING The AppHandle parameter is not or is no longer a valid | |
application instance handle associated with the EFI_BIS protocol. | |
@retval EFI_OUT_OF_RESOURCES The function failed due to lack of memory or other resources. | |
@retval EFI_INVALID_PARAMETER The SignatureInfo parameter supplied by the caller is NULL | |
or an invalid memory reference. | |
@retval EFI_DEVICE_ERROR An unexpected internal error occurred in a | |
cryptographic software module, or | |
The function encountered an unexpected internal consistency check | |
failure (possible corruption of stored Boot Object Authorization Certificate). | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_BIS_GET_SIGNATURE_INFO)( | |
IN BIS_APPLICATION_HANDLE AppHandle, | |
OUT EFI_BIS_DATA **SignatureInfo | |
); | |
/// | |
/// The EFI_BIS_PROTOCOL is used to check a digital signature of a data block against a digital | |
/// certificate for the purpose of an integrity and authorization check. | |
/// | |
struct _EFI_BIS_PROTOCOL { | |
EFI_BIS_INITIALIZE Initialize; | |
EFI_BIS_SHUTDOWN Shutdown; | |
EFI_BIS_FREE Free; | |
EFI_BIS_GET_BOOT_OBJECT_AUTHORIZATION_CERTIFICATE GetBootObjectAuthorizationCertificate; | |
EFI_BIS_GET_BOOT_OBJECT_AUTHORIZATION_CHECKFLAG GetBootObjectAuthorizationCheckFlag; | |
EFI_BIS_GET_BOOT_OBJECT_AUTHORIZATION_UPDATE_TOKEN GetBootObjectAuthorizationUpdateToken; | |
EFI_BIS_GET_SIGNATURE_INFO GetSignatureInfo; | |
EFI_BIS_UPDATE_BOOT_OBJECT_AUTHORIZATION UpdateBootObjectAuthorization; | |
EFI_BIS_VERIFY_BOOT_OBJECT VerifyBootObject; | |
EFI_BIS_VERIFY_OBJECT_WITH_CREDENTIAL VerifyObjectWithCredential; | |
}; | |
extern EFI_GUID gEfiBisProtocolGuid; | |
extern EFI_GUID gBootObjectAuthorizationParmsetGuid; | |
#endif |