1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.util.Arrays; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.util.Strings; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/** 9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * DER T61String (also the teletex string) 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DERT61String 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Primitive 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom implements ASN1String 14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private byte[] string; 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return a T61 string from the passed in object. 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the object cannot be converted. 21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERT61String getInstance( 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (obj == null || obj instanceof DERT61String) 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (DERT61String)obj; 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom if (obj instanceof byte[]) 3170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom try 3370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom return (DERT61String)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: " + obj.getClass().getName()); 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an T61 String from a tagged object. 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the tagged object holding the object we want 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param explicit true if the object is meant to be explicitly 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * tagged false otherwise. 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the tagged object cannot 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * be converted. 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERT61String getInstance( 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o = obj.getObject(); 596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (explicit || o instanceof DERT61String) 616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return getInstance(o); 636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom else 656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return new DERT61String(ASN1OctetString.getInstance(o).getOctets()); 676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * basic constructor - with bytes. 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DERT61String( 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] string) 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.string = string; 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * basic constructor - with string. 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DERT61String( 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam String string) 84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 8557c3bb556ef873a72010d6022edddc14e6bba9beBrian Carlstrom // BEGIN android-changed 8657c3bb556ef873a72010d6022edddc14e6bba9beBrian Carlstrom this.string = Strings.toByteArray(string); 8757c3bb556ef873a72010d6022edddc14e6bba9beBrian Carlstrom // END android-changed 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public String getString() 91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 9257c3bb556ef873a72010d6022edddc14e6bba9beBrian Carlstrom // BEGIN android-changed 9357c3bb556ef873a72010d6022edddc14e6bba9beBrian Carlstrom return Strings.fromByteArray(string); 9457c3bb556ef873a72010d6022edddc14e6bba9beBrian Carlstrom // END android-changed 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 97c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public String toString() 98c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return getString(); 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean isConstructed() 1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return false; 1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int encodedLength() 1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; 110c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 111c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam void encode( 1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1OutputStream out) 114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.writeEncoded(BERTags.T61_STRING, string); 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public byte[] getOctets() 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.clone(string); 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 124c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom boolean asn1Equals( 1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o) 126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 127c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom if (!(o instanceof DERT61String)) 128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.areEqual(string, ((DERT61String)o).string); 133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.hashCode(string); 138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 140