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