1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.asn1;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ByteArrayOutputStream;
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Enumeration;
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Vector;
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.util.encoders.Hex;
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class ASN1OctetString
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    extends DERObject
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    byte[]  string;
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return an Octet String from a tagged object.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj the tagged object holding the object we want.
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param explicit true if the object is meant to be explicitly
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *              tagged false otherwise.
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IllegalArgumentException if the tagged object cannot
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *              be converted.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static ASN1OctetString getInstance(
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ASN1TaggedObject    obj,
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean             explicit)
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getInstance(obj.getObject());
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return an Octet String from the given object.
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj the object we want converted.
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IllegalArgumentException if the object cannot be converted.
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static ASN1OctetString getInstance(
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object  obj)
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj == null || obj instanceof ASN1OctetString)
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return (ASN1OctetString)obj;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj instanceof ASN1TaggedObject)
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return getInstance(((ASN1TaggedObject)obj).getObject());
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj instanceof ASN1Sequence)
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Vector      v = new Vector();
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Enumeration e = ((ASN1Sequence)obj).getObjects();
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (e.hasMoreElements())
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                v.addElement(e.nextElement());
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new BERConstructedOctetString(v);
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param string the octets making up the octet string.
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ASN1OctetString(
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  string)
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.string = string;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ASN1OctetString(
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        DEREncodable obj)
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ByteArrayOutputStream   bOut = new ByteArrayOutputStream();
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            DEROutputStream         dOut = new DEROutputStream(bOut);
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            dOut.writeObject(obj);
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            dOut.close();
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.string = bOut.toByteArray();
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch (IOException e)
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException("Error processing object : " + e.toString());
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public byte[] getOctets()
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return string;
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode()
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  b = this.getOctets();
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     value = 0;
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i != b.length; i++)
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            value ^= (b[i] & 0xff) << (i % 4);
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return value;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object  o)
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(o instanceof DEROctetString))
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        DEROctetString  other = (DEROctetString)o;
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b1 = other.getOctets();
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b2 = this.getOctets();
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (b1.length != b2.length)
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i != b1.length; i++)
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (b1[i] != b2[i])
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return false;
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return true;
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    abstract void encode(DEROutputStream out)
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws IOException;
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString()
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      return "#"+new String(Hex.encode(string));
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
148