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