| /** @file |
| Definitions of Security Protocol & Data Model Specification (SPDM) |
| version 1.0.0 in Distributed Management Task Force (DMTF). |
| |
| Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> |
| SPDX-License-Identifier: BSD-2-Clause-Patent |
| |
| **/ |
| |
| |
| #ifndef __SPDM_H__ |
| #define __SPDM_H__ |
| |
| #pragma pack(1) |
| |
| /// |
| /// SPDM response code |
| /// |
| #define SPDM_DIGESTS 0x01 |
| #define SPDM_CERTIFICATE 0x02 |
| #define SPDM_CHALLENGE_AUTH 0x03 |
| #define SPDM_VERSION 0x04 |
| #define SPDM_MEASUREMENTS 0x60 |
| #define SPDM_CAPABILITIES 0x61 |
| #define SPDM_SET_CERT_RESPONSE 0x62 |
| #define SPDM_ALGORITHMS 0x63 |
| #define SPDM_ERROR 0x7F |
| /// |
| /// SPDM request code |
| /// |
| #define SPDM_GET_DIGESTS 0x81 |
| #define SPDM_GET_CERTIFICATE 0x82 |
| #define SPDM_CHALLENGE 0x83 |
| #define SPDM_GET_VERSION 0x84 |
| #define SPDM_GET_MEASUREMENTS 0xE0 |
| #define SPDM_GET_CAPABILITIES 0xE1 |
| #define SPDM_NEGOTIATE_ALGORITHMS 0xE3 |
| #define SPDM_RESPOND_IF_READY 0xFF |
| |
| /// |
| /// SPDM message header |
| /// |
| typedef struct { |
| UINT8 SPDMVersion; |
| UINT8 RequestResponseCode; |
| UINT8 Param1; |
| UINT8 Param2; |
| } SPDM_MESSAGE_HEADER; |
| |
| #define SPDM_MESSAGE_VERSION 0x10 |
| |
| /// |
| /// SPDM GET_VERSION request |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| } SPDM_GET_VERSION_REQUEST; |
| |
| /// |
| /// SPDM GET_VERSION response |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| UINT8 Reserved; |
| UINT8 VersionNumberEntryCount; |
| //SPDM_VERSION_NUMBER VersionNumberEntry[VersionNumberEntryCount]; |
| } SPDM_VERSION_RESPONSE; |
| |
| /// |
| /// SPDM VERSION structure |
| /// |
| typedef struct { |
| UINT16 Alpha:4; |
| UINT16 UpdateVersionNumber:4; |
| UINT16 MinorVersion:4; |
| UINT16 MajorVersion:4; |
| } SPDM_VERSION_NUMBER; |
| |
| /// |
| /// SPDM GET_CAPABILITIES request |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| } SPDM_GET_CAPABILITIES_REQUEST; |
| |
| /// |
| /// SPDM GET_CAPABILITIES response |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| UINT8 Reserved; |
| UINT8 CTExponent; |
| UINT16 Reserved2; |
| UINT32 Flags; |
| } SPDM_CAPABILITIES_RESPONSE; |
| |
| /// |
| /// SPDM GET_CAPABILITIES response Flags |
| /// |
| #define SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CACHE_CAP BIT0 |
| #define SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CERT_CAP BIT1 |
| #define SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHAL_CAP BIT2 |
| #define SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP (BIT3 | BIT4) |
| #define SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_NO_SIG BIT3 |
| #define SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG BIT4 |
| #define SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_FRESH_CAP BIT5 |
| |
| /// |
| /// SPDM NEGOTIATE_ALGORITHMS request |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| UINT16 Length; |
| UINT8 MeasurementSpecification; |
| UINT8 Reserved; |
| UINT32 BaseAsymAlgo; |
| UINT32 BaseHashAlgo; |
| UINT8 Reserved2[12]; |
| UINT8 ExtAsymCount; |
| UINT8 ExtHashCount; |
| UINT16 Reserved3; |
| //UINT32 ExtAsym[ExtAsymCount]; |
| //UINT32 ExtHash[ExtHashCount]; |
| } SPDM_NEGOTIATE_ALGORITHMS_REQUEST; |
| |
| /// |
| /// SPDM NEGOTIATE_ALGORITHMS request BaseAsymAlgo |
| /// |
| #define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048 BIT0 |
| #define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSAPSS_2048 BIT1 |
| #define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_3072 BIT2 |
| #define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSAPSS_3072 BIT3 |
| #define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P256 BIT4 |
| #define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_4096 BIT5 |
| #define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSAPSS_4096 BIT6 |
| #define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P384 BIT7 |
| #define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P521 BIT8 |
| |
| /// |
| /// SPDM NEGOTIATE_ALGORITHMS request BaseHashAlgo |
| /// |
| #define SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256 BIT0 |
| #define SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_384 BIT1 |
| #define SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512 BIT2 |
| #define SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_256 BIT3 |
| #define SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_384 BIT4 |
| #define SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA3_512 BIT5 |
| |
| /// |
| /// SPDM NEGOTIATE_ALGORITHMS response |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| UINT16 Length; |
| UINT8 MeasurementSpecificationSel; |
| UINT8 Reserved; |
| UINT32 MeasurementHashAlgo; |
| UINT32 BaseAsymSel; |
| UINT32 BaseHashSel; |
| UINT8 Reserved2[12]; |
| UINT8 ExtAsymSelCount; |
| UINT8 ExtHashSelCount; |
| UINT16 Reserved3; |
| //UINT32 ExtAsymSel[ExtAsymSelCount]; |
| //UINT32 ExtHashSel[ExtHashSelCount]; |
| } SPDM_ALGORITHMS_RESPONSE; |
| |
| /// |
| /// SPDM NEGOTIATE_ALGORITHMS response MeasurementHashAlgo |
| /// |
| #define SPDM_ALGORITHMS_MEASUREMENT_HASH_ALGO_RAW_BIT_STREAM_ONLY BIT0 |
| #define SPDM_ALGORITHMS_MEASUREMENT_HASH_ALGO_TPM_ALG_SHA_256 BIT1 |
| #define SPDM_ALGORITHMS_MEASUREMENT_HASH_ALGO_TPM_ALG_SHA_384 BIT2 |
| #define SPDM_ALGORITHMS_MEASUREMENT_HASH_ALGO_TPM_ALG_SHA_512 BIT3 |
| #define SPDM_ALGORITHMS_MEASUREMENT_HASH_ALGO_TPM_ALG_SHA3_256 BIT4 |
| #define SPDM_ALGORITHMS_MEASUREMENT_HASH_ALGO_TPM_ALG_SHA3_384 BIT5 |
| #define SPDM_ALGORITHMS_MEASUREMENT_HASH_ALGO_TPM_ALG_SHA3_512 BIT6 |
| |
| /// |
| /// SPDM GET_DIGESTS request |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| } SPDM_GET_DIGESTS_REQUEST; |
| |
| /// |
| /// SPDM GET_DIGESTS response |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| //UINT8 Digest[DigestSize]; |
| } SPDM_DIGESTS_RESPONSE; |
| |
| /// |
| /// SPDM GET_DIGESTS request |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| UINT16 Offset; |
| UINT16 Length; |
| } SPDM_GET_CERTIFICATE_REQUEST; |
| |
| /// |
| /// SPDM GET_DIGESTS response |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| UINT16 PortionLength; |
| UINT16 RemainderLength; |
| //UINT8 CertChain[CertChainSize]; |
| } SPDM_CERTIFICATE_RESPONSE; |
| |
| /// |
| /// SPDM CHALLENGE request |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| UINT8 Nonce[32]; |
| } SPDM_CHALLENGE_REQUEST; |
| |
| /// |
| /// SPDM CHALLENGE response |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| //UINT8 CertChainHash[DigestSize]; |
| //UINT8 Nonce[32]; |
| //UINT8 MeasurementSummaryHash[DigestSize]; |
| //UINT16 OpaqueLength; |
| //UINT8 OpaqueData[OpaqueLength]; |
| //UINT8 Signature[KeySize]; |
| } SPDM_CHALLENGE_AUTH_RESPONSE; |
| |
| /// |
| /// SPDM GET_MEASUREMENTS request |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| UINT8 Nonce[32]; |
| } SPDM_GET_MEASUREMENTS_REQUEST; |
| |
| /// |
| /// SPDM MEASUREMENTS block common header |
| /// |
| typedef struct { |
| UINT8 Index; |
| UINT8 MeasurementSpecification; |
| UINT16 MeasurementSize; |
| //UINT8 Measurement[MeasurementSize]; |
| } SPDM_MEASUREMENT_BLOCK_COMMON_HEADER; |
| |
| #define SPDM_MEASUREMENT_BLOCK_HEADER_SPECIFICATION_DMTF BIT0 |
| |
| /// |
| /// SPDM MEASUREMENTS block DMTF header |
| /// |
| typedef struct { |
| UINT8 DMTFSpecMeasurementValueType; |
| UINT16 DMTFSpecMeasurementValueSize; |
| //UINT8 DMTFSpecMeasurementValue[DMTFSpecMeasurementValueSize]; |
| } SPDM_MEASUREMENT_BLOCK_DMTF_HEADER; |
| |
| /// |
| /// SPDM MEASUREMENTS block MeasurementValueType |
| /// |
| #define SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_IMMUTABLE_ROM 0 |
| #define SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_MUTABLE_FIRMWARE 1 |
| #define SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_HARDWARE_CONFIGURATION 2 |
| #define SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_FIRMWARE_CONFIGURATION 3 |
| #define SPDM_MEASUREMENT_BLOCK_MEASUREMENT_TYPE_RAW_BIT_STREAM BIT7 |
| |
| /// |
| /// SPDM GET_MEASUREMENTS response |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| UINT8 NumberOfBlocks; |
| UINT8 MeasurementRecordLength[3]; |
| //UINT8 MeasurementRecord[MeasurementRecordLength]; |
| //UINT8 Nonce[32]; |
| //UINT16 OpaqueLength; |
| //UINT8 OpaqueData[OpaqueLength]; |
| //UINT8 Signature[KeySize]; |
| } SPDM_MEASUREMENTS_RESPONSE; |
| |
| /// |
| /// SPDM ERROR response |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| // Param1 == Error Code |
| // Param2 == Error Data |
| //UINT8 ExtendedErrorData[]; |
| } SPDM_ERROR_RESPONSE; |
| |
| /// |
| /// SPDM error code |
| /// |
| #define SPDM_ERROR_CODE_INVALID_REQUEST 0x01 |
| #define SPDM_ERROR_CODE_BUSY 0x03 |
| #define SPDM_ERROR_CODE_UNEXPECTED_REQUEST 0x04 |
| #define SPDM_ERROR_CODE_UNSPECIFIED 0x05 |
| #define SPDM_ERROR_CODE_UNSUPPORTED_REQUEST 0x07 |
| #define SPDM_ERROR_CODE_MAJOR_VERSION_MISMATCH 0x41 |
| #define SPDM_ERROR_CODE_RESPONSE_NOT_READY 0x42 |
| #define SPDM_ERROR_CODE_REQUEST_RESYNCH 0x43 |
| |
| /// |
| /// SPDM RESPONSE_IF_READY request |
| /// |
| typedef struct { |
| SPDM_MESSAGE_HEADER Header; |
| // Param1 == RequestCode |
| // Param2 == Token |
| } SPDM_RESPONSE_IF_READY_REQUEST; |
| |
| #pragma pack() |
| |
| #endif |
| |