From 28b33b67f8dcd652ab80f6dfd356c918e97e6220 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sun, 24 Mar 2024 20:07:03 -0400 Subject: [PATCH] Enable SHAKE128 and SHAKE256 processing --- SabreTools.Hashing/HashType.cs | 2 ++ SabreTools.Hashing/HashWrapper.cs | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/SabreTools.Hashing/HashType.cs b/SabreTools.Hashing/HashType.cs index 161253c..3e750f0 100644 --- a/SabreTools.Hashing/HashType.cs +++ b/SabreTools.Hashing/HashType.cs @@ -124,11 +124,13 @@ namespace SabreTools.Hashing /// /// SHAKE128 SHA-3 family hash /// + /// Outputs a 256-bit (32-byte) hash SHAKE128, /// /// SHAKE256 SHA-3 family hash /// + /// Outputs a 512-bit (64-byte) hash SHAKE256, #endif diff --git a/SabreTools.Hashing/HashWrapper.cs b/SabreTools.Hashing/HashWrapper.cs index 77ccff0..85512d6 100644 --- a/SabreTools.Hashing/HashWrapper.cs +++ b/SabreTools.Hashing/HashWrapper.cs @@ -46,6 +46,10 @@ namespace SabreTools.Hashing #endif OptimizedCRC ocrc => BitConverter.GetBytes(ocrc.Value).Reverse().ToArray(), ParallelCRC pcrc => BitConverter.GetBytes(pcrc.Value).Reverse().ToArray(), +#if NET8_0_OR_GREATER + Shake128 s128 => s128.GetCurrentHash(32), + Shake256 s256 => s256.GetCurrentHash(64), +#endif _ => null, }; } @@ -196,13 +200,25 @@ namespace SabreTools.Hashing case ParallelCRC pc: pc.Update(buffer, offset, size); break; + +#if NET8_0_OR_GREATER + case Shake128 s128: + var s128BufferSpan = new ReadOnlySpan(buffer, offset, size) + s128.AppendData(s128BufferSpan); + break; + + case Shake256 s256: + var s256BufferSpan = new ReadOnlySpan(buffer, offset, size) + s256.AppendData(s256BufferSpan); + break; +#endif } } /// /// Finalize the internal hash algorigthm /// - /// NonCryptographicHashAlgorithm implementations do not need finalization + /// NonCryptographicHashAlgorithm, SHAKE128, and SHAKE256 implementations do not need finalization public void Terminate() { byte[] emptyBuffer = [];