001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import java.math.BigInteger;
004import java.util.Enumeration;
005
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
012import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
013
014public class DSAParameter
015    extends ASN1Object
016{
017    ASN1Integer      p, q, g;
018
019    public static DSAParameter getInstance(
020        ASN1TaggedObject obj,
021        boolean          explicit)
022    {
023        return getInstance(ASN1Sequence.getInstance(obj, explicit));
024    }
025
026    public static DSAParameter getInstance(
027        Object obj)
028    {
029        if (obj instanceof DSAParameter)
030        {
031            return (DSAParameter)obj;
032        }
033        
034        if(obj != null)
035        {
036            return new DSAParameter(ASN1Sequence.getInstance(obj));
037        }
038        
039        return null;
040    }
041
042    public DSAParameter(
043        BigInteger  p,
044        BigInteger  q,
045        BigInteger  g)
046    {
047        this.p = new ASN1Integer(p);
048        this.q = new ASN1Integer(q);
049        this.g = new ASN1Integer(g);
050    }
051
052    private DSAParameter(
053        ASN1Sequence  seq)
054    {
055        if (seq.size() != 3)
056        {
057            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
058        }
059        
060        Enumeration     e = seq.getObjects();
061
062        p = ASN1Integer.getInstance(e.nextElement());
063        q = ASN1Integer.getInstance(e.nextElement());
064        g = ASN1Integer.getInstance(e.nextElement());
065    }
066
067    public BigInteger getP()
068    {
069        return p.getPositiveValue();
070    }
071
072    public BigInteger getQ()
073    {
074        return q.getPositiveValue();
075    }
076
077    public BigInteger getG()
078    {
079        return g.getPositiveValue();
080    }
081
082    public ASN1Primitive toASN1Primitive()
083    {
084        ASN1EncodableVector  v = new ASN1EncodableVector();
085
086        v.add(p);
087        v.add(q);
088        v.add(g);
089
090        return new DERSequence(v);
091    }
092}