7
7
#include "spdm_unit_test.h"
8
8
#include "internal/libspdm_responder_lib.h"
9
9
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
+
10
18
#if LIBSPDM_ENABLE_CAPABILITY_SET_CERT_CAP
11
19
12
20
extern bool g_in_trusted_environment;
@@ -760,6 +768,126 @@ void libspdm_test_responder_set_cetificate_rsp_case9(void **state)
760
768
free(cert_chain);
761
769
free(m_libspdm_set_certificate_request);
762
770
}
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
+
763
891
libspdm_test_context_t m_libspdm_responder_set_certificate_rsp_test_context = {
764
892
LIBSPDM_TEST_CONTEXT_VERSION,
765
893
false,
@@ -786,6 +914,8 @@ int libspdm_responder_set_certificate_rsp_test_main(void)
786
914
cmocka_unit_test(libspdm_test_responder_set_cetificate_rsp_case8),
787
915
/* Error Case for set_certificate to slot_id:1 without session and without trusted environment */
788
916
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),
789
919
};
790
920
791
921
libspdm_setup_test_context(&m_libspdm_responder_set_certificate_rsp_test_context);
0 commit comments