18212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompackage org.bouncycastle.jce.provider; 28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.io.IOException; 48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.io.ObjectInputStream; 58212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.io.ObjectOutputStream; 68212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.math.BigInteger; 78212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.interfaces.ECPrivateKey; 88212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.ECParameterSpec; 98212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.ECPoint; 108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.ECPrivateKeySpec; 118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.security.spec.EllipticCurve; 128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.util.Enumeration; 138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encodable; 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding; 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier; 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive; 188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence; 198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERBitString; 208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERInteger; 218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERNull; 228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERObjectIdentifier; 238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom// BEGIN android-removed 24e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers; 258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom// import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves; 268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom// END android-removed 278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo; 288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.sec.ECPrivateKeyStructure; 298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.x509.AlgorithmIdentifier; 308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; 318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.x9.X962Parameters; 328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.x9.X9ECParameters; 338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.x9.X9ObjectIdentifiers; 348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.crypto.params.ECDomainParameters; 358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.crypto.params.ECPrivateKeyParameters; 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.asymmetric.ec.EC5Util; 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.asymmetric.ec.ECUtil; 384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.asymmetric.util.PKCS12BagAttributeCarrierImpl; 398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.jce.interfaces.ECPointEncoder; 408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier; 418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.jce.spec.ECNamedCurveSpec; 428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.math.ec.ECCurve; 438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompublic class JCEECPrivateKey 458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom implements ECPrivateKey, org.bouncycastle.jce.interfaces.ECPrivateKey, PKCS12BagAttributeCarrier, ECPointEncoder 468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{ 478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private String algorithm = "EC"; 488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private BigInteger d; 498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private ECParameterSpec ecSpec; 508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private boolean withCompression; 518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private DERBitString publicKey; 538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private PKCS12BagAttributeCarrierImpl attrCarrier = new PKCS12BagAttributeCarrierImpl(); 558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom protected JCEECPrivateKey() 578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public JCEECPrivateKey( 618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECPrivateKey key) 628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.d = key.getS(); 648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.algorithm = key.getAlgorithm(); 658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = key.getParams(); 668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public JCEECPrivateKey( 698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom String algorithm, 708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom org.bouncycastle.jce.spec.ECPrivateKeySpec spec) 718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.algorithm = algorithm; 738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.d = spec.getD(); 748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (spec.getParams() != null) // can be null if implicitlyCA 768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECCurve curve = spec.getParams().getCurve(); 788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom EllipticCurve ellipticCurve; 798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ellipticCurve = EC5Util.convertCurve(curve, spec.getParams().getSeed()); 818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = EC5Util.convertSpec(ellipticCurve, spec.getParams()); 838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else 858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = null; 878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public JCEECPrivateKey( 928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom String algorithm, 938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECPrivateKeySpec spec) 948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.algorithm = algorithm; 968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.d = spec.getS(); 978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = spec.getParams(); 988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public JCEECPrivateKey( 1018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom String algorithm, 1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom JCEECPrivateKey key) 1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.algorithm = algorithm; 1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.d = key.d; 1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = key.ecSpec; 1078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.withCompression = key.withCompression; 1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.attrCarrier = key.attrCarrier; 1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.publicKey = key.publicKey; 1108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public JCEECPrivateKey( 1138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom String algorithm, 1148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECPrivateKeyParameters params, 1158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom JCEECPublicKey pubKey, 1168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECParameterSpec spec) 1178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECDomainParameters dp = params.getParameters(); 1198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.algorithm = algorithm; 1218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.d = params.getD(); 1228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (spec == null) 1248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom EllipticCurve ellipticCurve = EC5Util.convertCurve(dp.getCurve(), dp.getSeed()); 1268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = new ECParameterSpec( 1288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ellipticCurve, 1298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom new ECPoint( 1308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom dp.getG().getX().toBigInteger(), 1318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom dp.getG().getY().toBigInteger()), 1328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom dp.getN(), 1338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom dp.getH().intValue()); 1348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else 1368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = spec; 1388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom publicKey = getPublicKeyDetails(pubKey); 1418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public JCEECPrivateKey( 1448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom String algorithm, 1458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECPrivateKeyParameters params, 1468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom JCEECPublicKey pubKey, 1478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom org.bouncycastle.jce.spec.ECParameterSpec spec) 1488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECDomainParameters dp = params.getParameters(); 1508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.algorithm = algorithm; 1528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.d = params.getD(); 1538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (spec == null) 1558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom EllipticCurve ellipticCurve = EC5Util.convertCurve(dp.getCurve(), dp.getSeed()); 1578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = new ECParameterSpec( 1598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ellipticCurve, 1608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom new ECPoint( 1618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom dp.getG().getX().toBigInteger(), 1628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom dp.getG().getY().toBigInteger()), 1638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom dp.getN(), 1648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom dp.getH().intValue()); 1658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else 1678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom EllipticCurve ellipticCurve = EC5Util.convertCurve(spec.getCurve(), spec.getSeed()); 1698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = new ECParameterSpec( 1718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ellipticCurve, 1728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom new ECPoint( 1738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom spec.getG().getX().toBigInteger(), 1748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom spec.getG().getY().toBigInteger()), 1758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom spec.getN(), 1768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom spec.getH().intValue()); 1778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom publicKey = getPublicKeyDetails(pubKey); 1808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public JCEECPrivateKey( 1838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom String algorithm, 1848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECPrivateKeyParameters params) 1858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.algorithm = algorithm; 1878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.d = params.getD(); 1888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = null; 1898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom JCEECPrivateKey( 1928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom PrivateKeyInfo info) 1934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 1948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 1958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom populateFromPrivKeyInfo(info); 1968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 1978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 1988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private void populateFromPrivKeyInfo(PrivateKeyInfo info) 1994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 2008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom X962Parameters params = new X962Parameters((ASN1Primitive)info.getPrivateKeyAlgorithm().getParameters()); 2028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (params.isNamedCurve()) 2048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1ObjectIdentifier oid = ASN1ObjectIdentifier.getInstance(params.getParameters()); 2068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom X9ECParameters ecP = ECUtil.getNamedCurveByOid(oid); 2078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // BEGIN android-removed 2098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // if (ecP == null) // GOST Curve 2108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // { 2118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // ECDomainParameters gParam = ECGOST3410NamedCurves.getByOID(oid); 2128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // EllipticCurve ellipticCurve = EC5Util.convertCurve(gParam.getCurve(), gParam.getSeed()); 2138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // 2148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // ecSpec = new ECNamedCurveSpec( 2158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // ECGOST3410NamedCurves.getName(oid), 2168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // ellipticCurve, 2178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // new ECPoint( 2188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // gParam.getG().getX().toBigInteger(), 2198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // gParam.getG().getY().toBigInteger()), 2208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // gParam.getN(), 2218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // gParam.getH()); 2228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // } 2238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // else 2248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom // END android-removed 2258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom EllipticCurve ellipticCurve = EC5Util.convertCurve(ecP.getCurve(), ecP.getSeed()); 2278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecSpec = new ECNamedCurveSpec( 2298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECUtil.getCurveName(oid), 2308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ellipticCurve, 2318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom new ECPoint( 2328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecP.getG().getX().toBigInteger(), 2338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecP.getG().getY().toBigInteger()), 2348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecP.getN(), 2358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecP.getH()); 2368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 2378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 2388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else if (params.isImplicitlyCA()) 2398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecSpec = null; 2418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 2428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else 2438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom X9ECParameters ecP = X9ECParameters.getInstance(params.getParameters()); 2458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom EllipticCurve ellipticCurve = EC5Util.convertCurve(ecP.getCurve(), ecP.getSeed()); 2468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.ecSpec = new ECParameterSpec( 2488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ellipticCurve, 2498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom new ECPoint( 2508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecP.getG().getX().toBigInteger(), 2518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecP.getG().getY().toBigInteger()), 2528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecP.getN(), 2538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecP.getH().intValue()); 2548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 2558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Encodable privKey = info.parsePrivateKey(); 2574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (privKey instanceof DERInteger) 2588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DERInteger derD = DERInteger.getInstance(privKey); 2608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.d = derD.getValue(); 2628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 2638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else 2648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ECPrivateKeyStructure ec = new ECPrivateKeyStructure((ASN1Sequence)privKey); 2668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.d = ec.getKey(); 2688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.publicKey = ec.getPublicKey(); 2698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 2708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 2718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public String getAlgorithm() 2738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return algorithm; 2758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 2768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom /** 2788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * return the encoding format we produce in getEncoded(). 2798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * 2808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * @return the string "PKCS#8" 2818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */ 2828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public String getFormat() 2838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return "PKCS#8"; 2858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 2868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom /** 2888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * Return a PKCS8 representation of the key. The sequence returned 2898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * represents a full PrivateKeyInfo object. 2908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * 2918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * @return a PKCS8 representation of the key. 2928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */ 2938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public byte[] getEncoded() 2948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom X962Parameters params; 2968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 2978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (ecSpec instanceof ECNamedCurveSpec) 2988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 2998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom DERObjectIdentifier curveOid = ECUtil.getNamedCurveOid(((ECNamedCurveSpec)ecSpec).getName()); 3006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (curveOid == null) // guess it's the OID 3016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 3026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom curveOid = new DERObjectIdentifier(((ECNamedCurveSpec)ecSpec).getName()); 3036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 3048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom params = new X962Parameters(curveOid); 3058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else if (ecSpec == null) 3078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom params = new X962Parameters(DERNull.INSTANCE); 3098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else 3118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve()); 3138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom X9ECParameters ecP = new X9ECParameters( 3158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom curve, 3168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom EC5Util.convertPoint(curve, ecSpec.getGenerator(), withCompression), 3178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecSpec.getOrder(), 3188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom BigInteger.valueOf(ecSpec.getCofactor()), 3198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ecSpec.getCurve().getSeed()); 3208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom params = new X962Parameters(ecP); 3228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom PrivateKeyInfo info; 3258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ECPrivateKeyStructure keyStructure; 3268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (publicKey != null) 3288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom keyStructure = new ECPrivateKeyStructure(this.getS(), publicKey, params); 3308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom else 3328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom keyStructure = new ECPrivateKeyStructure(this.getS(), params); 3348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom try 3378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // BEGIN android-removed 3394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // if (algorithm.equals("ECGOST3410")) 3404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // { 3414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // info = new PrivateKeyInfo(new AlgorithmIdentifier(CryptoProObjectIdentifiers.gostR3410_2001, params.toASN1Primitive()), keyStructure.toASN1Primitive()); 3424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // } 3434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // else 3444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // END android-removed 3454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 3468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom info = new PrivateKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params.toASN1Primitive()), keyStructure.toASN1Primitive()); 3484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 3498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return info.getEncoded(ASN1Encoding.DER); 3514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 3524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom catch (IOException e) 3534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 3544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return null; 3554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 3568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public ECParameterSpec getParams() 3598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return ecSpec; 3618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public org.bouncycastle.jce.spec.ECParameterSpec getParameters() 3648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (ecSpec == null) 3668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return null; 3688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return EC5Util.convertSpec(ecSpec, withCompression); 3718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom org.bouncycastle.jce.spec.ECParameterSpec engineGetSpec() 3748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (ecSpec != null) 3768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return EC5Util.convertSpec(ecSpec, withCompression); 3788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return BouncyCastleProvider.CONFIGURATION.getEcImplicitlyCa(); 3818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public BigInteger getS() 3848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return d; 3868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public BigInteger getD() 3898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return d; 3918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 3938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public void setBagAttribute( 3944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1ObjectIdentifier oid, 3954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Encodable attribute) 3968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 3978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom attrCarrier.setBagAttribute(oid, attribute); 3988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 3998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Encodable getBagAttribute( 4018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom DERObjectIdentifier oid) 4028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return attrCarrier.getBagAttribute(oid); 4048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public Enumeration getBagAttributeKeys() 4078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return attrCarrier.getBagAttributeKeys(); 4098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public void setPointFormat(String style) 4128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom withCompression = !("UNCOMPRESSED".equalsIgnoreCase(style)); 4148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public boolean equals(Object o) 4178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom if (!(o instanceof JCEECPrivateKey)) 4198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return false; 4218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom JCEECPrivateKey other = (JCEECPrivateKey)o; 4248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return getD().equals(other.getD()) && (engineGetSpec().equals(other.engineGetSpec())); 4268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public int hashCode() 4298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return getD().hashCode() ^ engineGetSpec().hashCode(); 4318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom public String toString() 4348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom StringBuffer buf = new StringBuffer(); 4368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom String nl = System.getProperty("line.separator"); 4378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom buf.append("EC Private Key").append(nl); 4398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom buf.append(" S: ").append(this.d.toString(16)).append(nl); 4408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return buf.toString(); 4428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private DERBitString getPublicKeyDetails(JCEECPublicKey pub) 4468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom try 4488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom SubjectPublicKeyInfo info = SubjectPublicKeyInfo.getInstance(ASN1Primitive.fromByteArray(pub.getEncoded())); 4508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return info.getPublicKeyData(); 4528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom catch (IOException e) 4548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { // should never happen 4558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom return null; 4568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private void readObject( 4608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ObjectInputStream in) 4618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom throws IOException, ClassNotFoundException 4628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom byte[] enc = (byte[])in.readObject(); 4648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom populateFromPrivKeyInfo(PrivateKeyInfo.getInstance(ASN1Primitive.fromByteArray(enc))); 4668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.algorithm = (String)in.readObject(); 4688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.withCompression = in.readBoolean(); 4698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom this.attrCarrier = new PKCS12BagAttributeCarrierImpl(); 4708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom attrCarrier.readObject(in); 4728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom private void writeObject( 4758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom ObjectOutputStream out) 4768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom throws IOException 4778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom { 4788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom out.writeObject(this.getEncoded()); 4798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom out.writeObject(algorithm); 4808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom out.writeBoolean(withCompression); 4818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom 4828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom attrCarrier.writeObject(out); 4838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom } 4848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom} 485