Decode X509Name

pull/184/head
M66B 5 years ago
parent 96dc7194b1
commit baaf8f85ee

@ -26,19 +26,25 @@ import androidx.room.Entity;
import androidx.room.Index; import androidx.room.Index;
import androidx.room.PrimaryKey; import androidx.room.PrimaryKey;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.x500.AttributeTypeAndValue;
import org.bouncycastle.asn1.x500.RDN;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x500.style.BCStyle;
import org.bouncycastle.asn1.x509.GeneralName; import org.bouncycastle.asn1.x509.GeneralName;
import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.Principal;
import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory; import java.security.cert.CertificateFactory;
import java.security.cert.CertificateParsingException; import java.security.cert.CertificateParsingException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -134,25 +140,19 @@ public class EntityCertificate {
Log.e(ex); Log.e(ex);
} }
if (result.size() == 0)
try { try {
Principal principal = certificate.getSubjectDN(); X500Name name = new JcaX509CertificateHolder(certificate).getSubject();
if (principal != null) { List<RDN> rdns = new ArrayList<>();
String subject = principal.getName(); rdns.addAll(Arrays.asList(name.getRDNs(BCStyle.CN)));
if (subject != null) { rdns.addAll(Arrays.asList(name.getRDNs(BCStyle.EmailAddress)));
Log.i("Parsing subject=" + subject); for (RDN rdn : rdns) {
for (String p : subject.split(",")) { for (AttributeTypeAndValue tv : rdn.getTypesAndValues()) {
String[] kv = p.split("="); ASN1Encodable enc = tv.getValue();
if (kv.length == 2) { if (enc != null) {
String key = kv[0].trim(); String email = enc.toString();
String value = kv[1].trim().toLowerCase(); if (!result.contains(email) &&
if (Helper.EMAIL_ADDRESS.matcher(value).matches() && Helper.EMAIL_ADDRESS.matcher(email).matches())
("CN".equalsIgnoreCase(key) || result.add(email);
"emailAddress".equalsIgnoreCase(key))) {
if (!result.contains(value))
result.add(value);
}
}
} }
} }
} }

Loading…
Cancel
Save