package org.bouncycastle.asn1.x9; import java.util.Enumeration; import org.bouncycastle.asn1.ASN1Encodable; import org.bouncycastle.asn1.ASN1EncodableVector; import org.bouncycastle.asn1.ASN1Sequence; import org.bouncycastle.asn1.ASN1TaggedObject; import org.bouncycastle.asn1.DEREncodable; import org.bouncycastle.asn1.DERInteger; import org.bouncycastle.asn1.DERObject; import org.bouncycastle.asn1.DERSequence; public class DHDomainParameters extends ASN1Encodable { private DERInteger p, g, q, j; private DHValidationParms validationParms; public static DHDomainParameters getInstance(ASN1TaggedObject obj, boolean explicit) { return getInstance(ASN1Sequence.getInstance(obj, explicit)); } public static DHDomainParameters getInstance(Object obj) { if (obj == null || obj instanceof DHDomainParameters) { return (DHDomainParameters)obj; } if (obj instanceof ASN1Sequence) { return new DHDomainParameters((ASN1Sequence)obj); } throw new IllegalArgumentException("Invalid DHDomainParameters: " + obj.getClass().getName()); } public DHDomainParameters(DERInteger p, DERInteger g, DERInteger q, DERInteger j, DHValidationParms validationParms) { if (p == null) { throw new IllegalArgumentException("'p' cannot be null"); } if (g == null) { throw new IllegalArgumentException("'g' cannot be null"); } if (q == null) { throw new IllegalArgumentException("'q' cannot be null"); } this.p = p; this.g = g; this.q = q; this.j = j; this.validationParms = validationParms; } private DHDomainParameters(ASN1Sequence seq) { if (seq.size() < 3 || seq.size() > 5) { throw new IllegalArgumentException("Bad sequence size: " + seq.size()); } Enumeration e = seq.getObjects(); this.p = DERInteger.getInstance(e.nextElement()); this.g = DERInteger.getInstance(e.nextElement()); this.q = DERInteger.getInstance(e.nextElement()); DEREncodable next = getNext(e); if (next != null && next instanceof DERInteger) { this.j = DERInteger.getInstance(next); next = getNext(e); } if (next != null) { this.validationParms = DHValidationParms.getInstance(next.getDERObject()); } } private static DEREncodable getNext(Enumeration e) { return e.hasMoreElements() ? (DEREncodable)e.nextElement() : null; } public DERInteger getP() { return this.p; } public DERInteger getG() { return this.g; } public DERInteger getQ() { return this.q; } public DERInteger getJ() { return this.j; } public DHValidationParms getValidationParms() { return this.validationParms; } public DERObject toASN1Object() { ASN1EncodableVector v = new ASN1EncodableVector(); v.add(this.p); v.add(this.g); v.add(this.q); if (this.j != null) { v.add(this.j); } if (this.validationParms != null) { v.add(this.validationParms); } return new DERSequence(v); } }