From 3d01427cf58f6a4262420ed781bdfab9ba867358 Mon Sep 17 00:00:00 2001 From: oech3 <79379754+oech3@users.noreply.github.com> Date: Wed, 28 Jan 2026 22:51:36 +0900 Subject: [PATCH] cksum: Fix -a blake3/shake* --- src/uu/cksum/src/cksum.rs | 8 ++++++ src/uucore/src/lib/features/checksum/mod.rs | 6 +++++ tests/by-util/test_cksum.rs | 30 +++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index 5c78af2c6de..fbce4a40e87 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -103,6 +103,14 @@ fn maybe_sanitize_length( // For BLAKE2b, if a length is provided, validate it. (Some(AlgoKind::Blake2b), Some(len)) => calculate_blake2b_length_str(len), + // Bug: length is not applied for SHAKE. + (Some(AlgoKind::Shake128 | AlgoKind::Shake256), Some(s_len)) => { + let len = s_len + .parse::() + .map_err(|_| ChecksumError::InvalidLength(s_len.to_string()))?; + Ok(Some(len)) + } + // For any other provided algorithm, check if length is 0. // Otherwise, this is an error. (_, Some(len)) if len.parse::() == Ok(0_u32) => Ok(None), diff --git a/src/uucore/src/lib/features/checksum/mod.rs b/src/uucore/src/lib/features/checksum/mod.rs index 0c6dc54f3b5..af8ca3d8e9c 100644 --- a/src/uucore/src/lib/features/checksum/mod.rs +++ b/src/uucore/src/lib/features/checksum/mod.rs @@ -114,6 +114,12 @@ impl AlgoKind { ALGORITHM_OPTIONS_SHA256 => Sha256, ALGORITHM_OPTIONS_SHA384 => Sha384, ALGORITHM_OPTIONS_SHA512 => Sha512, + + // Extension + ALGORITHM_OPTIONS_BLAKE3 => Blake3, + ALGORITHM_OPTIONS_SHAKE128 => Shake128, + ALGORITHM_OPTIONS_SHAKE256 => Shake256, + _ => return Err(ChecksumError::UnknownAlgorithm(algo.as_ref().to_string()).into()), }) } diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index daa69047f00..3bef2ef0599 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -3071,6 +3071,36 @@ mod debug_flag { } } +#[test] +#[cfg(target_os = "linux")] +fn test_dev_null_b3() { + new_ucmd!() + .arg("-a") + .arg("blake3") + .arg("/dev/null") + .succeeds() + .stdout_contains( + "BLAKE3 (/dev/null) = af1349b9f5f9a1a6a0404dea36dcc9499bcb25c9adc112b7cc9a93cae41f3262", + ); +} + +#[test] +fn test_shake() { + let (at, mut ucmd) = at_and_ucmd!(); + + at.touch("a"); + + ucmd.arg("a") + .arg("-a") + .arg("shake128") + .arg("-l") + .arg("128") + .succeeds() + .stdout_contains( + "SHAKE128 (a) = 7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26", + ); +} + #[test] #[cfg(all(target_os = "linux", not(target_env = "musl")))] fn test_check_file_with_io_error() {