1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.x509;
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 org.bouncycastle.asn1.pkcs.RSAPublicKey
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class RSAPublicKeyStructure
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  modulus;
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private BigInteger  publicExponent;
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static RSAPublicKeyStructure getInstance(
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1TaggedObject obj,
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean          explicit)
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return getInstance(ASN1Sequence.getInstance(obj, explicit));
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static RSAPublicKeyStructure getInstance(
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object obj)
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if(obj == null || obj instanceof RSAPublicKeyStructure)
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return (RSAPublicKeyStructure)obj;
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if(obj instanceof ASN1Sequence)
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return new RSAPublicKeyStructure((ASN1Sequence)obj);
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        throw new IllegalArgumentException("Invalid RSAPublicKeyStructure: " + obj.getClass().getName());
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public RSAPublicKeyStructure(
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  modulus,
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        BigInteger  publicExponent)
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.modulus = modulus;
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.publicExponent = publicExponent;
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public RSAPublicKeyStructure(
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Sequence  seq)
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (seq.size() != 2)
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new IllegalArgumentException("Bad sequence size: "
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    + seq.size());
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Enumeration e = seq.getObjects();
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        modulus = ASN1Integer.getInstance(e.nextElement()).getPositiveValue();
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        publicExponent = ASN1Integer.getInstance(e.nextElement()).getPositiveValue();
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getModulus()
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return modulus;
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public BigInteger getPublicExponent()
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return publicExponent;
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * This outputs the key in PKCS1v2 format.
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <pre>
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      RSAPublicKey ::= SEQUENCE {
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          modulus INTEGER, -- n
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                          publicExponent INTEGER, -- e
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                      }
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * </pre>
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <p>
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1EncodableVector  v = new ASN1EncodableVector();
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getModulus()));
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getPublicExponent()));
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return new DERSequence(v);
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
99