1 package org.bouncycastle.asn1.pkcs;
2 
3 import java.math.BigInteger;
4 import java.util.Enumeration;
5 
6 import org.bouncycastle.asn1.ASN1EncodableVector;
7 import org.bouncycastle.asn1.ASN1Integer;
8 import org.bouncycastle.asn1.ASN1Object;
9 import org.bouncycastle.asn1.ASN1Primitive;
10 import org.bouncycastle.asn1.ASN1Sequence;
11 import org.bouncycastle.asn1.ASN1TaggedObject;
12 import org.bouncycastle.asn1.DERSequence;
13 
14 public class RSAPrivateKey
15     extends ASN1Object
16 {
17     private BigInteger version;
18     private BigInteger modulus;
19     private BigInteger publicExponent;
20     private BigInteger privateExponent;
21     private BigInteger prime1;
22     private BigInteger prime2;
23     private BigInteger exponent1;
24     private BigInteger exponent2;
25     private BigInteger coefficient;
26     private ASN1Sequence otherPrimeInfos = null;
27 
getInstance( ASN1TaggedObject obj, boolean explicit)28     public static RSAPrivateKey getInstance(
29         ASN1TaggedObject obj,
30         boolean          explicit)
31     {
32         return getInstance(ASN1Sequence.getInstance(obj, explicit));
33     }
34 
getInstance( Object obj)35     public static RSAPrivateKey getInstance(
36         Object obj)
37     {
38         if (obj instanceof RSAPrivateKey)
39         {
40             return (RSAPrivateKey)obj;
41         }
42 
43         if (obj != null)
44         {
45             return new RSAPrivateKey(ASN1Sequence.getInstance(obj));
46         }
47 
48         return null;
49     }
50 
RSAPrivateKey( BigInteger modulus, BigInteger publicExponent, BigInteger privateExponent, BigInteger prime1, BigInteger prime2, BigInteger exponent1, BigInteger exponent2, BigInteger coefficient)51     public RSAPrivateKey(
52         BigInteger modulus,
53         BigInteger publicExponent,
54         BigInteger privateExponent,
55         BigInteger prime1,
56         BigInteger prime2,
57         BigInteger exponent1,
58         BigInteger exponent2,
59         BigInteger coefficient)
60     {
61         this.version = BigInteger.valueOf(0);
62         this.modulus = modulus;
63         this.publicExponent = publicExponent;
64         this.privateExponent = privateExponent;
65         this.prime1 = prime1;
66         this.prime2 = prime2;
67         this.exponent1 = exponent1;
68         this.exponent2 = exponent2;
69         this.coefficient = coefficient;
70     }
71 
RSAPrivateKey( ASN1Sequence seq)72     private RSAPrivateKey(
73         ASN1Sequence seq)
74     {
75         Enumeration e = seq.getObjects();
76 
77         ASN1Integer v = (ASN1Integer)e.nextElement();
78         int versionValue = v.intValueExact();
79         if (versionValue < 0 || versionValue > 1)
80         {
81             throw new IllegalArgumentException("wrong version for RSA private key");
82         }
83 
84         version = v.getValue();
85         modulus = ((ASN1Integer)e.nextElement()).getValue();
86         publicExponent = ((ASN1Integer)e.nextElement()).getValue();
87         privateExponent = ((ASN1Integer)e.nextElement()).getValue();
88         prime1 = ((ASN1Integer)e.nextElement()).getValue();
89         prime2 = ((ASN1Integer)e.nextElement()).getValue();
90         exponent1 = ((ASN1Integer)e.nextElement()).getValue();
91         exponent2 = ((ASN1Integer)e.nextElement()).getValue();
92         coefficient = ((ASN1Integer)e.nextElement()).getValue();
93 
94         if (e.hasMoreElements())
95         {
96             otherPrimeInfos = (ASN1Sequence)e.nextElement();
97         }
98     }
99 
getVersion()100     public BigInteger getVersion()
101     {
102         return version;
103     }
104 
getModulus()105     public BigInteger getModulus()
106     {
107         return modulus;
108     }
109 
getPublicExponent()110     public BigInteger getPublicExponent()
111     {
112         return publicExponent;
113     }
114 
getPrivateExponent()115     public BigInteger getPrivateExponent()
116     {
117         return privateExponent;
118     }
119 
getPrime1()120     public BigInteger getPrime1()
121     {
122         return prime1;
123     }
124 
getPrime2()125     public BigInteger getPrime2()
126     {
127         return prime2;
128     }
129 
getExponent1()130     public BigInteger getExponent1()
131     {
132         return exponent1;
133     }
134 
getExponent2()135     public BigInteger getExponent2()
136     {
137         return exponent2;
138     }
139 
getCoefficient()140     public BigInteger getCoefficient()
141     {
142         return coefficient;
143     }
144 
145     /**
146      * This outputs the key in PKCS1v2 format.
147      * <pre>
148      *      RSAPrivateKey ::= SEQUENCE {
149      *                          version Version,
150      *                          modulus INTEGER, -- n
151      *                          publicExponent INTEGER, -- e
152      *                          privateExponent INTEGER, -- d
153      *                          prime1 INTEGER, -- p
154      *                          prime2 INTEGER, -- q
155      *                          exponent1 INTEGER, -- d mod (p-1)
156      *                          exponent2 INTEGER, -- d mod (q-1)
157      *                          coefficient INTEGER, -- (inverse of q) mod p
158      *                          otherPrimeInfos OtherPrimeInfos OPTIONAL
159      *                      }
160      *
161      *      Version ::= INTEGER { two-prime(0), multi(1) }
162      *        (CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --})
163      * </pre>
164      * <p>
165      * This routine is written to output PKCS1 version 2.1, private keys.
166      */
toASN1Primitive()167     public ASN1Primitive toASN1Primitive()
168     {
169         ASN1EncodableVector v = new ASN1EncodableVector(10);
170 
171         v.add(new ASN1Integer(version));                       // version
172         v.add(new ASN1Integer(getModulus()));
173         v.add(new ASN1Integer(getPublicExponent()));
174         v.add(new ASN1Integer(getPrivateExponent()));
175         v.add(new ASN1Integer(getPrime1()));
176         v.add(new ASN1Integer(getPrime2()));
177         v.add(new ASN1Integer(getExponent1()));
178         v.add(new ASN1Integer(getExponent2()));
179         v.add(new ASN1Integer(getCoefficient()));
180 
181         if (otherPrimeInfos != null)
182         {
183             v.add(otherPrimeInfos);
184         }
185 
186         return new DERSequence(v);
187     }
188 }
189