philbin 1.0.1

A pure Rust AEGIS library with SIMD and runtime CPU detection
Documentation
use philbin::easy::{Error, Key128, Key256};
use std::assert_matches;

#[cfg(feature = "rand")]
use philbin::easy::Result;

#[test]
#[cfg(feature = "rand")]
fn generate_key_not_zeros() -> Result<()> {
  // In theory, this test could be flaky. In practice, it won't be.

  assert_ne!(Key128::generate()?.expose_secret(), &[0; Key128::BYTES]);
  assert_ne!(Key256::generate()?.expose_secret(), &[0; Key256::BYTES]);

  Ok(())
}

#[test]
#[cfg(feature = "rand")]
fn generate_keys_are_different() -> Result<()> {
  // In theory, this test could be flaky. In practice, it won't be.

  assert_ne!(
    Key128::generate()?.expose_secret(),
    Key128::generate()?.expose_secret()
  );
  assert_ne!(
    Key256::generate()?.expose_secret(),
    Key256::generate()?.expose_secret()
  );

  Ok(())
}

#[test]
fn new_non_zero_input_works() {
  assert!(Key128::new([1; Key128::BYTES]).is_ok());
  assert!(Key256::new([1; Key256::BYTES]).is_ok());
}

#[test]
fn new_all_zero_key_rejected() {
  assert_matches!(
    Key128::new([0; Key128::BYTES]),
    Err(Error::AllZeroNotAllowed)
  );
}

#[test]
fn from_bytes_vec_works() {
  assert!(Key128::from_bytes(vec![1; Key128::BYTES]).is_ok());
  assert!(Key256::from_bytes(vec![1; Key256::BYTES]).is_ok());
}

#[test]
fn from_bytes_all_zero_key_rejected() {
  assert_matches!(
    Key128::from_bytes(vec![0; Key128::BYTES]),
    Err(Error::AllZeroNotAllowed)
  );
}

#[test]
fn from_bytes_short_vec_rejected() {
  assert_matches!(
    Key256::from_bytes(vec![1; Key128::BYTES]),
    Err(Error::InputBufferWrongSize)
  );
}

#[test]
fn from_bytes_long_vec_rejected() {
  assert_matches!(
    Key128::from_bytes(vec![1; Key256::BYTES]),
    Err(Error::InputBufferWrongSize)
  );
}

#[test]
fn debug_is_redacted() {
  let key = Key128::new([123; Key128::BYTES]);
  let debug = format!("{key:?}");
  assert!(!debug.contains("123"));
  assert!(debug.contains("redacted"));
}