1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.util.Arrays; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/** 8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * DER BMPString object. 9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DERBMPString 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Primitive 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom implements ASN1String 13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private char[] string; 15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * return a BMP String from the given object. 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param obj the object we want converted. 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @exception IllegalArgumentException if the object cannot be converted. 21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static DERBMPString getInstance( 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (obj == null || obj instanceof DERBMPString) 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (DERBMPString)obj; 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom if (obj instanceof byte[]) 3170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom try 3370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom { 3470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom return (DERBMPString)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 a BMP 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 DERBMPString getInstance( 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1TaggedObject obj, 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam boolean explicit) 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o = obj.getObject(); 596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (explicit || o instanceof DERBMPString) 616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return getInstance(o); 636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom else 656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return new DERBMPString(ASN1OctetString.getInstance(o).getOctets()); 676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * basic constructor - byte encoded string. 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DERBMPString( 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] string) 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam char[] cs = new char[string.length / 2]; 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam for (int i = 0; i != cs.length; i++) 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam cs[i] = (char)((string[2 * i] << 8) | (string[2 * i + 1] & 0xff)); 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.string = cs; 844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DERBMPString(char[] string) 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.string = string; 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * basic constructor 93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public DERBMPString( 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam String string) 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.string = string.toCharArray(); 98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public String getString() 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new String(string); 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 105c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public String toString() 106c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return getString(); 108c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 109c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public int hashCode() 111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.hashCode(string); 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 115c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom protected boolean asn1Equals( 1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o) 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (!(o instanceof DERBMPString)) 119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return false; 121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DERBMPString s = (DERBMPString)o; 124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return Arrays.areEqual(string, s.string); 1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean isConstructed() 1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return false; 1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int encodedLength() 1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return 1 + StreamUtil.calculateBodyLength(string.length * 2) + (string.length * 2); 136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam void encode( 1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1OutputStream out) 140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.write(BERTags.BMP_STRING); 1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.writeLength(string.length * 2); 144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom for (int i = 0; i != string.length; i++) 146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 1474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom char c = string[i]; 148b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.write((byte)(c >> 8)); 1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom out.write((byte)c); 1514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 154