Skip to content

Commit 06b8528

Browse files
committed
Introduce chacha20poly1305 crate, check compatibility
We take a dependency on `rust-bitcoin`'s new-ish `chacha20poly1305` crate and check compatibility with our previous hand-rolled implementation (might be redundant, but better safe than sorry).
1 parent 28976f4 commit 06b8528

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ serde = { version = "1.0.196", default-features = false, features = ["serde_deri
2929
serde_json = { version = "1.0.113", default-features = false, optional = true }
3030

3131
bitcoin_hashes = "0.14.0"
32+
chacha20-poly1305 = "0.1.2"
3233

3334
[target.'cfg(genproto)'.build-dependencies]
3435
prost-build = { version = "0.11.3" }

src/crypto/chacha20poly1305.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,3 +198,48 @@ mod real_chachapoly {
198198
}
199199

200200
pub use self::real_chachapoly::ChaCha20Poly1305;
201+
202+
mod tests {
203+
#[test]
204+
fn check_chacha_compat_old_to_new() {
205+
let data_encryption_key = [42u8; 32];
206+
let mut nonce = [0u8; 12];
207+
nonce[4..].copy_from_slice(&[48u8; 8]);
208+
let aad = b"asdf";
209+
210+
let mut old_cipher = super::ChaCha20Poly1305::new(&data_encryption_key, &nonce, aad);
211+
212+
let mut tag = [0u8; 16];
213+
let mut very_secret_data = vec![89u8; 128];
214+
let expected_very_secret_data = very_secret_data.clone();
215+
old_cipher.encrypt_inplace(&mut very_secret_data, &mut tag);
216+
217+
let new_key = chacha20_poly1305::Key::new(data_encryption_key);
218+
let new_nonce = chacha20_poly1305::Nonce::new(nonce);
219+
let new_cipher = chacha20_poly1305::ChaCha20Poly1305::new(new_key, new_nonce);
220+
221+
new_cipher.decrypt(&mut very_secret_data, tag, Some(aad)).unwrap();
222+
assert_eq!(very_secret_data, expected_very_secret_data);
223+
}
224+
225+
#[test]
226+
fn check_chacha_compat_new_to_old() {
227+
let data_encryption_key = [42u8; 32];
228+
let mut nonce = [0u8; 12];
229+
nonce[4..].copy_from_slice(&[48u8; 8]);
230+
let aad = b"asdf";
231+
232+
let new_key = chacha20_poly1305::Key::new(data_encryption_key.clone());
233+
let new_nonce = chacha20_poly1305::Nonce::new(nonce.clone());
234+
let new_cipher = chacha20_poly1305::ChaCha20Poly1305::new(new_key, new_nonce);
235+
236+
let mut very_secret_data = vec![89u8; 128];
237+
let expected_very_secret_data = very_secret_data.clone();
238+
let tag = new_cipher.encrypt(&mut very_secret_data, Some(aad));
239+
240+
let mut old_cipher = super::ChaCha20Poly1305::new(&data_encryption_key, &nonce, aad);
241+
242+
old_cipher.decrypt_inplace(&mut very_secret_data, &tag).unwrap();
243+
assert_eq!(very_secret_data, expected_very_secret_data);
244+
}
245+
}

0 commit comments

Comments
 (0)