(mut request: EcHostRequest, data: &[u8])
| 186 | } |
| 187 | |
| 188 | fn pack_request(mut request: EcHostRequest, data: &[u8]) -> Vec<u8> { |
| 189 | let total = EC_LPC_HOST_PACKET_SIZE as usize; |
| 190 | let offset = std::mem::size_of::<EcHostRequest>(); |
| 191 | let mut buffer = vec![0_u8; total]; |
| 192 | let max_transfer = std::cmp::min(total - offset, data.len()); |
| 193 | let checksum_size = offset + max_transfer; |
| 194 | |
| 195 | if log_enabled!(Level::Trace) { |
| 196 | println!("Total: {:?}", total); |
| 197 | println!("Offset: {:?}", offset); |
| 198 | println!("checksum_size: {:?}", checksum_size); |
| 199 | println!("data.len(): {:?}", data.len()); |
| 200 | } |
| 201 | |
| 202 | debug_assert!(checksum_size <= total); |
| 203 | |
| 204 | // Copy struct into buffer, then checksum, then copy again |
| 205 | // Could avoid copying again by inserting checksum in to the buffer directly, |
| 206 | // but I'm too lazy. And that seems less safe. |
| 207 | let r_bytes: &[u8] = unsafe { util::any_as_u8_slice(&request) }; |
| 208 | buffer[..offset].copy_from_slice(&r_bytes[..offset]); |
| 209 | if !data.is_empty() { |
| 210 | buffer[offset..offset + max_transfer].copy_from_slice(&data[..max_transfer]); |
| 211 | } |
| 212 | let checksum = checksum_buffer(&buffer[..checksum_size]); |
| 213 | |
| 214 | request.checksum = checksum; |
| 215 | let r_bytes: &[u8] = unsafe { util::any_as_u8_slice(&request) }; |
| 216 | buffer[..offset].copy_from_slice(&r_bytes[..offset]); |
| 217 | if !data.is_empty() { |
| 218 | buffer[offset..offset + max_transfer].copy_from_slice(&data[..max_transfer]); |
| 219 | } |
| 220 | |
| 221 | buffer[..checksum_size].to_vec() |
| 222 | } |
| 223 | |
| 224 | fn unpack_response_header(bytes: &[u8]) -> EcHostResponse { |
| 225 | let response: EcHostResponse = unsafe { |
no test coverage detected