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