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