|
| 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