Skip to content

Commit c699354

Browse files
IntelCaisuijyao1
authored andcommitted
Add unit tests for SPDM chunk capability
1. Added tests for newly added spdm messages. 2. Modified ci workflow to load configs that trigger chunk messages in unit tests.
1 parent 4fbdc02 commit c699354

File tree

6 files changed

+259
-0
lines changed

6 files changed

+259
-0
lines changed

sh_script/build.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ RUN_RESPONDER_FEATURES=${RUN_RESPONDER_FEATURES:-spdm-ring,hashed-transcript-dat
108108
RUN_REQUESTER_MUTAUTH_FEATURES="${RUN_REQUESTER_FEATURES},mut-auth"
109109
RUN_RESPONDER_MUTAUTH_FEATURES="${RUN_RESPONDER_FEATURES},mut-auth"
110110
RUN_RESPONDER_MANDATORY_MUTAUTH_FEATURES="${RUN_RESPONDER_FEATURES},mandatory-mut-auth"
111+
RUN_REQUESTER_CHUNK_CAP_FEATURES="${RUN_REQUESTER_FEATURES},chunk-cap"
112+
RUN_RESPONDER_CHUNK_CAP_FEATURES="${RUN_RESPONDER_FEATURES},chunk-cap"
113+
111114

112115
run_with_spdm_emu() {
113116
echo "Running with spdm-emu..."
@@ -166,6 +169,15 @@ run_basic_test() {
166169
echo_command cargo test -- --test-threads=1
167170
echo_command cargo test --no-default-features -- --test-threads=1
168171
popd
172+
173+
echo "Running tests with chunk capability..."
174+
echo_command export SPDM_CONFIG="etc/chunk_test_config.json"
175+
echo_command cargo test --no-default-features --features "spdmlib/std,spdmlib/spdm-ring,spdm-emu/is_sync,spdmlib/is_sync,maybe-async/is_sync,idekm/is_sync,tdisp/is_sync,mctp_transport/is_sync,pcidoe_transport/is_sync,spdm-requester-emu/is_sync,spdm-responder-emu/is_sync,chunk-cap" -- --test-threads=1
176+
pushd test/spdmlib-test
177+
echo_command cargo test -- --test-threads=1
178+
echo_command cargo test --no-default-features --features "chunk-cap" -- --test-threads=1
179+
popd
180+
echo_command export SPDM_CONFIG="etc/config.json"
169181
}
170182

171183
run_rust_spdm_emu() {
@@ -194,6 +206,17 @@ run_rust_spdm_emu_mandatory_mut_auth() {
194206
cleanup
195207
}
196208

209+
run_rust_spdm_emu_chunk_cap() {
210+
echo "Running requester and responder chunk capability..."
211+
echo_command export SPDM_CONFIG="etc/chunk_test_config.json"
212+
echo $RUN_REQUESTER_CHUNK_CAP_FEATURES
213+
echo_command cargo run -p spdm-responder-emu --no-default-features --features="$RUN_RESPONDER_CHUNK_CAP_FEATURES" &
214+
sleep 5
215+
echo_command cargo run -p spdm-requester-emu --no-default-features --features="$RUN_REQUESTER_CHUNK_CAP_FEATURES"
216+
echo_command export SPDM_CONFIG="etc/config.json"
217+
cleanup
218+
}
219+
197220
run() {
198221
run_basic_test
199222
run_rust_spdm_emu

spdmlib/etc/chunk_test_config.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"__usage": "config that used for unit tests for chunk capability",
3+
"cert_config": {
4+
"max_cert_chain_data_size": 4096
5+
},
6+
"measurement_config": {
7+
"max_measurement_record_size": 4000,
8+
"max_measurement_val_len": 1024
9+
},
10+
"psk_config": {
11+
"max_psk_context_size": 64,
12+
"max_psk_hint_size": 32
13+
},
14+
"max_opaque_list_elements_count": 3,
15+
"max_session_count": 4,
16+
"transport_config": {
17+
"sender_buffer_size": 108,
18+
"receiver_buffer_size": 108
19+
},
20+
"max_spdm_msg_size": 4096,
21+
"heartbeat_period_value": 0,
22+
"max_root_cert_support": 10
23+
}

spdmlib/src/message/chunk_get.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,7 @@ impl SpdmCodec for SpdmChunkResponsePayload {
131131
})
132132
}
133133
}
134+
135+
#[cfg(test)]
136+
#[path = "chunk_get_test.rs"]
137+
mod chunk_get_test;
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// Copyright (c) 2025 Intel Corporation
2+
//
3+
// SPDX-License-Identifier: Apache-2.0 or MIT
4+
5+
use super::*;
6+
use crate::common::{SpdmCodec, SpdmConfigInfo, SpdmContext, SpdmProvisionInfo};
7+
use byteorder::{ByteOrder, LittleEndian};
8+
use testlib::{create_spdm_context, DeviceIO, TransportEncap};
9+
extern crate alloc;
10+
11+
#[test]
12+
fn test_chunk_get_and_response_struct() {
13+
create_spdm_context!(context);
14+
let context = &mut context;
15+
context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion12;
16+
17+
let u8_slice = &mut [0u8; config::SPDM_SENDER_DATA_TRANSFER_SIZE];
18+
let writer = &mut Writer::init(u8_slice);
19+
let request = SpdmChunkGetRequestPayload {
20+
handle: 1,
21+
chunk_seq_num: 1,
22+
};
23+
assert!(request.spdm_encode(context, writer).is_ok());
24+
assert_eq!(writer.used(), 4);
25+
26+
assert_eq!(u8_slice[0..4], [0, 1, 1, 0]);
27+
28+
let reader = &mut Reader::init(u8_slice);
29+
let read_request = SpdmChunkGetRequestPayload::spdm_read(context, reader).unwrap();
30+
assert_eq!(read_request.handle, 1);
31+
assert_eq!(read_request.chunk_seq_num, 1);
32+
33+
context.chunk_context.chunk_message_size = 0x100;
34+
context.chunk_context.chunk_message_data = [0u8; config::MAX_SPDM_MSG_SIZE];
35+
context.chunk_context.transferred_size = 0;
36+
assert!(context.chunk_context.chunk_message_size <= config::MAX_SPDM_MSG_SIZE);
37+
let chunk_size = config::SPDM_SENDER_DATA_TRANSFER_SIZE
38+
- SPDM_VERSION_1_2_OFFSET_OF_SPDM_CHUNK_IN_FIRST_CHUNK_RESPONSE;
39+
let large_message_size = context.chunk_context.chunk_message_size as u32;
40+
41+
let writer = &mut Writer::init(u8_slice);
42+
let request = SpdmChunkResponsePayload {
43+
response_attributes: SpdmChunkSenderAttributes::default(),
44+
handle: 1,
45+
chunk_seq_num: 0,
46+
chunk_size: chunk_size as u32,
47+
large_message_size: Some(large_message_size),
48+
};
49+
50+
let field_slice = &mut [0u8; 4];
51+
52+
assert!(request.spdm_encode(context, writer).is_ok());
53+
assert_eq!(writer.used(), config::SPDM_SENDER_DATA_TRANSFER_SIZE - 2);
54+
assert_eq!(u8_slice[0..4], [0, 1, 0, 0]);
55+
assert_eq!(u8_slice[4..6], [0, 0]);
56+
LittleEndian::write_u32(field_slice, chunk_size as u32);
57+
assert_eq!(u8_slice[6..10], field_slice[..]);
58+
LittleEndian::write_u32(field_slice, large_message_size as u32);
59+
assert_eq!(u8_slice[10..14], field_slice[..]);
60+
61+
context.chunk_context.transferred_size = 0;
62+
63+
let reader = &mut Reader::init(u8_slice);
64+
let read_request = SpdmChunkResponsePayload::spdm_read(context, reader).unwrap();
65+
assert_eq!(
66+
read_request.response_attributes,
67+
SpdmChunkSenderAttributes::default()
68+
);
69+
assert_eq!(read_request.handle, 1);
70+
assert_eq!(read_request.chunk_seq_num, 0);
71+
assert_eq!(read_request.chunk_size, chunk_size as u32);
72+
assert_eq!(read_request.large_message_size.unwrap(), large_message_size);
73+
}
74+
75+
#[test]
76+
fn test_chunk_response_msg_overflow() {
77+
create_spdm_context!(context);
78+
let context = &mut context;
79+
context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion12;
80+
81+
context.chunk_context.chunk_message_size = 0x100;
82+
context.chunk_context.transferred_size = 0x0;
83+
let chunk_size = config::SPDM_SENDER_DATA_TRANSFER_SIZE
84+
- SPDM_VERSION_1_2_OFFSET_OF_SPDM_CHUNK_IN_FIRST_CHUNK_RESPONSE;
85+
86+
let u8_slice = &mut [0u8; config::SPDM_SENDER_DATA_TRANSFER_SIZE];
87+
let writer = &mut Writer::init(u8_slice);
88+
let request = SpdmChunkResponsePayload {
89+
response_attributes: SpdmChunkSenderAttributes::default(),
90+
handle: 1,
91+
chunk_seq_num: 1,
92+
chunk_size: chunk_size as u32,
93+
large_message_size: None,
94+
};
95+
assert!(request.spdm_encode(context, writer).is_ok());
96+
97+
context.chunk_context.transferred_size = 0x100;
98+
99+
let reader = &mut Reader::init(u8_slice);
100+
assert!(SpdmChunkResponsePayload::spdm_read(context, reader).is_none());
101+
}

spdmlib/src/message/chunk_send.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,7 @@ impl Codec for SpdmChunkReceiverAttributes {
219219
SpdmChunkReceiverAttributes::from_bits(bits & SpdmChunkReceiverAttributes::VALID_MASK.bits)
220220
}
221221
}
222+
223+
#[cfg(test)]
224+
#[path = "chunk_send_test.rs"]
225+
mod chunk_send_test;
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// Copyright (c) 2025 Intel Corporation
2+
//
3+
// SPDX-License-Identifier: Apache-2.0 or MIT
4+
5+
use super::*;
6+
use crate::common::{SpdmCodec, SpdmConfigInfo, SpdmContext, SpdmProvisionInfo};
7+
use byteorder::{ByteOrder, LittleEndian};
8+
use testlib::{create_spdm_context, DeviceIO, TransportEncap};
9+
extern crate alloc;
10+
11+
#[test]
12+
fn test_chunk_send_struct() {
13+
create_spdm_context!(context);
14+
let context = &mut context;
15+
context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion12;
16+
17+
let u8_slice = &mut [0u8; config::SPDM_SENDER_DATA_TRANSFER_SIZE];
18+
let writer = &mut Writer::init(u8_slice);
19+
20+
context.chunk_context.chunk_message_size = 0x100;
21+
context.chunk_context.chunk_message_data = [0u8; config::MAX_SPDM_MSG_SIZE];
22+
context.chunk_context.transferred_size = 0;
23+
assert!(context.chunk_context.chunk_message_size <= config::MAX_SPDM_MSG_SIZE);
24+
let chunk_size = config::SPDM_SENDER_DATA_TRANSFER_SIZE
25+
- SPDM_VERSION_1_2_OFFSET_OF_SPDM_CHUNK_IN_FIRST_CHUNK_SEND;
26+
let large_message_size = context.chunk_context.chunk_message_size as u32;
27+
28+
let request = SpdmChunkSendRequestPayload {
29+
chunk_sender_attributes: SpdmChunkSenderAttributes::default(),
30+
handle: 1,
31+
chunk_seq_num: 0,
32+
chunk_size: chunk_size as u32,
33+
large_message_size: Some(large_message_size),
34+
};
35+
36+
let field_slice = &mut [0u8; 4];
37+
assert!(request.spdm_encode(context, writer).is_ok());
38+
assert_eq!(writer.used(), config::SPDM_SENDER_DATA_TRANSFER_SIZE - 2);
39+
assert_eq!(u8_slice[0..4], [0, 1, 0, 0]);
40+
assert_eq!(u8_slice[4..6], [0, 0]);
41+
LittleEndian::write_u32(field_slice, chunk_size as u32);
42+
assert_eq!(u8_slice[6..10], field_slice[..]);
43+
LittleEndian::write_u32(field_slice, large_message_size as u32);
44+
assert_eq!(u8_slice[10..14], field_slice[..]);
45+
assert_eq!(
46+
u8_slice[14..(14 + chunk_size)],
47+
[0u8; config::SPDM_SENDER_DATA_TRANSFER_SIZE
48+
- SPDM_VERSION_1_2_OFFSET_OF_SPDM_CHUNK_IN_FIRST_CHUNK_SEND]
49+
);
50+
51+
context.chunk_context.transferred_size = 0;
52+
context.chunk_context.chunk_status = common::SpdmChunkStatus::Idle;
53+
54+
let reader = &mut Reader::init(u8_slice);
55+
let read_request = SpdmChunkSendRequestPayload::spdm_read(context, reader).unwrap();
56+
assert_eq!(
57+
read_request.chunk_sender_attributes,
58+
SpdmChunkSenderAttributes::default()
59+
);
60+
assert_eq!(read_request.handle, 1);
61+
assert_eq!(read_request.chunk_seq_num, 0);
62+
assert_eq!(read_request.chunk_size, chunk_size as u32);
63+
assert_eq!(read_request.large_message_size.unwrap(), large_message_size);
64+
}
65+
66+
#[test]
67+
fn test_chunk_send_ack_struct() {
68+
create_spdm_context!(context);
69+
let context = &mut context;
70+
context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion12;
71+
72+
let u8_slice = &mut [0u8; config::SPDM_SENDER_DATA_TRANSFER_SIZE];
73+
let writer = &mut Writer::init(u8_slice);
74+
75+
context.chunk_context.chunk_message_size = 36;
76+
context.chunk_context.chunk_message_data[..36].copy_from_slice(&[0u8; 36]);
77+
78+
let request = SpdmChunkSendAckResponsePayload {
79+
chunk_receiver_attributes: SpdmChunkReceiverAttributes::default(),
80+
handle: 1,
81+
chunk_seq_num: 0,
82+
response_to_large_request_size: 36,
83+
};
84+
85+
assert!(request.spdm_encode(context, writer).is_ok());
86+
assert_eq!(writer.used(), 40);
87+
assert_eq!(u8_slice[0..4], [0, 1, 0, 0]);
88+
assert_eq!(u8_slice[4..40], [0u8; 36]);
89+
90+
context.chunk_context.transferred_size = 36;
91+
context.chunk_context.chunk_message_size = 36;
92+
let reader = &mut Reader::init(&u8_slice[..40]);
93+
let read_request = SpdmChunkSendAckResponsePayload::spdm_read(context, reader).unwrap();
94+
95+
assert_eq!(
96+
read_request.chunk_receiver_attributes,
97+
SpdmChunkReceiverAttributes::default()
98+
);
99+
assert_eq!(read_request.handle, 1);
100+
assert_eq!(read_request.chunk_seq_num, 0);
101+
assert_eq!(read_request.response_to_large_request_size, 36);
102+
assert_eq!(context.chunk_context.chunk_message_size, 36);
103+
assert_eq!(context.chunk_context.chunk_message_data[..36], [0u8; 36]);
104+
}

0 commit comments

Comments
 (0)