use rust_keyvault::backup::{BackupConfig, VaultBackup};
use rust_keyvault::export::ExportedKey;
use rust_keyvault::key::{SecretKey, VersionedKey};
use rust_keyvault::storage::*;
use rust_keyvault::*;
use std::time::SystemTime;
fn main() -> Result<()> {
println!("Verifying README examples...\n");
let temp_dir = tempfile::tempdir()?;
println!("1. Basic Usage Example");
{
let config = StorageConfig {
encrypted: true,
..Default::default()
};
let mut store = FileStore::new(temp_dir.path().join("basic"), config)?;
store.init_with_password(b"your-secure-password")?;
let base_id = KeyId::generate_base()?;
let secret_key = SecretKey::generate(Algorithm::ChaCha20Poly1305)?;
let metadata = KeyMetadata {
id: base_id.clone(),
base_id: base_id.clone(),
algorithm: Algorithm::ChaCha20Poly1305,
created_at: SystemTime::now(),
expires_at: None,
state: KeyState::Active,
version: 1,
};
let versioned_key = VersionedKey {
key: secret_key,
metadata,
};
store.store(versioned_key)?;
let retrieved = store.retrieve(&base_id)?;
println!(" Key algorithm: {:?}", retrieved.key.algorithm());
}
println!("\n2. Key Rotation Example");
{
let config = StorageConfig::default();
let mut store = FileStore::new(temp_dir.path().join("rotation"), config)?;
let base_id = KeyId::generate_base()?;
let secret_key = SecretKey::generate(Algorithm::ChaCha20Poly1305)?;
let metadata = KeyMetadata {
id: base_id.clone(),
base_id: base_id.clone(),
algorithm: Algorithm::ChaCha20Poly1305,
created_at: SystemTime::now(),
expires_at: None,
state: KeyState::Active,
version: 1,
};
store.store(VersionedKey {
key: secret_key,
metadata,
})?;
let rotated_key = store.rotate_key(&base_id)?;
println!(" New version: {}", rotated_key.metadata.version);
let versions = store.get_key_versions(&base_id)?;
println!(" Total versions: {}", versions.len());
let latest = store.get_latest_key(&base_id)?;
println!(" Latest version: {}", latest.metadata.version);
}
println!("\n3. Import/Export Example");
{
let config = StorageConfig::default();
let mut store = FileStore::new(temp_dir.path().join("export"), config)?;
let base_id = KeyId::generate_base()?;
let secret_key = SecretKey::generate(Algorithm::ChaCha20Poly1305)?;
let metadata = KeyMetadata {
id: base_id.clone(),
base_id: base_id.clone(),
algorithm: Algorithm::ChaCha20Poly1305,
created_at: SystemTime::now(),
expires_at: None,
state: KeyState::Active,
version: 1,
};
store.store(VersionedKey {
key: secret_key,
metadata,
})?;
let exported = store.export_key(&base_id, b"export-password")?;
let json_export = exported.to_json()?;
let export_file = temp_dir.path().join("exported_key.json");
std::fs::write(&export_file, &json_export)?;
println!(" Exported to JSON: {} bytes", json_export.len());
let mut target_store =
FileStore::new(temp_dir.path().join("target"), StorageConfig::default())?;
let json_str = std::fs::read_to_string(&export_file)?;
let exported_key = ExportedKey::from_json(&json_str)?;
let imported_id = target_store.import_key(&exported_key, b"export-password")?;
println!(" ✓ Imported key with ID: {}", imported_id);
}
println!("\n4. Backup/Restore Example");
{
let config = StorageConfig::default();
let mut store = FileStore::new(temp_dir.path().join("backup"), config)?;
for i in 0..3 {
let base_id = KeyId::from_bytes([i; 16]);
let secret_key = SecretKey::generate(Algorithm::ChaCha20Poly1305)?;
let metadata = KeyMetadata {
id: base_id.clone(),
base_id: base_id.clone(),
algorithm: Algorithm::ChaCha20Poly1305,
created_at: SystemTime::now(),
expires_at: None,
state: KeyState::Active,
version: 1,
};
store.store(VersionedKey {
key: secret_key,
metadata,
})?;
}
let backup_config = BackupConfig {
include_audit_logs: true,
compress: true,
encryption_password: b"backup-password".to_vec(),
comment: Some("Production backup".to_string()),
};
println!(" Creating backup (takes ~10s due to Argon2)...");
let backup = store.backup(b"backup-password", backup_config)?;
let backup_json = backup.to_json()?;
let backup_file = temp_dir.path().join("vault.backup.json");
std::fs::write(&backup_file, &backup_json)?;
println!(" Backup created: {} bytes", backup_json.len());
println!(" Restoring backup (takes ~10s due to Argon2)...");
let backup_str = std::fs::read_to_string(&backup_file)?;
let backup = VaultBackup::from_json(&backup_str)?;
let mut restored_store =
FileStore::new(temp_dir.path().join("restored"), StorageConfig::default())?;
let restored_count = restored_store.restore(&backup, b"backup-password")?;
println!(" Restored {} keys", restored_count);
}
println!("\nAll README examples verified successfully!");
Ok(())
}