14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.rsa;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.ObjectInputStream;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.ObjectOutputStream;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.math.BigInteger;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.interfaces.RSAPrivateKey;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.RSAPrivateKeySpec;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Enumeration;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encodable;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERNull;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.RSAKeyParameters;
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil;
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.asymmetric.util.PKCS12BagAttributeCarrierImpl;
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier;
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class BCRSAPrivateKey
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    implements RSAPrivateKey, PKCS12BagAttributeCarrier
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    static final long serialVersionUID = 5110188922551353628L;
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private static BigInteger ZERO = BigInteger.valueOf(0);
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected BigInteger modulus;
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected BigInteger privateExponent;
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private transient PKCS12BagAttributeCarrierImpl   attrCarrier = new PKCS12BagAttributeCarrierImpl();
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected BCRSAPrivateKey()
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    BCRSAPrivateKey(
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        RSAKeyParameters key)
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.modulus = key.getModulus();
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.privateExponent = key.getExponent();
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    BCRSAPrivateKey(
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        RSAPrivateKeySpec spec)
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.modulus = spec.getModulus();
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.privateExponent = spec.getPrivateExponent();
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    BCRSAPrivateKey(
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        RSAPrivateKey key)
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.modulus = key.getModulus();
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.privateExponent = key.getPrivateExponent();
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public BigInteger getModulus()
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return modulus;
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public BigInteger getPrivateExponent()
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return privateExponent;
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public String getAlgorithm()
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return "RSA";
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public String getFormat()
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return "PKCS#8";
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public byte[] getEncoded()
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return KeyUtil.getEncodedPrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new org.bouncycastle.asn1.pkcs.RSAPrivateKey(getModulus(), ZERO, getPrivateExponent(), ZERO, ZERO, ZERO, ZERO, ZERO));
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public boolean equals(Object o)
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (!(o instanceof RSAPrivateKey))
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return false;
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (o == this)
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return true;
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        RSAPrivateKey key = (RSAPrivateKey)o;
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return getModulus().equals(key.getModulus())
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            && getPrivateExponent().equals(key.getPrivateExponent());
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public int hashCode()
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return getModulus().hashCode() ^ getPrivateExponent().hashCode();
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void setBagAttribute(
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1ObjectIdentifier oid,
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Encodable attribute)
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        attrCarrier.setBagAttribute(oid, attribute);
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Encodable getBagAttribute(
11470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        ASN1ObjectIdentifier oid)
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return attrCarrier.getBagAttribute(oid);
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public Enumeration getBagAttributeKeys()
1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return attrCarrier.getBagAttributeKeys();
1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private void readObject(
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ObjectInputStream   in)
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException, ClassNotFoundException
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        in.defaultReadObject();
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.attrCarrier = new PKCS12BagAttributeCarrierImpl();
1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private void writeObject(
1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ObjectOutputStream  out)
1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        out.defaultWriteObject();
1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
140