blob: 74b8d083b34148f637038191a4d6765ba30827d0 [file] [log] [blame]
package org.bouncycastle.jce.provider;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.math.BigInteger;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.RSAPrivateKeySpec;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1OutputStream;
import org.bouncycastle.asn1.DEREncodable;
import org.bouncycastle.asn1.DERObjectIdentifier;
import org.bouncycastle.crypto.params.RSAKeyParameters;
import org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier;
public class JCERSAPrivateKey
implements RSAPrivateKey, PKCS12BagAttributeCarrier
{
protected BigInteger modulus;
protected BigInteger privateExponent;
private Hashtable pkcs12Attributes = new Hashtable();
private Vector pkcs12Ordering = new Vector();
protected JCERSAPrivateKey()
{
}
JCERSAPrivateKey(
RSAKeyParameters key)
{
this.modulus = key.getModulus();
this.privateExponent = key.getExponent();
}
JCERSAPrivateKey(
RSAPrivateKeySpec spec)
{
this.modulus = spec.getModulus();
this.privateExponent = spec.getPrivateExponent();
}
JCERSAPrivateKey(
RSAPrivateKey key)
{
this.modulus = key.getModulus();
this.privateExponent = key.getPrivateExponent();
}
public BigInteger getModulus()
{
return modulus;
}
public BigInteger getPrivateExponent()
{
return privateExponent;
}
public String getAlgorithm()
{
return "RSA";
}
public String getFormat()
{
return "NULL";
}
public byte[] getEncoded()
{
return null;
}
public boolean equals(Object o)
{
if (!(o instanceof RSAPrivateKey))
{
return false;
}
if (o == this)
{
return true;
}
RSAPrivateKey key = (RSAPrivateKey)o;
return getModulus().equals(key.getModulus())
&& getPrivateExponent().equals(key.getPrivateExponent());
}
public int hashCode()
{
return getModulus().hashCode() ^ getPrivateExponent().hashCode();
}
public void setBagAttribute(
DERObjectIdentifier oid,
DEREncodable attribute)
{
pkcs12Attributes.put(oid, attribute);
pkcs12Ordering.addElement(oid);
}
public DEREncodable getBagAttribute(
DERObjectIdentifier oid)
{
return (DEREncodable)pkcs12Attributes.get(oid);
}
public Enumeration getBagAttributeKeys()
{
return pkcs12Ordering.elements();
}
private void readObject(
ObjectInputStream in)
throws IOException, ClassNotFoundException
{
this.modulus = (BigInteger)in.readObject();
Object obj = in.readObject();
if (obj instanceof Hashtable)
{
this.pkcs12Attributes = (Hashtable)obj;
this.pkcs12Ordering = (Vector)in.readObject();
}
else
{
this.pkcs12Attributes = new Hashtable();
this.pkcs12Ordering = new Vector();
ASN1InputStream aIn = new ASN1InputStream((byte[])obj);
DERObjectIdentifier oid;
while ((oid = (DERObjectIdentifier)aIn.readObject()) != null)
{
this.setBagAttribute(oid, aIn.readObject());
}
}
this.privateExponent = (BigInteger)in.readObject();
}
private void writeObject(
ObjectOutputStream out)
throws IOException
{
out.writeObject(modulus);
if (pkcs12Ordering.size() == 0)
{
out.writeObject(pkcs12Attributes);
out.writeObject(pkcs12Ordering);
}
else
{
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ASN1OutputStream aOut = new ASN1OutputStream(bOut);
Enumeration e = this.getBagAttributeKeys();
while (e.hasMoreElements())
{
DEREncodable oid = (DEREncodable)e.nextElement();
aOut.writeObject(oid);
aOut.writeObject(pkcs12Attributes.get(oid));
}
out.writeObject(bOut.toByteArray());
}
out.writeObject(privateExponent);
}
}