@@ -16,6 +16,14 @@ typedef struct {
1616 uint8_t verify_data [LIBSPDM_MAX_HASH_SIZE ];
1717} libspdm_finish_request_mine_t ;
1818
19+ typedef struct {
20+ spdm_message_header_t header ;
21+ uint16_t opaque_data_size ;
22+ uint8_t opaque_data [8 ];
23+ uint8_t signature [LIBSPDM_MAX_ASYM_KEY_SIZE ];
24+ uint8_t verify_data [LIBSPDM_MAX_HASH_SIZE ];
25+ } libspdm_finish_request_mine_14_t ;
26+
1927#pragma pack()
2028
2129libspdm_finish_request_mine_t m_libspdm_finish_request1 = {
@@ -48,6 +56,11 @@ libspdm_finish_request_mine_t m_libspdm_finish_request7 = {
4856};
4957size_t m_libspdm_finish_request7_size = sizeof (m_libspdm_finish_request7 );
5058
59+ libspdm_finish_request_mine_14_t m_libspdm_finish_request8 = {
60+ { SPDM_MESSAGE_VERSION_14 , SPDM_FINISH , 0 , 0 },
61+ };
62+ size_t m_libspdm_finish_request8_size = sizeof (m_libspdm_finish_request8 );
63+
5164uint8_t m_dummy_buffer [LIBSPDM_MAX_HASH_SIZE ];
5265
5366#if LIBSPDM_ENABLE_CAPABILITY_KEY_EX_CAP
@@ -3834,6 +3847,132 @@ void libspdm_test_responder_finish_case29(void **state)
38343847 free (data1 );
38353848}
38363849
3850+ /**
3851+ * Test 30: SPDM version 1.4, with OpaqueData.
3852+ * Expected behavior: the responder accepts the request and produces a valid
3853+ * FINISH_RSP response message.
3854+ **/
3855+ void libspdm_test_responder_finish_case30 (void * * state )
3856+ {
3857+ libspdm_return_t status ;
3858+ libspdm_test_context_t * spdm_test_context ;
3859+ libspdm_context_t * spdm_context ;
3860+ size_t response_size ;
3861+ uint8_t response [LIBSPDM_MAX_SPDM_MSG_SIZE ];
3862+ spdm_finish_response_t * spdm_response ;
3863+ void * data1 ;
3864+ size_t data_size1 ;
3865+ uint8_t * ptr ;
3866+ uint8_t * cert_buffer ;
3867+ size_t cert_buffer_size ;
3868+ uint8_t cert_buffer_hash [LIBSPDM_MAX_HASH_SIZE ];
3869+ uint8_t hash_data [LIBSPDM_MAX_HASH_SIZE ];
3870+ uint8_t request_finished_key [LIBSPDM_MAX_HASH_SIZE ];
3871+ libspdm_session_info_t * session_info ;
3872+ uint32_t session_id ;
3873+ uint32_t hash_size ;
3874+ uint32_t hmac_size ;
3875+
3876+ spdm_test_context = * state ;
3877+ spdm_context = spdm_test_context -> spdm_context ;
3878+ spdm_test_context -> case_id = 30 ;
3879+ spdm_context -> connection_info .version = SPDM_MESSAGE_VERSION_14 <<
3880+ SPDM_VERSION_NUMBER_SHIFT_BIT ;
3881+ spdm_context -> connection_info .connection_state =
3882+ LIBSPDM_CONNECTION_STATE_NEGOTIATED ;
3883+ spdm_context -> connection_info .capability .flags |=
3884+ SPDM_GET_CAPABILITIES_REQUEST_FLAGS_KEY_EX_CAP ;
3885+ spdm_context -> local_context .capability .flags |=
3886+ SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_KEY_EX_CAP ;
3887+
3888+ spdm_context -> connection_info .algorithm .base_hash_algo =
3889+ m_libspdm_use_hash_algo ;
3890+ spdm_context -> connection_info .algorithm .base_asym_algo =
3891+ m_libspdm_use_asym_algo ;
3892+ spdm_context -> connection_info .algorithm .measurement_spec =
3893+ m_libspdm_use_measurement_spec ;
3894+ spdm_context -> connection_info .algorithm .measurement_hash_algo =
3895+ m_libspdm_use_measurement_hash_algo ;
3896+ spdm_context -> connection_info .algorithm .dhe_named_group =
3897+ m_libspdm_use_dhe_algo ;
3898+ spdm_context -> connection_info .algorithm .aead_cipher_suite =
3899+ m_libspdm_use_aead_algo ;
3900+ libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo ,
3901+ m_libspdm_use_asym_algo , & data1 ,
3902+ & data_size1 , NULL , NULL );
3903+ spdm_context -> local_context .local_cert_chain_provision [0 ] = data1 ;
3904+ spdm_context -> local_context .local_cert_chain_provision_size [0 ] =
3905+ data_size1 ;
3906+ spdm_context -> connection_info .local_used_cert_chain_buffer = data1 ;
3907+ spdm_context -> connection_info .local_used_cert_chain_buffer_size =
3908+ data_size1 ;
3909+
3910+ libspdm_reset_message_a (spdm_context );
3911+ spdm_context -> local_context .mut_auth_requested = 0 ;
3912+
3913+ /* The requester and responder have not set HANDSHAKE_IN_THE_CLEAR*/
3914+ spdm_context -> connection_info .capability .flags &=
3915+ ~SPDM_GET_CAPABILITIES_REQUEST_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP ;
3916+ spdm_context -> local_context .capability .flags &=
3917+ ~SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_HANDSHAKE_IN_THE_CLEAR_CAP ;
3918+
3919+ session_id = 0xFFFFFFFF ;
3920+ spdm_context -> latest_session_id = session_id ;
3921+ spdm_context -> last_spdm_request_session_id_valid = true;
3922+ spdm_context -> last_spdm_request_session_id = session_id ;
3923+ session_info = & spdm_context -> session_info [0 ];
3924+ libspdm_session_info_init (spdm_context , session_info , session_id , false);
3925+
3926+ hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo );
3927+ hmac_size = libspdm_get_hash_size (m_libspdm_use_hash_algo );
3928+
3929+ libspdm_set_mem (m_dummy_buffer , hash_size , (uint8_t )(0xFF ));
3930+ libspdm_secured_message_set_request_finished_key (
3931+ session_info -> secured_message_context , m_dummy_buffer ,
3932+ hash_size );
3933+ libspdm_secured_message_set_session_state (
3934+ session_info -> secured_message_context ,
3935+ LIBSPDM_SESSION_STATE_HANDSHAKING );
3936+
3937+ m_libspdm_finish_request8 .opaque_data_size = sizeof (m_libspdm_finish_request8 .opaque_data );
3938+
3939+ hash_size = libspdm_get_hash_size (m_libspdm_use_hash_algo );
3940+ ptr = m_libspdm_finish_request8 .signature ;
3941+ libspdm_init_managed_buffer (& th_curr , sizeof (th_curr .buffer ));
3942+ cert_buffer = (uint8_t * )data1 ;
3943+ cert_buffer_size = data_size1 ;
3944+ libspdm_hash_all (m_libspdm_use_hash_algo , cert_buffer , cert_buffer_size ,
3945+ cert_buffer_hash );
3946+ /* transcript.message_a size is 0*/
3947+ libspdm_append_managed_buffer (& th_curr , cert_buffer_hash , hash_size );
3948+ /* session_transcript.message_k is 0*/
3949+ libspdm_append_managed_buffer (& th_curr , (uint8_t * )& m_libspdm_finish_request8 ,
3950+ sizeof (spdm_finish_request_t ) + sizeof (uint16_t ) +
3951+ m_libspdm_finish_request8 .opaque_data_size );
3952+ libspdm_set_mem (request_finished_key , LIBSPDM_MAX_HASH_SIZE , (uint8_t )(0xFF ));
3953+ libspdm_hash_all (m_libspdm_use_hash_algo , libspdm_get_managed_buffer (& th_curr ),
3954+ libspdm_get_managed_buffer_size (& th_curr ), hash_data );
3955+ libspdm_hmac_all (m_libspdm_use_hash_algo , hash_data , hash_size ,
3956+ request_finished_key , hash_size , ptr );
3957+ m_libspdm_finish_request8_size = sizeof (spdm_finish_request_t ) + hmac_size +
3958+ sizeof (uint16_t ) + m_libspdm_finish_request8 .opaque_data_size ;
3959+ response_size = sizeof (response );
3960+ status = libspdm_get_response_finish (spdm_context ,
3961+ m_libspdm_finish_request8_size ,
3962+ & m_libspdm_finish_request8 ,
3963+ & response_size , response );
3964+ assert_int_equal (status , LIBSPDM_STATUS_SUCCESS );
3965+ /* The ResponderVerifyData field shall be absent.*/
3966+ ptr = (uint8_t * )response + sizeof (spdm_finish_response_t );
3967+ assert_int_equal (response_size ,
3968+ sizeof (spdm_finish_response_t ) + sizeof (uint16_t ) +
3969+ libspdm_read_uint16 (ptr ));
3970+ spdm_response = (void * )response ;
3971+ assert_int_equal (spdm_response -> header .request_response_code ,
3972+ SPDM_FINISH_RSP );
3973+ free (data1 );
3974+ }
3975+
38373976int libspdm_responder_finish_test_main (void )
38383977{
38393978 const struct CMUnitTest spdm_responder_finish_tests [] = {
@@ -3893,6 +4032,8 @@ int libspdm_responder_finish_test_main(void)
38934032 cmocka_unit_test_setup (libspdm_test_responder_finish_case28 , libspdm_unit_test_group_setup ),
38944033 /* The requester and responder have not set HANDSHAKE_IN_THE_CLEAR*/
38954034 cmocka_unit_test (libspdm_test_responder_finish_case29 ),
4035+ /* SPDM 1.4 with OpaqueData */
4036+ cmocka_unit_test (libspdm_test_responder_finish_case30 ),
38964037 };
38974038
38984039 libspdm_test_context_t test_context = {
0 commit comments