#![no_std]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![doc(
html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg",
html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg",
html_root_url = "https://docs.rs/scrypt/0.8.1"
)]
#[macro_use]
extern crate alloc;
#[cfg(feature = "std")]
extern crate std;
use hmac::Hmac;
use pbkdf2::pbkdf2;
use sha2::Sha256;
pub mod errors;
mod params;
mod romix;
#[cfg(feature = "simple")]
mod simple;
pub use crate::params::Params;
#[cfg(feature = "simple")]
pub use password_hash;
#[cfg(feature = "simple")]
pub use crate::simple::{Scrypt, ALG_ID};
pub fn scrypt(
password: &[u8],
salt: &[u8],
params: &Params,
output: &mut [u8],
) -> Result<(), errors::InvalidOutputLen> {
if output.is_empty() || output.len() / 32 > 0xffff_ffff {
return Err(errors::InvalidOutputLen);
}
let n = 1 << params.log_n;
let r128 = (params.r as usize) * 128;
let pr128 = (params.p as usize) * r128;
let nr128 = n * r128;
let mut b = vec![0u8; pr128];
pbkdf2::<Hmac<Sha256>>(password, salt, 1, &mut b);
let mut v = vec![0u8; nr128];
let mut t = vec![0u8; r128];
for chunk in &mut b.chunks_mut(r128) {
romix::scrypt_ro_mix(chunk, &mut v, &mut t, n);
}
pbkdf2::<Hmac<Sha256>>(password, &b, 1, output);
Ok(())
}