blake2b 0.6.1

BLAKE2b hash function
Documentation
extern crate blake2b;
extern crate rustc_serialize;

use blake2b::{Blake2b, blake2b, blake2b_keyed, blake2xb_keyed};

#[test]
fn multiple_updates() {
	const DATA: [u8; 1110] = [0x55; 1110];
	const SIZES: [usize; 4] = [0, 5, 50, 500];

	let mut hasher = Blake2b::default();
	for &s in &SIZES             { hasher.update(&DATA[..s]); }
	for &s in SIZES.iter().rev() { hasher.update(&DATA[..s]); }

	assert_eq!(hasher.finish(), blake2b(64, &DATA));
}

#[test]
fn selftest() {
	assert!(blake2b::selftest());
}

#[test]
fn testvectors() {
	use rustc_serialize::hex::{FromHex};
	use rustc_serialize::json::{self};

	const KAT: &'static str = include_str!("blake2-kat.json");

	#[derive(RustcDecodable)]
	struct Data {
		hash: String,
		data: String,
		key: String,
		out: String
	}

	let data: Vec<Data> = json::decode(KAT).unwrap();
	for d in data {
		let data = d.data.from_hex().unwrap();
		let key = d.key.from_hex().unwrap();
		let out = d.out.from_hex().unwrap();

		match &*d.hash {
			"blake2b" => {
				assert_eq!(
					&blake2b_keyed(out.len(), &key, &data),
					&out[..]
				);
			}
			"blake2xb" => {
				let mut hash = Vec::with_capacity(out.len());
				for h in blake2xb_keyed(Some(out.len() as u32), &key, &data) {
					hash.extend_from_slice(&h);
				}

				assert_eq!(hash, out);
			}
			"blake2bp" => {}
			hash => { unreachable!(hash); }
		}
	}
}