kestrel_ffi/
lib.rs

1use libc::{c_uchar, c_uint, size_t};
2
3use kestrel_crypto::scrypt as ktl_scrypt;
4
5/// Derives a secret key from a password and a salt using scrypt.
6/// Recommended parameters are n = 32768, r = 8, p = 1
7/// Parameter n must be larger than 1 and a power of 2
8#[no_mangle]
9pub extern "C" fn scrypt(
10    password: *const c_uchar,
11    password_len: size_t,
12    salt: *const c_uchar,
13    salt_len: size_t,
14    n: c_uint,
15    r: c_uint,
16    p: c_uint,
17    derived_key: *mut c_uchar,
18    dk_len: size_t,
19) {
20    let kpass = unsafe { std::slice::from_raw_parts(password as *const u8, password_len) };
21
22    let ksalt = unsafe { std::slice::from_raw_parts(salt as *const u8, salt_len) };
23
24    let kderived_key = unsafe { std::slice::from_raw_parts_mut(derived_key as *mut u8, dk_len) };
25
26    let dk = ktl_scrypt(kpass, ksalt, n, r, p, kderived_key.len());
27
28    kderived_key.copy_from_slice(dk.as_slice());
29}