Skip to content

Commit 4631b52

Browse files
committed
Add a ChaCha20 utility for encrypting in place
Similar to ChaCha20::encrypt_single_block only encrypts in-place.
1 parent cf25bb0 commit 4631b52

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

lightning/src/util/chacha20.rs

+36
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,16 @@ mod real_chacha {
173173
}
174174
}
175175

176+
/// Same as `encrypt_single_block` only operates on a fixed-size input in-place.
177+
pub fn encrypt_single_block_in_place(
178+
key: &[u8; 32], nonce: &[u8; 16], bytes: &mut [u8; 32]
179+
) {
180+
let block = ChaCha20::get_single_block(key, nonce);
181+
for i in 0..bytes.len() {
182+
bytes[i] = block[i] ^ bytes[i];
183+
}
184+
}
185+
176186
fn expand(key: &[u8], nonce: &[u8]) -> ChaChaState {
177187
let constant = match key.len() {
178188
16 => b"expand 16-byte k",
@@ -311,6 +321,10 @@ mod fuzzy_chacha {
311321
debug_assert!(dest.len() <= 32);
312322
}
313323

324+
pub fn encrypt_single_block_in_place(
325+
_key: &[u8; 32], _nonce: &[u8; 16], _bytes: &mut [u8; 32]
326+
) {}
327+
314328
pub fn process(&mut self, input: &[u8], output: &mut [u8]) {
315329
output.copy_from_slice(input);
316330
}
@@ -662,4 +676,26 @@ mod test {
662676

663677
assert_eq!(bytes, decrypted_bytes);
664678
}
679+
680+
#[test]
681+
fn encrypt_single_block_in_place() {
682+
let key = [
683+
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
684+
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
685+
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
686+
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
687+
];
688+
let nonce = [
689+
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
690+
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
691+
];
692+
let unencrypted_bytes = [1; 32];
693+
let mut bytes = unencrypted_bytes;
694+
695+
ChaCha20::encrypt_single_block_in_place(&key, &nonce, &mut bytes);
696+
assert_ne!(bytes, unencrypted_bytes);
697+
698+
ChaCha20::encrypt_single_block_in_place(&key, &nonce, &mut bytes);
699+
assert_eq!(bytes, unencrypted_bytes);
700+
}
665701
}

0 commit comments

Comments
 (0)