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