Skip to content

Commit 0a8f7b7

Browse files
committed
Add unit_test for set_certificate 1.3 erase cert feature
Signed-off-by: Wenxing Hou <[email protected]>
1 parent 701517d commit 0a8f7b7

File tree

2 files changed

+182
-0
lines changed

2 files changed

+182
-0
lines changed

unit_test/test_spdm_requester/set_certificate.c

+52
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ libspdm_return_t libspdm_requester_set_certificate_test_send_message(
6363

6464
case 0x6:
6565
return LIBSPDM_STATUS_SUCCESS;
66+
case 0x7:
67+
return LIBSPDM_STATUS_SUCCESS;
6668

6769
default:
6870
return LIBSPDM_STATUS_SEND_FAIL;
@@ -208,6 +210,27 @@ libspdm_return_t libspdm_requester_set_certificate_test_receive_message(
208210
}
209211
return LIBSPDM_STATUS_SUCCESS;
210212

213+
case 0x7: {
214+
spdm_set_certificate_response_t *spdm_response;
215+
size_t spdm_response_size;
216+
size_t transport_header_size;
217+
218+
spdm_response_size = sizeof(spdm_set_certificate_response_t);
219+
transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE;
220+
spdm_response = (void *)((uint8_t *)*response + transport_header_size);
221+
222+
spdm_response->header.spdm_version = SPDM_MESSAGE_VERSION_13;
223+
spdm_response->header.request_response_code = SPDM_SET_CERTIFICATE_RSP;
224+
spdm_response->header.param1 = 0;
225+
spdm_response->header.param2 = 0;
226+
227+
libspdm_transport_test_encode_message(spdm_context, NULL, false,
228+
false, spdm_response_size,
229+
spdm_response, response_size,
230+
response);
231+
}
232+
return LIBSPDM_STATUS_SUCCESS;
233+
211234
default:
212235
return LIBSPDM_STATUS_SEND_FAIL;
213236
}
@@ -403,6 +426,33 @@ void libspdm_test_requester_set_certificate_case6(void **state)
403426
free(data);
404427
}
405428

429+
/**
430+
* Test 7: Successful response to erase certificate for slot 0
431+
* Expected Behavior: get a RETURN_SUCCESS return code
432+
**/
433+
void libspdm_test_requester_set_certificate_case7(void **state)
434+
{
435+
libspdm_return_t status;
436+
libspdm_test_context_t *spdm_test_context;
437+
libspdm_context_t *spdm_context;
438+
439+
spdm_test_context = *state;
440+
spdm_context = spdm_test_context->spdm_context;
441+
spdm_test_context->case_id = 0x7;
442+
spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
443+
SPDM_VERSION_NUMBER_SHIFT_BIT;
444+
445+
spdm_context->connection_info.connection_state =
446+
LIBSPDM_CONNECTION_STATE_NEGOTIATED;
447+
spdm_context->connection_info.capability.flags |=
448+
SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
449+
450+
status = libspdm_set_certificate_ex(spdm_context, NULL, 0, NULL, 0,
451+
0 | SPDM_SET_CERTIFICATE_REQUEST_ERASE_MASK, 0);
452+
453+
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
454+
}
455+
406456
libspdm_test_context_t m_libspdm_requester_set_certificate_test_context = {
407457
LIBSPDM_TEST_CONTEXT_VERSION,
408458
true,
@@ -423,6 +473,8 @@ int libspdm_requester_set_certificate_test_main(void)
423473
cmocka_unit_test(libspdm_test_requester_set_certificate_case5),
424474
/* Successful response to set certificate with a reset required */
425475
cmocka_unit_test(libspdm_test_requester_set_certificate_case6),
476+
/* Successful response to erase certificate*/
477+
cmocka_unit_test(libspdm_test_requester_set_certificate_case7),
426478
};
427479

428480
libspdm_setup_test_context(

unit_test/test_spdm_responder/set_certificate_rsp.c

+130
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77
#include "spdm_unit_test.h"
88
#include "internal/libspdm_responder_lib.h"
99

10+
#if defined(_WIN32) || (defined(__clang__) && (defined (LIBSPDM_CPU_AARCH64) || \
11+
defined(LIBSPDM_CPU_ARM)))
12+
#else
13+
#include <fcntl.h>
14+
#include <unistd.h>
15+
#include <sys/stat.h>
16+
#endif
17+
1018
#if LIBSPDM_ENABLE_CAPABILITY_SET_CERT_CAP
1119

1220
extern bool g_in_trusted_environment;
@@ -760,6 +768,126 @@ void libspdm_test_responder_set_cetificate_rsp_case9(void **state)
760768
free(cert_chain);
761769
free(m_libspdm_set_certificate_request);
762770
}
771+
772+
/**
773+
* Test 10: receives a valid SET_CERTIFICATE request message from Requester to erase cert in slot_id:1 with session
774+
* Expected Behavior: produces a valid SET_CERTIFICATE_RSP response message
775+
**/
776+
void libspdm_test_responder_set_cetificate_rsp_case10(void **state)
777+
{
778+
libspdm_return_t status;
779+
libspdm_test_context_t *spdm_test_context;
780+
libspdm_context_t *spdm_context;
781+
size_t response_size;
782+
uint8_t response[LIBSPDM_MAX_SPDM_MSG_SIZE];
783+
spdm_set_certificate_response_t *spdm_response;
784+
spdm_set_certificate_request_t *m_libspdm_set_certificate_request;
785+
786+
libspdm_session_info_t *session_info;
787+
uint32_t session_id;
788+
uint8_t slot_id;
789+
#if defined(_WIN32) || (defined(__clang__) && (defined (LIBSPDM_CPU_AARCH64) || \
790+
defined(LIBSPDM_CPU_ARM)))
791+
FILE *fp_out;
792+
#else
793+
int64_t fp_out;
794+
struct stat file_stat;
795+
#endif
796+
size_t cert_file_size;
797+
798+
char file_name[] = "slot_id_0_cert_chain.der";
799+
slot_id = 1;
800+
801+
spdm_test_context = *state;
802+
spdm_context = spdm_test_context->spdm_context;
803+
spdm_test_context->case_id = 0xA;
804+
spdm_context->connection_info.version = SPDM_MESSAGE_VERSION_13 <<
805+
SPDM_VERSION_NUMBER_SHIFT_BIT;
806+
/*responset_state need to set normal*/
807+
spdm_context->response_state = LIBSPDM_RESPONSE_STATE_NORMAL;
808+
spdm_context->connection_info.connection_state =
809+
LIBSPDM_CONNECTION_STATE_AUTHENTICATED;
810+
spdm_context->local_context.capability.flags |=
811+
SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_SET_CERT_CAP;
812+
spdm_context->local_context.capability.flags |=
813+
SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG;
814+
spdm_context->connection_info.algorithm.base_hash_algo =
815+
m_libspdm_use_hash_algo;
816+
spdm_context->connection_info.algorithm.base_asym_algo =
817+
m_libspdm_use_asym_algo;
818+
819+
spdm_context->local_context.algorithm.base_hash_algo =
820+
m_libspdm_use_hash_algo;
821+
spdm_context->local_context.algorithm.base_asym_algo =
822+
m_libspdm_use_asym_algo;
823+
824+
session_id = 0xFFFFFFFF;
825+
spdm_context->latest_session_id = session_id;
826+
spdm_context->last_spdm_request_session_id_valid = true;
827+
spdm_context->last_spdm_request_session_id = session_id;
828+
session_info = &spdm_context->session_info[0];
829+
libspdm_session_info_init(spdm_context, session_info, session_id, true);
830+
libspdm_secured_message_set_session_state(
831+
session_info->secured_message_context,
832+
LIBSPDM_SESSION_STATE_ESTABLISHED);
833+
834+
m_libspdm_set_certificate_request = malloc(sizeof(spdm_set_certificate_request_t));
835+
836+
m_libspdm_set_certificate_request->header.spdm_version = SPDM_MESSAGE_VERSION_13;
837+
m_libspdm_set_certificate_request->header.request_response_code = SPDM_SET_CERTIFICATE;
838+
m_libspdm_set_certificate_request->header.param1 = slot_id |
839+
SPDM_SET_CERTIFICATE_REQUEST_ERASE_MASK;
840+
m_libspdm_set_certificate_request->header.param2 = 0;
841+
842+
size_t m_libspdm_set_certificate_request_size = sizeof(spdm_set_certificate_request_t);
843+
844+
response_size = sizeof(response);
845+
status = libspdm_get_response_set_certificate(spdm_context,
846+
m_libspdm_set_certificate_request_size,
847+
m_libspdm_set_certificate_request,
848+
&response_size, response);
849+
assert_int_equal(status, LIBSPDM_STATUS_SUCCESS);
850+
assert_int_equal(response_size, sizeof(spdm_set_certificate_response_t));
851+
spdm_response = (void *)response;
852+
assert_int_equal(spdm_response->header.request_response_code,
853+
SPDM_SET_CERTIFICATE_RSP);
854+
assert_int_equal(spdm_response->header.param1, slot_id);
855+
856+
/*change the file name, for example: slot_id_1_cert_chain.der*/
857+
file_name[8] = (char)(slot_id + '0');
858+
859+
#if defined(_WIN32) || (defined(__clang__) && (defined (LIBSPDM_CPU_AARCH64) || \
860+
defined(LIBSPDM_CPU_ARM)))
861+
if ((fp_out = fopen(file_name, "r")) == NULL) {
862+
printf("Unable to open file %s\n", file_name);
863+
assert_false(true);
864+
}
865+
866+
/*check the cert is erased*/
867+
fseek(fp_out, 0, SEEK_END);
868+
cert_file_size = ftell(fp_out);
869+
assert_int_equal(cert_file_size, 0);
870+
871+
fclose(fp_out);
872+
#else
873+
if ((fp_out = open(file_name, O_RDONLY)) == -1) {
874+
printf("Unable to open file %s\n", file_name);
875+
assert_false(true);
876+
}
877+
878+
if (fstat(fp_out, &file_stat) != 0) {
879+
assert_false(true);
880+
}
881+
882+
cert_file_size = file_stat.st_size;
883+
assert_int_equal(cert_file_size, 0);
884+
885+
close(fp_out);
886+
#endif
887+
888+
free(m_libspdm_set_certificate_request);
889+
}
890+
763891
libspdm_test_context_t m_libspdm_responder_set_certificate_rsp_test_context = {
764892
LIBSPDM_TEST_CONTEXT_VERSION,
765893
false,
@@ -786,6 +914,8 @@ int libspdm_responder_set_certificate_rsp_test_main(void)
786914
cmocka_unit_test(libspdm_test_responder_set_cetificate_rsp_case8),
787915
/* Error Case for set_certificate to slot_id:1 without session and without trusted environment */
788916
cmocka_unit_test(libspdm_test_responder_set_cetificate_rsp_case9),
917+
/* Success Case for erase certificate to slot_id:1 with session*/
918+
cmocka_unit_test(libspdm_test_responder_set_cetificate_rsp_case10),
789919
};
790920

791921
libspdm_setup_test_context(&m_libspdm_responder_set_certificate_rsp_test_context);

0 commit comments

Comments
 (0)