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