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