1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.ByteArrayInputStream; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException; 5c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.InputStream; 66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 76e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.util.Arrays; 86e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.util.encoders.Hex; 9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic abstract class ASN1OctetString 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Primitive 12c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom implements ASN1OctetStringParser 13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] string; 15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an Octet String from a tagged object. 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the tagged object holding the object we want. 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param explicit true if the object is meant to be explicitly 21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * tagged false otherwise. 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the tagged object cannot 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * be converted. 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static ASN1OctetString getInstance( 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o = obj.getObject(); 306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (explicit || o instanceof ASN1OctetString) 326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return getInstance(o); 346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom else 366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return BEROctetString.fromSequence(ASN1Sequence.getInstance(o)); 386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an Octet String from the given object. 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the object we want converted. 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the object cannot be converted. 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static ASN1OctetString getInstance( 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (obj == null || obj instanceof ASN1OctetString) 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (ASN1OctetString)obj; 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (obj instanceof byte[]) 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom try 574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return ASN1OctetString.getInstance(ASN1Primitive.fromByteArray((byte[])obj)); 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom catch (IOException e) 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IllegalArgumentException("failed to construct OCTET STRING from byte[]: " + e.getMessage()); 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (obj instanceof ASN1Encodable) 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive primitive = ((ASN1Encodable)obj).toASN1Primitive(); 684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (primitive instanceof ASN1OctetString) 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return (ASN1OctetString)primitive; 724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param string the octets making up the octet string. 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public ASN1OctetString( 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] string) 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 84c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom if (string == null) 85c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 86c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom throw new NullPointerException("string cannot be null"); 87c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.string = string; 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 91c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public InputStream getOctetStream() 92c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 93c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return new ByteArrayInputStream(string); 94c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 95c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 96c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public ASN1OctetStringParser parser() 97c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 98c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return this; 99c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 100c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public byte[] getOctets() 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return string; 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 108c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return Arrays.hashCode(this.getOctets()); 109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 111c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom boolean asn1Equals( 1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o) 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 114c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom if (!(o instanceof ASN1OctetString)) 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 119c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom ASN1OctetString other = (ASN1OctetString)o; 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 121c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom return Arrays.areEqual(string, other.string); 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Primitive getLoadedObject() 1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return this.toASN1Primitive(); 1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive toDERObject() 1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new DEROctetString(string); 1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive toDLObject() 1356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new DEROctetString(string); 1376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 1386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom abstract void encode(ASN1OutputStream out) 140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException; 141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public String toString() 143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return "#"+new String(Hex.encode(string)); 145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 147