use dat::crypt::CryptAlgorithm;
use dat::crypt::CryptAlgorithm::{AES128GCMN, AES256GCMN};
use dat::dat_key::{DatKeySet, DatKeySetActive};
use dat::error::DatError;
use dat::sign::SignAlgorithm;
use dat::sign::SignAlgorithm::{P256, P384, P521};
use dat::util::now_unix_timestamp;
use rand::RngExt;
fn rand_string() -> String {
let mut rng = rand::rng();
(0..100).map(|_| { rng.sample(rand::distr::Alphanumeric) as char }).collect()
}
fn unit(fail_key: &DatKeySetActive, kid: String, sign_alg: SignAlgorithm, crypt_alg: CryptAlgorithm, plain: String, secure: String) -> Result<(), DatError> {
let tag = format!("dat_key.{}.{}.{}", sign_alg.to_str(), crypt_alg.to_str(), &kid);
let new_key = DatKeySet::generate(kid, sign_alg, crypt_alg, now_unix_timestamp()? - 10, now_unix_timestamp()? + 600, 60)?;
let new_key_str = new_key.to_json()?;
let new_key_active = new_key.into_active()?;
let read_key = DatKeySet::from_json(&new_key_str)?;
let read_key_active = read_key.into_active()?;
let dat = new_key_active.to_dat((plain.clone(), secure.clone()))?;
println!("{tag}: {}", dat);
let (de_plain, de_secure) = read_key_active.verify(dat.clone())?;
assert_eq!(plain, de_plain);
assert_eq!(secure, de_secure);
assert!(fail_key.verify(dat.clone()).is_err());
Ok(())
}
#[test]
fn test() {
let sign_alg_arr = [P256, P384, P521];
let crypt_alg_arr = [AES128GCMN, AES256GCMN];
let fail_key = &DatKeySet::generate("x".to_string(), P256, AES256GCMN, now_unix_timestamp().unwrap() - 10, now_unix_timestamp().unwrap() + 600, 60).unwrap().into_active().unwrap();
sign_alg_arr.iter().for_each(|sign_alg| {
crypt_alg_arr.iter().for_each(|crypt_alg| {
(1..20).for_each(|_| {
let kid = rand_string();
let plain = rand_string();
let secure = rand_string();
assert!(unit(fail_key, kid, *sign_alg, *crypt_alg, plain, secure).is_ok())
});
assert!(unit(fail_key, "".to_string(), *sign_alg, *crypt_alg, "".to_string(), "".to_string()).is_ok())
});
});
}