use super::XChaCha20Poly1305;
use crate::error::{CryptoError, Result};
use std::io::{Read, Write};
pub fn encrypt_stream<R: Read, W: Write>(
mut reader: R,
mut writer: W,
key: &[u8; 32],
nonce: &[u8; 24],
chunk_size: usize,
) -> Result<u64> {
let mut buffer = vec![0u8; chunk_size];
let mut total_bytes = 0u64;
loop {
let bytes_read = reader.read(&mut buffer).map_err(CryptoError::Io)?;
if bytes_read == 0 {
break;
}
let chunk = &buffer[..bytes_read];
let encrypted = XChaCha20Poly1305::encrypt(key, nonce, chunk)?;
writer.write_all(&encrypted).map_err(CryptoError::Io)?;
total_bytes += bytes_read as u64;
}
Ok(total_bytes)
}
pub fn decrypt_stream<R: Read, W: Write>(
mut reader: R,
mut writer: W,
key: &[u8; 32],
nonce: &[u8; 24],
chunk_size: usize,
) -> Result<u64> {
let mut buffer = vec![0u8; chunk_size + 16]; let mut total_bytes = 0u64;
loop {
let bytes_read = reader.read(&mut buffer).map_err(CryptoError::Io)?;
if bytes_read == 0 {
break;
}
let chunk = &buffer[..bytes_read];
let decrypted = XChaCha20Poly1305::decrypt(key, nonce, chunk)?;
writer.write_all(&decrypted).map_err(CryptoError::Io)?;
total_bytes += decrypted.len() as u64;
}
Ok(total_bytes)
}