DEREnumerated.java revision 70c8287138e69a98c2f950036f9f703ee37228c8
1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.math.BigInteger; 5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.util.Arrays; 76e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DEREnumerated 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Primitive 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] bytes; 12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an integer from the passed in object 15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the object cannot be converted. 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public static ASN1Enumerated getInstance( 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (obj == null || obj instanceof ASN1Enumerated) 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return (ASN1Enumerated)obj; 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (obj instanceof DEREnumerated) 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new ASN1Enumerated(((DEREnumerated)obj).getValue()); 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom if (obj instanceof byte[]) 3270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom try 3470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom return (ASN1Enumerated)fromByteArray((byte[])obj); 3670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom } 3770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom catch (Exception e) 3870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); 4070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom } 4170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom } 4270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an Enumerated from a tagged object. 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the tagged object holding the object we want 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param explicit true if the object is meant to be explicitly 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * tagged false otherwise. 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the tagged object cannot 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * be converted. 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DEREnumerated getInstance( 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o = obj.getObject(); 606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (explicit || o instanceof DEREnumerated) 626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return getInstance(o); 646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom else 666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return fromOctetString(((ASN1OctetString)o).getOctets()); 686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DEREnumerated( 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int value) 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam bytes = BigInteger.valueOf(value).toByteArray(); 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DEREnumerated( 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger value) 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam bytes = value.toByteArray(); 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DEREnumerated( 84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] bytes) 85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.bytes = bytes; 87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getValue() 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new BigInteger(bytes); 92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean isConstructed() 954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return false; 974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int encodedLength() 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return 1 + StreamUtil.calculateBodyLength(bytes.length) + bytes.length; 1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam void encode( 1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1OutputStream out) 106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.writeEncoded(BERTags.ENUMERATED, bytes); 109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 111c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom boolean asn1Equals( 1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o) 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (!(o instanceof DEREnumerated)) 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DEREnumerated other = (DEREnumerated)o; 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 121c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return Arrays.areEqual(this.bytes, other.bytes); 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 123c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 126c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return Arrays.hashCode(bytes); 127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private static ASN1Enumerated[] cache = new ASN1Enumerated[12]; 1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom static ASN1Enumerated fromOctetString(byte[] enc) 1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (enc.length > 1) 1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new ASN1Enumerated(Arrays.clone(enc)); 1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (enc.length == 0) 1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IllegalArgumentException("ENUMERATED has zero length"); 1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int value = enc[0] & 0xff; 1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (value >= cache.length) 1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new ASN1Enumerated(Arrays.clone(enc)); 1474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Enumerated possibleMatch = cache[value]; 1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (possibleMatch == null) 1524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom possibleMatch = cache[value] = new ASN1Enumerated(Arrays.clone(enc)); 1544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return possibleMatch; 1574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 158b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 159