Repo of no-std crates for my personal embedded projects
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Buffer Slice, and dyn Buffer encrypt/decrypt

+65 -2
+65 -2
sachy-crypto/src/lib.rs
··· 140 140 impl SendingState<'_> { 141 141 pub fn encrypt( 142 142 &mut self, 143 - msg: &mut alloc::vec::Vec<u8>, 143 + msg: &mut dyn aead::Buffer, 144 144 associated_data: &[u8], 145 145 ) -> Result<(), ProtoError> { 146 146 if self.counter.ct_eq(&TransportState::COUNTER_MAX).into() { ··· 169 169 impl ReceivingState<'_> { 170 170 pub fn decrypt( 171 171 &mut self, 172 - msg: &mut alloc::vec::Vec<u8>, 172 + msg: &mut dyn aead::Buffer, 173 173 associated_data: &[u8], 174 174 ) -> Result<(), ProtoError> { 175 175 if self.counter.ct_eq(&TransportState::COUNTER_MAX).into() { ··· 287 287 } 288 288 } 289 289 290 + #[derive(Debug)] 291 + pub struct BufferSlice<'a> { 292 + slice: &'a mut [u8], 293 + end: usize, 294 + } 295 + 296 + impl<'a> BufferSlice<'a> { 297 + pub fn new(slice: &'a mut [u8]) -> Self { 298 + Self { 299 + end: slice.len(), 300 + slice, 301 + } 302 + } 303 + } 304 + 305 + impl AsRef<[u8]> for BufferSlice<'_> { 306 + fn as_ref(&self) -> &[u8] { 307 + &self.slice[..self.end] 308 + } 309 + } 310 + 311 + impl AsMut<[u8]> for BufferSlice<'_> { 312 + fn as_mut(&mut self) -> &mut [u8] { 313 + &mut self.slice[..self.end] 314 + } 315 + } 316 + 317 + impl aead::Buffer for BufferSlice<'_> { 318 + fn extend_from_slice(&mut self, other: &[u8]) -> aead::Result<()> { 319 + let index = self.end + other.len(); 320 + 321 + if index > self.slice.len() { 322 + return Err(aead::Error); 323 + } 324 + 325 + self.slice[self.end..index].copy_from_slice(other); 326 + 327 + self.end = index; 328 + 329 + Ok(()) 330 + } 331 + 332 + fn truncate(&mut self, len: usize) { 333 + self.end = len; 334 + } 335 + } 336 + 290 337 #[cfg(test)] 291 338 mod tests { 292 339 use alloc::vec; 340 + use chacha20poly1305::aead::Buffer; 293 341 use dhkem::Generate; 294 342 use elliptic_curve::array::Array; 295 343 296 344 use super::*; 345 + 346 + #[test] 347 + fn buffer_slice_works() { 348 + let mut buf = vec![0u8; 128]; 349 + 350 + let mut buf_slice = BufferSlice::new(&mut buf); 351 + 352 + assert_eq!(buf_slice.len(), 128); 353 + assert_eq!(buf_slice.extend_from_slice(&[0,0,0]), Err(aead::Error)); 354 + 355 + buf_slice.truncate(64); 356 + 357 + assert_eq!(buf_slice.extend_from_slice(&[0,0,0,0,0,0]), Ok(())); 358 + assert_eq!(buf_slice.len(), 70); 359 + } 297 360 298 361 #[test] 299 362 fn handshake_protocol_works() -> Result<(), ProtoError> {