1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.jce.provider;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ByteArrayOutputStream;
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.math.BigInteger;
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.interfaces.RSAPrivateCrtKey;
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.RSAPrivateCrtKeySpec;
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.ASN1Sequence;
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.DERNull;
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.DEROutputStream;
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.pkcs.RSAPrivateKeyStructure;
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters;
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A provider representation for a RSA private key, with CRT factors included.
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class JCERSAPrivateCrtKey
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    extends JCERSAPrivateKey
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    implements RSAPrivateCrtKey
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private BigInteger  publicExponent;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private BigInteger  primeP;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private BigInteger  primeQ;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private BigInteger  primeExponentP;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private BigInteger  primeExponentQ;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private BigInteger  crtCoefficient;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * construct a private key from it's org.bouncycastle.crypto equivalent.
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key the parameters object representing the private key.
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JCERSAPrivateCrtKey(
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RSAPrivateCrtKeyParameters key)
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(key);
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.publicExponent = key.getPublicExponent();
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeP = key.getP();
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeQ = key.getQ();
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeExponentP = key.getDP();
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeExponentQ = key.getDQ();
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.crtCoefficient = key.getQInv();
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * construct a private key from an RSAPrivateCrtKeySpec
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param spec the spec to be used in construction.
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JCERSAPrivateCrtKey(
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RSAPrivateCrtKeySpec spec)
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.modulus = spec.getModulus();
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.publicExponent = spec.getPublicExponent();
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.privateExponent = spec.getPrivateExponent();
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeP = spec.getPrimeP();
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeQ = spec.getPrimeQ();
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeExponentP = spec.getPrimeExponentP();
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeExponentQ = spec.getPrimeExponentQ();
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.crtCoefficient = spec.getCrtCoefficient();
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * construct a private key from another RSAPrivateCrtKey.
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key the object implementing the RSAPrivateCrtKey interface.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JCERSAPrivateCrtKey(
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RSAPrivateCrtKey key)
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.modulus = key.getModulus();
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.publicExponent = key.getPublicExponent();
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.privateExponent = key.getPrivateExponent();
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeP = key.getPrimeP();
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeQ = key.getPrimeQ();
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeExponentP = key.getPrimeExponentP();
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeExponentQ = key.getPrimeExponentQ();
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.crtCoefficient = key.getCrtCoefficient();
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * construct an RSA key from a private key info object.
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JCERSAPrivateCrtKey(
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PrivateKeyInfo  info)
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this(new RSAPrivateKeyStructure((ASN1Sequence)info.getPrivateKey()));
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * construct an RSA key from a ASN.1 RSA private key object.
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JCERSAPrivateCrtKey(
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RSAPrivateKeyStructure  key)
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.modulus = key.getModulus();
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.publicExponent = key.getPublicExponent();
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.privateExponent = key.getPrivateExponent();
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeP = key.getPrime1();
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeQ = key.getPrime2();
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeExponentP = key.getExponent1();
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.primeExponentQ = key.getExponent2();
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.crtCoefficient = key.getCoefficient();
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the encoding format we produce in getEncoded().
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the encoding format we produce in getEncoded().
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getFormat()
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "PKCS#8";
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return a PKCS8 representation of the key. The sequence returned
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * represents a full PrivateKeyInfo object.
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a PKCS8 representation of the key.
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public byte[] getEncoded()
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-changed
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PrivateKeyInfo          info = new PrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.THE_ONE), new RSAPrivateKeyStructure(getModulus(), getPublicExponent(), getPrivateExponent(), getPrimeP(), getPrimeQ(), getPrimeExponentP(), getPrimeExponentQ(), getCrtCoefficient()).getDERObject());
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-changed
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return info.getDEREncoded();
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the public exponent.
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the public exponent.
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public BigInteger getPublicExponent()
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return publicExponent;
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the prime P.
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the prime P.
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public BigInteger getPrimeP()
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return primeP;
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the prime Q.
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the prime Q.
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public BigInteger getPrimeQ()
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return primeQ;
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the prime exponent for P.
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the prime exponent for P.
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public BigInteger getPrimeExponentP()
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return primeExponentP;
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the prime exponent for Q.
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the prime exponent for Q.
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public BigInteger getPrimeExponentQ()
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return primeExponentQ;
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the CRT coefficient.
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the CRT coefficient.
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public BigInteger getCrtCoefficient()
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return crtCoefficient;
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object o)
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(o instanceof RSAPrivateCrtKey))
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (o == this)
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RSAPrivateCrtKey key = (RSAPrivateCrtKey)o;
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this.getModulus().equals(key.getModulus())
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         && this.getPublicExponent().equals(key.getPublicExponent())
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         && this.getPrivateExponent().equals(key.getPrivateExponent())
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         && this.getPrimeP().equals(key.getPrimeP())
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         && this.getPrimeQ().equals(key.getPrimeQ())
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         && this.getPrimeExponentP().equals(key.getPrimeExponentP())
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         && this.getPrimeExponentQ().equals(key.getPrimeExponentQ())
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         && this.getCrtCoefficient().equals(key.getCrtCoefficient());
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString()
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuffer    buf = new StringBuffer();
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String          nl = System.getProperty("line.separator");
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.append("RSA Private CRT Key").append(nl);
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.append("            modulus: ").append(this.getModulus().toString(16)).append(nl);
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.append("    public exponent: ").append(this.getPublicExponent().toString(16)).append(nl);
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.append("   private exponent: ").append(this.getPrivateExponent().toString(16)).append(nl);
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.append("             primeP: ").append(this.getPrimeP().toString(16)).append(nl);
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.append("             primeQ: ").append(this.getPrimeQ().toString(16)).append(nl);
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.append("     primeExponentP: ").append(this.getPrimeExponentP().toString(16)).append(nl);
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.append("     primeExponentQ: ").append(this.getPrimeExponentQ().toString(16)).append(nl);
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.append("     crtCoefficient: ").append(this.getCrtCoefficient().toString(16)).append(nl);
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return buf.toString();
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
238