core/spdm/cmd_interface_spdm_responder.h (77 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
#ifndef CMD_INTERFACE_SPDM_RESPONDER_H_
#define CMD_INTERFACE_SPDM_RESPONDER_H_
#include <stdint.h>
#include "spdm_commands.h"
#include "spdm_measurements.h"
#include "spdm_protocol.h"
#include "spdm_transcript_manager.h"
#include "cmd_interface/cmd_interface.h"
#include "crypto/ecc.h"
#include "crypto/hash.h"
#include "crypto/rng.h"
#include "riot/riot_key_manager.h"
/**
* Minimum number of hash engines required for an SPDM responder.
*/
#define SPDM_RESPONDER_HASH_ENGINE_REQUIRED_COUNT 2
/**
* Command interface for processing SPDM protocol requests.
*/
struct cmd_interface_spdm_responder {
struct cmd_interface base; /**< Base command interface. */
struct spdm_state *state; /**< SPDM state. */
const struct hash_engine *const *hash_engine; /**< Hash engines for hashing operations. */
uint8_t hash_engine_count; /**< Number of hash engine instances. */
const struct spdm_transcript_manager *transcript_manager; /**< Transcript manager for SPDM. */
const struct riot_key_manager *key_manager; /**< Manager for device certificate chain. */
const struct spdm_measurements *measurements; /**< Measurements for the device. */
const struct ecc_engine *ecc_engine; /**< Engine for ECC operations. */
const struct rng_engine *rng_engine; /**< Engine for random number generation. */
const struct spdm_version_num_entry *version_num; /**< Supported version number(s). */
uint8_t version_num_count; /**< Number of supported version number(s). */
const struct spdm_version_num_entry *secure_message_version_num; /**< Supported secure message version number(s). */
uint8_t secure_message_version_num_count; /**< Number of secure message supported version number(s). */
const struct spdm_device_capability *local_capabilities; /**< Local SPDM capabilities. */
const struct spdm_local_device_algorithms *local_algorithms; /**< Local SPDM algorithms and their priorities. */
struct spdm_secure_session_manager *session_manager; /**< Session manager for managing secure sessions. */
const struct cmd_interface *vdm_handler; /**< Command handler for VDM messages */
};
int cmd_interface_spdm_responder_init (struct cmd_interface_spdm_responder *spdm_responder,
struct spdm_state *state, const struct spdm_transcript_manager *transcript_manager,
const struct hash_engine *const *hash_engine, uint8_t hash_engine_count,
const struct spdm_version_num_entry *version_num, uint8_t version_num_count,
const struct spdm_version_num_entry *secure_message_version_num,
uint8_t secure_message_version_num_count,
const struct spdm_device_capability *local_capabilities,
const struct spdm_local_device_algorithms *local_algorithms,
const struct riot_key_manager *key_manager, const struct spdm_measurements *measurements,
const struct ecc_engine *ecc_engine, const struct rng_engine *rng_engine,
struct spdm_secure_session_manager *session_manager, const struct cmd_interface *vdm_handler);
int cmd_interface_spdm_responder_init_state (
const struct cmd_interface_spdm_responder *spdm_responder);
void cmd_interface_spdm_responder_deinit (
const struct cmd_interface_spdm_responder *spdm_responder);
#define CMD_HANDLER_SPDM_RESPONDER_ERROR(\
code) ROT_ERROR (ROT_MODULE_CMD_HANDLER_SPDM_RESPONDER, code)
/**
* Error codes that can be generated by the SPDM responder.
*/
enum {
CMD_HANDLER_SPDM_RESPONDER_INVALID_ARGUMENT = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x00), /**< Input parameter is null or not valid. */
CMD_HANDLER_SPDM_RESPONDER_NO_MEMORY = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x01), /**< Memory allocation failed. */
CMD_HANDLER_SPDM_RESPONDER_UNKNOWN_COMMAND = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x02), /**< A command does not represent a known request. */
CMD_HANDLER_SPDM_RESPONDER_SPDM_BAD_LENGTH = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x03), /**< The payload length is wrong for the request. */
CMD_HANDLER_SPDM_RESPONDER_DEVICE_CERT_NOT_AVAILABLE = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x04), /**< The device cert is not available. */
CMD_HANDLER_SPDM_RESPONDER_ALIAS_CERT_NOT_AVAILABLE = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x05), /**< The alias cert is not available. */
CMD_HANDLER_SPDM_RESPONDER_UNSUPPORTED_OPERATION = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x06), /**< The request is not supported. */
CMD_HANDLER_SPDM_RESPONDER_INVALID_REQUEST = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x07), /**< The request is invalid. */
CMD_HANDLER_SPDM_RESPONDER_VERSION_MISMATCH = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x08), /**< The request version is not supported. */
CMD_HANDLER_SPDM_RESPONDER_UNSUPPORTED_CAPABILITY = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x09), /**< The device capability is not supported. */
CMD_HANDLER_SPDM_RESPONDER_INCOMPATIBLE_CAPABILITIES = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x0a), /**< The device capabilities are incompatible. */
CMD_HANDLER_SPDM_RESPONDER_UNEXPECTED_REQUEST = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x0b), /**< The request is unexpected. */
CMD_HANDLER_SPDM_RESPONDER_INTERNAL_ERROR = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x0c), /**< An internal error occurred. */
CMD_HANDLER_SPDM_RESPONDER_RESPONSE_TOO_LARGE = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x0d), /**< The response is too large. */
CMD_HANDLER_SPDM_RESPONDER_UNSUPPORTED_SIG_SIZE = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x0e), /**< The signature size is not supported. */
CMD_HANDLER_SPDM_RESPONDER_UNSUPPORTED_DHE_KEY_SIZE = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x0f), /**< The DHE key size is not supported. */
CMD_HANDLER_SPDM_RESPONDER_UNSUPPORTED_HMAC_HASH_TYPE = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x10), /**< The HMAC hash type is not supported. */
CMD_HANDLER_SPDM_RESPONDER_INVALID_RESPONSE_STATE = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x11), /**< The response state is invalid. */
CMD_HANDLER_SPDM_RESPONDER_INVALID_CONNECTION_STATE = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x12), /**< The connection state is invalid. */
CMD_HANDLER_SPDM_RESPONDER_PREV_SESSION_VALID = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x13), /**< The previous session is still valid. */
CMD_HANDLER_SPDM_RESPONDER_SESSION_LIMIT_EXCEEDED = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x14), /**< The session limit has been exceeded. */
CMD_HANDLER_SPDM_RESPONDER_UNSUPPORTED_HASH_ALGO = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x15), /**< The hash algorithm is not supported. */
CMD_HANDLER_SPDM_RESPONDER_INVALID_OPAQUE_DATA_FORMAT = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x16), /**< The opaque data format is invalid. */
CMD_HANDLER_SPDM_RESPONDER_INVALID_SESSION_STATE = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x17), /**< The session manager state is invalid. */
CMD_HANDLER_SPDM_RESPONDER_DECRYPT_ERROR = CMD_HANDLER_SPDM_RESPONDER_ERROR (0x18), /**< Decrypt operation failed. */
};
#endif /* CMD_INTERFACE_SPDM_RESPONDER_H_ */