internal static RsaPaddingProcessor OpenProcessor(HashAlgorithmName hashAlgorithmName)
{
return(s_lookup.GetOrAdd(
hashAlgorithmName,
static hashAlgorithmName =>
{
using (IncrementalHash hasher = IncrementalHash.CreateHash(hashAlgorithmName))
{
// SHA-2-512 is the biggest we expect
Span <byte> stackDest = stackalloc byte[512 / 8];
ReadOnlyMemory <byte> digestInfoPrefix;
if (hashAlgorithmName == HashAlgorithmName.MD5)
{
digestInfoPrefix = s_digestInfoMD5;
}
else if (hashAlgorithmName == HashAlgorithmName.SHA1)
{
digestInfoPrefix = s_digestInfoSha1;
}
else if (hashAlgorithmName == HashAlgorithmName.SHA256)
{
digestInfoPrefix = s_digestInfoSha256;
}
else if (hashAlgorithmName == HashAlgorithmName.SHA384)
{
digestInfoPrefix = s_digestInfoSha384;
}
else if (hashAlgorithmName == HashAlgorithmName.SHA512)
{
digestInfoPrefix = s_digestInfoSha512;
}
else
{
Debug.Fail("Unknown digest algorithm");
throw new CryptographicException();
}
if (hasher.TryGetHashAndReset(stackDest, out int bytesWritten))
{
return new RsaPaddingProcessor(hashAlgorithmName, bytesWritten, digestInfoPrefix);
}
byte[] big = hasher.GetHashAndReset();
return new RsaPaddingProcessor(hashAlgorithmName, big.Length, digestInfoPrefix);
}
}));
}