Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

lib/crypto: x86/blake2s: Fix 32-bit arg treated as 64-bit

In the C code, the 'inc' argument to the assembly functions
blake2s_compress_ssse3() and blake2s_compress_avx512() is declared with
type u32, matching blake2s_compress(). The assembly code then reads it
from the 64-bit %rcx. However, the ABI doesn't guarantee zero-extension
to 64 bits, nor do gcc or clang guarantee it. Therefore, fix these
functions to read this argument from the 32-bit %ecx.

In theory, this bug could have caused the wrong 'inc' value to be used,
causing incorrect BLAKE2s hashes. In practice, probably not: I've fixed
essentially this same bug in many other assembly files too, but there's
never been a real report of it having caused a problem. In x86_64, all
writes to 32-bit registers are zero-extended to 64 bits. That results
in zero-extension in nearly all situations. I've only been able to
demonstrate a lack of zero-extension with a somewhat contrived example
involving truncation, e.g. when the C code has a u64 variable holding
0x1234567800000040 and passes it as a u32 expecting it to be truncated
to 0x40 (64). But that's not what the real code does, of course.

Fixes: ed0356eda153 ("crypto: blake2s - x86_64 SIMD implementation")
Cc: stable@vger.kernel.org
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20251102234209.62133-2-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>

+2 -2
+2 -2
lib/crypto/x86/blake2s-core.S
··· 52 52 movdqa ROT16(%rip),%xmm12 53 53 movdqa ROR328(%rip),%xmm13 54 54 movdqu 0x20(%rdi),%xmm14 55 - movq %rcx,%xmm15 55 + movd %ecx,%xmm15 56 56 leaq SIGMA+0xa0(%rip),%r8 57 57 jmp .Lbeginofloop 58 58 .align 32 ··· 176 176 vmovdqu (%rdi),%xmm0 177 177 vmovdqu 0x10(%rdi),%xmm1 178 178 vmovdqu 0x20(%rdi),%xmm4 179 - vmovq %rcx,%xmm5 179 + vmovd %ecx,%xmm5 180 180 vmovdqa IV(%rip),%xmm14 181 181 vmovdqa IV+16(%rip),%xmm15 182 182 jmp .Lblake2s_compress_avx512_mainloop