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