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 Hallampublic class DERGeneralString
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Primitive
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    implements ASN1String
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private byte[] string;
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static DERGeneralString getInstance(
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object obj)
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (obj == null || obj instanceof DERGeneralString)
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return (DERGeneralString) obj;
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        if (obj instanceof byte[])
2370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        {
2470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            try
2570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            {
2670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom                return (DERGeneralString)fromByteArray((byte[])obj);
2770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            }
2870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            catch (Exception e)
2970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            {
3070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom                throw new IllegalArgumentException("encoding error in getInstance: " + e.toString());
3170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            }
3270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        }
3370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        throw new IllegalArgumentException("illegal object in getInstance: "
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                + obj.getClass().getName());
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static DERGeneralString getInstance(
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1TaggedObject obj,
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean explicit)
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Primitive o = obj.getObject();
436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (explicit || o instanceof DERGeneralString)
456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return getInstance(o);
476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else
496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return new DERGeneralString(((ASN1OctetString)o).getOctets());
516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    DERGeneralString(byte[] string)
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.string = string;
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DERGeneralString(String string)
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.string = Strings.toByteArray(string);
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public String getString()
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return Strings.fromByteArray(string);
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
68c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
69c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public String toString()
70c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return getString();
72c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
73c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public byte[] getOctets()
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return Arrays.clone(string);
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    boolean isConstructed()
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return false;
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    int encodedLength()
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return 1 + StreamUtil.calculateBodyLength(string.length) + string.length;
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    void encode(ASN1OutputStream out)
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        throws IOException
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        out.writeEncoded(BERTags.GENERAL_STRING, string);
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int hashCode()
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return Arrays.hashCode(string);
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    boolean asn1Equals(ASN1Primitive o)
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (!(o instanceof DERGeneralString))
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return false;
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DERGeneralString s = (DERGeneralString)o;
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return Arrays.areEqual(string, s.string);
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
111