blake2 0.8.1

BLAKE2 hash functions

An implementation of the BLAKE2 hash functions.

Usage

Blake2b can be used in the following way:

# #[macro_use] extern crate hex_literal;
# extern crate blake2;
# fn main() {
use blake2::{Blake2b, Blake2s, Digest};

// create a Blake2b object
let mut hasher = Blake2b::new();

// write input message
hasher.input(b"hello world");

// read hash digest and consume hasher
let res = hasher.result();
assert_eq!(res[..], hex!("
021ced8799296ceca557832ab941a50b4a11f83478cf141f51f933f653ab9fbc
c05a037cddbed06e309bf334942c4e58cdf1a46e237911ccd7fcf9787cbc7fd0
")[..]);

// same example for `Blake2s`:
let mut hasher = Blake2s::new();
hasher.input(b"hello world");
let res = hasher.result();
assert_eq!(res[..], hex!("
9aec6806794561107e594b1f6a8a6b0c92a0cba9acf5e5e93cca06f781813b0b
")[..]);
# }

Also see RustCrypto/hashes readme.

Variable output size

If you need variable sized output you can use VarBlake2b and VarBlake2s which support variable output sizes through VariableOutput trait. Input trait has to be imported as well.

use blake2::VarBlake2b;
use blake2::digest::{Input, VariableOutput};

let mut hasher = VarBlake2b::new(10).unwrap();
hasher.input(b"my_input");
hasher.variable_result(|res| {
assert_eq!(res, [44, 197, 92, 132, 228, 22, 146, 78, 100, 0])
})

Message Authentication Code (MAC)

BLAKE2 can be used as a MAC without any additional constructs:

use blake2::Blake2b;
use blake2::crypto_mac::Mac;

let mut hasher = Blake2b::new_varkey(b"my key").unwrap();
hasher.input(b"hello world");

// `result` has type `MacResult` which is a thin wrapper around array of
// bytes for providing constant time equality check
let result = hasher.result();
// To get underlying array use `code` method, but be carefull, since
// incorrect use of the code value may permit timing attacks which defeat
// the security provided by the `MacResult`
let code_bytes = result.code();

// To verify the message it's recommended to use `verify` method
let mut hasher = Blake2b::new_varkey(b"my key").unwrap();
hasher.input(b"hello world");
// `verify` return `Ok(())` if code is correct, `Err(MacError)` otherwise
hasher.verify(&code_bytes).unwrap();

Acknowledgment

Based on the blake2-rfc crate.