1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.math.BigInteger; 5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 6c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport org.bouncycastle.util.Arrays; 7c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DERInteger 9c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom extends ASN1Object 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 */ 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERInteger getInstance( 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (obj == null || obj instanceof DERInteger) 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (DERInteger)obj; 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an Integer from a tagged object. 31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the tagged object holding the object we want 33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param explicit true if the object is meant to be explicitly 34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * tagged false otherwise. 35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the tagged object cannot 36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * be converted. 37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERInteger getInstance( 39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom DERObject o = obj.getObject(); 436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (explicit || o instanceof DERInteger) 456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return getInstance(o); 476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom else 496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return new ASN1Integer(ASN1OctetString.getInstance(obj.getObject()).getOctets()); 516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DERInteger( 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int value) 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam bytes = BigInteger.valueOf(value).toByteArray(); 58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DERInteger( 61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam BigInteger value) 62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam bytes = value.toByteArray(); 64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DERInteger( 67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] bytes) 68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.bytes = bytes; 70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getValue() 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new BigInteger(bytes); 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * in some cases positive values get crammed into a space, 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * that's not quite big enough... 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public BigInteger getPositiveValue() 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new BigInteger(1, bytes); 84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam void encode( 87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DEROutputStream out) 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam out.writeEncoded(INTEGER, bytes); 91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int value = 0; 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam for (int i = 0; i != bytes.length; i++) 98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam value ^= (bytes[i] & 0xff) << (i % 4); 100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return value; 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 105c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom boolean asn1Equals( 106c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom DERObject o) 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (!(o instanceof DERInteger)) 109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DERInteger other = (DERInteger)o; 114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 115c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return Arrays.areEqual(bytes, other.bytes); 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public String toString() 119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return getValue().toString(); 121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 123