/* * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.security.provider.certpath; import java.io.IOException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import sun.security.util.Debug; import sun.security.x509.AuthorityKeyIdentifierExtension; import sun.security.x509.KeyIdentifier; import sun.security.x509.SubjectKeyIdentifierExtension; import sun.security.x509.X509CertImpl; /* * This class represents a vertex in the adjacency list. A * vertex in the builder's view is just a distinguished name * in the directory. The Vertex contains a certificate * along an attempted certification path, along with a pointer * to a list of certificates that followed this one in various * attempted certification paths. * * @author Sean Mullan * @since 1.4 */ public class Vertex { private static final Debug debug = Debug.getInstance("certpath"); private X509Certificate cert; private int index; private Throwable throwable; /** * Constructor; creates vertex with index of -1 * Use setIndex method to set another index. * * @param cert X509Certificate associated with vertex */ Vertex(X509Certificate cert) { this.cert = cert; this.index = -1; } /** * return the certificate for this vertex * * @return X509Certificate */ public X509Certificate getCertificate() { return cert; } /** * get the index for this vertex, where the index is the row of the * adjacency list that contains certificates that could follow this * certificate. * * @return int index for this vertex, or -1 if no following certificates. */ public int getIndex() { return index; } /** * set the index for this vertex, where the index is the row of the * adjacency list that contains certificates that could follow this * certificate. * * @param ndx int index for vertex, or -1 if no following certificates. */ void setIndex(int ndx) { index = ndx; } /** * return the throwable associated with this vertex; * returns null if none. * * @return Throwable */ public Throwable getThrowable() { return throwable; } /** * set throwable associated with this vertex; default value is null. * * @param throwable Throwable associated with this vertex * (or null) */ void setThrowable(Throwable throwable) { this.throwable = throwable; } /** * Return full string representation of vertex * * @return String representation of vertex */ @Override public String toString() { return certToString() + throwableToString() + indexToString(); } /** * Return string representation of this vertex's * certificate information. * * @return String representation of certificate info */ public String certToString() { StringBuilder sb = new StringBuilder(); X509CertImpl x509Cert = null; try { x509Cert = X509CertImpl.toImpl(cert); } catch (CertificateException ce) { if (debug != null) { debug.println("Vertex.certToString() unexpected exception"); ce.printStackTrace(); } return sb.toString(); } sb.append("Issuer: ").append (x509Cert.getIssuerX500Principal()).append("\n"); sb.append("Subject: ").append (x509Cert.getSubjectX500Principal()).append("\n"); sb.append("SerialNum: ").append (x509Cert.getSerialNumber().toString(16)).append("\n"); sb.append("Expires: ").append (x509Cert.getNotAfter().toString()).append("\n"); boolean[] iUID = x509Cert.getIssuerUniqueID(); if (iUID != null) { sb.append("IssuerUID: "); for (boolean b : iUID) { sb.append(b ? 1 : 0); } sb.append("\n"); } boolean[] sUID = x509Cert.getSubjectUniqueID(); if (sUID != null) { sb.append("SubjectUID: "); for (boolean b : sUID) { sb.append(b ? 1 : 0); } sb.append("\n"); } try { SubjectKeyIdentifierExtension sKeyID = x509Cert.getSubjectKeyIdentifierExtension(); if (sKeyID != null) { KeyIdentifier keyID = sKeyID.get( SubjectKeyIdentifierExtension.KEY_ID); sb.append("SubjKeyID: ").append(keyID.toString()); } AuthorityKeyIdentifierExtension aKeyID = x509Cert.getAuthorityKeyIdentifierExtension(); if (aKeyID != null) { KeyIdentifier keyID = (KeyIdentifier)aKeyID.get( AuthorityKeyIdentifierExtension.KEY_ID); sb.append("AuthKeyID: ").append(keyID.toString()); } } catch (IOException e) { if (debug != null) { debug.println("Vertex.certToString() unexpected exception"); e.printStackTrace(); } } return sb.toString(); } /** * return Vertex throwable as String compatible with * the way toString returns other information * * @return String form of exception (or "none") */ public String throwableToString() { StringBuilder sb = new StringBuilder("Exception: "); if (throwable != null) sb.append(throwable.toString()); else sb.append("null"); sb.append("\n"); return sb.toString(); } /** * return Vertex index as String compatible with * the way other Vertex.xToString() methods display * information. * * @return String form of index as "Last cert? [Yes/No] */ public String moreToString() { StringBuilder sb = new StringBuilder("Last cert? "); sb.append((index == -1) ? "Yes" : "No"); sb.append("\n"); return sb.toString(); } /** * return Vertex index as String compatible with * the way other Vertex.xToString() methods displays other information. * * @return String form of index as "Index: [numeric index]" */ public String indexToString() { return "Index: " + index + "\n"; } }