| /* |
| * 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 |
| * |
| * @returns 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. |
| * |
| * @returns 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. |
| * |
| * @returns 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 |
| * |
| * @returns String representation of vertex |
| */ |
| @Override |
| public String toString() { |
| return certToString() + throwableToString() + indexToString(); |
| } |
| |
| /** |
| * Return string representation of this vertex's |
| * certificate information. |
| * |
| * @returns 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 |
| * |
| * @returns 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. |
| * |
| * @returns 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. |
| * |
| * @returns String form of index as "Index: [numeric index]" |
| */ |
| public String indexToString() { |
| return "Index: " + index + "\n"; |
| } |
| } |