#![cfg(all(any(blake2b, blake2s), feature = "digest"))] use digest::{Digest, FixedOutputReset}; use digest::block_api::BlockSizeUser; mod common; fn check_digest( input: &[u8], expected: &[u8], expected_block_size: usize, ) { assert_eq!(::output_size(), expected.len()); assert_eq!(::block_size(), expected_block_size); /* One-shot digest via associated function. */ let out = D::digest(input); assert_eq!(out.as_slice(), expected); /* Streaming via Digest::update and finalize. */ let mut hasher = D::new(); Digest::update(&mut hasher, input); let out = hasher.finalize(); assert_eq!(out.as_slice(), expected); /* Split update via Default + Update + FixedOutputReset::finalize_reset. */ let mut hasher = D::default(); if input.len() >= 2 { let mid = input.len() / 2; Digest::update(&mut hasher, &input[..mid]); Digest::update(&mut hasher, &input[mid..]); } else { Digest::update(&mut hasher, input); } let out = hasher.finalize_reset(); assert_eq!(out.as_slice(), expected); /* After reset, the same hasher should produce the same result. */ Digest::update(&mut hasher, input); let out = hasher.finalize(); assert_eq!(out.as_slice(), expected); } #[test] #[cfg(blake2b)] fn test_digest_blake2b_512() { use wolfssl_wolfcrypt::blake2_digest::Blake2b512; common::setup(); check_digest::( b"abc", b"\xBA\x80\xA5\x3F\x98\x1C\x4D\x0D\x6A\x27\x97\xB6\x9F\x12\xF6\xE9\x4C\x21\x2F\x14\x68\x5A\xC4\xB7\x4B\x12\xBB\x6F\xDB\xFF\xA2\xD1\x7D\x87\xC5\x39\x2A\xAB\x79\x2D\xC2\x52\xD5\xDE\x45\x33\xCC\x95\x18\xD3\x8A\xA8\xDB\xF1\x92\x5A\xB9\x23\x86\xED\xD4\x00\x99\x23", 128, ); } #[test] #[cfg(blake2b)] fn test_digest_blake2b_384() { use wolfssl_wolfcrypt::blake2::BLAKE2b; use wolfssl_wolfcrypt::blake2_digest::Blake2b384; common::setup(); let mut reference = BLAKE2b::new(48).expect("Error with new()"); reference.update(b"abc").expect("Error with update()"); let mut expected = [0u8; 48]; reference.finalize(&mut expected).expect("Error with finalize()"); check_digest::(b"abc", &expected, 128); } #[test] #[cfg(blake2b)] fn test_digest_blake2b_256() { use wolfssl_wolfcrypt::blake2::BLAKE2b; use wolfssl_wolfcrypt::blake2_digest::Blake2b256; common::setup(); let mut reference = BLAKE2b::new(32).expect("Error with new()"); reference.update(b"abc").expect("Error with update()"); let mut expected = [0u8; 32]; reference.finalize(&mut expected).expect("Error with finalize()"); check_digest::(b"abc", &expected, 128); } #[test] #[cfg(blake2s)] fn test_digest_blake2s_256() { use wolfssl_wolfcrypt::blake2_digest::Blake2s256; common::setup(); check_digest::( b"abc", b"\x50\x8C\x5E\x8C\x32\x7C\x14\xE2\xE1\xA7\x2B\xA3\x4E\xEB\x45\x2F\x37\x45\x8B\x20\x9E\xD6\x3A\x29\x4D\x99\x9B\x4C\x86\x67\x59\x82", 64, ); } #[test] #[cfg(blake2s)] fn test_digest_blake2s_192() { use wolfssl_wolfcrypt::blake2::BLAKE2s; use wolfssl_wolfcrypt::blake2_digest::Blake2s192; common::setup(); let mut reference = BLAKE2s::new(24).expect("Error with new()"); reference.update(b"abc").expect("Error with update()"); let mut expected = [0u8; 24]; reference.finalize(&mut expected).expect("Error with finalize()"); check_digest::(b"abc", &expected, 64); } #[test] #[cfg(blake2s)] fn test_digest_blake2s_128() { use wolfssl_wolfcrypt::blake2::BLAKE2s; use wolfssl_wolfcrypt::blake2_digest::Blake2s128; common::setup(); let mut reference = BLAKE2s::new(16).expect("Error with new()"); reference.update(b"abc").expect("Error with update()"); let mut expected = [0u8; 16]; reference.finalize(&mut expected).expect("Error with finalize()"); check_digest::(b"abc", &expected, 64); }