@@ -20,6 +20,8 @@ static uint8_t m_libspdm_msg_log_buffer[LIBSPDM_MAX_MESSAGE_L1L2_BUFFER_SIZE * 2
20
20
static size_t m_libspdm_opaque_data_size ;
21
21
static uint8_t m_libspdm_opaque_data [SPDM_MAX_OPAQUE_DATA_SIZE ];
22
22
23
+ static uint8_t m_requester_context [SPDM_REQ_CONTEXT_SIZE ];
24
+
23
25
static size_t libspdm_test_get_measurement_request_size (const void * spdm_context ,
24
26
const void * buffer ,
25
27
size_t buffer_size )
@@ -450,6 +452,16 @@ static libspdm_return_t libspdm_requester_get_measurements_test_send_message(
450
452
(const uint8_t * )request + header_size , message_size );
451
453
m_libspdm_local_buffer_size += message_size ;
452
454
return LIBSPDM_STATUS_SUCCESS ;
455
+ case 0x28 :
456
+ case 0x29 :
457
+ m_libspdm_local_buffer_size = 0 ;
458
+ message_size = libspdm_test_get_measurement_request_size (
459
+ spdm_context , (const uint8_t * )request + header_size ,
460
+ request_size - header_size );
461
+ libspdm_copy_mem (m_libspdm_local_buffer , sizeof (m_libspdm_local_buffer ),
462
+ (const uint8_t * )request + header_size , message_size );
463
+ m_libspdm_local_buffer_size += message_size ;
464
+ return LIBSPDM_STATUS_SUCCESS ;
453
465
default :
454
466
return LIBSPDM_STATUS_SEND_FAIL ;
455
467
}
@@ -3115,6 +3127,143 @@ static libspdm_return_t libspdm_requester_get_measurements_test_receive_message(
3115
3127
ptr , & sig_size );
3116
3128
ptr += sig_size ;
3117
3129
3130
+ libspdm_transport_test_encode_message (spdm_context , NULL , false,
3131
+ false, spdm_response_size ,
3132
+ spdm_response , response_size ,
3133
+ response );
3134
+ }
3135
+ return LIBSPDM_STATUS_SUCCESS ;
3136
+ case 0x28 : {
3137
+ spdm_measurements_response_t * spdm_response ;
3138
+ spdm_measurement_block_dmtf_t * measurment_block ;
3139
+ size_t spdm_response_size ;
3140
+ size_t transport_header_size ;
3141
+ uint8_t * ptr ;
3142
+ ((libspdm_context_t * )spdm_context )
3143
+ -> connection_info .algorithm .measurement_hash_algo =
3144
+ m_libspdm_use_measurement_hash_algo ;
3145
+ spdm_response_size = sizeof (spdm_measurements_response_t ) +
3146
+ sizeof (spdm_measurement_block_dmtf_t ) +
3147
+ libspdm_get_measurement_hash_size (m_libspdm_use_measurement_hash_algo )
3148
+ + SPDM_NONCE_SIZE + sizeof (uint16_t ) + SPDM_REQ_CONTEXT_SIZE ;
3149
+
3150
+ transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE ;
3151
+ spdm_response = (void * )((uint8_t * )* response + transport_header_size );
3152
+
3153
+ spdm_response -> header .spdm_version = SPDM_MESSAGE_VERSION_13 ;
3154
+ spdm_response -> header .request_response_code = SPDM_MEASUREMENTS ;
3155
+ spdm_response -> header .param1 = 0 ;
3156
+ spdm_response -> header .param2 = 0 ;
3157
+ spdm_response -> number_of_blocks = 1 ;
3158
+ libspdm_write_uint24 (
3159
+ spdm_response -> measurement_record_length ,
3160
+ (uint32_t )(sizeof (spdm_measurement_block_dmtf_t ) +
3161
+ libspdm_get_measurement_hash_size ( m_libspdm_use_measurement_hash_algo )));
3162
+
3163
+ measurment_block = (void * )(spdm_response + 1 );
3164
+ libspdm_set_mem (measurment_block ,
3165
+ sizeof (spdm_measurement_block_dmtf_t ) +
3166
+ libspdm_get_measurement_hash_size (
3167
+ m_libspdm_use_measurement_hash_algo ),
3168
+ 1 );
3169
+
3170
+ measurment_block -> measurement_block_common_header
3171
+ .measurement_specification =
3172
+ SPDM_MEASUREMENT_SPECIFICATION_DMTF ;
3173
+ measurment_block -> measurement_block_common_header
3174
+ .measurement_size =
3175
+ (uint16_t )(sizeof (spdm_measurement_block_dmtf_header_t ) +
3176
+ libspdm_get_measurement_hash_size (
3177
+ m_libspdm_use_measurement_hash_algo ));
3178
+
3179
+ ptr = (uint8_t * )spdm_response +
3180
+ sizeof (spdm_measurements_response_t ) +
3181
+ sizeof (spdm_measurement_block_dmtf_t ) +
3182
+ libspdm_get_measurement_hash_size (
3183
+ m_libspdm_use_measurement_hash_algo );
3184
+ libspdm_get_random_number (SPDM_NONCE_SIZE ,ptr );
3185
+
3186
+ ptr += SPDM_NONCE_SIZE ;
3187
+ * (uint16_t * )ptr = 0 ;
3188
+
3189
+ ptr += sizeof (uint16_t );
3190
+ libspdm_copy_mem (ptr , SPDM_REQ_CONTEXT_SIZE , m_requester_context , SPDM_REQ_CONTEXT_SIZE );
3191
+
3192
+ libspdm_copy_mem (m_libspdm_local_buffer + m_libspdm_local_buffer_size ,
3193
+ sizeof (m_libspdm_local_buffer ) - m_libspdm_local_buffer_size ,
3194
+ spdm_response , spdm_response_size );
3195
+
3196
+ m_libspdm_local_buffer_size += spdm_response_size ;
3197
+
3198
+ libspdm_transport_test_encode_message (spdm_context , NULL , false,
3199
+ false, spdm_response_size ,
3200
+ spdm_response , response_size ,
3201
+ response );
3202
+ }
3203
+ return LIBSPDM_STATUS_SUCCESS ;
3204
+ case 0x29 : {
3205
+ spdm_measurements_response_t * spdm_response ;
3206
+ spdm_measurement_block_dmtf_t * measurment_block ;
3207
+ size_t spdm_response_size ;
3208
+ size_t transport_header_size ;
3209
+ uint8_t * ptr ;
3210
+ ((libspdm_context_t * )spdm_context )
3211
+ -> connection_info .algorithm .measurement_hash_algo =
3212
+ m_libspdm_use_measurement_hash_algo ;
3213
+ spdm_response_size = sizeof (spdm_measurements_response_t ) +
3214
+ sizeof (spdm_measurement_block_dmtf_t ) +
3215
+ libspdm_get_measurement_hash_size (m_libspdm_use_measurement_hash_algo )
3216
+ +
3217
+ SPDM_NONCE_SIZE + sizeof (uint16_t ) + SPDM_REQ_CONTEXT_SIZE ;
3218
+
3219
+ transport_header_size = LIBSPDM_TEST_TRANSPORT_HEADER_SIZE ;
3220
+ spdm_response = (void * )((uint8_t * )* response + transport_header_size );
3221
+
3222
+ spdm_response -> header .spdm_version = SPDM_MESSAGE_VERSION_13 ;
3223
+ spdm_response -> header .request_response_code = SPDM_MEASUREMENTS ;
3224
+ spdm_response -> header .param1 = 0 ;
3225
+ spdm_response -> header .param2 = 0 ;
3226
+ spdm_response -> number_of_blocks = 1 ;
3227
+ libspdm_write_uint24 (
3228
+ spdm_response -> measurement_record_length ,
3229
+ (uint32_t )(sizeof (spdm_measurement_block_dmtf_t ) +
3230
+ libspdm_get_measurement_hash_size ( m_libspdm_use_measurement_hash_algo )));
3231
+
3232
+ measurment_block = (void * )(spdm_response + 1 );
3233
+ libspdm_set_mem (measurment_block ,
3234
+ sizeof (spdm_measurement_block_dmtf_t ) +
3235
+ libspdm_get_measurement_hash_size (
3236
+ m_libspdm_use_measurement_hash_algo ),
3237
+ 1 );
3238
+
3239
+ measurment_block -> measurement_block_common_header
3240
+ .measurement_specification =
3241
+ SPDM_MEASUREMENT_SPECIFICATION_DMTF ;
3242
+ measurment_block -> measurement_block_common_header
3243
+ .measurement_size =
3244
+ (uint16_t )(sizeof (spdm_measurement_block_dmtf_header_t ) +
3245
+ libspdm_get_measurement_hash_size (
3246
+ m_libspdm_use_measurement_hash_algo ));
3247
+
3248
+ ptr = (uint8_t * )spdm_response +
3249
+ sizeof (spdm_measurements_response_t ) +
3250
+ sizeof (spdm_measurement_block_dmtf_t ) +
3251
+ libspdm_get_measurement_hash_size (
3252
+ m_libspdm_use_measurement_hash_algo );
3253
+ libspdm_get_random_number (SPDM_NONCE_SIZE ,ptr );
3254
+
3255
+ ptr += SPDM_NONCE_SIZE ;
3256
+ * (uint16_t * )ptr = 0 ;
3257
+
3258
+ ptr += sizeof (uint16_t );
3259
+ libspdm_get_random_number (SPDM_REQ_CONTEXT_SIZE ,ptr );
3260
+
3261
+ libspdm_copy_mem (m_libspdm_local_buffer + m_libspdm_local_buffer_size ,
3262
+ sizeof (m_libspdm_local_buffer ) - m_libspdm_local_buffer_size ,
3263
+ spdm_response , spdm_response_size );
3264
+
3265
+ m_libspdm_local_buffer_size += spdm_response_size ;
3266
+
3118
3267
libspdm_transport_test_encode_message (spdm_context , NULL , false,
3119
3268
false, spdm_response_size ,
3120
3269
spdm_response , response_size ,
@@ -6033,6 +6182,170 @@ static void libspdm_test_requester_get_measurements_case39(void **state)
6033
6182
free (data );
6034
6183
}
6035
6184
6185
+ /**
6186
+ * Test 40: Successful case , correct measuerments context field , without signature
6187
+ * Expected Behavior: client returns a status of RETURN_SUCCESS.
6188
+ **/
6189
+ static void libspdm_test_requester_get_measurements_case40 (void * * state )
6190
+ {
6191
+ libspdm_return_t status ;
6192
+ libspdm_test_context_t * spdm_test_context ;
6193
+ libspdm_context_t * spdm_context ;
6194
+ uint8_t number_of_block ;
6195
+ uint32_t measurement_record_length ;
6196
+ uint8_t measurement_record [LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE ];
6197
+ uint8_t request_attribute ;
6198
+ void * data ;
6199
+ size_t data_size ;
6200
+ void * hash ;
6201
+ size_t hash_size ;
6202
+
6203
+ spdm_test_context = * state ;
6204
+ spdm_context = spdm_test_context -> spdm_context ;
6205
+ spdm_test_context -> case_id = 0x28 ;
6206
+ spdm_context -> connection_info .version = SPDM_MESSAGE_VERSION_13 <<
6207
+ SPDM_VERSION_NUMBER_SHIFT_BIT ;
6208
+ spdm_context -> connection_info .connection_state =
6209
+ LIBSPDM_CONNECTION_STATE_AUTHENTICATED ;
6210
+ spdm_context -> connection_info .capability .flags |=
6211
+ SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG ;
6212
+ libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo ,
6213
+ m_libspdm_use_asym_algo , & data ,
6214
+ & data_size , & hash , & hash_size );
6215
+ libspdm_reset_message_m (spdm_context , NULL );
6216
+ spdm_context -> connection_info .algorithm .measurement_spec =
6217
+ m_libspdm_use_measurement_spec ;
6218
+ spdm_context -> connection_info .algorithm .measurement_hash_algo =
6219
+ m_libspdm_use_measurement_hash_algo ;
6220
+ spdm_context -> connection_info .algorithm .base_hash_algo =
6221
+ m_libspdm_use_hash_algo ;
6222
+ spdm_context -> connection_info .algorithm .base_asym_algo =
6223
+ m_libspdm_use_asym_algo ;
6224
+ spdm_context -> local_context .algorithm .measurement_spec =
6225
+ SPDM_MEASUREMENT_SPECIFICATION_DMTF ;
6226
+
6227
+ #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
6228
+ spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer_size = data_size ;
6229
+ libspdm_copy_mem (spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer ,
6230
+ sizeof (spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer ),
6231
+ data , data_size );
6232
+ #else
6233
+ libspdm_hash_all (
6234
+ spdm_context -> connection_info .algorithm .base_hash_algo ,
6235
+ data , data_size ,
6236
+ spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer_hash );
6237
+ spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer_hash_size =
6238
+ libspdm_get_hash_size (spdm_context -> connection_info .algorithm .base_hash_algo );
6239
+ libspdm_get_leaf_cert_public_key_from_cert_chain (
6240
+ spdm_context -> connection_info .algorithm .base_hash_algo ,
6241
+ spdm_context -> connection_info .algorithm .base_asym_algo ,
6242
+ data , data_size ,
6243
+ & spdm_context -> connection_info .peer_used_cert_chain [0 ].leaf_cert_public_key );
6244
+ #endif
6245
+
6246
+ measurement_record_length = sizeof (measurement_record );
6247
+
6248
+ libspdm_set_mem (m_requester_context , SPDM_REQ_CONTEXT_SIZE , 0xAA );
6249
+
6250
+ request_attribute = 0 ; /* Do not request a signature. */
6251
+
6252
+ status = libspdm_get_measurement_ex2 (spdm_context , NULL , request_attribute , 1 ,
6253
+ 0 , m_requester_context , NULL , & number_of_block ,
6254
+ & measurement_record_length ,
6255
+ measurement_record , NULL , NULL , NULL , NULL , NULL );
6256
+
6257
+ assert_int_equal (status , LIBSPDM_STATUS_SUCCESS );
6258
+
6259
+ #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
6260
+ assert_int_equal (spdm_context -> transcript .message_m .buffer_size ,
6261
+ sizeof (spdm_message_header_t ) + SPDM_REQ_CONTEXT_SIZE +
6262
+ sizeof (spdm_measurements_response_t ) +
6263
+ sizeof (spdm_measurement_block_dmtf_t ) +
6264
+ libspdm_get_measurement_hash_size (m_libspdm_use_measurement_hash_algo ) +
6265
+ SPDM_NONCE_SIZE + sizeof (uint16_t ) + SPDM_REQ_CONTEXT_SIZE );
6266
+ #endif
6267
+ free (data );
6268
+ }
6269
+
6270
+ /**
6271
+ * Test 41: Error case , Measurement context fields are inconsistent , without signature
6272
+ * Expected Behavior: get a LIBSPDM_STATUS_INVALID_MSG_FIELD return code
6273
+ **/
6274
+ static void libspdm_test_requester_get_measurements_case41 (void * * state )
6275
+ {
6276
+ libspdm_return_t status ;
6277
+ libspdm_test_context_t * spdm_test_context ;
6278
+ libspdm_context_t * spdm_context ;
6279
+ uint8_t number_of_block ;
6280
+ uint32_t measurement_record_length ;
6281
+ uint8_t measurement_record [LIBSPDM_MAX_MEASUREMENT_RECORD_SIZE ];
6282
+ uint8_t request_attribute ;
6283
+ void * data ;
6284
+ size_t data_size ;
6285
+ void * hash ;
6286
+ size_t hash_size ;
6287
+
6288
+ spdm_test_context = * state ;
6289
+ spdm_context = spdm_test_context -> spdm_context ;
6290
+ spdm_test_context -> case_id = 0x29 ;
6291
+ spdm_context -> connection_info .version = SPDM_MESSAGE_VERSION_13 <<
6292
+ SPDM_VERSION_NUMBER_SHIFT_BIT ;
6293
+ spdm_context -> connection_info .connection_state =
6294
+ LIBSPDM_CONNECTION_STATE_AUTHENTICATED ;
6295
+ spdm_context -> connection_info .capability .flags |=
6296
+ SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG ;
6297
+ libspdm_read_responder_public_certificate_chain (m_libspdm_use_hash_algo ,
6298
+ m_libspdm_use_asym_algo , & data ,
6299
+ & data_size , & hash , & hash_size );
6300
+ libspdm_reset_message_m (spdm_context , NULL );
6301
+ spdm_context -> connection_info .algorithm .measurement_spec =
6302
+ m_libspdm_use_measurement_spec ;
6303
+ spdm_context -> connection_info .algorithm .measurement_hash_algo =
6304
+ m_libspdm_use_measurement_hash_algo ;
6305
+ spdm_context -> connection_info .algorithm .base_hash_algo =
6306
+ m_libspdm_use_hash_algo ;
6307
+ spdm_context -> connection_info .algorithm .base_asym_algo =
6308
+ m_libspdm_use_asym_algo ;
6309
+ spdm_context -> local_context .algorithm .measurement_spec =
6310
+ SPDM_MEASUREMENT_SPECIFICATION_DMTF ;
6311
+
6312
+ #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
6313
+ spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer_size = data_size ;
6314
+ libspdm_copy_mem (spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer ,
6315
+ sizeof (spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer ),
6316
+ data , data_size );
6317
+ #else
6318
+ libspdm_hash_all (
6319
+ spdm_context -> connection_info .algorithm .base_hash_algo ,
6320
+ data , data_size ,
6321
+ spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer_hash );
6322
+ spdm_context -> connection_info .peer_used_cert_chain [0 ].buffer_hash_size =
6323
+ libspdm_get_hash_size (spdm_context -> connection_info .algorithm .base_hash_algo );
6324
+ libspdm_get_leaf_cert_public_key_from_cert_chain (
6325
+ spdm_context -> connection_info .algorithm .base_hash_algo ,
6326
+ spdm_context -> connection_info .algorithm .base_asym_algo ,
6327
+ data , data_size ,
6328
+ & spdm_context -> connection_info .peer_used_cert_chain [0 ].leaf_cert_public_key );
6329
+ #endif
6330
+
6331
+ measurement_record_length = sizeof (measurement_record );
6332
+
6333
+ libspdm_set_mem (m_requester_context , SPDM_REQ_CONTEXT_SIZE , 0xAA );
6334
+
6335
+ request_attribute = 0 ; /* Do not request a signature. */
6336
+
6337
+ status = libspdm_get_measurement_ex2 (spdm_context , NULL , request_attribute , 1 ,
6338
+ 0 , m_requester_context , NULL , & number_of_block ,
6339
+ & measurement_record_length ,
6340
+ measurement_record , NULL , NULL , NULL , NULL , NULL );
6341
+
6342
+ assert_int_equal (status , LIBSPDM_STATUS_INVALID_MSG_FIELD );
6343
+
6344
+ #if LIBSPDM_RECORD_TRANSCRIPT_DATA_SUPPORT
6345
+ assert_int_equal (spdm_context -> transcript .message_m .buffer_size , 0 );
6346
+ #endif
6347
+ free (data );
6348
+ }
6036
6349
libspdm_test_context_t m_libspdm_requester_get_measurements_test_context = {
6037
6350
LIBSPDM_TEST_CONTEXT_VERSION ,
6038
6351
true,
@@ -6082,6 +6395,8 @@ int libspdm_requester_get_measurements_test_main(void)
6082
6395
cmocka_unit_test (libspdm_test_requester_get_measurements_case37 ),
6083
6396
cmocka_unit_test (libspdm_test_requester_get_measurements_case38 ),
6084
6397
cmocka_unit_test (libspdm_test_requester_get_measurements_case39 ),
6398
+ cmocka_unit_test (libspdm_test_requester_get_measurements_case40 ),
6399
+ cmocka_unit_test (libspdm_test_requester_get_measurements_case41 ),
6085
6400
};
6086
6401
6087
6402
libspdm_setup_test_context (& m_libspdm_requester_get_measurements_test_context );
0 commit comments