From 9cc40aecc7b722385cdbe731026866a2432dc774 Mon Sep 17 00:00:00 2001 From: Mike Date: Sat, 21 Mar 2026 15:16:02 +0200 Subject: [PATCH] crypto.blake2b: use fixed arrays for block manipulations (#26751) --- vlib/crypto/blake2b/blake2b.v | 22 ++++++++++----------- vlib/crypto/blake2b/blake2b_block_generic.v | 12 ++++++----- vlib/crypto/blake2b/blake2b_block_test.v | 8 +++++--- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/vlib/crypto/blake2b/blake2b.v b/vlib/crypto/blake2b/blake2b.v index 2176684ca..dd93424a4 100644 --- a/vlib/crypto/blake2b/blake2b.v +++ b/vlib/crypto/blake2b/blake2b.v @@ -49,17 +49,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/blake2b/blake2b_block_generic.v b/vlib/crypto/blake2b/blake2b_block_generic.v index df001d0a4..e69cd36c5 100644 --- a/vlib/crypto/blake2b/blake2b_block_generic.v +++ b/vlib/crypto/blake2b/blake2b_block_generic.v @@ -12,7 +12,7 @@ import math.bits // mixing function g @[direct_array_access; inline] -fn g(mut v []u64, a u8, b u8, c u8, d u8, x u64, y u64) { +fn g(mut v [16]u64, a u8, b u8, c u8, d u8, x u64, y u64) { v[a] = v[a] + v[b] + x v[d] = bits.rotate_left_64((v[d] ^ v[a]), nr1) v[c] = v[c] + v[d] @@ -25,7 +25,7 @@ fn g(mut v []u64, a u8, b u8, c u8, d u8, x u64, y u64) { // one complete mixing round with the function g @[direct_array_access; inline] -fn (d Digest) mixing_round(mut v []u64, s []u8) { +fn (d Digest) mixing_round(mut v [16]u64, 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 []u64, s []u8) { @[direct_array_access] fn (mut d Digest) f(f bool) { // initialize the working vector - mut v := []u64{len: 0, cap: 16} - v << d.h[..8] - v << iv[..8] + mut v := [16]u64{} + for i in 0 .. 8 { + v[i] = d.h[i] + v[i + 8] = iv[i] + } v[12] ^= d.t.lo v[13] ^= d.t.hi diff --git a/vlib/crypto/blake2b/blake2b_block_test.v b/vlib/crypto/blake2b/blake2b_block_test.v index b45c9c3a5..d907528ac 100644 --- a/vlib/crypto/blake2b/blake2b_block_test.v +++ b/vlib/crypto/blake2b/blake2b_block_test.v @@ -91,9 +91,11 @@ fn test_mixing_function_g() { f := true // initialize the working vector from the digest and IV values - mut v := []u64{len: 0, cap: 16} - v << d.h[..8] - v << iv[..8] + mut v := [16]u64{} + for i in 0 .. 8 { + v[i] = d.h[i] + v[i + 8] = iv[i] + } // fold in the 128-bit message length v[12] ^= d.t.lo -- 2.39.5