/** @file EDKII Device Security library for SPDM device. It follows the SPDM Specification. Copyright (c) 2024, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef SPDM_SECURITY_LIB_INTERNAL_H_ #define SPDM_SECURITY_LIB_INTERNAL_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "library/spdm_crypt_lib.h" #define SPDM_DEVICE_CONTEXT_SIGNATURE SIGNATURE_32 ('S', 'P', 'D', 'C') typedef struct { UINT32 Signature; // UEFI Context EDKII_DEVICE_IDENTIFIER DeviceId; BOOLEAN IsEmbeddedDevice; EFI_DEVICE_PATH_PROTOCOL *DevicePath; VOID *DeviceIo; UINT64 DeviceUID; // SPDM Context UINTN SpdmContextSize; VOID *SpdmContext; UINTN ScratchBufferSize; VOID *ScratchBuffer; UINT8 SpdmVersion; VOID *SpdmIoProtocol; EFI_SIGNATURE_LIST *SignatureList; UINTN SignatureListSize; } SPDM_DEVICE_CONTEXT; typedef struct { UINTN Signature; LIST_ENTRY Link; SPDM_DEVICE_CONTEXT *SpdmDeviceContext; } SPDM_DEVICE_CONTEXT_INSTANCE; #define SPDM_DEVICE_CONTEXT_INSTANCE_SIGNATURE SIGNATURE_32 ('S', 'D', 'C', 'S') #define SPDM_DEVICE_CONTEXT_INSTANCE_FROM_LINK(a) CR (a, SPDM_DEVICE_CONTEXT_INSTANCE, Link, SPDM_DEVICE_CONTEXT_INSTANCE_SIGNATURE) VOID * EFIAPI GetSpdmIoProtocolViaSpdmContext ( IN VOID *SpdmContext ); /** This function creates the spdm device context and init connection to the responder with the device info. @param[in] SpdmDeviceInfo A pointer to device info. @param[out] SecurityState A pointer to the security state of the requester. @return the spdm device conext after the init connection succeeds. **/ SPDM_DEVICE_CONTEXT * EFIAPI CreateSpdmDeviceContext ( IN EDKII_SPDM_DEVICE_INFO *SpdmDeviceInfo, OUT EDKII_DEVICE_SECURITY_STATE *SecurityState ); VOID EFIAPI DestroySpdmDeviceContext ( IN SPDM_DEVICE_CONTEXT *SpdmDeviceContext ); /** This function returns the SPDM device type for TCG SPDM event. @param[in] SpdmDeviceContext The SPDM context for the device. @return TCG SPDM device type **/ UINT32 EFIAPI GetSpdmDeviceType ( IN SPDM_DEVICE_CONTEXT *SpdmDeviceContext ); /** This function returns the SPDM device measurement context size for TCG SPDM event. @param[in] SpdmDeviceContext The SPDM context for the device. @return TCG SPDM device measurement context size **/ UINTN EFIAPI GetDeviceMeasurementContextSize ( IN SPDM_DEVICE_CONTEXT *SpdmDeviceContext ); /** This function creates the SPDM device measurement context for TCG SPDM event. @param[in] SpdmDeviceContext The SPDM context for the device. @param[in, OUT] DeviceContext The TCG SPDM device measurement context. @param[in] DeviceContextSize The size of TCG SPDM device measurement context. @retval EFI_SUCCESS The TCG SPDM device measurement context is returned. @retval EFI_UNSUPPORTED The TCG SPDM device measurement context is unsupported. **/ EFI_STATUS EFIAPI CreateDeviceMeasurementContext ( IN SPDM_DEVICE_CONTEXT *SpdmDeviceContext, IN OUT VOID *DeviceContext, IN UINTN DeviceContextSize ); /** Extend Certicate and auth state to NV Index and measure trust anchor to PCR. @param[in] SpdmDeviceContext The SPDM context for the device. @param[in] AuthState The auth state of this deice. @param[in] CertChainSize The size of cert chain. @param[in] CertChain A pointer to a destination buffer to store the certificate chain. @param[in] TrustAnchor A buffer to hold the trust_anchor which is used to validate the peer certificate, if not NULL. @param[in] TrustAnchorSize A buffer to hold the trust_anchor_size, if not NULL.. @param[in] SlotId The number of slot for the certificate chain. @param[out] SecurityState A pointer to the security state of the requester. @retval EFI_SUCCESS Operation completed successfully. @retval EFI_OUT_OF_RESOURCES Out of memory. @retval EFI_DEVICE_ERROR The operation was unsuccessful. **/ EFI_STATUS ExtendCertificate ( IN SPDM_DEVICE_CONTEXT *SpdmDeviceContext, IN UINT8 AuthState, IN UINTN CertChainSize, IN UINT8 *CertChain, IN VOID *TrustAnchor, IN UINTN TrustAnchorSize, IN UINT8 SlotId, OUT EDKII_DEVICE_SECURITY_STATE *SecurityState ); /** This function executes SPDM measurement and extend to TPM. @param[in] SpdmDeviceContext The SPDM context for the device. **/ EFI_STATUS EFIAPI DoDeviceMeasurement ( IN SPDM_DEVICE_CONTEXT *SpdmDeviceContext, IN UINT8 SlotId, OUT EDKII_DEVICE_SECURITY_STATE *SecurityState ); /** This function gets SPDM digest and certificates. @param[in] SpdmDeviceContext The SPDM context for the device. @param[out] AuthState The auth state of the devices. @param[out] ValidSlotId The number of slot for the certificate chain. @param[out] SecurityState The security state of the requester. @param[out] IsValidCertChain The validity of the certificate chain. @param[out] RootCertMatch The authority of the certificate chain. @retval EFI_SUCCESS Operation completed successfully. @retval EFI_OUT_OF_RESOURCES Out of memory. @retval EFI_DEVICE_ERROR The operation was unsuccessful. **/ EFI_STATUS EFIAPI DoDeviceCertificate ( IN SPDM_DEVICE_CONTEXT *SpdmDeviceContext, OUT UINT8 *AuthState, OUT UINT8 *ValidSlotId, OUT EDKII_DEVICE_SECURITY_STATE *SecurityState, OUT BOOLEAN *IsValidCertChain, OUT BOOLEAN *RootCertMatch ); /** This function does authentication. @param[in] SpdmDeviceContext The SPDM context for the device. @param[out] AuthState The auth state of the devices. @param[in] ValidSlotId The number of slot for the certificate chain. @param[out] SecurityState The security state of the requester. @retval EFI_SUCCESS Operation completed successfully. @retval EFI_OUT_OF_RESOURCES Out of memory. @retval EFI_DEVICE_ERROR The operation was unsuccessful. **/ EFI_STATUS EFIAPI DoDeviceAuthentication ( IN SPDM_DEVICE_CONTEXT *SpdmDeviceContext, OUT UINT8 *AuthState, IN UINT8 ValidSlotId, IN BOOLEAN IsValidCertChain, IN BOOLEAN RootCertMatch, OUT EDKII_DEVICE_SECURITY_STATE *SecurityState ); /** * This function dump raw data. * * @param data raw data * @param size raw data size **/ VOID EFIAPI InternalDumpData ( CONST UINT8 *Data, UINTN Size ); #endif