ethsign-crypto 0.3.0

Pure Rust drop-in replacement for the `parity-crypto` crate
Documentation
//! Scrypt key derivation wrapper around the `scrypt` crate.

pub use scrypt::errors::InvalidParams as ScryptError;

use super::{KEY_LENGTH, KEY_LENGTH_AES};

pub fn derive_key(pass: &[u8], salt: &[u8], n: u32, p: u32, r: u32) -> Result<(Vec<u8>, Vec<u8>), ScryptError> {
    let log_n = (32 - n.leading_zeros() - 1) as u8;
    let mut derived_key = vec![0u8; KEY_LENGTH];
    let scrypt_params = scrypt::Params::new(log_n, r, p, KEY_LENGTH)?;
    scrypt::scrypt(pass, salt, &scrypt_params, &mut derived_key).expect("derived_key is long enough; qed");
    let derived_right_bits = &derived_key[0..KEY_LENGTH_AES];
    let derived_left_bits = &derived_key[KEY_LENGTH_AES..KEY_LENGTH];
    Ok((derived_right_bits.to_vec(), derived_left_bits.to_vec()))
}