asbs 1.2.3

A generic steganography library
Documentation
use asbs::{binary, Conceal, Reveal};
use std::{fs::File, io};

#[test]
fn it_conceals_and_reveals_with_known_length() -> io::Result<()> {
    let pattern = |i| Some(((1u8 << (i % 3)) - 1) << 1);

    let cover = File::open("tests/resources/cover")?;
    let cover_len = cover.metadata()?.len() as usize;

    let payload = b"a very very secret message";
    let payload_len = payload.len();

    let mut package = Vec::with_capacity(cover_len);

    assert_eq!(
        cover_len,
        binary::Carrier::new(pattern, &mut package).conceal(payload.as_slice(), cover)?,
    );

    let mut revealed_payload = Vec::with_capacity(payload_len);

    binary::Package::with_len(payload_len, pattern, package.as_slice())
        .reveal(&mut revealed_payload)?;

    assert_eq!(*payload, *revealed_payload);

    Ok(())
}

#[test]
fn it_conceals_and_reveals_with_embedded_length() -> io::Result<()> {
    let pattern = |i| Some(1u8 << (i % 3));

    let cover = File::open("tests/resources/cover")?;
    let cover_len = cover.metadata()?.len() as usize;

    let payload = b"a very very secret message";

    let mut package = Vec::with_capacity(cover_len);

    assert_eq!(
        cover_len,
        binary::Carrier::with_embedded_len(payload.len(), pattern, &mut package)
            .conceal(payload.as_slice(), cover)?,
    );

    let mut revealed_payload = Vec::new();

    binary::Package::with_embedded_len(pattern, package.as_slice())
        .reveal(&mut revealed_payload)?;

    assert_eq!(*payload, *revealed_payload);

    Ok(())
}

#[test]
fn it_handles_zero_length_payload() -> io::Result<()> {
    let pattern = |_| Some(1);

    let mut package = Vec::new();

    binary::Carrier::with_embedded_len(0, pattern, &mut package)
        .conceal([].as_slice(), File::open("tests/resources/cover")?)?;

    let mut revealed_payload = Vec::new();

    binary::Package::with_embedded_len(pattern, package.as_slice())
        .reveal(&mut revealed_payload)?;

    assert!(revealed_payload.is_empty());

    Ok(())
}

#[test]
fn it_handles_partial_conceal() -> io::Result<()> {
    let pattern = |_| Some(1);

    let mut package = Vec::with_capacity(0);

    assert_eq!(
        io::ErrorKind::WriteZero,
        binary::Carrier::new(pattern, &mut package)
        .conceal(b"this message won't be written".as_slice(), [].as_slice())
            .unwrap_err()
            .kind()
    );

    Ok(())
}

#[test]
fn it_handles_partial_reveal() -> io::Result<()> {
    let pattern = |_| Some(1);

    let mut package = Vec::new();

    binary::Carrier::new(pattern, &mut package).conceal(
        b"this message won't fit".as_slice(),
        File::open("tests/resources/cover")?,
    )?;

    assert_eq!(
        io::ErrorKind::WriteZero,
        binary::Package::with_embedded_len(pattern, package.as_slice())
            .reveal([].as_mut_slice())
            .unwrap_err()
            .kind()
    );

    Ok(())
}