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
1220extern 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_ATTRIBUTES_ERASE ;
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+
763891libspdm_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