| // benches argon2rs against the reference c implementation at |
| // https://github.com/p-h-c/phc-winner-argon2 |
| |
| #![feature(test)] |
| |
| extern crate test; |
| extern crate argon2rs; |
| extern crate cargon; |
| |
| use argon2rs::{Argon2, defaults}; |
| use argon2rs::Variant::Argon2i; |
| use std::ptr; |
| |
| const PASSWORD: &'static [u8] = b"cargo bench --feature=simd"; |
| const SALT: &'static [u8] = b"cargo test --release"; |
| |
| #[bench] |
| fn bench_argon2rs_i(b: &mut test::Bencher) { |
| let a2 = Argon2::default(Argon2i); |
| let mut out = [0; defaults::LENGTH]; |
| b.iter(|| a2.hash(&mut out, PASSWORD, SALT, &[], &[])); |
| } |
| |
| #[bench] |
| fn bench_cargon_i(b: &mut test::Bencher) { |
| let a2 = Argon2::default(Argon2i); |
| let mut out = [0; defaults::LENGTH]; |
| let mut ctx = mk_cargon(a2, &mut out, PASSWORD, SALT, &[], &[]); |
| b.iter(|| unsafe { cargon::argon2_ctx(&mut ctx, Argon2i as usize) }); |
| } |
| |
| #[bench] |
| fn bench_argon2rs_threaded(b: &mut test::Bencher) { |
| let a2 = Argon2::new(defaults::PASSES, 4, defaults::KIB, Argon2i).unwrap(); |
| let mut out = [0; defaults::LENGTH]; |
| b.iter(|| a2.hash(&mut out, PASSWORD, SALT, &[], &[])); |
| } |
| |
| #[bench] |
| fn bench_cargon_threaded(b: &mut test::Bencher) { |
| let a2 = Argon2::new(defaults::PASSES, 4, defaults::KIB, Argon2i).unwrap(); |
| let mut out = [0; defaults::LENGTH]; |
| let mut ctx = mk_cargon(a2, &mut out, PASSWORD, SALT, &[], &[]); |
| b.iter(|| unsafe { cargon::argon2_ctx(&mut ctx, Argon2i as usize) }); |
| } |
| |
| fn mk_cargon(a2: Argon2, out: &mut [u8], p: &[u8], s: &[u8], k: &[u8], x: &[u8]) |
| -> cargon::CargonContext { |
| let (_, kib, passes, lanes) = a2.params(); |
| cargon::CargonContext { |
| out: out.as_mut_ptr(), |
| outlen: out.len() as u32, |
| pwd: p.as_ptr(), |
| pwdlen: p.len() as u32, |
| salt: s.as_ptr(), |
| saltlen: s.len() as u32, |
| secret: k.as_ptr(), |
| secretlen: k.len() as u32, |
| ad: x.as_ptr(), |
| adlen: x.len() as u32, |
| |
| t_cost: passes, |
| m_cost: kib, |
| lanes: lanes, |
| threads: lanes, |
| version: 0x10, |
| allocate_fptr: ptr::null(), |
| deallocate_fptr: ptr::null(), |
| flags: cargon::ARGON2_FLAG_CLEAR_MEMORY, |
| } |
| } |
| |
| #[test] |
| fn ensure_identical_hashes() { |
| fn comp(lanes: u32) { |
| let mut outrs = [0; defaults::LENGTH]; |
| let mut outca = [0; defaults::LENGTH]; |
| let a2 = Argon2::new(defaults::PASSES, lanes, defaults::KIB, Argon2i) |
| .unwrap(); |
| a2.hash(&mut outrs, PASSWORD, SALT, &[], &[]); |
| |
| let mut ctx = mk_cargon(a2, &mut outca, PASSWORD, SALT, &[], &[]); |
| unsafe { |
| cargon::argon2_ctx(&mut ctx, Argon2i as usize); |
| } |
| assert_eq!(outrs, outca); |
| } |
| comp(1); |
| comp(4); |
| } |