<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.0" />

SkeinMac

public class SkeinMac : IMac
Implementation of the Skein parameterised MAC function in 256, 512 and 1024 bit block sizes, based on the ThreefishEngineThreefish tweakable block cipher.
using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Crypto.Macs { public class SkeinMac : IMac { public const int SKEIN_256 = 256; public const int SKEIN_512 = 512; public const int SKEIN_1024 = 1024; private readonly SkeinEngine engine; public string AlgorithmName { get { int num = engine.BlockSize * 8; string str = num.ToString(); num = engine.OutputSize * 8; return "Skein-MAC-" + str + "-" + num.ToString(); } } public SkeinMac(int stateSizeBits, int digestSizeBits) { engine = new SkeinEngine(stateSizeBits, digestSizeBits); } public SkeinMac(SkeinMac mac) { engine = new SkeinEngine(mac.engine); } public void Init(ICipherParameters parameters) { SkeinParameters skeinParameters; if (parameters is SkeinParameters) skeinParameters = (SkeinParameters)parameters; else { if (!(parameters is KeyParameter)) throw new ArgumentException("Invalid parameter passed to Skein MAC init - " + Platform.GetTypeName(parameters)); skeinParameters = new SkeinParameters.Builder().SetKey(((KeyParameter)parameters).GetKey()).Build(); } if (skeinParameters.GetKey() == null) throw new ArgumentException("Skein MAC requires a key parameter."); engine.Init(skeinParameters); } public int GetMacSize() { return engine.OutputSize; } public void Reset() { engine.Reset(); } public void Update(byte inByte) { engine.Update(inByte); } public void BlockUpdate(byte[] input, int inOff, int len) { engine.BlockUpdate(input, inOff, len); } public void BlockUpdate(ReadOnlySpan<byte> input) { engine.BlockUpdate(input); } public int DoFinal(byte[] output, int outOff) { return engine.DoFinal(output, outOff); } public int DoFinal(Span<byte> output) { return engine.DoFinal(output); } } }