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