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

RsaPrivateCrtKeyParameters

using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Math; using System; namespace Org.BouncyCastle.Crypto.Parameters { public class RsaPrivateCrtKeyParameters : RsaKeyParameters { private readonly BigInteger e; private readonly BigInteger p; private readonly BigInteger q; private readonly BigInteger dP; private readonly BigInteger dQ; private readonly BigInteger qInv; public BigInteger PublicExponent => e; public BigInteger P => p; public BigInteger Q => q; public BigInteger DP => dP; public BigInteger DQ => dQ; public BigInteger QInv => qInv; public RsaPrivateCrtKeyParameters(BigInteger modulus, BigInteger publicExponent, BigInteger privateExponent, BigInteger p, BigInteger q, BigInteger dP, BigInteger dQ, BigInteger qInv) : base(true, modulus, privateExponent) { ValidateValue(publicExponent, "publicExponent", "exponent"); ValidateValue(p, "p", "P value"); ValidateValue(q, "q", "Q value"); ValidateValue(dP, "dP", "DP value"); ValidateValue(dQ, "dQ", "DQ value"); ValidateValue(qInv, "qInv", "InverseQ value"); e = publicExponent; this.p = p; this.q = q; this.dP = dP; this.dQ = dQ; this.qInv = qInv; } public RsaPrivateCrtKeyParameters(RsaPrivateKeyStructure rsaPrivateKey) : this(rsaPrivateKey.Modulus, rsaPrivateKey.PublicExponent, rsaPrivateKey.PrivateExponent, rsaPrivateKey.Prime1, rsaPrivateKey.Prime2, rsaPrivateKey.Exponent1, rsaPrivateKey.Exponent2, rsaPrivateKey.Coefficient) { } public override bool Equals(object obj) { if (obj == this) return true; RsaPrivateCrtKeyParameters rsaPrivateCrtKeyParameters = obj as RsaPrivateCrtKeyParameters; if (rsaPrivateCrtKeyParameters == null) return false; if (rsaPrivateCrtKeyParameters.DP.Equals(dP) && rsaPrivateCrtKeyParameters.DQ.Equals(dQ) && rsaPrivateCrtKeyParameters.Exponent.Equals(base.Exponent) && rsaPrivateCrtKeyParameters.Modulus.Equals(base.Modulus) && rsaPrivateCrtKeyParameters.P.Equals(p) && rsaPrivateCrtKeyParameters.Q.Equals(q) && rsaPrivateCrtKeyParameters.PublicExponent.Equals(e)) return rsaPrivateCrtKeyParameters.QInv.Equals(qInv); return false; } public override int GetHashCode() { return DP.GetHashCode() ^ DQ.GetHashCode() ^ base.Exponent.GetHashCode() ^ base.Modulus.GetHashCode() ^ P.GetHashCode() ^ Q.GetHashCode() ^ PublicExponent.GetHashCode() ^ QInv.GetHashCode(); } private static void ValidateValue(BigInteger x, string name, string desc) { if (x == null) throw new ArgumentNullException(name); if (x.SignValue <= 0) throw new ArgumentException("Not a valid RSA " + desc, name); } } }