// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.pkix.util;

import org.bouncycastle.asn1.edec.EdECObjectIdentifiers;
import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import java.util.HashMap;
import java.io.Reader;
import org.bouncycastle.openssl.PEMParser;
import java.io.FileReader;
import java.util.Iterator;
import java.util.Enumeration;
import org.bouncycastle.asn1.x509.Extensions;
import org.bouncycastle.asn1.util.ASN1Dump;
import org.bouncycastle.asn1.x509.ExtendedKeyUsage;
import org.bouncycastle.asn1.x509.KeyUsage;
import org.bouncycastle.asn1.x509.BasicConstraints;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.x509.Extension;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.operator.DefaultSignatureNameFinder;
import org.bouncycastle.util.Strings;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.util.encoders.Hex;
import org.bouncycastle.asn1.x509.KeyPurposeId;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import java.util.Map;

public class X509CertificateFormatter
{
    private static Map<ASN1ObjectIdentifier, String> oidMap;
    private static Map<ASN1ObjectIdentifier, String> keyAlgMap;
    private static Map<KeyPurposeId, String> extUsageMap;
    private static Map<Integer, String> usageMap;
    private static final String spaceStr = "                                                              ";
    
    private static String oidToLabel(final ASN1ObjectIdentifier asn1ObjectIdentifier) {
        final String s = X509CertificateFormatter.oidMap.get(asn1ObjectIdentifier);
        if (s != null) {
            return s;
        }
        return asn1ObjectIdentifier.getId();
    }
    
    private static String keyAlgToLabel(final ASN1ObjectIdentifier asn1ObjectIdentifier) {
        final String s = X509CertificateFormatter.keyAlgMap.get(asn1ObjectIdentifier);
        if (s != null) {
            return s;
        }
        return asn1ObjectIdentifier.getId();
    }
    
    private static String spaces(final int endIndex) {
        return "                                                              ".substring(0, endIndex);
    }
    
    private static String indent(final String str, String str2, final String s) {
        final StringBuilder sb = new StringBuilder();
        final int beginIndex = 0;
        int index;
        for (str2 = str2.substring(0, str2.length() - s.length()); (index = str2.indexOf(s)) > 0; str2 = str2.substring(index + s.length())) {
            sb.append(str2.substring(beginIndex, index));
            sb.append(s);
            sb.append(str);
            if (beginIndex < str2.length()) {}
        }
        if (sb.length() == 0) {
            return str2;
        }
        sb.append(str2);
        return sb.toString();
    }
    
    static void prettyPrintData(final byte[] array, final StringBuilder sb, final String s) {
        if (array.length > 20) {
            sb.append(Hex.toHexString(array, 0, 20)).append(s);
            format(sb, array, s);
        }
        else {
            sb.append(Hex.toHexString(array)).append(s);
        }
    }
    
    static void format(final StringBuilder sb, final byte[] array, final String s) {
        for (int i = 20; i < array.length; i += 20) {
            if (i < array.length - 20) {
                sb.append("                       ").append(Hex.toHexString(array, i, 20)).append(s);
            }
            else {
                sb.append("                       ").append(Hex.toHexString(array, i, array.length - i)).append(s);
            }
        }
    }
    
    public static String asString(final X509CertificateHolder x509CertificateHolder) {
        final StringBuilder sb = new StringBuilder();
        final String lineSeparator = Strings.lineSeparator();
        final String replace = new DefaultSignatureNameFinder().getAlgorithmName(x509CertificateHolder.getSignatureAlgorithm()).replace("WITH", "with");
        final String keyAlgToLabel = keyAlgToLabel(x509CertificateHolder.getSubjectPublicKeyInfo().getAlgorithm().getAlgorithm());
        sb.append("  [0]         Version: ").append(x509CertificateHolder.getVersionNumber()).append(lineSeparator);
        sb.append("         SerialNumber: ").append(x509CertificateHolder.getSerialNumber()).append(lineSeparator);
        sb.append("             IssuerDN: ").append(x509CertificateHolder.getIssuer()).append(lineSeparator);
        sb.append("           Start Date: ").append(x509CertificateHolder.getNotBefore()).append(lineSeparator);
        sb.append("           Final Date: ").append(x509CertificateHolder.getNotAfter()).append(lineSeparator);
        sb.append("            SubjectDN: ").append(x509CertificateHolder.getSubject()).append(lineSeparator);
        sb.append("           Public Key: ").append(keyAlgToLabel).append(lineSeparator);
        sb.append("                       ");
        prettyPrintData(x509CertificateHolder.getSubjectPublicKeyInfo().getPublicKeyData().getOctets(), sb, lineSeparator);
        final Extensions extensions = x509CertificateHolder.getExtensions();
        if (extensions != null) {
            final Enumeration oids = extensions.oids();
            if (oids.hasMoreElements()) {
                sb.append("           Extensions: ").append(lineSeparator);
            }
            while (oids.hasMoreElements()) {
                final ASN1ObjectIdentifier asn1ObjectIdentifier = oids.nextElement();
                final Extension extension = extensions.getExtension(asn1ObjectIdentifier);
                if (extension.getExtnValue() != null) {
                    final ASN1InputStream asn1InputStream = new ASN1InputStream(extension.getExtnValue().getOctets());
                    final String s = "                       ";
                    try {
                        final String oidToLabel = oidToLabel(asn1ObjectIdentifier);
                        sb.append(s).append(oidToLabel);
                        sb.append(": critical(").append(extension.isCritical()).append(") ").append(lineSeparator);
                        final String string = s + spaces(2 + oidToLabel.length());
                        if (asn1ObjectIdentifier.equals(Extension.basicConstraints)) {
                            final BasicConstraints instance = BasicConstraints.getInstance(asn1InputStream.readObject());
                            sb.append(string).append("isCA : " + instance.isCA()).append(lineSeparator);
                            if (!instance.isCA()) {
                                continue;
                            }
                            sb.append(spaces(2 + oidToLabel.length()));
                            sb.append("pathLenConstraint : " + instance.getPathLenConstraint()).append(lineSeparator);
                        }
                        else if (asn1ObjectIdentifier.equals(Extension.keyUsage)) {
                            final KeyUsage instance2 = KeyUsage.getInstance(asn1InputStream.readObject());
                            sb.append(string);
                            int n = 1;
                            for (final int intValue : X509CertificateFormatter.usageMap.keySet()) {
                                if (instance2.hasUsages(intValue)) {
                                    if (n == 0) {
                                        sb.append(", ");
                                    }
                                    else {
                                        n = 0;
                                    }
                                    sb.append(X509CertificateFormatter.usageMap.get(intValue));
                                }
                            }
                            sb.append(lineSeparator);
                        }
                        else if (asn1ObjectIdentifier.equals(Extension.extendedKeyUsage)) {
                            final ExtendedKeyUsage instance3 = ExtendedKeyUsage.getInstance(asn1InputStream.readObject());
                            sb.append(string);
                            int n2 = 1;
                            for (final KeyPurposeId keyPurposeId : X509CertificateFormatter.extUsageMap.keySet()) {
                                if (instance3.hasKeyPurposeId(keyPurposeId)) {
                                    if (n2 == 0) {
                                        sb.append(", ");
                                    }
                                    else {
                                        n2 = 0;
                                    }
                                    sb.append(X509CertificateFormatter.extUsageMap.get(keyPurposeId));
                                }
                            }
                            sb.append(lineSeparator);
                        }
                        else {
                            sb.append(string).append("value = ").append(indent(string + spaces(8), ASN1Dump.dumpAsString(asn1InputStream.readObject()), lineSeparator)).append(lineSeparator);
                        }
                    }
                    catch (final Exception ex) {
                        sb.append(asn1ObjectIdentifier.getId());
                        sb.append(" value = ").append("*****").append(lineSeparator);
                    }
                }
                else {
                    sb.append(lineSeparator);
                }
            }
        }
        sb.append("  Signature Algorithm: ").append(replace).append(lineSeparator);
        sb.append("            Signature: ");
        prettyPrintData(x509CertificateHolder.getSignature(), sb, lineSeparator);
        return sb.toString();
    }
    
    public static void main(final String[] array) throws Exception {
        System.out.println(asString((X509CertificateHolder)new PEMParser(new FileReader(array[0])).readObject()));
    }
    
    static {
        X509CertificateFormatter.oidMap = new HashMap<ASN1ObjectIdentifier, String>();
        X509CertificateFormatter.keyAlgMap = new HashMap<ASN1ObjectIdentifier, String>();
        X509CertificateFormatter.extUsageMap = new HashMap<KeyPurposeId, String>();
        X509CertificateFormatter.usageMap = new HashMap<Integer, String>();
        X509CertificateFormatter.oidMap.put(Extension.subjectDirectoryAttributes, "subjectDirectoryAttributes");
        X509CertificateFormatter.oidMap.put(Extension.subjectKeyIdentifier, "subjectKeyIdentifier");
        X509CertificateFormatter.oidMap.put(Extension.keyUsage, "keyUsage");
        X509CertificateFormatter.oidMap.put(Extension.privateKeyUsagePeriod, "privateKeyUsagePeriod");
        X509CertificateFormatter.oidMap.put(Extension.subjectAlternativeName, "subjectAlternativeName");
        X509CertificateFormatter.oidMap.put(Extension.issuerAlternativeName, "issuerAlternativeName");
        X509CertificateFormatter.oidMap.put(Extension.basicConstraints, "basicConstraints");
        X509CertificateFormatter.oidMap.put(Extension.cRLNumber, "cRLNumber");
        X509CertificateFormatter.oidMap.put(Extension.reasonCode, "reasonCode");
        X509CertificateFormatter.oidMap.put(Extension.instructionCode, "instructionCode");
        X509CertificateFormatter.oidMap.put(Extension.invalidityDate, "invalidityDate");
        X509CertificateFormatter.oidMap.put(Extension.deltaCRLIndicator, "deltaCRLIndicator");
        X509CertificateFormatter.oidMap.put(Extension.issuingDistributionPoint, "issuingDistributionPoint");
        X509CertificateFormatter.oidMap.put(Extension.certificateIssuer, "certificateIssuer");
        X509CertificateFormatter.oidMap.put(Extension.nameConstraints, "nameConstraints");
        X509CertificateFormatter.oidMap.put(Extension.cRLDistributionPoints, "cRLDistributionPoints");
        X509CertificateFormatter.oidMap.put(Extension.certificatePolicies, "certificatePolicies");
        X509CertificateFormatter.oidMap.put(Extension.policyMappings, "policyMappings");
        X509CertificateFormatter.oidMap.put(Extension.authorityKeyIdentifier, "authorityKeyIdentifier");
        X509CertificateFormatter.oidMap.put(Extension.policyConstraints, "policyConstraints");
        X509CertificateFormatter.oidMap.put(Extension.extendedKeyUsage, "extendedKeyUsage");
        X509CertificateFormatter.oidMap.put(Extension.freshestCRL, "freshestCRL");
        X509CertificateFormatter.oidMap.put(Extension.inhibitAnyPolicy, "inhibitAnyPolicy");
        X509CertificateFormatter.oidMap.put(Extension.authorityInfoAccess, "authorityInfoAccess");
        X509CertificateFormatter.oidMap.put(Extension.subjectInfoAccess, "subjectInfoAccess");
        X509CertificateFormatter.oidMap.put(Extension.logoType, "logoType");
        X509CertificateFormatter.oidMap.put(Extension.biometricInfo, "biometricInfo");
        X509CertificateFormatter.oidMap.put(Extension.qCStatements, "qCStatements");
        X509CertificateFormatter.oidMap.put(Extension.auditIdentity, "auditIdentity");
        X509CertificateFormatter.oidMap.put(Extension.noRevAvail, "noRevAvail");
        X509CertificateFormatter.oidMap.put(Extension.targetInformation, "targetInformation");
        X509CertificateFormatter.oidMap.put(Extension.expiredCertsOnCRL, "expiredCertsOnCRL");
        X509CertificateFormatter.usageMap.put(128, "digitalSignature");
        X509CertificateFormatter.usageMap.put(64, "nonRepudiation");
        X509CertificateFormatter.usageMap.put(32, "keyEncipherment");
        X509CertificateFormatter.usageMap.put(16, "dataEncipherment");
        X509CertificateFormatter.usageMap.put(8, "keyAgreement");
        X509CertificateFormatter.usageMap.put(4, "keyCertSign");
        X509CertificateFormatter.usageMap.put(2, "cRLSign");
        X509CertificateFormatter.usageMap.put(1, "encipherOnly");
        X509CertificateFormatter.usageMap.put(32768, "decipherOnly");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.anyExtendedKeyUsage, "anyExtendedKeyUsage");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_serverAuth, "id_kp_serverAuth");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_clientAuth, "id_kp_clientAuth");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_codeSigning, "id_kp_codeSigning");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_emailProtection, "id_kp_emailProtection");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_ipsecEndSystem, "id_kp_ipsecEndSystem");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_ipsecTunnel, "id_kp_ipsecTunnel");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_ipsecUser, "id_kp_ipsecUser");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_timeStamping, "id_kp_timeStamping");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_OCSPSigning, "id_kp_OCSPSigning");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_dvcs, "id_kp_dvcs");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_sbgpCertAAServerAuth, "id_kp_sbgpCertAAServerAuth");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_scvp_responder, "id_kp_scvp_responder");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_eapOverPPP, "id_kp_eapOverPPP");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_eapOverLAN, "id_kp_eapOverLAN");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_scvpServer, "id_kp_scvpServer");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_scvpClient, "id_kp_scvpClient");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_ipsecIKE, "id_kp_ipsecIKE");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_capwapAC, "id_kp_capwapAC");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_capwapWTP, "id_kp_capwapWTP");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_cmcCA, "id_kp_cmcCA");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_cmcRA, "id_kp_cmcRA");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_cmKGA, "id_kp_cmKGA");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_smartcardlogon, "id_kp_smartcardlogon");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_macAddress, "id_kp_macAddress");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_msSGC, "id_kp_msSGC");
        X509CertificateFormatter.extUsageMap.put(KeyPurposeId.id_kp_nsSGC, "id_kp_nsSGC");
        X509CertificateFormatter.keyAlgMap.put(PKCSObjectIdentifiers.rsaEncryption, "rsaEncryption");
        X509CertificateFormatter.keyAlgMap.put(X9ObjectIdentifiers.id_ecPublicKey, "id_ecPublicKey");
        X509CertificateFormatter.keyAlgMap.put(EdECObjectIdentifiers.id_Ed25519, "id_Ed25519");
        X509CertificateFormatter.keyAlgMap.put(EdECObjectIdentifiers.id_Ed448, "id_Ed448");
    }
}
