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