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

Mgf1BytesGenerator

public sealed class Mgf1BytesGenerator : IDerivationFunction
Generator for MGF1 as defined in Pkcs 1v2
using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto.Utilities; using System; namespace Org.BouncyCastle.Crypto.Generators { public sealed class Mgf1BytesGenerator : IDerivationFunction { private readonly IDigest m_digest; private readonly int m_hLen; private byte[] m_buffer; public IDigest Digest => m_digest; public Mgf1BytesGenerator(IDigest digest) { m_digest = digest; m_hLen = digest.GetDigestSize(); } public void Init(IDerivationParameters parameters) { MgfParameters mgfParameters = parameters as MgfParameters; if (mgfParameters == null) throw new ArgumentException("MGF parameters required for MGF1Generator"); m_buffer = new byte[mgfParameters.SeedLength + 4 + m_hLen]; mgfParameters.GetSeed(m_buffer, 0); } public int GenerateBytes(byte[] output, int outOff, int length) { Check.OutputLength(output, outOff, length, "output buffer too short"); int num = m_buffer.Length - m_hLen; int off = num - 4; uint num2 = 0; m_digest.Reset(); int num3 = outOff + length; int num4 = num3 - m_hLen; while (outOff <= num4) { Pack.UInt32_To_BE(num2++, m_buffer, off); m_digest.BlockUpdate(m_buffer, 0, num); m_digest.DoFinal(output, outOff); outOff += m_hLen; } if (outOff < num3) { Pack.UInt32_To_BE(num2, m_buffer, off); m_digest.BlockUpdate(m_buffer, 0, num); m_digest.DoFinal(m_buffer, num); Array.Copy(m_buffer, num, output, outOff, num3 - outOff); } return length; } } }