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

RsaUtilities

public abstract class RsaUtilities
using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Nist; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Utilities; using System; using System.IO; namespace Org.BouncyCastle.Tls.Crypto.Impl { public abstract class RsaUtilities { private static readonly byte[] RSAPSSParams_256_A; private static readonly byte[] RSAPSSParams_384_A; private static readonly byte[] RSAPSSParams_512_A; private static readonly byte[] RSAPSSParams_256_B; private static readonly byte[] RSAPSSParams_384_B; private static readonly byte[] RSAPSSParams_512_B; static RsaUtilities() { AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha256); AlgorithmIdentifier algorithmIdentifier2 = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha384); AlgorithmIdentifier algorithmIdentifier3 = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512); AlgorithmIdentifier algorithmIdentifier4 = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha256, DerNull.Instance); AlgorithmIdentifier algorithmIdentifier5 = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha384, DerNull.Instance); AlgorithmIdentifier algorithmIdentifier6 = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512, DerNull.Instance); AlgorithmIdentifier maskGenAlgorithm = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, algorithmIdentifier); AlgorithmIdentifier maskGenAlgorithm2 = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, algorithmIdentifier2); AlgorithmIdentifier maskGenAlgorithm3 = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, algorithmIdentifier3); AlgorithmIdentifier maskGenAlgorithm4 = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, algorithmIdentifier4); AlgorithmIdentifier maskGenAlgorithm5 = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, algorithmIdentifier5); AlgorithmIdentifier maskGenAlgorithm6 = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, algorithmIdentifier6); DerInteger saltLength = new DerInteger(TlsCryptoUtilities.GetHashOutputSize(4)); DerInteger saltLength2 = new DerInteger(TlsCryptoUtilities.GetHashOutputSize(5)); DerInteger saltLength3 = new DerInteger(TlsCryptoUtilities.GetHashOutputSize(6)); DerInteger trailerField = new DerInteger(1); try { RSAPSSParams_256_A = new RsassaPssParameters(algorithmIdentifier, maskGenAlgorithm, saltLength, trailerField).GetEncoded("DER"); RSAPSSParams_384_A = new RsassaPssParameters(algorithmIdentifier2, maskGenAlgorithm2, saltLength2, trailerField).GetEncoded("DER"); RSAPSSParams_512_A = new RsassaPssParameters(algorithmIdentifier3, maskGenAlgorithm3, saltLength3, trailerField).GetEncoded("DER"); RSAPSSParams_256_B = new RsassaPssParameters(algorithmIdentifier4, maskGenAlgorithm4, saltLength, trailerField).GetEncoded("DER"); RSAPSSParams_384_B = new RsassaPssParameters(algorithmIdentifier5, maskGenAlgorithm5, saltLength2, trailerField).GetEncoded("DER"); RSAPSSParams_512_B = new RsassaPssParameters(algorithmIdentifier6, maskGenAlgorithm6, saltLength3, trailerField).GetEncoded("DER"); } catch (IOException ex) { throw new InvalidOperationException(ex.Message); } } public static bool SupportsPkcs1(AlgorithmIdentifier pubKeyAlgID) { DerObjectIdentifier algorithm = pubKeyAlgID.Algorithm; if (!PkcsObjectIdentifiers.RsaEncryption.Equals(algorithm)) return X509ObjectIdentifiers.IdEARsa.Equals(algorithm); return true; } public static bool SupportsPss_Pss(short signatureAlgorithm, AlgorithmIdentifier pubKeyAlgID) { DerObjectIdentifier algorithm = pubKeyAlgID.Algorithm; if (!PkcsObjectIdentifiers.IdRsassaPss.Equals(algorithm)) return false; Asn1Encodable parameters = pubKeyAlgID.Parameters; if (parameters == null || parameters is DerNull) { if ((uint)(signatureAlgorithm - 9) <= 2) return true; return false; } byte[] encoded; try { encoded = parameters.ToAsn1Object().GetEncoded("DER"); } catch (Exception) { return false; } byte[] a; byte[] a2; switch (signatureAlgorithm) { case 9: a = RSAPSSParams_256_A; a2 = RSAPSSParams_256_B; break; case 10: a = RSAPSSParams_384_A; a2 = RSAPSSParams_384_B; break; case 11: a = RSAPSSParams_512_A; a2 = RSAPSSParams_512_B; break; default: return false; } if (!Arrays.AreEqual(a, encoded)) return Arrays.AreEqual(a2, encoded); return true; } public static bool SupportsPss_Rsae(AlgorithmIdentifier pubKeyAlgID) { DerObjectIdentifier algorithm = pubKeyAlgID.Algorithm; return PkcsObjectIdentifiers.RsaEncryption.Equals(algorithm); } } }