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 = [];