From ceb880200dcb6d7e3f5ed88cb2f25445dda7e388 Mon Sep 17 00:00:00 2001 From: Xiao Date: Tue, 7 May 2024 11:46:01 +0800 Subject: [PATCH] Merge test_spdm_vendor_cmds into test_spdm_requester or test_spdm_responder Signed-off-by: Xiao --- CMakeLists.txt | 1 - unit_test/test_spdm_requester/CMakeLists.txt | 2 + .../error_test/vendor_request_err.c} | 66 +------ .../test_spdm_requester/test_spdm_requester.c | 14 ++ .../vendor_request.c} | 81 +------- unit_test/test_spdm_responder/CMakeLists.txt | 2 + .../error_test/vendor_response_err.c | 142 ++++++++++++++ .../test_spdm_responder/test_spdm_responder.c | 14 ++ .../test_spdm_responder/vendor_response.c | 179 ++++++++++++++++++ .../test_spdm_vendor_cmds/CMakeLists.txt | 72 ------- .../test_spdm_vendor_cmds.c | 28 --- 11 files changed, 357 insertions(+), 244 deletions(-) rename unit_test/{test_spdm_vendor_cmds/error_test/vendor_cmds_err.c => test_spdm_requester/error_test/vendor_request_err.c} (76%) rename unit_test/{test_spdm_vendor_cmds/vendor_cmds.c => test_spdm_requester/vendor_request.c} (70%) create mode 100644 unit_test/test_spdm_responder/error_test/vendor_response_err.c create mode 100644 unit_test/test_spdm_responder/vendor_response.c delete mode 100644 unit_test/test_spdm_vendor_cmds/CMakeLists.txt delete mode 100644 unit_test/test_spdm_vendor_cmds/test_spdm_vendor_cmds.c diff --git a/CMakeLists.txt b/CMakeLists.txt index fd2b38ca921..f85a8c4317b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -952,7 +952,6 @@ else() ADD_SUBDIRECTORY(unit_test/test_spdm_crypt) ADD_SUBDIRECTORY(unit_test/test_spdm_fips) ADD_SUBDIRECTORY(unit_test/test_spdm_secured_message) - ADD_SUBDIRECTORY(unit_test/test_spdm_vendor_cmds) endif() if((NOT TOOLCHAIN STREQUAL "ARM_DS2022") AND (NOT TOOLCHAIN STREQUAL "RISCV_XPACK")) diff --git a/unit_test/test_spdm_requester/CMakeLists.txt b/unit_test/test_spdm_requester/CMakeLists.txt index 07653ef23b9..a5374d98ece 100644 --- a/unit_test/test_spdm_requester/CMakeLists.txt +++ b/unit_test/test_spdm_requester/CMakeLists.txt @@ -42,6 +42,7 @@ SET(src_test_spdm_requester get_csr.c chunk_get.c chunk_send.c + vendor_request.c error_test/get_version_err.c error_test/get_capabilities_err.c error_test/negotiate_algorithms_err.c @@ -49,6 +50,7 @@ SET(src_test_spdm_requester error_test/key_exchange_err.c error_test/get_measurements_err.c error_test/get_event_types_err.c + error_test/vendor_request_err.c ${LIBSPDM_DIR}/unit_test/spdm_unit_test_common/common.c ${LIBSPDM_DIR}/unit_test/spdm_unit_test_common/algo.c ${LIBSPDM_DIR}/unit_test/spdm_unit_test_common/support.c diff --git a/unit_test/test_spdm_vendor_cmds/error_test/vendor_cmds_err.c b/unit_test/test_spdm_requester/error_test/vendor_request_err.c similarity index 76% rename from unit_test/test_spdm_vendor_cmds/error_test/vendor_cmds_err.c rename to unit_test/test_spdm_requester/error_test/vendor_request_err.c index c454427940c..dc004981fcb 100644 --- a/unit_test/test_spdm_vendor_cmds/error_test/vendor_cmds_err.c +++ b/unit_test/test_spdm_requester/error_test/vendor_request_err.c @@ -1,5 +1,6 @@ /** - * Copyright 2023 DMTF. All rights reserved. + * Copyright Notice: + * Copyright 2023-2024 DMTF. All rights reserved. * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md **/ @@ -92,8 +93,6 @@ static libspdm_return_t libspdm_requester_vendor_cmds_err_test_send_message( m_libspdm_local_buffer_size += request_size; } return LIBSPDM_STATUS_SUCCESS; - case 0x2: - return LIBSPDM_STATUS_SUCCESS; default: return LIBSPDM_STATUS_SEND_FAIL; } @@ -217,66 +216,6 @@ static void libspdm_test_requester_vendor_cmds_err_case1(void **state) printf("case 1 %d\n", response.data[0]); } -/** - * Test 2: Sending a vendor defined request with one parameter NULL - * Expected behavior: client returns a status of LIBSPDM_STATUS_INVALID_PARAMETER - **/ -static void libspdm_test_requester_vendor_cmds_err_case2(void **state) -{ - libspdm_return_t status; - libspdm_test_context_t *spdm_test_context; - libspdm_context_t *spdm_context; - uint8_t request_buffer[255] = {0}; - libspdm_vendor_request_test request; - libspdm_vendor_response_test response = {0}; - response.vendor_id_len = sizeof(response.vendor_id); - response.data_len = sizeof(response.data); - size_t response_len = 0; - - spdm_test_context = *state; - spdm_context = spdm_test_context->spdm_context; - spdm_test_context->case_id = 0x1; - spdm_context->connection_info.algorithm.base_hash_algo = - SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256; - request.header.spdm_version = SPDM_MESSAGE_VERSION_10; - spdm_context->connection_info.version = request.header.spdm_version << - SPDM_VERSION_NUMBER_SHIFT_BIT; - spdm_context->connection_info.connection_state = - LIBSPDM_CONNECTION_STATE_NEGOTIATED; - spdm_context->local_context.is_requester = true; - - status = libspdm_register_vendor_callback_func(spdm_context, - libspdm_vendor_response_func_err_test); - assert_int_equal(status, LIBSPDM_STATUS_SUCCESS); - - request.standard_id = 6; - request.vendor_id_len = 2; - request.vendor_id[0] = 0xAA; - request.vendor_id[1] = 0xAA; - request.data_len = sizeof(request.data); - libspdm_set_mem(request.data, sizeof(request.data), 0xAA); - - response_len = sizeof(response); - - /* copy header of request structure to buffer */ - libspdm_copy_mem(request_buffer, 255, &request, - sizeof(request.header) + 3 + request.vendor_id_len); - /* copy the request data to the correct offset in the request_buffer */ - libspdm_copy_mem(request_buffer + sizeof(request.header) + 3 + request.vendor_id_len, - request.data_len + 2, &request.data_len, request.data_len + 2); - - /* requires correctly encoded spdm vendor request message */ - status = libspdm_get_vendor_defined_response(spdm_context, sizeof(request), - request_buffer, &response_len, NULL); - - assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER); - assert_int_equal( - spdm_context->connection_info.version >> SPDM_VERSION_NUMBER_SHIFT_BIT, - SPDM_MESSAGE_VERSION_10); - - response.data_len = (uint16_t)response_len; -} - libspdm_test_context_t m_libspdm_requester_vendor_cmds_err_test_context = { LIBSPDM_TEST_CONTEXT_VERSION, true, @@ -288,7 +227,6 @@ int libspdm_requester_vendor_cmds_error_test_main(void) { const struct CMUnitTest spdm_requester_vendor_cmds_tests[] = { cmocka_unit_test(libspdm_test_requester_vendor_cmds_err_case1), - cmocka_unit_test(libspdm_test_requester_vendor_cmds_err_case2) }; libspdm_setup_test_context(&m_libspdm_requester_vendor_cmds_err_test_context); diff --git a/unit_test/test_spdm_requester/test_spdm_requester.c b/unit_test/test_spdm_requester/test_spdm_requester.c index cf2b61f2fde..970b33024da 100644 --- a/unit_test/test_spdm_requester/test_spdm_requester.c +++ b/unit_test/test_spdm_requester/test_spdm_requester.c @@ -73,6 +73,11 @@ int libspdm_requester_get_event_types_test_main(void); int libspdm_requester_get_event_types_error_test_main(void); #endif /* LIBSPDM_EVENT_RECIPIENT_SUPPORT */ +#if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES +int libspdm_requester_vendor_cmds_test_main(void); +int libspdm_requester_vendor_cmds_error_test_main(void); +#endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */ + int main(void) { int return_value = 0; @@ -217,5 +222,14 @@ int main(void) } #endif /* LIBSPDM_EVENT_RECIPIENT_SUPPORT */ + #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES + if (libspdm_requester_vendor_cmds_test_main() != 0) { + return_value = 1; + } + if (libspdm_requester_vendor_cmds_error_test_main() != 0) { + return_value = 1; + } + #endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */ + return return_value; } diff --git a/unit_test/test_spdm_vendor_cmds/vendor_cmds.c b/unit_test/test_spdm_requester/vendor_request.c similarity index 70% rename from unit_test/test_spdm_vendor_cmds/vendor_cmds.c rename to unit_test/test_spdm_requester/vendor_request.c index f136058d028..f3146575453 100644 --- a/unit_test/test_spdm_vendor_cmds/vendor_cmds.c +++ b/unit_test/test_spdm_requester/vendor_request.c @@ -1,5 +1,6 @@ /** - * Copyright 2023 DMTF. All rights reserved. + * Copyright Notice: + * Copyright 2023-2024 DMTF. All rights reserved. * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md **/ @@ -102,8 +103,6 @@ static libspdm_return_t libspdm_requester_vendor_cmds_test_send_message( m_libspdm_local_buffer_size += request_size; } return LIBSPDM_STATUS_SUCCESS; - case 0x2: - return LIBSPDM_STATUS_SUCCESS; default: return LIBSPDM_STATUS_SEND_FAIL; } @@ -220,80 +219,6 @@ static void libspdm_test_requester_vendor_cmds_case1(void **state) printf("case 1 %d\n", response.data[0]); } -/** - * Test 2: Sending a vendor defined request using the internal response handler - * Expected behavior: client returns a status of LIBSPDM_STATUS_SUCCESS and expected response - **/ -static void libspdm_test_requester_vendor_cmds_case2(void **state) -{ - libspdm_return_t status; - libspdm_test_context_t *spdm_test_context; - libspdm_context_t *spdm_context; - uint8_t request_buffer[255] = {0}; - uint8_t response_buffer[255] = {0}; - libspdm_vendor_request_test request = {0}; - libspdm_vendor_response_test response = {0}; - size_t response_len = 0; - response.vendor_id_len = sizeof(response.vendor_id); - response.data_len = sizeof(response.data); - - spdm_test_context = *state; - spdm_context = spdm_test_context->spdm_context; - spdm_test_context->case_id = 0x1; - spdm_context->connection_info.algorithm.base_hash_algo = - SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256; - request.header.spdm_version = SPDM_MESSAGE_VERSION_10; - spdm_context->connection_info.version = request.header.spdm_version << - SPDM_VERSION_NUMBER_SHIFT_BIT; - spdm_context->connection_info.connection_state = - LIBSPDM_CONNECTION_STATE_NEGOTIATED; - spdm_context->local_context.is_requester = true; - - status = libspdm_register_vendor_get_id_callback_func(spdm_context, - libspdm_vendor_get_id_func_test); - assert_int_equal(status, LIBSPDM_STATUS_SUCCESS); - status = libspdm_register_vendor_callback_func(spdm_context, - libspdm_vendor_response_func_test); - assert_int_equal(status, LIBSPDM_STATUS_SUCCESS); - - request.standard_id = 6; - request.vendor_id_len = 2; - request.vendor_id[0] = 0xAA; - request.vendor_id[1] = 0xAA; - request.data_len = sizeof(request.data); - libspdm_set_mem(request.data, sizeof(request.data), 0xAA); - - response_len = sizeof(response); - - /* copy header of request structure to buffer */ - libspdm_copy_mem(request_buffer, 255, &request, - sizeof(request.header) + 3 + request.vendor_id_len); - /* copy the request data to the correct offset in the request_buffer */ - libspdm_copy_mem(request_buffer + sizeof(request.header) + 3 + request.vendor_id_len, - request.data_len + 2, &request.data_len, request.data_len + 2); - - /* requires correctly encoded spdm vendor request message */ - status = libspdm_get_vendor_defined_response(spdm_context, sizeof(request), - request_buffer, &response_len, response_buffer); - - /* copy to response data structure in the same way as for request */ - response.vendor_id_len = response_buffer[sizeof(response.header) + 2]; - response.data_len = - *((uint16_t*)(response_buffer + sizeof(response.header) + 3 + response.vendor_id_len)); - /* copy header of response structure from buffer */ - libspdm_copy_mem(&response, sizeof(response), response_buffer, - sizeof(response.header) + 3 + response.vendor_id_len); - /* copy the response data from the correct offset in the response_buffer */ - libspdm_copy_mem(&response.data, response.data_len, - response_buffer + sizeof(response.header) + 3 + response.vendor_id_len + 2, - response.data_len); - - assert_int_equal(status, LIBSPDM_STATUS_SUCCESS); - assert_int_equal( - spdm_context->connection_info.version >> SPDM_VERSION_NUMBER_SHIFT_BIT, - SPDM_MESSAGE_VERSION_10); -} - libspdm_test_context_t m_libspdm_requester_vendor_cmds_test_context = { LIBSPDM_TEST_CONTEXT_VERSION, true, @@ -305,7 +230,6 @@ int libspdm_requester_vendor_cmds_test_main(void) { const struct CMUnitTest spdm_requester_vendor_cmds_tests[] = { cmocka_unit_test(libspdm_test_requester_vendor_cmds_case1), - cmocka_unit_test(libspdm_test_requester_vendor_cmds_case2) }; libspdm_setup_test_context(&m_libspdm_requester_vendor_cmds_test_context); @@ -315,5 +239,4 @@ int libspdm_requester_vendor_cmds_test_main(void) libspdm_unit_test_group_teardown); } - #endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */ diff --git a/unit_test/test_spdm_responder/CMakeLists.txt b/unit_test/test_spdm_responder/CMakeLists.txt index dcf7a2ba850..3d44d84a73d 100644 --- a/unit_test/test_spdm_responder/CMakeLists.txt +++ b/unit_test/test_spdm_responder/CMakeLists.txt @@ -33,6 +33,7 @@ SET(src_test_spdm_responder heartbeat.c key_update.c end_session.c + vendor_response.c encap_get_certificate.c encap_get_digests.c encap_key_update.c @@ -40,6 +41,7 @@ SET(src_test_spdm_responder encap_response.c supported_event_types.c error_test/supported_event_types_err.c + error_test/vendor_response_err.c set_certificate_rsp.c csr.c receive_send.c diff --git a/unit_test/test_spdm_responder/error_test/vendor_response_err.c b/unit_test/test_spdm_responder/error_test/vendor_response_err.c new file mode 100644 index 00000000000..e1b407e1692 --- /dev/null +++ b/unit_test/test_spdm_responder/error_test/vendor_response_err.c @@ -0,0 +1,142 @@ +/** + * Copyright Notice: + * Copyright 2023-2024 DMTF. All rights reserved. + * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md + **/ + + +#include "spdm_unit_test.h" +#include "internal/libspdm_requester_lib.h" +#include "internal/libspdm_responder_lib.h" + +#if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES + +#pragma pack(1) +typedef struct { + spdm_message_header_t header; + uint16_t standard_id; + uint8_t vendor_id_len; + uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH]; + uint16_t data_len; + uint8_t data[16]; +} libspdm_vendor_request_test; + +typedef struct { + spdm_message_header_t header; + uint16_t standard_id; + uint8_t vendor_id_len; + uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH]; + uint16_t data_len; + uint8_t data[64]; +} libspdm_vendor_response_test; +#pragma pack() + +libspdm_return_t libspdm_vendor_response_func_err_test( + void *spdm_context, + uint16_t req_standard_id, + uint8_t req_vendor_id_len, + const void *req_vendor_id, + uint16_t req_size, + const void *req_data, + uint16_t *resp_size, + void *resp_data) +{ + libspdm_vendor_response_test test_response; + /* get pointer to response data payload and populate */ + uint8_t *resp_payload = (uint8_t *)resp_data; + /* get pointer to response length and populate */ + *resp_size = sizeof(test_response.data); + /* store length of response */ + libspdm_set_mem(resp_payload, *resp_size, 0xFF); + + if (resp_size == NULL || *resp_size == 0) + return LIBSPDM_STATUS_INVALID_PARAMETER; + + /* TBD make an error here, like response len 65000, but different this time. */ + + printf("Got request 0x%x, sent response 0x%x\n", + ((const uint8_t*)req_data)[0], ((uint8_t*)resp_data)[0]); + + return LIBSPDM_STATUS_SUCCESS; +} + +/** + * Test 1: Sending a vendor defined request with one parameter NULL + * Expected behavior: client returns a status of LIBSPDM_STATUS_INVALID_PARAMETER + **/ +static void libspdm_test_responder_vendor_cmds_err_case1(void **state) +{ + libspdm_return_t status; + libspdm_test_context_t *spdm_test_context; + libspdm_context_t *spdm_context; + uint8_t request_buffer[255] = {0}; + libspdm_vendor_request_test request; + libspdm_vendor_response_test response = {0}; + response.vendor_id_len = sizeof(response.vendor_id); + response.data_len = sizeof(response.data); + size_t response_len = 0; + + spdm_test_context = *state; + spdm_context = spdm_test_context->spdm_context; + spdm_test_context->case_id = 0x1; + spdm_context->connection_info.algorithm.base_hash_algo = + SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256; + request.header.spdm_version = SPDM_MESSAGE_VERSION_10; + spdm_context->connection_info.version = request.header.spdm_version << + SPDM_VERSION_NUMBER_SHIFT_BIT; + spdm_context->connection_info.connection_state = + LIBSPDM_CONNECTION_STATE_NEGOTIATED; + spdm_context->local_context.is_requester = true; + + status = libspdm_register_vendor_callback_func(spdm_context, + libspdm_vendor_response_func_err_test); + assert_int_equal(status, LIBSPDM_STATUS_SUCCESS); + + request.standard_id = 6; + request.vendor_id_len = 2; + request.vendor_id[0] = 0xAA; + request.vendor_id[1] = 0xAA; + request.data_len = sizeof(request.data); + libspdm_set_mem(request.data, sizeof(request.data), 0xAA); + + response_len = sizeof(response); + + /* copy header of request structure to buffer */ + libspdm_copy_mem(request_buffer, 255, &request, + sizeof(request.header) + 3 + request.vendor_id_len); + /* copy the request data to the correct offset in the request_buffer */ + libspdm_copy_mem(request_buffer + sizeof(request.header) + 3 + request.vendor_id_len, + request.data_len + 2, &request.data_len, request.data_len + 2); + + /* requires correctly encoded spdm vendor request message */ + status = libspdm_get_vendor_defined_response(spdm_context, sizeof(request), + request_buffer, &response_len, NULL); + + assert_int_equal(status, LIBSPDM_STATUS_INVALID_PARAMETER); + assert_int_equal( + spdm_context->connection_info.version >> SPDM_VERSION_NUMBER_SHIFT_BIT, + SPDM_MESSAGE_VERSION_10); + + response.data_len = (uint16_t)response_len; +} + +libspdm_test_context_t m_libspdm_responder_vendor_cmds_err_test_context = { + LIBSPDM_TEST_CONTEXT_VERSION, + true, +}; + +int libspdm_responder_vendor_cmds_error_test_main(void) +{ + const struct CMUnitTest spdm_responder_vendor_cmds_tests[] = { + cmocka_unit_test(libspdm_test_responder_vendor_cmds_err_case1), + }; + + libspdm_setup_test_context(&m_libspdm_responder_vendor_cmds_err_test_context); + + return cmocka_run_group_tests(spdm_responder_vendor_cmds_tests, + libspdm_unit_test_group_setup, + libspdm_unit_test_group_teardown); +} + + +#endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */ diff --git a/unit_test/test_spdm_responder/test_spdm_responder.c b/unit_test/test_spdm_responder/test_spdm_responder.c index bb30df80fcc..c674c222d28 100644 --- a/unit_test/test_spdm_responder/test_spdm_responder.c +++ b/unit_test/test_spdm_responder/test_spdm_responder.c @@ -77,6 +77,11 @@ int libspdm_responder_supported_event_types_test_main(void); int libspdm_responder_supported_event_types_error_test_main(void); #endif /* LIBSPDM_ENABLE_CAPABILITY_EVENT_CAP */ +#if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES +int libspdm_responder_vendor_cmds_test_main(void); +int libspdm_responder_vendor_cmds_error_test_main(void); +#endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */ + int main(void) { int return_value = 0; @@ -219,5 +224,14 @@ int main(void) } #endif /* LIBSPDM_ENABLE_CAPABILITY_EVENT_CAP */ + #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES + if (libspdm_responder_vendor_cmds_test_main() != 0) { + return_value = 1; + } + if (libspdm_responder_vendor_cmds_error_test_main() != 0) { + return_value = 1; + } + #endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */ + return return_value; } diff --git a/unit_test/test_spdm_responder/vendor_response.c b/unit_test/test_spdm_responder/vendor_response.c new file mode 100644 index 00000000000..73219ccae75 --- /dev/null +++ b/unit_test/test_spdm_responder/vendor_response.c @@ -0,0 +1,179 @@ +/** + * Copyright Notice: + * Copyright 2023-2024 DMTF. All rights reserved. + * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md + **/ + +#include "spdm_unit_test.h" +#include "internal/libspdm_responder_lib.h" + +#if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES + +#pragma pack(1) +typedef struct { + spdm_message_header_t header; + uint16_t standard_id; + uint8_t vendor_id_len; + uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH]; + uint16_t data_len; + uint8_t data[16]; +} libspdm_vendor_request_test; + +typedef struct { + spdm_message_header_t header; + uint16_t standard_id; + uint8_t vendor_id_len; + uint8_t vendor_id[SPDM_MAX_VENDOR_ID_LENGTH]; + uint16_t data_len; + uint8_t data[64]; +} libspdm_vendor_response_test; +#pragma pack() + + +libspdm_return_t libspdm_vendor_get_id_func_test( + void *spdm_context, + uint16_t *resp_standard_id, + uint8_t *resp_vendor_id_len, + void *resp_vendor_id) +{ + if (resp_standard_id == NULL || + resp_vendor_id_len == NULL || + resp_vendor_id == NULL) + return LIBSPDM_STATUS_INVALID_PARAMETER; + + /* vendor id length in bytes */ + if (*resp_vendor_id_len < 2) + return LIBSPDM_STATUS_INVALID_PARAMETER; + + *resp_standard_id = 6; + /* vendor id length in bytes */ + *resp_vendor_id_len = 2; + ((uint8_t*)resp_vendor_id)[0] = 0xAA; + ((uint8_t*)resp_vendor_id)[1] = 0xAA; + + return LIBSPDM_STATUS_SUCCESS; +} + +libspdm_return_t libspdm_vendor_response_func_test( + void *spdm_context, + uint16_t req_standard_id, + uint8_t req_vendor_id_len, + const void *req_vendor_id, + uint16_t req_size, + const void *req_data, + uint16_t *resp_size, + void *resp_data) +{ + if (req_data == NULL || + resp_size == NULL || + resp_data == NULL) + return LIBSPDM_STATUS_INVALID_PARAMETER; + + libspdm_vendor_response_test test_response; + /* get pointer to response data payload and populate */ + uint8_t *resp_payload = (uint8_t *)resp_data; + /* get pointer to response length and populate */ + *resp_size = sizeof(test_response.data); + /* store length of response */ + libspdm_set_mem(resp_payload, *resp_size, 0xFF); + + printf("Got request 0x%x, sent response 0x%x\n", + ((const uint8_t*)req_data)[0], ((uint8_t*)resp_data)[0]); + + return LIBSPDM_STATUS_SUCCESS; +} + +/** + * Test 1: Sending a vendor defined request using the internal response handler + * Expected behavior: client returns a status of LIBSPDM_STATUS_SUCCESS and expected response + **/ +static void libspdm_test_responder_vendor_cmds_case1(void **state) +{ + libspdm_return_t status; + libspdm_test_context_t *spdm_test_context; + libspdm_context_t *spdm_context; + uint8_t request_buffer[255] = {0}; + uint8_t response_buffer[255] = {0}; + libspdm_vendor_request_test request = {0}; + libspdm_vendor_response_test response = {0}; + size_t response_len = 0; + response.vendor_id_len = sizeof(response.vendor_id); + response.data_len = sizeof(response.data); + + spdm_test_context = *state; + spdm_context = spdm_test_context->spdm_context; + spdm_test_context->case_id = 0x1; + spdm_context->connection_info.algorithm.base_hash_algo = + SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_256; + request.header.spdm_version = SPDM_MESSAGE_VERSION_10; + spdm_context->connection_info.version = request.header.spdm_version << + SPDM_VERSION_NUMBER_SHIFT_BIT; + spdm_context->connection_info.connection_state = + LIBSPDM_CONNECTION_STATE_NEGOTIATED; + spdm_context->local_context.is_requester = true; + + status = libspdm_register_vendor_get_id_callback_func(spdm_context, + libspdm_vendor_get_id_func_test); + assert_int_equal(status, LIBSPDM_STATUS_SUCCESS); + status = libspdm_register_vendor_callback_func(spdm_context, + libspdm_vendor_response_func_test); + assert_int_equal(status, LIBSPDM_STATUS_SUCCESS); + + request.standard_id = 6; + request.vendor_id_len = 2; + request.vendor_id[0] = 0xAA; + request.vendor_id[1] = 0xAA; + request.data_len = sizeof(request.data); + libspdm_set_mem(request.data, sizeof(request.data), 0xAA); + + response_len = sizeof(response); + + /* copy header of request structure to buffer */ + libspdm_copy_mem(request_buffer, 255, &request, + sizeof(request.header) + 3 + request.vendor_id_len); + /* copy the request data to the correct offset in the request_buffer */ + libspdm_copy_mem(request_buffer + sizeof(request.header) + 3 + request.vendor_id_len, + request.data_len + 2, &request.data_len, request.data_len + 2); + + /* requires correctly encoded spdm vendor request message */ + status = libspdm_get_vendor_defined_response(spdm_context, sizeof(request), + request_buffer, &response_len, response_buffer); + + /* copy to response data structure in the same way as for request */ + response.vendor_id_len = response_buffer[sizeof(response.header) + 2]; + response.data_len = + *((uint16_t*)(response_buffer + sizeof(response.header) + 3 + response.vendor_id_len)); + /* copy header of response structure from buffer */ + libspdm_copy_mem(&response, sizeof(response), response_buffer, + sizeof(response.header) + 3 + response.vendor_id_len); + /* copy the response data from the correct offset in the response_buffer */ + libspdm_copy_mem(&response.data, response.data_len, + response_buffer + sizeof(response.header) + 3 + response.vendor_id_len + 2, + response.data_len); + + assert_int_equal(status, LIBSPDM_STATUS_SUCCESS); + assert_int_equal( + spdm_context->connection_info.version >> SPDM_VERSION_NUMBER_SHIFT_BIT, + SPDM_MESSAGE_VERSION_10); +} + +libspdm_test_context_t m_libspdm_responder_vendor_cmds_test_context = { + LIBSPDM_TEST_CONTEXT_VERSION, + true, +}; + +int libspdm_responder_vendor_cmds_test_main(void) +{ + const struct CMUnitTest spdm_responder_vendor_cmds_tests[] = { + cmocka_unit_test(libspdm_test_responder_vendor_cmds_case1), + }; + + libspdm_setup_test_context(&m_libspdm_responder_vendor_cmds_test_context); + + return cmocka_run_group_tests(spdm_responder_vendor_cmds_tests, + libspdm_unit_test_group_setup, + libspdm_unit_test_group_teardown); +} + + +#endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */ diff --git a/unit_test/test_spdm_vendor_cmds/CMakeLists.txt b/unit_test/test_spdm_vendor_cmds/CMakeLists.txt deleted file mode 100644 index 3817bf9dde1..00000000000 --- a/unit_test/test_spdm_vendor_cmds/CMakeLists.txt +++ /dev/null @@ -1,72 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) - -INCLUDE_DIRECTORIES(${LIBSPDM_DIR}/unit_test/test_spdm_vendor_cmds - ${LIBSPDM_DIR}/include - ${LIBSPDM_DIR}/unit_test/include - ${LIBSPDM_DIR}/os_stub/spdm_device_secret_lib_sample - ${LIBSPDM_DIR}/unit_test/cmockalib/cmocka/include - ${LIBSPDM_DIR}/unit_test/cmockalib/cmocka/include/cmockery - ${LIBSPDM_DIR}/unit_test/spdm_unit_test_common - ${LIBSPDM_DIR}/os_stub -) - -if(CMAKE_SYSTEM_NAME MATCHES "Windows") - if((TOOLCHAIN STREQUAL "VS2015") OR (TOOLCHAIN STREQUAL "VS2019") OR (TOOLCHAIN STREQUAL "VS2022")) - ADD_COMPILE_OPTIONS(/wd4819) - endif() -endif() - -SET(src_test_spdm_vendor_cmds - test_spdm_vendor_cmds.c - vendor_cmds.c - error_test/vendor_cmds_err.c - ${LIBSPDM_DIR}/unit_test/spdm_unit_test_common/common.c - ${LIBSPDM_DIR}/unit_test/spdm_unit_test_common/algo.c - ${LIBSPDM_DIR}/unit_test/spdm_unit_test_common/support.c -) - -SET(test_spdm_vendor_cmds_LIBRARY - memlib - debuglib - spdm_responder_lib - spdm_requester_lib - spdm_common_lib - ${CRYPTO_LIB_PATHS} - rnglib - cryptlib_${CRYPTO} - malloclib - spdm_crypt_lib - spdm_crypt_ext_lib - spdm_secured_message_lib - spdm_device_secret_lib_sample - spdm_transport_test_lib - cmockalib - platform_lib -) - -if(TOOLCHAIN STREQUAL "ARM_DS2022") - SET(test_spdm_vendor_cmds_LIBRARY ${test_spdm_vendor_cmds_LIBRARY} armbuild_lib) -endif() - -if((TOOLCHAIN STREQUAL "KLEE") OR (TOOLCHAIN STREQUAL "CBMC")) - ADD_EXECUTABLE(test_spdm_vendor_cmds - ${src_test_spdm_vendor_cmds} - $ - $ - $ - $ - $ - $ - $ - $ - $ - $ - $ - $ - $ - $ - ) -else() - ADD_EXECUTABLE(test_spdm_vendor_cmds ${src_test_spdm_vendor_cmds}) - TARGET_LINK_LIBRARIES(test_spdm_vendor_cmds ${test_spdm_vendor_cmds_LIBRARY}) -endif() diff --git a/unit_test/test_spdm_vendor_cmds/test_spdm_vendor_cmds.c b/unit_test/test_spdm_vendor_cmds/test_spdm_vendor_cmds.c deleted file mode 100644 index 889e6b9d2d5..00000000000 --- a/unit_test/test_spdm_vendor_cmds/test_spdm_vendor_cmds.c +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright 2023 DMTF. All rights reserved. - * License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md - **/ - -#include "spdm_unit_test.h" -#include "internal/libspdm_requester_lib.h" - -#if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES -int libspdm_requester_vendor_cmds_test_main(void); -int libspdm_requester_vendor_cmds_error_test_main(void); -#endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */ - -int main(void) -{ - int return_value = 0; - - #if LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES - if (libspdm_requester_vendor_cmds_test_main() != 0) { - return_value = 1; - } - if (libspdm_requester_vendor_cmds_error_test_main() != 0) { - return_value = 1; - } - #endif /* LIBSPDM_ENABLE_VENDOR_DEFINED_MESSAGES */ - - return return_value; -}