1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.asn1.util;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Enumeration;
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.*;
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.util.encoders.Hex;
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class ASN1Dump
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static String  TAB = "    ";
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * dump a DER object as a formatted string with indentation
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj the DERObject to be dumped out.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static String _dumpAsString(
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String      indent,
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        DERObject   obj)
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj instanceof ASN1Sequence)
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            StringBuffer    buf = new StringBuffer();
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Enumeration     e = ((ASN1Sequence)obj).getObjects();
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String          tab = indent + TAB;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(indent);
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (obj instanceof BERConstructedSequence)
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append("BER ConstructedSequence");
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (obj instanceof DERConstructedSequence)
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append("DER ConstructedSequence");
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (obj instanceof BERSequence)
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append("BER Sequence");
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (obj instanceof DERSequence)
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append("DER Sequence");
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append("Sequence");
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(System.getProperty("line.separator"));
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (e.hasMoreElements())
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Object  o = e.nextElement();
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // BEGIN android-changed
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (o == null || o.equals(DERNull.THE_ONE))
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(tab);
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append("NULL");
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(System.getProperty("line.separator"));
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else if (o instanceof DERObject)
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(_dumpAsString(tab, (DERObject)o));
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(_dumpAsString(tab, ((DEREncodable)o).getDERObject()));
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // END android-changed
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return buf.toString();
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERTaggedObject)
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            StringBuffer    buf = new StringBuffer();
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String          tab = indent + TAB;
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(indent);
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (obj instanceof BERTaggedObject)
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append("BER Tagged [");
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append("Tagged [");
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            DERTaggedObject o = (DERTaggedObject)obj;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(Integer.toString(o.getTagNo()));
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(']');
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!o.isExplicit())
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append(" IMPLICIT ");
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(System.getProperty("line.separator"));
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (o.isEmpty())
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append(tab);
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append("EMPTY");
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append(System.getProperty("line.separator"));
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                buf.append(_dumpAsString(tab, o.getObject()));
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return buf.toString();
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERConstructedSet)
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            StringBuffer    buf = new StringBuffer();
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Enumeration     e = ((ASN1Set)obj).getObjects();
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String          tab = indent + TAB;
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(indent);
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append("ConstructedSet");
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(System.getProperty("line.separator"));
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (e.hasMoreElements())
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Object  o = e.nextElement();
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (o == null)
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(tab);
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append("NULL");
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(System.getProperty("line.separator"));
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else if (o instanceof DERObject)
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(_dumpAsString(tab, (DERObject)o));
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(_dumpAsString(tab, ((DEREncodable)o).getDERObject()));
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return buf.toString();
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof BERSet)
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            StringBuffer    buf = new StringBuffer();
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Enumeration     e = ((ASN1Set)obj).getObjects();
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String          tab = indent + TAB;
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(indent);
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append("BER Set");
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(System.getProperty("line.separator"));
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (e.hasMoreElements())
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Object  o = e.nextElement();
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (o == null)
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(tab);
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append("NULL");
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(System.getProperty("line.separator"));
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else if (o instanceof DERObject)
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(_dumpAsString(tab, (DERObject)o));
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(_dumpAsString(tab, ((DEREncodable)o).getDERObject()));
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return buf.toString();
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERSet)
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            StringBuffer    buf = new StringBuffer();
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Enumeration     e = ((ASN1Set)obj).getObjects();
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String          tab = indent + TAB;
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(indent);
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append("DER Set");
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            buf.append(System.getProperty("line.separator"));
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (e.hasMoreElements())
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Object  o = e.nextElement();
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (o == null)
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(tab);
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append("NULL");
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(System.getProperty("line.separator"));
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else if (o instanceof DERObject)
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(_dumpAsString(tab, (DERObject)o));
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    buf.append(_dumpAsString(tab, ((DEREncodable)o).getDERObject()));
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return buf.toString();
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERObjectIdentifier)
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "ObjectIdentifier(" + ((DERObjectIdentifier)obj).getId() + ")" + System.getProperty("line.separator");
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERBoolean)
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "Boolean(" + ((DERBoolean)obj).isTrue() + ")" + System.getProperty("line.separator");
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERInteger)
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "Integer(" + ((DERInteger)obj).getValue() + ")" + System.getProperty("line.separator");
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof BERConstructedOctetString)
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "BER Constructed Octet String" + "[" + ((ASN1OctetString)obj).getOctets().length + "] " + System.getProperty("line.separator");
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DEROctetString)
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "DER Octet String" + "[" + ((ASN1OctetString)obj).getOctets().length + "] " + System.getProperty("line.separator");
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERBitString)
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "DER Bit String" + "[" + ((DERBitString)obj).getBytes().length + ", " + ((DERBitString)obj).getPadBits() + "] " + System.getProperty("line.separator");
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERIA5String)
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "IA5String(" + ((DERIA5String)obj).getString() + ") " + System.getProperty("line.separator");
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERUTF8String)
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "UTF8String(" + ((DERUTF8String)obj).getString() + ") " + System.getProperty("line.separator");
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERPrintableString)
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "PrintableString(" + ((DERPrintableString)obj).getString() + ") " + System.getProperty("line.separator");
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERVisibleString)
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "VisibleString(" + ((DERVisibleString)obj).getString() + ") " + System.getProperty("line.separator");
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERBMPString)
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "BMPString(" + ((DERBMPString)obj).getString() + ") " + System.getProperty("line.separator");
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERT61String)
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "T61String(" + ((DERT61String)obj).getString() + ") " + System.getProperty("line.separator");
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERUTCTime)
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "UTCTime(" + ((DERUTCTime)obj).getTime() + ") " + System.getProperty("line.separator");
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERGeneralizedTime)
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "GeneralizedTime(" + ((DERGeneralizedTime)obj).getTime() + ") " + System.getProperty("line.separator");
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DERUnknownTag)
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + "Unknown " + Integer.toString(((DERUnknownTag)obj).getTag(), 16) + " " + new String(Hex.encode(((DERUnknownTag)obj).getData())) + System.getProperty("line.separator");
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return indent + obj.toString() + System.getProperty("line.separator");
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * dump out a DER object as a formatted string
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj the DERObject to be dumped out.
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static String dumpAsString(
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object   obj)
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj instanceof DERObject)
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return _dumpAsString("", (DERObject)obj);
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (obj instanceof DEREncodable)
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return _dumpAsString("", ((DEREncodable)obj).getDERObject());
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "unknown object type " + obj.toString();
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
293