14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.dh;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.ObjectInputStream;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.ObjectOutputStream;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.math.BigInteger;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Enumeration;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.interfaces.DHPrivateKey;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.DHParameterSpec;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.DHPrivateKeySpec;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encodable;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer;
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence;
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERObjectIdentifier;
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.DHParameter;
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x9.DHDomainParameters;
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DHPrivateKeyParameters;
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.asymmetric.util.PKCS12BagAttributeCarrierImpl;
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier;
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class BCDHPrivateKey
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    implements DHPrivateKey, PKCS12BagAttributeCarrier
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    static final long serialVersionUID = 311058815616901812L;
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private BigInteger      x;
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private transient DHParameterSpec dhSpec;
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private transient PrivateKeyInfo  info;
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private transient PKCS12BagAttributeCarrierImpl attrCarrier = new PKCS12BagAttributeCarrierImpl();
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected BCDHPrivateKey()
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    BCDHPrivateKey(
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DHPrivateKey key)
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.x = key.getX();
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.dhSpec = key.getParams();
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    BCDHPrivateKey(
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DHPrivateKeySpec spec)
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.x = spec.getX();
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.dhSpec = new DHParameterSpec(spec.getP(), spec.getG());
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public BCDHPrivateKey(
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        PrivateKeyInfo info)
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Sequence    seq = ASN1Sequence.getInstance(info.getPrivateKeyAlgorithm().getParameters());
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Integer      derX = (ASN1Integer)info.parsePrivateKey();
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1ObjectIdentifier id = info.getPrivateKeyAlgorithm().getAlgorithm();
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.info = info;
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.x = derX.getValue();
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (id.equals(PKCSObjectIdentifiers.dhKeyAgreement))
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            DHParameter params = DHParameter.getInstance(seq);
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (params.getL() != null)
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                this.dhSpec = new DHParameterSpec(params.getP(), params.getG(), params.getL().intValue());
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                this.dhSpec = new DHParameterSpec(params.getP(), params.getG());
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (id.equals(X9ObjectIdentifiers.dhpublicnumber))
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            DHDomainParameters params = DHDomainParameters.getInstance(seq);
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            this.dhSpec = new DHParameterSpec(params.getP().getValue(), params.getG().getValue());
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new IllegalArgumentException("unknown algorithm type: " + id);
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    BCDHPrivateKey(
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DHPrivateKeyParameters params)
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.x = params.getX();
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.dhSpec = new DHParameterSpec(params.getParameters().getP(), params.getParameters().getG(), params.getParameters().getL());
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public String getAlgorithm()
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return "DH";
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    /**
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * return the encoding format we produce in getEncoded().
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     *
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @return the string "PKCS#8"
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     */
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public String getFormat()
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return "PKCS#8";
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    /**
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * Return a PKCS8 representation of the key. The sequence returned
1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * represents a full PrivateKeyInfo object.
1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     *
1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @return a PKCS8 representation of the key.
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     */
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public byte[] getEncoded()
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        try
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (info != null)
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return info.getEncoded(ASN1Encoding.DER);
1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            PrivateKeyInfo          info = new PrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.dhKeyAgreement, new DHParameter(dhSpec.getP(), dhSpec.getG(), dhSpec.getL()).toASN1Primitive()), new ASN1Integer(getX()));
1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return info.getEncoded(ASN1Encoding.DER);
1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        catch (Exception e)
1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return null;
1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public DHParameterSpec getParams()
1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return dhSpec;
1464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public BigInteger getX()
1494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return x;
1514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public boolean equals(
1544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Object o)
1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (!(o instanceof DHPrivateKey))
1574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return false;
1594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DHPrivateKey other = (DHPrivateKey)o;
1624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return this.getX().equals(other.getX())
1644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            && this.getParams().getG().equals(other.getParams().getG())
1654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            && this.getParams().getP().equals(other.getParams().getP())
1664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            && this.getParams().getL() == other.getParams().getL();
1674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public int hashCode()
1704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return this.getX().hashCode() ^ this.getParams().getG().hashCode()
1724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                ^ this.getParams().getP().hashCode() ^ this.getParams().getL();
1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void setBagAttribute(
1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1ObjectIdentifier oid,
1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Encodable attribute)
1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        attrCarrier.setBagAttribute(oid, attribute);
1804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Encodable getBagAttribute(
1834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DERObjectIdentifier oid)
1844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return attrCarrier.getBagAttribute(oid);
1864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public Enumeration getBagAttributeKeys()
1894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return attrCarrier.getBagAttributeKeys();
1914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private void readObject(
1944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ObjectInputStream   in)
1954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException, ClassNotFoundException
1964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        in.defaultReadObject();
1984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.dhSpec = new DHParameterSpec((BigInteger)in.readObject(), (BigInteger)in.readObject(), in.readInt());
2004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.info = null;
2014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.attrCarrier = new PKCS12BagAttributeCarrierImpl();
2024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
2034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private void writeObject(
2054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ObjectOutputStream  out)
2064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
2074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
2084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        out.defaultWriteObject();
2094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        out.writeObject(dhSpec.getP());
2114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        out.writeObject(dhSpec.getG());
2124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        out.writeInt(dhSpec.getL());
2134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
2144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
215