@@ -47,14 +47,16 @@ pub const ALGORITHM_OPTIONS_BLAKE3: &str = "blake3";
4747pub const ALGORITHM_OPTIONS_SM3 : & str = "sm3" ;
4848pub const ALGORITHM_OPTIONS_SHAKE128 : & str = "shake128" ;
4949pub const ALGORITHM_OPTIONS_SHAKE256 : & str = "shake256" ;
50+ pub const ALGORITHM_OPTIONS_SHA2 : & str = "sha2" ;
5051
51- pub const SUPPORTED_ALGORITHMS : [ & str ; 16 ] = [
52+ pub const SUPPORTED_ALGORITHMS : [ & str ; 17 ] = [
5253 ALGORITHM_OPTIONS_SYSV ,
5354 ALGORITHM_OPTIONS_BSD ,
5455 ALGORITHM_OPTIONS_CRC ,
5556 ALGORITHM_OPTIONS_CRC32B ,
5657 ALGORITHM_OPTIONS_MD5 ,
5758 ALGORITHM_OPTIONS_SHA1 ,
59+ ALGORITHM_OPTIONS_SHA2 ,
5860 ALGORITHM_OPTIONS_SHA3 ,
5961 ALGORITHM_OPTIONS_SHA224 ,
6062 ALGORITHM_OPTIONS_SHA256 ,
@@ -222,6 +224,10 @@ pub enum ChecksumError {
222224 BitsRequiredForShake128 ,
223225 #[ error( "--bits required for SHAKE256" ) ]
224226 BitsRequiredForShake256 ,
227+ #[ error( "--bits required for SHA2" ) ]
228+ BitsRequiredForSha2 ,
229+ #[ error( "Invalid output size for SHA2 (expected 224, 256, 384, or 512), got {0}" ) ]
230+ InvalidSha2Length ( usize ) ,
225231 #[ error( "unknown algorithm: clap should have prevented this case" ) ]
226232 UnknownAlgorithm ,
227233 #[ error( "length is not a multiple of 8" ) ]
@@ -279,6 +285,42 @@ pub fn create_sha3(bits: usize) -> UResult<HashAlgorithm> {
279285 }
280286}
281287
288+ /// Create a SHA-2 `HashAlgorithm` based on the specified output size in bits.
289+ ///
290+ /// # Arguments
291+ ///
292+ /// * `bits` - The output size in bits for the SHA-2 algorithm.
293+ ///
294+ /// # Returns
295+ ///
296+ /// Returns a `UResult` with an `HashAlgorithm` or an `Err` if an unsupported
297+ /// output size is provided.
298+ pub fn create_sha2 ( bits : usize ) -> UResult < HashAlgorithm > {
299+ match bits {
300+ 224 => Ok ( HashAlgorithm {
301+ name : ALGORITHM_OPTIONS_SHA224 ,
302+ create_fn : Box :: new ( || Box :: new ( Sha224 :: new ( ) ) ) ,
303+ bits : 224 ,
304+ } ) ,
305+ 256 => Ok ( HashAlgorithm {
306+ name : ALGORITHM_OPTIONS_SHA256 ,
307+ create_fn : Box :: new ( || Box :: new ( Sha256 :: new ( ) ) ) ,
308+ bits : 256 ,
309+ } ) ,
310+ 384 => Ok ( HashAlgorithm {
311+ name : ALGORITHM_OPTIONS_SHA384 ,
312+ create_fn : Box :: new ( || Box :: new ( Sha384 :: new ( ) ) ) ,
313+ bits : 384 ,
314+ } ) ,
315+ 512 => Ok ( HashAlgorithm {
316+ name : ALGORITHM_OPTIONS_SHA512 ,
317+ create_fn : Box :: new ( || Box :: new ( Sha512 :: new ( ) ) ) ,
318+ bits : 512 ,
319+ } ) ,
320+ _ => Err ( ChecksumError :: InvalidSha2Length ( bits) . into ( ) ) ,
321+ }
322+ }
323+
282324#[ allow( clippy:: comparison_chain) ]
283325fn print_cksum_report ( res : & ChecksumResult ) {
284326 if res. bad_format == 1 {
@@ -458,11 +500,14 @@ pub fn detect_algo(algo: &str, length: Option<usize>) -> UResult<HashAlgorithm>
458500 bits,
459501 } )
460502 }
503+ ALGORITHM_OPTIONS_SHA2 => {
504+ let bits = length. ok_or ( ChecksumError :: BitsRequiredForSha2 ) ?;
505+ create_sha2 ( bits)
506+ }
461507 _ if algo. starts_with ( "sha3" ) => {
462508 let bits = length. ok_or ( ChecksumError :: BitsRequiredForSha3 ) ?;
463509 create_sha3 ( bits)
464510 }
465-
466511 _ => Err ( ChecksumError :: UnknownAlgorithm . into ( ) ) ,
467512 }
468513}
@@ -1434,6 +1479,18 @@ mod tests {
14341479 detect_algo( ALGORITHM_OPTIONS_SHA512 , None ) . unwrap( ) . name,
14351480 ALGORITHM_OPTIONS_SHA512
14361481 ) ;
1482+ assert_eq ! (
1483+ detect_algo( ALGORITHM_OPTIONS_SHA2 , Some ( 256 ) ) . unwrap( ) . name,
1484+ ALGORITHM_OPTIONS_SHA256
1485+ ) ;
1486+ assert_eq ! (
1487+ detect_algo( ALGORITHM_OPTIONS_SHA2 , Some ( 384 ) ) . unwrap( ) . name,
1488+ ALGORITHM_OPTIONS_SHA384
1489+ ) ;
1490+ assert_eq ! (
1491+ detect_algo( ALGORITHM_OPTIONS_SHA2 , Some ( 512 ) ) . unwrap( ) . name,
1492+ ALGORITHM_OPTIONS_SHA512
1493+ ) ;
14371494 assert_eq ! (
14381495 detect_algo( ALGORITHM_OPTIONS_BLAKE2B , None ) . unwrap( ) . name,
14391496 ALGORITHM_OPTIONS_BLAKE2B
@@ -1464,6 +1521,7 @@ mod tests {
14641521 assert_eq ! ( detect_algo( "sha3_512" , Some ( 512 ) ) . unwrap( ) . name, "SHA3_512" ) ;
14651522
14661523 assert ! ( detect_algo( "sha3_512" , None ) . is_err( ) ) ;
1524+ assert ! ( detect_algo( ALGORITHM_OPTIONS_SHA2 , None ) . is_err( ) ) ;
14671525 }
14681526
14691527 #[ test]
0 commit comments