1 /**
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one or more
4 * contributor license agreements. See the NOTICE file distributed with
5 * this work for additional information regarding copyright ownership.
6 * The ASF licenses this file to You under the Apache License, Version 2.0
7 * (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 package org.apache.geronimo.util.jce.provider;
20
21 import java.io.ByteArrayOutputStream;
22 import java.io.IOException;
23 import java.math.BigInteger;
24 import java.security.interfaces.RSAPublicKey;
25 import java.security.spec.RSAPublicKeySpec;
26
27 import org.apache.geronimo.util.asn1.ASN1Sequence;
28 import org.apache.geronimo.util.asn1.DERNull;
29 import org.apache.geronimo.util.asn1.DEROutputStream;
30 import org.apache.geronimo.util.asn1.pkcs.PKCSObjectIdentifiers;
31 import org.apache.geronimo.util.asn1.x509.AlgorithmIdentifier;
32 import org.apache.geronimo.util.asn1.x509.RSAPublicKeyStructure;
33 import org.apache.geronimo.util.asn1.x509.SubjectPublicKeyInfo;
34 import org.apache.geronimo.util.crypto.params.RSAKeyParameters;
35
36 public class JCERSAPublicKey
37 implements RSAPublicKey
38 {
39 private BigInteger modulus;
40 private BigInteger publicExponent;
41
42 JCERSAPublicKey(
43 RSAKeyParameters key)
44 {
45 this.modulus = key.getModulus();
46 this.publicExponent = key.getExponent();
47 }
48
49 JCERSAPublicKey(
50 RSAPublicKeySpec spec)
51 {
52 this.modulus = spec.getModulus();
53 this.publicExponent = spec.getPublicExponent();
54 }
55
56 JCERSAPublicKey(
57 RSAPublicKey key)
58 {
59 this.modulus = key.getModulus();
60 this.publicExponent = key.getPublicExponent();
61 }
62
63 JCERSAPublicKey(
64 SubjectPublicKeyInfo info)
65 {
66 try
67 {
68 RSAPublicKeyStructure pubKey = new RSAPublicKeyStructure((ASN1Sequence)info.getPublicKey());
69
70 this.modulus = pubKey.getModulus();
71 this.publicExponent = pubKey.getPublicExponent();
72 }
73 catch (IOException e)
74 {
75 throw new IllegalArgumentException("invalid info structure in RSA public key");
76 }
77 }
78
79 /**
80 * return the modulus.
81 *
82 * @return the modulus.
83 */
84 public BigInteger getModulus()
85 {
86 return modulus;
87 }
88
89 /**
90 * return the public exponent.
91 *
92 * @return the public exponent.
93 */
94 public BigInteger getPublicExponent()
95 {
96 return publicExponent;
97 }
98
99 public String getAlgorithm()
100 {
101 return "RSA";
102 }
103
104 public String getFormat()
105 {
106 return "X.509";
107 }
108
109 public byte[] getEncoded()
110 {
111 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
112 DEROutputStream dOut = new DEROutputStream(bOut);
113 SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new RSAPublicKeyStructure(getModulus(), getPublicExponent()).getDERObject());
114
115 try
116 {
117 dOut.writeObject(info);
118 dOut.close();
119 }
120 catch (IOException e)
121 {
122 throw new RuntimeException("Error encoding RSA public key");
123 }
124
125 return bOut.toByteArray();
126
127 }
128
129 public boolean equals(Object o)
130 {
131 if ( !(o instanceof RSAPublicKey) )
132 {
133 return false;
134 }
135
136 if ( o == this )
137 {
138 return true;
139 }
140
141 RSAPublicKey key = (RSAPublicKey)o;
142
143 return getModulus().equals(key.getModulus())
144 && getPublicExponent().equals(key.getPublicExponent());
145 }
146
147 public String toString()
148 {
149 StringBuffer buf = new StringBuffer();
150 String nl = System.getProperty("line.separator");
151
152 buf.append("RSA Public Key" + nl);
153 buf.append(" modulus: " + this.getModulus().toString(16) + nl);
154 buf.append(" public exponent: " + this.getPublicExponent().toString(16) + nl);
155
156 return buf.toString();
157 }
158 }