001    /**
002     *
003     *  Licensed to the Apache Software Foundation (ASF) under one or more
004     *  contributor license agreements.  See the NOTICE file distributed with
005     *  this work for additional information regarding copyright ownership.
006     *  The ASF licenses this file to You under the Apache License, Version 2.0
007     *  (the "License"); you may not use this file except in compliance with
008     *  the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     *  Unless required by applicable law or agreed to in writing, software
013     *  distributed under the License is distributed on an "AS IS" BASIS,
014     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     *  See the License for the specific language governing permissions and
016     *  limitations under the License.
017     */
018    
019    package org.apache.geronimo.util.asn1.x509;
020    
021    import java.math.BigInteger;
022    import java.util.Enumeration;
023    
024    import org.apache.geronimo.util.asn1.ASN1Encodable;
025    import org.apache.geronimo.util.asn1.ASN1EncodableVector;
026    import org.apache.geronimo.util.asn1.ASN1Sequence;
027    import org.apache.geronimo.util.asn1.ASN1TaggedObject;
028    import org.apache.geronimo.util.asn1.DERInteger;
029    import org.apache.geronimo.util.asn1.DERObject;
030    import org.apache.geronimo.util.asn1.DERSequence;
031    
032    public class RSAPublicKeyStructure
033        extends ASN1Encodable
034    {
035        private BigInteger  modulus;
036        private BigInteger  publicExponent;
037    
038        public static RSAPublicKeyStructure getInstance(
039            ASN1TaggedObject obj,
040            boolean          explicit)
041        {
042            return getInstance(ASN1Sequence.getInstance(obj, explicit));
043        }
044    
045        public static RSAPublicKeyStructure getInstance(
046            Object obj)
047        {
048            if(obj == null || obj instanceof RSAPublicKeyStructure)
049            {
050                return (RSAPublicKeyStructure)obj;
051            }
052    
053            if(obj instanceof ASN1Sequence)
054            {
055                return new RSAPublicKeyStructure((ASN1Sequence)obj);
056            }
057    
058            throw new IllegalArgumentException("Invalid RSAPublicKeyStructure: " + obj.getClass().getName());
059        }
060    
061        public RSAPublicKeyStructure(
062            BigInteger  modulus,
063            BigInteger  publicExponent)
064        {
065            this.modulus = modulus;
066            this.publicExponent = publicExponent;
067        }
068    
069        public RSAPublicKeyStructure(
070            ASN1Sequence  seq)
071        {
072            Enumeration e = seq.getObjects();
073    
074            modulus = ((DERInteger)e.nextElement()).getPositiveValue();
075            publicExponent = ((DERInteger)e.nextElement()).getPositiveValue();
076        }
077    
078        public BigInteger getModulus()
079        {
080            return modulus;
081        }
082    
083        public BigInteger getPublicExponent()
084        {
085            return publicExponent;
086        }
087    
088        /**
089         * This outputs the key in PKCS1v2 format.
090         * <pre>
091         *      RSAPublicKey ::= SEQUENCE {
092         *                          modulus INTEGER, -- n
093         *                          publicExponent INTEGER, -- e
094         *                      }
095         * </pre>
096         * <p>
097         */
098        public DERObject toASN1Object()
099        {
100            ASN1EncodableVector  v = new ASN1EncodableVector();
101    
102            v.add(new DERInteger(getModulus()));
103            v.add(new DERInteger(getPublicExponent()));
104    
105            return new DERSequence(v);
106        }
107    }