3 stable releases

1.2.0 Jun 23, 2019
1.1.0 Jun 23, 2019
1.0.0 Jun 23, 2019

#2030 in Cryptography

Apache-2.0

190KB
3.5K SLoC

C 2.5K SLoC // 0.2% comments Rust 1K SLoC // 0.1% comments

Argon2 Bindings

Build Status crates.io docs.rs

Bindings to the Argon2 C library for Rust. The C implementation can be found at https://github.com/P-H-C/phc-winner-argon2

NOTE: The crate exposed by this package is called argon2 and not just_argon2

Example Usage

fn main() {
    const HASHLEN: usize = 32;
    const SALTLEN: usize = 16;
    const PWD: &[u8]     = b"password";
    const PWDLEN: usize  = 8;

    // so these don't get out of sync
    assert_eq!(PWD.len(), PWDLEN);

    let t_cost      = 2;            // 1-pass computation
    let m_cost      = 1 << 16;      // 64 mebibytes memory usage
    let parallelism = 1;            // number of threads and lanes

    let mut hash1   = [0u8; HASHLEN];
    let mut hash2   = [0u8; HASHLEN];
    let mut salt    = [0u8; SALTLEN];
    let mut pwd     = [0u8; PWDLEN];

    // Copy the password string into the array.
    pwd.copy_from_slice(PWD);

    // High-level API
    argon2::i_hash_raw(t_cost, m_cost, parallelism, Some(&mut pwd), Some(&mut salt), &mut hash1).expect("Error hashing using high-level API.");

    // Low-level API
    let mut context = argon2::Context {
        out:        &mut hash2,
        pwd:        Some(&mut pwd),
        salt:       Some(&mut salt),
        secret:     None,
        ad:         None,
        t_cost:     t_cost,
        m_cost:     m_cost,
        lanes:      parallelism,
        threads:    parallelism,
        version:    argon2::Version::Version13,
        flags:      argon2::Flags::DEFAULT,
    };
    argon2::i_ctx(&mut context).expect("Error hashing using low-level API.");

    assert_eq!(&hash1[0..], &hash2[0..], "Hashes do not match.");

    println!("Hashes match.");
}

Dependencies

~78–390KB