14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.asn1.pkcs;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.math.BigInteger;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Enumeration;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1EncodableVector;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1TaggedObject;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERSequence;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class RSAPublicKey
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private BigInteger modulus;
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private BigInteger publicExponent;
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static RSAPublicKey getInstance(
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1TaggedObject obj,
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        boolean          explicit)
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return getInstance(ASN1Sequence.getInstance(obj, explicit));
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static RSAPublicKey getInstance(
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Object obj)
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj instanceof RSAPublicKey)
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return (RSAPublicKey)obj;
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj != null)
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new RSAPublicKey(ASN1Sequence.getInstance(obj));
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public RSAPublicKey(
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        BigInteger modulus,
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        BigInteger publicExponent)
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.modulus = modulus;
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.publicExponent = publicExponent;
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private RSAPublicKey(
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Sequence seq)
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (seq.size() != 2)
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new IllegalArgumentException("Bad sequence size: "
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    + seq.size());
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Enumeration e = seq.getObjects();
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        modulus = ASN1Integer.getInstance(e.nextElement()).getPositiveValue();
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        publicExponent = ASN1Integer.getInstance(e.nextElement()).getPositiveValue();
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public BigInteger getModulus()
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return modulus;
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public BigInteger getPublicExponent()
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return publicExponent;
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    /**
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * This outputs the key in PKCS1v2 format.
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * <pre>
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     *      RSAPublicKey ::= SEQUENCE {
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     *                          modulus INTEGER, -- n
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     *                          publicExponent INTEGER, -- e
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     *                      }
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * </pre>
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * <p>
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     */
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1EncodableVector v = new ASN1EncodableVector();
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getModulus()));
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        v.add(new ASN1Integer(getPublicExponent()));
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return new DERSequence(v);
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
96