use crypt_io::kdf;
fn main() -> Result<(), crypt_io::Error> {
let master = [0x42u8; 32];
let encrypt_key = kdf::hkdf_sha256(&master, None, b"myapp:encrypt:v1", 32)?;
let mac_key = kdf::hkdf_sha256(&master, None, b"myapp:mac:v1", 32)?;
let session_key = kdf::hkdf_sha256(&master, None, b"myapp:session:v1", 32)?;
println!("encrypt_key[..8] = {:02x?}", &encrypt_key[..8]);
println!("mac_key[..8] = {:02x?}", &mac_key[..8]);
println!("session_key[..8] = {:02x?}", &session_key[..8]);
assert_ne!(encrypt_key, mac_key);
assert_ne!(encrypt_key, session_key);
assert_ne!(mac_key, session_key);
let again = kdf::hkdf_sha256(&master, None, b"myapp:encrypt:v1", 32)?;
assert_eq!(encrypt_key, again);
println!("Re-derivation matches — KDF is deterministic.");
let user_salt = b"random-user-salt-stored-in-db";
let user_key = kdf::hkdf_sha256(&master, Some(user_salt), b"myapp:user:v1", 32)?;
println!("user_key[..8] = {:02x?}", &user_key[..8]);
assert_ne!(encrypt_key, user_key);
let big = kdf::hkdf_sha256(&master, None, b"myapp:bundle:v1", 96)?;
let (k1, rest) = big.split_at(32);
let (k2, k3) = rest.split_at(32);
println!(
"3-way split: k1[..4]={:02x?}, k2[..4]={:02x?}, k3[..4]={:02x?}",
&k1[..4],
&k2[..4],
&k3[..4],
);
Ok(())
}