Skip to content

Commit c2e01ee

Browse files
authored
Merge pull request project-chip#54 from bjoernQ/fix/reduce-allocation-in-rust-crypto
Reduce allocations in crypto_rustcrypto.rs
2 parents bddabe6 + bb07ff9 commit c2e01ee

File tree

1 file changed

+46
-12
lines changed

1 file changed

+46
-12
lines changed

matter/src/crypto/crypto_rustcrypto.rs

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ impl CryptoKeyPair for KeyPair {
258258
KeyType::Private(k) => {
259259
let signing_key = SigningKey::from(k);
260260
let sig: Signature = signing_key.sign(msg);
261-
let bytes = sig.to_bytes().to_vec();
261+
let bytes = sig.to_bytes();
262262
let len = bytes.len();
263263
signature[..len].copy_from_slice(&bytes);
264264
Ok(len)
@@ -308,13 +308,10 @@ pub fn encrypt_in_place(
308308
let key = GenericArray::from_slice(key);
309309
let nonce = GenericArray::from_slice(nonce);
310310
let cipher = AesCcm::new(key);
311-
// This is probably incorrect
312-
let mut buffer = data[0..data_len].to_vec();
313-
cipher.encrypt_in_place(nonce, ad, &mut buffer)?;
314-
let len = buffer.len();
315-
data.clone_from_slice(&buffer[..]);
316311

317-
Ok(len)
312+
let mut buffer = SliceBuffer::new(data, data_len);
313+
cipher.encrypt_in_place(nonce, ad, &mut buffer)?;
314+
Ok(buffer.len())
318315
}
319316

320317
pub fn decrypt_in_place(
@@ -328,11 +325,48 @@ pub fn decrypt_in_place(
328325
let key = GenericArray::from_slice(key);
329326
let nonce = GenericArray::from_slice(nonce);
330327
let cipher = AesCcm::new(key);
331-
// This is probably incorrect
332-
let mut buffer = data.to_vec();
328+
329+
let mut buffer = SliceBuffer::new(data, data.len());
333330
cipher.decrypt_in_place(nonce, ad, &mut buffer)?;
334-
let len = buffer.len();
335-
data[..len].copy_from_slice(&buffer[..]);
331+
Ok(buffer.len())
332+
}
333+
334+
#[derive(Debug)]
335+
struct SliceBuffer<'a> {
336+
slice: &'a mut [u8],
337+
len: usize,
338+
}
339+
340+
impl<'a> SliceBuffer<'a> {
341+
fn new(slice: &'a mut [u8], len: usize) -> Self {
342+
Self { slice, len }
343+
}
344+
345+
fn len(&self) -> usize {
346+
self.len
347+
}
348+
}
336349

337-
Ok(len)
350+
impl<'a> AsMut<[u8]> for SliceBuffer<'a> {
351+
fn as_mut(&mut self) -> &mut [u8] {
352+
&mut self.slice[..self.len]
353+
}
354+
}
355+
356+
impl<'a> AsRef<[u8]> for SliceBuffer<'a> {
357+
fn as_ref(&self) -> &[u8] {
358+
&self.slice[..self.len]
359+
}
360+
}
361+
362+
impl<'a> ccm::aead::Buffer for SliceBuffer<'a> {
363+
fn extend_from_slice(&mut self, other: &[u8]) -> ccm::aead::Result<()> {
364+
self.slice[self.len..][..other.len()].copy_from_slice(other);
365+
self.len += other.len();
366+
Ok(())
367+
}
368+
369+
fn truncate(&mut self, len: usize) {
370+
self.len = len;
371+
}
338372
}

0 commit comments

Comments
 (0)