diff --git a/fuzz-target/random_requester/src/main.rs b/fuzz-target/random_requester/src/main.rs index ea8c11a..a091f20 100644 --- a/fuzz-target/random_requester/src/main.rs +++ b/fuzz-target/random_requester/src/main.rs @@ -108,6 +108,7 @@ async fn run_spdm(spdm: Vec) { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, SpdmMeasurementOperation::SpdmMeasurementRequestAll, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, diff --git a/fuzz-target/requester/measurement_req/src/main.rs b/fuzz-target/requester/measurement_req/src/main.rs index 3676bfc..9b80aca 100644 --- a/fuzz-target/requester/measurement_req/src/main.rs +++ b/fuzz-target/requester/measurement_req/src/main.rs @@ -76,6 +76,7 @@ async fn fuzz_send_receive_spdm_measurement(fuzzdata: Arc>) { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, SpdmMeasurementOperation::SpdmMeasurementRequestAll, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -134,6 +135,7 @@ async fn fuzz_send_receive_spdm_measurement(fuzzdata: Arc>) { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, SpdmMeasurementOperation::SpdmMeasurementQueryTotalNumber, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -193,6 +195,7 @@ async fn fuzz_send_receive_spdm_measurement(fuzzdata: Arc>) { 0, SpdmMeasurementAttributes::RAW_BIT_STREAM_REQUESTED, SpdmMeasurementOperation::SpdmMeasurementQueryTotalNumber, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -252,6 +255,7 @@ async fn fuzz_send_receive_spdm_measurement(fuzzdata: Arc>) { 0, SpdmMeasurementAttributes::empty(), SpdmMeasurementOperation::Unknown(4), + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -339,6 +343,7 @@ async fn fuzz_send_receive_spdm_measurement(fuzzdata: Arc>) { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, SpdmMeasurementOperation::SpdmMeasurementRequestAll, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, diff --git a/spdmlib/src/requester/get_measurements_req.rs b/spdmlib/src/requester/get_measurements_req.rs index 44c03c1..b12d902 100644 --- a/spdmlib/src/requester/get_measurements_req.rs +++ b/spdmlib/src/requester/get_measurements_req.rs @@ -22,6 +22,7 @@ impl RequesterContext { session_id: Option, measurement_attributes: SpdmMeasurementAttributes, measurement_operation: SpdmMeasurementOperation, + spdm_nonce_struct: Option, content_changed: &mut Option, spdm_measurement_record_structure: &mut SpdmMeasurementRecordStructure, transcript_meas: &mut Option, @@ -36,6 +37,7 @@ impl RequesterContext { session_id, measurement_attributes, measurement_operation, + spdm_nonce_struct, content_changed, spdm_measurement_record_structure, transcript_meas, @@ -60,6 +62,7 @@ impl RequesterContext { session_id: Option, measurement_attributes: SpdmMeasurementAttributes, measurement_operation: SpdmMeasurementOperation, + spdm_nonce_struct: Option, content_changed: &mut Option, spdm_measurement_record_structure: &mut SpdmMeasurementRecordStructure, transcript_meas: &mut Option, @@ -80,6 +83,7 @@ impl RequesterContext { let send_used = self.encode_spdm_measurement_record( measurement_attributes, measurement_operation, + spdm_nonce_struct, slot_id, &mut send_buffer, )?; @@ -109,12 +113,18 @@ impl RequesterContext { &mut self, measurement_attributes: SpdmMeasurementAttributes, measurement_operation: SpdmMeasurementOperation, + spdm_nonce_struct: Option, slot_id: u8, buf: &mut [u8], ) -> SpdmResult { let mut writer = Writer::init(buf); let mut nonce = [0u8; SPDM_NONCE_SIZE]; - crypto::rand::get_random(&mut nonce)?; + + if let Some(n) = spdm_nonce_struct { + nonce.copy_from_slice(&n.data) + } else { + crypto::rand::get_random(&mut nonce)?; + } let request = SpdmMessage { header: SpdmMessageHeader { @@ -278,6 +288,7 @@ impl RequesterContext { slot_id: u8, spdm_measuremente_attributes: SpdmMeasurementAttributes, measurement_operation: SpdmMeasurementOperation, + spdm_nonce_struct: Option, content_changed: &mut Option, // out, None if spdm version < 0x12 out_total_number: &mut u8, // out, total number when measurement_operation = SpdmMeasurementQueryTotalNumber // number of blocks got measured. @@ -289,6 +300,7 @@ impl RequesterContext { session_id, spdm_measuremente_attributes, measurement_operation, + spdm_nonce_struct, content_changed, spdm_measurement_record_structure, transcript_meas, diff --git a/test/spdm-requester-emu/src/main.rs b/test/spdm-requester-emu/src/main.rs index e1b80d0..853406f 100644 --- a/test/spdm-requester-emu/src/main.rs +++ b/test/spdm-requester-emu/src/main.rs @@ -268,6 +268,7 @@ async fn test_spdm( 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, SpdmMeasurementOperation::SpdmMeasurementRequestAll, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -519,6 +520,7 @@ async fn test_spdm( 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, SpdmMeasurementOperation::SpdmMeasurementQueryTotalNumber, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -754,6 +756,7 @@ async fn test_idekm_tdisp( 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, SpdmMeasurementOperation::SpdmMeasurementRequestAll, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, diff --git a/test/spdmlib-test/src/requester_tests/get_digests_req.rs b/test/spdmlib-test/src/requester_tests/get_digests_req.rs index 3e8534d..267253e 100644 --- a/test/spdmlib-test/src/requester_tests/get_digests_req.rs +++ b/test/spdmlib-test/src/requester_tests/get_digests_req.rs @@ -296,6 +296,7 @@ fn issue_other_request_before_vca_negotiated() { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, measurement_operation, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, diff --git a/test/spdmlib-test/src/requester_tests/get_measurements_req.rs b/test/spdmlib-test/src/requester_tests/get_measurements_req.rs index 9be24e9..d4cc6fe 100644 --- a/test/spdmlib-test/src/requester_tests/get_measurements_req.rs +++ b/test/spdmlib-test/src/requester_tests/get_measurements_req.rs @@ -130,6 +130,7 @@ fn test_case0_send_receive_spdm_measurement() { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, measurement_operation, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -149,6 +150,7 @@ fn test_case0_send_receive_spdm_measurement() { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, measurement_operation, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -168,6 +170,7 @@ fn test_case0_send_receive_spdm_measurement() { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, measurement_operation, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -187,6 +190,7 @@ fn test_case0_send_receive_spdm_measurement() { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, measurement_operation, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -518,6 +522,7 @@ fn test_case1_send_receive_spdm_measurement() { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, measurement_operation, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -537,6 +542,7 @@ fn test_case1_send_receive_spdm_measurement() { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, measurement_operation, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -717,6 +723,7 @@ fn test_case3_send_receive_spdm_measurement() { 0, SpdmMeasurementAttributes::SIGNATURE_REQUESTED, measurement_operation, + None, &mut content_changed, &mut total_number, &mut spdm_measurement_record_structure, @@ -742,6 +749,7 @@ fn test_case3_send_receive_spdm_measurement() { SpdmMeasurementAttributes::empty() }, SpdmMeasurementOperation::Unknown(i), + None, &mut content_changed, &mut dummy_total_number, &mut spdm_measurement_record_structure,