1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.util.Arrays;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DERBoolean
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Primitive
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private static final byte[] TRUE_VALUE = new byte[] { (byte)0xff };
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private static final byte[] FALSE_VALUE = new byte[] { 0 };
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    // BEGIN android-changed
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    final private byte[]         value;
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    // END android-changed
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static final ASN1Boolean FALSE = new ASN1Boolean(false);
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static final ASN1Boolean TRUE  = new ASN1Boolean(true);
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * return a boolean from the passed in object.
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @exception IllegalArgumentException if the object cannot be converted.
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static ASN1Boolean getInstance(
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object  obj)
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj == null || obj instanceof ASN1Boolean)
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return (ASN1Boolean)obj;
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj instanceof DERBoolean)
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return ((DERBoolean)obj).isTrue() ? DERBoolean.TRUE : DERBoolean.FALSE;
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
43e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom     * return a ASN1Boolean from the passed in boolean.
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static ASN1Boolean getInstance(
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean  value)
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return (value ? TRUE : FALSE);
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
51e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom    /**
52e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom     * return a ASN1Boolean from the passed in boolean.
53e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom     */
54e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom    public static ASN1Boolean getInstance(
55e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        int value)
56e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom    {
57e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        return (value != 0 ? TRUE : FALSE);
58e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom    }
59e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    // BEGIN android-added
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * return a DERBoolean from the passed in array.
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static DERBoolean getInstance(
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[] octets)
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return (octets[0] != 0) ? TRUE : FALSE;
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    // END android-added
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * return a Boolean from a tagged object.
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param obj the tagged object holding the object we want
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @param explicit true if the object is meant to be explicitly
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *              tagged false otherwise.
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * @exception IllegalArgumentException if the tagged object cannot
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *               be converted.
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
80a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    public static ASN1Boolean getInstance(
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1TaggedObject obj,
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean          explicit)
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Primitive o = obj.getObject();
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (explicit || o instanceof DERBoolean)
876e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return getInstance(o);
896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else
916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return ASN1Boolean.fromOctetString(((ASN1OctetString)o).getOctets());
936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
956e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    // BEGIN android-changed
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected DERBoolean(
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    // END android-changed
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[]       value)
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (value.length != 1)
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new IllegalArgumentException("byte value should have 1 byte in it");
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (value[0] == 0)
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            this.value = FALSE_VALUE;
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (value[0] == 0xff)
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            this.value = TRUE_VALUE;
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            this.value = Arrays.clone(value);
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
120e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom    /**
121e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom     * @deprecated use getInstance(boolean) method.
122e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom     * @param value
123e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom     */
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    // BEGIN android-changed
1256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    protected DERBoolean(
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean     value)
1276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    // END android-changed
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.value = (value) ? TRUE_VALUE : FALSE_VALUE;
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public boolean isTrue()
133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return (value[0] != 0);
135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    boolean isConstructed()
138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return false;
1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    int encodedLength()
1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return 3;
1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    void encode(
1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1OutputStream out)
1494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        out.writeEncoded(BERTags.BOOLEAN, value);
152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
154c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    protected boolean asn1Equals(
1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Primitive  o)
156b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
157b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if ((o == null) || !(o instanceof DERBoolean))
158b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
159b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return false;
160b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
161b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return (value[0] == ((DERBoolean)o).value[0]);
163b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
164b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
165b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int hashCode()
166b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
1674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return value[0];
168b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
169b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
170b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
171b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public String toString()
172b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom      return (value[0] != 0) ? "TRUE" : "FALSE";
1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    static ASN1Boolean fromOctetString(byte[] value)
1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (value.length != 1)
1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1805db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            throw new IllegalArgumentException("BOOLEAN value should have 1 byte in it");
1814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (value[0] == 0)
1844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return FALSE;
1864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (value[0] == 0xff)
1884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return TRUE;
1904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
1924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new ASN1Boolean(value);
1944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
195b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
196b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
197