1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.pkcs;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.math.BigInteger;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.Enumeration;
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence;
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1TaggedObject;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERSequence;
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/**
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @deprecated use RSAPrivateKey
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class RSAPrivateKeyStructure
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private int         version;
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  modulus;
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  publicExponent;
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  privateExponent;
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  prime1;
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  prime2;
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  exponent1;
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  exponent2;
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  coefficient;
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private ASN1Sequence otherPrimeInfos = null;
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static RSAPrivateKeyStructure getInstance(
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1TaggedObject obj,
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean          explicit)
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return getInstance(ASN1Sequence.getInstance(obj, explicit));
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static RSAPrivateKeyStructure getInstance(
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object  obj)
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (obj instanceof RSAPrivateKeyStructure)
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return (RSAPrivateKeyStructure)obj;
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        else if (obj instanceof ASN1Sequence)
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return new RSAPrivateKeyStructure((ASN1Sequence)obj);
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
50c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public RSAPrivateKeyStructure(
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  modulus,
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  publicExponent,
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  privateExponent,
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  prime1,
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  prime2,
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  exponent1,
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  exponent2,
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  coefficient)
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.version = 0;
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.modulus = modulus;
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.publicExponent = publicExponent;
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.privateExponent = privateExponent;
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.prime1 = prime1;
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.prime2 = prime2;
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.exponent1 = exponent1;
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.exponent2 = exponent2;
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.coefficient = coefficient;
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public RSAPrivateKeyStructure(
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Sequence  seq)
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Enumeration e = seq.getObjects();
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        BigInteger  v = ((ASN1Integer)e.nextElement()).getValue();
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (v.intValue() != 0 && v.intValue() != 1)
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new IllegalArgumentException("wrong version for RSA private key");
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        version = v.intValue();
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        modulus = ((ASN1Integer)e.nextElement()).getValue();
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        publicExponent = ((ASN1Integer)e.nextElement()).getValue();
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        privateExponent = ((ASN1Integer)e.nextElement()).getValue();
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        prime1 = ((ASN1Integer)e.nextElement()).getValue();
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        prime2 = ((ASN1Integer)e.nextElement()).getValue();
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        exponent1 = ((ASN1Integer)e.nextElement()).getValue();
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        exponent2 = ((ASN1Integer)e.nextElement()).getValue();
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        coefficient = ((ASN1Integer)e.nextElement()).getValue();
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (e.hasMoreElements())
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            otherPrimeInfos = (ASN1Sequence)e.nextElement();
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int getVersion()
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return version;
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getModulus()
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return modulus;
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getPublicExponent()
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return publicExponent;
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getPrivateExponent()
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return privateExponent;
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getPrime1()
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return prime1;
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getPrime2()
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return prime2;
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getExponent1()
132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return exponent1;
134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getExponent2()
137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return exponent2;
139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getCoefficient()
142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return coefficient;
144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
147b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * This outputs the key in PKCS1v2 format.
148b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <pre>
149b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      RSAPrivateKey ::= SEQUENCE {
150b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          version Version,
151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          modulus INTEGER, -- n
152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          publicExponent INTEGER, -- e
153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          privateExponent INTEGER, -- d
154b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          prime1 INTEGER, -- p
155b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          prime2 INTEGER, -- q
156b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          exponent1 INTEGER, -- d mod (p-1)
157b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          exponent2 INTEGER, -- d mod (q-1)
158b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          coefficient INTEGER, -- (inverse of q) mod p
159b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          otherPrimeInfos OtherPrimeInfos OPTIONAL
160b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                      }
161b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
162b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      Version ::= INTEGER { two-prime(0), multi(1) }
163b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *        (CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --})
164b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * </pre>
165b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <p>
166b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * This routine is written to output PKCS1 version 2.1, private keys.
167b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
169b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
170b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1EncodableVector  v = new ASN1EncodableVector();
171b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(version));                       // version
1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getModulus()));
1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getPublicExponent()));
1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getPrivateExponent()));
1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getPrime1()));
1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getPrime2()));
1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getExponent1()));
1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getExponent2()));
1804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getCoefficient()));
181b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
182b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (otherPrimeInfos != null)
183b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
184b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            v.add(otherPrimeInfos);
185b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
186b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
187b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return new DERSequence(v);
188b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
189b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
190