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