1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.x509;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/**
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * class for breaking up an X500 Name into it's component tokens, ala
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * java.util.StringTokenizer. We need this class as some of the
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * lightweight Java environment don't support classes like
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * StringTokenizer.
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class X509NameTokenizer
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private String          value;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private int             index;
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private char            seperator;
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private StringBuffer    buf = new StringBuffer();
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509NameTokenizer(
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        String  oid)
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this(oid, ',');
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509NameTokenizer(
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        String  oid,
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        char    seperator)
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.value = oid;
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.index = -1;
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.seperator = seperator;
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public boolean hasMoreTokens()
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return (index != value.length());
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public String nextToken()
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (index == value.length())
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return null;
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int     end = index + 1;
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean quoted = false;
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean escaped = false;
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        buf.setLength(0);
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        while (end != value.length())
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            char    c = value.charAt(end);
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            if (c == '"')
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                if (!escaped)
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                {
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    quoted = !quoted;
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                }
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                else
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                {
61c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    // BEGIN android-added
62c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    // copied from a newer version of BouncyCastle
63c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    if (c == '#' && buf.charAt(buf.length() - 1) == '=')
64c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    {
65c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                        buf.append('\\');
66c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    }
67c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    else if (c == '+' && seperator != '+')
68c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    {
69c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                        buf.append('\\');
70c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    }
71c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    // END android-added
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    buf.append(c);
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                }
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                escaped = false;
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            else
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                if (escaped || quoted)
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                {
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    if (c == '#' && buf.charAt(buf.length() - 1) == '=')
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    {
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                        buf.append('\\');
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    }
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    else if (c == '+' && seperator != '+')
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    {
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                        buf.append('\\');
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    }
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    buf.append(c);
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    escaped = false;
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                }
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                else if (c == '\\')
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                {
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    escaped = true;
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                }
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                else if (c == seperator)
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                {
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    break;
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                }
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                else
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                {
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    buf.append(c);
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                }
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            end++;
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        index = end;
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return buf.toString().trim();
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
111