DrbgUtilities
class DrbgUtilities
using Org.BouncyCastle.Crypto.Utilities;
using System;
using System.Collections.Generic;
namespace Org.BouncyCastle.Crypto.Prng.Drbg
{
internal class DrbgUtilities
{
private static readonly IDictionary<string, int> MaxSecurityStrengths;
static DrbgUtilities()
{
MaxSecurityStrengths = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
MaxSecurityStrengths.Add("SHA-1", 128);
MaxSecurityStrengths.Add("SHA-224", 192);
MaxSecurityStrengths.Add("SHA-256", 256);
MaxSecurityStrengths.Add("SHA-384", 256);
MaxSecurityStrengths.Add("SHA-512", 256);
MaxSecurityStrengths.Add("SHA-512/224", 192);
MaxSecurityStrengths.Add("SHA-512/256", 256);
}
internal static int GetMaxSecurityStrength(IDigest d)
{
return MaxSecurityStrengths[d.AlgorithmName];
}
internal static int GetMaxSecurityStrength(IMac m)
{
string algorithmName = m.AlgorithmName;
return MaxSecurityStrengths[algorithmName.Substring(0, algorithmName.IndexOf("/"))];
}
internal unsafe static void HashDF(IDigest digest, ReadOnlySpan<byte> seedMaterial, int seedLength, Span<byte> output)
{
int num = (seedLength + 7) / 8;
int digestSize = digest.GetDigestSize();
int num2 = num / digestSize;
int num3 = 1;
Span<byte> span;
if (digestSize <= 128) {
int num4 = digestSize;
span = new Span<byte>(stackalloc byte[(int)(uint)num4], num4);
} else
span = new byte[digestSize];
Span<byte> output2 = span;
Span<byte> span2 = new Span<byte>(stackalloc byte[5], 5);
Pack.UInt32_To_BE((uint)seedLength, span2.Slice(1, span2.Length - 1));
int num5 = 0;
while (num5 <= num2) {
span2[0] = (byte)num3;
digest.BlockUpdate(span2);
digest.BlockUpdate(seedMaterial);
digest.DoFinal(output2);
int length = System.Math.Min(digestSize, num - num5 * digestSize);
span = output2.Slice(0, length);
int num4 = num5 * digestSize;
span.CopyTo(output.Slice(num4, output.Length - num4));
num5++;
num3++;
}
if (seedLength % 8 != 0) {
int num6 = 8 - seedLength % 8;
uint num7 = 0;
for (int i = 0; i != num; i++) {
uint num8 = output[i];
output[i] = (byte)((num8 >> num6) | (num7 << 8 - num6));
num7 = num8;
}
}
}
}
}