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.ByteArrayInputStream; 22 import java.io.ByteArrayOutputStream; 23 import java.io.IOException; 24 import java.io.ObjectInputStream; 25 import java.io.ObjectOutputStream; 26 import java.math.BigInteger; 27 import java.security.interfaces.RSAPrivateKey; 28 import java.security.spec.RSAPrivateKeySpec; 29 import java.util.Enumeration; 30 import java.util.Hashtable; 31 import java.util.Vector; 32 33 import org.apache.geronimo.util.asn1.ASN1InputStream; 34 import org.apache.geronimo.util.asn1.ASN1OutputStream; 35 import org.apache.geronimo.util.asn1.DEREncodable; 36 import org.apache.geronimo.util.asn1.DERObjectIdentifier; 37 import org.apache.geronimo.util.crypto.params.RSAKeyParameters; 38 import org.apache.geronimo.util.jce.interfaces.PKCS12BagAttributeCarrier; 39 40 public class JCERSAPrivateKey 41 implements RSAPrivateKey, PKCS12BagAttributeCarrier 42 { 43 protected BigInteger modulus; 44 protected BigInteger privateExponent; 45 46 private Hashtable pkcs12Attributes = new Hashtable(); 47 private Vector pkcs12Ordering = new Vector(); 48 49 protected JCERSAPrivateKey() 50 { 51 } 52 53 JCERSAPrivateKey( 54 RSAKeyParameters key) 55 { 56 this.modulus = key.getModulus(); 57 this.privateExponent = key.getExponent(); 58 } 59 60 JCERSAPrivateKey( 61 RSAPrivateKeySpec spec) 62 { 63 this.modulus = spec.getModulus(); 64 this.privateExponent = spec.getPrivateExponent(); 65 } 66 67 JCERSAPrivateKey( 68 RSAPrivateKey key) 69 { 70 this.modulus = key.getModulus(); 71 this.privateExponent = key.getPrivateExponent(); 72 } 73 74 public BigInteger getModulus() 75 { 76 return modulus; 77 } 78 79 public BigInteger getPrivateExponent() 80 { 81 return privateExponent; 82 } 83 84 public String getAlgorithm() 85 { 86 return "RSA"; 87 } 88 89 public String getFormat() 90 { 91 return "NULL"; 92 } 93 94 public byte[] getEncoded() 95 { 96 return null; 97 } 98 99 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 }