use crate::transport::{Error, MAX_MESSAGE_SIZE};
use darkbio_crypto::xhpke;
pub(crate) const OVERHEAD: usize = 16;
pub(crate) fn seal(sender: &mut xhpke::Sender, message: &[u8]) -> Result<Vec<u8>, Error> {
if message.len() > MAX_MESSAGE_SIZE {
return Err(Error::PacketTooLarge(message.len()));
}
sender
.seal(message, &[])
.map_err(|err| Error::EncryptionFailed(err.to_string()))
}
pub(crate) fn open(receiver: &mut xhpke::Receiver, packet: &[u8]) -> Result<Vec<u8>, Error> {
receiver
.open(packet, &[])
.map_err(|err| Error::EncryptionFailed(err.to_string()))
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
use crate::transport::MAX_FRAME_SIZE;
use darkbio_cobs as cobs;
#[test]
fn test_seal_overhead() {
let secret = xhpke::SecretKey::generate();
let (mut sender, _) = secret.public_key().new_sender(b"test").unwrap();
for size in [0, 1, 255, 4096] {
let sealed = sender.seal(&vec![0x42; size], &[]).unwrap();
assert_eq!(sealed.len(), size + OVERHEAD, "size {size}");
}
}
#[test]
fn test_message_limit() {
let framed = |size: usize| cobs::encode_buffer(size + OVERHEAD);
assert!(framed(MAX_MESSAGE_SIZE) <= MAX_FRAME_SIZE);
assert!(framed(MAX_MESSAGE_SIZE + 1) > MAX_FRAME_SIZE);
}
#[test]
fn test_seal_bounds() {
let secret = xhpke::SecretKey::generate();
let (mut sender, encap) = secret.public_key().new_sender(b"test").unwrap();
let mut receiver = secret.new_receiver(&encap, b"test").unwrap();
let message = vec![0x42; MAX_MESSAGE_SIZE + 1];
let result = seal(&mut sender, &message).map(|sealed| sealed.len());
assert!(
matches!(result, Err(Error::PacketTooLarge(_))),
"{result:?}"
);
let message = vec![0x42; MAX_MESSAGE_SIZE];
let sealed = seal(&mut sender, &message).unwrap();
assert!(cobs::encode_buffer(sealed.len()) <= MAX_FRAME_SIZE);
assert_eq!(open(&mut receiver, &sealed).unwrap(), message);
}
}