use crate::utils::*;
use botan_sys::*;
pub fn derive_key_from_password<A: crate::PasswordHashAlgorithmIdentifier>(
algo: A,
out_len: usize,
passphrase: &str,
salt: &[u8],
param1: usize,
param2: usize,
param3: usize,
) -> Result<Vec<u8>> {
let algo = algo.botan_name();
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<A: crate::PasswordHashAlgorithmIdentifier>(
algo: A,
out_len: usize,
passphrase: &str,
salt: &[u8],
msec: u32,
) -> Result<(Vec<u8>, usize, usize, usize)> {
let algo = algo.botan_name();
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<A: crate::PasswordHashAlgorithmIdentifier>(
algo: A,
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(
crate::PasswordHashAlgorithm::Scrypt,
out_len,
passphrase,
salt,
n,
r,
p,
)
}