#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR) using System; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Math; namespace Org.BouncyCastle.Crypto.Parameters { public class RsaPrivateCrtKeyParameters : RsaKeyParameters { private readonly BigInteger e, p, q, dP, dQ, 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"); this.e = publicExponent; this.p = p; this.q = q; this.dP = dP; this.dQ = dQ; this.qInv = qInv; } public BigInteger PublicExponent { get { return e; } } public BigInteger P { get { return p; } } public BigInteger Q { get { return q; } } public BigInteger DP { get { return dP; } } public BigInteger DQ { get { return dQ; } } public BigInteger QInv { get { return qInv; } } public override bool Equals( object obj) { if (obj == this) return true; RsaPrivateCrtKeyParameters kp = obj as RsaPrivateCrtKeyParameters; if (kp == null) return false; return kp.DP.Equals(dP) && kp.DQ.Equals(dQ) && kp.Exponent.Equals(this.Exponent) && kp.Modulus.Equals(this.Modulus) && kp.P.Equals(p) && kp.Q.Equals(q) && kp.PublicExponent.Equals(e) && kp.QInv.Equals(qInv); } public override int GetHashCode() { return DP.GetHashCode() ^ DQ.GetHashCode() ^ Exponent.GetHashCode() ^ 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); } } } #endif