mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
344 lines
12 KiB
C
344 lines
12 KiB
C
/** @file
|
|
The Apple Secure Boot protocol provides services to verify a trusted image's
|
|
integrity.
|
|
|
|
Copyright (C) 2019, Download-Fritz. All rights reserved.<BR>
|
|
This program and the accompanying materials are licensed and made available
|
|
under the terms and conditions of the BSD License which accompanies this
|
|
distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php.
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#ifndef APPLE_SECURE_BOOT_H
|
|
#define APPLE_SECURE_BOOT_H
|
|
|
|
#define APPLE_SECURE_BOOT_PROTOCOL_REVISION 4U
|
|
|
|
#define APPLE_SECURE_BOOT_PROTOCOL_GUID \
|
|
{ 0x24B73556, 0x2197, 0x4702, \
|
|
{ 0x82, 0xA8, 0x3E, 0x13, 0x37, 0xDA, 0xFB, 0xF2 } }
|
|
|
|
typedef struct APPLE_SECURE_BOOT_PROTOCOL_ APPLE_SECURE_BOOT_PROTOCOL;
|
|
|
|
#define APPLE_SB_OBJ_TYPE(A, B, C, D) \
|
|
(UINT32)( \
|
|
((A) << 24UL) \
|
|
| ((B) << 16UL) \
|
|
| ((C) << 8UL) \
|
|
| ((D) << 0UL) \
|
|
)
|
|
|
|
//
|
|
// The keys are iterated in the order in which they are defined here in
|
|
// AppleBds to validate any loaded image.
|
|
//
|
|
#define APPLE_SB_OBJ_EFIBOOT APPLE_SB_OBJ_TYPE ('e', 'f', 'i', 'b')
|
|
#define APPLE_SB_OBJ_EFIBOOT_DEBUG APPLE_SB_OBJ_TYPE ('e', 'f', 'b', 'd')
|
|
#define APPLE_SB_OBJ_EFIBOOT_BASE APPLE_SB_OBJ_TYPE ('e', 'f', 'b', 'b')
|
|
|
|
#define APPLE_SB_OBJ_MUPD APPLE_SB_OBJ_TYPE ('m', 'u', 'p', 'd')
|
|
#define APPLE_SB_OBJ_HPMU APPLE_SB_OBJ_TYPE ('h', 'p', 'm', 'u')
|
|
#define APPLE_SB_OBJ_THOU APPLE_SB_OBJ_TYPE ('t', 'h', 'o', 'u')
|
|
#define APPLE_SB_OBJ_GPUU APPLE_SB_OBJ_TYPE ('g', 'p', 'u', 'u')
|
|
#define APPLE_SB_OBJ_ETHU APPLE_SB_OBJ_TYPE ('e', 't', 'h', 'u')
|
|
#define APPLE_SB_OBJ_SDFU APPLE_SB_OBJ_TYPE ('s', 'd', 'f', 'u')
|
|
#define APPLE_SB_OBJ_DTHU APPLE_SB_OBJ_TYPE ('d', 't', 'h', 'u')
|
|
|
|
//
|
|
// The keys are iterated in the order in which they are defined here in
|
|
// boot.efi to validate the loaded kernel image.
|
|
//
|
|
#define APPLE_SB_OBJ_KERNEL APPLE_SB_OBJ_TYPE ('m', 'k', 'r', 'n')
|
|
#define APPLE_SB_OBJ_KERNEL_DEBUG APPLE_SB_OBJ_TYPE ('m', 'k', 'r', 'd')
|
|
|
|
/**
|
|
Sets the Secure Boot availability state.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[in] Available The new availability status for Secure Boot.
|
|
|
|
**/
|
|
typedef
|
|
VOID
|
|
(EFIAPI *APPLE_SB_SET_AVAILABILITY)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
IN BOOLEAN Available
|
|
);
|
|
|
|
/**
|
|
Verify the signature of the file at DevicePath via the matching IMG4
|
|
Manifest.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[in] DevicePath The device path to the image to validate.
|
|
@param[in] ObjType The IMG4 object type to validate against.
|
|
@param[in] SetFailureReason Whether to set the failure reason.
|
|
|
|
@retval EFI_SUCCESS The file at DevicePath is correctly signed.
|
|
@retval EFI_LOAD_ERROR The current policy is invalid.
|
|
@retval EFI_INVALID_PARAMETER One or more required parameters are NULL.
|
|
@retval EFI_UNSUPPORTED Secure Boot is currently unavailable or
|
|
disabled.
|
|
@retval EFI_OUT_OF_RESOURCES Not enough resources are available.
|
|
@retval EFI_NO_MEDIA The file at DevicePath could not be read.
|
|
@retval EFI_NOT_FOUND The file's IMG4 Manifest could not be found.
|
|
@retval EFI_SECURITY_VIOLATION The file's signature is invalid.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_VERIFY_IMG4_BY_PATH)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
|
IN UINT32 ObjType,
|
|
IN BOOLEAN SetFailureReason
|
|
);
|
|
|
|
/**
|
|
Verify the signature of ImageBuffer against Type within a IMG4 Manifest.
|
|
|
|
@param[in] This The pointer to the current protocol instance.
|
|
@param[in] ImageBuffer The buffer to validate.
|
|
@param[in] ImageSize The size, in bytes, of ImageBuffer.
|
|
@param[in] ManifestBuffer The buffer of the IMG4 Manifest.
|
|
@param[in] ManifestSize The size, in bytes, of ManifestBuffer.
|
|
@param[in] ObjType The IMG4 object type to validate against.
|
|
@param[in] SetFailureReason Whether to set the failure reason.
|
|
|
|
@retval EFI_SUCCESS ImageBuffer is correctly signed.
|
|
@retval EFI_LOAD_ERROR The current policy is invalid.
|
|
@retval EFI_INVALID_PARAMETER One or more required parameters are NULL.
|
|
@retval EFI_UNSUPPORTED Secure Boot is currently unavailable or
|
|
disabled.
|
|
@retval EFI_OUT_OF_RESOURCES Not enough resources are available.
|
|
@retval EFI_SECURITY_VIOLATION ImageBuffer's signature is invalid.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_VERIFY_IMG4)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
IN CONST VOID *ImageBuffer,
|
|
IN UINTN ImageSize,
|
|
IN CONST VOID *ManifestBuffer,
|
|
IN UINTN ManifestSize,
|
|
IN UINT32 ObjType,
|
|
IN BOOLEAN SetFailureReason
|
|
);
|
|
|
|
/**
|
|
Retrieves the current Secure Boot policy.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[out] Policy On output, the current Secure Boot policy.
|
|
|
|
@retval EFI_SUCCESS The current policy has been returned.
|
|
@retval EFI_INVALID_PARAMETER One or more required parameters are NULL.
|
|
@retval EFI_NOT_FOUND The current policy could not be retrieved.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_GET_POLICY)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
OUT UINT8 *Policy
|
|
);
|
|
|
|
/**
|
|
Retrieves the current Secure Boot failure reason.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[out] Reason On output, the current failure reason.
|
|
|
|
@retval EFI_SUCCESS The current failure reason has been returned.
|
|
@retval EFI_INVALID_PARAMETER One or more required parameters are NULL.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_GET_FAILURE_REASON)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
OUT UINT8 *Reason
|
|
);
|
|
|
|
/**
|
|
Sets the Secure Boot failure reason.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[in] Reason The failure reason to set.
|
|
|
|
@retval EFI_SUCCESS The failure reason has been set successfully.
|
|
@retval EFI_UNSUPPORTED Secure Boot is currently unavailable.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_SET_FAILURE_REASON)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
IN UINT8 Reason
|
|
);
|
|
|
|
/**
|
|
Retrieves the current Secure Boot Kernel failure reason.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[out] Reason On output, the current Kernel failure reason.
|
|
|
|
@retval EFI_SUCCESS The current failure reason has been returned.
|
|
@retval EFI_INVALID_PARAMETER One or more required parameters are NULL.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_GET_KERNEL_FAILURE_REASON)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
OUT UINT8 *Reason
|
|
);
|
|
|
|
/**
|
|
Sets the Secure Boot Kernel failure reason.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[in] Reason The Kernel failure reason to set.
|
|
|
|
@retval EFI_SUCCESS The failure reason has been set successfully.
|
|
@retval EFI_UNSUPPORTED Secure Boot is currently unavailable.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_SET_KERNEL_FAILURE_REASON)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
IN UINT8 Reason
|
|
);
|
|
|
|
/**
|
|
Verify the signature of the image at DebicePath against a Microsoft
|
|
certificate chain.
|
|
|
|
@param[in] This The pointer to the current protocol instance.
|
|
@param[in] DevicePath The device path to the image to validate.
|
|
@param[in] SetFailureReason Whether to set the failure reason.
|
|
|
|
@retval EFI_SUCCESS The file at DevicePath is correctly signed.
|
|
@retval EFI_LOAD_ERROR The current policy is invalid.
|
|
@retval EFI_INVALID_PARAMETER One or more required parameters are NULL.
|
|
@retval EFI_UNSUPPORTED Secure Boot is currently unavailable or
|
|
disabled.
|
|
@retval EFI_OUT_OF_RESOURCES Not enough resources are available.
|
|
@retval EFI_NO_MEDIA The file at DevicePath could not be read.
|
|
@retval EFI_ACCESS DENIED A suiting certificate could not be found.
|
|
@retval EFI_SECURITY_VIOLATION the file's signature is invalid.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_VERIFY_WINDOWS_BY_PATH)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
|
IN BOOLEAN SetFailureReason
|
|
);
|
|
|
|
/**
|
|
Verify the signature of ImageBuffer against a Microsoft certificate chain.
|
|
|
|
@param[in] This The pointer to the current protocol instance.
|
|
@param[in] ImageBuffer The buffer to validate.
|
|
@param[in] ImageSize The size, in bytes, of ImageBuffer.
|
|
@param[in] SetFailureReason Whether to set the failure reason.
|
|
|
|
@retval EFI_SUCCESS ImageBuffer is correctly signed.
|
|
@retval EFI_LOAD_ERROR The current policy is invalid.
|
|
@retval EFI_INVALID_PARAMETER One or more required parameters are NULL.
|
|
@retval EFI_UNSUPPORTED Secure Boot is currently unavailable or
|
|
disabled.
|
|
@retval EFI_ACCESS DENIED A suiting certificate could not be found.
|
|
@retval EFI_SECURITY_VIOLATION ImageBuffer's signature is invalid.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_VERIFY_WINDOWS)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
IN CONST VOID *ImageBuffer,
|
|
IN UINTN ImageSize,
|
|
IN BOOLEAN SetFailureReason
|
|
);
|
|
|
|
/**
|
|
Retrieves the current Secure Boot Windows policy.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[out] Policy On output, the current Secure Boot Windows policy.
|
|
|
|
@retval EFI_SUCCESS The current policy has been returned.
|
|
@retval EFI_INVALID_PARAMETER One or more required parameters are NULL.
|
|
@retval EFI_NOT_FOUND The current policy could not be retrieved.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_GET_WINDOWS_POLICY)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
OUT UINT8 *Policy
|
|
);
|
|
|
|
/**
|
|
Retrieves the current Secure Boot Windows failure reason.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[out] Reason On output, the current Windows failure reason.
|
|
|
|
@retval EFI_SUCCESS The current failure reason has been returned.
|
|
@retval EFI_INVALID_PARAMETER One or more required parameters are NULL.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_GET_WINDOWS_FAILURE_REASON)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
OUT UINT8 *Reason
|
|
);
|
|
|
|
/**
|
|
Sets the Secure Boot Windows failure reason.
|
|
|
|
@param[in] This A pointer to the current protocol instance.
|
|
@param[in] Reason The Windows failure reason to set.
|
|
|
|
@retval EFI_SUCCESS The failure reason has been set successfully.
|
|
@retval EFI_UNSUPPORTED Secure Boot is currently unavailable.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *APPLE_SB_SET_WINDOWS_FAILURE_REASON)(
|
|
IN APPLE_SECURE_BOOT_PROTOCOL *This,
|
|
IN UINT8 Reason
|
|
);
|
|
|
|
struct APPLE_SECURE_BOOT_PROTOCOL_ {
|
|
UINTN Revision;
|
|
APPLE_SB_SET_AVAILABILITY SetAvailability;
|
|
APPLE_SB_VERIFY_IMG4_BY_PATH VerifyImg4ByPath;
|
|
APPLE_SB_VERIFY_IMG4 VerifyImg4;
|
|
APPLE_SB_GET_POLICY GetPolicy;
|
|
APPLE_SB_GET_FAILURE_REASON GetFailureReason;
|
|
APPLE_SB_SET_FAILURE_REASON SetFailureReason;
|
|
APPLE_SB_GET_KERNEL_FAILURE_REASON GetKernelFailureReason;
|
|
APPLE_SB_SET_KERNEL_FAILURE_REASON SetKernelFailureReason;
|
|
APPLE_SB_VERIFY_WINDOWS_BY_PATH VerifyWindowsByPath;
|
|
APPLE_SB_VERIFY_WINDOWS VerifyWindows;
|
|
APPLE_SB_GET_WINDOWS_POLICY GetWindowsPolicy;
|
|
APPLE_SB_GET_WINDOWS_FAILURE_REASON GetWindowsFailureReason;
|
|
APPLE_SB_SET_WINDOWS_FAILURE_REASON SetWindowsFailureReason;
|
|
};
|
|
|
|
extern EFI_GUID gAppleSecureBootProtocolGuid;
|
|
|
|
#endif // APPLE_SECURE_BOOT_H
|