Fixed crypto

This commit is contained in:
2026-08-28 14:27:35 -04:00
parent 12fb17c9c3
commit acf76cd82f
+6 -11
View File
@@ -3,7 +3,6 @@ use chacha20poly1305::{aead::Aead, ChaCha20Poly1305, Nonce};
pub struct SessionCipher {
cipher: ChaCha20Poly1305,
send_counter: u64,
recv_counter: u64,
}
impl SessionCipher {
@@ -11,11 +10,10 @@ impl SessionCipher {
Self {
cipher,
send_counter: 0,
recv_counter: 0,
}
}
pub fn next_send_nonce(&mut self) -> [u8; 12] {
fn next_send_nonce(&mut self) -> [u8; 12] {
let mut nonce = [0u8; 12];
nonce[..8].copy_from_slice(&self.send_counter.to_be_bytes());
// top bit distinguishes "send" direction from "recv" direction,
@@ -26,13 +24,6 @@ impl SessionCipher {
nonce
}
pub fn next_recv_nonce(&mut self) -> [u8; 12] {
let mut nonce = [0u8; 12];
nonce[..8].copy_from_slice(&self.recv_counter.to_be_bytes());
self.recv_counter += 1;
nonce
}
pub fn encrypt(&mut self, plaintext: &[u8]) -> Result<Vec<u8>, String> {
let nonce_bytes = self.next_send_nonce();
let nonce = Nonce::try_from(nonce_bytes).map_err(|v| v.to_string())?;
@@ -48,11 +39,15 @@ impl SessionCipher {
Ok(out)
}
pub fn decrypt(&mut self, data: &[u8]) -> Result<Vec<u8>, String> {
pub fn decrypt(&self, data: &[u8]) -> Result<Vec<u8>, String> {
if data.len() < 12 {
return Err("message too short to contain a nonce".to_string());
}
let (nonce_bytes, ciphertext) = data.split_at(12);
// Use the nonce that travelled with this packet rather than a locally
// tracked counter. This makes decryption immune to UDP packet loss or
// reordering, because we never desync from the sender's counter.
let nonce = Nonce::try_from(nonce_bytes).map_err(|v| v.to_string())?;
self.cipher