mod config;
mod error;
mod finite_field;
pub mod hsss;
mod shamir;
mod storage;
pub use config::{Config, SplitMode};
pub use error::{Result, ShamirError};
pub use finite_field::FiniteField;
pub use hsss::{AccessLevel, HierarchicalShare, Hsss, HsssBuilder};
pub use shamir::{Dealer, ShamirShare, ShamirShareBuilder, Share, ShareView};
pub use storage::{FileShareStore, ShareStore};
pub mod prelude {
pub use super::{
AccessLevel, Config, Dealer, FileShareStore, HierarchicalShare, Hsss, HsssBuilder, Result,
ShamirError, ShamirShare, ShamirShareBuilder, Share, ShareView, ShareStore, SplitMode,
};
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::tempdir;
#[test]
fn test_full_workflow() -> Result<()> {
let temp_dir = tempdir()?;
let mut store = FileShareStore::new(temp_dir.path())?;
let secret = b"This is a secret message that needs to be protected!";
let mut shamir = ShamirShare::builder(5, 3).build()?;
let shares = shamir.split(secret)?;
for share in &shares {
store.store_share(share)?;
}
let available_shares = store.list_shares()?;
assert_eq!(available_shares.len(), 5);
let mut reconstruction_shares = Vec::new();
for &index in &available_shares[0..3] {
reconstruction_shares.push(store.load_share(index)?);
}
let reconstructed = ShamirShare::reconstruct(&reconstruction_shares)?;
assert_eq!(&reconstructed, secret);
Ok(())
}
#[test]
fn test_with_config() -> Result<()> {
let temp_dir = tempdir()?;
let mut store = FileShareStore::new(temp_dir.path())?;
let _config = Config::new()
.with_chunk_size(1024)?
.with_mode(SplitMode::Sequential)
.with_compression(true)
.with_integrity_check(true);
let secret = b"Secret data with custom configuration";
let mut shamir = ShamirShare::builder(5, 3).build()?;
let shares = shamir.split(secret)?;
for share in &shares {
store.store_share(share)?;
}
let mut loaded_shares = Vec::new();
for i in 1..=3 {
loaded_shares.push(store.load_share(i)?);
}
let reconstructed = ShamirShare::reconstruct(&loaded_shares)?;
assert_eq!(&reconstructed, secret);
Ok(())
}
#[test]
fn test_error_handling() {
assert!(matches!(
ShamirShare::builder(2, 3).build(),
Err(ShamirError::ThresholdTooLarge { .. })
));
let mut shamir = ShamirShare::builder(5, 3).build().unwrap();
let shares = shamir.split(b"test").unwrap();
assert!(matches!(
ShamirShare::reconstruct(&shares[0..2]),
Err(ShamirError::InsufficientShares { .. })
));
}
}