001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import java.util.Enumeration;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
012
013public class NameConstraints
014    extends ASN1Object
015{
016    private GeneralSubtree[] permitted, excluded;
017
018    public static NameConstraints getInstance(Object obj)
019    {
020        if (obj instanceof NameConstraints)
021        {
022            return (NameConstraints)obj;
023        }
024        if (obj != null)
025        {
026            return new NameConstraints(ASN1Sequence.getInstance(obj));
027        }
028
029        return null;
030    }
031
032    private NameConstraints(ASN1Sequence seq)
033    {
034        Enumeration e = seq.getObjects();
035        while (e.hasMoreElements())
036        {
037            ASN1TaggedObject o = ASN1TaggedObject.getInstance(e.nextElement());
038            switch (o.getTagNo())
039            {
040                case 0:
041                    permitted = createArray(ASN1Sequence.getInstance(o, false));
042                    break;
043                case 1:
044                    excluded = createArray(ASN1Sequence.getInstance(o, false));
045                    break;
046            }
047        }
048    }
049
050    /**
051     * Constructor from a given details.
052     * 
053     * <p>
054     * permitted and excluded are arrays of GeneralSubtree objects.
055     * 
056     * @param permitted
057     *            Permitted subtrees
058     * @param excluded
059     *            Excludes subtrees
060     */
061    public NameConstraints(
062        GeneralSubtree[] permitted,
063        GeneralSubtree[] excluded)
064    {
065        if (permitted != null)
066        {
067            this.permitted = permitted;
068        }
069
070        if (excluded != null)
071        {
072            this.excluded = excluded;
073        }
074    }
075
076    private GeneralSubtree[] createArray(ASN1Sequence subtree)
077    {
078        GeneralSubtree[] ar = new GeneralSubtree[subtree.size()];
079
080        for (int i = 0; i != ar.length; i++)
081        {
082            ar[i] = GeneralSubtree.getInstance(subtree.getObjectAt(i));
083        }
084
085        return ar;
086    }
087
088    public GeneralSubtree[] getPermittedSubtrees()
089    {
090        return permitted;
091    }
092
093    public GeneralSubtree[] getExcludedSubtrees()
094    {
095        return excluded;
096    }
097
098    /*
099     * NameConstraints ::= SEQUENCE { permittedSubtrees [0] GeneralSubtrees
100     * OPTIONAL, excludedSubtrees [1] GeneralSubtrees OPTIONAL }
101     */
102    public ASN1Primitive toASN1Primitive()
103    {
104        ASN1EncodableVector v = new ASN1EncodableVector();
105
106        if (permitted != null)
107        {
108            v.add(new DERTaggedObject(false, 0, new DERSequence(permitted)));
109        }
110
111        if (excluded != null)
112        {
113            v.add(new DERTaggedObject(false, 1, new DERSequence(excluded)));
114        }
115
116        return new DERSequence(v);
117    }
118}