DEREnumerated.java revision 4c111300c39cb2e27f07fc2ae3b00e23ed4443b2
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 31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an Enumerated from a tagged object. 36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the tagged object holding the object we want 38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param explicit true if the object is meant to be explicitly 39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * tagged false otherwise. 40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the tagged object cannot 41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * be converted. 42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DEREnumerated getInstance( 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o = obj.getObject(); 486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (explicit || o instanceof DEREnumerated) 506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return getInstance(o); 526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom else 546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return fromOctetString(((ASN1OctetString)o).getOctets()); 566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DEREnumerated( 60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int value) 61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam bytes = BigInteger.valueOf(value).toByteArray(); 63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DEREnumerated( 66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger value) 67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam bytes = value.toByteArray(); 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DEREnumerated( 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] bytes) 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.bytes = bytes; 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getValue() 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new BigInteger(bytes); 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean isConstructed() 834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return false; 854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int encodedLength() 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return 1 + StreamUtil.calculateBodyLength(bytes.length) + bytes.length; 904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam void encode( 934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1OutputStream out) 94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.writeEncoded(BERTags.ENUMERATED, bytes); 97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 99c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom boolean asn1Equals( 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o) 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (!(o instanceof DEREnumerated)) 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DEREnumerated other = (DEREnumerated)o; 108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 109c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return Arrays.areEqual(this.bytes, other.bytes); 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 111c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 114c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return Arrays.hashCode(bytes); 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private static ASN1Enumerated[] cache = new ASN1Enumerated[12]; 1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom static ASN1Enumerated fromOctetString(byte[] enc) 1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (enc.length > 1) 1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new ASN1Enumerated(Arrays.clone(enc)); 1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (enc.length == 0) 1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IllegalArgumentException("ENUMERATED has zero length"); 1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int value = enc[0] & 0xff; 1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (value >= cache.length) 1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new ASN1Enumerated(Arrays.clone(enc)); 1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Enumerated possibleMatch = cache[value]; 1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (possibleMatch == null) 1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom possibleMatch = cache[value] = new ASN1Enumerated(Arrays.clone(enc)); 1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return possibleMatch; 1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 147