streebog: fix bit-length counter carry propagation to 512-bit (#759)
Some checks failed
ascon-hash / set-msrv (push) Failing after 0s
ascon-hash / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
ascon-hash / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
ascon-hash / build (stable, thumbv7em-none-eabi) (push) Has been skipped
ascon-hash / build (stable, wasm32-unknown-unknown) (push) Has been skipped
ascon-hash / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
ascon-hash / test (stable) (push) Has been skipped
ascon-hash / minimal-versions (push) Failing after 0s
bash-hash / set-msrv (push) Failing after 0s
bash-hash / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
bash-hash / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
bash-hash / build (stable, thumbv7em-none-eabi) (push) Has been skipped
bash-hash / build (stable, wasm32-unknown-unknown) (push) Has been skipped
bash-hash / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
bash-hash / test (stable) (push) Has been skipped
bash-hash / minimal-versions (push) Failing after 0s
belt-hash / set-msrv (push) Failing after 0s
belt-hash / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
belt-hash / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
belt-hash / build (stable, thumbv7em-none-eabi) (push) Has been skipped
belt-hash / build (stable, wasm32-unknown-unknown) (push) Has been skipped
belt-hash / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
belt-hash / test (stable) (push) Has been skipped
belt-hash / minimal-versions (push) Failing after 1s
blake2 / set-msrv (push) Failing after 0s
blake2 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
blake2 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
blake2 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
blake2 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
blake2 / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
blake2 / test (stable) (push) Has been skipped
blake2 / cross (default, ${{needs.set-msrv.outputs.msrv}}, aarch64-unknown-linux-gnu) (push) Has been skipped
blake2 / cross (default, ${{needs.set-msrv.outputs.msrv}}, powerpc-unknown-linux-gnu) (push) Has been skipped
blake2 / cross (default, stable, aarch64-unknown-linux-gnu) (push) Has been skipped
blake2 / cross (default, stable, powerpc-unknown-linux-gnu) (push) Has been skipped
blake2 / minimal-versions (push) Failing after 1s
fsb / set-msrv (push) Failing after 0s
fsb / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
fsb / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
fsb / build (stable, thumbv7em-none-eabi) (push) Has been skipped
fsb / build (stable, wasm32-unknown-unknown) (push) Has been skipped
fsb / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
fsb / test (stable) (push) Has been skipped
gost94 / set-msrv (push) Failing after 1s
gost94 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
gost94 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
gost94 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
gost94 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
gost94 / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
gost94 / test (stable) (push) Has been skipped
gost94 / minimal-versions (push) Failing after 0s
groestl / set-msrv (push) Failing after 0s
groestl / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
groestl / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
groestl / build (stable, thumbv7em-none-eabi) (push) Has been skipped
groestl / build (stable, wasm32-unknown-unknown) (push) Has been skipped
groestl / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
groestl / test (stable) (push) Has been skipped
groestl / minimal-versions (push) Failing after 1s
jh / set-msrv (push) Failing after 1s
jh / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
jh / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
jh / build (stable, thumbv7em-none-eabi) (push) Has been skipped
jh / build (stable, wasm32-unknown-unknown) (push) Has been skipped
jh / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
jh / test (stable) (push) Has been skipped
jh / minimal-versions (push) Failing after 0s
k12 / set-msrv (push) Failing after 0s
k12 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
k12 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
k12 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
k12 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
k12 / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
k12 / test (stable) (push) Has been skipped
kupyna / set-msrv (push) Failing after 1s
kupyna / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
kupyna / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
kupyna / build (stable, thumbv7em-none-eabi) (push) Has been skipped
kupyna / build (stable, wasm32-unknown-unknown) (push) Has been skipped
kupyna / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
kupyna / test (stable) (push) Has been skipped
kupyna / cross (default, ${{needs.set-msrv.outputs.msrv}}, aarch64-unknown-linux-gnu) (push) Has been skipped
kupyna / cross (default, ${{needs.set-msrv.outputs.msrv}}, powerpc-unknown-linux-gnu) (push) Has been skipped
kupyna / cross (default, stable, aarch64-unknown-linux-gnu) (push) Has been skipped
kupyna / cross (default, stable, powerpc-unknown-linux-gnu) (push) Has been skipped
kupyna / minimal-versions (push) Failing after 0s
md2 / set-msrv (push) Failing after 1s
md2 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
md2 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
md2 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
md2 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
md2 / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
md2 / test (stable) (push) Has been skipped
md2 / minimal-versions (push) Failing after 1s
md4 / set-msrv (push) Failing after 1s
md4 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
md4 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
md4 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
md4 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
md4 / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
md4 / test (stable) (push) Has been skipped
md4 / minimal-versions (push) Failing after 0s
md5 / set-msrv (push) Failing after 0s
md5 / build (${{needs.set-msrv.outputs.msrv}}, loongarch64-unknown-linux-gnu) (push) Has been skipped
md5 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
md5 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
md5 / build (stable, loongarch64-unknown-linux-gnu) (push) Has been skipped
md5 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
md5 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
md5 / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
md5 / test (stable) (push) Has been skipped
md5 / minimal-versions (push) Failing after 10m30s
ripemd / set-msrv (push) Failing after 0s
ripemd / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
ripemd / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
ripemd / build (stable, thumbv7em-none-eabi) (push) Has been skipped
ripemd / build (stable, wasm32-unknown-unknown) (push) Has been skipped
ripemd / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
ripemd / test (stable) (push) Has been skipped
ripemd / minimal-versions (push) Failing after 0s
sha1-checked / set-msrv (push) Failing after 1s
sha1-checked / build (${{needs.set-msrv.outputs.msrv}}, loongarch64-unknown-linux-gnu) (push) Has been skipped
sha1-checked / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
sha1-checked / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
sha1-checked / build (stable, loongarch64-unknown-linux-gnu) (push) Has been skipped
sha1-checked / build (stable, thumbv7em-none-eabi) (push) Has been skipped
sha1-checked / build (stable, wasm32-unknown-unknown) (push) Has been skipped
sha1-checked / linux (${{needs.set-msrv.outputs.msrv}}, x86_64-unknown-linux-gnu) (push) Has been skipped
sha1-checked / linux (stable, x86_64-unknown-linux-gnu) (push) Has been skipped
sha1-checked / macos (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
sha1-checked / macos (stable) (push) Has been skipped
sha1-checked / windows (x86_64-pc-windows-gnu, ${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
sha1-checked / windows (x86_64-pc-windows-gnu, stable) (push) Has been skipped
sha1-checked / cross (default, ${{needs.set-msrv.outputs.msrv}}, aarch64-unknown-linux-gnu) (push) Has been skipped
sha1-checked / cross (default, ${{needs.set-msrv.outputs.msrv}}, powerpc-unknown-linux-gnu) (push) Has been skipped
sha1-checked / cross (default, stable, aarch64-unknown-linux-gnu) (push) Has been skipped
sha1-checked / cross (default, stable, powerpc-unknown-linux-gnu) (push) Has been skipped
sha1 / set-msrv (push) Failing after 0s
sha1 / build (${{needs.set-msrv.outputs.msrv}}, loongarch64-unknown-linux-gnu) (push) Has been skipped
sha1 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
sha1 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
sha1 / build (stable, loongarch64-unknown-linux-gnu) (push) Has been skipped
sha1 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
sha1 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
sha1 / linux (${{needs.set-msrv.outputs.msrv}}, x86_64-unknown-linux-gnu) (push) Has been skipped
sha1 / linux (stable, x86_64-unknown-linux-gnu) (push) Has been skipped
sha1 / macos (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
sha1 / macos (stable) (push) Has been skipped
sha1 / windows (x86_64-pc-windows-gnu, ${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
sha1 / windows (x86_64-pc-windows-gnu, stable) (push) Has been skipped
sha1 / cross (default, ${{needs.set-msrv.outputs.msrv}}, aarch64-unknown-linux-gnu) (push) Has been skipped
sha1 / cross (default, ${{needs.set-msrv.outputs.msrv}}, powerpc-unknown-linux-gnu) (push) Has been skipped
sha1 / cross (default, stable, aarch64-unknown-linux-gnu) (push) Has been skipped
sha1 / cross (default, stable, powerpc-unknown-linux-gnu) (push) Has been skipped
sha1 / minimal-versions (push) Failing after 0s
sha2 / set-msrv (push) Failing after 0s
sha2 / build (${{needs.set-msrv.outputs.msrv}}, loongarch64-unknown-linux-gnu) (push) Has been skipped
sha2 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
sha2 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
sha2 / build (stable, loongarch64-unknown-linux-gnu) (push) Has been skipped
sha2 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
sha2 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
sha2 / linux (${{needs.set-msrv.outputs.msrv}}, x86_64-unknown-linux-gnu) (push) Has been skipped
sha2 / linux (stable, x86_64-unknown-linux-gnu) (push) Has been skipped
sha2 / linux (sudo apt update && sudo apt install gcc-multilib, ${{needs.set-msrv.outputs.msrv}}, i686-unknown-linux-gnu) (push) Has been skipped
sha2 / linux (sudo apt update && sudo apt install gcc-multilib, stable, i686-unknown-linux-gnu) (push) Has been skipped
sha2 / macos (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
sha2 / macos (stable) (push) Has been skipped
sha2 / windows (${{needs.set-msrv.outputs.msrv}}, x86_64-pc-windows-gnu) (push) Has been skipped
sha2 / windows (stable, x86_64-pc-windows-gnu) (push) Has been skipped
sha2 / cross (default, ${{needs.set-msrv.outputs.msrv}}, aarch64-unknown-linux-gnu) (push) Has been skipped
sha2 / cross (default, ${{needs.set-msrv.outputs.msrv}}, powerpc-unknown-linux-gnu) (push) Has been skipped
sha2 / cross (default, stable, aarch64-unknown-linux-gnu) (push) Has been skipped
sha2 / cross (default, stable, powerpc-unknown-linux-gnu) (push) Has been skipped
sha2 / wasm (-C target-feature=+simd128, ${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
sha2 / wasm (-C target-feature=+simd128, stable) (push) Has been skipped
sha2 / wasm (-C target-feature=-simd128, ${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
sha2 / wasm (-C target-feature=-simd128, stable) (push) Has been skipped
sha2 / minimal-versions (push) Failing after 1s
sha3 / set-msrv (push) Failing after 0s
sha3 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
sha3 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
sha3 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
sha3 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
sha3 / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
sha3 / test (stable) (push) Has been skipped
sha3 / cross (default, ${{needs.set-msrv.outputs.msrv}}, aarch64-unknown-linux-gnu) (push) Has been skipped
sha3 / cross (default, ${{needs.set-msrv.outputs.msrv}}, powerpc-unknown-linux-gnu) (push) Has been skipped
sha3 / cross (default, stable, aarch64-unknown-linux-gnu) (push) Has been skipped
sha3 / cross (default, stable, powerpc-unknown-linux-gnu) (push) Has been skipped
sha3 / minimal-versions (push) Failing after 0s
shabal / set-msrv (push) Failing after 0s
shabal / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
shabal / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
shabal / build (stable, thumbv7em-none-eabi) (push) Has been skipped
shabal / build (stable, wasm32-unknown-unknown) (push) Has been skipped
shabal / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
shabal / test (stable) (push) Has been skipped
shabal / minimal-versions (push) Failing after 0s
skein / set-msrv (push) Failing after 0s
skein / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
skein / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
skein / build (stable, thumbv7em-none-eabi) (push) Has been skipped
skein / build (stable, wasm32-unknown-unknown) (push) Has been skipped
skein / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
skein / test (stable) (push) Has been skipped
skein / minimal-versions (push) Failing after 0s
sm3 / set-msrv (push) Failing after 1s
sm3 / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
sm3 / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
sm3 / build (stable, thumbv7em-none-eabi) (push) Has been skipped
sm3 / build (stable, wasm32-unknown-unknown) (push) Has been skipped
sm3 / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
sm3 / test (stable) (push) Has been skipped
sm3 / minimal-versions (push) Failing after 1s
streebog / set-msrv (push) Failing after 0s
streebog / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
streebog / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
streebog / build (stable, thumbv7em-none-eabi) (push) Has been skipped
streebog / build (stable, wasm32-unknown-unknown) (push) Has been skipped
streebog / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
streebog / test (stable) (push) Has been skipped
streebog / minimal-versions (push) Failing after 1s
tiger / set-msrv (push) Failing after 0s
tiger / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
tiger / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
tiger / build (stable, thumbv7em-none-eabi) (push) Has been skipped
tiger / build (stable, wasm32-unknown-unknown) (push) Has been skipped
tiger / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
tiger / test (stable) (push) Has been skipped
tiger / minimal-versions (push) Failing after 0s
whirlpool / set-msrv (push) Failing after 0s
whirlpool / build (${{needs.set-msrv.outputs.msrv}}, thumbv7em-none-eabi) (push) Has been skipped
whirlpool / build (${{needs.set-msrv.outputs.msrv}}, wasm32-unknown-unknown) (push) Has been skipped
whirlpool / build (stable, thumbv7em-none-eabi) (push) Has been skipped
whirlpool / build (stable, wasm32-unknown-unknown) (push) Has been skipped
whirlpool / test (${{needs.set-msrv.outputs.msrv}}) (push) Has been skipped
whirlpool / test (stable) (push) Has been skipped
whirlpool / minimal-versions (push) Failing after 0s
Security Audit / Security Audit (push) Has been cancelled
sha2 / riscv64-zknh (push) Has been cancelled
sha2 / riscv32-zknh (push) Has been cancelled
Workspace / clippy (push) Has been cancelled
Workspace / rustfmt (push) Has been cancelled
Workspace / typos (push) Has been cancelled

The update_n() implementation propagated carry only through limbs 1..6,
effectively making n a 448-bit counter. According to GOST R 34.11-2012
(RFC 6986), the total processed bit-length must be tracked modulo 2^512.
This change extends the loop to include limb 7 so carry ripples through
all eight 64-bit words and any further carry is discarded, thus
restoring correct modulo 2^512 semantics. Although this bug only
manifests for astronomically large inputs, it is a correctness issue and
brings the implementation in line with the specification and the
behavior of similar counters in this codebase.
This commit is contained in:
radik878
2025-11-26 10:01:52 +02:00
committed by GitHub
parent 44b2e75f9a
commit 401887a354

View File

@@ -77,7 +77,7 @@ impl StreebogVarCore {
let mut carry = false;
// Note: `len` can not be bigger than block size, so `8 * len` never overflows
adc(&mut self.n[0], 8 * len, &mut carry);
for i in 1..7 {
for i in 1..8 {
adc(&mut self.n[i], 0, &mut carry);
}
}
@@ -217,3 +217,39 @@ fn from_bytes(b: &Block) -> [u64; 8] {
}
t
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn counter_carry_propagates_to_top_limb() {
let mut core = StreebogVarCore {
h: [0u64; 8],
n: [0u64; 8],
sigma: [0u64; 8],
};
core.n[0] = u64::MAX - 511;
for i in 1..=6 {
core.n[i] = u64::MAX;
}
core.n[7] = 0;
core.update_n(64);
for i in 0..=6 {
assert_eq!(core.n[i], 0);
}
assert_eq!(core.n[7], 1);
}
#[test]
fn counter_zero_len_no_change() {
let mut core = StreebogVarCore {
h: [0u64; 8],
n: [1, 2, 3, 4, 5, 6, 7, 8],
sigma: [0u64; 8],
};
let before = core.n;
core.update_n(0);
assert_eq!(core.n, before);
}
}