package de.blinkt.openvpn.core; import android.content.Context; import android.text.TextUtils; import de.blinkt.openvpn.R; import de.blinkt.openvpn.VpnProfile; import org.spongycastle.util.io.pem.PemObject; import org.spongycastle.util.io.pem.PemReader; import javax.security.auth.x500.X500Principal; import java.io.*; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; public class X509Utils { public static Certificate getCertificateFromFile(String certfilename) throws FileNotFoundException, CertificateException { CertificateFactory certFact = CertificateFactory.getInstance("X.509"); InputStream inStream; if(certfilename.startsWith(VpnProfile.INLINE_TAG)) { // The java certifcate reader is ... kind of stupid // It does NOT ignore chars before the --BEGIN ... int subIndex = certfilename.indexOf("-----BEGIN CERTIFICATE-----"); subIndex = Math.max(0,subIndex); inStream = new ByteArrayInputStream(certfilename.substring(subIndex).getBytes()); } else { inStream = new FileInputStream(certfilename); } return certFact.generateCertificate(inStream); } public static PemObject readPemObjectFromFile (String keyfilename) throws IOException { Reader inStream; if(keyfilename.startsWith(VpnProfile.INLINE_TAG)) inStream = new StringReader(keyfilename.replace(VpnProfile.INLINE_TAG,"")); else inStream = new FileReader(new File(keyfilename)); PemReader pr = new PemReader(inStream); PemObject r = pr.readPemObject(); pr.close(); return r; } public static String getCertificateFriendlyName (Context c, String filename) { if(!TextUtils.isEmpty(filename)) { try { X509Certificate cert = (X509Certificate) getCertificateFromFile(filename); return getCertificateFriendlyName(cert); } catch (Exception e) { OpenVPN.logError("Could not read certificate" + e.getLocalizedMessage()); } } return c.getString(R.string.cannotparsecert); } public static String getCertificateFriendlyName(X509Certificate cert) { X500Principal principal = (X500Principal) cert.getSubjectDN(); String friendlyName = principal.getName(); System.out.println(friendlyName); // Really evil hack to decode email address // See: http://code.google.com/p/android/issues/detail?id=21531 String[] parts = friendlyName.split(","); for (int i=0;i