1package org.bouncycastle.asn1;
2
3import java.io.IOException;
4
5import org.bouncycastle.util.Arrays;
6import org.bouncycastle.util.Strings;
7
8/**
9 * DER T61String (also the teletex string), try not to use this if you don't need to. The standard support the encoding for
10 * this has been withdrawn.
11 */
12public class DERT61String
13    extends ASN1Primitive
14    implements ASN1String
15{
16    private byte[] string;
17
18    /**
19     * return a T61 string from the passed in object.
20     *
21     * @param obj a DERT61String or an object that can be converted into one.
22     * @exception IllegalArgumentException if the object cannot be converted.
23     * @return a DERT61String instance, or null
24     */
25    public static DERT61String getInstance(
26        Object  obj)
27    {
28        if (obj == null || obj instanceof DERT61String)
29        {
30            return (DERT61String)obj;
31        }
32
33        if (obj instanceof byte[])
34        {
35            try
36            {
37                return (DERT61String)fromByteArray((byte[])obj);
38            }
39            catch (Exception e)
40            {
41                throw new IllegalArgumentException("encoding error in getInstance: " + e.toString());
42            }
43        }
44
45        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
46    }
47
48    /**
49     * return an T61 String from a tagged object.
50     *
51     * @param obj the tagged object holding the object we want
52     * @param explicit true if the object is meant to be explicitly
53     *              tagged false otherwise.
54     * @exception IllegalArgumentException if the tagged object cannot
55     *               be converted.
56     * @return a DERT61String instance, or null
57     */
58    public static DERT61String getInstance(
59        ASN1TaggedObject obj,
60        boolean          explicit)
61    {
62        ASN1Primitive o = obj.getObject();
63
64        if (explicit || o instanceof DERT61String)
65        {
66            return getInstance(o);
67        }
68        else
69        {
70            return new DERT61String(ASN1OctetString.getInstance(o).getOctets());
71        }
72    }
73
74    /**
75     * basic constructor - string encoded as a sequence of bytes.
76     *
77     * @param string the byte encoding of the string to be wrapped.
78     */
79    public DERT61String(
80        byte[]   string)
81    {
82        this.string = Arrays.clone(string);
83    }
84
85    /**
86     * basic constructor - with string 8 bit assumed.
87     *
88     * @param string the string to be wrapped.
89     */
90    public DERT61String(
91        String   string)
92    {
93        this.string = Strings.toByteArray(string);
94    }
95
96    /**
97     * Decode the encoded string and return it, 8 bit encoding assumed.
98     * @return the decoded String
99     */
100    public String getString()
101    {
102        return Strings.fromByteArray(string);
103    }
104
105    public String toString()
106    {
107        return getString();
108    }
109
110    boolean isConstructed()
111    {
112        return false;
113    }
114
115    int encodedLength()
116    {
117        return 1 + StreamUtil.calculateBodyLength(string.length) + string.length;
118    }
119
120    void encode(
121        ASN1OutputStream out)
122        throws IOException
123    {
124        out.writeEncoded(BERTags.T61_STRING, string);
125    }
126
127    /**
128     * Return the encoded string as a byte array.
129     * @return the actual bytes making up the encoded body of the T61 string.
130     */
131    public byte[] getOctets()
132    {
133        return Arrays.clone(string);
134    }
135
136    boolean asn1Equals(
137        ASN1Primitive o)
138    {
139        if (!(o instanceof DERT61String))
140        {
141            return false;
142        }
143
144        return Arrays.areEqual(string, ((DERT61String)o).string);
145    }
146
147    public int hashCode()
148    {
149        return Arrays.hashCode(string);
150    }
151}
152