net.sf.taverna.t2.activities.wsdl.servicedescriptions.ConfirmTrustedCertificateDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.taverna.t2.activities.wsdl.servicedescriptions.ConfirmTrustedCertificateDialog.java

Source

/*******************************************************************************
 * Copyright (C) 2007 The University of Manchester   
 * 
 *  Modifications to the initial code base are copyright of their
 *  respective authors, or their employers as appropriate.
 * 
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2.1 of
 *  the License, or (at your option) any later version.
 *    
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *    
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ******************************************************************************/
package net.sf.taverna.t2.activities.wsdl.servicedescriptions;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.BigInteger;
import java.util.HashMap;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.JSeparator;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import javax.security.auth.x500.X500Principal;

import net.sf.taverna.t2.lang.ui.DialogTextArea;
import net.sf.taverna.t2.security.credentialmanager.CMException;
import net.sf.taverna.t2.security.credentialmanager.CMUtils;
import net.sf.taverna.t2.workbench.helper.HelpEnabledDialog;

import org.apache.log4j.Logger;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.DERBitString;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.misc.NetscapeCertType;

/**
 * Displays the details of a X.509 certificate and asks user if they want to
 * trust it.
 * 
 * @author Alex Nenadic
 */
@SuppressWarnings("serial")
public class ConfirmTrustedCertificateDialog extends HelpEnabledDialog {

    private static Logger logger = Logger.getLogger(ConfirmTrustedCertificateDialog.class);

    // Stores certificate to display
    private X509Certificate cert;

    // Stores user's decision as whether to trust this service's certificaet or not.
    private boolean shouldTrust;

    /**
     * Creates new ConfirmTrustedCertificateDialog where parent is a Frame.
     */
    public ConfirmTrustedCertificateDialog(Frame parent, String title, boolean modal, X509Certificate crt)
            throws CMException {
        super(parent, title, modal, null);
        this.cert = crt;
        initComponents();
    }

    /**
     * Creates new ConfirmTrustedCertificateDialog where parent is a Dialog.
     */
    public ConfirmTrustedCertificateDialog(Dialog parent, String title, boolean modal, X509Certificate crt)
            throws CMException {
        super(parent, title, modal, null);
        this.cert = crt;
        initComponents();
    }

    /**
     * Initialise the dialog's GUI components.
     */
    private void initComponents() {

        // title panel
        JPanel titlePanel = new JPanel(new BorderLayout());
        titlePanel.setBackground(Color.WHITE);
        JLabel titleLabel = new JLabel("View service's certificate");
        titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD, 13.5f));
        titleLabel.setBorder(new EmptyBorder(10, 10, 0, 10));
        DialogTextArea titleMessage = new DialogTextArea(
                "This service requires HTTPS connection and has identified itself with the certificate below.\n"
                        + "Do you want to trust this service? (Refusing to trust means you will not be able to invoke it from a workflow.)");
        titleMessage.setMargin(new Insets(5, 20, 10, 10));
        titleMessage.setFont(titleMessage.getFont().deriveFont(11f));
        titleMessage.setEditable(false);
        titleMessage.setFocusable(false);
        titlePanel.setBorder(new EmptyBorder(10, 10, 0, 10));
        titlePanel.add(titleLabel, BorderLayout.NORTH);
        titlePanel.add(titleMessage, BorderLayout.CENTER);

        // Certificate details:

        // Grid Bag Constraints templates for labels (column 1) and
        // values (column 2) of certificate details
        GridBagConstraints gbcLabel = new GridBagConstraints();
        gbcLabel.gridx = 0;
        gbcLabel.ipadx = 20;
        gbcLabel.gridwidth = 1;
        gbcLabel.gridheight = 1;
        gbcLabel.insets = new Insets(2, 15, 2, 2);
        gbcLabel.anchor = GridBagConstraints.LINE_START;

        GridBagConstraints gbcValue = new GridBagConstraints();
        gbcValue.gridx = 1;
        gbcValue.gridwidth = 1;
        gbcValue.gridheight = 1;
        gbcValue.insets = new Insets(2, 5, 2, 2);
        gbcValue.anchor = GridBagConstraints.LINE_START;

        // Netscape Certificate Type non-critical extension (if any)
        // defines the intended uses of the certificate - to make it look like
        // firefox's view certificate dialog
        byte[] intendedUses = cert.getExtensionValue("2.16.840.1.113730.1.1"); // Netscape Certificate Type OID
        JLabel jlIntendedUses = null;
        JTextField jtfIntendedUsesValue = null;
        JPanel jpUses = null;
        GridBagConstraints gbc_jpUses = null;
        if (intendedUses != null) {
            jlIntendedUses = new JLabel("This certificate has been approved for the following uses:");
            jlIntendedUses.setFont(new Font(null, Font.BOLD, 11));
            jlIntendedUses.setBorder(new EmptyBorder(5, 5, 5, 5));

            jtfIntendedUsesValue = new JTextField(45);
            jtfIntendedUsesValue.setText(getIntendedUses(intendedUses));
            jtfIntendedUsesValue.setEditable(false);
            jtfIntendedUsesValue.setFont(new Font(null, Font.PLAIN, 11));

            jpUses = new JPanel(new BorderLayout());
            jpUses.add(jlIntendedUses, BorderLayout.NORTH);
            jpUses.add(jtfIntendedUsesValue, BorderLayout.CENTER);
            JSeparator jsp = new JSeparator(JSeparator.HORIZONTAL);
            jpUses.add(jsp, BorderLayout.SOUTH);

            gbc_jpUses = (GridBagConstraints) gbcLabel.clone();
            gbc_jpUses.gridy = 0;
            gbc_jpUses.gridwidth = 2; // takes two columns
            gbc_jpUses.insets = new Insets(5, 5, 5, 5);// has slightly bigger insets
        }

        // Issued To
        JLabel jlIssuedTo = new JLabel("Issued To");
        jlIssuedTo.setFont(new Font(null, Font.BOLD, 11));
        GridBagConstraints gbc_jlIssuedTo = (GridBagConstraints) gbcLabel.clone();
        gbc_jlIssuedTo.gridy = 1;
        gbc_jlIssuedTo.gridwidth = 2; // takes two columns
        gbc_jlIssuedTo.insets = new Insets(5, 5, 5, 5);// has slightly bigger insets
        // Distinguished Name (DN)
        String sDN = cert.getSubjectX500Principal().getName(X500Principal.RFC2253);
        CMUtils util = new CMUtils();
        util.parseDN(sDN);
        // Extract the CN, O, OU and EMAILADDRESS fields
        String sCN = util.getCN();
        String sOrg = util.getO();
        String sOU = util.getOU();
        // String sEMAILADDRESS = CMX509Util.getEmilAddress();
        // Common Name (CN)
        JLabel jlCN = new JLabel("Common Name (CN)");
        jlCN.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlCN = (GridBagConstraints) gbcLabel.clone();
        gbc_jlCN.gridy = 2;
        JLabel jlCNValue = new JLabel(sCN);
        jlCNValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlCNValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlCNValue.gridy = 2;
        // Organisation (O)
        JLabel jlOrg = new JLabel("Organisation (O)");
        jlOrg.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlOrg = (GridBagConstraints) gbcLabel.clone();
        gbc_jlOrg.gridy = 3;
        JLabel jlOrgValue = new JLabel(sOrg);
        jlOrgValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlOrgValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlOrgValue.gridy = 3;
        // Organisation Unit (OU)
        JLabel jlOU = new JLabel("Organisation Unit (OU)");
        jlOU.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlOU = (GridBagConstraints) gbcLabel.clone();
        gbc_jlOU.gridy = 4;
        JLabel jlOUValue = new JLabel(sOU);
        jlOUValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlOUValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlOUValue.gridy = 4;
        // E-mail Address
        // JLabel jlEmail = new JLabel("E-mail Address");
        // jlEmail.setFont(new Font(null, Font.PLAIN, 11));
        // GridBagConstraints gbc_jlEmail = (GridBagConstraints)
        // gbcLabel.clone();
        // gbc_jlEmail.gridy = 5;
        // JLabel jlEmailValue = new JLabel(sEMAILADDRESS);
        // jlEmailValue.setFont(new Font(null, Font.PLAIN, 11));
        // GridBagConstraints gbc_jlEmailValue = (GridBagConstraints)
        // gbcValue.clone();
        // gbc_jlEmailValue.gridy = 5;
        // Serial Number
        JLabel jlSN = new JLabel("Serial Number");
        jlSN.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlSN = (GridBagConstraints) gbcLabel.clone();
        gbc_jlSN.gridy = 6;
        JLabel jlSNValue = new JLabel();
        // Get the hexadecimal serial number
        StringBuffer strBuff = new StringBuffer(
                new BigInteger(1, cert.getSerialNumber().toByteArray()).toString(16).toUpperCase());
        // Place colons at every two hexadecimal characters
        if (strBuff.length() > 2) {
            for (int iCnt = 2; iCnt < strBuff.length(); iCnt += 3) {
                strBuff.insert(iCnt, ':');
            }
        }
        jlSNValue.setText(strBuff.toString());
        jlSNValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlSNValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlSNValue.gridy = 6;
        // Version
        JLabel jlVersion = new JLabel("Version");
        jlVersion.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlVersion = (GridBagConstraints) gbcLabel.clone();
        gbc_jlVersion.gridy = 7;
        JLabel jlVersionValue = new JLabel(Integer.toString(cert.getVersion()));
        jlVersionValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlVersionValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlVersionValue.gridy = 7;

        // Issued By
        JLabel jlIssuedBy = new JLabel("Issued By");
        jlIssuedBy.setFont(new Font(null, Font.BOLD, 11));
        GridBagConstraints gbc_jlIssuedBy = (GridBagConstraints) gbcLabel.clone();
        gbc_jlIssuedBy.gridy = 8;
        gbc_jlIssuedBy.gridwidth = 2; // takes two columns
        gbc_jlIssuedBy.insets = new Insets(5, 5, 5, 5);// has slightly bigger
        // insets
        // Distinguished Name (DN)
        String iDN = cert.getIssuerX500Principal().getName(X500Principal.RFC2253);
        util.parseDN(iDN);
        // Extract the CN, O and OU fields
        String iCN = util.getCN();
        String iOrg = util.getO();
        String iOU = util.getOU();
        // Common Name (CN)
        JLabel jlICN = new JLabel("Common Name (CN)");
        jlICN.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlICN = (GridBagConstraints) gbcLabel.clone();
        gbc_jlICN.gridy = 9;
        JLabel jlICNValue = new JLabel(iCN);
        jlICNValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlICNValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlICNValue.gridy = 9;
        // Organisation (O)
        JLabel jlIOrg = new JLabel("Organisation (O)");
        jlIOrg.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlIOrg = (GridBagConstraints) gbcLabel.clone();
        gbc_jlIOrg.gridy = 10;
        JLabel jlIOrgValue = new JLabel(iOrg);
        jlIOrgValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlIOrgValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlIOrgValue.gridy = 10;
        // Organisation Unit (OU)
        JLabel jlIOU = new JLabel("Organisation Unit (OU)");
        jlIOU.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlIOU = (GridBagConstraints) gbcLabel.clone();
        gbc_jlIOU.gridy = 11;
        JLabel jlIOUValue = new JLabel(iOU);
        jlIOUValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlIOUValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlIOUValue.gridy = 11;
        // Validity
        JLabel jlValidity = new JLabel("Validity");
        jlValidity.setFont(new Font(null, Font.BOLD, 11));
        GridBagConstraints gbc_jlValidity = (GridBagConstraints) gbcLabel.clone();
        gbc_jlValidity.gridy = 12;
        gbc_jlValidity.gridwidth = 2; // takes two columns
        gbc_jlValidity.insets = new Insets(5, 5, 5, 5);// has slightly bigger
        // insets
        // Issued On
        JLabel jlIssuedOn = new JLabel("Issued On");
        jlIssuedOn.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlIssuedOn = (GridBagConstraints) gbcLabel.clone();
        gbc_jlIssuedOn.gridy = 13;
        JLabel jlIssuedOnValue = new JLabel(cert.getNotBefore().toString());
        jlIssuedOnValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlIssuedOnValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlIssuedOnValue.gridy = 13;
        // Expires On
        JLabel jlExpiresOn = new JLabel("Expires On");
        jlExpiresOn.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlExpiresOn = (GridBagConstraints) gbcLabel.clone();
        gbc_jlExpiresOn.gridy = 14;
        JLabel jlExpiresOnValue = new JLabel(cert.getNotAfter().toString());
        jlExpiresOnValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlExpiresOnValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlExpiresOnValue.gridy = 14;

        // Fingerprints
        byte[] bCert = new byte[0];
        try {
            bCert = cert.getEncoded();
        } catch (CertificateEncodingException ex) {
            logger.error("Could not get the encoded form of the certificate.", ex);
        }
        JLabel jlFingerprints = new JLabel("Fingerprints");
        jlFingerprints.setFont(new Font(null, Font.BOLD, 11));
        GridBagConstraints gbc_jlFingerprints = (GridBagConstraints) gbcLabel.clone();
        gbc_jlFingerprints.gridy = 15;
        gbc_jlFingerprints.gridwidth = 2; // takes two columns
        gbc_jlFingerprints.insets = new Insets(5, 5, 5, 5);// has slightly
        // bigger insets
        // SHA-1 Fingerprint
        JLabel jlSHA1Fingerprint = new JLabel("SHA1 Fingerprint");
        jlSHA1Fingerprint.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlSHA1Fingerprint = (GridBagConstraints) gbcLabel.clone();
        gbc_jlSHA1Fingerprint.gridy = 16;
        JLabel jlSHA1FingerprintValue = new JLabel(getMessageDigest(bCert, "SHA1"));
        jlSHA1FingerprintValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlSHA1FingerprintValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlSHA1FingerprintValue.gridy = 16;
        // MD5 Fingerprint
        JLabel jlMD5Fingerprint = new JLabel("MD5 Fingerprint");
        jlMD5Fingerprint.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlMD5Fingerprint = (GridBagConstraints) gbcLabel.clone();
        gbc_jlMD5Fingerprint.gridy = 17;
        JLabel jlMD5FingerprintValue = new JLabel(getMessageDigest(bCert, "MD5"));
        jlMD5FingerprintValue.setFont(new Font(null, Font.PLAIN, 11));
        GridBagConstraints gbc_jlMD5FingerprintValue = (GridBagConstraints) gbcValue.clone();
        gbc_jlMD5FingerprintValue.gridy = 17;

        // Empty label to add a bit space at the bottom of the panel
        // to make it look like firefox's view certificate dialog
        JLabel jlEmpty = new JLabel("");
        GridBagConstraints gbc_jlEmpty = (GridBagConstraints) gbcLabel.clone();
        gbc_jlEmpty.gridy = 18;
        gbc_jlEmpty.gridwidth = 2; // takes two columns
        gbc_jlEmpty.ipady = 40;

        JPanel jpCertificate = new JPanel(new GridBagLayout());
        jpCertificate.setBorder(new CompoundBorder(new EmptyBorder(15, 15, 15, 15), new EtchedBorder()));

        if (intendedUses != null) {
            jpCertificate.add(jpUses, gbc_jpUses);
        }
        jpCertificate.add(jlIssuedTo, gbc_jlIssuedTo); // Issued To
        jpCertificate.add(jlCN, gbc_jlCN);
        jpCertificate.add(jlCNValue, gbc_jlCNValue);
        jpCertificate.add(jlOrg, gbc_jlOrg);
        jpCertificate.add(jlOrgValue, gbc_jlOrgValue);
        jpCertificate.add(jlOU, gbc_jlOU);
        jpCertificate.add(jlOUValue, gbc_jlOUValue);
        // jpCertificate.add(jlEmail, gbc_jlEmail);
        // jpCertificate.add(jlEmailValue, gbc_jlEmailValue);
        jpCertificate.add(jlSN, gbc_jlSN);
        jpCertificate.add(jlSNValue, gbc_jlSNValue);
        jpCertificate.add(jlVersion, gbc_jlVersion);
        jpCertificate.add(jlVersionValue, gbc_jlVersionValue);
        jpCertificate.add(jlIssuedBy, gbc_jlIssuedBy); // Issued By
        jpCertificate.add(jlICN, gbc_jlICN);
        jpCertificate.add(jlICNValue, gbc_jlICNValue);
        jpCertificate.add(jlIOrg, gbc_jlIOrg);
        jpCertificate.add(jlIOrgValue, gbc_jlIOrgValue);
        jpCertificate.add(jlIOU, gbc_jlIOU);
        jpCertificate.add(jlIOUValue, gbc_jlIOUValue);
        jpCertificate.add(jlValidity, gbc_jlValidity); // Validity
        jpCertificate.add(jlIssuedOn, gbc_jlIssuedOn);
        jpCertificate.add(jlIssuedOnValue, gbc_jlIssuedOnValue);
        jpCertificate.add(jlExpiresOn, gbc_jlExpiresOn);
        jpCertificate.add(jlExpiresOnValue, gbc_jlExpiresOnValue);
        jpCertificate.add(jlFingerprints, gbc_jlFingerprints); // Fingerprints
        jpCertificate.add(jlSHA1Fingerprint, gbc_jlSHA1Fingerprint);
        jpCertificate.add(jlSHA1FingerprintValue, gbc_jlSHA1FingerprintValue);
        jpCertificate.add(jlMD5Fingerprint, gbc_jlMD5Fingerprint);
        jpCertificate.add(jlMD5FingerprintValue, gbc_jlMD5FingerprintValue);
        jpCertificate.add(jlEmpty, gbc_jlEmpty); // Empty label to get some vertical space on the frame

        // OK button
        JPanel jpButtons = new JPanel(new FlowLayout(FlowLayout.CENTER));

        final JButton jbTrust = new JButton("Trust");
        jbTrust.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                trustPressed();
            }
        });
        final JButton jbDontTrust = new JButton("Do not trust");
        jbDontTrust.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                dontTrustPressed();
            }
        });

        jpButtons.add(jbTrust);
        jpButtons.add(jbDontTrust);

        // Put it all together
        getContentPane().add(titlePanel, BorderLayout.NORTH);
        getContentPane().add(jpCertificate, BorderLayout.CENTER);
        getContentPane().add(jpButtons, BorderLayout.SOUTH);

        // Resizing wreaks havoc
        setResizable(false);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                closeDialog();
            }
        });

        getRootPane().setDefaultButton(jbTrust);

        pack();
    }

    /**
     * Get the digest of a message as a formatted String.
     * 
     * @param bMessage
     *            The message to digest
     * @param digestType
     *            The message digest algorithm
     * @return The message digest
     */
    public static String getMessageDigest(byte[] bMessage, String digestType) {
        // Create message digest object using the supplied algorithm
        MessageDigest messageDigest;
        try {
            messageDigest = MessageDigest.getInstance(digestType);
        } catch (NoSuchAlgorithmException ex) {
            logger.error("Failed to create message digest.", ex);
            return "";
        }

        // Create raw message digest
        byte[] bFingerPrint = messageDigest.digest(bMessage);

        // Place the raw message digest into a StringBuffer as a Hex number
        StringBuffer strBuff = new StringBuffer(new BigInteger(1, bFingerPrint).toString(16).toUpperCase());

        // Odd number of characters so add in a padding "0"
        if ((strBuff.length() % 2) != 0) {
            strBuff.insert(0, '0');
        }

        // Place colons at every two hex characters
        if (strBuff.length() > 2) {
            for (int iCnt = 2; iCnt < strBuff.length(); iCnt += 3) {
                strBuff.insert(iCnt, ':');
            }
        }

        // Return the formatted message digest
        return strBuff.toString();
    }

    /**
     * Gets the intended certificate uses, i.e. Netscape Certificate Type
     * extension (2.16.840.1.113730.1.1) value as a string
     * 
     * @param value
     *            Extension value as a DER-encoded OCTET string
     * @return Extension value as a string
     */
    private String getIntendedUses(byte[] value) {

        // Netscape Certificate Types (2.16.840.1.113730.1.1)
        int[] INTENDED_USES = new int[] { NetscapeCertType.sslClient, NetscapeCertType.sslServer,
                NetscapeCertType.smime, NetscapeCertType.objectSigning, NetscapeCertType.reserved,
                NetscapeCertType.sslCA, NetscapeCertType.smimeCA, NetscapeCertType.objectSigningCA, };

        // Netscape Certificate Type strings (2.16.840.1.113730.1.1)
        HashMap<String, String> INTENDED_USES_STRINGS = new HashMap<String, String>();
        INTENDED_USES_STRINGS.put("128", "SSL Client");
        INTENDED_USES_STRINGS.put("64", "SSL Server");
        INTENDED_USES_STRINGS.put("32", "S/MIME");
        INTENDED_USES_STRINGS.put("16", "Object Signing");
        INTENDED_USES_STRINGS.put("8", "Reserved");
        INTENDED_USES_STRINGS.put("4", "SSL CA");
        INTENDED_USES_STRINGS.put("2", "S/MIME CA");
        INTENDED_USES_STRINGS.put("1", "Object Signing CA");

        // Get octet string from extension value
        ASN1OctetString fromByteArray = new DEROctetString(value);
        byte[] octets = fromByteArray.getOctets();
        DERBitString fromByteArray2 = new DERBitString(octets);
        int val = new NetscapeCertType(fromByteArray2).intValue();
        StringBuffer strBuff = new StringBuffer();
        for (int i = 0, len = INTENDED_USES.length; i < len; i++) {
            int use = INTENDED_USES[i];
            if ((val & use) == use) {
                strBuff.append(INTENDED_USES_STRINGS.get(String.valueOf(use)) + ", \n");
            }
        }
        // remove the last ", \n" from the end of the buffer
        String str = strBuff.toString();
        str = str.substring(0, str.length() - 3);
        return str;
    }

    /**
     * 'Trust' button pressed.
     */
    private void trustPressed() {
        shouldTrust = true;
        closeDialog();
    }

    /**
     * 'Do not trust' button pressed.
     */
    private void dontTrustPressed() {
        shouldTrust = false;
        closeDialog();
    }

    /**
     * Closes the dialog.
     */
    public void closeDialog() {
        setVisible(false);
        dispose();
    }

    public boolean shouldTrust() {
        return shouldTrust;
    }
}