151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.security.cert; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectInputStream; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectOutputStream; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Collections; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Date; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.HashMap; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Map; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Map.Entry; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport javax.security.auth.x500.X500Principal; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.util.ObjectIdentifier; 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.x509.InvalidityDateExtension; 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * An exception that indicates an X.509 certificate is revoked. A 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>CertificateRevokedException</code> contains additional information 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * about the revoked certificate, such as the date on which the 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * certificate was revoked and the reason it was revoked. 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Sean Mullan 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see CertPathValidatorException 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class CertificateRevokedException extends CertificateException { 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final long serialVersionUID = 7839996631571608627L; 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serial the date on which the certificate was revoked 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Date revocationDate; 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serial the revocation reason 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final CRLReason reason; 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serial the <code>X500Principal</code> that represents the name of the 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * authority that signed the certificate's revocation status information 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final X500Principal authority; 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private transient Map<String, Extension> extensions; 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>CertificateRevokedException</code> with 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the specified revocation date, reason code, authority name, and map 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of extensions. 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param revocationDate the date on which the certificate was revoked. The 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * date is copied to protect against subsequent modification. 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reason the revocation reason 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param extensions a map of X.509 Extensions. Each key is an OID String 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that maps to the corresponding Extension. The map is copied to 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * prevent subsequent modification. 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param authority the <code>X500Principal</code> that represents the name 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the authority that signed the certificate's revocation status 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * information 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException if <code>revocationDate</code>, 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>reason</code>, <code>authority</code>, or 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>extensions</code> is <code>null</code> 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public CertificateRevokedException(Date revocationDate, CRLReason reason, 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski X500Principal authority, Map<String, Extension> extensions) { 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (revocationDate == null || reason == null || authority == null || 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extensions == null) { 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.revocationDate = new Date(revocationDate.getTime()); 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.reason = reason; 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.authority = authority; 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.extensions = new HashMap(extensions); 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the date on which the certificate was revoked. A new copy is 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returned each time the method is invoked to protect against subsequent 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * modification. 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the revocation date 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Date getRevocationDate() { 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (Date) revocationDate.clone(); 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the reason the certificate was revoked. 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the revocation reason 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public CRLReason getRevocationReason() { 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return reason; 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the name of the authority that signed the certificate's 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * revocation status information. 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <code>X500Principal</code> that represents the name of the 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * authority that signed the certificate's revocation status information 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public X500Principal getAuthorityName() { 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return authority; 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the invalidity date, as specifed in the Invalidity Date 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * extension of this <code>CertificateRevokedException</code>. The 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invalidity date is the date on which it is known or suspected that the 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * private key was compromised or that the certificate otherwise became 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invalid. This implementation calls <code>getExtensions()</code> and 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * checks the returned map for an entry for the Invalidity Date extension 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * OID ("2.5.29.24"). If found, it returns the invalidity date in the 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * extension; otherwise null. A new Date object is returned each time the 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method is invoked to protect against subsequent modification. 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the invalidity date, or <code>null</code> if not specified 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Date getInvalidityDate() { 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Extension ext = getExtensions().get("2.5.29.24"); 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ext == null) { 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Date invalidity = 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (Date) InvalidityDateExtension.toImpl(ext).get("DATE"); 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Date(invalidity.getTime()); 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException ioe) { 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a map of X.509 extensions containing additional information 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * about the revoked certificate, such as the Invalidity Date 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Extension. Each key is an OID String that maps to the corresponding 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Extension. 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an unmodifiable map of X.509 extensions, or an empty map 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if there are no extensions 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Map<String, Extension> getExtensions() { 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return Collections.unmodifiableMap(extensions); 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Override 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getMessage() { 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return "Certificate has been revoked, reason: " 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + reason + ", revocation date: " + revocationDate 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + ", authority: " + authority + ", extensions: " + extensions; 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Serialize this <code>CertificateRevokedException</code> instance. 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serialData the size of the extensions map (int), followed by all of 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the extensions in the map, in no particular order. For each extension, 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the following data is emitted: the OID String (Object), the criticality 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * flag (boolean), the length of the encoded extension value byte array 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (int), and the encoded extension value bytes. 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void writeObject(ObjectOutputStream oos) throws IOException { 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Write out the non-transient fields 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // (revocationDate, reason, authority) 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski oos.defaultWriteObject(); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Write out the size (number of mappings) of the extensions map 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski oos.writeInt(extensions.size()); 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // For each extension in the map, the following are emitted (in order): 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the OID String (Object), the criticality flag (boolean), the length 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // of the encoded extension value byte array (int), and the encoded 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // extension value byte array. The extensions themselves are emitted 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // in no particular order. 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (Map.Entry<String, Extension> entry : extensions.entrySet()) { 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Extension ext = entry.getValue(); 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski oos.writeObject(ext.getId()); 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski oos.writeBoolean(ext.isCritical()); 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] extVal = ext.getValue(); 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski oos.writeInt(extVal.length); 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski oos.write(extVal); 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Deserialize the <code>CertificateRevokedException</code> instance. 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void readObject(ObjectInputStream ois) 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException, ClassNotFoundException { 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Read in the non-transient fields 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // (revocationDate, reason, authority) 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ois.defaultReadObject(); 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Defensively copy the revocation date 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski revocationDate = new Date(revocationDate.getTime()); 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Read in the size (number of mappings) of the extensions map 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // and create the extensions map 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int size = ois.readInt(); 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (size == 0) { 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extensions = Collections.emptyMap(); 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extensions = new HashMap<String, Extension>(size); 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Read in the extensions and put the mappings in the extensions map 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < size; i++) { 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String oid = (String) ois.readObject(); 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean critical = ois.readBoolean(); 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int length = ois.readInt(); 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] extVal = new byte[length]; 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ois.readFully(extVal); 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Extension ext = sun.security.x509.Extension.newExtension 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (new ObjectIdentifier(oid), critical, extVal); 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extensions.put(oid, ext); 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 246