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

MacSink

public sealed class MacSink : BaseOutputStream
using Org.BouncyCastle.Utilities.IO; using System; using System.Threading; using System.Threading.Tasks; namespace Org.BouncyCastle.Crypto.IO { public sealed class MacSink : BaseOutputStream { private readonly IMac m_mac; public IMac Mac => m_mac; public MacSink(IMac mac) { if (mac == null) throw new ArgumentNullException("mac"); m_mac = mac; } public override void Write(byte[] buffer, int offset, int count) { Streams.ValidateBufferArguments(buffer, offset, count); if (count > 0) m_mac.BlockUpdate(buffer, offset, count); } public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { return Streams.WriteAsyncDirect(this, buffer, offset, count, cancellationToken); } public override void Write(ReadOnlySpan<byte> buffer) { if (!buffer.IsEmpty) m_mac.BlockUpdate(buffer); } public override ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default(CancellationToken)) { return Streams.WriteAsyncDirect(this, buffer, cancellationToken); } public override void WriteByte(byte value) { m_mac.Update(value); } } }