diff --git a/doc/api/requester_api.md b/doc/api/requester_api.md
index bb01cc2a8d5..792f1bece4a 100644
--- a/doc/api/requester_api.md
+++ b/doc/api/requester_api.md
@@ -31,6 +31,32 @@ returns early with value not equal to `LIBSPDM_STATUS_SUCCESS` then the SPDM con
before attempting establish a new connection.
+---
+### libspdm_get_supported_algorithms
+---
+
+### Description
+Sends GET_VERSION and GET_CAPABILITIES requests to retrieve the Responder's supported algorithms before algorithm negotiation.
+
+### Parameters
+
+**spdm_context**
+The SPDM context.
+
+**algorithms**
+A pointer to a libspdm_responder_supported_algorithms_t structure to store the Responder's supported algorithms.
+
+### Details
+Before calling this function the Integrator must ensure that the SPDM context is initialized
+with proper configuration, including the requester's capabilities and supported cryptographic
+algorithms. The Requester must support at least one SPDM version >= 1.3 and have CHUNK_CAP
+capability enabled in its configuration.
+
+When this function returns with value `LIBSPDM_STATUS_SUCCESS`, the algorithms parameter will contain
+the Responder's supported algorithms that can be used for subsequent algorithm negotiation. If this
+function returns with value `LIBSPDM_STATUS_UNSUPPORTED_CAP`, either the Requester does not support
+version 1.3 or above, or CHUNK_CAP is not enabled.
+
---
### libspdm_get_digest
diff --git a/include/industry_standard/spdm.h b/include/industry_standard/spdm.h
index bdf94e53cc5..516c4cff2f0 100644
--- a/include/industry_standard/spdm.h
+++ b/include/industry_standard/spdm.h
@@ -161,8 +161,41 @@ typedef struct {
uint32_t max_spdm_msg_size;
} spdm_get_capabilities_request_t;
-/* SPDM GET_CAPABILITIES response*/
+/* SPDM extended algorithm */
+typedef struct {
+ uint8_t registry_id;
+ uint8_t reserved;
+ uint16_t algorithm_id;
+} spdm_extended_algorithm_t;
+
+typedef struct {
+ uint8_t alg_type;
+ uint8_t alg_count;
+ uint16_t alg_supported;
+} spdm_negotiate_algorithms_common_struct_table_t;
+/* SPDM supported algorithms block */
+typedef struct {
+ uint8_t param1; /* Number of Algorithms Structure Tables */
+ uint8_t param2; /* Reserved */
+ uint16_t length;
+ uint8_t measurement_specification;
+ uint8_t other_params_support;
+ uint32_t base_asym_algo;
+ uint32_t base_hash_algo;
+ uint8_t reserved2[12];
+ uint8_t ext_asym_count;
+ uint8_t ext_hash_count;
+ uint8_t reserved3;
+ uint8_t mel_specification;
+ /* Followed by dynamic arrays for ext_asym, ext_hash, and struct_tableif needed
+ * spdm_extended_algorithm_t ext_asym[ext_asym_count];
+ * spdm_extended_algorithm_t ext_hash[ext_hash_count];
+ * spdm_negotiate_algorithms_common_struct_table_t struct_table[
+ * SPDM_NEGOTIATE_ALGORITHMS_MAX_NUM_STRUCT_TABLE_ALG];*/
+} spdm_supported_algorithms_block_t;
+
+/* SPDM GET_CAPABILITIES response*/
typedef struct {
spdm_message_header_t header;
/* param1 == RSVD
@@ -174,6 +207,8 @@ typedef struct {
/* Below field is added in 1.2.*/
uint32_t data_transfer_size;
uint32_t max_spdm_msg_size;
+ /* Below field is added in 1.3.*/
+ spdm_supported_algorithms_block_t supported_algorithms;
} spdm_capabilities_response_t;
#define SPDM_MIN_DATA_TRANSFER_SIZE_VERSION_12 42
@@ -357,12 +392,6 @@ typedef struct {
#define SPDM_NEGOTIATE_ALGORITHMS_ALG_SUPPORTED_AEAD_12_MASK 0x000f
#define SPDM_NEGOTIATE_ALGORITHMS_ALG_SUPPORTED_REQ_BASE_ASYM_ALG_12_MASK 0x0fff
-typedef struct {
- uint8_t alg_type;
- uint8_t alg_count;
- uint16_t alg_supported;
-} spdm_negotiate_algorithms_common_struct_table_t;
-
/* SPDM NEGOTIATE_ALGORITHMS request base_asym_algo/REQ_BASE_ASYM_ALG */
#define SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048 0x00000001
@@ -481,13 +510,6 @@ typedef struct {
/*opaque_element_table_t opaque_list[];*/
} spdm_general_opaque_data_table_header_t;
-/* SPDM extended algorithm */
-typedef struct {
- uint8_t registry_id;
- uint8_t reserved;
- uint16_t algorithm_id;
-} spdm_extended_algorithm_t;
-
/* SPDM registry_id */
#define SPDM_REGISTRY_ID_DMTF 0x0
#define SPDM_REGISTRY_ID_TCG 0x1
diff --git a/include/internal/libspdm_common_lib.h b/include/internal/libspdm_common_lib.h
index 834867604c4..8ca00bd7c0a 100644
--- a/include/internal/libspdm_common_lib.h
+++ b/include/internal/libspdm_common_lib.h
@@ -67,6 +67,30 @@ typedef struct {
uint16_t key_schedule;
} libspdm_device_algorithm_t;
+#define LIBSPDM_MAX_EXT_ALG_COUNT 5
+
+#pragma pack(1)
+typedef struct {
+ spdm_negotiate_algorithms_common_struct_table_t alg_struct;
+ spdm_extended_algorithm_t alg_external[LIBSPDM_MAX_EXT_ALG_COUNT];
+} libspdm_supported_algorithms_alg_struct_t;
+#pragma pack()
+
+typedef struct {
+ uint8_t measurement_specification;
+ uint8_t other_params_support;
+ uint32_t base_asym_algo;
+ uint32_t base_hash_algo;
+ uint8_t mel_specification;
+ uint8_t ext_asym_count;
+ spdm_extended_algorithm_t ext_asym[LIBSPDM_MAX_EXT_ALG_COUNT];
+ uint8_t ext_hash_count;
+ spdm_extended_algorithm_t ext_hash[LIBSPDM_MAX_EXT_ALG_COUNT];
+ uint8_t struct_table_count;
+ libspdm_supported_algorithms_alg_struct_t
+ struct_table[SPDM_NEGOTIATE_ALGORITHMS_MAX_NUM_STRUCT_TABLE_ALG];
+} libspdm_responder_supported_algorithms_t;
+
typedef struct {
#if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
uint8_t buffer[LIBSPDM_MAX_CERT_CHAIN_SIZE];
diff --git a/include/internal/libspdm_requester_lib.h b/include/internal/libspdm_requester_lib.h
index 050cda95ab8..fe331953246 100644
--- a/include/internal/libspdm_requester_lib.h
+++ b/include/internal/libspdm_requester_lib.h
@@ -1,6 +1,6 @@
/**
* Copyright Notice:
- * Copyright 2021-2024 DMTF. All rights reserved.
+ * Copyright 2021-2025 DMTF. All rights reserved.
* License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
**/
@@ -133,6 +133,7 @@ libspdm_return_t libspdm_get_version(libspdm_context_t *spdm_context,
* This function sends GET_CAPABILITIES and receives CAPABILITIES.
*
* @param spdm_context A pointer to the SPDM context.
+ * @param get_supported_algorithms If true, indicates that the requester wants the responder to include its supported algorithms in the CAPABILITIES response.
* @param RequesterCTExponent RequesterCTExponent to the GET_CAPABILITIES request.
* @param RequesterFlags RequesterFlags to the GET_CAPABILITIES request.
* @param ResponderCTExponent ResponderCTExponent from the CAPABILITIES response.
@@ -141,7 +142,9 @@ libspdm_return_t libspdm_get_version(libspdm_context_t *spdm_context,
* @retval RETURN_SUCCESS The GET_CAPABILITIES is sent and the CAPABILITIES is received.
* @retval RETURN_DEVICE_ERROR A device error occurs when communicates with the device.
**/
-libspdm_return_t libspdm_get_capabilities(libspdm_context_t *spdm_context);
+libspdm_return_t libspdm_get_capabilities(libspdm_context_t *spdm_context,
+ bool get_supported_algorithms,
+ libspdm_responder_supported_algorithms_t *supported_algs);
/**
* This function sends NEGOTIATE_ALGORITHMS and receives ALGORITHMS.
diff --git a/include/library/spdm_requester_lib.h b/include/library/spdm_requester_lib.h
index a91a9c72e30..acc37b2171d 100644
--- a/include/library/spdm_requester_lib.h
+++ b/include/library/spdm_requester_lib.h
@@ -1,6 +1,6 @@
/**
* Copyright Notice:
- * Copyright 2021-2024 DMTF. All rights reserved.
+ * Copyright 2021-2025 DMTF. All rights reserved.
* License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
**/
@@ -12,6 +12,7 @@ extern "C" {
#endif
#include "library/spdm_common_lib.h"
+#include "internal/libspdm_common_lib.h"
/**
* This function sends GET_VERSION, GET_CAPABILITIES, NEGOTIATE_ALGORITHMS
@@ -491,6 +492,19 @@ libspdm_return_t libspdm_start_session(void *spdm_context, bool use_psk,
uint8_t *heartbeat_period,
void *measurement_hash);
+/**
+ * Sends the `GET_VERSION` and `GET_CAPABILITIES` requests, where GET_CAPABILITIES.Param1[0] is set
+ * If the Responder supports this extended capability, the Responder will include the Supported
+ * Algorithms Block in its CAPABILITIES response.
+ *
+ * @param spdm_context The SPDM context.
+ * @param responder_supported_algorithms The responder supported algorithms.
+ * @retval RETURN_SUCCESS The connection is initialized successfully.
+ * @retval RETURN_DEVICE_ERROR A device error occurs when communicates with the device.
+ **/
+libspdm_return_t libspdm_get_supported_algorithms(
+ void *spdm_context, libspdm_responder_supported_algorithms_t *responder_supported_algorithms);
+
/**
* This function sends KEY_EXCHANGE/FINISH or PSK_EXCHANGE/PSK_FINISH to start an SPDM Session.
*
diff --git a/library/spdm_requester_lib/libspdm_req_communication.c b/library/spdm_requester_lib/libspdm_req_communication.c
index e57a39dfb23..13fc6d18897 100644
--- a/library/spdm_requester_lib/libspdm_req_communication.c
+++ b/library/spdm_requester_lib/libspdm_req_communication.c
@@ -1,6 +1,6 @@
/**
* Copyright Notice:
- * Copyright 2021-2024 DMTF. All rights reserved.
+ * Copyright 2021-2025 DMTF. All rights reserved.
* License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
**/
@@ -19,7 +19,7 @@ libspdm_return_t libspdm_init_connection(void *spdm_context, bool get_version_on
}
if (!get_version_only) {
- status = libspdm_get_capabilities(context);
+ status = libspdm_get_capabilities(context, false, NULL);
if (LIBSPDM_STATUS_IS_ERROR(status)) {
return status;
}
@@ -31,6 +31,52 @@ libspdm_return_t libspdm_init_connection(void *spdm_context, bool get_version_on
return LIBSPDM_STATUS_SUCCESS;
}
+libspdm_return_t libspdm_get_supported_algorithms(void *spdm_context,
+ libspdm_responder_supported_algorithms_t *algorithms)
+{
+ libspdm_return_t status;
+ libspdm_context_t *context;
+ bool has_version_1_3_or_above;
+ size_t index;
+
+ context = spdm_context;
+ has_version_1_3_or_above = false;
+
+ /* Verify algorithms is not NULL */
+ LIBSPDM_ASSERT(algorithms != NULL);
+
+ /* Pre-check: Verify requester supports at least one version >= 1.3 */
+ for (index = 0; index < context->local_context.version.spdm_version_count; index++) {
+ if (context->local_context.version.spdm_version[index] >= SPDM_MESSAGE_VERSION_13) {
+ has_version_1_3_or_above = true;
+ break;
+ }
+ }
+ LIBSPDM_ASSERT(has_version_1_3_or_above);
+ if (!has_version_1_3_or_above) {
+ return LIBSPDM_STATUS_UNSUPPORTED_CAP;
+ }
+
+ LIBSPDM_ASSERT((context->local_context.capability.flags &
+ SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP) != 0);
+
+ status = libspdm_get_version(context, NULL, NULL);
+ if (LIBSPDM_STATUS_IS_ERROR(status)) {
+ return status;
+ }
+
+ if (context->connection_info.version < SPDM_MESSAGE_VERSION_13) {
+ return LIBSPDM_STATUS_UNSUPPORTED_CAP;
+ }
+
+ status = libspdm_get_capabilities(context, true, algorithms);
+ if (LIBSPDM_STATUS_IS_ERROR(status)) {
+ return status;
+ }
+
+ return LIBSPDM_STATUS_SUCCESS;
+}
+
#if (LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP) || (LIBSPDM_ENABLE_CAPABILITY_PSK_CAP)
libspdm_return_t libspdm_start_session(void *spdm_context, bool use_psk,
const void *psk_hint,
diff --git a/library/spdm_requester_lib/libspdm_req_get_capabilities.c b/library/spdm_requester_lib/libspdm_req_get_capabilities.c
index a414c1c228e..c78d6d588aa 100644
--- a/library/spdm_requester_lib/libspdm_req_get_capabilities.c
+++ b/library/spdm_requester_lib/libspdm_req_get_capabilities.c
@@ -211,7 +211,9 @@ static bool validate_responder_capability(uint32_t capabilities_flag, uint8_t ve
* @retval LIBSPDM_STATUS_BUFFER_FULL
* The buffer used to store transcripts is exhausted.
**/
-static libspdm_return_t libspdm_try_get_capabilities(libspdm_context_t *spdm_context)
+static libspdm_return_t libspdm_try_get_capabilities(libspdm_context_t *spdm_context,
+ bool get_supported_algorithms,
+ libspdm_responder_supported_algorithms_t *supported_algs)
{
libspdm_return_t status;
spdm_get_capabilities_request_t *spdm_request;
@@ -241,6 +243,11 @@ static libspdm_return_t libspdm_try_get_capabilities(libspdm_context_t *spdm_con
spdm_context->local_context.capability.transport_tail_size;
LIBSPDM_ASSERT (spdm_request_size >= sizeof(spdm_request->header));
+
+ LIBSPDM_ASSERT(!((spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_13) &&
+ get_supported_algorithms &&
+ ((spdm_request->flags & SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP) == 0)));
+
libspdm_zero_mem(spdm_request, spdm_request_size);
spdm_request->header.spdm_version = libspdm_get_connection_version (spdm_context);
if (spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_12) {
@@ -258,6 +265,10 @@ static libspdm_return_t libspdm_try_get_capabilities(libspdm_context_t *spdm_con
}
spdm_request->header.request_response_code = SPDM_GET_CAPABILITIES;
spdm_request->header.param1 = 0;
+ if (spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_13 &&
+ get_supported_algorithms) {
+ spdm_request->header.param1 |= 0x01;
+ }
spdm_request->header.param2 = 0;
if (spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_11) {
spdm_request->ct_exponent = spdm_context->local_context.capability.ct_exponent;
@@ -315,22 +326,51 @@ static libspdm_return_t libspdm_try_get_capabilities(libspdm_context_t *spdm_con
status = LIBSPDM_STATUS_INVALID_MSG_FIELD;
goto receive_done;
}
- if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_12) {
+ if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13) {
if (spdm_response_size < sizeof(spdm_capabilities_response_t)) {
status = LIBSPDM_STATUS_INVALID_MSG_SIZE;
goto receive_done;
}
+ } else if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_12) {
+ if (spdm_response_size < (sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t))) {
+ status = LIBSPDM_STATUS_INVALID_MSG_SIZE;
+ goto receive_done;
+ }
} else {
- if (spdm_response_size < sizeof(spdm_capabilities_response_t) -
- sizeof(spdm_response->data_transfer_size) - sizeof(spdm_response->max_spdm_msg_size)) {
+ if (spdm_response_size < (sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t) -
+ sizeof(spdm_response->data_transfer_size) -
+ sizeof(spdm_response->max_spdm_msg_size))) {
status = LIBSPDM_STATUS_INVALID_MSG_SIZE;
goto receive_done;
}
}
- if (spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_12) {
+
+ if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13 &&
+ (spdm_request->header.param1 & 0x01)) {
+
spdm_response_size = sizeof(spdm_capabilities_response_t);
+
+ if (spdm_response->supported_algorithms.ext_asym_count > 0) {
+ spdm_response_size += spdm_response->supported_algorithms.ext_asym_count *
+ sizeof(spdm_extended_algorithm_t);
+ }
+ if (spdm_response->supported_algorithms.ext_hash_count > 0) {
+ spdm_response_size += spdm_response->supported_algorithms.ext_hash_count *
+ sizeof(spdm_extended_algorithm_t);
+ }
+ if (spdm_response->supported_algorithms.param1 > 0) {
+ spdm_response_size += spdm_response->supported_algorithms.param1 *
+ sizeof(spdm_negotiate_algorithms_common_struct_table_t);
+ }
+
+ } else if (spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_12) {
+ spdm_response_size = sizeof(spdm_capabilities_response_t)-
+ sizeof(spdm_supported_algorithms_block_t);
} else {
spdm_response_size = sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t) -
sizeof(spdm_response->data_transfer_size) -
sizeof(spdm_response->max_spdm_msg_size);
}
@@ -383,6 +423,56 @@ static libspdm_return_t libspdm_try_get_capabilities(libspdm_context_t *spdm_con
spdm_context->connection_info.capability.max_spdm_msg_size = 0;
}
+ /* Copy algorithms if requested and received */
+ if (get_supported_algorithms && supported_algs != NULL &&
+ spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13 &&
+ (spdm_request->header.param1 & 0x01)) {
+
+ spdm_supported_algorithms_block_t *src = &spdm_response->supported_algorithms;
+ libspdm_responder_supported_algorithms_t *dst = supported_algs;
+ uint8_t *src_bytes = (uint8_t *)src;
+ size_t offset;
+ size_t alg_size;
+
+ dst->struct_table_count = src->param1;
+ dst->measurement_specification = src->measurement_specification;
+ dst->other_params_support = src->other_params_support;
+ dst->base_asym_algo = src->base_asym_algo;
+ dst->base_hash_algo = src->base_hash_algo;
+ dst->ext_asym_count = src->ext_asym_count;
+ dst->ext_hash_count = src->ext_hash_count;
+ dst->mel_specification = src->mel_specification;
+
+ offset = sizeof(spdm_supported_algorithms_block_t);
+
+ if (src->ext_asym_count > 0) {
+ size_t copy_size = src->ext_asym_count * sizeof(spdm_extended_algorithm_t);
+ libspdm_copy_mem(dst->ext_asym,
+ sizeof(dst->ext_asym),
+ src_bytes + offset,
+ copy_size);
+ offset += copy_size;
+ }
+
+ if (src->ext_hash_count > 0) {
+ size_t copy_size = src->ext_hash_count * sizeof(spdm_extended_algorithm_t);
+ libspdm_copy_mem(dst->ext_hash,
+ sizeof(dst->ext_hash),
+ src_bytes + offset,
+ copy_size);
+ offset += copy_size;
+ }
+
+ alg_size = sizeof(spdm_negotiate_algorithms_common_struct_table_t);
+ for (size_t i = 0; i < src->param1; i++) {
+ libspdm_copy_mem(&(dst->struct_table[i].alg_struct),
+ alg_size,
+ (uint8_t *)src + offset + (i * alg_size),
+ alg_size);
+ }
+ }
+
+
/* -=[Update State Phase]=- */
spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_CAPABILITIES;
status = LIBSPDM_STATUS_SUCCESS;
@@ -397,17 +487,23 @@ static libspdm_return_t libspdm_try_get_capabilities(libspdm_context_t *spdm_con
return status;
}
-libspdm_return_t libspdm_get_capabilities(libspdm_context_t *spdm_context)
+libspdm_return_t libspdm_get_capabilities(libspdm_context_t *spdm_context,
+ bool get_supported_algorithms,
+ libspdm_responder_supported_algorithms_t *supported_algs)
{
size_t retry;
uint64_t retry_delay_time;
libspdm_return_t status;
+ /* Verify supported_algs is not NULL if get_supported_algorithms is true */
+ LIBSPDM_ASSERT(!get_supported_algorithms || (supported_algs != NULL));
+
spdm_context->crypto_request = false;
retry = spdm_context->retry_times;
retry_delay_time = spdm_context->retry_delay_time;
do {
- status = libspdm_try_get_capabilities(spdm_context);
+ status =
+ libspdm_try_get_capabilities(spdm_context, get_supported_algorithms, supported_algs);
if (status != LIBSPDM_STATUS_BUSY_PEER) {
return status;
}
diff --git a/library/spdm_responder_lib/libspdm_rsp_capabilities.c b/library/spdm_responder_lib/libspdm_rsp_capabilities.c
index d607dd727e8..740113ff296 100644
--- a/library/spdm_responder_lib/libspdm_rsp_capabilities.c
+++ b/library/spdm_responder_lib/libspdm_rsp_capabilities.c
@@ -247,6 +247,17 @@ libspdm_return_t libspdm_get_response_capabilities(libspdm_context_t *spdm_conte
}
}
+ /* Check that if Param1[0] is set, Requester must have CHUNK_CAP */
+ if (spdm_request->header.spdm_version >= SPDM_MESSAGE_VERSION_13 &&
+ (spdm_request->header.param1 & 0x01) &&
+ ((spdm_request->flags & SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP) == 0)) {
+ return libspdm_generate_error_response(spdm_context,
+ SPDM_ERROR_CODE_INVALID_REQUEST,
+ 0,
+ response_size,
+ response);
+ }
+
libspdm_reset_message_buffer_via_request_code(spdm_context, NULL,
spdm_request->header.request_response_code);
@@ -270,11 +281,90 @@ libspdm_return_t libspdm_get_response_capabilities(libspdm_context_t *spdm_conte
spdm_response->max_spdm_msg_size =
spdm_context->local_context.capability.max_spdm_msg_size;
}
+ if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_13 &&
+ (spdm_request->header.param1 & 0x01) &&
+ (spdm_request->flags & SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP) &&
+ (spdm_response->flags & SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP)) {
- if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_12) {
+ uint8_t index = 0;
*response_size = sizeof(spdm_capabilities_response_t);
+
+ spdm_response->supported_algorithms.param2 = 0;
+ spdm_response->supported_algorithms.length = sizeof(spdm_supported_algorithms_block_t);
+ spdm_response->supported_algorithms.measurement_specification =
+ spdm_context->local_context.algorithm.measurement_spec;
+ spdm_response->supported_algorithms.other_params_support =
+ spdm_context->local_context.algorithm.other_params_support;
+ spdm_response->supported_algorithms.base_asym_algo=
+ spdm_context->local_context.algorithm.base_asym_algo;
+ spdm_response->supported_algorithms.base_hash_algo=
+ spdm_context->local_context.algorithm.base_hash_algo;
+ spdm_response->supported_algorithms.ext_asym_count = 0;
+ spdm_response->supported_algorithms.ext_hash_count = 0;
+ spdm_response->supported_algorithms.mel_specification =
+ spdm_context->local_context.algorithm.mel_spec;
+
+ spdm_negotiate_algorithms_common_struct_table_t *struct_table =
+ (spdm_negotiate_algorithms_common_struct_table_t*)(
+ (uint8_t*)&spdm_response->supported_algorithms +
+ sizeof(spdm_supported_algorithms_block_t)
+ );
+
+ if (spdm_context->local_context.algorithm.dhe_named_group != 0) {
+ struct_table[index].alg_type =
+ SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_DHE;
+ struct_table[index].alg_count = 0x20;
+ struct_table[index].alg_supported =
+ spdm_context->local_context.algorithm.dhe_named_group;
+ index++;
+ }
+
+ if (spdm_context->local_context.algorithm.aead_cipher_suite != 0) {
+ struct_table[index].alg_type =
+ SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_AEAD;
+ struct_table[index].alg_count = 0x20;
+ struct_table[index].alg_supported =
+ spdm_context->local_context.algorithm.aead_cipher_suite;
+ index++;
+ }
+
+ if (spdm_context->local_context.algorithm.req_base_asym_alg != 0) {
+ struct_table[index].alg_type =
+ SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_REQ_BASE_ASYM_ALG;
+ struct_table[index].alg_count = 0x20;
+ struct_table[index].alg_supported =
+ spdm_context->local_context.algorithm.req_base_asym_alg;
+ index++;
+ }
+
+ if (spdm_context->local_context.algorithm.key_schedule != 0) {
+ struct_table[index].alg_type =
+ SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_KEY_SCHEDULE;
+ struct_table[index].alg_count = 0x20;
+ struct_table[index].alg_supported =
+ spdm_context->local_context.algorithm.key_schedule;
+ index++;
+ }
+
+ if (index == 0) {
+ struct_table = NULL;
+ }
+
+ spdm_response->supported_algorithms.param1 = index;
+ spdm_response->supported_algorithms.length +=
+ spdm_response->supported_algorithms.param1*
+ sizeof(spdm_negotiate_algorithms_common_struct_table_t);
+
+ *response_size = sizeof(spdm_capabilities_response_t) +
+ (spdm_response->supported_algorithms.param1*
+ sizeof(spdm_negotiate_algorithms_common_struct_table_t));
+
+ } else if (spdm_response->header.spdm_version >= SPDM_MESSAGE_VERSION_12) {
+ *response_size = sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t);
} else {
*response_size = sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t)-
sizeof(spdm_response->data_transfer_size) -
sizeof(spdm_response->max_spdm_msg_size);
}
diff --git a/unit_test/fuzzing/test_requester/test_spdm_requester_get_capabilities/get_capabilities.c b/unit_test/fuzzing/test_requester/test_spdm_requester_get_capabilities/get_capabilities.c
index 5bab433d419..34422c7b8b8 100644
--- a/unit_test/fuzzing/test_requester/test_spdm_requester_get_capabilities/get_capabilities.c
+++ b/unit_test/fuzzing/test_requester/test_spdm_requester_get_capabilities/get_capabilities.c
@@ -73,7 +73,7 @@ void libspdm_test_requester_get_capabilities(void **State)
spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_VERSION;
libspdm_reset_message_a(spdm_context);
- libspdm_get_capabilities(spdm_context);
+ libspdm_get_capabilities(spdm_context, false, NULL);
}
}
diff --git a/unit_test/test_spdm_requester/error_test/get_capabilities_err.c b/unit_test/test_spdm_requester/error_test/get_capabilities_err.c
index 22d11d87650..f1d58e58aa3 100644
--- a/unit_test/test_spdm_requester/error_test/get_capabilities_err.c
+++ b/unit_test/test_spdm_requester/error_test/get_capabilities_err.c
@@ -1103,7 +1103,7 @@ static void libspdm_test_requester_get_capabilities_err_case1(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_SEND_FAIL);
}
@@ -1126,7 +1126,7 @@ static void libspdm_test_requester_get_capabilities_err_case2(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1145,7 +1145,7 @@ static void libspdm_test_requester_get_capabilities_err_case3(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_STATE_LOCAL);
}
@@ -1165,7 +1165,7 @@ static void libspdm_test_requester_get_capabilities_err_case4(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_ERROR_PEER);
}
@@ -1185,7 +1185,7 @@ static void libspdm_test_requester_get_capabilities_err_case5(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_BUSY_PEER);
}
@@ -1209,7 +1209,7 @@ static void libspdm_test_requester_get_capabilities_err_case6(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1229,7 +1229,7 @@ static void libspdm_test_requester_get_capabilities_err_case7(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_RESYNCH_PEER);
assert_int_equal(spdm_context->connection_info.connection_state,
LIBSPDM_CONNECTION_STATE_NOT_STARTED);
@@ -1250,7 +1250,7 @@ static void libspdm_test_requester_get_capabilities_err_case8(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_NOT_READY_PEER);
}
@@ -1273,7 +1273,7 @@ static void libspdm_test_requester_get_capabilities_err_case9(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1297,7 +1297,7 @@ static void libspdm_test_requester_get_capabilities_err_case10(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1320,7 +1320,7 @@ static void libspdm_test_requester_get_capabilities_err_case11(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1346,7 +1346,7 @@ static void libspdm_test_requester_get_capabilities_err_case12(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1365,7 +1365,7 @@ static void libspdm_test_requester_get_capabilities_err_case13(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_SIZE);
}
@@ -1384,7 +1384,7 @@ static void libspdm_test_requester_get_capabilities_err_case14(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_SIZE);
}
@@ -1403,7 +1403,7 @@ static void libspdm_test_requester_get_capabilities_err_case15(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_SIZE);
}
@@ -1429,7 +1429,7 @@ static void libspdm_test_requester_get_capabilities_err_case16(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1448,7 +1448,7 @@ static void libspdm_test_requester_get_capabilities_err_case17(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
/*assert_int_equal (spdm_context->connection_info.capability.ct_exponent, 0);
* assert_int_equal (spdm_context->connection_info.capability.flags, LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_11 & (0xFFFFFFFF^(SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP)));*/
@@ -1471,7 +1471,7 @@ static void libspdm_test_requester_get_capabilities_err_case18(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags =
LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
/*assert_int_equal (spdm_context->connection_info.capability.ct_exponent, 0);
* assert_int_equal (spdm_context->connection_info.capability.flags, LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_11 & (0xFFFFFFFF^(SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MAC_CAP | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP)));*/
@@ -1493,7 +1493,7 @@ static void libspdm_test_requester_get_capabilities_err_case19(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
/*assert_int_equal (spdm_context->connection_info.capability.ct_exponent, 0);
* assert_int_equal (spdm_context->connection_info.capability.flags, LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_11 & (0xFFFFFFFF^(SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PSK_CAP | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP)));*/
@@ -1515,7 +1515,7 @@ static void libspdm_test_requester_get_capabilities_err_case20(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1535,7 +1535,7 @@ static void libspdm_test_requester_get_capabilities_err_case21(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1555,7 +1555,7 @@ static void libspdm_test_requester_get_capabilities_err_case22(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1575,7 +1575,7 @@ static void libspdm_test_requester_get_capabilities_err_case23(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
/*assert_int_equal (spdm_context->connection_info.capability.ct_exponent, 0);
* assert_int_equal (spdm_context->connection_info.capability.flags, LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_11 & (0xFFFFFFFF^(SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCAP_CAP)));*/
@@ -1597,7 +1597,7 @@ static void libspdm_test_requester_get_capabilities_err_case24(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
/*assert_int_equal (spdm_context->connection_info.capability.ct_exponent, 0);
* assert_int_equal (spdm_context->connection_info.capability.flags, LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_11 & (0xFFFFFFFF^(SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP)));*/
@@ -1619,7 +1619,7 @@ static void libspdm_test_requester_get_capabilities_err_case25(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1639,7 +1639,7 @@ static void libspdm_test_requester_get_capabilities_err_case26(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
/*assert_int_equal (spdm_context->connection_info.capability.ct_exponent, 0);
* assert_int_equal (spdm_context->connection_info.capability.flags, LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_11 | SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_PUB_KEY_ID_CAP);*/
@@ -1661,7 +1661,7 @@ static void libspdm_test_requester_get_capabilities_err_case27(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1681,7 +1681,7 @@ static void libspdm_test_requester_get_capabilities_err_case28(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1704,7 +1704,7 @@ static void libspdm_test_requester_get_capabilities_err_case29(void **state) {
spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_VERSION;
libspdm_reset_message_a(spdm_context);
- status = libspdm_get_capabilities (spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
LIBSPDM_ASSERT_INT_EQUAL_CASE (status, LIBSPDM_STATUS_ERROR_PEER, error_code);
error_code++;
@@ -1741,7 +1741,7 @@ static void libspdm_test_requester_get_capabilities_err_case30(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1759,7 +1759,7 @@ static void libspdm_test_requester_get_capabilities_err_case31(void **state)
spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_VERSION;
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_RECEIVE_FAIL);
}
@@ -1784,7 +1784,7 @@ static void libspdm_test_requester_get_capabilities_err_case32(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1809,7 +1809,7 @@ static void libspdm_test_requester_get_capabilities_err_case33(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1830,7 +1830,7 @@ static void libspdm_test_requester_get_capabilities_err_case34(void **state)
spdm_context->transcript.message_a.max_buffer_size;
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_BUFFER_FULL);
spdm_context->transcript.message_a.buffer_size = 0;
@@ -1857,7 +1857,7 @@ static void libspdm_test_requester_get_capabilities_err_case35(void **state)
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
libspdm_force_error (LIBSPDM_ERR_ACQUIRE_SENDER_BUFFER);
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
libspdm_release_error (LIBSPDM_ERR_ACQUIRE_SENDER_BUFFER);
assert_int_equal(status, LIBSPDM_STATUS_ACQUIRE_FAIL);
@@ -1884,7 +1884,7 @@ static void libspdm_test_requester_get_capabilities_err_case36(void **state)
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
libspdm_force_error (LIBSPDM_ERR_ACQUIRE_RECEIVER_BUFFER);
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
libspdm_release_error (LIBSPDM_ERR_ACQUIRE_RECEIVER_BUFFER);
assert_int_equal(status, LIBSPDM_STATUS_ACQUIRE_FAIL);
@@ -1910,7 +1910,7 @@ static void libspdm_test_requester_get_capabilities_err_case37(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1936,7 +1936,7 @@ static void libspdm_test_requester_get_capabilities_err_case38(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1961,7 +1961,7 @@ static void libspdm_test_requester_get_capabilities_err_case39(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
@@ -1986,7 +1986,7 @@ static void libspdm_test_requester_get_capabilities_err_case40(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_INVALID_MSG_FIELD);
}
diff --git a/unit_test/test_spdm_requester/get_capabilities.c b/unit_test/test_spdm_requester/get_capabilities.c
index 7117466f437..36a43ee4317 100644
--- a/unit_test/test_spdm_requester/get_capabilities.c
+++ b/unit_test/test_spdm_requester/get_capabilities.c
@@ -1,6 +1,6 @@
/**
* Copyright Notice:
- * Copyright 2021-2022 DMTF. All rights reserved.
+ * Copyright 2021-2025 DMTF. All rights reserved.
* License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
**/
@@ -145,10 +145,20 @@ static libspdm_return_t libspdm_requester_get_capabilities_test_send_message(
return LIBSPDM_STATUS_SUCCESS;
case 0x23:
return LIBSPDM_STATUS_SUCCESS;
+ case 0x24:
+ return LIBSPDM_STATUS_SUCCESS;
+ case 0x25:
+ return LIBSPDM_STATUS_SUCCESS;
default:
return LIBSPDM_STATUS_SEND_FAIL;
}
}
+typedef struct {
+ spdm_message_header_t header;
+ uint8_t reserved;
+ uint8_t version_number_entry_count;
+ spdm_version_number_t version_number_entry[LIBSPDM_MAX_VERSION_COUNT];
+} libspdm_version_response_mine_t;
static libspdm_return_t libspdm_requester_get_capabilities_test_receive_message(
void *spdm_context, size_t *response_size,
@@ -417,7 +427,8 @@ static libspdm_return_t libspdm_requester_get_capabilities_test_receive_message(
size_t spdm_response_size;
size_t transport_header_size;
- spdm_response_size = sizeof(spdm_capabilities_response_t);
+ spdm_response_size = sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t);
transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
spdm_response = (void *)((uint8_t *)*response + transport_header_size);
@@ -913,7 +924,8 @@ static libspdm_return_t libspdm_requester_get_capabilities_test_receive_message(
size_t spdm_response_size;
size_t transport_header_size;
- spdm_response_size = sizeof(spdm_capabilities_response_t);
+ spdm_response_size = sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t);
transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
spdm_response = (void *)((uint8_t *)*response + transport_header_size);
@@ -926,6 +938,7 @@ static libspdm_return_t libspdm_requester_get_capabilities_test_receive_message(
spdm_response->flags = LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_11;
spdm_response_size = sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t)-
sizeof(spdm_response->data_transfer_size) -
sizeof(spdm_response->max_spdm_msg_size);
@@ -1008,6 +1021,75 @@ static libspdm_return_t libspdm_requester_get_capabilities_test_receive_message(
spdm_response->flags = LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_13;
spdm_response->data_transfer_size = LIBSPDM_DATA_TRANSFER_SIZE;
spdm_response->max_spdm_msg_size = LIBSPDM_MAX_SPDM_MSG_SIZE;
+ libspdm_transport_test_encode_message(spdm_context, NULL, false,
+ false, spdm_response_size,
+ spdm_response,
+ response_size, response);
+ }
+ return LIBSPDM_STATUS_SUCCESS;
+ case 0x24: {
+ spdm_capabilities_response_t *spdm_response;
+ size_t spdm_response_size;
+ size_t transport_header_size;
+
+ spdm_response_size = sizeof(spdm_capabilities_response_t) + 4*
+ sizeof(spdm_negotiate_algorithms_common_struct_table_t);
+ transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
+ spdm_response = (void *)((uint8_t *)*response + transport_header_size);
+
+ libspdm_zero_mem(spdm_response, spdm_response_size);
+ spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
+ spdm_response->header.request_response_code = SPDM_CAPABILITIES;
+ spdm_response->header.param1 = 0;
+ spdm_response->header.param2 = 0;
+ spdm_response->ct_exponent = 0;
+ spdm_response->flags = LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_13;
+ spdm_response->data_transfer_size = LIBSPDM_DATA_TRANSFER_SIZE;
+ spdm_response->max_spdm_msg_size = LIBSPDM_MAX_SPDM_MSG_SIZE;
+
+ spdm_response->supported_algorithms.param1 = 4;
+ spdm_response->supported_algorithms.param2 = 0;
+ spdm_response->supported_algorithms.length = sizeof(spdm_supported_algorithms_block_t) +
+ 4 *
+ sizeof(
+ spdm_negotiate_algorithms_common_struct_table_t);
+ spdm_response->supported_algorithms.measurement_specification =
+ SPDM_MEASUREMENT_SPECIFICATION_DMTF;
+ spdm_response->supported_algorithms.other_params_support = 0;
+ spdm_response->supported_algorithms.base_asym_algo = m_libspdm_use_asym_algo;
+ spdm_response->supported_algorithms.base_hash_algo = m_libspdm_use_hash_algo;
+ spdm_response->supported_algorithms.ext_asym_count = 0;
+ spdm_response->supported_algorithms.ext_hash_count = 0;
+ spdm_response->supported_algorithms.mel_specification = SPDM_MEL_SPECIFICATION_DMTF;
+
+ spdm_negotiate_algorithms_common_struct_table_t *struct_table =
+ (spdm_negotiate_algorithms_common_struct_table_t *)(&spdm_response->supported_algorithms
+ + 1);
+
+ struct_table[0].alg_type =
+ SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_DHE;
+ struct_table[0].alg_count = 0x20;
+ struct_table[0].alg_supported =
+ SPDM_ALGORITHMS_DHE_NAMED_GROUP_SECP_256_R1;
+
+ struct_table[1].alg_type =
+ SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_AEAD;
+ struct_table[1].alg_count = 0x20;
+ struct_table[1].alg_supported =
+ SPDM_ALGORITHMS_AEAD_CIPHER_SUITE_AES_256_GCM;;
+
+ struct_table[2].alg_type =
+ SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_REQ_BASE_ASYM_ALG;
+ struct_table[2].alg_count = 0x20;
+ struct_table[2].alg_supported =
+ SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_RSASSA_2048;
+
+ struct_table[3].alg_type =
+ SPDM_NEGOTIATE_ALGORITHMS_STRUCT_TABLE_ALG_TYPE_KEY_SCHEDULE;
+ struct_table[3].alg_count = 0x20;
+ struct_table[3].alg_supported =
+ SPDM_ALGORITHMS_KEY_SCHEDULE_HMAC_HASH;
+
libspdm_transport_test_encode_message(spdm_context, NULL, false,
false, spdm_response_size,
spdm_response,
@@ -1044,7 +1126,7 @@ static void libspdm_test_requester_get_capabilities_case2(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(spdm_context->connection_info.capability.ct_exponent, 0);
assert_int_equal(spdm_context->connection_info.capability.flags,
@@ -1089,7 +1171,7 @@ static void libspdm_test_requester_get_capabilities_case6(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(spdm_context->connection_info.capability.ct_exponent, 0);
assert_int_equal(spdm_context->connection_info.capability.flags,
@@ -1130,7 +1212,7 @@ static void libspdm_test_requester_get_capabilities_case10(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(spdm_context->connection_info.capability.ct_exponent, 0);
assert_int_equal(spdm_context->connection_info.capability.flags,
@@ -1156,7 +1238,7 @@ static void libspdm_test_requester_get_capabilities_case11(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(spdm_context->connection_info.capability.ct_exponent, 0);
assert_int_equal(
@@ -1183,7 +1265,7 @@ static void libspdm_test_requester_get_capabilities_case12(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(spdm_context->connection_info.capability.ct_exponent, 0);
assert_int_equal(spdm_context->connection_info.capability.flags,
@@ -1224,7 +1306,7 @@ static void libspdm_test_requester_get_capabilities_case16(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(spdm_context->connection_info.capability.ct_exponent, 0);
assert_int_equal(spdm_context->connection_info.capability.flags,
@@ -1343,7 +1425,7 @@ static void libspdm_test_requester_get_capabilities_case32(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_11;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(spdm_context->connection_info.capability.ct_exponent, 0);
assert_int_equal(spdm_context->connection_info.capability.flags,
@@ -1374,7 +1456,7 @@ static void libspdm_test_requester_get_capabilities_case33(void **state)
spdm_context->local_context.capability.ct_exponent = 0;
spdm_context->local_context.capability.flags = LIBSPDM_DEFAULT_CAPABILITY_FLAG_VERSION_12;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(spdm_context->connection_info.capability.max_spdm_msg_size,
LIBSPDM_MAX_SPDM_MSG_SIZE);
@@ -1406,7 +1488,50 @@ static void libspdm_test_requester_get_capabilities_case35(void **state)
spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_VERSION;
spdm_context->local_context.capability.ct_exponent = 0;
- status = libspdm_get_capabilities(spdm_context);
+ status = libspdm_get_capabilities(spdm_context, false, NULL);
+ assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
+ assert_int_equal(spdm_context->connection_info.capability.max_spdm_msg_size,
+ LIBSPDM_MAX_SPDM_MSG_SIZE);
+ assert_int_equal(spdm_context->connection_info.capability.data_transfer_size,
+ LIBSPDM_DATA_TRANSFER_SIZE);
+ assert_int_equal(spdm_context->connection_info.capability.ct_exponent, 0);
+ assert_int_equal(spdm_context->connection_info.capability.flags,
+ LIBSPDM_DEFAULT_CAPABILITY_RESPONSE_FLAG_VERSION_13);
+}
+
+static void libspdm_test_requester_get_capabilities_case36(void **state)
+{
+ libspdm_return_t status;
+ libspdm_test_context_t *spdm_test_context;
+ libspdm_context_t *spdm_context;
+ libspdm_responder_supported_algorithms_t supported_algs;
+
+ spdm_test_context = *state;
+ spdm_context = spdm_test_context->spdm_context;
+ spdm_test_context->case_id = 0x24;
+ spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
+ SPDM_VERSION_NUMBER_SHIFT_BIT;
+ spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_VERSION;
+ spdm_context->local_context.capability.ct_exponent = 0;
+
+ spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
+ spdm_context->local_context.algorithm.other_params_support = 0;
+ spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
+ spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
+ spdm_context->local_context.algorithm.mel_spec = SPDM_MEL_SPECIFICATION_DMTF;
+
+ spdm_context->connection_info.capability.flags |=
+ SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
+ spdm_context->connection_info.capability.flags |=
+ SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
+ spdm_context->connection_info.capability.flags |=
+ SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MUT_AUTH_CAP;
+
+ spdm_context->local_context.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
+ spdm_context->local_context.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
+ spdm_context->local_context.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
+ spdm_context->local_context.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
+ status = libspdm_get_capabilities(spdm_context, true, &supported_algs);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(spdm_context->connection_info.capability.max_spdm_msg_size,
LIBSPDM_MAX_SPDM_MSG_SIZE);
@@ -1455,6 +1580,7 @@ int libspdm_requester_get_capabilities_test_main(void)
cmocka_unit_test(libspdm_test_requester_get_capabilities_case33),
/* cmocka_unit_test(libspdm_test_requester_get_capabilities_case34), */
cmocka_unit_test(libspdm_test_requester_get_capabilities_case35),
+ cmocka_unit_test(libspdm_test_requester_get_capabilities_case36),
};
libspdm_test_context_t test_context = {
diff --git a/unit_test/test_spdm_responder/capabilities.c b/unit_test/test_spdm_responder/capabilities.c
index 3eaa7d48186..614496b1c73 100644
--- a/unit_test/test_spdm_responder/capabilities.c
+++ b/unit_test/test_spdm_responder/capabilities.c
@@ -467,6 +467,22 @@ spdm_get_capabilities_request_t m_libspdm_get_capabilities_request27 = {
};
size_t m_libspdm_get_capabilities_request27_size = sizeof(m_libspdm_get_capabilities_request27);
+spdm_get_capabilities_request_t m_libspdm_get_capabilities_request28 = {
+ {
+ SPDM_MESSAGE_VERSION_13,
+ SPDM_GET_CAPABILITIES,
+ 0x01,
+ },
+ 0x00, /*reserved*/
+ 0x01, /*ct_exponent*/
+ 0x0000, /*reserved, 2 bytes*/
+ SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP |
+ SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MULTI_KEY_CAP_ONLY,
+ LIBSPDM_DATA_TRANSFER_SIZE,
+ LIBSPDM_MAX_SPDM_MSG_SIZE,
+};
+size_t m_libspdm_get_capabilities_request28_size = sizeof(m_libspdm_get_capabilities_request28);
+
void libspdm_test_responder_capabilities_case1(void **state)
{
libspdm_return_t status;
@@ -491,6 +507,7 @@ void libspdm_test_responder_capabilities_case1(void **state)
&m_libspdm_get_capabilities_request1, &response_size, response);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(response_size, sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t) -
sizeof(spdm_response->data_transfer_size) -
sizeof(spdm_response->max_spdm_msg_size));
spdm_response = (void *)response;
@@ -527,6 +544,7 @@ void libspdm_test_responder_capabilities_case2(void **state)
&m_libspdm_get_capabilities_request2, &response_size, response);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(response_size, sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t) -
sizeof(spdm_response->data_transfer_size) -
sizeof(spdm_response->max_spdm_msg_size));
spdm_response = (void *)response;
@@ -691,6 +709,7 @@ void libspdm_test_responder_capabilities_case8(void **state)
&m_libspdm_get_capabilities_request4, &response_size, response);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(response_size, sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t) -
sizeof(spdm_response->data_transfer_size) -
sizeof(spdm_response->max_spdm_msg_size));
spdm_response = (void *)response;
@@ -721,6 +740,7 @@ void libspdm_test_responder_capabilities_case9(void **state)
&m_libspdm_get_capabilities_request5, &response_size, response);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(response_size, sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t) -
sizeof(spdm_response->data_transfer_size) -
sizeof(spdm_response->max_spdm_msg_size));
spdm_response = (void *)response;
@@ -1017,6 +1037,7 @@ void libspdm_test_responder_capabilities_case22(void **state)
&m_libspdm_get_capabilities_request18, &response_size, response);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(response_size, sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t) -
sizeof(spdm_response->data_transfer_size) -
sizeof(spdm_response->max_spdm_msg_size));
spdm_response = (void *)response;
@@ -1053,6 +1074,7 @@ void libspdm_test_responder_capabilities_case23(void **state)
&m_libspdm_get_capabilities_request4, &response_size, response);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
assert_int_equal(response_size, sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t) -
sizeof(spdm_response->data_transfer_size) -
sizeof(spdm_response->max_spdm_msg_size));
spdm_response = (void *)response;
@@ -1094,7 +1116,8 @@ void libspdm_test_responder_capabilities_case24(void **state)
assert_int_equal(spdm_context->connection_info.capability.data_transfer_size,
m_libspdm_get_capabilities_request19.data_transfer_size);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
- assert_int_equal(response_size, sizeof(spdm_capabilities_response_t));
+ assert_int_equal(response_size, sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t));
spdm_response = (void *)response;
assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_12);
assert_int_equal(spdm_response->header.request_response_code,
@@ -1185,7 +1208,8 @@ void libspdm_test_responder_capabilities_case27(void **state)
&m_libspdm_get_capabilities_request27, &response_size, response);
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
- assert_int_equal(response_size, sizeof(spdm_capabilities_response_t));
+ assert_int_equal(response_size, sizeof(spdm_capabilities_response_t) -
+ sizeof(spdm_supported_algorithms_block_t));
spdm_response = (void *)response;
assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_13);
assert_int_equal(spdm_response->header.request_response_code,
@@ -1196,6 +1220,57 @@ void libspdm_test_responder_capabilities_case27(void **state)
SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MULTI_KEY_CAP_ONLY);
}
+void libspdm_test_responder_capabilities_case28(void **state)
+{
+ libspdm_return_t status;
+ libspdm_test_context_t *spdm_test_context;
+ libspdm_context_t *spdm_context;
+ size_t response_size;
+ uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
+ spdm_capabilities_response_t *spdm_response;
+
+ spdm_test_context = *state;
+ spdm_context = spdm_test_context->spdm_context;
+ spdm_test_context->case_id = 0x1C;
+ spdm_context->connection_info.connection_state = LIBSPDM_CONNECTION_STATE_AFTER_VERSION;
+
+ spdm_context->local_context.algorithm.measurement_spec = SPDM_MEASUREMENT_SPECIFICATION_DMTF;
+ spdm_context->local_context.algorithm.other_params_support = 0;
+ spdm_context->local_context.algorithm.base_asym_algo = m_libspdm_use_asym_algo;
+ spdm_context->local_context.algorithm.base_hash_algo = m_libspdm_use_hash_algo;
+ spdm_context->local_context.algorithm.mel_spec = SPDM_MEL_SPECIFICATION_DMTF;
+ spdm_context->local_context.capability.flags = SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_CHUNK_CAP;
+
+ spdm_context->connection_info.capability.flags |=
+ SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP;
+ spdm_context->connection_info.capability.flags |=
+ SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_ENCRYPT_CAP;
+ spdm_context->connection_info.capability.flags |=
+ SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MUT_AUTH_CAP;
+
+ spdm_context->local_context.algorithm.dhe_named_group = m_libspdm_use_dhe_algo;
+ spdm_context->local_context.algorithm.aead_cipher_suite = m_libspdm_use_aead_algo;
+ spdm_context->local_context.algorithm.req_base_asym_alg = m_libspdm_use_req_asym_algo;
+ spdm_context->local_context.algorithm.key_schedule = m_libspdm_use_key_schedule_algo;
+
+ response_size = sizeof(response);
+ status = libspdm_get_response_capabilities(
+ spdm_context, m_libspdm_get_capabilities_request28_size,
+ &m_libspdm_get_capabilities_request28, &response_size, response);
+ assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
+ assert_int_equal(response_size, sizeof(spdm_capabilities_response_t) +
+ 4 * sizeof(spdm_negotiate_algorithms_common_struct_table_t));
+ spdm_response = (void *)response;
+ assert_int_equal(spdm_response->header.spdm_version, SPDM_MESSAGE_VERSION_13);
+ assert_int_equal(spdm_response->header.request_response_code,
+ SPDM_CAPABILITIES);
+ assert_int_equal(spdm_response->data_transfer_size, LIBSPDM_DATA_TRANSFER_SIZE);
+ assert_int_equal(spdm_response->max_spdm_msg_size, LIBSPDM_MAX_SPDM_MSG_SIZE);
+ assert_int_equal(spdm_context->connection_info.capability.flags,
+ SPDM_GET_CAPABILITIES_REQUEST_FLAGS_CHUNK_CAP |
+ SPDM_GET_CAPABILITIES_REQUEST_FLAGS_MULTI_KEY_CAP_ONLY);
+}
+
int libspdm_responder_capabilities_test_main(void)
{
const struct CMUnitTest spdm_responder_capabilities_tests[] = {
@@ -1251,6 +1326,8 @@ int libspdm_responder_capabilities_test_main(void)
cmocka_unit_test(libspdm_test_responder_capabilities_case26),
/* Success Case , capability supports MULTI_KEY_CAP */
cmocka_unit_test(libspdm_test_responder_capabilities_case27),
+ /* Success Case , capability supports MULTI_KEY_CAP */
+ cmocka_unit_test(libspdm_test_responder_capabilities_case28),
};
libspdm_test_context_t test_context = {