001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import java.util.Enumeration;
004import java.util.Vector;
005
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString;
011import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
012import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
013import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
014import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString;
015import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
016import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
017import org.apache.commons.ssl.org.bouncycastle.asn1.DERUTF8String;
018
019/**
020 * Implementation of <code>IetfAttrSyntax</code> as specified by RFC3281.
021 */
022public class IetfAttrSyntax
023    extends ASN1Object
024{
025    public static final int VALUE_OCTETS    = 1;
026    public static final int VALUE_OID       = 2;
027    public static final int VALUE_UTF8      = 3;
028    GeneralNames            policyAuthority = null;
029    Vector                  values          = new Vector();
030    int                     valueChoice     = -1;
031
032    public static IetfAttrSyntax getInstance(Object obj)
033    {
034        if (obj instanceof IetfAttrSyntax)
035        {
036            return (IetfAttrSyntax)obj;
037        }
038        if (obj != null)
039        {
040            return new IetfAttrSyntax(ASN1Sequence.getInstance(obj));
041        }
042
043        return null;
044    }
045
046    /**
047     *  
048     */
049    private IetfAttrSyntax(ASN1Sequence seq)
050    {
051        int i = 0;
052
053        if (seq.getObjectAt(0) instanceof ASN1TaggedObject)
054        {
055            policyAuthority = GeneralNames.getInstance(((ASN1TaggedObject)seq.getObjectAt(0)), false);
056            i++;
057        }
058        else if (seq.size() == 2)
059        { // VOMS fix
060            policyAuthority = GeneralNames.getInstance(seq.getObjectAt(0));
061            i++;
062        }
063
064        if (!(seq.getObjectAt(i) instanceof ASN1Sequence))
065        {
066            throw new IllegalArgumentException("Non-IetfAttrSyntax encoding");
067        }
068
069        seq = (ASN1Sequence)seq.getObjectAt(i);
070
071        for (Enumeration e = seq.getObjects(); e.hasMoreElements();)
072        {
073            ASN1Primitive obj = (ASN1Primitive)e.nextElement();
074            int type;
075
076            if (obj instanceof ASN1ObjectIdentifier)
077            {
078                type = VALUE_OID;
079            }
080            else if (obj instanceof DERUTF8String)
081            {
082                type = VALUE_UTF8;
083            }
084            else if (obj instanceof DEROctetString)
085            {
086                type = VALUE_OCTETS;
087            }
088            else
089            {
090                throw new IllegalArgumentException("Bad value type encoding IetfAttrSyntax");
091            }
092
093            if (valueChoice < 0)
094            {
095                valueChoice = type;
096            }
097
098            if (type != valueChoice)
099            {
100                throw new IllegalArgumentException("Mix of value types in IetfAttrSyntax");
101            }
102
103            values.addElement(obj);
104        }
105    }
106
107    public GeneralNames getPolicyAuthority()
108    {
109        return policyAuthority;
110    }
111
112    public int getValueType()
113    {
114        return valueChoice;
115    }
116
117    public Object[] getValues()
118    {
119        if (this.getValueType() == VALUE_OCTETS)
120        {
121            ASN1OctetString[] tmp = new ASN1OctetString[values.size()];
122            
123            for (int i = 0; i != tmp.length; i++)
124            {
125                tmp[i] = (ASN1OctetString)values.elementAt(i);
126            }
127            
128            return tmp;
129        }
130        else if (this.getValueType() == VALUE_OID)
131        {
132            ASN1ObjectIdentifier[] tmp = new ASN1ObjectIdentifier[values.size()];
133            
134            for (int i = 0; i != tmp.length; i++)
135            {
136                tmp[i] = (ASN1ObjectIdentifier)values.elementAt(i);
137            }
138            
139            return tmp;
140        }
141        else
142        {
143            DERUTF8String[] tmp = new DERUTF8String[values.size()];
144            
145            for (int i = 0; i != tmp.length; i++)
146            {
147                tmp[i] = (DERUTF8String)values.elementAt(i);
148            }
149            
150            return tmp;
151        }
152    }
153
154    /**
155     * 
156     * <pre>
157     * 
158     *  IetfAttrSyntax ::= SEQUENCE {
159     *    policyAuthority [0] GeneralNames OPTIONAL,
160     *    values SEQUENCE OF CHOICE {
161     *      octets OCTET STRING,
162     *      oid OBJECT IDENTIFIER,
163     *      string UTF8String
164     *    }
165     *  }
166     *  
167     * </pre>
168     */
169    public ASN1Primitive toASN1Primitive()
170    {
171        ASN1EncodableVector v = new ASN1EncodableVector();
172
173        if (policyAuthority != null)
174        {
175            v.add(new DERTaggedObject(0, policyAuthority));
176        }
177
178        ASN1EncodableVector v2 = new ASN1EncodableVector();
179
180        for (Enumeration i = values.elements(); i.hasMoreElements();)
181        {
182            v2.add((ASN1Encodable)i.nextElement());
183        }
184
185        v.add(new DERSequence(v2));
186
187        return new DERSequence(v);
188    }
189}