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.jce.provider;
020
021 import java.io.ByteArrayInputStream;
022 import java.io.ByteArrayOutputStream;
023 import java.io.IOException;
024 import java.io.ObjectInputStream;
025 import java.io.ObjectOutputStream;
026 import java.math.BigInteger;
027 import java.security.interfaces.RSAPrivateKey;
028 import java.security.spec.RSAPrivateKeySpec;
029 import java.util.Enumeration;
030 import java.util.Hashtable;
031 import java.util.Vector;
032
033 import org.apache.geronimo.util.asn1.ASN1InputStream;
034 import org.apache.geronimo.util.asn1.ASN1OutputStream;
035 import org.apache.geronimo.util.asn1.DEREncodable;
036 import org.apache.geronimo.util.asn1.DERObjectIdentifier;
037 import org.apache.geronimo.util.crypto.params.RSAKeyParameters;
038 import org.apache.geronimo.util.jce.interfaces.PKCS12BagAttributeCarrier;
039
040 public class JCERSAPrivateKey
041 implements RSAPrivateKey, PKCS12BagAttributeCarrier
042 {
043 protected BigInteger modulus;
044 protected BigInteger privateExponent;
045
046 private Hashtable pkcs12Attributes = new Hashtable();
047 private Vector pkcs12Ordering = new Vector();
048
049 protected JCERSAPrivateKey()
050 {
051 }
052
053 JCERSAPrivateKey(
054 RSAKeyParameters key)
055 {
056 this.modulus = key.getModulus();
057 this.privateExponent = key.getExponent();
058 }
059
060 JCERSAPrivateKey(
061 RSAPrivateKeySpec spec)
062 {
063 this.modulus = spec.getModulus();
064 this.privateExponent = spec.getPrivateExponent();
065 }
066
067 JCERSAPrivateKey(
068 RSAPrivateKey key)
069 {
070 this.modulus = key.getModulus();
071 this.privateExponent = key.getPrivateExponent();
072 }
073
074 public BigInteger getModulus()
075 {
076 return modulus;
077 }
078
079 public BigInteger getPrivateExponent()
080 {
081 return privateExponent;
082 }
083
084 public String getAlgorithm()
085 {
086 return "RSA";
087 }
088
089 public String getFormat()
090 {
091 return "NULL";
092 }
093
094 public byte[] getEncoded()
095 {
096 return null;
097 }
098
099 public boolean equals(Object o)
100 {
101 if ( !(o instanceof RSAPrivateKey) )
102 {
103 return false;
104 }
105
106 if ( o == this )
107 {
108 return true;
109 }
110
111 RSAPrivateKey key = (RSAPrivateKey)o;
112
113 return getModulus().equals(key.getModulus())
114 && getPrivateExponent().equals(key.getPrivateExponent());
115 }
116
117 public void setBagAttribute(
118 DERObjectIdentifier oid,
119 DEREncodable attribute)
120 {
121 pkcs12Attributes.put(oid, attribute);
122 pkcs12Ordering.addElement(oid);
123 }
124
125 public DEREncodable getBagAttribute(
126 DERObjectIdentifier oid)
127 {
128 return (DEREncodable)pkcs12Attributes.get(oid);
129 }
130
131 public Enumeration getBagAttributeKeys()
132 {
133 return pkcs12Ordering.elements();
134 }
135
136 private void readObject(
137 ObjectInputStream in)
138 throws IOException, ClassNotFoundException
139 {
140 this.modulus = (BigInteger)in.readObject();
141
142 Object obj = in.readObject();
143
144 if (obj instanceof Hashtable)
145 {
146 this.pkcs12Attributes = (Hashtable)obj;
147 this.pkcs12Ordering = (Vector)in.readObject();
148 }
149 else
150 {
151 this.pkcs12Attributes = new Hashtable();
152 this.pkcs12Ordering = new Vector();
153
154 ByteArrayInputStream bIn = new ByteArrayInputStream((byte[])obj);
155 ASN1InputStream aIn = new ASN1InputStream(bIn);
156
157 DERObjectIdentifier oid;
158
159 while ((oid = (DERObjectIdentifier)aIn.readObject()) != null)
160 {
161 this.setBagAttribute(oid, aIn.readObject());
162 }
163 }
164
165 this.privateExponent = (BigInteger)in.readObject();
166 }
167
168 private void writeObject(
169 ObjectOutputStream out)
170 throws IOException
171 {
172 out.writeObject(modulus);
173
174 if (pkcs12Ordering.size() == 0)
175 {
176 out.writeObject(pkcs12Attributes);
177 out.writeObject(pkcs12Ordering);
178 }
179 else
180 {
181 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
182 ASN1OutputStream aOut = new ASN1OutputStream(bOut);
183
184 Enumeration e = this.getBagAttributeKeys();
185
186 while (e.hasMoreElements())
187 {
188 DEREncodable oid = (DEREncodable)e.nextElement();
189
190 aOut.writeObject(oid);
191 aOut.writeObject(pkcs12Attributes.get(oid));
192 }
193
194 out.writeObject(bOut.toByteArray());
195 }
196
197 out.writeObject(privateExponent);
198 }
199 }