DERBMPString.java revision e1142c149e244797ce73b0e7fad40816e447a817
1package org.bouncycastle.asn1;
2
3import java.io.IOException;
4
5import org.bouncycastle.util.Arrays;
6
7/**
8 * DER BMPString object.
9 */
10public class DERBMPString
11    extends ASN1Primitive
12    implements ASN1String
13{
14    private char[]  string;
15
16    /**
17     * return a BMP String from the given object.
18     *
19     * @param obj the object we want converted.
20     * @exception IllegalArgumentException if the object cannot be converted.
21     */
22    public static DERBMPString getInstance(
23        Object  obj)
24    {
25        if (obj == null || obj instanceof DERBMPString)
26        {
27            return (DERBMPString)obj;
28        }
29
30        if (obj instanceof byte[])
31        {
32            try
33            {
34                return (DERBMPString)fromByteArray((byte[])obj);
35            }
36            catch (Exception e)
37            {
38                throw new IllegalArgumentException("encoding error in getInstance: " + e.toString());
39            }
40        }
41
42        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
43    }
44
45    /**
46     * return a BMP String from a tagged object.
47     *
48     * @param obj the tagged object holding the object we want
49     * @param explicit true if the object is meant to be explicitly
50     *              tagged false otherwise.
51     * @exception IllegalArgumentException if the tagged object cannot
52     *              be converted.
53     */
54    public static DERBMPString getInstance(
55        ASN1TaggedObject obj,
56        boolean          explicit)
57    {
58        ASN1Primitive o = obj.getObject();
59
60        if (explicit || o instanceof DERBMPString)
61        {
62            return getInstance(o);
63        }
64        else
65        {
66            return new DERBMPString(ASN1OctetString.getInstance(o).getOctets());
67        }
68    }
69
70    /**
71     * basic constructor - byte encoded string.
72     */
73    DERBMPString(
74        byte[]   string)
75    {
76        char[]  cs = new char[string.length / 2];
77
78        for (int i = 0; i != cs.length; i++)
79        {
80            cs[i] = (char)((string[2 * i] << 8) | (string[2 * i + 1] & 0xff));
81        }
82
83        this.string = cs;
84    }
85
86    DERBMPString(char[] string)
87    {
88        this.string = string;
89    }
90
91    /**
92     * basic constructor
93     */
94    public DERBMPString(
95        String   string)
96    {
97        this.string = string.toCharArray();
98    }
99
100    public String getString()
101    {
102        return new String(string);
103    }
104
105    public String toString()
106    {
107        return getString();
108    }
109
110    public int hashCode()
111    {
112        return Arrays.hashCode(string);
113    }
114
115    protected boolean asn1Equals(
116        ASN1Primitive o)
117    {
118        if (!(o instanceof DERBMPString))
119        {
120            return false;
121        }
122
123        DERBMPString  s = (DERBMPString)o;
124
125        return Arrays.areEqual(string, s.string);
126    }
127
128    boolean isConstructed()
129    {
130        return false;
131    }
132
133    int encodedLength()
134    {
135        return 1 + StreamUtil.calculateBodyLength(string.length * 2) + (string.length * 2);
136    }
137
138    void encode(
139        ASN1OutputStream out)
140        throws IOException
141    {
142        out.write(BERTags.BMP_STRING);
143        out.writeLength(string.length * 2);
144
145        for (int i = 0; i != string.length; i++)
146        {
147            char c = string[i];
148
149            out.write((byte)(c >> 8));
150            out.write((byte)c);
151        }
152    }
153}
154