| // { dg-options "-w" } |
| #![feature(no_core)] |
| #![no_core] |
| |
| const BLOCK_LEN: usize = 64; |
| |
| const IV: [u32; 8] = [ |
| 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19, |
| ]; |
| |
| struct ChunkState { |
| chaining_value: [u32; 8], |
| chunk_counter: u64, |
| block: [u8; BLOCK_LEN], |
| block_len: u8, |
| blocks_compressed: u8, |
| flags: u32, |
| } |
| |
| impl ChunkState { |
| fn new(key_words: [u32; 8], chunk_counter: u64, flags: u32) -> Self { |
| Self { |
| chaining_value: key_words, |
| chunk_counter, |
| block: [0; BLOCK_LEN], |
| block_len: 0, |
| blocks_compressed: 0, |
| flags, |
| } |
| } |
| } |
| |
| pub struct Hasher { |
| chunk_state: ChunkState, |
| key_words: [u32; 8], |
| cv_stack: [[u32; 8]; 54], // Space for 54 subtree chaining values: |
| cv_stack_len: u8, // 2^54 * CHUNK_LEN = 2^64 |
| flags: u32, |
| } |
| |
| impl Hasher { |
| fn new_internal(key_words: [u32; 8], flags: u32) -> Self { |
| Self { |
| chunk_state: ChunkState::new(key_words, 0, flags), |
| key_words, |
| cv_stack: [[0; 8]; 54], |
| cv_stack_len: 0, |
| flags, |
| } |
| } |
| |
| /// Construct a new `Hasher` for the regular hash function. |
| pub fn new() -> Self { |
| Self::new_internal(IV, 0) |
| } |
| } |