From 4a8345667a06096fc08dd9c71e7277c2eaae4b1f Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 22 Mar 2026 00:30:37 +0200 Subject: [PATCH] crypto.blake3: use fixed arrays for block manipulation (#26754) --- vlib/crypto/blake3/blake3.v | 16 ++++++++-------- vlib/crypto/blake3/blake3_block_generic.v | 17 ++++++++++------- vlib/crypto/blake3/blake3_block_test.v | 4 ++-- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/vlib/crypto/blake3/blake3.v b/vlib/crypto/blake3/blake3.v index 4f7f3994f..69f2b233d 100644 --- a/vlib/crypto/blake3/blake3.v +++ b/vlib/crypto/blake3/blake3.v @@ -49,14 +49,14 @@ const iv = [ // message word schedule permutations const sigma = [ - [u8(0), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], - [u8(2), 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8], - [u8(3), 4, 10, 12, 13, 2, 7, 14, 6, 5, 9, 0, 11, 15, 8, 1], - [u8(10), 7, 12, 9, 14, 3, 13, 15, 4, 0, 11, 2, 5, 8, 1, 6], - [u8(12), 13, 9, 11, 15, 10, 14, 8, 7, 2, 5, 3, 0, 1, 6, 4], - [u8(9), 14, 11, 5, 8, 12, 15, 1, 13, 3, 0, 10, 2, 6, 4, 7], - [u8(11), 15, 5, 0, 1, 9, 8, 6, 14, 10, 2, 12, 3, 4, 7, 13], -] + [u8(0), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]!, + [u8(2), 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8]!, + [u8(3), 4, 10, 12, 13, 2, 7, 14, 6, 5, 9, 0, 11, 15, 8, 1]!, + [u8(10), 7, 12, 9, 14, 3, 13, 15, 4, 0, 11, 2, 5, 8, 1, 6]!, + [u8(12), 13, 9, 11, 15, 10, 14, 8, 7, 2, 5, 3, 0, 1, 6, 4]!, + [u8(9), 14, 11, 5, 8, 12, 15, 1, 13, 3, 0, 10, 2, 6, 4, 7]!, + [u8(11), 15, 5, 0, 1, 9, 8, 6, 14, 10, 2, 12, 3, 4, 7, 13]!, +]! // internal flags enum Flags as u32 { diff --git a/vlib/crypto/blake3/blake3_block_generic.v b/vlib/crypto/blake3/blake3_block_generic.v index 6e7ae0bdb..ba2438ba7 100644 --- a/vlib/crypto/blake3/blake3_block_generic.v +++ b/vlib/crypto/blake3/blake3_block_generic.v @@ -8,12 +8,11 @@ module blake3 -import arrays import math.bits // mixing function g @[direct_array_access; inline] -fn g(mut v []u32, a u8, b u8, c u8, d u8, x u32, y u32) { +fn g(mut v [16]u32, a u8, b u8, c u8, d u8, x u32, y u32) { v[a] = v[a] + v[b] + x v[d] = bits.rotate_left_32((v[d] ^ v[a]), nr1) v[c] = v[c] + v[d] @@ -26,7 +25,7 @@ fn g(mut v []u32, a u8, b u8, c u8, d u8, x u32, y u32) { // one complete mixing round with the function g @[direct_array_access; inline] -fn mixing_round(mut v []u32, m []u32, s []u8) { +fn mixing_round(mut v [16]u32, m []u32, s [16]u8) { g(mut v, 0, 4, 8, 12, m[s[0]], m[s[1]]) g(mut v, 1, 5, 9, 13, m[s[2]], m[s[3]]) g(mut v, 2, 6, 10, 14, m[s[4]], m[s[5]]) @@ -41,11 +40,15 @@ fn mixing_round(mut v []u32, m []u32, s []u8) { // compression function f @[direct_array_access] fn f(h []u32, m []u32, counter u64, input_bytes u32, flags u32) []u32 { - mut v := []u32{len: 16} + mut v := [16]u32{} // initialize the working vector - arrays.copy[u32](mut v, h[..8]) - arrays.copy[u32](mut v[8..], iv[..4]) + for i in 0 .. 8 { + v[i] = h[i] + } + for i in 0 .. 4 { + v[i + 8] = iv[i] + } v[12] = u32(counter) v[13] = u32(counter >> 32) v[14] = input_bytes @@ -70,5 +73,5 @@ fn f(h []u32, m []u32, counter u64, input_bytes u32, flags u32) []u32 { v[i + 8] ^= h[i] } - return v + return v[..] } diff --git a/vlib/crypto/blake3/blake3_block_test.v b/vlib/crypto/blake3/blake3_block_test.v index 77eb1de24..763d3b723 100644 --- a/vlib/crypto/blake3/blake3_block_test.v +++ b/vlib/crypto/blake3/blake3_block_test.v @@ -11,7 +11,7 @@ module blake3 fn test_mixing_function_g() { mut v := [u32(0xfc8acca9), 0xf912414a, 0x35d175e3, 0xe9ed298f, 0xbe57eb01, 0x60ea4e71, 0x66decd93, 0xba6def8c, 0x0ba8bc5e, 0xec33f9fc, 0x6a2a29c9, 0x85c54e27, 0x3b719f82, 0x4a59df4a, - 0x0585477e, 0xf77a2e5a] + 0x0585477e, 0xf77a2e5a]! v_result := [u32(0xfc8acca9), 0x0b9ea76f, 0x35d175e3, 0xe9ed298f, 0xbe57eb01, 0x60ea4e71, 0x5a44ad65, 0xba6def8c, 0x0ba8bc5e, 0xec33f9fc, 0x6a2a29c9, 0xcd574ab5, 0x53f80752, @@ -35,7 +35,7 @@ fn test_mixing_function_g() { fn test_mixing_round_function() { mut v := [u32(0xeb9ebdcd), 0x7b78363e, 0xcdb63957, 0x4da2219b, 0x4120ce20, 0x8e7f2c43, 0x08d57788, 0x582d61ae, 0x96a4b4a3, 0xea904642, 0x92d806eb, 0x1fac731f, 0x74ccfd6d, 0x40f3ddcc, - 0x311ee8c0, 0x7936b8d3] + 0x311ee8c0, 0x7936b8d3]! m := [u32(0x20202020), 0x20202020, 0x22202020, 0x4e4f433c, 0x54584554, 0x6e5c5d3e, 0x0a3b2922, 0x20202020, 0x65722020, 0x6e727574, 0x0a3b3020, 0x20202020, 0x6c65207d, 0x69206573, -- 2.39.5