#![allow(clippy::unwrap_used)]
#![allow(clippy::expect_used)]
#![allow(clippy::print_stdout)]
use latticearc::{
CryptoConfig, SecurityLevel, SecurityMode, decrypt_aes_gcm, derive_key,
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...");
let password = b"correct horse battery staple";
let salt = b"unique-application-salt-v1";
let enc_key =
derive_key(password, salt, 32, SecurityMode::Unverified).expect("key derivation failed");
println!(" Derived {} byte encryption key", enc_key.len());
let enc_key2 = derive_key(password, salt, 32, SecurityMode::Unverified).unwrap();
assert_eq!(enc_key, enc_key2, "KDF must be deterministic");
println!(" Determinism verified: same inputs produce same key");
println!("\nStep 3: Encrypt sensitive data...");
let original_data = b"Patient ID: 12345\nDiagnosis: Healthy\nSSN: 123-45-6789";
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! ===");
}