Mgf1BytesGenerator
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;
}
}
}