summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Klyubin <klyubin@google.com>2014-07-24 09:40:56 -0700
committerPaul Kocialkowski <contact@paulk.fr>2014-11-16 13:52:59 +0100
commit71cdd5497ef83c44e587117aa99fdbb2cf3fbf3c (patch)
tree0db0d39d91ddc2c658f6de82345ce05faeb874fc
parent77dbb153e181bcccef4386eadb207f7bf96936fb (diff)
downloadlibcore-71cdd5497ef83c44e587117aa99fdbb2cf3fbf3c.zip
libcore-71cdd5497ef83c44e587117aa99fdbb2cf3fbf3c.tar.gz
libcore-71cdd5497ef83c44e587117aa99fdbb2cf3fbf3c.tar.bz2
Add a way to get all values of an attribute of DN.
This is needed to switch Apache HTTP hostname verification from its own Distinguished Name (DN) parsing code to this library's DistinguishedNameParser. Bug: 16510257 Change-Id: Iedd27cec162167dad11a4fe477d4eaa3eba004b7
-rw-r--r--luni/src/main/java/javax/net/ssl/DistinguishedNameParser.java70
1 files changed, 70 insertions, 0 deletions
diff --git a/luni/src/main/java/javax/net/ssl/DistinguishedNameParser.java b/luni/src/main/java/javax/net/ssl/DistinguishedNameParser.java
index fb74d9b..f5cc688 100644
--- a/luni/src/main/java/javax/net/ssl/DistinguishedNameParser.java
+++ b/luni/src/main/java/javax/net/ssl/DistinguishedNameParser.java
@@ -17,6 +17,9 @@
package javax.net.ssl;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
import javax.security.auth.x500.X500Principal;
/**
@@ -406,4 +409,71 @@ public final class DistinguishedNameParser {
}
}
}
+
+ /**
+ * Parses the DN and returns all values for an attribute type, in
+ * the order of decreasing significance (most significant first).
+ *
+ * @param attributeType attribute type to look for (e.g. "ca")
+ */
+ public List<String> getAllMostSpecificFirst(String attributeType) {
+ // Initialize internal state.
+ pos = 0;
+ beg = 0;
+ end = 0;
+ cur = 0;
+ chars = dn.toCharArray();
+ List<String> result = Collections.emptyList();
+
+ String attType = nextAT();
+ if (attType == null) {
+ return result;
+ }
+ while (pos < length) {
+ String attValue = "";
+
+ switch (chars[pos]) {
+ case '"':
+ attValue = quotedAV();
+ break;
+ case '#':
+ attValue = hexAV();
+ break;
+ case '+':
+ case ',':
+ case ';': // compatibility with RFC 1779: semicolon can separate RDNs
+ //empty attribute value
+ break;
+ default:
+ attValue = escapedAV();
+ }
+
+ // Values are ordered from most specific to least specific
+ // due to the RFC2253 formatting. So take the first match
+ // we see.
+ if (attributeType.equalsIgnoreCase(attType)) {
+ if (result.isEmpty()) {
+ result = new ArrayList<String>();
+ }
+ result.add(attValue);
+ }
+
+ if (pos >= length) {
+ break;
+ }
+
+ if (chars[pos] == ',' || chars[pos] == ';') {
+ } else if (chars[pos] != '+') {
+ throw new IllegalStateException("Malformed DN: " + dn);
+ }
+
+ pos++;
+ attType = nextAT();
+ if (attType == null) {
+ throw new IllegalStateException("Malformed DN: " + dn);
+ }
+ }
+
+ return result;
+ }
}