use anyhow::Result;
use ssss::{SsssConfig, unlock};
use tracing::trace;
use zeroize::Zeroizing;
pub fn gen_shares(config: &SsssConfig, key: &[u8; 32]) -> Result<Vec<String>> {
trace!("Generating shares from key");
ssss::gen_shares(config, key)
}
pub fn unlock_key(shares: &[String]) -> Result<Zeroizing<Vec<u8>>> {
Ok(Zeroizing::new(unlock(shares)?))
}
#[cfg(test)]
mod test {
use anyhow::Result;
use aws_lc_rs::rand::fill;
use rand::rng;
use ssss::{SsssConfig, remove_random_entry};
use super::{gen_shares, unlock_key};
fn gen_key() -> Result<[u8; 32]> {
let mut key = [0u8; 32];
fill(&mut key)?;
Ok(key)
}
#[test]
fn gen_key_works() -> Result<()> {
let key = gen_key()?;
let shares = gen_shares(&SsssConfig::default(), &key)?;
assert_eq!(shares.len(), 5);
Ok(())
}
#[test]
fn unlock_key_works() -> Result<()> {
let key = gen_key()?;
let mut shares = gen_shares(&SsssConfig::default(), &key)?;
assert_eq!(shares.len(), 5);
let unlocked = unlock_key(&shares)?;
assert_eq!(unlocked.len(), 32);
let mut rng = rng();
remove_random_entry(&mut rng, &mut shares);
assert_eq!(shares.len(), 4);
assert_eq!(*unlock_key(&shares)?, *unlocked);
remove_random_entry(&mut rng, &mut shares);
assert_eq!(shares.len(), 3);
assert_eq!(*unlock_key(&shares)?, *unlocked);
remove_random_entry(&mut rng, &mut shares);
assert_eq!(shares.len(), 2);
assert_ne!(*unlock_key(&shares)?, *unlocked);
Ok(())
}
}