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 85db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root/** 95db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * Use ASN1Enumerated instead of this. 105db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root */ 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DEREnumerated 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Primitive 13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] bytes; 15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an integer from the passed in object 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the object cannot be converted. 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public static ASN1Enumerated getInstance( 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (obj == null || obj instanceof ASN1Enumerated) 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return (ASN1Enumerated)obj; 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (obj instanceof DEREnumerated) 30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new ASN1Enumerated(((DEREnumerated)obj).getValue()); 32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom if (obj instanceof byte[]) 3570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom try 3770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom return (ASN1Enumerated)fromByteArray((byte[])obj); 3970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom } 4070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom catch (Exception e) 4170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 4270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); 4370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom } 4470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom } 4570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an Enumerated from a tagged object. 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the tagged object holding the object we want 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param explicit true if the object is meant to be explicitly 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * tagged false otherwise. 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the tagged object cannot 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * be converted. 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 585db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root public static ASN1Enumerated getInstance( 59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o = obj.getObject(); 636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (explicit || o instanceof DEREnumerated) 656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return getInstance(o); 676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom else 696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return fromOctetString(((ASN1OctetString)o).getOctets()); 716e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 745db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root /** 755db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * @deprecated use ASN1Enumerated 765db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root */ 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DEREnumerated( 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int value) 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam bytes = BigInteger.valueOf(value).toByteArray(); 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 835db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root /** 845db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * @deprecated use ASN1Enumerated 855db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root */ 86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DEREnumerated( 87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger value) 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam bytes = value.toByteArray(); 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 925db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root /** 935db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * @deprecated use ASN1Enumerated 945db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root */ 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DEREnumerated( 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] bytes) 97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.bytes = bytes; 99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getValue() 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new BigInteger(bytes); 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean isConstructed() 1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return false; 1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int encodedLength() 1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return 1 + StreamUtil.calculateBodyLength(bytes.length) + bytes.length; 1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam void encode( 1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1OutputStream out) 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.writeEncoded(BERTags.ENUMERATED, bytes); 121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 123c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom boolean asn1Equals( 1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o) 125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (!(o instanceof DEREnumerated)) 127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DEREnumerated other = (DEREnumerated)o; 132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 133c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return Arrays.areEqual(this.bytes, other.bytes); 134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 135c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 138c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return Arrays.hashCode(bytes); 139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private static ASN1Enumerated[] cache = new ASN1Enumerated[12]; 1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom static ASN1Enumerated fromOctetString(byte[] enc) 1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (enc.length > 1) 1464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new ASN1Enumerated(Arrays.clone(enc)); 1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (enc.length == 0) 1514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IllegalArgumentException("ENUMERATED has zero length"); 1534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int value = enc[0] & 0xff; 1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (value >= cache.length) 1574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new ASN1Enumerated(Arrays.clone(enc)); 1594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Enumerated possibleMatch = cache[value]; 1624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (possibleMatch == null) 1644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom possibleMatch = cache[value] = new ASN1Enumerated(Arrays.clone(enc)); 1664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return possibleMatch; 1694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 170b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 171