use native_ossl::digest::DigestAlg;
use native_ossl::kdf::{HkdfBuilder, Pbkdf2Builder, ScryptBuilder, ScryptParams};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let sha256 = DigestAlg::fetch(c"SHA2-256", None)?;
let ikm = b"input key material";
let salt = b"random salt value";
let info = b"context / application info";
let mut okm = [0u8; 32];
HkdfBuilder::new(&sha256)
.key(ikm)
.salt(salt)
.info(info)
.derive(&mut okm)?;
println!("HKDF-SHA-256 OKM: {}", hex::encode(okm));
let prk = okm; let mut expanded = [0u8; 32];
HkdfBuilder::new(&sha256)
.key(&prk)
.info(b"expand-only context")
.mode(native_ossl::kdf::HkdfMode::ExpandOnly)
.derive(&mut expanded)?;
println!("HKDF-Expand OKM: {}", hex::encode(expanded));
let password = b"correct horse battery staple";
let pbkdf2_salt = b"nacl";
let mut dk = [0u8; 32];
Pbkdf2Builder::new(&sha256, password, pbkdf2_salt)
.iterations(600_000)
.derive(&mut dk)?;
println!("PBKDF2 derived key: {}", hex::encode(dk));
let scrypt_salt = b"NaCl";
let params = ScryptParams::default();
let mut scrypt_key = [0u8; 32];
ScryptBuilder::new(password, scrypt_salt)
.params(params)
.derive(&mut scrypt_key)?;
println!("scrypt derived key: {}", hex::encode(scrypt_key));
Ok(())
}