1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.IOException; 4c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.util.Arrays; 66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.util.Strings; 76e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/** 9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * DER UTF8String object. 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DERUTF8String 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Primitive 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom implements ASN1String 14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private byte[] string; 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an UTF8 string from the passed in object. 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException 21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * if the object cannot be converted. 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERUTF8String getInstance(Object obj) 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (obj == null || obj instanceof DERUTF8String) 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (DERUTF8String)obj; 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom if (obj instanceof byte[]) 3170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom try 3370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom return (DERUTF8String)fromByteArray((byte[])obj); 3570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom } 3670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom catch (Exception e) 3770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); 3970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom } 4070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom } 4170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom 42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("illegal object in getInstance: " 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + obj.getClass().getName()); 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an UTF8 String from a tagged object. 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * the tagged object holding the object we want 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param explicit 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * true if the object is meant to be explicitly tagged false 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * otherwise. 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * if the tagged object cannot be converted. 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERUTF8String getInstance( 58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o = obj.getObject(); 626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (explicit || o instanceof DERUTF8String) 646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return getInstance(o); 666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom else 686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return new DERUTF8String(ASN1OctetString.getInstance(o).getOctets()); 706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * basic constructor - byte encoded string. 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DERUTF8String(byte[] string) 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.string = string; 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * basic constructor 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DERUTF8String(String string) 85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.string = Strings.toUTF8ByteArray(string); 87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public String getString() 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Strings.fromUTF8ByteArray(string); 92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 94c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public String toString() 95c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return getString(); 97c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 98c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.hashCode(string); 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean asn1Equals(ASN1Primitive o) 105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (!(o instanceof DERUTF8String)) 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DERUTF8String s = (DERUTF8String)o; 112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.areEqual(string, s.string); 1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean isConstructed() 1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return false; 1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int encodedLength() 1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; 125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom void encode(ASN1OutputStream out) 128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.writeEncoded(BERTags.UTF8_STRING, string); 131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 133