diff --git a/src/uu/hashsum/src/hashsum.rs b/src/uu/hashsum/src/hashsum.rs index 77cc0d558..1e677358e 100644 --- a/src/uu/hashsum/src/hashsum.rs +++ b/src/uu/hashsum/src/hashsum.rs @@ -473,15 +473,26 @@ where }); if options.check { // Set up Regexes for line validation and parsing + // + // First, we compute the number of bytes we expect to be in + // the digest string. If the algorithm has a variable number + // of output bits, then we use the `+` modifier in the + // regular expression, otherwise we use the `{n}` modifier, + // where `n` is the number of bytes. let bytes = options.digest.output_bits() / 4; + let modifier = if bytes > 0 { + format!("{{{}}}", bytes) + } else { + "+".to_string() + }; let gnu_re = safe_unwrap!(Regex::new(&format!( - r"^(?P[a-fA-F0-9]{{{}}}) (?P[ \*])(?P.*)", - bytes + r"^(?P[a-fA-F0-9]{}) (?P[ \*])(?P.*)", + modifier, ))); let bsd_re = safe_unwrap!(Regex::new(&format!( - r"^{algorithm} \((?P.*)\) = (?P[a-fA-F0-9]{{{digest_size}}})", + r"^{algorithm} \((?P.*)\) = (?P[a-fA-F0-9]{digest_size})", algorithm = options.algoname, - digest_size = bytes + digest_size = modifier, ))); let buffer = file; diff --git a/tests/by-util/test_hashsum.rs b/tests/by-util/test_hashsum.rs index f059e53f3..f2cf91d45 100644 --- a/tests/by-util/test_hashsum.rs +++ b/tests/by-util/test_hashsum.rs @@ -1,3 +1,4 @@ +// spell-checker:ignore checkfile macro_rules! get_hash( ($str:expr) => ( $str.split(' ').collect::>()[0] @@ -12,6 +13,7 @@ macro_rules! test_digest { static DIGEST_ARG: &'static str = concat!("--", stringify!($t)); static BITS_ARG: &'static str = concat!("--bits=", stringify!($size)); static EXPECTED_FILE: &'static str = concat!(stringify!($id), ".expected"); + static CHECK_FILE: &'static str = concat!(stringify!($id), ".checkfile"); #[test] fn test_single_file() { @@ -26,6 +28,16 @@ macro_rules! test_digest { assert_eq!(ts.fixtures.read(EXPECTED_FILE), get_hash!(ts.ucmd().arg(DIGEST_ARG).arg(BITS_ARG).pipe_in_fixture("input.txt").succeeds().no_stderr().stdout_str())); } + + #[test] + fn test_check() { + let ts = TestScenario::new("hashsum"); + ts.ucmd() + .args(&[DIGEST_ARG, BITS_ARG, "--check", CHECK_FILE]) + .succeeds() + .no_stderr() + .stdout_is("input.txt: OK\n"); + } } )*) } diff --git a/tests/fixtures/hashsum/b2sum.checkfile b/tests/fixtures/hashsum/b2sum.checkfile new file mode 100644 index 000000000..9d6781cc8 --- /dev/null +++ b/tests/fixtures/hashsum/b2sum.checkfile @@ -0,0 +1 @@ +7355dd5276c21cfe0c593b5063b96af3f96a454b33216f58314f44c3ade92e9cd6cec4210a0836246780e9baf927cc50b9a3d7073e8f9bd12780fddbcb930c6d input.txt diff --git a/tests/fixtures/hashsum/md5.checkfile b/tests/fixtures/hashsum/md5.checkfile new file mode 100644 index 000000000..328e1bd94 --- /dev/null +++ b/tests/fixtures/hashsum/md5.checkfile @@ -0,0 +1 @@ +e4d7f1b4ed2e42d15898f4b27b019da4 input.txt diff --git a/tests/fixtures/hashsum/sha1.checkfile b/tests/fixtures/hashsum/sha1.checkfile new file mode 100644 index 000000000..02c35969f --- /dev/null +++ b/tests/fixtures/hashsum/sha1.checkfile @@ -0,0 +1 @@ +b7e23ec29af22b0b4e41da31e868d57226121c84 input.txt diff --git a/tests/fixtures/hashsum/sha224.checkfile b/tests/fixtures/hashsum/sha224.checkfile new file mode 100644 index 000000000..6e3402094 --- /dev/null +++ b/tests/fixtures/hashsum/sha224.checkfile @@ -0,0 +1 @@ +6e1a93e32fb44081a401f3db3ef2e6e108b7bbeeb5705afdaf01fb27 input.txt diff --git a/tests/fixtures/hashsum/sha256.checkfile b/tests/fixtures/hashsum/sha256.checkfile new file mode 100644 index 000000000..db1d2be15 --- /dev/null +++ b/tests/fixtures/hashsum/sha256.checkfile @@ -0,0 +1 @@ +09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b input.txt diff --git a/tests/fixtures/hashsum/sha384.checkfile b/tests/fixtures/hashsum/sha384.checkfile new file mode 100644 index 000000000..c53326b1d --- /dev/null +++ b/tests/fixtures/hashsum/sha384.checkfile @@ -0,0 +1 @@ +1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e input.txt diff --git a/tests/fixtures/hashsum/sha3_224.checkfile b/tests/fixtures/hashsum/sha3_224.checkfile new file mode 100644 index 000000000..3a93cd056 --- /dev/null +++ b/tests/fixtures/hashsum/sha3_224.checkfile @@ -0,0 +1 @@ +927b362eaf84a75785bbec3370d1c9711349e93f1104eda060784221 input.txt diff --git a/tests/fixtures/hashsum/sha3_256.checkfile b/tests/fixtures/hashsum/sha3_256.checkfile new file mode 100644 index 000000000..b8bec0924 --- /dev/null +++ b/tests/fixtures/hashsum/sha3_256.checkfile @@ -0,0 +1 @@ +bfb3959527d7a3f2f09def2f6915452d55a8f122df9e164d6f31c7fcf6093e14 input.txt diff --git a/tests/fixtures/hashsum/sha3_384.checkfile b/tests/fixtures/hashsum/sha3_384.checkfile new file mode 100644 index 000000000..6b014fdd2 --- /dev/null +++ b/tests/fixtures/hashsum/sha3_384.checkfile @@ -0,0 +1 @@ +fbd0c5931195aaa9517869972b372f717bb69f7f9f72bfc0884ed0531c36a16fc2db5dd6d82131968b23ffe0e90757e5 input.txt diff --git a/tests/fixtures/hashsum/sha3_512.checkfile b/tests/fixtures/hashsum/sha3_512.checkfile new file mode 100644 index 000000000..125e2dfba --- /dev/null +++ b/tests/fixtures/hashsum/sha3_512.checkfile @@ -0,0 +1 @@ +2ed3a863a12e2f8ff140aa86232ff3603a7f24af62f0e2ca74672494ade175a9a3de42a351b5019d931a1deae0499609038d9b47268779d76198e1d410d20974 input.txt diff --git a/tests/fixtures/hashsum/sha512.checkfile b/tests/fixtures/hashsum/sha512.checkfile new file mode 100644 index 000000000..41a55cabb --- /dev/null +++ b/tests/fixtures/hashsum/sha512.checkfile @@ -0,0 +1 @@ +8710339dcb6814d0d9d2290ef422285c9322b7163951f9a0ca8f883d3305286f44139aa374848e4174f5aada663027e4548637b6d19894aec4fb6c46a139fbf9 input.txt diff --git a/tests/fixtures/hashsum/shake128_256.checkfile b/tests/fixtures/hashsum/shake128_256.checkfile new file mode 100644 index 000000000..a3769f78e --- /dev/null +++ b/tests/fixtures/hashsum/shake128_256.checkfile @@ -0,0 +1 @@ +83d41db453072caa9953f2f316480fbbcb84a5f3505460a18b3a36a814ae8e9e input.txt diff --git a/tests/fixtures/hashsum/shake256_512.checkfile b/tests/fixtures/hashsum/shake256_512.checkfile new file mode 100644 index 000000000..e16601f30 --- /dev/null +++ b/tests/fixtures/hashsum/shake256_512.checkfile @@ -0,0 +1 @@ +7c9896ea84a2a1b80b2183a3f2b4e43cd59b7d48471dc213bcedaccb699d6e6f7ad5d304928ab79329f1fc62f6db072d95b51209eb807683f5c9371872a2dd4e input.txt