116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.jce.provider; 216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.IOException; 416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.ObjectInputStream; 516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.ObjectOutputStream; 616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.math.BigInteger; 716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.interfaces.ECPrivateKey; 816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.spec.ECParameterSpec; 916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.spec.ECPoint; 1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.spec.ECPrivateKeySpec; 1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.spec.EllipticCurve; 1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Enumeration; 1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Encodable; 1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Encoding; 1653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giroimport org.bouncycastle.asn1.ASN1Integer; 1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1ObjectIdentifier; 1816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Primitive; 1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Sequence; 2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERBitString; 2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERNull; 22c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// BEGIN android-removed 23c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers; 24c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves; 25c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// END android-removed 2616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo; 2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.sec.ECPrivateKeyStructure; 2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x509.AlgorithmIdentifier; 2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; 3016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x9.X962Parameters; 3116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x9.X9ECParameters; 3216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x9.X9ObjectIdentifiers; 3316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.params.ECDomainParameters; 3416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.params.ECPrivateKeyParameters; 3516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.jcajce.provider.asymmetric.util.EC5Util; 3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil; 3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.jcajce.provider.asymmetric.util.PKCS12BagAttributeCarrierImpl; 3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.jce.interfaces.ECPointEncoder; 3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier; 4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.jce.spec.ECNamedCurveSpec; 4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.math.ec.ECCurve; 42bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giroimport org.bouncycastle.util.Strings; 4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class JCEECPrivateKey 4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro implements ECPrivateKey, org.bouncycastle.jce.interfaces.ECPrivateKey, PKCS12BagAttributeCarrier, ECPointEncoder 4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{ 4716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private String algorithm = "EC"; 4816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private BigInteger d; 4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private ECParameterSpec ecSpec; 5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private boolean withCompression; 5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private DERBitString publicKey; 5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private PKCS12BagAttributeCarrierImpl attrCarrier = new PKCS12BagAttributeCarrierImpl(); 5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro protected JCEECPrivateKey() 5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public JCEECPrivateKey( 6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECPrivateKey key) 6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 6316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.d = key.getS(); 6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algorithm = key.getAlgorithm(); 6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = key.getParams(); 6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public JCEECPrivateKey( 6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro String algorithm, 7016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro org.bouncycastle.jce.spec.ECPrivateKeySpec spec) 7116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 7216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algorithm = algorithm; 7316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.d = spec.getD(); 7416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (spec.getParams() != null) // can be null if implicitlyCA 7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECCurve curve = spec.getParams().getCurve(); 7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro EllipticCurve ellipticCurve; 7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ellipticCurve = EC5Util.convertCurve(curve, spec.getParams().getSeed()); 8116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 8216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = EC5Util.convertSpec(ellipticCurve, spec.getParams()); 8316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 8416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 8516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 8616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = null; 8716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 8816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 9016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 9116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public JCEECPrivateKey( 9216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro String algorithm, 9316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECPrivateKeySpec spec) 9416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 9516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algorithm = algorithm; 9616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.d = spec.getS(); 9716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = spec.getParams(); 9816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 9916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 10016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public JCEECPrivateKey( 10116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro String algorithm, 10216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro JCEECPrivateKey key) 10316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 10416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algorithm = algorithm; 10516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.d = key.d; 10616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = key.ecSpec; 10716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.withCompression = key.withCompression; 10816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.attrCarrier = key.attrCarrier; 10916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.publicKey = key.publicKey; 11016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 11116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 11216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public JCEECPrivateKey( 11316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro String algorithm, 11416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECPrivateKeyParameters params, 11516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro JCEECPublicKey pubKey, 11616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECParameterSpec spec) 11716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 11816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECDomainParameters dp = params.getParameters(); 11916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 12016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algorithm = algorithm; 12116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.d = params.getD(); 12216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 12316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (spec == null) 12416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 12516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro EllipticCurve ellipticCurve = EC5Util.convertCurve(dp.getCurve(), dp.getSeed()); 12616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 12716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = new ECParameterSpec( 12816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ellipticCurve, 12916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro new ECPoint( 13080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro dp.getG().getAffineXCoord().toBigInteger(), 13180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro dp.getG().getAffineYCoord().toBigInteger()), 13216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro dp.getN(), 13316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro dp.getH().intValue()); 13416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 13516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 13616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 13716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = spec; 13816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 13916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 14016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro publicKey = getPublicKeyDetails(pubKey); 14116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 14216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 14316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public JCEECPrivateKey( 14416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro String algorithm, 14516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECPrivateKeyParameters params, 14616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro JCEECPublicKey pubKey, 14716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro org.bouncycastle.jce.spec.ECParameterSpec spec) 14816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 14916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECDomainParameters dp = params.getParameters(); 15016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 15116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algorithm = algorithm; 15216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.d = params.getD(); 15316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 15416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (spec == null) 15516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 15616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro EllipticCurve ellipticCurve = EC5Util.convertCurve(dp.getCurve(), dp.getSeed()); 15716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 15816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = new ECParameterSpec( 15916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ellipticCurve, 16016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro new ECPoint( 16180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro dp.getG().getAffineXCoord().toBigInteger(), 16280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro dp.getG().getAffineYCoord().toBigInteger()), 16316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro dp.getN(), 16416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro dp.getH().intValue()); 16516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 16616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 16716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 16816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro EllipticCurve ellipticCurve = EC5Util.convertCurve(spec.getCurve(), spec.getSeed()); 16916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 17016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = new ECParameterSpec( 17116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ellipticCurve, 17216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro new ECPoint( 17380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro spec.getG().getAffineXCoord().toBigInteger(), 17480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro spec.getG().getAffineYCoord().toBigInteger()), 17516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro spec.getN(), 17616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro spec.getH().intValue()); 17716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 17816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 17916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro publicKey = getPublicKeyDetails(pubKey); 18016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 18116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 18216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public JCEECPrivateKey( 18316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro String algorithm, 18416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECPrivateKeyParameters params) 18516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 18616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algorithm = algorithm; 18716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.d = params.getD(); 18816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = null; 18916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 19016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 19116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro JCEECPrivateKey( 19216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro PrivateKeyInfo info) 19316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throws IOException 19416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 19516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro populateFromPrivKeyInfo(info); 19616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 19716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 19816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private void populateFromPrivKeyInfo(PrivateKeyInfo info) 19916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throws IOException 20016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 20116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro X962Parameters params = new X962Parameters((ASN1Primitive)info.getPrivateKeyAlgorithm().getParameters()); 20216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 20316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (params.isNamedCurve()) 20416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 20516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1ObjectIdentifier oid = ASN1ObjectIdentifier.getInstance(params.getParameters()); 20616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro X9ECParameters ecP = ECUtil.getNamedCurveByOid(oid); 20716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 208c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // BEGIN android-removed 209c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // if (ecP == null) // GOST Curve 210c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // { 211c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // ECDomainParameters gParam = ECGOST3410NamedCurves.getByOID(oid); 212c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // EllipticCurve ellipticCurve = EC5Util.convertCurve(gParam.getCurve(), gParam.getSeed()); 213c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // 214c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // ecSpec = new ECNamedCurveSpec( 215c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // ECGOST3410NamedCurves.getName(oid), 216c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // ellipticCurve, 217c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // new ECPoint( 218c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // gParam.getG().getAffineXCoord().toBigInteger(), 219c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // gParam.getG().getAffineYCoord().toBigInteger()), 220c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // gParam.getN(), 221c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // gParam.getH()); 222c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // } 223c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // else 224c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // END android-removed 22516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 22616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro EllipticCurve ellipticCurve = EC5Util.convertCurve(ecP.getCurve(), ecP.getSeed()); 22716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 22816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ecSpec = new ECNamedCurveSpec( 22916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECUtil.getCurveName(oid), 23016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ellipticCurve, 23116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro new ECPoint( 23280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro ecP.getG().getAffineXCoord().toBigInteger(), 23380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro ecP.getG().getAffineYCoord().toBigInteger()), 23416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ecP.getN(), 23516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ecP.getH()); 23616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 23716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 23816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else if (params.isImplicitlyCA()) 23916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 24016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ecSpec = null; 24116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 24216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 24316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 24416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro X9ECParameters ecP = X9ECParameters.getInstance(params.getParameters()); 24516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro EllipticCurve ellipticCurve = EC5Util.convertCurve(ecP.getCurve(), ecP.getSeed()); 24616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 24716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.ecSpec = new ECParameterSpec( 24816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ellipticCurve, 24916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro new ECPoint( 25080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro ecP.getG().getAffineXCoord().toBigInteger(), 25180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro ecP.getG().getAffineYCoord().toBigInteger()), 25216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ecP.getN(), 25316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ecP.getH().intValue()); 25416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 25516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 25616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1Encodable privKey = info.parsePrivateKey(); 25753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro if (privKey instanceof ASN1Integer) 25816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 25953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro ASN1Integer derD = ASN1Integer.getInstance(privKey); 26016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 26116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.d = derD.getValue(); 26216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 26316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 26416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 26516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECPrivateKeyStructure ec = new ECPrivateKeyStructure((ASN1Sequence)privKey); 26616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 26716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.d = ec.getKey(); 26816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.publicKey = ec.getPublicKey(); 26916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 27016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 27116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 27216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public String getAlgorithm() 27316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 27416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return algorithm; 27516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 27616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 27716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro /** 27816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * return the encoding format we produce in getEncoded(). 27916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * 28016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * @return the string "PKCS#8" 28116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro */ 28216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public String getFormat() 28316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 28416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return "PKCS#8"; 28516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 28616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 28716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro /** 28816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * Return a PKCS8 representation of the key. The sequence returned 28916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * represents a full PrivateKeyInfo object. 29016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * 29116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * @return a PKCS8 representation of the key. 29216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro */ 29316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public byte[] getEncoded() 29416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 29516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro X962Parameters params; 29616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 29716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (ecSpec instanceof ECNamedCurveSpec) 29816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 29953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro ASN1ObjectIdentifier curveOid = ECUtil.getNamedCurveOid(((ECNamedCurveSpec)ecSpec).getName()); 30016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (curveOid == null) // guess it's the OID 30116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 30253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro curveOid = new ASN1ObjectIdentifier(((ECNamedCurveSpec)ecSpec).getName()); 30316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 30416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro params = new X962Parameters(curveOid); 30516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 30616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else if (ecSpec == null) 30716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 30816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro params = new X962Parameters(DERNull.INSTANCE); 30916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 31016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 31116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 31216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve()); 31316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 31416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro X9ECParameters ecP = new X9ECParameters( 31516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro curve, 31616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro EC5Util.convertPoint(curve, ecSpec.getGenerator(), withCompression), 31716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ecSpec.getOrder(), 31816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro BigInteger.valueOf(ecSpec.getCofactor()), 31916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ecSpec.getCurve().getSeed()); 32016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 32116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro params = new X962Parameters(ecP); 32216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 32316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 32416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro PrivateKeyInfo info; 32516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ECPrivateKeyStructure keyStructure; 32616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 32716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (publicKey != null) 32816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 32916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro keyStructure = new ECPrivateKeyStructure(this.getS(), publicKey, params); 33016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 33116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro else 33216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 33316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro keyStructure = new ECPrivateKeyStructure(this.getS(), params); 33416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 33516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 33616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro try 33716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 338c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // BEGIN android-removed 339c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // if (algorithm.equals("ECGOST3410")) 340c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // { 341c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // info = new PrivateKeyInfo(new AlgorithmIdentifier(CryptoProObjectIdentifiers.gostR3410_2001, params.toASN1Primitive()), keyStructure.toASN1Primitive()); 342c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // } 343c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // else 344c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro // END android-removed 34516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 34616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 34716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro info = new PrivateKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params.toASN1Primitive()), keyStructure.toASN1Primitive()); 34816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 34916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 35016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return info.getEncoded(ASN1Encoding.DER); 35116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 35216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro catch (IOException e) 35316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 35416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return null; 35516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 35616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 35716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 35816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public ECParameterSpec getParams() 35916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 36016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return ecSpec; 36116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 36216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 36316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public org.bouncycastle.jce.spec.ECParameterSpec getParameters() 36416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 36516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (ecSpec == null) 36616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 36716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return null; 36816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 36916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 37016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return EC5Util.convertSpec(ecSpec, withCompression); 37116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 37216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 37316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro org.bouncycastle.jce.spec.ECParameterSpec engineGetSpec() 37416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 37516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (ecSpec != null) 37616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 37716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return EC5Util.convertSpec(ecSpec, withCompression); 37816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 37916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 38016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return BouncyCastleProvider.CONFIGURATION.getEcImplicitlyCa(); 38116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 38216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 38316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public BigInteger getS() 38416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 38516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return d; 38616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 38716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 38816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public BigInteger getD() 38916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 39016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return d; 39116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 39216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 39316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public void setBagAttribute( 39416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1ObjectIdentifier oid, 39516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1Encodable attribute) 39616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 39716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro attrCarrier.setBagAttribute(oid, attribute); 39816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 39916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 40016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public ASN1Encodable getBagAttribute( 40116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1ObjectIdentifier oid) 40216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 40316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return attrCarrier.getBagAttribute(oid); 40416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 40516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 40616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public Enumeration getBagAttributeKeys() 40716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 40816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return attrCarrier.getBagAttributeKeys(); 40916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 41016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 41116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public void setPointFormat(String style) 41216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 41316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro withCompression = !("UNCOMPRESSED".equalsIgnoreCase(style)); 41416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 41516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 41616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public boolean equals(Object o) 41716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 41816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (!(o instanceof JCEECPrivateKey)) 41916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 42016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return false; 42116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 42216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 42316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro JCEECPrivateKey other = (JCEECPrivateKey)o; 42416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 42516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return getD().equals(other.getD()) && (engineGetSpec().equals(other.engineGetSpec())); 42616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 42716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 42816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public int hashCode() 42916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 43016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return getD().hashCode() ^ engineGetSpec().hashCode(); 43116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 43216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 43316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public String toString() 43416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 43516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro StringBuffer buf = new StringBuffer(); 436bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro String nl = Strings.lineSeparator(); 43716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 43816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro buf.append("EC Private Key").append(nl); 43916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro buf.append(" S: ").append(this.d.toString(16)).append(nl); 44016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 44116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return buf.toString(); 44216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 44316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 44416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 44516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private DERBitString getPublicKeyDetails(JCEECPublicKey pub) 44616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 44716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro try 44816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 44916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro SubjectPublicKeyInfo info = SubjectPublicKeyInfo.getInstance(ASN1Primitive.fromByteArray(pub.getEncoded())); 45016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 45116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return info.getPublicKeyData(); 45216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 45316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro catch (IOException e) 45416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { // should never happen 45516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return null; 45616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 45716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 45816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 45916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private void readObject( 46016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ObjectInputStream in) 46116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throws IOException, ClassNotFoundException 46216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 46316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro byte[] enc = (byte[])in.readObject(); 46416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 46516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro populateFromPrivKeyInfo(PrivateKeyInfo.getInstance(ASN1Primitive.fromByteArray(enc))); 46616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 46716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.algorithm = (String)in.readObject(); 46816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.withCompression = in.readBoolean(); 46916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro this.attrCarrier = new PKCS12BagAttributeCarrierImpl(); 47016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 47116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro attrCarrier.readObject(in); 47216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 47316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 47416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro private void writeObject( 47516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ObjectOutputStream out) 47616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throws IOException 47716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 47816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro out.writeObject(this.getEncoded()); 47916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro out.writeObject(algorithm); 48016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro out.writeBoolean(withCompression); 48116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 48216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro attrCarrier.writeObject(out); 48316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 48416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro} 485