| ... | @@ -70,7 +70,7 @@ fn g(state: *[16]u32, a: usize, b: usize, c: usize, d: usize, mx: u32, my: u32) | ... | @@ -70,7 +70,7 @@ fn g(state: *[16]u32, a: usize, b: usize, c: usize, d: usize, mx: u32, my: u32) |
| 70 | state[b] = math.rotr(u32, state[b] ^ state[c], 7); | 70 | state[b] = math.rotr(u32, state[b] ^ state[c], 7); |
| 71 | } | 71 | } |
| 72 | | 72 | |
| 73 | fn round(state: *[16]u32, msg: *const [16]u32, schedule: *const [16]u8) void { | 73 | fn round(state: *[16]u32, msg: [16]u32, schedule: [16]u8) void { |
| 74 | // Mix the columns. | 74 | // Mix the columns. |
| 75 | g(state, 0, 4, 8, 12, msg[schedule[0]], msg[schedule[1]]); | 75 | g(state, 0, 4, 8, 12, msg[schedule[0]], msg[schedule[1]]); |
| 76 | g(state, 1, 5, 9, 13, msg[schedule[2]], msg[schedule[3]]); | 76 | g(state, 1, 5, 9, 13, msg[schedule[2]], msg[schedule[3]]); |
| ... | @@ -85,8 +85,8 @@ fn round(state: *[16]u32, msg: *const [16]u32, schedule: *const [16]u8) void { | ... | @@ -85,8 +85,8 @@ fn round(state: *[16]u32, msg: *const [16]u32, schedule: *const [16]u8) void { |
| 85 | } | 85 | } |
| 86 | | 86 | |
| 87 | fn compress( | 87 | fn compress( |
| 88 | chaining_value: *const [8]u32, | 88 | chaining_value: [8]u32, |
| 89 | block_words: *const [16]u32, | 89 | block_words: [16]u32, |
| 90 | block_len: u32, | 90 | block_len: u32, |
| 91 | counter: u64, | 91 | counter: u64, |
| 92 | flags: u8, | 92 | flags: u8, |
| ... | @@ -109,7 +109,7 @@ fn compress( | ... | @@ -109,7 +109,7 @@ fn compress( |
| 109 | block_len, | 109 | block_len, |
| 110 | flags, | 110 | flags, |
| 111 | }; | 111 | }; |
| 112 | for (MSG_SCHEDULE) |*schedule| { | 112 | for (MSG_SCHEDULE) |schedule| { |
| 113 | round(&state, block_words, schedule); | 113 | round(&state, block_words, schedule); |
| 114 | } | 114 | } |
| 115 | for (chaining_value) |_, i| { | 115 | for (chaining_value) |_, i| { |
| ... | @@ -143,8 +143,8 @@ const Output = struct { | ... | @@ -143,8 +143,8 @@ const Output = struct { |
| 143 | | 143 | |
| 144 | fn chaining_value(self: *Output) [8]u32 { | 144 | fn chaining_value(self: *Output) [8]u32 { |
| 145 | return first_8_words(compress( | 145 | return first_8_words(compress( |
| 146 | &self.input_chaining_value, | 146 | self.input_chaining_value, |
| 147 | &self.block_words, | 147 | self.block_words, |
| 148 | self.block_len, | 148 | self.block_len, |
| 149 | self.counter, | 149 | self.counter, |
| 150 | self.flags, | 150 | self.flags, |
| ... | @@ -156,8 +156,8 @@ const Output = struct { | ... | @@ -156,8 +156,8 @@ const Output = struct { |
| 156 | var output_block_counter: usize = 0; | 156 | var output_block_counter: usize = 0; |
| 157 | while (out_block_it.next()) |out_block| { | 157 | while (out_block_it.next()) |out_block| { |
| 158 | var words = compress( | 158 | var words = compress( |
| 159 | &self.input_chaining_value, | 159 | self.input_chaining_value, |
| 160 | &self.block_words, | 160 | self.block_words, |
| 161 | self.block_len, | 161 | self.block_len, |
| 162 | output_block_counter, | 162 | output_block_counter, |
| 163 | self.flags | ROOT, | 163 | self.flags | ROOT, |
| ... | @@ -216,8 +216,8 @@ const ChunkState = struct { | ... | @@ -216,8 +216,8 @@ const ChunkState = struct { |
| 216 | var block_words: [16]u32 = undefined; | 216 | var block_words: [16]u32 = undefined; |
| 217 | words_from_little_endian_bytes(&self.block, &block_words); | 217 | words_from_little_endian_bytes(&self.block, &block_words); |
| 218 | self.chaining_value = first_8_words(compress( | 218 | self.chaining_value = first_8_words(compress( |
| 219 | &self.chaining_value, | 219 | self.chaining_value, |
| 220 | &block_words, | 220 | block_words, |
| 221 | BLOCK_LEN, | 221 | BLOCK_LEN, |
| 222 | self.chunk_counter, | 222 | self.chunk_counter, |
| 223 | self.flags | self.start_flag(), | 223 | self.flags | self.start_flag(), |
| ... | @@ -232,7 +232,7 @@ const ChunkState = struct { | ... | @@ -232,7 +232,7 @@ const ChunkState = struct { |
| 232 | } | 232 | } |
| 233 | } | 233 | } |
| 234 | | 234 | |
| 235 | fn output(self: *ChunkState) Output { | 235 | fn output(self: *const ChunkState) Output { |
| 236 | var block_words: [16]u32 = undefined; | 236 | var block_words: [16]u32 = undefined; |
| 237 | words_from_little_endian_bytes(&self.block, &block_words); | 237 | words_from_little_endian_bytes(&self.block, &block_words); |
| 238 | return Output{ | 238 | return Output{ |
| ... | @@ -297,9 +297,9 @@ pub const Blake3 = struct { | ... | @@ -297,9 +297,9 @@ pub const Blake3 = struct { |
| 297 | } | 297 | } |
| 298 | | 298 | |
| 299 | /// Construct a new `Blake3` for the keyed hash function. | 299 | /// Construct a new `Blake3` for the keyed hash function. |
| 300 | pub fn init_keyed(key: *const [KEY_LEN]u8) Blake3 { | 300 | pub fn init_keyed(key: [KEY_LEN]u8) Blake3 { |
| 301 | var key_words: [8]u32 = undefined; | 301 | var key_words: [8]u32 = undefined; |
| 302 | words_from_little_endian_bytes(key, &key_words); | 302 | words_from_little_endian_bytes(key[0..], &key_words); |
| 303 | return Blake3.init_internal(key_words, KEYED_HASH); | 303 | return Blake3.init_internal(key_words, KEYED_HASH); |
| 304 | } | 304 | } |
| 305 | | 305 | |
| ... | @@ -550,7 +550,7 @@ const reference_test = .{ | ... | @@ -550,7 +550,7 @@ const reference_test = .{ |
| 550 | }, | 550 | }, |
| 551 | }; | 551 | }; |
| 552 | | 552 | |
| 553 | fn test_blake3(hasher: *Blake3, input_len: usize, expected_hex: *const [262]u8) void { | 553 | fn test_blake3(hasher: *Blake3, input_len: usize, expected_hex: [262]u8) void { |
| 554 | // Setup input pattern | 554 | // Setup input pattern |
| 555 | var input_pattern: [251]u8 = undefined; | 555 | var input_pattern: [251]u8 = undefined; |
| 556 | for (input_pattern) |*e, i| e.* = @truncate(u8, i); | 556 | for (input_pattern) |*e, i| e.* = @truncate(u8, i); |
| ... | @@ -570,18 +570,18 @@ fn test_blake3(hasher: *Blake3, input_len: usize, expected_hex: *const [262]u8) | ... | @@ -570,18 +570,18 @@ fn test_blake3(hasher: *Blake3, input_len: usize, expected_hex: *const [262]u8) |
| 570 | | 570 | |
| 571 | // Compare to expected value | 571 | // Compare to expected value |
| 572 | var expected_bytes: [expected_hex.len / 2]u8 = undefined; | 572 | var expected_bytes: [expected_hex.len / 2]u8 = undefined; |
| 573 | fmt.hexToBytes(expected_bytes[0..], expected_hex) catch unreachable; | 573 | fmt.hexToBytes(expected_bytes[0..], expected_hex[0..]) catch unreachable; |
| 574 | testing.expectEqual(actual_bytes, expected_bytes); | 574 | testing.expectEqual(actual_bytes, expected_bytes); |
| 575 | } | 575 | } |
| 576 | | 576 | |
| 577 | test "BLAKE3 reference test cases" { | 577 | test "BLAKE3 reference test cases" { |
| 578 | var hash = &Blake3.init(); | 578 | var hash = &Blake3.init(); |
| 579 | var keyed_hash = &Blake3.init_keyed(reference_test.key); | 579 | var keyed_hash = &Blake3.init_keyed(reference_test.key.*); |
| 580 | var derive_key = &Blake3.init_derive_key(reference_test.context_string); | 580 | var derive_key = &Blake3.init_derive_key(reference_test.context_string); |
| 581 | | 581 | |
| 582 | for (reference_test.cases) |t| { | 582 | for (reference_test.cases) |t| { |
| 583 | test_blake3(hash, t.input_len, t.hash); | 583 | test_blake3(hash, t.input_len, t.hash.*); |
| 584 | test_blake3(keyed_hash, t.input_len, t.keyed_hash); | 584 | test_blake3(keyed_hash, t.input_len, t.keyed_hash.*); |
| 585 | test_blake3(derive_key, t.input_len, t.derive_key); | 585 | test_blake3(derive_key, t.input_len, t.derive_key.*); |
| 586 | } | 586 | } |
| 587 | } | 587 | } |