| /** @file | |
| Device Security Protocol definition. | |
| It is used to authenticate a device based upon the platform policy. | |
| It is similar to the EFI_SECURITY_ARCH_PROTOCOL, which is used to verify a image. | |
| Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef __DEVICE_SECURITY_H__ | |
| #define __DEVICE_SECURITY_H__ | |
| // | |
| // Device Security Protocol GUID value | |
| // | |
| #define EDKII_DEVICE_SECURITY_PROTOCOL_GUID \ | |
| { \ | |
| 0x5d6b38c8, 0x5510, 0x4458, { 0xb4, 0x8d, 0x95, 0x81, 0xcf, 0xa7, 0xb0, 0xd } \ | |
| } | |
| // | |
| // Forward reference for pure ANSI compatability | |
| // | |
| typedef struct _EDKII_DEVICE_SECURITY_PROTOCOL EDKII_DEVICE_SECURITY_PROTOCOL; | |
| // | |
| // Revision The revision to which the DEVICE_SECURITY interface adheres. | |
| // All future revisions must be backwards compatible. | |
| // If a future version is not back wards compatible it is not the same GUID. | |
| // | |
| #define EDKII_DEVICE_SECURITY_PROTOCOL_REVISION 0x00010000 | |
| // | |
| // The device identifier. | |
| // | |
| typedef struct { | |
| /// | |
| /// Version of this data structure. | |
| /// | |
| UINT32 Version; | |
| /// | |
| /// Type of the device. | |
| /// This field is also served as a device Access protocol GUID. | |
| /// The device access protocol is installed on the DeviceHandle. | |
| /// The device access protocol is device specific. | |
| /// EDKII_DEVICE_IDENTIFIER_TYPE_PCI_GUID means the device access protocol is PciIo. | |
| /// EDKII_DEVICE_IDENTIFIER_TYPE_USB_GUID means the device access protocol is UsbIo. | |
| /// | |
| EFI_GUID DeviceType; | |
| /// | |
| /// The handle created for this device. | |
| /// NOTE: This might be a temporary handle. | |
| /// If the device is not authenticated, this handle shall be uninstalled. | |
| /// | |
| /// As minimal requirement, there should be 2 protocols installed on the device handle. | |
| /// 1) An EFI_DEVICE_PATH_PROTOCOL with EFI_DEVICE_PATH_PROTOCOL_GUID. | |
| /// 2) A device access protocol with EDKII_DEVICE_IDENTIFIER_TYPE_xxx_GUID. | |
| /// If the device is PCI device, the EFI_PCI_IO_PROTOCOL is installed with | |
| /// EDKII_DEVICE_IDENTIFIER_TYPE_PCI_GUID. | |
| /// If the device is USB device, the EFI_USB_IO_PROTOCOL is installed with | |
| /// EDKII_DEVICE_IDENTIFIER_TYPE_USB_GUID. | |
| /// | |
| /// The device access protocol is required, because the verifier need have a way | |
| /// to communciate with the device hardware to get the measurement or do the | |
| /// challenge/response for the device authentication. | |
| /// | |
| /// NOTE: We don't use EFI_PCI_IO_PROTOCOL_GUID or EFI_USB_IO_PROTOCOL_GUID here, | |
| /// because we don't want to expose a real protocol. A platform may have driver | |
| /// register a protocol notify function. Installing a real protocol may cause | |
| /// the callback function being executed before the device is authenticated. | |
| /// | |
| EFI_HANDLE DeviceHandle; | |
| } EDKII_DEVICE_IDENTIFIER; | |
| // | |
| // Revision The revision to which the DEVICE_IDENTIFIER interface adheres. | |
| // All future revisions must be backwards compatible. | |
| // | |
| #define EDKII_DEVICE_IDENTIFIER_REVISION 0x00010000 | |
| // | |
| // Device Identifier GUID value | |
| // | |
| #define EDKII_DEVICE_IDENTIFIER_TYPE_PCI_GUID \ | |
| { \ | |
| 0x2509b2f1, 0xa022, 0x4cca, { 0xaf, 0x70, 0xf9, 0xd3, 0x21, 0xfb, 0x66, 0x49 } \ | |
| } | |
| #define EDKII_DEVICE_IDENTIFIER_TYPE_USB_GUID \ | |
| { \ | |
| 0x7394f350, 0x394d, 0x488c, { 0xbb, 0x75, 0xc, 0xab, 0x7b, 0x12, 0xa, 0xc5 } \ | |
| } | |
| /** | |
| The device driver uses this service to measure and/or verify a device. | |
| The flow in device driver is: | |
| 1) Device driver discovers a new device. | |
| 2) Device driver creates an EFI_DEVICE_PATH_PROTOCOL. | |
| 3) Device driver creates a device access protocol. e.g. | |
| EFI_PCI_IO_PROTOCOL for PCI device. | |
| EFI_USB_IO_PROTOCOL for USB device. | |
| EFI_EXT_SCSI_PASS_THRU_PROTOCOL for SCSI device. | |
| EFI_ATA_PASS_THRU_PROTOCOL for ATA device. | |
| EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL for NVMe device. | |
| EFI_SD_MMC_PASS_THRU_PROTOCOL for SD/MMC device. | |
| 4) Device driver installs the EFI_DEVICE_PATH_PROTOCOL with EFI_DEVICE_PATH_PROTOCOL_GUID, | |
| and the device access protocol with EDKII_DEVICE_IDENTIFIER_TYPE_xxx_GUID. | |
| Once it is done, a DeviceHandle is returned. | |
| 5) Device driver creates EDKII_DEVICE_IDENTIFIER with EDKII_DEVICE_IDENTIFIER_TYPE_xxx_GUID | |
| and the DeviceHandle. | |
| 6) Device driver calls DeviceAuthenticate(). | |
| 7) If DeviceAuthenticate() returns EFI_SECURITY_VIOLATION, the device driver uninstalls | |
| all protocols on this handle. | |
| 8) If DeviceAuthenticate() returns EFI_SUCCESS, the device driver installs the device access | |
| protocol with a real protocol GUID. e.g. | |
| EFI_PCI_IO_PROTOCOL with EFI_PCI_IO_PROTOCOL_GUID. | |
| EFI_USB_IO_PROTOCOL with EFI_USB_IO_PROTOCOL_GUID. | |
| @param[in] This The protocol instance pointer. | |
| @param[in] DeviceId The Identifier for the device. | |
| @retval EFI_SUCCESS The device specified by the DeviceId passed the measurement | |
| and/or authentication based upon the platform policy. | |
| If TCG measurement is required, the measurement is extended to TPM PCR. | |
| @retval EFI_SECURITY_VIOLATION The device fails to return the measurement data. | |
| @retval EFI_SECURITY_VIOLATION The device fails to response the authentication request. | |
| @retval EFI_SECURITY_VIOLATION The system fails to verify the device based upon the authentication response. | |
| @retval EFI_SECURITY_VIOLATION The system fails to extend the measurement to TPM PCR. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EDKII_DEVICE_AUTHENTICATE)( | |
| IN EDKII_DEVICE_SECURITY_PROTOCOL *This, | |
| IN EDKII_DEVICE_IDENTIFIER *DeviceId | |
| ); | |
| /// | |
| /// Device Security Protocol structure. | |
| /// It is similar to the EFI_SECURITY_ARCH_PROTOCOL, which is used to verify a image. | |
| /// This protocol is used to authenticate a device based upon the platform policy. | |
| /// | |
| struct _EDKII_DEVICE_SECURITY_PROTOCOL { | |
| UINT64 Revision; | |
| EDKII_DEVICE_AUTHENTICATE DeviceAuthenticate; | |
| }; | |
| /// | |
| /// Device Security Protocol GUID variable. | |
| /// | |
| extern EFI_GUID gEdkiiDeviceSecurityProtocolGuid; | |
| /// | |
| /// Device Identifier tpye GUID variable. | |
| /// | |
| extern EFI_GUID gEdkiiDeviceIdentifierTypePciGuid; | |
| extern EFI_GUID gEdkiiDeviceIdentifierTypeUsbGuid; | |
| #endif |