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/** 9a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * DER T61String (also the teletex string), try not to use this if you don't need to. The standard support the encoding for 10a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * this has been withdrawn. 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DERT61String 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Primitive 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom implements ASN1String 15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private byte[] string; 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return a T61 string from the passed in object. 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the object cannot be converted. 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERT61String getInstance( 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (obj == null || obj instanceof DERT61String) 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (DERT61String)obj; 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 31e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom if (obj instanceof byte[]) 32e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom { 33e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom try 34e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom { 35e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom return (DERT61String)fromByteArray((byte[])obj); 36e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom } 37e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom catch (Exception e) 38e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom { 39e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); 40e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom } 41e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom } 42e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return an T61 String from a tagged object. 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the tagged object holding the object we want 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param explicit true if the object is meant to be explicitly 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * tagged false otherwise. 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the tagged object cannot 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * be converted. 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERT61String getInstance( 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o = obj.getObject(); 606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (explicit || o instanceof DERT61String) 626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return getInstance(o); 646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom else 666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return new DERT61String(ASN1OctetString.getInstance(o).getOctets()); 686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 72a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * basic constructor - string encoded as a sequence of bytes. 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 74a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom public DERT61String( 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] string) 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.string = string; 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 81a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * basic constructor - with string 8 bit assumed. 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DERT61String( 84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam String string) 85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 86a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom this(Strings.toByteArray(string)); 87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 89a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom /** 90a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * Decode the encoded string and return it, 8 bit encoding assumed. 91a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * @return the decoded String 92a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom */ 93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public String getString() 94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 959de1ab87afa71c0d39d17fdf260028552202bd3bBrian Carlstrom return Strings.fromByteArray(string); 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 98c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public String toString() 99c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return getString(); 1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean isConstructed() 1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return false; 1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int encodedLength() 1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; 111c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 112c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam void encode( 1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1OutputStream out) 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.writeEncoded(BERTags.T61_STRING, string); 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 119a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom 120a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom /** 121a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * Return the encoded string as a byte array. 122a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * @return the actual bytes making up the encoded body of the T61 string. 123a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom */ 124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public byte[] getOctets() 125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.clone(string); 127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 129c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom boolean asn1Equals( 1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o) 131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 132c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom if (!(o instanceof DERT61String)) 133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.areEqual(string, ((DERT61String)o).string); 138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.hashCode(string); 143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 145