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

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