ASN1OctetString.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangpackage org.bouncycastle.asn1;
2f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
3f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport java.io.ByteArrayInputStream;
4f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport java.io.IOException;
5f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport java.io.InputStream;
6f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
7f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport org.bouncycastle.util.Arrays;
8f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport org.bouncycastle.util.encoders.Hex;
9f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
101fdb08e5fc427b54b54214e3b3fbdda73d369f4dDavid Mosberger-Tangpublic abstract class ASN1OctetString
11f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    extends ASN1Primitive
123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    implements ASN1OctetStringParser
133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    byte[]  string;
153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    /**
173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz     * return an Octet String from a tagged object.
186a5da54b8ac724fc68001a1e07430d910d9e8141Tommi Rantala     *
196a5da54b8ac724fc68001a1e07430d910d9e8141Tommi Rantala     * @param obj the tagged object holding the object we want.
20ee8df2628891435ebb95eee04668d5bbd6995723Tommi Rantala     * @param explicit true if the object is meant to be explicitly
211fdb08e5fc427b54b54214e3b3fbdda73d369f4dDavid Mosberger-Tang     *              tagged false otherwise.
226a5da54b8ac724fc68001a1e07430d910d9e8141Tommi Rantala     * @exception IllegalArgumentException if the tagged object cannot
231fdb08e5fc427b54b54214e3b3fbdda73d369f4dDavid Mosberger-Tang     *              be converted.
246a5da54b8ac724fc68001a1e07430d910d9e8141Tommi Rantala     */
25f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    public static ASN1OctetString getInstance(
26f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        ASN1TaggedObject    obj,
27f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        boolean             explicit)
28f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
29f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        ASN1Primitive o = obj.getObject();
30f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz        if (explicit || o instanceof ASN1OctetString)
32f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        {
33f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            return getInstance(o);
34f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        }
35f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        else
36f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        {
37f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            return BEROctetString.fromSequence(ASN1Sequence.getInstance(o));
38f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        }
39f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
40f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
41f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    /**
42f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang     * return an Octet String from the given object.
433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz     *
44f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang     * @param obj the object we want converted.
45f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang     * @exception IllegalArgumentException if the object cannot be converted.
46f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang     */
47f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    public static ASN1OctetString getInstance(
48f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        Object  obj)
493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
50f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        if (obj == null || obj instanceof ASN1OctetString)
51f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        {
52f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            return (ASN1OctetString)obj;
53f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        }
54f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        else if (obj instanceof byte[])
55f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        {
56f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            try
57f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            {
58f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang                return ASN1OctetString.getInstance(ASN1Primitive.fromByteArray((byte[])obj));
59f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            }
603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz            catch (IOException e)
61f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            {
62f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang                throw new IllegalArgumentException("failed to construct OCTET STRING from byte[]: " + e.getMessage());
63f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            }
64f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        }
65f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        else if (obj instanceof ASN1Encodable)
66f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        {
67f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            ASN1Primitive primitive = ((ASN1Encodable)obj).toASN1Primitive();
68f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
69f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            if (primitive instanceof ASN1OctetString)
70f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            {
713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz                return (ASN1OctetString)primitive;
72f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            }
73f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        }
74f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
75f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
76f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
77f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
78f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    /**
79f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang     * @param string the octets making up the octet string.
80f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang     */
81f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    public ASN1OctetString(
823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz        byte[]  string)
83f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
84f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        if (string == null)
85f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        {
86f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            throw new NullPointerException("string cannot be null");
87f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        }
88f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        this.string = string;
89f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
90f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
91f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    public InputStream getOctetStream()
92f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz        return new ByteArrayInputStream(string);
94f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
95f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
96f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    public ASN1OctetStringParser parser()
97f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
98f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        return this;
99f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
100f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
101f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    public byte[] getOctets()
102f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
103f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        return string;
1043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
105f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
106f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    public int hashCode()
107f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
108f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        return Arrays.hashCode(this.getOctets());
109f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
110f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
111f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    boolean asn1Equals(
112f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        ASN1Primitive o)
113f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
114f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        if (!(o instanceof ASN1OctetString))
1153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz        {
116f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang            return false;
117f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        }
118f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
119f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        ASN1OctetString  other = (ASN1OctetString)o;
120f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
121f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        return Arrays.areEqual(string, other.string);
122f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
123f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
124f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    public ASN1Primitive getLoadedObject()
125f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
1263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz        return this.toASN1Primitive();
127f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
128f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
129f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    ASN1Primitive toDERObject()
130f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
131f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        return new DEROctetString(string);
132f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
133f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
134f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    ASN1Primitive toDLObject()
135f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
136f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        return new DEROctetString(string);
137f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
138f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
139f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    abstract void encode(ASN1OutputStream out)
140f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang        throws IOException;
141f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang
142f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    public String toString()
143f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    {
144f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang      return "#"+new String(Hex.encode(string));
145f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang    }
146f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang}
147f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang