use crate::utils::*;
use botan_sys::*;
pub fn derive_key_from_password(
algo: &str,
out_len: usize,
passphrase: &str,
salt: &[u8],
param1: usize,
param2: usize,
param3: usize,
) -> Result<Vec<u8>> {
let algo = make_cstr(algo)?;
let passphrase = make_cstr(passphrase)?;
let mut output = vec![0u8; out_len];
botan_call!(
botan_pwdhash,
algo.as_ptr(),
param1,
param2,
param3,
output.as_mut_ptr(),
output.len(),
passphrase.as_ptr(),
0,
salt.as_ptr(),
salt.len()
)?;
Ok(output)
}
pub fn derive_key_from_password_timed(
algo: &str,
out_len: usize,
passphrase: &str,
salt: &[u8],
msec: u32,
) -> Result<(Vec<u8>, usize, usize, usize)> {
let algo = make_cstr(algo)?;
let passphrase = make_cstr(passphrase)?;
let mut output = vec![0u8; out_len];
let mut param1 = 0;
let mut param2 = 0;
let mut param3 = 0;
botan_call!(
botan_pwdhash_timed,
algo.as_ptr(),
msec,
&mut param1,
&mut param2,
&mut param3,
output.as_mut_ptr(),
output.len(),
passphrase.as_ptr(),
0,
salt.as_ptr(),
salt.len()
)?;
Ok((output, param1, param2, param3))
}
pub fn pbkdf(
algo: &str,
out_len: usize,
passphrase: &str,
salt: &[u8],
iterations: usize,
) -> Result<Vec<u8>> {
derive_key_from_password(algo, out_len, passphrase, salt, iterations, 0, 0)
}
pub fn scrypt(
out_len: usize,
passphrase: &str,
salt: &[u8],
n: usize,
r: usize,
p: usize,
) -> Result<Vec<u8>> {
derive_key_from_password("Scrypt", out_len, passphrase, salt, n, r, p)
}