0N/A/*
2362N/A * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage sun.security.x509;
0N/A
0N/Aimport java.io.IOException;
0N/Aimport java.io.InputStream;
0N/Aimport java.io.OutputStream;
0N/Aimport java.util.Enumeration;
0N/A
0N/Aimport sun.security.util.*;
0N/A
0N/A/**
0N/A * Represent the CRL Reason Flags.
0N/A *
0N/A * <p>This extension, if present, defines the identifies
0N/A * the reason for the certificate revocation.
0N/A * <p>The ASN.1 syntax for this is:
0N/A * <pre>
0N/A * ReasonFlags ::= BIT STRING {
0N/A * unused (0),
0N/A * keyCompromise (1),
0N/A * cACompromise (2),
0N/A * affiliationChanged (3),
0N/A * superseded (4),
0N/A * cessationOfOperation (5),
0N/A * certificateHold (6),
0N/A * privilegeWithdrawn (7),
0N/A * aACompromise (8) }
0N/A * </pre>
0N/A *
0N/A * @author Hemma Prafullchandra
0N/A */
0N/Apublic class ReasonFlags {
0N/A
0N/A /**
0N/A * Reasons
0N/A */
0N/A public static final String UNUSED = "unused";
0N/A public static final String KEY_COMPROMISE = "key_compromise";
0N/A public static final String CA_COMPROMISE = "ca_compromise";
0N/A public static final String AFFILIATION_CHANGED = "affiliation_changed";
0N/A public static final String SUPERSEDED = "superseded";
0N/A public static final String CESSATION_OF_OPERATION
0N/A = "cessation_of_operation";
0N/A public static final String CERTIFICATE_HOLD = "certificate_hold";
0N/A public static final String PRIVILEGE_WITHDRAWN = "privilege_withdrawn";
0N/A public static final String AA_COMPROMISE = "aa_compromise";
0N/A
0N/A private final static String[] NAMES = {
0N/A UNUSED,
0N/A KEY_COMPROMISE,
0N/A CA_COMPROMISE,
0N/A AFFILIATION_CHANGED,
0N/A SUPERSEDED,
0N/A CESSATION_OF_OPERATION,
0N/A CERTIFICATE_HOLD,
0N/A PRIVILEGE_WITHDRAWN,
0N/A AA_COMPROMISE,
0N/A };
0N/A
0N/A private static int name2Index(String name) throws IOException {
0N/A for( int i=0; i<NAMES.length; i++ ) {
0N/A if( NAMES[i].equalsIgnoreCase(name) ) {
0N/A return i;
0N/A }
0N/A }
0N/A throw new IOException("Name not recognized by ReasonFlags");
0N/A }
0N/A
0N/A // Private data members
0N/A private boolean[] bitString;
0N/A
0N/A /**
0N/A * Check if bit is set.
0N/A *
0N/A * @param position the position in the bit string to check.
0N/A */
0N/A private boolean isSet(int position) {
0N/A return bitString[position];
0N/A }
0N/A
0N/A /**
0N/A * Set the bit at the specified position.
0N/A */
0N/A private void set(int position, boolean val) {
0N/A // enlarge bitString if necessary
0N/A if (position >= bitString.length) {
0N/A boolean[] tmp = new boolean[position+1];
0N/A System.arraycopy(bitString, 0, tmp, 0, bitString.length);
0N/A bitString = tmp;
0N/A }
0N/A bitString[position] = val;
0N/A }
0N/A
0N/A /**
0N/A * Create a ReasonFlags with the passed bit settings.
0N/A *
0N/A * @param reasons the bits to be set for the ReasonFlags.
0N/A */
0N/A public ReasonFlags(byte[] reasons) {
0N/A bitString = new BitArray(reasons.length*8, reasons).toBooleanArray();
0N/A }
0N/A
0N/A /**
0N/A * Create a ReasonFlags with the passed bit settings.
0N/A *
0N/A * @param reasons the bits to be set for the ReasonFlags.
0N/A */
0N/A public ReasonFlags(boolean[] reasons) {
0N/A this.bitString = reasons;
0N/A }
0N/A
0N/A /**
0N/A * Create a ReasonFlags with the passed bit settings.
0N/A *
0N/A * @param reasons the bits to be set for the ReasonFlags.
0N/A */
0N/A public ReasonFlags(BitArray reasons) {
0N/A this.bitString = reasons.toBooleanArray();
0N/A }
0N/A
0N/A /**
0N/A * Create the object from the passed DER encoded value.
0N/A *
0N/A * @param in the DerInputStream to read the ReasonFlags from.
0N/A * @exception IOException on decoding errors.
0N/A */
0N/A public ReasonFlags(DerInputStream in) throws IOException {
0N/A DerValue derVal = in.getDerValue();
0N/A this.bitString = derVal.getUnalignedBitString(true).toBooleanArray();
0N/A }
0N/A
0N/A /**
0N/A * Create the object from the passed DER encoded value.
0N/A *
0N/A * @param derVal the DerValue decoded from the stream.
0N/A * @exception IOException on decoding errors.
0N/A */
0N/A public ReasonFlags(DerValue derVal) throws IOException {
0N/A this.bitString = derVal.getUnalignedBitString(true).toBooleanArray();
0N/A }
0N/A
0N/A /**
0N/A * Returns the reason flags as a boolean array.
0N/A */
0N/A public boolean[] getFlags() {
0N/A return bitString;
0N/A }
0N/A
0N/A /**
0N/A * Set the attribute value.
0N/A */
0N/A public void set(String name, Object obj) throws IOException {
0N/A if (!(obj instanceof Boolean)) {
0N/A throw new IOException("Attribute must be of type Boolean.");
0N/A }
0N/A boolean val = ((Boolean)obj).booleanValue();
0N/A set(name2Index(name), val);
0N/A }
0N/A
0N/A /**
0N/A * Get the attribute value.
0N/A */
0N/A public Object get(String name) throws IOException {
0N/A return Boolean.valueOf(isSet(name2Index(name)));
0N/A }
0N/A
0N/A /**
0N/A * Delete the attribute value.
0N/A */
0N/A public void delete(String name) throws IOException {
0N/A set(name, Boolean.FALSE);
0N/A }
0N/A
0N/A /**
0N/A * Returns a printable representation of the ReasonFlags.
0N/A */
0N/A public String toString() {
0N/A String s = "Reason Flags [\n";
0N/A
0N/A try {
0N/A if (isSet(0)) s += " Unused\n";
0N/A if (isSet(1)) s += " Key Compromise\n";
0N/A if (isSet(2)) s += " CA Compromise\n";
0N/A if (isSet(3)) s += " Affiliation_Changed\n";
0N/A if (isSet(4)) s += " Superseded\n";
0N/A if (isSet(5)) s += " Cessation Of Operation\n";
0N/A if (isSet(6)) s += " Certificate Hold\n";
0N/A if (isSet(7)) s += " Privilege Withdrawn\n";
0N/A if (isSet(8)) s += " AA Compromise\n";
0N/A } catch (ArrayIndexOutOfBoundsException ex) {}
0N/A
0N/A s += "]\n";
0N/A
0N/A return (s);
0N/A }
0N/A
0N/A /**
0N/A * Write the extension to the DerOutputStream.
0N/A *
0N/A * @param out the DerOutputStream to write the extension to.
0N/A * @exception IOException on encoding errors.
0N/A */
0N/A public void encode(DerOutputStream out) throws IOException {
0N/A out.putTruncatedUnalignedBitString(new BitArray(this.bitString));
0N/A }
0N/A
0N/A /**
0N/A * Return an enumeration of names of attributes existing within this
0N/A * attribute.
0N/A */
0N/A public Enumeration<String> getElements () {
0N/A AttributeNameEnumeration elements = new AttributeNameEnumeration();
0N/A for( int i=0; i<NAMES.length; i++ ) {
0N/A elements.addElement(NAMES[i]);
0N/A }
0N/A return (elements.elements());
0N/A }
0N/A}