151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 20310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro * Copyright (c) 1997, 2015, 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 sun.security.x509; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.InputStream; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.OutputStream; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Enumeration; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.util.*; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Represent the CRL Reason Flags. 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>This extension, if present, defines the identifies 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the reason for the certificate revocation. 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The ASN.1 syntax for this is: 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ReasonFlags ::= BIT STRING { 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * unused (0), 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * keyCompromise (1), 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cACompromise (2), 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * affiliationChanged (3), 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * superseded (4), 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cessationOfOperation (5), 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * certificateHold (6), 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * privilegeWithdrawn (7), 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * aACompromise (8) } 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Hemma Prafullchandra 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class ReasonFlags { 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reasons 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String UNUSED = "unused"; 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String KEY_COMPROMISE = "key_compromise"; 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String CA_COMPROMISE = "ca_compromise"; 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String AFFILIATION_CHANGED = "affiliation_changed"; 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String SUPERSEDED = "superseded"; 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String CESSATION_OF_OPERATION 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski = "cessation_of_operation"; 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String CERTIFICATE_HOLD = "certificate_hold"; 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String PRIVILEGE_WITHDRAWN = "privilege_withdrawn"; 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final String AA_COMPROMISE = "aa_compromise"; 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final static String[] NAMES = { 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski UNUSED, 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski KEY_COMPROMISE, 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CA_COMPROMISE, 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AFFILIATION_CHANGED, 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SUPERSEDED, 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CESSATION_OF_OPERATION, 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CERTIFICATE_HOLD, 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski PRIVILEGE_WITHDRAWN, 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AA_COMPROMISE, 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static int name2Index(String name) throws IOException { 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for( int i=0; i<NAMES.length; i++ ) { 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if( NAMES[i].equalsIgnoreCase(name) ) { 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return i; 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Name not recognized by ReasonFlags"); 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Private data members 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private boolean[] bitString; 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Check if bit is set. 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param position the position in the bit string to check. 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private boolean isSet(int position) { 1020310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro return (position < bitString.length) && 1030310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro bitString[position]; 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Set the bit at the specified position. 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void set(int position, boolean val) { 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // enlarge bitString if necessary 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (position >= bitString.length) { 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean[] tmp = new boolean[position+1]; 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.arraycopy(bitString, 0, tmp, 0, bitString.length); 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski bitString = tmp; 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski bitString[position] = val; 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create a ReasonFlags with the passed bit settings. 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reasons the bits to be set for the ReasonFlags. 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ReasonFlags(byte[] reasons) { 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski bitString = new BitArray(reasons.length*8, reasons).toBooleanArray(); 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create a ReasonFlags with the passed bit settings. 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reasons the bits to be set for the ReasonFlags. 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ReasonFlags(boolean[] reasons) { 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.bitString = reasons; 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create a ReasonFlags with the passed bit settings. 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reasons the bits to be set for the ReasonFlags. 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ReasonFlags(BitArray reasons) { 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.bitString = reasons.toBooleanArray(); 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create the object from the passed DER encoded value. 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param in the DerInputStream to read the ReasonFlags from. 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException on decoding errors. 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ReasonFlags(DerInputStream in) throws IOException { 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DerValue derVal = in.getDerValue(); 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.bitString = derVal.getUnalignedBitString(true).toBooleanArray(); 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create the object from the passed DER encoded value. 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param derVal the DerValue decoded from the stream. 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException on decoding errors. 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ReasonFlags(DerValue derVal) throws IOException { 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.bitString = derVal.getUnalignedBitString(true).toBooleanArray(); 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the reason flags as a boolean array. 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean[] getFlags() { 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return bitString; 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Set the attribute value. 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void set(String name, Object obj) throws IOException { 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(obj instanceof Boolean)) { 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("Attribute must be of type Boolean."); 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean val = ((Boolean)obj).booleanValue(); 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski set(name2Index(name), val); 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get the attribute value. 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Object get(String name) throws IOException { 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return Boolean.valueOf(isSet(name2Index(name))); 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Delete the attribute value. 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void delete(String name) throws IOException { 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski set(name, Boolean.FALSE); 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a printable representation of the ReasonFlags. 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 2030310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro StringBuilder sb = new StringBuilder("Reason Flags [\n"); 2040310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro 2050310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(0)) { 2060310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" Unused\n"); 2070310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2080310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(1)) { 2090310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" Key Compromise\n"); 2100310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2110310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(2)) { 2120310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" CA Compromise\n"); 2130310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2140310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(3)) { 2150310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" Affiliation_Changed\n"); 2160310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2170310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(4)) { 2180310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" Superseded\n"); 2190310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2200310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(5)) { 2210310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" Cessation Of Operation\n"); 2220310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2230310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(6)) { 2240310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" Certificate Hold\n"); 2250310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2260310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(7)) { 2270310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" Privilege Withdrawn\n"); 2280310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2290310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro if (isSet(8)) { 2300310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append(" AA Compromise\n"); 2310310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro } 2320310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro sb.append("]\n"); 2330310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro 2340310e4db77a3eb2f0ff6a98af37f6ebd262014d3Sergio Giro return sb.toString(); 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Write the extension to the DerOutputStream. 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the DerOutputStream to write the extension to. 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException on encoding errors. 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void encode(DerOutputStream out) throws IOException { 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.putTruncatedUnalignedBitString(new BitArray(this.bitString)); 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return an enumeration of names of attributes existing within this 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * attribute. 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Enumeration<String> getElements () { 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AttributeNameEnumeration elements = new AttributeNameEnumeration(); 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for( int i=0; i<NAMES.length; i++ ) { 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements.addElement(NAMES[i]); 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (elements.elements()); 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 259