enard 0.1.1

Implementation of the enard container format
Documentation
use thiserror::Error;

#[derive(Debug, Error)]
pub enum EnardError {
    #[error(transparent)]
    IO(#[from] std::io::Error),
    #[error(transparent)]
    InvalidBufferSize(#[from] digest::InvalidBufferSize),
    #[error(transparent)]
    MacError(#[from] digest::MacError),
    #[error("invalid key or iv length")]
    InvalidLength,
    #[error("unsupported encryption method '{kind}'")]
    UnsupportedEncryption { kind: Box<str> },
    #[error("expected magic header '{exp}' but found '{found}'")]
    InvalidMagic { exp: Box<str>, found: Box<str> },
    #[error("unsupported format version {version}, supported versions: 1")]
    UnsupportedVersion { version: u16 },
    #[error("block too large, size: {size}, limit: {limit}")]
    BlockTooLarge { size: u64, limit: u64 },
}

impl EnardError {
    pub(crate) fn new_unsupported_encryption(kind_buf: &[u8]) -> Self {
        let kind = u8_to_box_str(kind_buf);
        Self::UnsupportedEncryption { kind }
    }

    pub(crate) fn new_invalid_magic(exp: &[u8], found: &[u8]) -> Self {
        let exp = u8_to_box_str(exp);
        let found = u8_to_box_str(found);
        Self::InvalidMagic { exp, found }
    }

    pub(crate) fn new_block_size(size: u64, limit: u64) -> Self {
        Self::BlockTooLarge { size, limit }
    }
}
impl From<crypto_common::InvalidLength> for EnardError {
    fn from(_: crypto_common::InvalidLength) -> Self {
        Self::InvalidLength
    }
}

fn u8_to_box_str(slice: &[u8]) -> Box<str> {
    slice.escape_ascii().to_string().into_boxed_str()
}