BasicConstraints.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)package org.bouncycastle.asn1.x509;
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import java.math.BigInteger;
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1EncodableVector;
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1Integer;
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1Object;
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1Primitive;
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1Sequence;
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport org.bouncycastle.asn1.ASN1TaggedObject;
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport org.bouncycastle.asn1.DERBoolean;
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport org.bouncycastle.asn1.DERSequence;
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)public class BasicConstraints
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    extends ASN1Object
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // BEGIN android-changed
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DERBoolean  cA = DERBoolean.FALSE;
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // END android-changed
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ASN1Integer  pathLenConstraint = null;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public static BasicConstraints getInstance(
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ASN1TaggedObject obj,
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        boolean          explicit)
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return getInstance(ASN1Sequence.getInstance(obj, explicit));
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    public static BasicConstraints getInstance(
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        Object  obj)
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    {
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        if (obj instanceof BasicConstraints)
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        {
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            return (BasicConstraints)obj;
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        }
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        if (obj instanceof X509Extension)
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        {
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            return getInstance(X509Extension.convertValueToObject((X509Extension)obj));
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        }
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        if (obj != null)
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        {
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            return new BasicConstraints(ASN1Sequence.getInstance(obj));
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        }
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return null;
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private BasicConstraints(
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ASN1Sequence   seq)
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    {
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        if (seq.size() == 0)
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        {
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            this.cA = null;
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            this.pathLenConstraint = null;
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        }
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        else
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        {
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            if (seq.getObjectAt(0) instanceof DERBoolean)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            {
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                this.cA = DERBoolean.getInstance(seq.getObjectAt(0));
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            }
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            else
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            {
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                this.cA = null;
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                this.pathLenConstraint = ASN1Integer.getInstance(seq.getObjectAt(0));
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            }
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            if (seq.size() > 1)
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            {
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                if (this.cA != null)
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    this.pathLenConstraint = ASN1Integer.getInstance(seq.getObjectAt(1));
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                }
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                else
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                {
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    throw new IllegalArgumentException("wrong sequence in constructor");
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                }
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            }
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        }
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    public BasicConstraints(
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        boolean cA)
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    {
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        if (cA)
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        {
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            // BEGIN android-changed
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            this.cA = DERBoolean.TRUE;
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            // END android-changed
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        }
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        else
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        {
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            this.cA = null;
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        }
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        this.pathLenConstraint = null;
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * create a cA=true object for the given path length constraint.
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     *
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * @param pathLenConstraint
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public BasicConstraints(
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        int     pathLenConstraint)
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    {
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        // BEGIN android-changed
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        this.cA = DERBoolean.TRUE;
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        // END android-changed
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        this.pathLenConstraint = new ASN1Integer(pathLenConstraint);
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public boolean isCA()
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    {
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return (cA != null) && cA.isTrue();
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public BigInteger getPathLenConstraint()
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    {
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        if (pathLenConstraint != null)
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        {
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            return pathLenConstraint.getValue();
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        }
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return null;
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /**
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * Produce an object suitable for an ASN1OutputStream.
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * <pre>
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * BasicConstraints := SEQUENCE {
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     *    cA                  BOOLEAN DEFAULT FALSE,
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     *    pathLenConstraint   INTEGER (0..MAX) OPTIONAL
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * }
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * </pre>
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    public ASN1Primitive toASN1Primitive()
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    {
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ASN1EncodableVector  v = new ASN1EncodableVector();
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (cA != null)
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        {
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            v.add(cA);
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (pathLenConstraint != null)  // yes some people actually do this when cA is false...
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        {
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            v.add(pathLenConstraint);
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return new DERSequence(v);
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public String toString()
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    {
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (pathLenConstraint == null)
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        {
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (cA == null)
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            {
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                return "BasicConstraints: isCa(false)";
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            }
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return "BasicConstraints: isCa(" + this.isCA() + ")";
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return "BasicConstraints: isCa(" + this.isCA() + "), pathLenConstraint = " + pathLenConstraint.getValue();
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)