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