001package org.apache.commons.ssl.org.bouncycastle.asn1.ua;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
009
010public class DSTU4145BinaryField
011    extends ASN1Object
012{
013
014    private int m, k, j, l;
015
016    private DSTU4145BinaryField(ASN1Sequence seq)
017    {
018        m = ASN1Integer.getInstance(seq.getObjectAt(0)).getPositiveValue().intValue();
019
020        if (seq.getObjectAt(1) instanceof ASN1Integer)
021        {
022            k = ((ASN1Integer)seq.getObjectAt(1)).getPositiveValue().intValue();
023        }
024        else if (seq.getObjectAt(1) instanceof ASN1Sequence)
025        {
026            ASN1Sequence coefs = ASN1Sequence.getInstance(seq.getObjectAt(1));
027
028            k = ASN1Integer.getInstance(coefs.getObjectAt(0)).getPositiveValue().intValue();
029            j = ASN1Integer.getInstance(coefs.getObjectAt(1)).getPositiveValue().intValue();
030            l = ASN1Integer.getInstance(coefs.getObjectAt(2)).getPositiveValue().intValue();
031        }
032        else
033        {
034            throw new IllegalArgumentException("object parse error");
035        }
036    }
037
038    public static DSTU4145BinaryField getInstance(Object obj)
039    {
040        if (obj instanceof DSTU4145BinaryField)
041        {
042            return (DSTU4145BinaryField)obj;
043        }
044
045        if (obj != null)
046        {
047            return new DSTU4145BinaryField(ASN1Sequence.getInstance(obj));
048        }
049
050        return null;
051    }
052
053    public DSTU4145BinaryField(int m, int k1, int k2, int k3)
054    {
055        this.m = m;
056        this.k = k1;
057        this.j = k2;
058        this.l = k3;
059    }
060
061    public int getM()
062    {
063        return m;
064    }
065
066    public int getK1()
067    {
068        return k;
069    }
070
071    public int getK2()
072    {
073        return j;
074    }
075
076    public int getK3()
077    {
078        return l;
079    }
080
081    public DSTU4145BinaryField(int m, int k)
082    {
083        this(m, k, 0, 0);
084    }
085
086    /**
087     * BinaryField ::= SEQUENCE {
088     * M INTEGER,
089     * CHOICE {Trinomial,    Pentanomial}
090     * Trinomial::= INTEGER
091     * Pentanomial::= SEQUENCE {
092     * k INTEGER,
093     * j INTEGER,
094     * l INTEGER}
095     */
096    public ASN1Primitive toASN1Primitive()
097    {
098
099        ASN1EncodableVector v = new ASN1EncodableVector();
100
101        v.add(new ASN1Integer(m));
102        if (j == 0) //Trinomial
103        {
104            v.add(new ASN1Integer(k));
105        }
106        else
107        {
108            ASN1EncodableVector coefs = new ASN1EncodableVector();
109            coefs.add(new ASN1Integer(k));
110            coefs.add(new ASN1Integer(j));
111            coefs.add(new ASN1Integer(l));
112
113            v.add(new DERSequence(coefs));
114        }
115
116        return new DERSequence(v);
117    }
118
119}