use native_ossl::mac::{MacAlg, MacCtx};
use native_ossl::params::ParamBuilder;
use native_ossl::pkey::KeygenCtx;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let salt = b"random-salt-value";
let _params = ParamBuilder::new()?
.push_utf8_string(c"digest", c"SHA2-256")?
.push_uint(c"iterations", 600_000)?
.push_octet_slice(c"salt", salt)?
.build()?;
println!("Params array with string, uint, and octet built: OK");
let hmac_alg = MacAlg::fetch(c"HMAC", None)?;
let mut mac_ctx = MacCtx::new(&hmac_alg)?;
let mac_params = ParamBuilder::new()?
.push_utf8_string(c"digest", c"SHA2-256")?
.build()?;
mac_ctx.init(b"secret key", Some(&mac_params))?;
mac_ctx.update(b"authenticated data")?;
let size = mac_ctx.mac_size();
let mut out = vec![0u8; size];
let n = mac_ctx.finish(&mut out)?;
println!("HMAC result ({n} bytes): {}", hex::encode(&out[..n]));
let rsa_params = ParamBuilder::new()?.push_uint(c"bits", 2048)?.build()?;
let mut kgen = KeygenCtx::new(c"RSA")?;
kgen.set_params(&rsa_params)?;
let key = kgen.generate()?;
println!("RSA key generated: {} bits", key.bits());
let ec_params = ParamBuilder::new()?
.push_utf8_string(c"group", c"P-256")?
.build()?;
let mut ec_kgen = KeygenCtx::new(c"EC")?;
ec_kgen.set_params(&ec_params)?;
let ec_key = ec_kgen.generate()?;
println!("EC P-256 key generated: {} bits", ec_key.bits());
Ok(())
}