#![allow(clippy::unwrap_used)]
#![allow(clippy::expect_used)]
#![allow(clippy::print_stdout)]
use latticearc::primitives::kdf::pbkdf2::{Pbkdf2Params, pbkdf2};
use latticearc::primitives::rand::csprng::random_bytes;
use latticearc::{
CryptoConfig, SecurityLevel, SecurityMode, decrypt_aes_gcm, deserialize_signed_data,
encrypt_aes_gcm, generate_signing_keypair, hash_data, serialize_signed_data, sign_with_key,
verify,
};
fn main() {
println!("=== LatticeArc: Complete Secure Workflow ===\n");
println!("Step 1: Generate signing keypair...");
let config = CryptoConfig::new().security_level(SecurityLevel::High);
let (sign_pk, sign_sk, scheme) =
generate_signing_keypair(config).expect("signing keypair generation failed");
println!(" Scheme: {}, PK: {} bytes", scheme, sign_pk.len());
println!("\nStep 2: Derive encryption key from password via PBKDF2...");
let password = b"correct horse battery staple";
let salt = random_bytes(16);
let params = Pbkdf2Params::with_salt(&salt).iterations(600_000).key_length(32);
let derived = pbkdf2(password, ¶ms).expect("PBKDF2 derivation failed");
let enc_key: Vec<u8> = derived.key().to_vec();
println!(" Derived {}-byte encryption key (PBKDF2, 600k iters)", enc_key.len());
let derived2 = pbkdf2(password, ¶ms).expect("PBKDF2 re-derivation failed");
assert_eq!(enc_key, derived2.key(), "PBKDF2 must be deterministic for fixed salt + iters");
println!(" Determinism verified: same password + salt produce same key");
println!("\nStep 3: Encrypt sensitive data...");
let original_data = b"Record-ID: RCRD-0001\nCategory: Example\nNotes: fixture data";
let original_hash = hash_data(original_data);
println!(
" Original: {} bytes, SHA3-256: {:02x?}...",
original_data.len(),
&original_hash[..8]
);
let ciphertext = encrypt_aes_gcm(original_data, &enc_key, SecurityMode::Unverified)
.expect("encryption failed");
println!(" Ciphertext: {} bytes", ciphertext.len());
println!("\nStep 4: Sign the ciphertext...");
let config = CryptoConfig::new().security_level(SecurityLevel::High);
let signed = sign_with_key(&ciphertext, &sign_sk, &sign_pk, config).expect("signing failed");
println!(" Signed data: {} bytes, scheme: {}", signed.data.len(), signed.scheme);
println!("\nStep 5: Serialize for storage...");
let serialized = serialize_signed_data(&signed).expect("serialization failed");
println!(" Serialized: {} bytes (wire format)", serialized.len());
println!("\nStep 6: Deserialize...");
let loaded = deserialize_signed_data(&serialized).expect("deserialization failed");
println!(" Deserialized: scheme={}, data={} bytes", loaded.scheme, loaded.data.len());
println!("\nStep 7: Verify signature...");
let config = CryptoConfig::new().security_level(SecurityLevel::High);
let is_valid = verify(&loaded, config).expect("verification failed");
assert!(is_valid, "Signature must be valid");
println!(" Signature: VALID");
println!("\nStep 8: Decrypt data...");
let decrypted = decrypt_aes_gcm(&loaded.data, &enc_key, SecurityMode::Unverified)
.expect("decryption failed");
println!(" Decrypted: {} bytes", decrypted.len());
println!("\nStep 9: Verify integrity...");
assert_eq!(decrypted.as_slice(), original_data);
let decrypted_hash = hash_data(&decrypted);
assert_eq!(original_hash, decrypted_hash, "Hash mismatch");
println!(" Content: {:?}", std::str::from_utf8(&decrypted).unwrap());
println!(" SHA3-256 match: OK");
println!("\n=== Complete secure workflow passed! ===");
}