From d05bbedab0e002f8da0a6881128b6c38e3852074 Mon Sep 17 00:00:00 2001 From: Mike Date: Sat, 21 Mar 2026 15:16:27 +0200 Subject: [PATCH] crypto.blake2s: use fixed arrays for block manipulations (#26750) * crypto.blake2s: use fixed arrays for block manipulations * improve vector initialization --- vlib/crypto/blake2s/blake2s.v | 22 ++++++++++----------- vlib/crypto/blake2s/blake2s_block_generic.v | 12 ++++++----- vlib/crypto/blake2s/blake2s_block_test.v | 8 +++++--- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/vlib/crypto/blake2s/blake2s.v b/vlib/crypto/blake2s/blake2s.v index de5b7b424..ffbebc40b 100644 --- a/vlib/crypto/blake2s/blake2s.v +++ b/vlib/crypto/blake2s/blake2s.v @@ -48,17 +48,17 @@ 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(14), 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], - [u8(11), 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4], - [u8(7), 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8], - [u8(9), 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13], - [u8(2), 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9], - [u8(12), 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11], - [u8(13), 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10], - [u8(6), 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5], - [u8(10), 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0], -] + [u8(0), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]!, + [u8(14), 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3]!, + [u8(11), 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4]!, + [u8(7), 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8]!, + [u8(9), 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13]!, + [u8(2), 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9]!, + [u8(12), 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11]!, + [u8(13), 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10]!, + [u8(6), 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5]!, + [u8(10), 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0]!, +]! struct Digest { hash_size u8 diff --git a/vlib/crypto/blake2s/blake2s_block_generic.v b/vlib/crypto/blake2s/blake2s_block_generic.v index 9a1ffee07..9cb526c85 100644 --- a/vlib/crypto/blake2s/blake2s_block_generic.v +++ b/vlib/crypto/blake2s/blake2s_block_generic.v @@ -12,7 +12,7 @@ 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] @@ -25,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 (d Digest) mixing_round(mut v []u32, s []u8) { +fn (d Digest) mixing_round(mut v [16]u32, s [16]u8) { g(mut v, 0, 4, 8, 12, d.m[s[0]], d.m[s[1]]) g(mut v, 1, 5, 9, 13, d.m[s[2]], d.m[s[3]]) g(mut v, 2, 6, 10, 14, d.m[s[4]], d.m[s[5]]) @@ -41,9 +41,11 @@ fn (d Digest) mixing_round(mut v []u32, s []u8) { @[direct_array_access] fn (mut d Digest) f(f bool) { // initialize the working vector - mut v := []u32{len: 0, cap: 16} - v << d.h[..8] - v << iv[..8] + mut v := [16]u32{} + for i in 0 .. 8 { + v[i] = d.h[i] + v[i + 8] = iv[i] + } v[12] ^= u32(d.t & 0x00000000ffffffff) v[13] ^= u32(d.t >> 32) diff --git a/vlib/crypto/blake2s/blake2s_block_test.v b/vlib/crypto/blake2s/blake2s_block_test.v index 72f308f3d..448d4aa64 100644 --- a/vlib/crypto/blake2s/blake2s_block_test.v +++ b/vlib/crypto/blake2s/blake2s_block_test.v @@ -68,9 +68,11 @@ fn test_mixing_function_g() { f := true // initialize the working vector from the digest and IV values - mut v := []u32{len: 0, cap: 16} - v << d.h[..8] - v << iv[..8] + mut v := [16]u32{} + for i in 0 .. 8 { + v[i] = d.h[i] + v[i + 8] = iv[i] + } // fold in the 64-bit message length v[12] ^= u32(d.t & 0x00000000ffffffff) -- 2.39.5