1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.x509;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.Enumeration;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence;
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1TaggedObject;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERSequence;
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERTaggedObject;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class NameConstraints
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
1670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    private GeneralSubtree[] permitted, excluded;
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static NameConstraints getInstance(Object obj)
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj instanceof NameConstraints)
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return (NameConstraints)obj;
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj != null)
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new NameConstraints(ASN1Sequence.getInstance(obj));
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private NameConstraints(ASN1Sequence seq)
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Enumeration e = seq.getObjects();
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        while (e.hasMoreElements())
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            ASN1TaggedObject o = ASN1TaggedObject.getInstance(e.nextElement());
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            switch (o.getTagNo())
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
4070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom                case 0:
4170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom                    permitted = createArray(ASN1Sequence.getInstance(o, false));
4270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom                    break;
4370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom                case 1:
4470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom                    excluded = createArray(ASN1Sequence.getInstance(o, false));
4570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom                    break;
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Constructor from a given details.
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <p>
5470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom     * permitted and excluded are arrays of GeneralSubtree objects.
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param permitted
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *            Permitted subtrees
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param excluded
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *            Excludes subtrees
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public NameConstraints(
6270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        GeneralSubtree[] permitted,
6370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        GeneralSubtree[] excluded)
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (permitted != null)
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
6770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            this.permitted = permitted;
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
6970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (excluded != null)
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
7270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            this.excluded = excluded;
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
7670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    private GeneralSubtree[] createArray(ASN1Sequence subtree)
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
7870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        GeneralSubtree[] ar = new GeneralSubtree[subtree.size()];
7970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
8070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        for (int i = 0; i != ar.length; i++)
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
8270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            ar[i] = GeneralSubtree.getInstance(subtree.getObjectAt(i));
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
8470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
8570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        return ar;
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
8870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    public GeneralSubtree[] getPermittedSubtrees()
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return permitted;
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
9370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    public GeneralSubtree[] getExcludedSubtrees()
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return excluded;
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /*
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * NameConstraints ::= SEQUENCE { permittedSubtrees [0] GeneralSubtrees
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * OPTIONAL, excludedSubtrees [1] GeneralSubtrees OPTIONAL }
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1EncodableVector v = new ASN1EncodableVector();
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
10670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        if (permitted != null)
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
10870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            v.add(new DERTaggedObject(false, 0, new DERSequence(permitted)));
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
11170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        if (excluded != null)
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
11370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            v.add(new DERTaggedObject(false, 1, new DERSequence(excluded)));
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return new DERSequence(v);
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
119