diff options
Diffstat (limited to 'pki/base/util/src/netscape/security/util')
24 files changed, 3676 insertions, 3449 deletions
diff --git a/pki/base/util/src/netscape/security/util/ASN1CharStrConvMap.java b/pki/base/util/src/netscape/security/util/ASN1CharStrConvMap.java index 5df6baef8..d30a4d414 100644 --- a/pki/base/util/src/netscape/security/util/ASN1CharStrConvMap.java +++ b/pki/base/util/src/netscape/security/util/ASN1CharStrConvMap.java @@ -29,145 +29,138 @@ import sun.io.CharToByteUTF8; * Maps a ASN.1 character string type to a CharToByte and ByteToChar converter. * The converter is used to convert a DerValue of a ASN.1 character string type * from bytes to unicode characters and vice versa. - * - * <p>A global default ASN1CharStrConvMap is created when the class is - * initialized. The global default map is extensible. - * + * + * <p> + * A global default ASN1CharStrConvMap is created when the class is initialized. + * The global default map is extensible. + * * @author Lily Hsiao * @author Slava Galperin - * + * */ -public class ASN1CharStrConvMap -{ +public class ASN1CharStrConvMap { // public constructors /** * Constructs a ASN1CharStrConvMap. */ - public ASN1CharStrConvMap() - { + public ASN1CharStrConvMap() { } /** * Get a Character to Byte converter for the specified DER tag. - * - * @param tag A DER tag of a ASN.1 character string type, - * for example DerValue.tag_PrintableString. - * - * @return A CharToByteConverter for the DER tag. - * - * @exception InstantiationException - * if error occurs when instantiating the CharToByteConverter. - * @exception IllegalAccessException - * if error occurs when loading the CharToByteConverter class. + * + * @param tag A DER tag of a ASN.1 character string type, for example + * DerValue.tag_PrintableString. + * + * @return A CharToByteConverter for the DER tag. + * + * @exception InstantiationException if error occurs when instantiating the + * CharToByteConverter. + * @exception IllegalAccessException if error occurs when loading the + * CharToByteConverter class. */ - public CharToByteConverter getCBC(byte tag) - throws IllegalAccessException, InstantiationException - { - Byte tagObj = Byte.valueOf(tag); - CharToByteConverter cbc = null; - Class cbcClass; - cbcClass = (Class)tag2CBC.get(tagObj); - if (cbcClass == null) - return null; - cbc = (CharToByteConverter)cbcClass.newInstance(); - cbc.setSubstitutionMode(false); - return cbc; + public CharToByteConverter getCBC(byte tag) throws IllegalAccessException, + InstantiationException { + Byte tagObj = Byte.valueOf(tag); + CharToByteConverter cbc = null; + Class cbcClass; + cbcClass = (Class) tag2CBC.get(tagObj); + if (cbcClass == null) + return null; + cbc = (CharToByteConverter) cbcClass.newInstance(); + cbc.setSubstitutionMode(false); + return cbc; } /** * Get a Byte to Character converter for the given DER tag. - * - * @param tag A DER tag of a ASN.1 character string type, - * for example DerValue.tag_PrintableString. - * - * @return A ByteToCharConverter for the DER tag. - * - * @exception InstantiationException - * if error occurs when instantiationg the ByteToCharConverter. - * @exception IllegalAccessException - * if error occurs when loading the ByteToCharConverter class. + * + * @param tag A DER tag of a ASN.1 character string type, for example + * DerValue.tag_PrintableString. + * + * @return A ByteToCharConverter for the DER tag. + * + * @exception InstantiationException if error occurs when instantiationg the + * ByteToCharConverter. + * @exception IllegalAccessException if error occurs when loading the + * ByteToCharConverter class. */ - public ByteToCharConverter getBCC(byte tag) - throws IllegalAccessException, InstantiationException - { - Byte tagObj = Byte.valueOf(tag); - ByteToCharConverter bcc = null; - Class bccClass = (Class)tag2BCC.get(tagObj); - if (bccClass == null) - return null; - bcc = (ByteToCharConverter)bccClass.newInstance(); - bcc.setSubstitutionMode(false); - return bcc; + public ByteToCharConverter getBCC(byte tag) throws IllegalAccessException, + InstantiationException { + Byte tagObj = Byte.valueOf(tag); + ByteToCharConverter bcc = null; + Class bccClass = (Class) tag2BCC.get(tagObj); + if (bccClass == null) + return null; + bcc = (ByteToCharConverter) bccClass.newInstance(); + bcc.setSubstitutionMode(false); + return bcc; } /** * Add a tag-CharToByteConverter-ByteToCharConverter entry in the map. - * - * @param tag A DER tag of a ASN.1 character string type, - * ex. DerValue.tag_IA5String - * @param cbc A CharToByteConverter for the tag. - * @param bcc A ByteToCharConverter for the tag. + * + * @param tag A DER tag of a ASN.1 character string type, ex. + * DerValue.tag_IA5String + * @param cbc A CharToByteConverter for the tag. + * @param bcc A ByteToCharConverter for the tag. */ - public void addEntry(byte tag, Class cbc, Class bcc) - { - Class current_cbc; - Class current_bcc; - Byte tagByte = Byte.valueOf(tag); - - current_cbc = (Class)tag2CBC.get(tagByte); - current_bcc = (Class)tag2BCC.get(tagByte); - if (current_cbc != null || current_bcc != null) - { - if (current_cbc != cbc || current_bcc != bcc) - { - throw new IllegalArgumentException( - "a DER tag to converter entry already exists."); - } - else { - return; - } - } - if (!CharToByteConverter.class.isAssignableFrom(cbc) || - !ByteToCharConverter.class.isAssignableFrom(bcc)) { - throw new IllegalArgumentException( - "arguments not a CharToByteConverter or ByteToCharConverter"); - } - tag2CBC.put(tagByte, cbc); - tag2BCC.put(tagByte, bcc); + public void addEntry(byte tag, Class cbc, Class bcc) { + Class current_cbc; + Class current_bcc; + Byte tagByte = Byte.valueOf(tag); + + current_cbc = (Class) tag2CBC.get(tagByte); + current_bcc = (Class) tag2BCC.get(tagByte); + if (current_cbc != null || current_bcc != null) { + if (current_cbc != cbc || current_bcc != bcc) { + throw new IllegalArgumentException( + "a DER tag to converter entry already exists."); + } else { + return; + } + } + if (!CharToByteConverter.class.isAssignableFrom(cbc) + || !ByteToCharConverter.class.isAssignableFrom(bcc)) { + throw new IllegalArgumentException( + "arguments not a CharToByteConverter or ByteToCharConverter"); + } + tag2CBC.put(tagByte, cbc); + tag2BCC.put(tagByte, bcc); } /** * Get and enumeration of all tags in the map. - * @return An Enumeration of DER tags in the map as Bytes. + * + * @return An Enumeration of DER tags in the map as Bytes. */ - public Enumeration getTags() - { - return tag2CBC.keys(); + public Enumeration getTags() { + return tag2CBC.keys(); } // static public methods. /** * Get the global ASN1CharStrConvMap. - * @return The global default ASN1CharStrConvMap. + * + * @return The global default ASN1CharStrConvMap. */ - static public ASN1CharStrConvMap getDefault() - { - return defaultMap; + static public ASN1CharStrConvMap getDefault() { + return defaultMap; } /** * Set the global default ASN1CharStrConvMap. - * @param newDefault The new default ASN1CharStrConvMap. + * + * @param newDefault The new default ASN1CharStrConvMap. */ - static public void setDefault(ASN1CharStrConvMap newDefault) - { - if (newDefault == null) - throw new IllegalArgumentException( - "Cannot set a null default Der Tag Converter map"); - defaultMap = newDefault; + static public void setDefault(ASN1CharStrConvMap newDefault) { + if (newDefault == null) + throw new IllegalArgumentException( + "Cannot set a null default Der Tag Converter map"); + defaultMap = newDefault; } // private methods and variables. @@ -181,50 +174,47 @@ public class ASN1CharStrConvMap * Create the default converter map on initialization */ static { - defaultMap = new ASN1CharStrConvMap(); - defaultMap.addEntry(DerValue.tag_PrintableString, - CharToBytePrintable.class, ByteToCharPrintable.class); - defaultMap.addEntry(DerValue.tag_VisibleString, - CharToBytePrintable.class, ByteToCharPrintable.class); - defaultMap.addEntry(DerValue.tag_IA5String, - CharToByteIA5String.class, ByteToCharIA5String.class); - defaultMap.addEntry(DerValue.tag_BMPString, - // Changed by bskim - //sun.io.CharToByteUnicode.class, - //netscape.security.util.ByteToCharUnicode.class); - sun.io.CharToByteUnicodeBig.class, - sun.io.ByteToCharUnicodeBig.class); - // Change end - defaultMap.addEntry(DerValue.tag_UniversalString, - CharToByteUniversalString.class, - ByteToCharUniversalString.class); - // XXX this is an oversimplified implementation of T.61 strings, it - // doesn't handle all cases - defaultMap.addEntry(DerValue.tag_T61String, - latin1CBC.class, latin1BCC.class); - // UTF8String added to ASN.1 in 1998 - defaultMap.addEntry(DerValue.tag_UTF8String, - CharToByteUTF8.class, - ByteToCharUTF8.class); - defaultMap.addEntry(DerValue.tag_GeneralString, - CharToByteUTF8.class, - ByteToCharUTF8.class); + defaultMap = new ASN1CharStrConvMap(); + defaultMap.addEntry(DerValue.tag_PrintableString, + CharToBytePrintable.class, ByteToCharPrintable.class); + defaultMap.addEntry(DerValue.tag_VisibleString, + CharToBytePrintable.class, ByteToCharPrintable.class); + defaultMap.addEntry(DerValue.tag_IA5String, CharToByteIA5String.class, + ByteToCharIA5String.class); + defaultMap.addEntry( + DerValue.tag_BMPString, + // Changed by bskim + // sun.io.CharToByteUnicode.class, + // netscape.security.util.ByteToCharUnicode.class); + sun.io.CharToByteUnicodeBig.class, + sun.io.ByteToCharUnicodeBig.class); + // Change end + defaultMap.addEntry(DerValue.tag_UniversalString, + CharToByteUniversalString.class, + ByteToCharUniversalString.class); + // XXX this is an oversimplified implementation of T.61 strings, it + // doesn't handle all cases + defaultMap.addEntry(DerValue.tag_T61String, latin1CBC.class, + latin1BCC.class); + // UTF8String added to ASN.1 in 1998 + defaultMap.addEntry(DerValue.tag_UTF8String, CharToByteUTF8.class, + ByteToCharUTF8.class); + defaultMap.addEntry(DerValue.tag_GeneralString, CharToByteUTF8.class, + ByteToCharUTF8.class); }; }; class latin1CBC extends sun.io.CharToByteISO8859_1 { - public latin1CBC() { - super(); - subMode = false; - } + public latin1CBC() { + super(); + subMode = false; + } } class latin1BCC extends sun.io.ByteToCharISO8859_1 { - public latin1BCC() { - super(); - subMode = false; - } + public latin1BCC() { + super(); + subMode = false; + } } - - diff --git a/pki/base/util/src/netscape/security/util/BigInt.java b/pki/base/util/src/netscape/security/util/BigInt.java index 10e4569de..9cfbb02c3 100644 --- a/pki/base/util/src/netscape/security/util/BigInt.java +++ b/pki/base/util/src/netscape/security/util/BigInt.java @@ -19,180 +19,184 @@ package netscape.security.util; import java.math.BigInteger; - /** - * A low-overhead arbitrary-precision <em>unsigned</em> integer. - * This is intended for use with ASN.1 parsing, and printing of - * such parsed values. Convert to "BigInteger" if you need to do - * arbitrary precision arithmetic, rather than just represent - * the number as a wrapped array of bytes. - * - * <P><em><b>NOTE:</b> This class may eventually disappear, to + * A low-overhead arbitrary-precision <em>unsigned</em> integer. This is + * intended for use with ASN.1 parsing, and printing of such parsed values. + * Convert to "BigInteger" if you need to do arbitrary precision arithmetic, + * rather than just represent the number as a wrapped array of bytes. + * + * <P> + * <em><b>NOTE:</b> This class may eventually disappear, to * be supplanted by big-endian byte arrays which hold both signed * and unsigned arbitrary-precision integers. - * + * * @version 1.23 * @author David Brownell */ public final class BigInt { // Big endian -- MSB first. - private byte[] places; + private byte[] places; /** - * Constructs a "Big" integer from a set of (big-endian) bytes. - * Leading zeroes should be stripped off. - * - * @param data a sequence of bytes, most significant bytes/digits - * first. CONSUMED. + * Constructs a "Big" integer from a set of (big-endian) bytes. Leading + * zeroes should be stripped off. + * + * @param data a sequence of bytes, most significant bytes/digits first. + * CONSUMED. */ - public BigInt(byte[] data) { places = (byte[])data.clone(); } + public BigInt(byte[] data) { + places = (byte[]) data.clone(); + } /** - * Constructs a "Big" integer from a "BigInteger", which must be - * positive (or zero) in value. + * Constructs a "Big" integer from a "BigInteger", which must be positive + * (or zero) in value. */ public BigInt(BigInteger i) { - byte[] temp = i.toByteArray(); - - if ((temp [0] & 0x80) != 0) - throw new IllegalArgumentException ("negative BigInteger"); - - // XXX we assume exactly _one_ sign byte is used... - - if (temp [0] != 0) - places = temp; - else { - // Note that if i = new BigInteger("0"), - // i.toByteArray() contains only 1 zero. - if (temp.length == 1) { - places = new byte [1]; - places [0] = (byte) 0; - } else { - places = new byte [temp.length - 1]; - for (int j = 1; j < temp.length; j++) - places [j - 1] = temp [j]; - } - } + byte[] temp = i.toByteArray(); + + if ((temp[0] & 0x80) != 0) + throw new IllegalArgumentException("negative BigInteger"); + + // XXX we assume exactly _one_ sign byte is used... + + if (temp[0] != 0) + places = temp; + else { + // Note that if i = new BigInteger("0"), + // i.toByteArray() contains only 1 zero. + if (temp.length == 1) { + places = new byte[1]; + places[0] = (byte) 0; + } else { + places = new byte[temp.length - 1]; + for (int j = 1; j < temp.length; j++) + places[j - 1] = temp[j]; + } + } } /** * Constructs a "Big" integer from a normal Java integer. - * + * * @param i the java primitive integer */ public BigInt(int i) { - if (i < (1 << 8)) { - places = new byte [1]; - places [0] = (byte) i; - } else if (i < (1 << 16)) { - places = new byte [2]; - places[0] = (byte) (i >> 8); - places[1] = (byte) i; - } else if (i < (1 << 24)) { - places = new byte [3]; - places[0] = (byte) (i >> 16); - places [1] = (byte) (i >> 8); - places[2] = (byte) i; - } else { - places = new byte [4]; - places[0] = (byte) (i >> 24); - places[1] = (byte) (i >> 16); - places[2] = (byte) (i >> 8); - places[3] = (byte) i; - } + if (i < (1 << 8)) { + places = new byte[1]; + places[0] = (byte) i; + } else if (i < (1 << 16)) { + places = new byte[2]; + places[0] = (byte) (i >> 8); + places[1] = (byte) i; + } else if (i < (1 << 24)) { + places = new byte[3]; + places[0] = (byte) (i >> 16); + places[1] = (byte) (i >> 8); + places[2] = (byte) i; + } else { + places = new byte[4]; + places[0] = (byte) (i >> 24); + places[1] = (byte) (i >> 16); + places[2] = (byte) (i >> 8); + places[3] = (byte) i; + } } /** * Converts the "big" integer to a java primitive integer. - * + * * @exception NumberFormatException if 32 bits is insufficient. */ public int toInt() { - if (places.length > 4) - throw new NumberFormatException ("BigInt.toInt, too big"); - int retval = 0, i = 0; + if (places.length > 4) + throw new NumberFormatException("BigInt.toInt, too big"); + int retval = 0, i = 0; for (; i < places.length; i++) - retval = (retval << 8) + ((int)places[i] & 0xff); - return retval; + retval = (retval << 8) + ((int) places[i] & 0xff); + return retval; } /** - * Returns a hexadecimal printed representation. The value is - * formatted to fit on lines of at least 75 characters, with - * embedded newlines. Words are separated for readability, - * with eight words (32 bytes) per line. + * Returns a hexadecimal printed representation. The value is formatted to + * fit on lines of at least 75 characters, with embedded newlines. Words are + * separated for readability, with eight words (32 bytes) per line. */ - public String toString() { return hexify(); } + public String toString() { + return hexify(); + } /** - * Returns a BigInteger value which supports many arithmetic - * operations. Assumes negative values will never occur. + * Returns a BigInteger value which supports many arithmetic operations. + * Assumes negative values will never occur. */ - public BigInteger toBigInteger () - { return new BigInteger(1, places); } + public BigInteger toBigInteger() { + return new BigInteger(1, places); + } /** * Returns the length of the data as a byte array. */ - public int byteLength() { return places.length; } - + public int byteLength() { + return places.length; + } /** - * Returns the data as a byte array. The most significant bit - * of the array is bit zero (as in <code>java.math.BigInteger</code>). + * Returns the data as a byte array. The most significant bit of the array + * is bit zero (as in <code>java.math.BigInteger</code>). */ - public byte [] toByteArray () { + public byte[] toByteArray() { if (places.length == 0) { - byte zero[] = new byte [1]; - zero [0] = (byte) 0; - return zero; - } else { - return (byte [])places.clone(); - } + byte zero[] = new byte[1]; + zero[0] = (byte) 0; + return zero; + } else { + return (byte[]) places.clone(); + } } private static final String digits = "0123456789abcdef"; + private String hexify() { if (places.length == 0) return " 0 "; - StringBuffer buf = new StringBuffer (places.length * 2); - buf.append (" "); // four spaces - for (int i = 0; i < places.length; i++) { - buf.append (digits.charAt ((places [i] >> 4) & 0x0f)); - buf.append (digits.charAt (places [i] & 0x0f)); - if (((i + 1) % 32) == 0) { - if ((i + 1) != places.length) - buf.append ("\n "); // line after four words - } else if (((i + 1) % 4) == 0) - buf.append (' '); // space between words - } - return buf.toString (); + StringBuffer buf = new StringBuffer(places.length * 2); + buf.append(" "); // four spaces + for (int i = 0; i < places.length; i++) { + buf.append(digits.charAt((places[i] >> 4) & 0x0f)); + buf.append(digits.charAt(places[i] & 0x0f)); + if (((i + 1) % 32) == 0) { + if ((i + 1) != places.length) + buf.append("\n "); // line after four words + } else if (((i + 1) % 4) == 0) + buf.append(' '); // space between words + } + return buf.toString(); } /** - * Returns true iff the parameter is a numerically equivalent - * BigInt. - * + * Returns true iff the parameter is a numerically equivalent BigInt. + * * @param other the object being compared with this one. */ public boolean equals(Object other) { - if (other instanceof BigInt) - return equals ((BigInt) other); - return false; + if (other instanceof BigInt) + return equals((BigInt) other); + return false; } /** * Returns true iff the parameter is numerically equivalent. - * + * * @param other the BigInt being compared with this one. */ public boolean equals(BigInt other) { if (this == other) return true; - byte[] otherPlaces = other.toByteArray(); + byte[] otherPlaces = other.toByteArray(); if (places.length != otherPlaces.length) return false; for (int i = 0; i < places.length; i++) diff --git a/pki/base/util/src/netscape/security/util/BitArray.java b/pki/base/util/src/netscape/security/util/BitArray.java index 43af482d5..8a4ae43a6 100644 --- a/pki/base/util/src/netscape/security/util/BitArray.java +++ b/pki/base/util/src/netscape/security/util/BitArray.java @@ -21,7 +21,7 @@ import java.io.ByteArrayOutputStream; /** * A packed array of booleans. - * + * * @author Joshua Bloch * @author Douglas Hoover * @version 1.2 97/12/10 @@ -35,224 +35,219 @@ public class BitArray { private static final int BITS_PER_UNIT = 8; private static int subscript(int idx) { - return idx / BITS_PER_UNIT; + return idx / BITS_PER_UNIT; } private static int position(int idx) { // bits big-endian in each unit - return 1 << (BITS_PER_UNIT - 1 - (idx % BITS_PER_UNIT)); + return 1 << (BITS_PER_UNIT - 1 - (idx % BITS_PER_UNIT)); } /** * Creates a BitArray of the specified size, initialized to zeros. */ public BitArray(int length) throws IllegalArgumentException { - if (length < 0) { - throw new IllegalArgumentException("Negative length for BitArray"); - } + if (length < 0) { + throw new IllegalArgumentException("Negative length for BitArray"); + } - this.length = length; + this.length = length; - repn = new byte[(length + BITS_PER_UNIT - 1)/BITS_PER_UNIT]; + repn = new byte[(length + BITS_PER_UNIT - 1) / BITS_PER_UNIT]; } - /** - * Creates a BitArray of the specified size, initialized from the - * specified byte array. The most significant bit of a[0] gets - * index zero in the BitArray. The array a must be large enough - * to specify a value for every bit in the BitArray. In other words, - * 8*a.length >= length. + * Creates a BitArray of the specified size, initialized from the specified + * byte array. The most significant bit of a[0] gets index zero in the + * BitArray. The array a must be large enough to specify a value for every + * bit in the BitArray. In other words, 8*a.length >= length. */ public BitArray(int length, byte[] a) throws IllegalArgumentException { - - if (length < 0) { - throw new IllegalArgumentException("Negative length for BitArray"); - } - if (a.length * BITS_PER_UNIT < length) { - throw new IllegalArgumentException("Byte array too short to represent " + - "bit array of given length"); - } - - this.length = length; - - int repLength = ((length + BITS_PER_UNIT - 1)/BITS_PER_UNIT); - int unusedBits = repLength*BITS_PER_UNIT - length; - byte bitMask = (byte) (0xFF << unusedBits); - - /* - normalize the representation: - 1. discard extra bytes - 2. zero out extra bits in the last byte - */ - repn = new byte[repLength]; - System.arraycopy(a, 0, repn, 0, repLength); - if (repn.length > 0) - repn[repn.length -1] = (byte) (repn[repn.length -1] & bitMask); + + if (length < 0) { + throw new IllegalArgumentException("Negative length for BitArray"); + } + if (a.length * BITS_PER_UNIT < length) { + throw new IllegalArgumentException( + "Byte array too short to represent " + + "bit array of given length"); + } + + this.length = length; + + int repLength = ((length + BITS_PER_UNIT - 1) / BITS_PER_UNIT); + int unusedBits = repLength * BITS_PER_UNIT - length; + byte bitMask = (byte) (0xFF << unusedBits); + + /* + * normalize the representation: 1. discard extra bytes 2. zero out + * extra bits in the last byte + */ + repn = new byte[repLength]; + System.arraycopy(a, 0, repn, 0, repLength); + if (repn.length > 0) + repn[repn.length - 1] = (byte) (repn[repn.length - 1] & bitMask); } /** - * Create a BitArray whose bits are those of the given array - * of Booleans. + * Create a BitArray whose bits are those of the given array of Booleans. */ public BitArray(boolean[] bits) { - length = bits.length; - repn = new byte[(length + 7)/8]; + length = bits.length; + repn = new byte[(length + 7) / 8]; - for (int i=0; i < length; i++) { - set(i, bits[i]); - } + for (int i = 0; i < length; i++) { + set(i, bits[i]); + } } - - + /** - * Copy constructor (for cloning). + * Copy constructor (for cloning). */ private BitArray(BitArray ba) { - length = ba.length; - repn = (byte[]) ba.repn.clone(); + length = ba.length; + repn = (byte[]) ba.repn.clone(); } /** - * Returns the indexed bit in this BitArray. + * Returns the indexed bit in this BitArray. */ public boolean get(int index) throws ArrayIndexOutOfBoundsException { - if (index < 0 || index >= length) { - throw new ArrayIndexOutOfBoundsException(Integer.toString(index)); - } - - return (repn[subscript(index)] & position(index)) != 0; + if (index < 0 || index >= length) { + throw new ArrayIndexOutOfBoundsException(Integer.toString(index)); + } + + return (repn[subscript(index)] & position(index)) != 0; } /** - * Sets the indexed bit in this BitArray. + * Sets the indexed bit in this BitArray. */ public void set(int index, boolean value) - throws ArrayIndexOutOfBoundsException { - if (index < 0 || index >= length) { - throw new ArrayIndexOutOfBoundsException(Integer.toString(index)); - } - int idx = subscript(index); - int bit = position(index); - - if (value) { - repn[idx] |= bit; - } else { - repn[idx] &= ~bit; - } + throws ArrayIndexOutOfBoundsException { + if (index < 0 || index >= length) { + throw new ArrayIndexOutOfBoundsException(Integer.toString(index)); + } + int idx = subscript(index); + int bit = position(index); + + if (value) { + repn[idx] |= bit; + } else { + repn[idx] &= ~bit; + } } /** * Returns the length of this BitArray. */ public int length() { - return length; + return length; } /** - * Returns a Byte array containing the contents of this BitArray. - * The bit stored at index zero in this BitArray will be copied - * into the most significant bit of the zeroth element of the - * returned byte array. The last byte of the returned byte array - * will be contain zeros in any bits that do not have corresponding - * bits in the BitArray. (This matters only if the BitArray's size - * is not a multiple of 8.) - */ + * Returns a Byte array containing the contents of this BitArray. The bit + * stored at index zero in this BitArray will be copied into the most + * significant bit of the zeroth element of the returned byte array. The + * last byte of the returned byte array will be contain zeros in any bits + * that do not have corresponding bits in the BitArray. (This matters only + * if the BitArray's size is not a multiple of 8.) + */ public byte[] toByteArray() { - return (byte[]) repn.clone(); + return (byte[]) repn.clone(); } public boolean equals(Object obj) { - if (obj == this) return true; - if (obj == null || !(obj instanceof BitArray)) return false; - - BitArray ba = (BitArray) obj; - - if (ba.length != length) return false; - - for (int i = 0; i < repn.length; i += 1) { - if (repn[i] != ba.repn[i]) return false; - } - return true; + if (obj == this) + return true; + if (obj == null || !(obj instanceof BitArray)) + return false; + + BitArray ba = (BitArray) obj; + + if (ba.length != length) + return false; + + for (int i = 0; i < repn.length; i += 1) { + if (repn[i] != ba.repn[i]) + return false; + } + return true; } /** * Return a boolean array with the same bit values a this BitArray. */ public boolean[] toBooleanArray() { - boolean[] bits = new boolean[length]; + boolean[] bits = new boolean[length]; - for (int i=0; i < length; i++) { - bits[i] = get(i); - } - return bits; + for (int i = 0; i < length; i++) { + bits[i] = get(i); + } + return bits; } /** * Returns a hash code value for this bit array. - * - * @return a hash code value for this bit array. + * + * @return a hash code value for this bit array. */ public int hashCode() { - int hashCode = 0; + int hashCode = 0; - for (int i = 0; i < repn.length; i++) - hashCode = 31*hashCode + repn[i]; + for (int i = 0; i < repn.length; i++) + hashCode = 31 * hashCode + repn[i]; - return hashCode ^ length; + return hashCode ^ length; } - public Object clone() { - return new BitArray(this); + return new BitArray(this); } - private static final byte[][] NYBBLE = { - { (byte)'0',(byte)'0',(byte)'0',(byte)'0'}, - { (byte)'0',(byte)'0',(byte)'0',(byte)'1'}, - { (byte)'0',(byte)'0',(byte)'1',(byte)'0'}, - { (byte)'0',(byte)'0',(byte)'1',(byte)'1'}, - { (byte)'0',(byte)'1',(byte)'0',(byte)'0'}, - { (byte)'0',(byte)'1',(byte)'0',(byte)'1'}, - { (byte)'0',(byte)'1',(byte)'1',(byte)'0'}, - { (byte)'0',(byte)'1',(byte)'1',(byte)'1'}, - { (byte)'1',(byte)'0',(byte)'0',(byte)'0'}, - { (byte)'1',(byte)'0',(byte)'0',(byte)'1'}, - { (byte)'1',(byte)'0',(byte)'1',(byte)'0'}, - { (byte)'1',(byte)'0',(byte)'1',(byte)'1'}, - { (byte)'1',(byte)'1',(byte)'0',(byte)'0'}, - { (byte)'1',(byte)'1',(byte)'0',(byte)'1'}, - { (byte)'1',(byte)'1',(byte)'1',(byte)'0'}, - { (byte)'1',(byte)'1',(byte)'1',(byte)'1'} - }; + { (byte) '0', (byte) '0', (byte) '0', (byte) '0' }, + { (byte) '0', (byte) '0', (byte) '0', (byte) '1' }, + { (byte) '0', (byte) '0', (byte) '1', (byte) '0' }, + { (byte) '0', (byte) '0', (byte) '1', (byte) '1' }, + { (byte) '0', (byte) '1', (byte) '0', (byte) '0' }, + { (byte) '0', (byte) '1', (byte) '0', (byte) '1' }, + { (byte) '0', (byte) '1', (byte) '1', (byte) '0' }, + { (byte) '0', (byte) '1', (byte) '1', (byte) '1' }, + { (byte) '1', (byte) '0', (byte) '0', (byte) '0' }, + { (byte) '1', (byte) '0', (byte) '0', (byte) '1' }, + { (byte) '1', (byte) '0', (byte) '1', (byte) '0' }, + { (byte) '1', (byte) '0', (byte) '1', (byte) '1' }, + { (byte) '1', (byte) '1', (byte) '0', (byte) '0' }, + { (byte) '1', (byte) '1', (byte) '0', (byte) '1' }, + { (byte) '1', (byte) '1', (byte) '1', (byte) '0' }, + { (byte) '1', (byte) '1', (byte) '1', (byte) '1' } }; private static final int BYTES_PER_LINE = 8; /** - * Returns a string representation of this BitArray. + * Returns a string representation of this BitArray. */ public String toString() { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - - for (int i = 0; i < repn.length - 1; i++) { - out.write(NYBBLE[(repn[i] >> 4) & 0x0F], 0, 4); - out.write(NYBBLE[repn[i] & 0x0F], 0, 4); - - if (i % BYTES_PER_LINE == BYTES_PER_LINE - 1) { - out.write('\n'); - } else { - out.write(' '); - } - } - - // in last byte of repn, use only the valid bits - for (int i = BITS_PER_UNIT * (repn.length - 1); i < length; i++) { - out.write(get(i) ? '1' : '0'); - } - - return new String(out.toByteArray()); - + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + for (int i = 0; i < repn.length - 1; i++) { + out.write(NYBBLE[(repn[i] >> 4) & 0x0F], 0, 4); + out.write(NYBBLE[repn[i] & 0x0F], 0, 4); + + if (i % BYTES_PER_LINE == BYTES_PER_LINE - 1) { + out.write('\n'); + } else { + out.write(' '); + } + } + + // in last byte of repn, use only the valid bits + for (int i = BITS_PER_UNIT * (repn.length - 1); i < length; i++) { + out.write(get(i) ? '1' : '0'); + } + + return new String(out.toByteArray()); + } - -} +} diff --git a/pki/base/util/src/netscape/security/util/ByteArrayLexOrder.java b/pki/base/util/src/netscape/security/util/ByteArrayLexOrder.java index 60aede101..9621deee0 100644 --- a/pki/base/util/src/netscape/security/util/ByteArrayLexOrder.java +++ b/pki/base/util/src/netscape/security/util/ByteArrayLexOrder.java @@ -21,43 +21,41 @@ import java.util.Comparator; /** * Compare two byte arrays in lexicographical order. - * + * * @version 1.4 97/12/10 * @author D. N. Hoover */ public class ByteArrayLexOrder implements Comparator { /** - * Perform lexicographical comparison of two byte arrays, - * regarding each byte as unsigned. That is, compare array entries - * in order until they differ--the array with the smaller entry - * is "smaller". If array entries are - * equal till one array ends, then the longer array is "bigger". - * - * @param obj1 first byte array to compare. - * @param obj2 second byte array to compare. - * @return negative number if obj1 < obj2, 0 if obj1 == obj2, - * positive number if obj1 > obj2. - * - * @exception <code>ClassCastException</code> - * if either argument is not a byte array. + * Perform lexicographical comparison of two byte arrays, regarding each + * byte as unsigned. That is, compare array entries in order until they + * differ--the array with the smaller entry is "smaller". If array entries + * are equal till one array ends, then the longer array is "bigger". + * + * @param obj1 first byte array to compare. + * @param obj2 second byte array to compare. + * @return negative number if obj1 < obj2, 0 if obj1 == obj2, positive + * number if obj1 > obj2. + * + * @exception <code>ClassCastException</code> if either argument is not a + * byte array. */ public final int compare(Object obj1, Object obj2) { - byte[] bytes1 = (byte[]) obj1; - byte[] bytes2 = (byte[]) obj2; + byte[] bytes1 = (byte[]) obj1; + byte[] bytes2 = (byte[]) obj2; - int diff; - for (int i = 0; i < bytes1.length && i < bytes2.length; i++) { - diff = (bytes1[i] & 0xFF) - (bytes2[i] & 0xFF); - if (diff != 0) { - return diff; - } - } - // if array entries are equal till the first ends, then the - // longer is "bigger" - return bytes1.length - bytes2.length; + int diff; + for (int i = 0; i < bytes1.length && i < bytes2.length; i++) { + diff = (bytes1[i] & 0xFF) - (bytes2[i] & 0xFF); + if (diff != 0) { + return diff; + } + } + // if array entries are equal till the first ends, then the + // longer is "bigger" + return bytes1.length - bytes2.length; } - } diff --git a/pki/base/util/src/netscape/security/util/ByteArrayTagOrder.java b/pki/base/util/src/netscape/security/util/ByteArrayTagOrder.java index 81f437476..81235d00a 100644 --- a/pki/base/util/src/netscape/security/util/ByteArrayTagOrder.java +++ b/pki/base/util/src/netscape/security/util/ByteArrayTagOrder.java @@ -22,28 +22,27 @@ import java.util.Comparator; public class ByteArrayTagOrder implements Comparator { /** - * Compare two byte arrays, by the order of their tags, - * as defined in ITU-T X.680, sec. 6.4. (First compare - * tag classes, then tag numbers, ignoring the constructivity bit.) - * - * @param obj1 first byte array to compare. - * @param obj2 second byte array to compare. - * @return negative number if obj1 < obj2, 0 if obj1 == obj2, - * positive number if obj1 > obj2. - * - * @exception <code>ClassCastException</code> - * if either argument is not a byte array. + * Compare two byte arrays, by the order of their tags, as defined in ITU-T + * X.680, sec. 6.4. (First compare tag classes, then tag numbers, ignoring + * the constructivity bit.) + * + * @param obj1 first byte array to compare. + * @param obj2 second byte array to compare. + * @return negative number if obj1 < obj2, 0 if obj1 == obj2, positive + * number if obj1 > obj2. + * + * @exception <code>ClassCastException</code> if either argument is not a + * byte array. */ public final int compare(Object obj1, Object obj2) { - byte[] bytes1 = (byte[]) obj1; - byte[] bytes2 = (byte[]) obj2; + byte[] bytes1 = (byte[]) obj1; + byte[] bytes2 = (byte[]) obj2; - // tag order is same as byte order ignoring any difference in - // the constructivity bit (0x02) - return (bytes1[0] | 0x20) - (bytes2[0] | 0x20); + // tag order is same as byte order ignoring any difference in + // the constructivity bit (0x02) + return (bytes1[0] | 0x20) - (bytes2[0] | 0x20); } - } diff --git a/pki/base/util/src/netscape/security/util/ByteToCharIA5String.java b/pki/base/util/src/netscape/security/util/ByteToCharIA5String.java index 69fab22a7..7ec3b4d2c 100644 --- a/pki/base/util/src/netscape/security/util/ByteToCharIA5String.java +++ b/pki/base/util/src/netscape/security/util/ByteToCharIA5String.java @@ -22,48 +22,45 @@ import sun.io.ConversionBufferFullException; import sun.io.UnknownCharacterException; /** - * Converts bytes in ASN.1 IA5String character set to unicode - * characters. - * + * Converts bytes in ASN.1 IA5String character set to unicode characters. + * * @author Lily Hsiao * @author Slava Galperin */ -public class ByteToCharIA5String extends ByteToCharConverter -{ +public class ByteToCharIA5String extends ByteToCharConverter { public String getCharacterEncoding() { - return "ASN.1 IA5String"; + return "ASN.1 IA5String"; } - public int convert(byte[] input, int inStart, int inEnd, - char[] output, int outStart, int outEnd) - throws ConversionBufferFullException, - UnknownCharacterException - { - int j = outStart; - for (int i = inStart; i < inEnd; i++, j++) { - if (j >= outEnd) { - byteOff = i; - charOff = j; - throw new ConversionBufferFullException(); - } - if (!subMode && (input[i] & 0x80) != 0) { - byteOff = i; - charOff = j; - badInputLength = 1; - throw new UnknownCharacterException(); - } - output[j] = (char) (input[i] & 0x7f); - } - byteOff = inEnd; - charOff = j; - return j - outStart; + public int convert(byte[] input, int inStart, int inEnd, char[] output, + int outStart, int outEnd) throws ConversionBufferFullException, + UnknownCharacterException { + int j = outStart; + for (int i = inStart; i < inEnd; i++, j++) { + if (j >= outEnd) { + byteOff = i; + charOff = j; + throw new ConversionBufferFullException(); + } + if (!subMode && (input[i] & 0x80) != 0) { + byteOff = i; + charOff = j; + badInputLength = 1; + throw new UnknownCharacterException(); + } + output[j] = (char) (input[i] & 0x7f); + } + byteOff = inEnd; + charOff = j; + return j - outStart; } public int flush(char[] output, int outStart, int outEnd) { - return 0; + return 0; } - public void reset() { } + public void reset() { + } } diff --git a/pki/base/util/src/netscape/security/util/ByteToCharPrintable.java b/pki/base/util/src/netscape/security/util/ByteToCharPrintable.java index 0607ad2e8..6a7d41496 100644 --- a/pki/base/util/src/netscape/security/util/ByteToCharPrintable.java +++ b/pki/base/util/src/netscape/security/util/ByteToCharPrintable.java @@ -23,66 +23,58 @@ import sun.io.MalformedInputException; import sun.io.UnknownCharacterException; /** - * Converts bytes in ASN.1 Printable String character set to unicode - * characters. - * + * Converts bytes in ASN.1 Printable String character set to unicode characters. + * * @author Lily Hsiao * @author Slava Galperin */ -public class ByteToCharPrintable extends ByteToCharConverter -{ +public class ByteToCharPrintable extends ByteToCharConverter { - public String getCharacterEncoding() - { - return "ASN.1 Printable"; + public String getCharacterEncoding() { + return "ASN.1 Printable"; } - public int convert(byte[] input, int inStart, int inEnd, - char[] output, int outStart, int outEnd) - throws MalformedInputException, - UnknownCharacterException, - ConversionBufferFullException - { - int j = outStart; - boolean hasNonPrintableChar = false; + public int convert(byte[] input, int inStart, int inEnd, char[] output, + int outStart, int outEnd) throws MalformedInputException, + UnknownCharacterException, ConversionBufferFullException { + int j = outStart; + boolean hasNonPrintableChar = false; - for (int i = inStart; i < inEnd; i++, j++) { - if (j >= outEnd) { - byteOff = i; - charOff = j; - throw new ConversionBufferFullException(); - } - if (!subMode && - !CharToBytePrintable.isPrintableChar((char) (input[i] & 0x7f))) { - /* "bug" fix for 359010 - byteOff = i; - charOff = j; - badInputLength = 1; - throw new UnknownCharacterException(); - */ - j--; - hasNonPrintableChar = true; - } else - output[j] = (char) (input[i] & 0x7f); - } + for (int i = inStart; i < inEnd; i++, j++) { + if (j >= outEnd) { + byteOff = i; + charOff = j; + throw new ConversionBufferFullException(); + } + if (!subMode + && !CharToBytePrintable + .isPrintableChar((char) (input[i] & 0x7f))) { + /* + * "bug" fix for 359010 byteOff = i; charOff = j; badInputLength + * = 1; throw new UnknownCharacterException(); + */ + j--; + hasNonPrintableChar = true; + } else + output[j] = (char) (input[i] & 0x7f); + } - if (hasNonPrintableChar == true) { - // - } + if (hasNonPrintableChar == true) { + // + } - byteOff = inEnd; - charOff = j; - return j - outStart; + byteOff = inEnd; + charOff = j; + return j - outStart; } - public int flush( char[] output, int outStart, int outEnd ) - throws MalformedInputException, ConversionBufferFullException - { - return 0; + public int flush(char[] output, int outStart, int outEnd) + throws MalformedInputException, ConversionBufferFullException { + return 0; } - public void reset() { } - + public void reset() { + } } diff --git a/pki/base/util/src/netscape/security/util/ByteToCharUnicode.java b/pki/base/util/src/netscape/security/util/ByteToCharUnicode.java index 312b8a22b..7b2a8e6a6 100644 --- a/pki/base/util/src/netscape/security/util/ByteToCharUnicode.java +++ b/pki/base/util/src/netscape/security/util/ByteToCharUnicode.java @@ -16,6 +16,7 @@ // All rights reserved. // --- END COPYRIGHT BLOCK --- package netscape.security.util; + import sun.io.ByteToCharUnicodeBig; import sun.io.ByteToCharUnicodeLittle; import sun.io.ConversionBufferFullException; @@ -23,22 +24,21 @@ import sun.io.MalformedInputException; /** * Convert byte arrays containing Unicode characters into arrays of actual - * Unicode characters, sensing the byte order automatically. To force a + * Unicode characters, sensing the byte order automatically. To force a * particular byte order, use either the "UnicodeBig" or the "UnicodeLittle" * encoding. - * + * * If the first character is a byte order mark, it will be interpreted and - * discarded. Otherwise, the byte order is assumed to be BigEndian. - * Either way, the byte order is decided by the first character. Later - * byte order marks will be passed through as characters (if they indicate - * the same byte order) or will cause an error (if they indicate the other - * byte order). - * + * discarded. Otherwise, the byte order is assumed to be BigEndian. Either way, + * the byte order is decided by the first character. Later byte order marks will + * be passed through as characters (if they indicate the same byte order) or + * will cause an error (if they indicate the other byte order). + * * @see ByteToCharUnicodeLittle * @see ByteToCharUnicodeBig - * - * @version 1.3, 96/11/23 - * @author Mark Reinhold + * + * @version 1.3, 96/11/23 + * @author Mark Reinhold */ public class ByteToCharUnicode extends sun.io.ByteToCharConverter { @@ -53,135 +53,131 @@ public class ByteToCharUnicode extends sun.io.ByteToCharConverter { int byteOrder; public ByteToCharUnicode() { - byteOrder = AUTO; + byteOrder = AUTO; } public String getCharacterEncoding() { - switch (byteOrder) { - case BIG: return "UnicodeBig"; - case LITTLE: return "UnicodeLittle"; - default: return "Unicode"; - } + switch (byteOrder) { + case BIG: + return "UnicodeBig"; + case LITTLE: + return "UnicodeLittle"; + default: + return "Unicode"; + } } boolean started = false; int leftOverByte; boolean leftOver = false; - public int convert(byte[] in, int inOff, int inEnd, - char[] out, int outOff, int outEnd) - throws ConversionBufferFullException, MalformedInputException - { - byteOff = inOff; - charOff = outOff; - - if (inOff >= inEnd) - return 0; - - int b1, b2; - int bc = 0; - int inI = inOff, outI = outOff; - - if (leftOver) { - b1 = leftOverByte & 0xff; - leftOver = false; - } - else - b1 = in[inI++] & 0xff; - bc = 1; - - if (!started) { /* Read possible initial byte-order mark */ - if (inI < inEnd) { - b2 = in[inI++] & 0xff; - bc = 2; - - char c = (char) ((b1 << 8) | b2); - int bo = AUTO; - - if (c == BYTE_ORDER_MARK) - bo = BIG; - else if (c == REVERSED_MARK) - bo = LITTLE; - - if (byteOrder == AUTO) { - if (bo == AUTO) { + public int convert(byte[] in, int inOff, int inEnd, char[] out, int outOff, + int outEnd) throws ConversionBufferFullException, + MalformedInputException { + byteOff = inOff; + charOff = outOff; + + if (inOff >= inEnd) + return 0; + + int b1, b2; + int bc = 0; + int inI = inOff, outI = outOff; + + if (leftOver) { + b1 = leftOverByte & 0xff; + leftOver = false; + } else + b1 = in[inI++] & 0xff; + bc = 1; + + if (!started) { /* Read possible initial byte-order mark */ + if (inI < inEnd) { + b2 = in[inI++] & 0xff; + bc = 2; + + char c = (char) ((b1 << 8) | b2); + int bo = AUTO; + + if (c == BYTE_ORDER_MARK) + bo = BIG; + else if (c == REVERSED_MARK) + bo = LITTLE; + + if (byteOrder == AUTO) { + if (bo == AUTO) { bo = BIG; // BigEndian by default - } - byteOrder = bo; - if (inI < inEnd) { - b1 = in[inI++] & 0xff; - bc = 1; - } - } - else if (bo == AUTO) { - inI--; - bc = 1; - } - else if (byteOrder == bo) { - if (inI < inEnd) { - b1 = in[inI++] & 0xff; - bc = 1; - } - } - else { - badInputLength = bc; - throw new - MalformedInputException("Incorrect byte-order mark"); - } - - started = true; - } - } - - /* Loop invariant: (b1 contains the next input byte) && (bc == 1) */ - while (inI < inEnd) { - b2 = in[inI++] & 0xff; - bc = 2; - - char c; - if (byteOrder == BIG) - c = (char) ((b1 << 8) | b2); - else - c = (char) ((b2 << 8) | b1); - - if (c == REVERSED_MARK) - throw new - MalformedInputException("Reversed byte-order mark"); - - if (outI >= outEnd) - throw new ConversionBufferFullException(); - out[outI++] = c; - byteOff = inI; - charOff = outI; - - if (inI < inEnd) { - b1 = in[inI++] & 0xff; - bc = 1; - } - } - - if (bc == 1) { - leftOverByte = b1; - leftOver = true; - } - - return outI - outOff; + } + byteOrder = bo; + if (inI < inEnd) { + b1 = in[inI++] & 0xff; + bc = 1; + } + } else if (bo == AUTO) { + inI--; + bc = 1; + } else if (byteOrder == bo) { + if (inI < inEnd) { + b1 = in[inI++] & 0xff; + bc = 1; + } + } else { + badInputLength = bc; + throw new MalformedInputException( + "Incorrect byte-order mark"); + } + + started = true; + } + } + + /* Loop invariant: (b1 contains the next input byte) && (bc == 1) */ + while (inI < inEnd) { + b2 = in[inI++] & 0xff; + bc = 2; + + char c; + if (byteOrder == BIG) + c = (char) ((b1 << 8) | b2); + else + c = (char) ((b2 << 8) | b1); + + if (c == REVERSED_MARK) + throw new MalformedInputException("Reversed byte-order mark"); + + if (outI >= outEnd) + throw new ConversionBufferFullException(); + out[outI++] = c; + byteOff = inI; + charOff = outI; + + if (inI < inEnd) { + b1 = in[inI++] & 0xff; + bc = 1; + } + } + + if (bc == 1) { + leftOverByte = b1; + leftOver = true; + } + + return outI - outOff; } public void reset() { - leftOver = false; - byteOff = charOff = 0; + leftOver = false; + byteOff = charOff = 0; } public int flush(char buf[], int off, int len) - throws MalformedInputException - { - if (leftOver) { - reset(); - throw new MalformedInputException(); - } - byteOff = charOff = 0; - return 0; + throws MalformedInputException { + if (leftOver) { + reset(); + throw new MalformedInputException(); + } + byteOff = charOff = 0; + return 0; } } diff --git a/pki/base/util/src/netscape/security/util/ByteToCharUniversalString.java b/pki/base/util/src/netscape/security/util/ByteToCharUniversalString.java index 77165b7fe..de99a2ec4 100644 --- a/pki/base/util/src/netscape/security/util/ByteToCharUniversalString.java +++ b/pki/base/util/src/netscape/security/util/ByteToCharUniversalString.java @@ -22,78 +22,73 @@ import sun.io.ConversionBufferFullException; import sun.io.UnknownCharacterException; /** - * Converts bytes in ASN.1 UniversalString character set to unicode - * characters. - * + * Converts bytes in ASN.1 UniversalString character set to unicode characters. + * * @author Lily Hsiao * @author Slava Galperin */ -public class ByteToCharUniversalString extends ByteToCharConverter -{ +public class ByteToCharUniversalString extends ByteToCharConverter { public String getCharacterEncoding() { - return "ASN.1 UniversalString"; + return "ASN.1 UniversalString"; } - public int convert(byte[] input, int inStart, int inEnd, - char[] output, int outStart, int outEnd) - throws ConversionBufferFullException, - UnknownCharacterException - { - int j = outStart; + public int convert(byte[] input, int inStart, int inEnd, char[] output, + int outStart, int outEnd) throws ConversionBufferFullException, + UnknownCharacterException { + int j = outStart; + int i = inStart; + while (i < inEnd) { + // XXX we do not know what to do with truly UCS-4 characters here + // we also assumed network byte order - int i = inStart; - while(i < inEnd) { - // XXX we do not know what to do with truly UCS-4 characters here - // we also assumed network byte order + if (i + 3 >= inEnd + || (!((input[i] == 0 && input[i + 1] == 0) || (input[i + 2] == 0 && input[i + 3] == 0)))) { + byteOff = i; + charOff = j; + throw new UnknownCharacterException(); + } + if (input[i + 2] == 0 && input[i + 3] == 0) { + // Try to be a bit forgiving. If the byte order is + // reversed, we still try handle it. - if ( i+3 >= inEnd || - (!((input[i] == 0 && input[i+1] == 0) || - (input[i+2] == 0 && input[i+3] == 0)))) { - byteOff = i; - charOff = j; - throw new UnknownCharacterException(); - } - if (input[i+2] == 0 && input[i+3] == 0) { - // Try to be a bit forgiving. If the byte order is - // reversed, we still try handle it. + // Sample Date Set (1): + // 0000000 f 0 \0 \0 213 0 \0 \0 S 0 \0 \0 + // 0000014 - // Sample Date Set (1): - // 0000000 f 0 \0 \0 213 0 \0 \0 S 0 \0 \0 - // 0000014 + // Sample Date Set (2): + // 0000000 w \0 \0 \0 w \0 \0 \0 w \0 \0 \0 . \0 \0 \0 + // 0000020 ( \0 \0 \0 t \0 \0 \0 o \0 \0 \0 b \0 \0 \0 + // 0000040 e \0 \0 \0 | \0 \0 \0 n \0 \0 \0 o \0 \0 \0 + // 0000060 t \0 \0 \0 t \0 \0 \0 o \0 \0 \0 b \0 \0 \0 + // 0000100 e \0 \0 \0 ) \0 \0 \0 . \0 \0 \0 c \0 \0 \0 + // 0000120 o \0 \0 \0 m \0 \0 \0 + // 0000130 + output[j] = (char) (((input[i + 1] << 8) & 0xff00) + (input[i] & 0x00ff)); + } else { + // This should be the right order. + // + // 0000000 0000 00c4 0000 0064 0000 006d 0000 0069 + // 0000020 0000 006e 0000 0020 0000 0051 0000 0041 + // 0000040 - // Sample Date Set (2): - // 0000000 w \0 \0 \0 w \0 \0 \0 w \0 \0 \0 . \0 \0 \0 - // 0000020 ( \0 \0 \0 t \0 \0 \0 o \0 \0 \0 b \0 \0 \0 - // 0000040 e \0 \0 \0 | \0 \0 \0 n \0 \0 \0 o \0 \0 \0 - // 0000060 t \0 \0 \0 t \0 \0 \0 o \0 \0 \0 b \0 \0 \0 - // 0000100 e \0 \0 \0 ) \0 \0 \0 . \0 \0 \0 c \0 \0 \0 - // 0000120 o \0 \0 \0 m \0 \0 \0 - // 0000130 - output[j] = (char)(((input[i+1] << 8)& 0xff00) + (input[i] & 0x00ff)); - } else { - // This should be the right order. - // - // 0000000 0000 00c4 0000 0064 0000 006d 0000 0069 - // 0000020 0000 006e 0000 0020 0000 0051 0000 0041 - // 0000040 - - // (input[i] == 0 && input[i+1] == 0) - output[j] = (char)(((input[i+2] << 8)& 0xff00) + (input[i+3] & 0x00ff)); - } - j++; - i += 4; - } - byteOff = inEnd; - charOff = j; - return j - outStart; + // (input[i] == 0 && input[i+1] == 0) + output[j] = (char) (((input[i + 2] << 8) & 0xff00) + (input[i + 3] & 0x00ff)); + } + j++; + i += 4; + } + byteOff = inEnd; + charOff = j; + return j - outStart; } public int flush(char[] output, int outStart, int outEnd) { - return 0; + return 0; } - public void reset() { } + public void reset() { + } } diff --git a/pki/base/util/src/netscape/security/util/CertPrettyPrint.java b/pki/base/util/src/netscape/security/util/CertPrettyPrint.java index caf7e6481..cd103d307 100644 --- a/pki/base/util/src/netscape/security/util/CertPrettyPrint.java +++ b/pki/base/util/src/netscape/security/util/CertPrettyPrint.java @@ -17,7 +17,6 @@ // --- END COPYRIGHT BLOCK --- package netscape.security.util; - import java.security.MessageDigest; import java.security.PublicKey; import java.security.cert.Certificate; @@ -38,54 +37,55 @@ import org.mozilla.jss.asn1.SET; import org.mozilla.jss.pkcs7.ContentInfo; import org.mozilla.jss.pkcs7.SignedData; - /** - * This class will display the certificate content in predefined - * format. - * + * This class will display the certificate content in predefined format. + * * @author Jack Pan-Chen * @version $Revision$, $Date$ */ -public class CertPrettyPrint -{ +public class CertPrettyPrint { - /*========================================================== - * constants - *==========================================================*/ + /* + * ========================================================== constants + * ========================================================== + */ private final static String CUSTOM_LOCALE = "Custom"; - /*========================================================== - * variables - *==========================================================*/ + /* + * ========================================================== variables + * ========================================================== + */ private X509CertImpl mX509Cert = null; private Certificate mCert = null; private PrettyPrintFormat pp = null; private byte[] mCert_b = null; - /*========================================================== - * constructors - *==========================================================*/ + /* + * ========================================================== constructors + * ========================================================== + */ public CertPrettyPrint(Certificate cert) { if (cert instanceof X509CertImpl) mX509Cert = (X509CertImpl) cert; - + pp = new PrettyPrintFormat(":"); } - + public CertPrettyPrint(byte[] certb) { mCert_b = certb; pp = new PrettyPrintFormat(":"); } - /*========================================================== - * public methods - *==========================================================*/ + /* + * ========================================================== public methods + * ========================================================== + */ /** - * This method return string representation of the certificate - * in predefined format using specified client local. I18N Support. - * + * This method return string representation of the certificate in predefined + * format using specified client local. I18N Support. + * * @param clientLocale Locale to be used for localization * @return string representation of the certificate */ @@ -93,25 +93,25 @@ public class CertPrettyPrint if (mX509Cert != null) return X509toString(clientLocale); - else if (mCert_b != null) + else if (mCert_b != null) return pkcs7toString(clientLocale); else return null; } - + public String pkcs7toString(Locale clientLocale) { String content = ""; try { mX509Cert = new X509CertImpl(mCert_b); return toString(clientLocale); - } catch (Exception e) { + } catch (Exception e) { } ContentInfo ci = null; try { - ci = (ContentInfo) - ASN1Util.decode(ContentInfo.getTemplate(), mCert_b); + ci = (ContentInfo) ASN1Util.decode(ContentInfo.getTemplate(), + mCert_b); } catch (Exception e) { return ""; } @@ -128,11 +128,11 @@ public class CertPrettyPrint SET certs = sd.getCertificates(); for (int i = 0; i < certs.size(); i++) { - org.mozilla.jss.pkix.cert.Certificate cert = (org.mozilla.jss.pkix.cert.Certificate) certs.elementAt(i); + org.mozilla.jss.pkix.cert.Certificate cert = (org.mozilla.jss.pkix.cert.Certificate) certs + .elementAt(i); X509CertImpl certImpl = null; try { - certImpl = new X509CertImpl( - ASN1Util.encode(cert)); + certImpl = new X509CertImpl(ASN1Util.encode(cert)); } catch (Exception e) { } @@ -150,17 +150,17 @@ public class CertPrettyPrint public String stripCertBrackets(String s) { if (s == null) { - return s; - } + return s; + } - if ((s.startsWith("-----BEGIN CERTIFICATE-----")) && - (s.endsWith("-----END CERTIFICATE-----"))) { + if ((s.startsWith("-----BEGIN CERTIFICATE-----")) + && (s.endsWith("-----END CERTIFICATE-----"))) { return (s.substring(27, (s.length() - 25))); } // To support Thawte's header and footer - if ((s.startsWith("-----BEGIN PKCS #7 SIGNED DATA-----")) && - (s.endsWith("-----END PKCS #7 SIGNED DATA-----"))) { + if ((s.startsWith("-----BEGIN PKCS #7 SIGNED DATA-----")) + && (s.endsWith("-----END PKCS #7 SIGNED DATA-----"))) { return (s.substring(35, (s.length() - 33))); } @@ -187,23 +187,24 @@ public class CertPrettyPrint public String X509toString(Locale clientLocale) { - //get I18N resources - ResourceBundle resource = ResourceBundle.getBundle( - PrettyPrintResources.class.getName()); + // get I18N resources + ResourceBundle resource = ResourceBundle + .getBundle(PrettyPrintResources.class.getName()); DateFormat dateFormater = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL, clientLocale); - //get timezone and timezone ID + // get timezone and timezone ID String tz = " "; String tzid = " "; - + StringBuffer sb = new StringBuffer(); try { - X509CertInfo info = (X509CertInfo) mX509Cert.get( - X509CertImpl.NAME + "." + X509CertImpl.INFO); - String serial2 = mX509Cert.getSerialNumber().toString(16).toUpperCase(); + X509CertInfo info = (X509CertInfo) mX509Cert.get(X509CertImpl.NAME + + "." + X509CertImpl.INFO); + String serial2 = mX509Cert.getSerialNumber().toString(16) + .toUpperCase(); - //get correct instance of key + // get correct instance of key PublicKey pKey = mX509Cert.getPublicKey(); X509Key key = null; @@ -216,95 +217,98 @@ public class CertPrettyPrint key = (X509Key) pKey; } - //take care of spki - sb.append(pp.indent(4) + resource.getString( - PrettyPrintResources.TOKEN_CERTIFICATE) + "\n"); - sb.append(pp.indent(8) + resource.getString( - PrettyPrintResources.TOKEN_DATA) + "\n"); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_VERSION) + " v"); + // take care of spki + sb.append(pp.indent(4) + + resource + .getString(PrettyPrintResources.TOKEN_CERTIFICATE) + + "\n"); + sb.append(pp.indent(8) + + resource.getString(PrettyPrintResources.TOKEN_DATA) + + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_VERSION) + + " v"); sb.append((mX509Cert.getVersion() + 1) + "\n"); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_SERIAL) + "0x" + serial2 + "\n"); - //XXX I18N Algorithm Name ? - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_SIGALG) + mX509Cert.getSigAlgName() + - " - " + mX509Cert.getSigAlgOID() + "\n"); - //XXX I18N IssuerDN ? - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_ISSUER) + - mX509Cert.getIssuerDN().toString() + "\n"); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_VALIDITY) + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_SERIAL) + + "0x" + serial2 + "\n"); + // XXX I18N Algorithm Name ? + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_SIGALG) + + mX509Cert.getSigAlgName() + " - " + + mX509Cert.getSigAlgOID() + "\n"); + // XXX I18N IssuerDN ? + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_ISSUER) + + mX509Cert.getIssuerDN().toString() + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_VALIDITY) + + "\n"); String notBefore = dateFormater.format(mX509Cert.getNotBefore()); String notAfter = dateFormater.format(mX509Cert.getNotAfter()); - //get timezone and timezone ID + // get timezone and timezone ID if (TimeZone.getDefault() != null) { tz = TimeZone.getDefault().getDisplayName( - TimeZone.getDefault().inDaylightTime( - mX509Cert.getNotBefore()), - TimeZone.SHORT, - clientLocale); + TimeZone.getDefault().inDaylightTime( + mX509Cert.getNotBefore()), TimeZone.SHORT, + clientLocale); tzid = TimeZone.getDefault().getID(); } // Specify notBefore if (tz.equals(tzid) || tzid.equals(CUSTOM_LOCALE)) { // Do NOT append timezone ID sb.append(pp.indent(16) - + resource.getString( - PrettyPrintResources.TOKEN_NOT_BEFORE) - + notBefore - + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_NOT_BEFORE) + + notBefore + "\n"); } else { // Append timezone ID sb.append(pp.indent(16) - + resource.getString( - PrettyPrintResources.TOKEN_NOT_BEFORE) - + notBefore - + " " + tzid + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_NOT_BEFORE) + + notBefore + " " + tzid + "\n"); } // re-get timezone (just in case it is different . . .) if (TimeZone.getDefault() != null) { tz = TimeZone.getDefault().getDisplayName( - TimeZone.getDefault().inDaylightTime( - mX509Cert.getNotAfter()), - TimeZone.SHORT, - clientLocale); + TimeZone.getDefault().inDaylightTime( + mX509Cert.getNotAfter()), TimeZone.SHORT, + clientLocale); } // Specify notAfter if (tz.equals(tzid) || tzid.equals(CUSTOM_LOCALE)) { // Do NOT append timezone ID sb.append(pp.indent(16) - + resource.getString( - PrettyPrintResources.TOKEN_NOT_AFTER) - + notAfter - + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_NOT_AFTER) + + notAfter + "\n"); } else { // Append timezone ID sb.append(pp.indent(16) - + resource.getString( - PrettyPrintResources.TOKEN_NOT_AFTER) - + notAfter - + " " + tzid + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_NOT_AFTER) + + notAfter + " " + tzid + "\n"); } - //XXX I18N SubjectDN ? - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_SUBJECT) + - mX509Cert.getSubjectDN().toString() + "\n"); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_SPKI) + "\n"); + // XXX I18N SubjectDN ? + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_SUBJECT) + + mX509Cert.getSubjectDN().toString() + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_SPKI) + + "\n"); PubKeyPrettyPrint pkpp = new PubKeyPrettyPrint(key); sb.append(pkpp.toString(clientLocale, 16, 16)); - //take care of extensions - CertificateExtensions extensions = (CertificateExtensions) - info.get(X509CertInfo.EXTENSIONS); + // take care of extensions + CertificateExtensions extensions = (CertificateExtensions) info + .get(X509CertInfo.EXTENSIONS); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_EXTENSIONS) + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_EXTENSIONS) + + "\n"); if (extensions != null) for (int i = 0; i < extensions.size(); i++) { Extension ext = (Extension) extensions.elementAt(i); @@ -313,19 +317,23 @@ public class CertPrettyPrint sb.append(extpp.toString()); } - //take care of signature - sb.append(pp.indent(8) + resource.getString( - PrettyPrintResources.TOKEN_SIGNATURE) + "\n"); - //XXX I18N Algorithm Name ? - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_ALGORITHM) + - mX509Cert.getSigAlgName() + " - " + mX509Cert.getSigAlgOID() + "\n"); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_SIGNATURE) + "\n"); + // take care of signature + sb.append(pp.indent(8) + + resource.getString(PrettyPrintResources.TOKEN_SIGNATURE) + + "\n"); + // XXX I18N Algorithm Name ? + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_ALGORITHM) + + mX509Cert.getSigAlgName() + " - " + + mX509Cert.getSigAlgOID() + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_SIGNATURE) + + "\n"); sb.append(pp.toHexString(mX509Cert.getSignature(), 16, 16)); // fingerprints - String[] hashes = new String[] {"MD2", "MD5", "SHA1", "SHA256", "SHA512"}; + String[] hashes = new String[] { "MD2", "MD5", "SHA1", "SHA256", + "SHA512" }; String certFingerprints = ""; sb.append(pp.indent(8) + "FingerPrint\n"); @@ -333,8 +341,8 @@ public class CertPrettyPrint MessageDigest md = MessageDigest.getInstance(hashes[i]); md.update(mX509Cert.getEncoded()); - certFingerprints += pp.indent(12) + hashes[i] + ":\n" + - pp.toHexString(md.digest(), 16, 16); + certFingerprints += pp.indent(12) + hashes[i] + ":\n" + + pp.toHexString(md.digest(), 16, 16); } sb.append(certFingerprints); @@ -343,5 +351,5 @@ public class CertPrettyPrint return sb.toString(); } - + } diff --git a/pki/base/util/src/netscape/security/util/CharToByteIA5String.java b/pki/base/util/src/netscape/security/util/CharToByteIA5String.java index f7c0d1e2d..f5b95f917 100644 --- a/pki/base/util/src/netscape/security/util/CharToByteIA5String.java +++ b/pki/base/util/src/netscape/security/util/CharToByteIA5String.java @@ -23,66 +23,71 @@ import sun.io.UnknownCharacterException; /** * Converts a string of ASN.1 IA5String characters to IA5String bytes. - * + * * @author Lily Hsiao * @author Slava Galperin */ -public class CharToByteIA5String extends CharToByteConverter -{ - /* +public class CharToByteIA5String extends CharToByteConverter { + /* * Returns the character set id for the conversion. + * * @return the character set id. */ - public String getCharacterEncoding () { - return "ASN.1 IA5String"; + public String getCharacterEncoding() { + return "ASN.1 IA5String"; } - /* - * Converts an array of Unicode characters into an array of IA5String - * bytes and returns the total number of characters converted. - * If conversion cannot be done, UnknownCharacterException is - * thrown. The character and byte offset will be set to the point - * of the unknown character. + /* + * Converts an array of Unicode characters into an array of IA5String bytes + * and returns the total number of characters converted. If conversion + * cannot be done, UnknownCharacterException is thrown. The character and + * byte offset will be set to the point of the unknown character. + * * @param input character array to convert. + * * @param inStart offset from which to start the conversion. + * * @param inEnd where to end the conversion. + * * @param output byte array to store converted bytes. + * * @param outStart starting offset in the output byte array. + * * @param outEnd ending offset in the output byte array. + * * @return the number of characters converted. */ - public int convert(char[] input, int inStart, int inEnd, - byte[] output, int outStart, int outEnd) - throws ConversionBufferFullException, - UnknownCharacterException - { - int j = outStart; - for (int i = inStart; i < inEnd; i++, j++) { - if (j >= outEnd) { - charOff = i; - byteOff = j; - throw new ConversionBufferFullException(); - } - if (!subMode && (input[i] & 0xFF80) != 0) { - charOff = i; - byteOff = j; - badInputLength = 1; - throw new UnknownCharacterException(); - } - - output[j] = (byte) (input[i] & 0x7f); - } - return j - outStart; + public int convert(char[] input, int inStart, int inEnd, byte[] output, + int outStart, int outEnd) throws ConversionBufferFullException, + UnknownCharacterException { + int j = outStart; + for (int i = inStart; i < inEnd; i++, j++) { + if (j >= outEnd) { + charOff = i; + byteOff = j; + throw new ConversionBufferFullException(); + } + if (!subMode && (input[i] & 0xFF80) != 0) { + charOff = i; + byteOff = j; + badInputLength = 1; + throw new UnknownCharacterException(); + } + + output[j] = (byte) (input[i] & 0x7f); + } + return j - outStart; } public int flush(byte[] output, int outStart, int outEnd) { - return 0; + return 0; } - public void reset() { } + public void reset() { + } public int getMaxBytesPerChar() { - return 1; + return 1; } } diff --git a/pki/base/util/src/netscape/security/util/CharToBytePrintable.java b/pki/base/util/src/netscape/security/util/CharToBytePrintable.java index 970f7782f..1e4cceb7b 100644 --- a/pki/base/util/src/netscape/security/util/CharToBytePrintable.java +++ b/pki/base/util/src/netscape/security/util/CharToBytePrintable.java @@ -23,100 +23,89 @@ import sun.io.MalformedInputException; import sun.io.UnknownCharacterException; /** - * Converts a string of ASN.1 PrintableString characters to PrintableString + * Converts a string of ASN.1 PrintableString characters to PrintableString * bytes. - * + * * @author Lily Hsiao * @author Slava Galperin */ -public class CharToBytePrintable extends CharToByteConverter -{ +public class CharToBytePrintable extends CharToByteConverter { /* * returns the character set id for the conversion. + * * @return the character set id. */ - public String getCharacterEncoding() - { - return "ASN.1 Printable"; + public String getCharacterEncoding() { + return "ASN.1 Printable"; } - public static boolean isPrintableChar( char c ) - { - if ((c < 'A' || c > 'Z') && - (c < 'a' || c > 'z') && - (c < '0' || c > '9') && - (c != ' ') && - (c != '\'') && - (c != '(') && - (c != ')') && - (c != '+') && - (c != ',') && - (c != '-') && - (c != '.') && - (c != '/') && - (c != ':') && - (c != '=') && - (c != '?')) - { - return false; - } else { - return true; - } + public static boolean isPrintableChar(char c) { + if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') + && (c < '0' || c > '9') && (c != ' ') && (c != '\'') + && (c != '(') && (c != ')') && (c != '+') && (c != ',') + && (c != '-') && (c != '.') && (c != '/') && (c != ':') + && (c != '=') && (c != '?')) { + return false; + } else { + return true; + } } - /* - * Converts an array of Unicode characters into an array of Printable - * String bytes and returns the total number of characters converted. - * If conversion cannot be done, UnknownCharacterException is - * thrown. The character and byte offset will be set to the point - * of the unknown character. + /* + * Converts an array of Unicode characters into an array of Printable String + * bytes and returns the total number of characters converted. If conversion + * cannot be done, UnknownCharacterException is thrown. The character and + * byte offset will be set to the point of the unknown character. + * * @param input character array to convert. + * * @param inStart offset from which to start the conversion. + * * @param inEnd where to end the conversion. + * * @param output byte array to store converted bytes. + * * @param outStart starting offset in the output byte array. + * * @param outEnd ending offset in the output byte array. + * * @return the number of characters converted. */ - public int convert(char[] input, int inStart, int inEnd, - byte[] output, int outStart, int outEnd) - throws MalformedInputException, UnknownCharacterException, - ConversionBufferFullException - { - int j = outStart; - int i; - for (i = inStart; i < inEnd ; i++, j++) - { - if (j >= outEnd) { - charOff = i; - byteOff = j; - throw new ConversionBufferFullException(); - } - if (!subMode && !isPrintableChar(input[i])) { - charOff = i; - byteOff = j; - badInputLength = 1; - throw new UnknownCharacterException(); - } - output[j] = (byte) (input[i] & 0x7f); - } - charOff = i; - byteOff = j; - return j - outStart; + public int convert(char[] input, int inStart, int inEnd, byte[] output, + int outStart, int outEnd) throws MalformedInputException, + UnknownCharacterException, ConversionBufferFullException { + int j = outStart; + int i; + for (i = inStart; i < inEnd; i++, j++) { + if (j >= outEnd) { + charOff = i; + byteOff = j; + throw new ConversionBufferFullException(); + } + if (!subMode && !isPrintableChar(input[i])) { + charOff = i; + byteOff = j; + badInputLength = 1; + throw new UnknownCharacterException(); + } + output[j] = (byte) (input[i] & 0x7f); + } + charOff = i; + byteOff = j; + return j - outStart; } public int flush(byte[] output, int outStart, int outEnd) - throws MalformedInputException, ConversionBufferFullException - { - return 0; + throws MalformedInputException, ConversionBufferFullException { + return 0; } - public void reset() { } + public void reset() { + } - public int getMaxBytesPerChar() - { - return 1; + public int getMaxBytesPerChar() { + return 1; } } diff --git a/pki/base/util/src/netscape/security/util/CharToByteUniversalString.java b/pki/base/util/src/netscape/security/util/CharToByteUniversalString.java index 0d566d539..778ed29d8 100644 --- a/pki/base/util/src/netscape/security/util/CharToByteUniversalString.java +++ b/pki/base/util/src/netscape/security/util/CharToByteUniversalString.java @@ -23,63 +23,68 @@ import sun.io.UnknownCharacterException; /** * Converts a string of ASN.1 IA5String characters to IA5String bytes. - * + * * @author Lily Hsiao * @author Slava Galperin */ -public class CharToByteUniversalString extends CharToByteConverter -{ +public class CharToByteUniversalString extends CharToByteConverter { /* * Returns the character set id for the conversion. + * * @return the character set id. */ - public String getCharacterEncoding () { - return "ASN.1 UniversalString"; + public String getCharacterEncoding() { + return "ASN.1 UniversalString"; } /* * Converts an array of Unicode characters into an array of UniversalString - * bytes and returns the total number of characters converted. - * If conversion cannot be done, UnknownCharacterException is - * thrown. The character and byte offset will be set to the point - * of the unknown character. + * bytes and returns the total number of characters converted. If conversion + * cannot be done, UnknownCharacterException is thrown. The character and + * byte offset will be set to the point of the unknown character. + * * @param input character array to convert. + * * @param inStart offset from which to start the conversion. + * * @param inEnd where to end the conversion. + * * @param output byte array to store converted bytes. + * * @param outStart starting offset in the output byte array. + * * @param outEnd ending offset in the output byte array. + * * @return the number of characters converted. */ - public int convert(char[] input, int inStart, int inEnd, - byte[] output, int outStart, int outEnd) - throws ConversionBufferFullException, - UnknownCharacterException - { - int j = outStart; - for (int i = inStart; i < inEnd; i++) { - if (j+3 >= outEnd) { - charOff = i; - byteOff = j; - throw new ConversionBufferFullException(); - } - output[j++] = 0; - output[j++] = 0; - output[j++] = (byte) ((input[i] >> 8) & 0xff); - output[j++] = (byte) (input[i] & 0xff); - } + public int convert(char[] input, int inStart, int inEnd, byte[] output, + int outStart, int outEnd) throws ConversionBufferFullException, + UnknownCharacterException { + int j = outStart; + for (int i = inStart; i < inEnd; i++) { + if (j + 3 >= outEnd) { + charOff = i; + byteOff = j; + throw new ConversionBufferFullException(); + } + output[j++] = 0; + output[j++] = 0; + output[j++] = (byte) ((input[i] >> 8) & 0xff); + output[j++] = (byte) (input[i] & 0xff); + } - return j - outStart; + return j - outStart; } public int flush(byte[] output, int outStart, int outEnd) { - return 0; + return 0; } - public void reset() { } + public void reset() { + } public int getMaxBytesPerChar() { - return 4; + return 4; } } diff --git a/pki/base/util/src/netscape/security/util/CrlPrettyPrint.java b/pki/base/util/src/netscape/security/util/CrlPrettyPrint.java index ba74a0d73..83b6ac56b 100644 --- a/pki/base/util/src/netscape/security/util/CrlPrettyPrint.java +++ b/pki/base/util/src/netscape/security/util/CrlPrettyPrint.java @@ -17,7 +17,6 @@ // --- END COPYRIGHT BLOCK --- package netscape.security.util; - import java.text.DateFormat; import java.util.Iterator; import java.util.Locale; @@ -30,46 +29,46 @@ import netscape.security.x509.Extension; import netscape.security.x509.RevokedCertImpl; import netscape.security.x509.X509CRLImpl; - /** - * This class will display the certificate content in predefined - * format. - * + * This class will display the certificate content in predefined format. + * * @author Andrew Wnuk * @version $Revision$, $Date$ */ -public class CrlPrettyPrint -{ +public class CrlPrettyPrint { - /*========================================================== - * constants - *==========================================================*/ + /* + * ========================================================== constants + * ========================================================== + */ private final static String CUSTOM_LOCALE = "Custom"; - /*========================================================== - * variables - *==========================================================*/ + /* + * ========================================================== variables + * ========================================================== + */ private X509CRLImpl mCRL = null; private PrettyPrintFormat pp = null; - /*========================================================== - * constructors - *==========================================================*/ + /* + * ========================================================== constructors + * ========================================================== + */ public CrlPrettyPrint(X509CRLImpl crl) { mCRL = crl; pp = new PrettyPrintFormat(":"); } - /*========================================================== - * public methods - *==========================================================*/ + /* + * ========================================================== public methods + * ========================================================== + */ /** - * This method return string representation of the certificate - * revocation list in predefined format using specified client - * local. I18N Support. - * + * This method return string representation of the certificate revocation + * list in predefined format using specified client local. I18N Support. + * * @param clientLocale Locale to be used for localization * @return string representation of the certificate */ @@ -77,60 +76,60 @@ public class CrlPrettyPrint return toString(clientLocale, 0, 0, 0); } - public String toString(Locale clientLocale, long crlSize, long pageStart, long pageSize) { + public String toString(Locale clientLocale, long crlSize, long pageStart, + long pageSize) { - //get I18N resources - ResourceBundle resource = ResourceBundle.getBundle( - PrettyPrintResources.class.getName()); + // get I18N resources + ResourceBundle resource = ResourceBundle + .getBundle(PrettyPrintResources.class.getName()); DateFormat dateFormater = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL, clientLocale); - //get timezone and timezone ID + // get timezone and timezone ID String tz = " "; String tzid = " "; StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(4) + resource.getString( - PrettyPrintResources.TOKEN_CRL) + "\n"); - sb.append(pp.indent(8) + resource.getString( - PrettyPrintResources.TOKEN_DATA) + "\n"); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_VERSION) + " v"); + sb.append(pp.indent(4) + + resource.getString(PrettyPrintResources.TOKEN_CRL) + "\n"); + sb.append(pp.indent(8) + + resource.getString(PrettyPrintResources.TOKEN_DATA) + + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_VERSION) + + " v"); sb.append((mCRL.getVersion() + 1) + "\n"); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_SIGALG) + mCRL.getSigAlgName() + - " - " + mCRL.getSigAlgOID() + "\n"); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_ISSUER) + - mCRL.getIssuerDN().toString() + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_SIGALG) + + mCRL.getSigAlgName() + " - " + mCRL.getSigAlgOID() + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_ISSUER) + + mCRL.getIssuerDN().toString() + "\n"); // Format thisUpdate String thisUpdate = dateFormater.format(mCRL.getThisUpdate()); // get timezone and timezone ID if (TimeZone.getDefault() != null) { tz = TimeZone.getDefault().getDisplayName( - TimeZone.getDefault().inDaylightTime( - mCRL.getThisUpdate()), - TimeZone.SHORT, - clientLocale); + TimeZone.getDefault().inDaylightTime( + mCRL.getThisUpdate()), TimeZone.SHORT, + clientLocale); tzid = TimeZone.getDefault().getID(); } // Specify ThisUpdate if (tz.equals(tzid) || tzid.equals(CUSTOM_LOCALE)) { // Do NOT append timezone ID sb.append(pp.indent(12) - + resource.getString( - PrettyPrintResources.TOKEN_THIS_UPDATE) - + thisUpdate - + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_THIS_UPDATE) + + thisUpdate + "\n"); } else { // Append timezone ID sb.append(pp.indent(12) - + resource.getString( - PrettyPrintResources.TOKEN_THIS_UPDATE) - + thisUpdate - + " " + tzid + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_THIS_UPDATE) + + thisUpdate + " " + tzid + "\n"); } // Check for presence of NextUpdate if (mCRL.getNextUpdate() != null) { @@ -140,40 +139,42 @@ public class CrlPrettyPrint // re-get timezone (just in case it is different . . .) if (TimeZone.getDefault() != null) { tz = TimeZone.getDefault().getDisplayName( - TimeZone.getDefault().inDaylightTime( - mCRL.getNextUpdate()), - TimeZone.SHORT, - clientLocale); + TimeZone.getDefault().inDaylightTime( + mCRL.getNextUpdate()), TimeZone.SHORT, + clientLocale); } // Specify NextUpdate if (tz.equals(tzid) || tzid.equals(CUSTOM_LOCALE)) { // Do NOT append timezone ID sb.append(pp.indent(12) - + resource.getString( - PrettyPrintResources.TOKEN_NEXT_UPDATE) - + nextUpdate - + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_NEXT_UPDATE) + + nextUpdate + "\n"); } else { // Append timezone ID sb.append(pp.indent(12) - + resource.getString( - PrettyPrintResources.TOKEN_NEXT_UPDATE) - + nextUpdate - + " " + tzid + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_NEXT_UPDATE) + + nextUpdate + " " + tzid + "\n"); } } if (crlSize > 0 && pageStart == 0 && pageSize == 0) { - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_REVOKED_CERTIFICATES) + crlSize + "\n"); - } else if ((crlSize == 0 && pageStart == 0 && pageSize == 0) || - (crlSize > 0 && pageStart > 0 && pageSize > 0)) { - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_REVOKED_CERTIFICATES)); + sb.append(pp.indent(12) + + resource + .getString(PrettyPrintResources.TOKEN_REVOKED_CERTIFICATES) + + crlSize + "\n"); + } else if ((crlSize == 0 && pageStart == 0 && pageSize == 0) + || (crlSize > 0 && pageStart > 0 && pageSize > 0)) { + sb.append(pp.indent(12) + + resource + .getString(PrettyPrintResources.TOKEN_REVOKED_CERTIFICATES)); if (crlSize > 0 && pageStart > 0 && pageSize > 0) { - long upperLimit = (pageStart + pageSize - 1 > crlSize) ? crlSize : pageStart + pageSize - 1; + long upperLimit = (pageStart + pageSize - 1 > crlSize) ? crlSize + : pageStart + pageSize - 1; - sb.append("" + pageStart + "-" + upperLimit + " of " + crlSize); + sb.append("" + pageStart + "-" + upperLimit + " of " + + crlSize); } sb.append("\n"); @@ -183,52 +184,62 @@ public class CrlPrettyPrint Iterator i = revokedCerts.iterator(); long l = 1; - while ((i.hasNext()) && ((crlSize == 0) || (pageStart + pageSize > l))) { - RevokedCertImpl revokedCert = - (RevokedCertImpl) i.next(); - - if ((crlSize == 0) || ((pageStart <= l) && (pageStart + pageSize > l))) { - sb.append(pp.indent(16) + resource.getString( - PrettyPrintResources.TOKEN_SERIAL) + "0x" + - revokedCert.getSerialNumber().toString(16).toUpperCase() + "\n"); - String revocationDate = - dateFormater.format(revokedCert.getRevocationDate()); + while ((i.hasNext()) + && ((crlSize == 0) || (pageStart + pageSize > l))) { + RevokedCertImpl revokedCert = (RevokedCertImpl) i + .next(); + + if ((crlSize == 0) + || ((pageStart <= l) && (pageStart + pageSize > l))) { + sb.append(pp.indent(16) + + resource + .getString(PrettyPrintResources.TOKEN_SERIAL) + + "0x" + + revokedCert.getSerialNumber() + .toString(16).toUpperCase() + "\n"); + String revocationDate = dateFormater + .format(revokedCert.getRevocationDate()); // re-get timezone // (just in case it is different . . .) if (TimeZone.getDefault() != null) { - tz = TimeZone.getDefault().getDisplayName( - TimeZone.getDefault().inDaylightTime( - revokedCert.getRevocationDate()), - TimeZone.SHORT, - clientLocale); + tz = TimeZone + .getDefault() + .getDisplayName( + TimeZone.getDefault() + .inDaylightTime( + revokedCert + .getRevocationDate()), + TimeZone.SHORT, clientLocale); } // Specify revocationDate - if (tz.equals(tzid) || - tzid.equals(CUSTOM_LOCALE)) { + if (tz.equals(tzid) || tzid.equals(CUSTOM_LOCALE)) { // Do NOT append timezone ID sb.append(pp.indent(16) - + resource.getString( - PrettyPrintResources.TOKEN_REVOCATION_DATE) - + revocationDate - + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_REVOCATION_DATE) + + revocationDate + "\n"); } else { // Append timezone ID sb.append(pp.indent(16) - + resource.getString( - PrettyPrintResources.TOKEN_REVOCATION_DATE) - + revocationDate - + " " + tzid + "\n"); + + resource + .getString(PrettyPrintResources.TOKEN_REVOCATION_DATE) + + revocationDate + " " + tzid + "\n"); } if (revokedCert.hasExtensions()) { - sb.append(pp.indent(16) + resource.getString( - PrettyPrintResources.TOKEN_EXTENSIONS) + "\n"); - CRLExtensions crlExtensions = revokedCert.getExtensions(); + sb.append(pp.indent(16) + + resource + .getString(PrettyPrintResources.TOKEN_EXTENSIONS) + + "\n"); + CRLExtensions crlExtensions = revokedCert + .getExtensions(); if (crlExtensions != null) { for (int k = 0; k < crlExtensions.size(); k++) { - Extension ext = (Extension) crlExtensions.elementAt(k); - ExtPrettyPrint extpp = new ExtPrettyPrint(ext, 20); + Extension ext = (Extension) crlExtensions + .elementAt(k); + ExtPrettyPrint extpp = new ExtPrettyPrint( + ext, 20); sb.append(extpp.toString()); } @@ -243,8 +254,10 @@ public class CrlPrettyPrint CRLExtensions crlExtensions = mCRL.getExtensions(); if (crlExtensions != null) { - sb.append(pp.indent(8) + resource.getString( - PrettyPrintResources.TOKEN_EXTENSIONS) + "\n"); + sb.append(pp.indent(8) + + resource + .getString(PrettyPrintResources.TOKEN_EXTENSIONS) + + "\n"); for (int k = 0; k < crlExtensions.size(); k++) { Extension ext = (Extension) crlExtensions.elementAt(k); ExtPrettyPrint extpp = new ExtPrettyPrint(ext, 12); @@ -253,20 +266,25 @@ public class CrlPrettyPrint } } - //take care of signature - sb.append(pp.indent(8) + resource.getString( - PrettyPrintResources.TOKEN_SIGNATURE) + "\n"); - //XXX I18N Algorithm Name ? - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_ALGORITHM) + - mCRL.getSigAlgName() + " - " + mCRL.getSigAlgOID() + "\n"); - sb.append(pp.indent(12) + resource.getString( - PrettyPrintResources.TOKEN_SIGNATURE) + "\n"); + // take care of signature + sb.append(pp.indent(8) + + resource.getString(PrettyPrintResources.TOKEN_SIGNATURE) + + "\n"); + // XXX I18N Algorithm Name ? + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_ALGORITHM) + + mCRL.getSigAlgName() + " - " + mCRL.getSigAlgOID() + "\n"); + sb.append(pp.indent(12) + + resource.getString(PrettyPrintResources.TOKEN_SIGNATURE) + + "\n"); sb.append(pp.toHexString(mCRL.getSignature(), 16, 16)); } catch (Exception e) { - sb.append("\n\n" + pp.indent(4) + resource.getString( - PrettyPrintResources.TOKEN_DECODING_ERROR) + "\n\n"); + sb.append("\n\n" + + pp.indent(4) + + resource + .getString(PrettyPrintResources.TOKEN_DECODING_ERROR) + + "\n\n"); e.printStackTrace(); } diff --git a/pki/base/util/src/netscape/security/util/DerEncoder.java b/pki/base/util/src/netscape/security/util/DerEncoder.java index 53bf27a6c..fb5e51505 100644 --- a/pki/base/util/src/netscape/security/util/DerEncoder.java +++ b/pki/base/util/src/netscape/security/util/DerEncoder.java @@ -21,20 +21,19 @@ import java.io.IOException; import java.io.OutputStream; /** - * Interface to an object that knows how to write its own DER - * encoding to an output stream. - * + * Interface to an object that knows how to write its own DER encoding to an + * output stream. + * * @version 1.2 97/12/10 * @author D. N. Hoover */ public interface DerEncoder { - + /** * DER encode this object and write the results to a stream. - * - * @param out the stream on which the DER encoding is written. + * + * @param out the stream on which the DER encoding is written. */ - public void derEncode(OutputStream out) - throws IOException; + public void derEncode(OutputStream out) throws IOException; } diff --git a/pki/base/util/src/netscape/security/util/DerInputBuffer.java b/pki/base/util/src/netscape/security/util/DerInputBuffer.java index 74ab9f705..a4bbbef43 100644 --- a/pki/base/util/src/netscape/security/util/DerInputBuffer.java +++ b/pki/base/util/src/netscape/security/util/DerInputBuffer.java @@ -15,171 +15,171 @@ // (C) 2007 Red Hat, Inc. // All rights reserved. // --- END COPYRIGHT BLOCK --- -package netscape.security.util ; +package netscape.security.util; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.OutputStream; - /** - * DER input buffer ... this is the main abstraction in the DER library - * which actively works with the "untyped byte stream" abstraction. It - * does so with impunity, since it's not intended to be exposed to the - * anyone who could violate the "typed value stream" DER model and hence - * corrupt the input stream of DER values. - * + * DER input buffer ... this is the main abstraction in the DER library which + * actively works with the "untyped byte stream" abstraction. It does so with + * impunity, since it's not intended to be exposed to the anyone who could + * violate the "typed value stream" DER model and hence corrupt the input stream + * of DER values. + * * @version 1.11 * @author David Brownell */ class DerInputBuffer extends ByteArrayInputStream implements Cloneable { - DerInputBuffer(byte[] buf) { super(buf); } + DerInputBuffer(byte[] buf) { + super(buf); + } DerInputBuffer(byte[] buf, int offset, int len) { super(buf, offset, len); } DerInputBuffer dup() { - try { - DerInputBuffer retval = (DerInputBuffer) clone (); - - retval.mark (Integer.MAX_VALUE); - return retval; - } catch (CloneNotSupportedException e) { - throw new IllegalArgumentException (e.toString ()); - } + try { + DerInputBuffer retval = (DerInputBuffer) clone(); + + retval.mark(Integer.MAX_VALUE); + return retval; + } catch (CloneNotSupportedException e) { + throw new IllegalArgumentException(e.toString()); + } } byte[] toByteArray() { - int len = available(); + int len = available(); if (len <= 0) return null; - byte[] retval = new byte[len]; + byte[] retval = new byte[len]; - System.arraycopy(buf, pos, retval, 0, len); - return retval; + System.arraycopy(buf, pos, retval, 0, len); + return retval; } int peek() throws IOException { - if (pos >= count) - throw new IOException ("out of data"); - else - return buf [pos]; + if (pos >= count) + throw new IOException("out of data"); + else + return buf[pos]; } /** - * Compares this DerInputBuffer for equality with the specified - * object. + * Compares this DerInputBuffer for equality with the specified object. */ public boolean equals(Object other) { - if (other instanceof DerInputBuffer) - return equals ((DerInputBuffer) other); - else - return false; + if (other instanceof DerInputBuffer) + return equals((DerInputBuffer) other); + else + return false; } boolean equals(DerInputBuffer other) { - if (this == other) - return true; - - int max = this.available(); - if (other.available() != max) - return false; - for (int i = 0; i < max; i++) { - if (this.buf [this.pos + i] != other.buf [other.pos + i]) { - return false; - } - } - return true; + if (this == other) + return true; + + int max = this.available(); + if (other.available() != max) + return false; + for (int i = 0; i < max; i++) { + if (this.buf[this.pos + i] != other.buf[other.pos + i]) { + return false; + } + } + return true; } void truncate(int len) throws IOException { - if (len > available ()) - throw new IOException ("insufficient data"); - count = pos + len; + if (len > available()) + throw new IOException("insufficient data"); + count = pos + len; } /** - * Returns the unsigned integer which takes up the specified number - * of bytes in this buffer. + * Returns the unsigned integer which takes up the specified number of bytes + * in this buffer. */ BigInt getUnsigned(int len) throws IOException { - if (len > available ()) - throw new IOException ("short read, getInteger"); - - /* - * A prepended zero is used to ensure that the integer is - * interpreted as unsigned even when the high order bit is - * zero. We don't support signed BigInts. - * - * Fix this here ... BigInts aren't expected to have these, - * and stuff like signing (sigsize = f(modulus)) misbehaves. - */ - if (len > 1 && buf [pos] == 0) { - len--; - skip (1); - } - - /* - * Consume the rest of the buffer, returning its value as - * an unsigned integer. - */ - byte[] bytes = new byte[len]; - - System.arraycopy (buf, pos, bytes, 0, len); - skip (len); - return new BigInt (bytes); + if (len > available()) + throw new IOException("short read, getInteger"); + + /* + * A prepended zero is used to ensure that the integer is interpreted as + * unsigned even when the high order bit is zero. We don't support + * signed BigInts. + * + * Fix this here ... BigInts aren't expected to have these, and stuff + * like signing (sigsize = f(modulus)) misbehaves. + */ + if (len > 1 && buf[pos] == 0) { + len--; + skip(1); + } + + /* + * Consume the rest of the buffer, returning its value as an unsigned + * integer. + */ + byte[] bytes = new byte[len]; + + System.arraycopy(buf, pos, bytes, 0, len); + skip(len); + return new BigInt(bytes); } /** - * Returns the bit string which takes up the rest of this buffer. - * This bit string must be byte-aligned. - */ + * Returns the bit string which takes up the rest of this buffer. This bit + * string must be byte-aligned. + */ byte[] getBitString() { - if (pos >= count || buf [pos] != 0) - return null; - /* - * Just copy the data into an aligned, padded octet buffer, - * and consume the rest of the buffer. - */ - int len = available (); - byte[] retval = new byte[len - 1]; - - System.arraycopy (buf, pos + 1, retval, 0, len - 1); - pos = count; - return retval; + if (pos >= count || buf[pos] != 0) + return null; + /* + * Just copy the data into an aligned, padded octet buffer, and consume + * the rest of the buffer. + */ + int len = available(); + byte[] retval = new byte[len - 1]; + + System.arraycopy(buf, pos + 1, retval, 0, len - 1); + pos = count; + return retval; + } + + /** + * Returns the bit string which takes up the rest of this buffer. The bit + * string need not be byte-aligned. + */ + BitArray getUnalignedBitString() { + if (pos >= count) + return null; + /* + * Just copy the data into an aligned, padded octet buffer, and consume + * the rest of the buffer. + */ + int len = available(); + byte[] bits = new byte[len - 1]; + int length = bits.length * 8 - buf[pos]; // number of valid bits + + System.arraycopy(buf, pos + 1, bits, 0, len - 1); + + BitArray bitArray = new BitArray(length, bits); + pos = count; + return bitArray; + } + + /** + * Package-access method to optimize output operations + */ + void dump(OutputStream out, int length) throws IOException { + if (count < mark + length) + throw new IOException("short DER value (encode)"); + out.write(buf, mark, length); } - /** - * Returns the bit string which takes up the rest of this buffer. - * The bit string need not be byte-aligned. - */ - BitArray getUnalignedBitString() { - if (pos >= count) - return null; - /* - * Just copy the data into an aligned, padded octet buffer, - * and consume the rest of the buffer. - */ - int len = available(); - byte[] bits = new byte[len - 1]; - int length = bits.length*8 - buf[pos]; // number of valid bits - - System.arraycopy(buf, pos + 1, bits, 0, len - 1); - - BitArray bitArray = new BitArray(length, bits); - pos = count; - return bitArray; - } - - /** - * Package-access method to optimize output operations - */ - void dump(OutputStream out, int length) throws IOException { - if (count < mark + length) - throw new IOException ("short DER value (encode)"); - out.write(buf,mark,length); - } - } diff --git a/pki/base/util/src/netscape/security/util/DerInputStream.java b/pki/base/util/src/netscape/security/util/DerInputStream.java index fb73b761e..6e5e25ff1 100644 --- a/pki/base/util/src/netscape/security/util/DerInputStream.java +++ b/pki/base/util/src/netscape/security/util/DerInputStream.java @@ -26,93 +26,92 @@ import java.util.TimeZone; import java.util.Vector; /** - * A DER input stream, used for parsing ASN.1 DER-encoded data such as - * that found in X.509 certificates. DER is a subset of BER/1, which has - * the advantage that it allows only a single encoding of primitive data. - * (High level data such as dates still support many encodings.) That is, - * it uses the "Definite" Encoding Rules (DER) not the "Basic" ones (BER). - * - * <P>Note that, like BER/1, DER streams are streams of explicitly - * tagged data values. Accordingly, this programming interface does - * not expose any variant of the java.io.InputStream interface, since - * that kind of input stream holds untagged data values and using that - * I/O model could prevent correct parsing of the DER data. - * - * <P>At this time, this class supports only a subset of the types of DER - * data encodings which are defined. That subset is sufficient for parsing - * most X.509 certificates. - * + * A DER input stream, used for parsing ASN.1 DER-encoded data such as that + * found in X.509 certificates. DER is a subset of BER/1, which has the + * advantage that it allows only a single encoding of primitive data. (High + * level data such as dates still support many encodings.) That is, it uses the + * "Definite" Encoding Rules (DER) not the "Basic" ones (BER). + * + * <P> + * Note that, like BER/1, DER streams are streams of explicitly tagged data + * values. Accordingly, this programming interface does not expose any variant + * of the java.io.InputStream interface, since that kind of input stream holds + * untagged data values and using that I/O model could prevent correct parsing + * of the DER data. + * + * <P> + * At this time, this class supports only a subset of the types of DER data + * encodings which are defined. That subset is sufficient for parsing most X.509 + * certificates. + * * @version 1.35 - * + * * @author David Brownell * @author Amit Kapoor * @author Hemma Prafullchandra */ public class DerInputStream { /* - * This version only supports fully buffered DER. This is easy to - * work with, though if large objects are manipulated DER becomes - * awkward to deal with. That's where BER is useful, since BER - * handles streaming data relatively well. + * This version only supports fully buffered DER. This is easy to work with, + * though if large objects are manipulated DER becomes awkward to deal with. + * That's where BER is useful, since BER handles streaming data relatively + * well. */ - DerInputBuffer buffer; + DerInputBuffer buffer; /** - * Create a DER input stream from a data buffer. The buffer is not - * copied, it is shared. Accordingly, the buffer should be treated - * as read-only. - * + * Create a DER input stream from a data buffer. The buffer is not copied, + * it is shared. Accordingly, the buffer should be treated as read-only. + * * @param data the buffer from which to create the string (CONSUMED) */ public DerInputStream(byte[] data) { - buffer = new DerInputBuffer(data); - buffer.mark(Integer.MAX_VALUE); + buffer = new DerInputBuffer(data); + buffer.mark(Integer.MAX_VALUE); } /** - * Create a DER input stream from part of a data buffer. - * The buffer is not copied, it is shared. Accordingly, the - * buffer should be treated as read-only. - * + * Create a DER input stream from part of a data buffer. The buffer is not + * copied, it is shared. Accordingly, the buffer should be treated as + * read-only. + * * @param data the buffer from which to create the string (CONSUMED) - * @param offset the first index of <em>data</em> which will - * be read as DER input in the new stream - * @param len how long a chunk of the buffer to use, - * starting at "offset" + * @param offset the first index of <em>data</em> which will be read as DER + * input in the new stream + * @param len how long a chunk of the buffer to use, starting at "offset" */ public DerInputStream(byte[] data, int offset, int len) { - buffer = new DerInputBuffer(data, offset, len); - buffer.mark(Integer.MAX_VALUE); + buffer = new DerInputBuffer(data, offset, len); + buffer.mark(Integer.MAX_VALUE); } DerInputStream(DerInputBuffer buf) { - buffer = buf; - buffer.mark(Integer.MAX_VALUE); + buffer = buf; + buffer.mark(Integer.MAX_VALUE); } /** * Creates a new DER input stream from part of this input stream. * - * @param len how long a chunk of the current input stream to use, - * starting at the current position. - * @param do_skip true if the existing data in the input stream should - * be skipped. If this value is false, the next data read - * on this stream and the newly created stream will be the - * same. + * @param len how long a chunk of the current input stream to use, starting + * at the current position. + * @param do_skip true if the existing data in the input stream should be + * skipped. If this value is false, the next data read on this + * stream and the newly created stream will be the same. */ - public DerInputStream subStream(int len, boolean do_skip) - throws IOException { - DerInputBuffer newbuf = buffer.dup(); - - newbuf.truncate(len); - if (do_skip) - buffer.skip(len); - return new DerInputStream(newbuf); + public DerInputStream subStream(int len, boolean do_skip) + throws IOException { + DerInputBuffer newbuf = buffer.dup(); + + newbuf.truncate(len); + if (do_skip) + buffer.skip(len); + return new DerInputStream(newbuf); } /** - * Return what has been written to this DerInputStream - * as a byte array. Useful for debugging. + * Return what has been written to this DerInputStream as a byte array. + * Useful for debugging. */ public byte[] toByteArray() { return buffer.toByteArray(); @@ -120,10 +119,9 @@ public class DerInputStream { /* * PRIMITIVES -- these are "universal" ASN.1 simple types. - * - * INTEGER, BIT STRING, OCTET STRING, NULL - * OBJECT IDENTIFIER, SEQUENCE (OF), SET (OF) - * PrintableString, T61String, IA5String, UTCTime + * + * INTEGER, BIT STRING, OCTET STRING, NULL OBJECT IDENTIFIER, SEQUENCE (OF), + * SET (OF) PrintableString, T61String, IA5String, UTCTime */ /** @@ -133,245 +131,236 @@ public class DerInputStream { if (buffer.read() != DerValue.tag_Integer) throw new IOException("DER input, Integer tag error"); - return buffer.getUnsigned(getLength(buffer)); + return buffer.getUnsigned(getLength(buffer)); } /** - * Get a bit string from the input stream. Only octet-aligned - * bitstrings (multiples of eight bits in length) are handled - * by this method. + * Get a bit string from the input stream. Only octet-aligned bitstrings + * (multiples of eight bits in length) are handled by this method. */ public byte[] getBitString() throws IOException { - if (buffer.read() != DerValue.tag_BitString) - throw new IOException("DER input not an bit string"); - int length = getLength(buffer); - - /* - * This byte affects alignment and padding (for the last byte). - * Use getUnalignedBitString() for none 8-bit aligned bit strings. - */ - if (buffer.read() != 0) - return null; - length--; - - /* - * Just read the data into an aligned, padded octet buffer. - */ - byte[] retval = new byte[length]; - if (buffer.read(retval) != length) - throw new IOException("short read of DER bit string"); - return retval; + if (buffer.read() != DerValue.tag_BitString) + throw new IOException("DER input not an bit string"); + int length = getLength(buffer); + + /* + * This byte affects alignment and padding (for the last byte). Use + * getUnalignedBitString() for none 8-bit aligned bit strings. + */ + if (buffer.read() != 0) + return null; + length--; + + /* + * Just read the data into an aligned, padded octet buffer. + */ + byte[] retval = new byte[length]; + if (buffer.read(retval) != length) + throw new IOException("short read of DER bit string"); + return retval; } /** - * Get a bit string from the input stream. The bit string need - * not be byte-aligned. + * Get a bit string from the input stream. The bit string need not be + * byte-aligned. */ public BitArray getUnalignedBitString() throws IOException { - if (buffer.read() != DerValue.tag_BitString) - throw new IOException("DER input not a bit string"); + if (buffer.read() != DerValue.tag_BitString) + throw new IOException("DER input not a bit string"); - int length = getLength(buffer) - 1; + int length = getLength(buffer) - 1; - /* - * First byte = number of excess bits in the last octet of the - * representation. - */ - int validBits = length*8 - buffer.read(); + /* + * First byte = number of excess bits in the last octet of the + * representation. + */ + int validBits = length * 8 - buffer.read(); - byte[] repn = new byte[length]; + byte[] repn = new byte[length]; - if (buffer.read(repn) != length) - throw new IOException("short read of DER bit string"); - return new BitArray(validBits, repn); + if (buffer.read(repn) != length) + throw new IOException("short read of DER bit string"); + return new BitArray(validBits, repn); } /** * Returns an ASN.1 OCTET STRING from the input stream. */ public byte[] getOctetString() throws IOException { - if (buffer.read() != DerValue.tag_OctetString) - throw new IOException("DER input not an octet string"); + if (buffer.read() != DerValue.tag_OctetString) + throw new IOException("DER input not an octet string"); - int length = getLength(buffer); - byte[] retval = new byte[length]; - if (buffer.read(retval) != length) - throw new IOException("short read of DER octet string"); + int length = getLength(buffer); + byte[] retval = new byte[length]; + if (buffer.read(retval) != length) + throw new IOException("short read of DER octet string"); - return retval; + return retval; } /** * Returns the asked number of bytes from the input stream. */ public void getBytes(byte[] val) throws IOException { - if (val.length != 0) { + if (val.length != 0) { if (buffer.read(val) != val.length) { - throw new IOException("short read of DER octet string"); - } - } + throw new IOException("short read of DER octet string"); + } + } } /** * Reads an encoded null value from the input stream. */ public void getNull() throws IOException { - if (buffer.read() != DerValue.tag_Null || buffer.read() != 0) - throw new IOException("getNull, bad data"); + if (buffer.read() != DerValue.tag_Null || buffer.read() != 0) + throw new IOException("getNull, bad data"); } /** * Reads an X.200 style Object Identifier from the stream. */ public ObjectIdentifier getOID() throws IOException { - return new ObjectIdentifier(this); + return new ObjectIdentifier(this); } /** - * Return a sequence of encoded entities. ASN.1 sequences are - * ordered, and they are often used, like a "struct" in C or C++, - * to group data values. They may have optional or context - * specific values. - * - * @param startLen guess about how long the sequence will be - * (used to initialize an auto-growing data structure) + * Return a sequence of encoded entities. ASN.1 sequences are ordered, and + * they are often used, like a "struct" in C or C++, to group data values. + * They may have optional or context specific values. + * + * @param startLen guess about how long the sequence will be (used to + * initialize an auto-growing data structure) * @return array of the values in the sequence */ public DerValue[] getSequence(int startLen) throws IOException { - int b = buffer.read(); - if (b != DerValue.tag_Sequence) - throw new IOException("Sequence tag error " + b); - return readVector(startLen); + int b = buffer.read(); + if (b != DerValue.tag_Sequence) + throw new IOException("Sequence tag error " + b); + return readVector(startLen); } public void skipSequence(int startLen) throws IOException { - int b = buffer.read(); - if (b != DerValue.tag_Sequence) - throw new IOException("Sequence tag error " + b); - int len = getLength(buffer); - buffer.skip(len); + int b = buffer.read(); + if (b != DerValue.tag_Sequence) + throw new IOException("Sequence tag error " + b); + int len = getLength(buffer); + buffer.skip(len); } /** - * Return a set of encoded entities. ASN.1 sets are unordered, - * though DER may specify an order for some kinds of sets (such - * as the attributes in an X.500 relative distinguished name) - * to facilitate binary comparisons of encoded values. - * - * @param startLen guess about how large the set will be - * (used to initialize an auto-growing data structure) + * Return a set of encoded entities. ASN.1 sets are unordered, though DER + * may specify an order for some kinds of sets (such as the attributes in an + * X.500 relative distinguished name) to facilitate binary comparisons of + * encoded values. + * + * @param startLen guess about how large the set will be (used to initialize + * an auto-growing data structure) * @return array of the values in the sequence */ public DerValue[] getSet(int startLen) throws IOException { - if (buffer.read() != DerValue.tag_Set) - throw new IOException("Set tag error"); - return readVector(startLen); + if (buffer.read() != DerValue.tag_Set) + throw new IOException("Set tag error"); + return readVector(startLen); } /** - * Return a set of encoded entities. ASN.1 sets are unordered, - * though DER may specify an order for some kinds of sets (such - * as the attributes in an X.500 relative distinguished name) - * to facilitate binary comparisons of encoded values. - * - * @param startLen guess about how large the set will be - * (used to initialize an auto-growing data structure) + * Return a set of encoded entities. ASN.1 sets are unordered, though DER + * may specify an order for some kinds of sets (such as the attributes in an + * X.500 relative distinguished name) to facilitate binary comparisons of + * encoded values. + * + * @param startLen guess about how large the set will be (used to initialize + * an auto-growing data structure) * @param implicit if true tag is assumed implicit. * @return array of the values in the sequence */ public DerValue[] getSet(int startLen, boolean implicit) throws IOException { int tag = buffer.read(); - if (!implicit) { - if (tag != DerValue.tag_Set) { - throw new IOException("Set tag error"); - } - } - return (readVector(startLen)); + if (!implicit) { + if (tag != DerValue.tag_Set) { + throw new IOException("Set tag error"); + } + } + return (readVector(startLen)); } /* - * Read a "vector" of values ... set or sequence have the - * same encoding, except for the initial tag, so both use - * this same helper routine. + * Read a "vector" of values ... set or sequence have the same encoding, + * except for the initial tag, so both use this same helper routine. */ protected DerValue[] readVector(int startLen) throws IOException { - int len = getLength(buffer); - DerInputStream newstr; + int len = getLength(buffer); + DerInputStream newstr; - if (len == 0) - // return empty array instead of null, which should be - // used only for missing optionals - return new DerValue[0]; + if (len == 0) + // return empty array instead of null, which should be + // used only for missing optionals + return new DerValue[0]; - /* - * Create a temporary stream from which to read the data, - * unless it's not really needed. - */ - if (buffer.available() == len) - newstr = this; - else - newstr = subStream(len, true); + /* + * Create a temporary stream from which to read the data, unless it's + * not really needed. + */ + if (buffer.available() == len) + newstr = this; + else + newstr = subStream(len, true); - /* - * Pull values out of the stream. - */ - Vector vec = new Vector(startLen); - DerValue value; + /* + * Pull values out of the stream. + */ + Vector vec = new Vector(startLen); + DerValue value; - do { - value = new DerValue(newstr.buffer); - vec.addElement(value); - } while (newstr.available() > 0); + do { + value = new DerValue(newstr.buffer); + vec.addElement(value); + } while (newstr.available() > 0); - if (newstr.available() != 0) - throw new IOException("extra data at end of vector"); + if (newstr.available() != 0) + throw new IOException("extra data at end of vector"); - /* - * Now stick them into the array we're returning. - */ - int i, max = vec.size(); - DerValue[] retval = new DerValue[max]; + /* + * Now stick them into the array we're returning. + */ + int i, max = vec.size(); + DerValue[] retval = new DerValue[max]; - for (i = 0; i < max; i++) - retval[i] = (DerValue) vec.elementAt(i); + for (i = 0; i < max; i++) + retval[i] = (DerValue) vec.elementAt(i); - return retval; + return retval; } /** - * Get a single DER-encoded value from the input stream. - * It can often be useful to pull a value from the stream - * and defer parsing it. For example, you can pull a nested - * sequence out with one call, and only examine its elements - * later when you really need to. + * Get a single DER-encoded value from the input stream. It can often be + * useful to pull a value from the stream and defer parsing it. For example, + * you can pull a nested sequence out with one call, and only examine its + * elements later when you really need to. */ public DerValue getDerValue() throws IOException { - return new DerValue(buffer); + return new DerValue(buffer); } - public String getPrintableString() throws IOException - { - return (new DerValue(buffer)).getPrintableString(); + public String getPrintableString() throws IOException { + return (new DerValue(buffer)).getPrintableString(); } - public String getT61String() throws IOException - { - return (new DerValue(buffer)).getT61String(); + public String getT61String() throws IOException { + return (new DerValue(buffer)).getT61String(); } - public String getIA5String() throws IOException - { - return (new DerValue(buffer)).getIA5String(); + public String getIA5String() throws IOException { + return (new DerValue(buffer)).getIA5String(); } - public String getBMPString () throws IOException - { - return (new DerValue(buffer)).getBMPString(); + public String getBMPString() throws IOException { + return (new DerValue(buffer)).getBMPString(); } - public String getUniversalString () throws IOException - { - return (new DerValue(buffer)).getUniversalString(); + public String getUniversalString() throws IOException { + return (new DerValue(buffer)).getUniversalString(); } /** @@ -380,7 +369,7 @@ public class DerInputStream { public Date getUTCTime() throws IOException { if (buffer.read() != DerValue.tag_UtcTime) throw new IOException("DER input, UTCtime tag invalid "); - if (buffer.available() < 11) + if (buffer.available() < 11) throw new IOException("DER input, UTCtime short input"); int len = getLength(buffer); @@ -389,55 +378,53 @@ public class DerInputStream { throw new IOException("DER getUTCTime length error"); /* - * UTC time encoded as ASCII chars, YYMMDDhhmmss. - * If YY <= 50, we assume 20YY; - * if YY > 50, we assume 19YY, as per IETF-PKIX part I. + * UTC time encoded as ASCII chars, YYMMDDhhmmss. If YY <= 50, we assume + * 20YY; if YY > 50, we assume 19YY, as per IETF-PKIX part I. */ int year, month, day, hour, minute, second; - year = 10 * Character.digit((char)buffer.read(), 10); - year += Character.digit((char)buffer.read(), 10); - if (year <= 50) // origin 2000 + year = 10 * Character.digit((char) buffer.read(), 10); + year += Character.digit((char) buffer.read(), 10); + if (year <= 50) // origin 2000 year += 2000; else - year += 1900; // origin 1900 + year += 1900; // origin 1900 - month = 10 * Character.digit((char)buffer.read(), 10); - month += Character.digit((char)buffer.read(), 10); - month -= 1; // months are 0-11 + month = 10 * Character.digit((char) buffer.read(), 10); + month += Character.digit((char) buffer.read(), 10); + month -= 1; // months are 0-11 - day = 10 * Character.digit((char)buffer.read(), 10); - day += Character.digit((char)buffer.read(), 10); + day = 10 * Character.digit((char) buffer.read(), 10); + day += Character.digit((char) buffer.read(), 10); - hour = 10 * Character.digit((char)buffer.read(), 10); - hour += Character.digit((char)buffer.read(), 10); + hour = 10 * Character.digit((char) buffer.read(), 10); + hour += Character.digit((char) buffer.read(), 10); - minute = 10 * Character.digit((char)buffer.read(), 10); - minute += Character.digit((char)buffer.read(), 10); + minute = 10 * Character.digit((char) buffer.read(), 10); + minute += Character.digit((char) buffer.read(), 10); - len -= 10; + len -= 10; /** - * We allow for non-encoded seconds, even though the - * IETF-PKIX specification says that the seconds should - * always be encoded even if it is zero. + * We allow for non-encoded seconds, even though the IETF-PKIX + * specification says that the seconds should always be encoded even if + * it is zero. */ if (len == 3 || len == 7) { - second = 10 * Character.digit((char)buffer.read(), 10); - second += Character.digit((char)buffer.read(), 10); - len -= 2; + second = 10 * Character.digit((char) buffer.read(), 10); + second += Character.digit((char) buffer.read(), 10); + len -= 2; } else second = 0; - if (month < 0 || day <= 0 - || month > 11 || day > 31 || hour >= 24 + if (month < 0 || day <= 0 || month > 11 || day > 31 || hour >= 24 || minute >= 60 || second >= 60) throw new IOException("Parse UTC time, invalid format"); - - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.set(year, month, day, hour, minute, second); - cal.set(Calendar.MILLISECOND, 0); /* To clear millisecond field */ + + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + cal.set(year, month, day, hour, minute, second); + cal.set(Calendar.MILLISECOND, 0); /* To clear millisecond field */ cal.set(Calendar.ERA, GregorianCalendar.AD); Date readDate = cal.getTime(); long utcTime = readDate.getTime(); @@ -445,43 +432,41 @@ public class DerInputStream { /* * Finally, "Z" or "+hhmm" or "-hhmm" ... offsets change hhmm */ - if (! (len == 1 || len == 5)) + if (!(len == 1 || len == 5)) throw new IOException("Parse UTC time, invalid offset"); switch (buffer.read()) { - case '+': - { - int Htmp = 10 * Character.digit((char)buffer.read(), 10); - Htmp += Character.digit((char)buffer.read(), 10); - int Mtmp = 10 * Character.digit((char)buffer.read(), 10); - Mtmp += Character.digit((char)buffer.read(), 10); - - if (Htmp >=24 || Mtmp >= 60) - throw new IOException("Parse UTCtime, +hhmm"); - - utcTime += ((Htmp * 60) + Mtmp) * 60 * 1000; - } - break; - - case '-': - { - int Htmp = 10 * Character.digit((char)buffer.read(), 10); - Htmp += Character.digit((char)buffer.read(), 10); - int Mtmp = 10 * Character.digit((char)buffer.read(), 10); - Mtmp += Character.digit((char)buffer.read(), 10); - - if (Htmp >=24 || Mtmp >= 60) - throw new IOException("Parse UTCtime, -hhmm"); - - utcTime -= ((Htmp * 60) + Mtmp) * 60 * 1000; - } - break; - - case 'Z': - break; - - default: - throw new IOException("Parse UTCtime, garbage offset"); + case '+': { + int Htmp = 10 * Character.digit((char) buffer.read(), 10); + Htmp += Character.digit((char) buffer.read(), 10); + int Mtmp = 10 * Character.digit((char) buffer.read(), 10); + Mtmp += Character.digit((char) buffer.read(), 10); + + if (Htmp >= 24 || Mtmp >= 60) + throw new IOException("Parse UTCtime, +hhmm"); + + utcTime += ((Htmp * 60) + Mtmp) * 60 * 1000; + } + break; + + case '-': { + int Htmp = 10 * Character.digit((char) buffer.read(), 10); + Htmp += Character.digit((char) buffer.read(), 10); + int Mtmp = 10 * Character.digit((char) buffer.read(), 10); + Mtmp += Character.digit((char) buffer.read(), 10); + + if (Htmp >= 24 || Mtmp >= 60) + throw new IOException("Parse UTCtime, -hhmm"); + + utcTime -= ((Htmp * 60) + Mtmp) * 60 * 1000; + } + break; + + case 'Z': + break; + + default: + throw new IOException("Parse UTCtime, garbage offset"); } readDate.setTime(utcTime); return readDate; @@ -491,62 +476,63 @@ public class DerInputStream { * Get a Generalized encoded time value from the input stream. */ public Date getGeneralizedTime() throws IOException { - if (buffer.read () != DerValue.tag_GeneralizedTime) - throw new IOException ("DER input, GeneralizedTime tag invalid "); - - if (buffer.available() < 13) - throw new IOException ("DER input, GeneralizedTime short input"); + if (buffer.read() != DerValue.tag_GeneralizedTime) + throw new IOException("DER input, GeneralizedTime tag invalid "); - int len = getLength (buffer); + if (buffer.available() < 13) + throw new IOException("DER input, GeneralizedTime short input"); + + int len = getLength(buffer); /* * Generalized time encoded as ASCII chars, YYYYMMDDhhmm[ss] */ int year, month, day, hour, minute, second; - year = 1000 * Character.digit ((char)buffer.read (), 10); - year += 100 * Character.digit ((char)buffer.read (), 10); - year += 10 * Character.digit ((char)buffer.read (), 10); - year += Character.digit ((char)buffer.read (), 10); + year = 1000 * Character.digit((char) buffer.read(), 10); + year += 100 * Character.digit((char) buffer.read(), 10); + year += 10 * Character.digit((char) buffer.read(), 10); + year += Character.digit((char) buffer.read(), 10); - month = 10 * Character.digit ((char)buffer.read (), 10); - month += Character.digit ((char)buffer.read (), 10); - month -= 1; // Calendar months are 0-11 + month = 10 * Character.digit((char) buffer.read(), 10); + month += Character.digit((char) buffer.read(), 10); + month -= 1; // Calendar months are 0-11 - day = 10 * Character.digit ((char)buffer.read (), 10); - day += Character.digit ((char)buffer.read (), 10); + day = 10 * Character.digit((char) buffer.read(), 10); + day += Character.digit((char) buffer.read(), 10); - hour = 10 * Character.digit ((char)buffer.read (), 10); - hour += Character.digit ((char)buffer.read (), 10); + hour = 10 * Character.digit((char) buffer.read(), 10); + hour += Character.digit((char) buffer.read(), 10); - minute = 10 * Character.digit ((char)buffer.read (), 10); - minute += Character.digit ((char)buffer.read (), 10); + minute = 10 * Character.digit((char) buffer.read(), 10); + minute += Character.digit((char) buffer.read(), 10); len -= 12; /** - * We allow for non-encoded seconds, even though the - * IETF-PKIX specification says that the seconds should - * always be encoded even if it is zero. + * We allow for non-encoded seconds, even though the IETF-PKIX + * specification says that the seconds should always be encoded even if + * it is zero. */ if (len == 3 || len == 7) { - second = 10 * Character.digit ((char)buffer.read (), 10); - second += Character.digit ((char)buffer.read (), 10); - len -= 2; + second = 10 * Character.digit((char) buffer.read(), 10); + second += Character.digit((char) buffer.read(), 10); + len -= 2; } else second = 0; - if (month < 0 || day <= 0 - || month > 11 || day > 31 || hour >= 24 + if (month < 0 || day <= 0 || month > 11 || day > 31 || hour >= 24 || minute >= 60 || second >= 60) throw new IOException("Parse Generalized time, invalid format"); - -/* Shouldn't this construct a Gregorian calendar directly??? - * We don't really want locale dependant processing here */ - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.set(year, month, day, hour, minute, second); - cal.set(Calendar.MILLISECOND, 0); /* To clear millisecond field */ + + /* + * Shouldn't this construct a Gregorian calendar directly??? We don't + * really want locale dependant processing here + */ + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + cal.set(year, month, day, hour, minute, second); + cal.set(Calendar.MILLISECOND, 0); /* To clear millisecond field */ cal.set(Calendar.ERA, GregorianCalendar.AD); Date readDate = cal.getTime(); long utcTime = readDate.getTime(); @@ -554,43 +540,41 @@ public class DerInputStream { /* * Finally, "Z" or "+hhmm" or "-hhmm" ... offsets change hhmm */ - if (! (len == 1 || len == 5)) - throw new IOException ("Parse Generalized time, invalid offset"); - - switch (buffer.read ()) { - case '+': - { - int Htmp = 10 * Character.digit((char)buffer.read(), 10); - Htmp += Character.digit((char)buffer.read(), 10); - int Mtmp = 10 * Character.digit((char)buffer.read(), 10); - Mtmp += Character.digit((char)buffer.read(), 10); - - if (Htmp >=24 || Mtmp >= 60) - throw new IOException("Parse GeneralizedTime, +hhmm"); - - utcTime += ((Htmp * 60) + Mtmp) * 60 * 1000; - } - break; - - case '-': - { - int Htmp = 10 * Character.digit((char)buffer.read(), 10); - Htmp += Character.digit((char)buffer.read(), 10); - int Mtmp = 10 * Character.digit((char)buffer.read(), 10); - Mtmp += Character.digit((char)buffer.read(), 10); - - if (Htmp >=24 || Mtmp >= 60) - throw new IOException("Parse GeneralizedTime, -hhmm"); - - utcTime -= ((Htmp * 60) + Mtmp) * 60 * 1000; - } - break; - - case 'Z': - break; - - default: - throw new IOException ("Parse GeneralizedTime, garbage offset"); + if (!(len == 1 || len == 5)) + throw new IOException("Parse Generalized time, invalid offset"); + + switch (buffer.read()) { + case '+': { + int Htmp = 10 * Character.digit((char) buffer.read(), 10); + Htmp += Character.digit((char) buffer.read(), 10); + int Mtmp = 10 * Character.digit((char) buffer.read(), 10); + Mtmp += Character.digit((char) buffer.read(), 10); + + if (Htmp >= 24 || Mtmp >= 60) + throw new IOException("Parse GeneralizedTime, +hhmm"); + + utcTime += ((Htmp * 60) + Mtmp) * 60 * 1000; + } + break; + + case '-': { + int Htmp = 10 * Character.digit((char) buffer.read(), 10); + Htmp += Character.digit((char) buffer.read(), 10); + int Mtmp = 10 * Character.digit((char) buffer.read(), 10); + Mtmp += Character.digit((char) buffer.read(), 10); + + if (Htmp >= 24 || Mtmp >= 60) + throw new IOException("Parse GeneralizedTime, -hhmm"); + + utcTime -= ((Htmp * 60) + Mtmp) * 60 * 1000; + } + break; + + case 'Z': + break; + + default: + throw new IOException("Parse GeneralizedTime, garbage offset"); } readDate.setTime(utcTime); return readDate; @@ -601,69 +585,73 @@ public class DerInputStream { */ // package private int getByte() throws IOException { - return (0x00ff & buffer.read()); + return (0x00ff & buffer.read()); } public int peekByte() throws IOException { - return buffer.peek (); + return buffer.peek(); } // package private int getLength() throws IOException { - return getLength (buffer); + return getLength(buffer); } /* * Get a length from the input stream, allowing for at most 32 bits of - * encoding to be used. (Not the same as getting a tagged integer!) + * encoding to be used. (Not the same as getting a tagged integer!) */ static int getLength(InputStream in) throws IOException { - int value, tmp; - - tmp = in.read (); - if ((tmp & 0x080) == 0x00) { // 1 byte datum? - value = tmp; - } else { // no, more ... - tmp &= 0x07f; - - /* - * NOTE: tmp == 0 indicates BER encoded data. - * tmp > 4 indicates more than 4Gb of data. - */ - if (tmp <= 0 || tmp > 4) - throw new IOException("DerInput.getLength(): lengthTag=" - + tmp + ", " - + ((tmp == 0) ? "Indefinite length encoding not supported" - + " or incorrect DER encoding." - : "too big.")); - - for (value = 0; tmp > 0; tmp --) { - value <<= 8; - value += 0x0ff & in.read (); - } - } - return value; + int value, tmp; + + tmp = in.read(); + if ((tmp & 0x080) == 0x00) { // 1 byte datum? + value = tmp; + } else { // no, more ... + tmp &= 0x07f; + + /* + * NOTE: tmp == 0 indicates BER encoded data. tmp > 4 indicates more + * than 4Gb of data. + */ + if (tmp <= 0 || tmp > 4) + throw new IOException( + "DerInput.getLength(): lengthTag=" + + tmp + + ", " + + ((tmp == 0) ? "Indefinite length encoding not supported" + + " or incorrect DER encoding." + : "too big.")); + + for (value = 0; tmp > 0; tmp--) { + value <<= 8; + value += 0x0ff & in.read(); + } + } + return value; } /** - * Mark the current position in the buffer, so that - * a later call to <code>reset</code> will return here. + * Mark the current position in the buffer, so that a later call to + * <code>reset</code> will return here. */ - public void mark (int value) { buffer.mark (value); } - + public void mark(int value) { + buffer.mark(value); + } /** - * Return to the position of the last <code>mark</code> - * call. A mark is implicitly set at the beginning of - * the stream when it is created. + * Return to the position of the last <code>mark</code> call. A mark is + * implicitly set at the beginning of the stream when it is created. */ - public void reset () { buffer.reset (); } - + public void reset() { + buffer.reset(); + } /** - * Returns the number of bytes available for reading. - * This is most useful for testing whether the stream is - * empty. + * Returns the number of bytes available for reading. This is most useful + * for testing whether the stream is empty. */ - public int available () { return buffer.available (); } + public int available() { + return buffer.available(); + } } diff --git a/pki/base/util/src/netscape/security/util/DerOutputStream.java b/pki/base/util/src/netscape/security/util/DerOutputStream.java index be42322fa..0a297b193 100644 --- a/pki/base/util/src/netscape/security/util/DerOutputStream.java +++ b/pki/base/util/src/netscape/security/util/DerOutputStream.java @@ -31,100 +31,105 @@ import java.util.TimeZone; import sun.io.CharToByteConverter; /** - * Output stream marshaling DER-encoded data. This is eventually provided - * in the form of a byte array; there is no advance limit on the size of - * that byte array. - * - * <P>At this time, this class supports only a subset of the types of - * DER data encodings which are defined. That subset is sufficient for - * generating most X.509 certificates. - * + * Output stream marshaling DER-encoded data. This is eventually provided in the + * form of a byte array; there is no advance limit on the size of that byte + * array. + * + * <P> + * At this time, this class supports only a subset of the types of DER data + * encodings which are defined. That subset is sufficient for generating most + * X.509 certificates. + * * @version 1.32 - * + * * @author David Brownell * @author Amit Kapoor * @author Hemma Prafullchandra */ -public class DerOutputStream -extends ByteArrayOutputStream implements DerEncoder { +public class DerOutputStream extends ByteArrayOutputStream implements + DerEncoder { /** * Construct an DER output stream. - * + * * @param size how large a buffer to preallocate. */ - public DerOutputStream(int size) { super(size); } + public DerOutputStream(int size) { + super(size); + } /** * Construct an DER output stream. */ - public DerOutputStream() { } + public DerOutputStream() { + } /** - * Writes tagged, pre-marshaled data. This calcuates and encodes - * the length, so that the output data is the standard triple of - * { tag, length, data } used by all DER values. - * + * Writes tagged, pre-marshaled data. This calcuates and encodes the length, + * so that the output data is the standard triple of { tag, length, data } + * used by all DER values. + * * @param tag the DER value tag for the data, such as - * <em>DerValue.tag_Sequence</em> + * <em>DerValue.tag_Sequence</em> * @param buf buffered data, which must be DER-encoded */ public void write(byte tag, byte[] buf) throws IOException { - write(tag); - putLength(buf.length); - write(buf, 0, buf.length); + write(tag); + putLength(buf.length); + write(buf, 0, buf.length); } /** - * Writes tagged data using buffer-to-buffer copy. As above, - * this writes a standard DER record. This is often used when - * efficiently encapsulating values in sequences. - * + * Writes tagged data using buffer-to-buffer copy. As above, this writes a + * standard DER record. This is often used when efficiently encapsulating + * values in sequences. + * * @param tag the DER value tag for the data, such as - * <em>DerValue.tag_Sequence</em> + * <em>DerValue.tag_Sequence</em> * @param out buffered data */ public void write(byte tag, DerOutputStream out) throws IOException { - write(tag); - putLength(out.count); - write(out.buf, 0, out.count); + write(tag); + putLength(out.count); + write(out.buf, 0, out.count); } /** - * Writes implicitly tagged data using buffer-to-buffer copy. As above, - * this writes a standard DER record. This is often used when - * efficiently encapsulating implicitly tagged values. - * + * Writes implicitly tagged data using buffer-to-buffer copy. As above, this + * writes a standard DER record. This is often used when efficiently + * encapsulating implicitly tagged values. + * * @param tag the DER value of the context-specific tag that replaces - * original tag of the value in the output , such as in - * <pre> - * <em> <field> [N] IMPLICIT <type></em> + * original tag of the value in the output , such as in + * + * <pre> + * <em> <field> [N] IMPLICIT <type></em> * </pre> - * For example, <em>FooLength [1] IMPLICIT INTEGER</em>, with value=4; - * would be encoded as "81 01 04" whereas in explicit - * tagging it would be encoded as "A1 03 02 01 04". - * Notice that the tag is A1 and not 81, this is because with - * explicit tagging the form is always constructed. + * + * For example, <em>FooLength [1] IMPLICIT INTEGER</em>, with + * value=4; would be encoded as "81 01 04" whereas in explicit + * tagging it would be encoded as "A1 03 02 01 04". Notice that + * the tag is A1 and not 81, this is because with explicit + * tagging the form is always constructed. * @param value original value being implicitly tagged */ public void writeImplicit(byte tag, DerOutputStream value) - throws IOException { - write(tag); - write(value.buf, 1, value.count-1); + throws IOException { + write(tag); + write(value.buf, 1, value.count - 1); } /** * Marshals pre-encoded DER value onto the output stream. */ public void putDerValue(DerValue val) throws IOException { - val.encode(this); + val.encode(this); } /* * PRIMITIVES -- these are "universal" ASN.1 simple types. - * - * BOOLEAN, INTEGER, BIT STRING, OCTET STRING, NULL - * OBJECT IDENTIFIER, SEQUENCE(OF), SET(OF) - * PrintableString, T61String, IA5String, UTCTime + * + * BOOLEAN, INTEGER, BIT STRING, OCTET STRING, NULL OBJECT IDENTIFIER, + * SEQUENCE(OF), SET(OF) PrintableString, T61String, IA5String, UTCTime */ /** @@ -143,34 +148,32 @@ extends ByteArrayOutputStream implements DerEncoder { /** * Marshals a DER unsigned integer on the output stream. */ - public void putInteger(BigInt i) throws IOException - { - putUnsignedInteger(i.toByteArray()); - } + public void putInteger(BigInt i) throws IOException { + putUnsignedInteger(i.toByteArray()); + } /** * Marshals a DER unsigned integer on the output stream. */ - public void putUnsignedInteger(byte [] integerBytes) throws IOException { + public void putUnsignedInteger(byte[] integerBytes) throws IOException { - write(DerValue.tag_Integer); - if ((integerBytes [0] & 0x080) != 0) { - /* - * prepend zero so it's not read as a negative number - */ - putLength(integerBytes.length + 1); - write(0); - } else - putLength(integerBytes.length); - write(integerBytes, 0, integerBytes.length); + write(DerValue.tag_Integer); + if ((integerBytes[0] & 0x080) != 0) { + /* + * prepend zero so it's not read as a negative number + */ + putLength(integerBytes.length + 1); + write(0); + } else + putLength(integerBytes.length); + write(integerBytes, 0, integerBytes.length); } /** * Marshals a DER enumerated value on the output stream. */ - public void putEnumerated(int i) throws IOException - { - write(DerValue.tag_Enumerated); + public void putEnumerated(int i) throws IOException { + write(DerValue.tag_Enumerated); int bytemask = 0xff000000; int signmask = 0x80000000; @@ -178,92 +181,91 @@ extends ByteArrayOutputStream implements DerEncoder { if ((i & 0x80000000) != 0) { // negative case for (length = 4; length > 1; --length) { - if((i & bytemask) != bytemask) + if ((i & bytemask) != bytemask) break; - bytemask = bytemask >>> 8; - signmask = signmask >>> 8; + bytemask = bytemask >>> 8; + signmask = signmask >>> 8; } if ((i & signmask) == 0) { // ensure negative case - putLength(length+1); + putLength(length + 1); write(0xff); } else { - putLength(length); + putLength(length); } // unrolled loop switch (length) { - case 4: - write((byte)(i >>> 24)); - case 3: - write((byte)(i >>> 16)); - case 2: - write((byte)(i >>> 8)); - case 1: - write((byte)i); + case 4: + write((byte) (i >>> 24)); + case 3: + write((byte) (i >>> 16)); + case 2: + write((byte) (i >>> 8)); + case 1: + write((byte) i); } } else { // positive case for (length = 4; length > 0; --length) { - if((i & bytemask) != 0) + if ((i & bytemask) != 0) break; - bytemask = bytemask >>> 8; - signmask = signmask >>> 8; + bytemask = bytemask >>> 8; + signmask = signmask >>> 8; } if ((i & signmask) != 0) { // ensure posititive case - putLength(length+1); + putLength(length + 1); write(0x00); } else { - putLength(length); + putLength(length); } // unrolled loop switch (length) { - case 4: - write((byte)(i >>> 24)); - case 3: - write((byte)(i >>> 16)); - case 2: - write((byte)(i >>> 8)); - case 1: - write((byte)i); + case 4: + write((byte) (i >>> 24)); + case 3: + write((byte) (i >>> 16)); + case 2: + write((byte) (i >>> 8)); + case 1: + write((byte) i); } } } /** - * Marshals a DER bit string on the output stream. The bit - * string must be byte-aligned. - * + * Marshals a DER bit string on the output stream. The bit string must be + * byte-aligned. + * * @param bits the bit string, MSB first */ public void putBitString(byte[] bits) throws IOException { - write(DerValue.tag_BitString); - putLength(bits.length + 1); - write(0); // all of last octet is used - write(bits); + write(DerValue.tag_BitString); + putLength(bits.length + 1); + write(0); // all of last octet is used + write(bits); } /** - * Converts a boolean array to a BitArray. Trims trailing 0 bits - * in accordance with DER encoding standard. We assume the input is not - * null. + * Converts a boolean array to a BitArray. Trims trailing 0 bits in + * accordance with DER encoding standard. We assume the input is not null. */ private static BitArray toBitArray(boolean[] bitString) { - if( bitString.length == 0 ) { + if (bitString.length == 0) { return new BitArray(bitString); } // find index of last 1 bit. -1 if there aren't any int i; - for(i=bitString.length-1; i >= 0; i--) { - if(bitString[i]) { + for (i = bitString.length - 1; i >= 0; i--) { + if (bitString[i]) { break; } } - int length = i+1; + int length = i + 1; // if length changed, copy to new appropriately-sized array - if(length != bitString.length) { + if (length != bitString.length) { boolean[] newBitString = new boolean[length]; System.arraycopy(bitString, 0, newBitString, 0, length); bitString = newBitString; @@ -273,30 +275,30 @@ extends ByteArrayOutputStream implements DerEncoder { } /** - * Converts bit string to a BitArray, stripping off trailing 0 bits. - * We assume that the bit string is not null. + * Converts bit string to a BitArray, stripping off trailing 0 bits. We + * assume that the bit string is not null. */ private static BitArray toBitArray(byte[] bitString) { // compute length in bits of bit string int length, i; int maxIndex = 0; - if( bitString.length == 0 ) { + if (bitString.length == 0) { return new BitArray(0, bitString); } // find the index of the last byte with a 1 bit - for( i = 0; i < bitString.length; i++) { - if( bitString[i] != 0 ) { + for (i = 0; i < bitString.length; i++) { + if (bitString[i] != 0) { maxIndex = i; } } byte lastByte = bitString[maxIndex]; - length = (maxIndex+1) * 8; // maximum, might reduce in next step + length = (maxIndex + 1) * 8; // maximum, might reduce in next step - // now find the last 1 bit in this last byte - for(i=1; i <= 0x80; i <<= 1) { - if( (lastByte & i) == 0 ) { + // now find the last 1 bit in this last byte + for (i = 1; i <= 0x80; i <<= 1) { + if ((lastByte & i) == 0) { length--; } else { break; @@ -305,345 +307,325 @@ extends ByteArrayOutputStream implements DerEncoder { return new BitArray(length, bitString); } - /** - * Marshals a DER bit string on the output stream. - * The bit strings need not be byte-aligned. - * + * Marshals a DER bit string on the output stream. The bit strings need not + * be byte-aligned. + * * @param bits the bit string, MSB first */ public void putUnalignedBitString(BitArray ba) throws IOException { - byte[] bits = ba.toByteArray(); + byte[] bits = ba.toByteArray(); - write(DerValue.tag_BitString); - putLength(bits.length + 1); - write(bits.length*8 - ba.length()); // excess bits in last octet - write(bits); + write(DerValue.tag_BitString); + putLength(bits.length + 1); + write(bits.length * 8 - ba.length()); // excess bits in last octet + write(bits); } /** - * Marshals a DER bit string on the output stream. - * All trailing 0 bits will be stripped off in accordance with DER - * encoding. - * + * Marshals a DER bit string on the output stream. All trailing 0 bits will + * be stripped off in accordance with DER encoding. + * * @param bits the bit string, MSB first */ public void putUnalignedBitString(byte[] bitString) throws IOException { - putUnalignedBitString( toBitArray(bitString) ); + putUnalignedBitString(toBitArray(bitString)); } /** - * Marshals a DER bit string on the output stream. - * All trailing 0 bits will be stripped off in accordance with DER - * encoding. - * + * Marshals a DER bit string on the output stream. All trailing 0 bits will + * be stripped off in accordance with DER encoding. + * * @param bits the bit string as an array of booleans. */ public void putUnalignedBitString(boolean[] bitString) throws IOException { - putUnalignedBitString( toBitArray(bitString) ); + putUnalignedBitString(toBitArray(bitString)); } /** * DER-encodes an ASN.1 OCTET STRING value on the output stream. - * + * * @param octets the octet string */ public void putOctetString(byte[] octets) throws IOException { - write(DerValue.tag_OctetString, octets); + write(DerValue.tag_OctetString, octets); } /** - * Marshals a DER "null" value on the output stream. These are - * often used to indicate optional values which have been omitted. + * Marshals a DER "null" value on the output stream. These are often used to + * indicate optional values which have been omitted. */ public void putNull() throws IOException { - write(DerValue.tag_Null); - putLength(0); + write(DerValue.tag_Null); + putLength(0); } /** - * Marshals an object identifier (OID) on the output stream. - * Corresponds to the ASN.1 "OBJECT IDENTIFIER" construct. + * Marshals an object identifier (OID) on the output stream. Corresponds to + * the ASN.1 "OBJECT IDENTIFIER" construct. */ public void putOID(ObjectIdentifier oid) throws IOException { - oid.encode(this); + oid.encode(this); } /** - * Marshals a sequence on the output stream. This supports both - * the ASN.1 "SEQUENCE" (zero to N values) and "SEQUENCE OF" - * (one to N values) constructs. + * Marshals a sequence on the output stream. This supports both the ASN.1 + * "SEQUENCE" (zero to N values) and "SEQUENCE OF" (one to N values) + * constructs. */ public void putSequence(DerValue[] seq) throws IOException { - DerOutputStream bytes = new DerOutputStream(); - int i; + DerOutputStream bytes = new DerOutputStream(); + int i; - for (i = 0; i < seq.length; i++) - seq [i].encode(bytes); + for (i = 0; i < seq.length; i++) + seq[i].encode(bytes); - write(DerValue.tag_Sequence, bytes); + write(DerValue.tag_Sequence, bytes); } /** - * Marshals the contents of a set on the output stream without - * ordering the elements. Ok for BER encoding, but not for DER - * encoding. - * - * For DER encoding, use orderedPutSet() or orderedPutSetOf(). + * Marshals the contents of a set on the output stream without ordering the + * elements. Ok for BER encoding, but not for DER encoding. + * + * For DER encoding, use orderedPutSet() or orderedPutSetOf(). */ public void putSet(DerValue[] set) throws IOException { - DerOutputStream bytes = new DerOutputStream(); - int i; + DerOutputStream bytes = new DerOutputStream(); + int i; - for (i = 0; i < set.length; i++) - set [i].encode(bytes); + for (i = 0; i < set.length; i++) + set[i].encode(bytes); - write(DerValue.tag_Set, bytes); + write(DerValue.tag_Set, bytes); } /** - * NSCP : - * Like putOrderSetOf, except not sorted. - * This may defy DER encoding but is needed for compatibility - * with communicator. + * NSCP : Like putOrderSetOf, except not sorted. This may defy DER encoding + * but is needed for compatibility with communicator. */ public void putSet(byte tag, DerEncoder[] set) throws IOException { - putOrderedSet(tag, set, null); + putOrderedSet(tag, set, null); } - /** - * Marshals the contents of a set on the output stream. Sets - * are semantically unordered, but DER requires that encodings of - * set elements be sorted into ascending lexicographical order - * before being output. Hence sets with the same tags and - * elements have the same DER encoding. - * - * This method supports the ASN.1 "SET OF" construct, but not - * "SET", which uses a different order. + /** + * Marshals the contents of a set on the output stream. Sets are + * semantically unordered, but DER requires that encodings of set elements + * be sorted into ascending lexicographical order before being output. Hence + * sets with the same tags and elements have the same DER encoding. + * + * This method supports the ASN.1 "SET OF" construct, but not "SET", which + * uses a different order. */ public void putOrderedSetOf(byte tag, DerEncoder[] set) throws IOException { - putOrderedSet(tag, set, lexOrder); + putOrderedSet(tag, set, lexOrder); } - /** - * Marshals the contents of a set on the output stream. Sets - * are semantically unordered, but DER requires that encodings of - * set elements be sorted into ascending tag order - * before being output. Hence sets with the same tags and - * elements have the same DER encoding. - * - * This method supports the ASN.1 "SET" construct, but not - * "SET OF", which uses a different order. + /** + * Marshals the contents of a set on the output stream. Sets are + * semantically unordered, but DER requires that encodings of set elements + * be sorted into ascending tag order before being output. Hence sets with + * the same tags and elements have the same DER encoding. + * + * This method supports the ASN.1 "SET" construct, but not "SET OF", which + * uses a different order. */ public void putOrderedSet(byte tag, DerEncoder[] set) throws IOException { - putOrderedSet(tag, set, tagOrder); + putOrderedSet(tag, set, tagOrder); } /** - * Lexicographical order comparison on byte arrays, for ordering - * elements of a SET OF objects in DER encoding. + * Lexicographical order comparison on byte arrays, for ordering elements of + * a SET OF objects in DER encoding. */ private static ByteArrayLexOrder lexOrder = new ByteArrayLexOrder(); /** - * Tag order comparison on byte arrays, for ordering elements of - * SET objects in DER encoding. + * Tag order comparison on byte arrays, for ordering elements of SET objects + * in DER encoding. */ private static ByteArrayTagOrder tagOrder = new ByteArrayTagOrder(); - /** - * Marshals a the contents of a set on the output stream with the - * encodings of its sorted in increasing order. - * + /** + * Marshals a the contents of a set on the output stream with the encodings + * of its sorted in increasing order. + * * @param order the order to use when sorting encodings of components. */ - private void putOrderedSet(byte tag, DerEncoder[] set, - Comparator order) throws IOException { - DerOutputStream[] streams = new DerOutputStream[set.length]; + private void putOrderedSet(byte tag, DerEncoder[] set, Comparator order) + throws IOException { + DerOutputStream[] streams = new DerOutputStream[set.length]; - for (int i = 0; i < set.length; i++) { - streams[i] = new DerOutputStream(); - set[i].derEncode(streams[i]); - } + for (int i = 0; i < set.length; i++) { + streams[i] = new DerOutputStream(); + set[i].derEncode(streams[i]); + } - // order the element encodings - byte[][] bufs = new byte[streams.length][]; - for (int i = 0; i < streams.length; i++) { - bufs[i] = streams[i].toByteArray(); - } - if (order != null) { - Arrays.sort(bufs, order); - } + // order the element encodings + byte[][] bufs = new byte[streams.length][]; + for (int i = 0; i < streams.length; i++) { + bufs[i] = streams[i].toByteArray(); + } + if (order != null) { + Arrays.sort(bufs, order); + } - DerOutputStream bytes = new DerOutputStream(); - for (int i = 0; i < streams.length; i++) { - bytes.write(bufs[i]); - } - write(tag, bytes); + DerOutputStream bytes = new DerOutputStream(); + for (int i = 0; i < streams.length; i++) { + bytes.write(bufs[i]); + } + write(tag, bytes); } /** * Converts string to printable and writes to der output stream. */ - public void putPrintableString(String s) throws IOException - { - putStringType(DerValue.tag_PrintableString, s); + public void putPrintableString(String s) throws IOException { + putStringType(DerValue.tag_PrintableString, s); } - public void putVisibleString(String s) throws IOException - { - putStringType(DerValue.tag_VisibleString, s); + public void putVisibleString(String s) throws IOException { + putStringType(DerValue.tag_VisibleString, s); } + /** * Marshals a string which is consists of BMP (unicode) characters */ - public void putBMPString(String s) throws IOException - { - putStringType(DerValue.tag_BMPString, s); + public void putBMPString(String s) throws IOException { + putStringType(DerValue.tag_BMPString, s); } - public void putGeneralString(String s) throws IOException - { - putStringType(DerValue.tag_GeneralString, s); + public void putGeneralString(String s) throws IOException { + putStringType(DerValue.tag_GeneralString, s); } -// /* -// * T61 is an 8 bit extension to ASCII, escapes e.g. to Japanese -// */ -// void putT61String(String s) throws IOException -// { -// // XXX IMPLEMENT ME -// -// throw new IOException("DerOutputStream.putT61String() NYI"); -// } - -// /* -// * Universal String. -// */ -// void putUniversalString(String s) throws IOException -// { -// // XXX IMPLEMENT ME -// -// throw new IOException("DerOutputStream.putUniversalString() NYI"); -// } + // /* + // * T61 is an 8 bit extension to ASCII, escapes e.g. to Japanese + // */ + // void putT61String(String s) throws IOException + // { + // // XXX IMPLEMENT ME + // + // throw new IOException("DerOutputStream.putT61String() NYI"); + // } + + // /* + // * Universal String. + // */ + // void putUniversalString(String s) throws IOException + // { + // // XXX IMPLEMENT ME + // + // throw new IOException("DerOutputStream.putUniversalString() NYI"); + // } /** * Marshals a string which is consists of IA5(ASCII) characters */ - public void putIA5String(String s) throws IOException - { - putStringType(DerValue.tag_IA5String, s); - } - - public void putUTF8String(String s) throws IOException - { - putStringType(DerValue.tag_UTF8String, s); - } - - public void putStringType(byte tag, String s) throws IOException - { - int next_byte_index; - CharToByteConverter cbc; - byte buf[]; - try { - cbc = ASN1CharStrConvMap.getDefault().getCBC(tag); - if (cbc == null) - throw new IOException("No character to byte converter for tag"); - buf= new byte[cbc.getMaxBytesPerChar()*s.length()]; - // Don't use convertAll() here b/c it does not throw - // UnknownCharacterException. - next_byte_index = cbc.convert(s.toCharArray(), 0, s.length(), buf, 0, buf.length); - } - catch (java.io.CharConversionException e) { - throw new IOException("Not a valid string type "+ tag); - } - catch (IllegalAccessException e) { - throw new IOException("Cannot load CharToByteConverter class "+ - "for DER tag "+tag); - } - catch (InstantiationException e) { - throw new IOException("Cannot instantiate CharToByteConverter "+ - "class for DER tag "+tag); - } - - //next_byte_index = cbc.nextByteIndex(); - write(tag); - putLength(next_byte_index); - write(buf, 0, next_byte_index); - } - - private void put2DateBytes(byte[] buffer, int value, int offset) - { - int upper= value/10; - int lower = value%10; - buffer[offset] = (byte)((byte)upper + (byte)'0'); - buffer[offset+1] = (byte)((byte)lower + (byte)'0'); + public void putIA5String(String s) throws IOException { + putStringType(DerValue.tag_IA5String, s); + } + + public void putUTF8String(String s) throws IOException { + putStringType(DerValue.tag_UTF8String, s); + } + + public void putStringType(byte tag, String s) throws IOException { + int next_byte_index; + CharToByteConverter cbc; + byte buf[]; + try { + cbc = ASN1CharStrConvMap.getDefault().getCBC(tag); + if (cbc == null) + throw new IOException("No character to byte converter for tag"); + buf = new byte[cbc.getMaxBytesPerChar() * s.length()]; + // Don't use convertAll() here b/c it does not throw + // UnknownCharacterException. + next_byte_index = cbc.convert(s.toCharArray(), 0, s.length(), buf, + 0, buf.length); + } catch (java.io.CharConversionException e) { + throw new IOException("Not a valid string type " + tag); + } catch (IllegalAccessException e) { + throw new IOException("Cannot load CharToByteConverter class " + + "for DER tag " + tag); + } catch (InstantiationException e) { + throw new IOException("Cannot instantiate CharToByteConverter " + + "class for DER tag " + tag); + } + + // next_byte_index = cbc.nextByteIndex(); + write(tag); + putLength(next_byte_index); + write(buf, 0, next_byte_index); + } + + private void put2DateBytes(byte[] buffer, int value, int offset) { + int upper = value / 10; + int lower = value % 10; + buffer[offset] = (byte) ((byte) upper + (byte) '0'); + buffer[offset + 1] = (byte) ((byte) lower + (byte) '0'); } private static Calendar GMTGregorianCalendar = null; - private Calendar getGMTGregorianCalendar() - { - if (GMTGregorianCalendar == null) { - TimeZone tz = TimeZone.getTimeZone("GMT"); - GMTGregorianCalendar = new GregorianCalendar(tz); - } - return (Calendar)GMTGregorianCalendar.clone(); - } - - public byte[] getDateBytes(Date d, boolean UTC) - { - + private Calendar getGMTGregorianCalendar() { + if (GMTGregorianCalendar == null) { + TimeZone tz = TimeZone.getTimeZone("GMT"); + GMTGregorianCalendar = new GregorianCalendar(tz); + } + return (Calendar) GMTGregorianCalendar.clone(); + } + + public byte[] getDateBytes(Date d, boolean UTC) { + byte[] datebytes; if (UTC) { datebytes = new byte[13]; - } - else { // generalized time has 4 digits for yr + } else { // generalized time has 4 digits for yr datebytes = new byte[15]; } Calendar cal = getGMTGregorianCalendar(); cal.setTime(d); - int i=0; + int i = 0; if (!UTC) { - put2DateBytes(datebytes,cal.get(Calendar.YEAR)/100,i); - i+= 2; + put2DateBytes(datebytes, cal.get(Calendar.YEAR) / 100, i); + i += 2; } - put2DateBytes(datebytes,cal.get(Calendar.YEAR)%100 ,i); + put2DateBytes(datebytes, cal.get(Calendar.YEAR) % 100, i); // Calendar's MONTH is zero-based - i+= 2; - put2DateBytes(datebytes,cal.get(Calendar.MONTH)+1 ,i); - i+= 2; - put2DateBytes(datebytes,cal.get(Calendar.DAY_OF_MONTH),i); - i+= 2; - put2DateBytes(datebytes,cal.get(Calendar.HOUR_OF_DAY) ,i); - i+= 2; - put2DateBytes(datebytes,cal.get(Calendar.MINUTE) ,i); - i+= 2; - put2DateBytes(datebytes,cal.get(Calendar.SECOND) ,i); - i+= 2; + i += 2; + put2DateBytes(datebytes, cal.get(Calendar.MONTH) + 1, i); + i += 2; + put2DateBytes(datebytes, cal.get(Calendar.DAY_OF_MONTH), i); + i += 2; + put2DateBytes(datebytes, cal.get(Calendar.HOUR_OF_DAY), i); + i += 2; + put2DateBytes(datebytes, cal.get(Calendar.MINUTE), i); + i += 2; + put2DateBytes(datebytes, cal.get(Calendar.SECOND), i); + i += 2; // datebytes[i] = 'Z'; - datebytes[i] = (byte)'Z'; - + datebytes[i] = (byte) 'Z'; + return datebytes; } /** * Marshals a DER UTC time/date value. - * - * <P>YYMMDDhhmmss{Z|+hhmm|-hhmm} ... emits only using Zulu time - * and with seconds (even if seconds=0) as per IETF-PKIX partI. + * + * <P> + * YYMMDDhhmmss{Z|+hhmm|-hhmm} ... emits only using Zulu time and with + * seconds (even if seconds=0) as per IETF-PKIX partI. */ public void putUTCTime(Date d) throws IOException { - /* - * Format the date. - */ - + /* + * Format the date. + */ - // This was the old code. Way too slow to be usable (stevep) + // This was the old code. Way too slow to be usable (stevep) // String pattern = "yyMMddHHmmss'Z'"; // SimpleDateFormat sdf = new SimpleDateFormat(pattern); @@ -651,37 +633,38 @@ extends ByteArrayOutputStream implements DerEncoder { // sdf.setTimeZone(tz); // byte[] utc = (sdf.format(d)).getBytes(); - byte[] datebytes = getDateBytes(d,true); // UTC = true + byte[] datebytes = getDateBytes(d, true); // UTC = true - /* - * Write the formatted date. - */ - write (DerValue.tag_UtcTime); + /* + * Write the formatted date. + */ + write(DerValue.tag_UtcTime); putLength(datebytes.length); write(datebytes); } /** * Marshals a DER Generalized Time/date value. - * - * <P>YYYYMMDDhhmmss{Z|+hhmm|-hhmm} ... emits only using Zulu time - * and with seconds (even if seconds=0) as per IETF-PKIX partI. + * + * <P> + * YYYYMMDDhhmmss{Z|+hhmm|-hhmm} ... emits only using Zulu time and with + * seconds (even if seconds=0) as per IETF-PKIX partI. */ public void putGeneralizedTime(Date d) throws IOException { /* * Format the date. */ TimeZone tz = TimeZone.getTimeZone("GMT"); - - // This is way too slow to be usable (stevep) + + // This is way too slow to be usable (stevep) String pattern = "yyyyMMddHHmmss'Z'"; SimpleDateFormat sdf = new SimpleDateFormat(pattern); sdf.setTimeZone(tz); byte[] gt = (sdf.format(d)).getBytes(); - /* - * Write the formatted date. - */ + /* + * Write the formatted date. + */ write(DerValue.tag_GeneralizedTime); putLength(gt.length); write(gt); @@ -689,62 +672,61 @@ extends ByteArrayOutputStream implements DerEncoder { /** * Put the encoding of the length in the stream. - * + * * @param len the length of the attribute. * @exception IOException on writing errors. */ public void putLength(int len) throws IOException { - if (len < 128) { - write ((byte)len); + if (len < 128) { + write((byte) len); - } else if (len < (1 << 8)) { - write ((byte)0x081); - write ((byte)len); + } else if (len < (1 << 8)) { + write((byte) 0x081); + write((byte) len); - } else if (len < (1 << 16)) { - write ((byte)0x082); - write ((byte) (len >> 8)); - write ((byte) len); + } else if (len < (1 << 16)) { + write((byte) 0x082); + write((byte) (len >> 8)); + write((byte) len); - } else if (len < (1 << 24)) { - write ((byte)0x083); - write ((byte) (len >> 16)); - write ((byte) (len >> 8)); - write ((byte) len); + } else if (len < (1 << 24)) { + write((byte) 0x083); + write((byte) (len >> 16)); + write((byte) (len >> 8)); + write((byte) len); - } else { - write ((byte)0x084); - write ((byte) (len >> 24)); - write ((byte) (len >> 16)); - write ((byte) (len >> 8)); - write ((byte) len); - } + } else { + write((byte) 0x084); + write((byte) (len >> 24)); + write((byte) (len >> 16)); + write((byte) (len >> 8)); + write((byte) len); + } } /** * Put the tag of the attribute in the stream. - * - * @param class the tag class type, one of UNIVERSAL, CONTEXT, - * APPLICATION or PRIVATE - * @param form if true, the value is constructed, otherwise it is - * primitive. + * + * @param class the tag class type, one of UNIVERSAL, CONTEXT, APPLICATION + * or PRIVATE + * @param form if true, the value is constructed, otherwise it is primitive. * @param val the tag value */ public void putTag(byte tagClass, boolean form, byte val) { byte tag = (byte) (tagClass | val); if (form) { - tag |= (byte)0x20; + tag |= (byte) 0x20; } - write (tag); + write(tag); } /** - * Write the current contents of this <code>DerOutputStream</code> - * to an <code>OutputStream</code>. - * - * @exception IOException on output error. + * Write the current contents of this <code>DerOutputStream</code> to an + * <code>OutputStream</code>. + * + * @exception IOException on output error. */ public void derEncode(OutputStream out) throws IOException { - out.write(toByteArray()); + out.write(toByteArray()); } } diff --git a/pki/base/util/src/netscape/security/util/DerValue.java b/pki/base/util/src/netscape/security/util/DerValue.java index 58ef8eccc..3a39bbde6 100644 --- a/pki/base/util/src/netscape/security/util/DerValue.java +++ b/pki/base/util/src/netscape/security/util/DerValue.java @@ -27,290 +27,304 @@ import netscape.security.x509.GenericValueConverter; import sun.io.ByteToCharConverter; /** - * Represents a single DER-encoded value. DER encoding rules are a subset - * of the "Basic" Encoding Rules (BER), but they only support a single way - * ("Definite" encoding) to encode any given value. - * - * <P>All DER-encoded data are triples <em>{type, length, data}</em>. This - * class represents such tagged values as they have been read (or constructed), - * and provides structured access to the encoded data. - * - * <P>At this time, this class supports only a subset of the types of DER - * data encodings which are defined. That subset is sufficient for parsing - * most X.509 certificates, and working with selected additional formats - * (such as PKCS #10 certificate requests, and some kinds of PKCS #7 data). - * + * Represents a single DER-encoded value. DER encoding rules are a subset of the + * "Basic" Encoding Rules (BER), but they only support a single way ("Definite" + * encoding) to encode any given value. + * + * <P> + * All DER-encoded data are triples <em>{type, length, data}</em>. This class + * represents such tagged values as they have been read (or constructed), and + * provides structured access to the encoded data. + * + * <P> + * At this time, this class supports only a subset of the types of DER data + * encodings which are defined. That subset is sufficient for parsing most X.509 + * certificates, and working with selected additional formats (such as PKCS #10 + * certificate requests, and some kinds of PKCS #7 data). + * * @version 1.43 - * + * * @author David Brownell * @author Amit Kapoor * @author Hemma Prafullchandra */ public class DerValue { /** The tag class types */ - public static final byte TAG_UNIVERSAL = (byte)0x000; - public static final byte TAG_APPLICATION = (byte)0x040; - public static final byte TAG_CONTEXT = (byte)0x080; - public static final byte TAG_PRIVATE = (byte)0x0c0; + public static final byte TAG_UNIVERSAL = (byte) 0x000; + public static final byte TAG_APPLICATION = (byte) 0x040; + public static final byte TAG_CONTEXT = (byte) 0x080; + public static final byte TAG_PRIVATE = (byte) 0x0c0; /** The DER tag of the value; one of the tag_ constants. */ - public byte tag; + public byte tag; - protected DerInputBuffer buffer; + protected DerInputBuffer buffer; /** * The DER-encoded data of the value. */ - public DerInputStream data; + public DerInputStream data; - private int length; + private int length; /* - * The type starts at the first byte of the encoding, and - * is one of these tag_* values. That may be all the type - * data that is needed. + * The type starts at the first byte of the encoding, and is one of these + * tag_* values. That may be all the type data that is needed. */ /* - * These tags are the "universal" tags ... they mean the same - * in all contexts. (Mask with 0x1f -- five bits.) + * These tags are the "universal" tags ... they mean the same in all + * contexts. (Mask with 0x1f -- five bits.) */ /** Tag value indicating an ASN.1 "BOOLEAN" value. */ - public final static byte tag_Boolean = 0x01; + public final static byte tag_Boolean = 0x01; /** Tag value indicating an ASN.1 "INTEGER" value. */ - public final static byte tag_Integer = 0x02; + public final static byte tag_Integer = 0x02; /** Tag value indicating an ASN.1 "BIT STRING" value. */ - public final static byte tag_BitString = 0x03; + public final static byte tag_BitString = 0x03; /** Tag value indicating an ASN.1 "OCTET STRING" value. */ - public final static byte tag_OctetString = 0x04; + public final static byte tag_OctetString = 0x04; /** Tag value indicating an ASN.1 "NULL" value. */ - public final static byte tag_Null = 0x05; + public final static byte tag_Null = 0x05; /** Tag value indicating an ASN.1 "OBJECT IDENTIFIER" value. */ - public final static byte tag_ObjectId = 0x06; + public final static byte tag_ObjectId = 0x06; /** Tag value including an ASN.1 "ENUMERATED" value */ - public final static byte tag_Enumerated = 0x0A; + public final static byte tag_Enumerated = 0x0A; /** Tag value including a "printable" string */ - public final static byte tag_PrintableString = 0x13; + public final static byte tag_PrintableString = 0x13; - public final static byte tag_VisibleString = 0x1A; + public final static byte tag_VisibleString = 0x1A; /** Tag value including a "teletype" string */ - public final static byte tag_T61String = 0x14; + public final static byte tag_T61String = 0x14; /** Tag value including an ASCII string */ - public final static byte tag_IA5String = 0x16; + public final static byte tag_IA5String = 0x16; /** Tag value indicating an ASN.1 "UTCTime" value. */ - public final static byte tag_UtcTime = 0x17; + public final static byte tag_UtcTime = 0x17; /** Tag value indicating an ASN.1 "GeneralizedTime" value. */ - public final static byte tag_GeneralizedTime = 0x18; + public final static byte tag_GeneralizedTime = 0x18; /** Tag value indicating an ASN.1 "GeneralString" value. */ - public final static byte tag_GeneralString = 0x1B; + public final static byte tag_GeneralString = 0x1B; /** Tag value indicating an ASN.1 "BMPString" value. */ - public final static byte tag_BMPString = 0x1E; + public final static byte tag_BMPString = 0x1E; /** Tag value indicating an ASN.1 "UniversalString" value. */ - public final static byte tag_UniversalString = 0x1C; + public final static byte tag_UniversalString = 0x1C; /** Tag value indicating an ASN.1 "UTF8String" value. (since 1998) */ - public final static byte tag_UTF8String = 0x0C; + public final static byte tag_UTF8String = 0x0C; // CONSTRUCTED seq/set - /** Tag value indicating an ASN.1 - * "SEQUENCE" (zero to N elements, order is significant). */ - public final static byte tag_Sequence = 0x30; + /** + * Tag value indicating an ASN.1 "SEQUENCE" (zero to N elements, order is + * significant). + */ + public final static byte tag_Sequence = 0x30; - /** Tag value indicating an ASN.1 - * "SEQUENCE OF" (one to N elements, order is significant). */ - public final static byte tag_SequenceOf = 0x30; + /** + * Tag value indicating an ASN.1 "SEQUENCE OF" (one to N elements, order is + * significant). + */ + public final static byte tag_SequenceOf = 0x30; - /** Tag value indicating an ASN.1 - * "SET" (zero to N members, order does not matter). */ - public final static byte tag_Set = 0x31; + /** + * Tag value indicating an ASN.1 "SET" (zero to N members, order does not + * matter). + */ + public final static byte tag_Set = 0x31; - /** Tag value indicating an ASN.1 - * "SET OF" (one to N members, order does not matter). */ - public final static byte tag_SetOf = 0x31; + /** + * Tag value indicating an ASN.1 "SET OF" (one to N members, order does not + * matter). + */ + public final static byte tag_SetOf = 0x31; /* * These values are the high order bits for the other kinds of tags. */ - boolean isUniversal() { return ((tag & 0x0c0) == 0x000); } - boolean isApplication() { return ((tag & 0x0c0) == 0x040); } + boolean isUniversal() { + return ((tag & 0x0c0) == 0x000); + } + + boolean isApplication() { + return ((tag & 0x0c0) == 0x040); + } /** - * Returns true iff the CONTEXT SPECIFIC bit is set in the type tag. - * This is associated with the ASN.1 "DEFINED BY" syntax. + * Returns true iff the CONTEXT SPECIFIC bit is set in the type tag. This is + * associated with the ASN.1 "DEFINED BY" syntax. */ - public boolean isContextSpecific() { return ((tag & 0x0c0) == 0x080); } + public boolean isContextSpecific() { + return ((tag & 0x0c0) == 0x080); + } /** * Returns true iff the CONTEXT SPECIFIC TAG matches the passed tag. */ public boolean isContextSpecific(byte cntxtTag) { - if (!isContextSpecific ()) { + if (!isContextSpecific()) { return false; } return ((tag & 0x01f) == cntxtTag); } - boolean isPrivate() { return ((tag & 0x0c0) == 0x0c0); } + boolean isPrivate() { + return ((tag & 0x0c0) == 0x0c0); + } /** Returns true iff the CONSTRUCTED bit is set in the type tag. */ - public boolean isConstructed() { return ((tag & 0x020) == 0x020); } + public boolean isConstructed() { + return ((tag & 0x020) == 0x020); + } /** - * Creates a DER value from a string - * using a generic way of determining the proper tag for the string. - * Assumes the string is a Generic attribute value and uses - * the converter for generic string values to convert to the Der Value. + * Creates a DER value from a string using a generic way of determining the + * proper tag for the string. Assumes the string is a Generic attribute + * value and uses the converter for generic string values to convert to the + * Der Value. */ - public DerValue (String value) - throws IOException - { - AVAValueConverter genericValue = new GenericValueConverter(); - DerValue val; + public DerValue(String value) throws IOException { + AVAValueConverter genericValue = new GenericValueConverter(); + DerValue val; - val = genericValue.getValue(value); - tag = val.tag; - buffer = val.buffer; - length = val.length; - data = val.data; - data.mark (Integer.MAX_VALUE); + val = genericValue.getValue(value); + tag = val.tag; + buffer = val.buffer; + length = val.length; + data = val.data; + data.mark(Integer.MAX_VALUE); } /** * Creates a DerValue from a tag and some DER-encoded data. - * + * * @param tag the DER type tag * @param data the DER-encoded data */ public DerValue(byte tag, byte[] data) { - this.tag = tag; - buffer = new DerInputBuffer((byte[])data.clone()); - length = data.length; - this.data = new DerInputStream (buffer); - this.data.mark (Integer.MAX_VALUE); + this.tag = tag; + buffer = new DerInputBuffer((byte[]) data.clone()); + length = data.length; + this.data = new DerInputStream(buffer); + this.data.mark(Integer.MAX_VALUE); } /* * package private */ DerValue(DerInputBuffer in) throws IOException { - // NOTE: This must handle the special value used - // to terminate BER indefinite encodings (tag and - // length are both zero) + // NOTE: This must handle the special value used + // to terminate BER indefinite encodings (tag and + // length are both zero) - // XXX must also parse BER-encoded constructed - // values such as sequences, sets... + // XXX must also parse BER-encoded constructed + // values such as sequences, sets... - tag = (byte) in.read (); - length = DerInputStream.getLength (in); + tag = (byte) in.read(); + length = DerInputStream.getLength(in); - buffer = in.dup (); - buffer.truncate (length); - data = new DerInputStream (buffer); + buffer = in.dup(); + buffer.truncate(length); + data = new DerInputStream(buffer); - in.skip (length); + in.skip(length); } /** - * Get an ASN.1/DER encoded datum from a buffer. The - * entire buffer must hold exactly one datum, including - * its tag and length. - * + * Get an ASN.1/DER encoded datum from a buffer. The entire buffer must hold + * exactly one datum, including its tag and length. + * * @param buf buffer holding a single DER-encoded datum. */ public DerValue(byte[] buf) throws IOException { - init (true, new ByteArrayInputStream (buf)); + init(true, new ByteArrayInputStream(buf)); } /** - * Get an ASN.1/DER encoded datum from part of a buffer. - * That part of the buffer must hold exactly one datum, including - * its tag and length. - * + * Get an ASN.1/DER encoded datum from part of a buffer. That part of the + * buffer must hold exactly one datum, including its tag and length. + * * @param buf the buffer * @param offset start point of the single DER-encoded dataum * @param length how many bytes are in the encoded datum */ public DerValue(byte[] buf, int offset, int len) throws IOException { - init (true, new ByteArrayInputStream (buf, offset, len)); + init(true, new ByteArrayInputStream(buf, offset, len)); } /** - * Get an ASN1/DER encoded datum from an input stream. The - * stream may have additional data following the encoded datum. - * - * @param in the input stream holding a single DER datum, - * which may be followed by additional data + * Get an ASN1/DER encoded datum from an input stream. The stream may have + * additional data following the encoded datum. + * + * @param in the input stream holding a single DER datum, which may be + * followed by additional data */ public DerValue(InputStream in) throws IOException { - init (false, in); + init(false, in); } /* * helper routine */ - private void init (boolean fullyBuffered, InputStream in) - throws IOException { - byte[] bytes; + private void init(boolean fullyBuffered, InputStream in) throws IOException { + byte[] bytes; - tag = (byte) in.read (); - length = DerInputStream.getLength (in); + tag = (byte) in.read(); + length = DerInputStream.getLength(in); /* - if (length == 0) - return; - */ + * if (length == 0) return; + */ - if (fullyBuffered && in.available () != length) - throw new IOException ("extra DER value data (constructor)"); + if (fullyBuffered && in.available() != length) + throw new IOException("extra DER value data (constructor)"); - bytes = new byte [length]; + bytes = new byte[length]; - // n.b. readFully not needed in normal fullyBuffered case - DataInputStream dis = new DataInputStream (in); + // n.b. readFully not needed in normal fullyBuffered case + DataInputStream dis = new DataInputStream(in); - dis.readFully (bytes); - buffer = new DerInputBuffer (bytes); - data = new DerInputStream (buffer); + dis.readFully(bytes); + buffer = new DerInputBuffer(bytes); + data = new DerInputStream(buffer); } /** * Encode an ASN1/DER encoded datum onto a DER output stream. */ - public void encode(DerOutputStream out) - throws IOException { - out.write (tag); - out.putLength (length); - buffer.dump(out,length); + public void encode(DerOutputStream out) throws IOException { + out.write(tag); + out.putLength(length); + buffer.dump(out, length); } /** * Returns an ASN.1 BOOLEAN - * + * * @return the boolean held in this DER value */ public boolean getBoolean() throws IOException { if (tag != tag_Boolean) { - throw new IOException ("DerValue.getBoolean, not a BOOLEAN " + tag); + throw new IOException("DerValue.getBoolean, not a BOOLEAN " + tag); } if (length != 1) { - throw new IOException ("DerValue.getBoolean, invalid length " + length); + throw new IOException("DerValue.getBoolean, invalid length " + + length); } if (buffer.read() != 0) { return true; @@ -320,394 +334,374 @@ public class DerValue { /** * Returns an ASN.1 OBJECT IDENTIFIER. - * + * * @return the OID held in this DER value */ public ObjectIdentifier getOID() throws IOException { - if (tag != tag_ObjectId) - throw new IOException ("DerValue.getOID, not an OID " + tag); - return new ObjectIdentifier (buffer); + if (tag != tag_ObjectId) + throw new IOException("DerValue.getOID, not an OID " + tag); + return new ObjectIdentifier(buffer); } /** * Returns an ASN.1 OCTET STRING - * + * * @return the octet string held in this DER value */ public byte[] getOctetString() throws IOException { - if (tag != tag_OctetString) - throw new IOException ( - "DerValue.getOctetString, not an Octet String: " + tag); + if (tag != tag_OctetString) + throw new IOException( + "DerValue.getOctetString, not an Octet String: " + tag); - byte [] bytes = new byte [length]; + byte[] bytes = new byte[length]; - if (buffer.read(bytes) != length) - throw new IOException("short read on DerValue buffer"); - return bytes; + if (buffer.read(bytes) != length) + throw new IOException("short read on DerValue buffer"); + return bytes; } /** * Returns an ASN.1 unsigned integer value of enumerated value. - * + * * @return the (unsigned) integer held in this DER value */ - public int getEnumerated () - throws IOException - { + public int getEnumerated() throws IOException { if (tag != tag_Enumerated) - throw new IOException ("DerValue.getEnumerated, not an ENUMERATED " + tag); + throw new IOException("DerValue.getEnumerated, not an ENUMERATED " + + tag); if (length == 0) return 0; - if (length > 4 || length < 1) - throw new IOException("DerValue.getEnumerated, invalid length " + length + "(must be between 1 and 4)"); - - int value = 0; - int nextbyte = buffer.read(); - if (nextbyte == -1) - throw new IOException("short read on DerValue buffer"); - // perform sign extension - value = (byte) nextbyte; - - for (int i = length - 1; i > 0; --i) { - nextbyte = buffer.read(); - if (nextbyte == -1) - throw new IOException("short read on DerValue buffer"); - value = 256 * value + nextbyte; - } - return value; + if (length > 4 || length < 1) + throw new IOException("DerValue.getEnumerated, invalid length " + + length + "(must be between 1 and 4)"); + + int value = 0; + int nextbyte = buffer.read(); + if (nextbyte == -1) + throw new IOException("short read on DerValue buffer"); + // perform sign extension + value = (byte) nextbyte; + + for (int i = length - 1; i > 0; --i) { + nextbyte = buffer.read(); + if (nextbyte == -1) + throw new IOException("short read on DerValue buffer"); + value = 256 * value + nextbyte; + } + return value; } /** * Returns an ASN.1 unsigned INTEGER value. - * + * * @return the (unsigned) integer held in this DER value */ public BigInt getInteger() throws IOException { if (tag != tag_Integer) - throw new IOException ("DerValue.getInteger, not an int " + tag); - return buffer.getUnsigned (data.available ()); + throw new IOException("DerValue.getInteger, not an int " + tag); + return buffer.getUnsigned(data.available()); } /** - * Returns an ASN.1 unsigned INTEGER value, the parameter determining - * if the tag is implicit. - * - * @param tagImplicit if true, ignores the tag value as it is - * assumed implicit. + * Returns an ASN.1 unsigned INTEGER value, the parameter determining if the + * tag is implicit. + * + * @param tagImplicit if true, ignores the tag value as it is assumed + * implicit. * @return the (unsigned) integer held in this DER value */ - public BigInt getInteger(boolean tagImplicit) throws IOException { - if (!tagImplicit) { - if (tag != tag_Integer) { - throw new IOException("DerValue.getInteger, not an int " - + tag); - } - } - return buffer.getUnsigned (data.available ()); - } + public BigInt getInteger(boolean tagImplicit) throws IOException { + if (!tagImplicit) { + if (tag != tag_Integer) { + throw new IOException("DerValue.getInteger, not an int " + tag); + } + } + return buffer.getUnsigned(data.available()); + } /** - * Returns an ASN.1 BIT STRING value. The bit string must be byte-aligned. - * + * Returns an ASN.1 BIT STRING value. The bit string must be byte-aligned. + * * @return the bit string held in this value */ public byte[] getBitString() throws IOException { - if (tag != tag_BitString) - throw new IOException ( - "DerValue.getBitString, not a bit string " + tag); + if (tag != tag_BitString) + throw new IOException("DerValue.getBitString, not a bit string " + + tag); - return buffer.getBitString (); + return buffer.getBitString(); } /** * Returns an ASN.1 BIT STRING value that need not be byte-aligned. - * + * * @return a BitArray representing the bit string held in this value */ public BitArray getUnalignedBitString() throws IOException { - if (tag != tag_BitString) - throw new IOException( - "DerValue.getBitString, not a bit string " + tag); - - return buffer.getUnalignedBitString(); + if (tag != tag_BitString) + throw new IOException("DerValue.getBitString, not a bit string " + + tag); + + return buffer.getUnalignedBitString(); } /** - * Returns the name component as a Java string, regardless of its - * encoding restrictions (ASCII, T61, Printable, etc). + * Returns the name component as a Java string, regardless of its encoding + * restrictions (ASCII, T61, Printable, etc). */ - public String getAsString () throws IOException - { - AVAValueConverter genericValue = new GenericValueConverter(); - return genericValue.getAsString(this); + public String getAsString() throws IOException { + AVAValueConverter genericValue = new GenericValueConverter(); + return genericValue.getAsString(this); } /** - * Returns an ASN.1 BIT STRING value, with the tag assumed implicit - * based on the parameter. The bit string must be byte-aligned. - * + * Returns an ASN.1 BIT STRING value, with the tag assumed implicit based on + * the parameter. The bit string must be byte-aligned. + * * @param tagImplicit if true, the tag is assumed implicit. * @return the bit string held in this value */ public byte[] getBitString(boolean tagImplicit) throws IOException { if (!tagImplicit) { if (tag != tag_BitString) - throw new IOException ("DerValue.getBitString, not a bit string " - + tag); - } - return buffer.getBitString (); + throw new IOException( + "DerValue.getBitString, not a bit string " + tag); + } + return buffer.getBitString(); } /** - * Returns an ASN.1 BIT STRING value, with the tag assumed implicit - * based on the parameter. The bit string need not be byte-aligned. - * + * Returns an ASN.1 BIT STRING value, with the tag assumed implicit based on + * the parameter. The bit string need not be byte-aligned. + * * @param tagImplicit if true, the tag is assumed implicit. * @return the bit string held in this value */ public BitArray getUnalignedBitString(boolean tagImplicit) - throws IOException { + throws IOException { if (!tagImplicit) { if (tag != tag_BitString) - throw new IOException("DerValue.getBitString, not a bit string " - + tag); - } + throw new IOException( + "DerValue.getBitString, not a bit string " + tag); + } return buffer.getUnalignedBitString(); } /** * Returns an ASN.1 STRING value - * + * * @return the printable string held in this value */ - public String getPrintableString () - throws IOException { - if (tag != tag_PrintableString) - throw new IOException ( - "DerValue.getPrintableString, not a string " + tag); + public String getPrintableString() throws IOException { + if (tag != tag_PrintableString) + throw new IOException("DerValue.getPrintableString, not a string " + + tag); - return getASN1CharString(); + return getASN1CharString(); } /* - * Internal utility ... returns a string regardless of what - * restrictions have been placed on its encoding. + * Internal utility ... returns a string regardless of what restrictions + * have been placed on its encoding. */ private String simpleGetString() throws IOException { - StringBuffer s = new StringBuffer(length); - try { - int temp = length; - - data.reset (); - while (temp-- > 0) - s.append ((char) data.getByte ()); - } catch (IOException e) { - return null; - } - return new String (s); + StringBuffer s = new StringBuffer(length); + try { + int temp = length; + + data.reset(); + while (temp-- > 0) + s.append((char) data.getByte()); + } catch (IOException e) { + return null; + } + return new String(s); } /* - * @eturns a string if the DerValue is a ASN.1 character string type and - * if there is a ByteToChar converter for the type. Returns null otherwise. - */ - public String getASN1CharString() - throws IOException - { - ByteToCharConverter bcc; - int ret; - byte buf[]; - char cbuf[]; - - try { - bcc = ASN1CharStrConvMap.getDefault().getBCC(tag); - if (bcc == null) - return null; - - buf = new byte[length]; - cbuf = new char[bcc.getMaxCharsPerByte()*length]; - data.reset(); - data.getBytes(buf); - ret = bcc.convert(buf, 0, buf.length, cbuf, 0, cbuf.length); - } - catch (java.io.CharConversionException e) { - throw new IOException("Misformed DER value"); - } - catch (IllegalAccessException e) { - throw new IOException("Illegal Access loading ByteToCharConverter"); - } - catch (InstantiationException e) { - throw new IOException("Cannot instantiate ByteToCharConverter"); - } - return new String(cbuf, 0, ret); + * @eturns a string if the DerValue is a ASN.1 character string type and if + * there is a ByteToChar converter for the type. Returns null otherwise. + */ + public String getASN1CharString() throws IOException { + ByteToCharConverter bcc; + int ret; + byte buf[]; + char cbuf[]; + + try { + bcc = ASN1CharStrConvMap.getDefault().getBCC(tag); + if (bcc == null) + return null; + + buf = new byte[length]; + cbuf = new char[bcc.getMaxCharsPerByte() * length]; + data.reset(); + data.getBytes(buf); + ret = bcc.convert(buf, 0, buf.length, cbuf, 0, cbuf.length); + } catch (java.io.CharConversionException e) { + throw new IOException("Misformed DER value"); + } catch (IllegalAccessException e) { + throw new IOException("Illegal Access loading ByteToCharConverter"); + } catch (InstantiationException e) { + throw new IOException("Cannot instantiate ByteToCharConverter"); + } + return new String(cbuf, 0, ret); } /** * Returns an ASN.1 T61 (Teletype) STRING value - * + * * @return the teletype string held in this value */ public String getT61String() throws IOException { - if (tag != tag_T61String) - throw new IOException ( - "DerValue.getT61String, not T61 " + tag); + if (tag != tag_T61String) + throw new IOException("DerValue.getT61String, not T61 " + tag); - return getASN1CharString (); + return getASN1CharString(); } /** * Returns an ASN.1 IA5 (ASCII) STRING value - * + * * @return the ASCII string held in this value */ public String getIA5String() throws IOException { - if (tag != tag_IA5String) - throw new IOException ( - "DerValue.getIA5String, not IA5 " + tag); + if (tag != tag_IA5String) + throw new IOException("DerValue.getIA5String, not IA5 " + tag); - return getASN1CharString (); + return getASN1CharString(); } - public String getBMPString () - throws IOException - { - if (tag != tag_BMPString) - throw new IOException ( - "DerValue.getBMPString, not BMP " + tag); + public String getBMPString() throws IOException { + if (tag != tag_BMPString) + throw new IOException("DerValue.getBMPString, not BMP " + tag); - return getASN1CharString (); + return getASN1CharString(); } - public String getUniversalString () - throws IOException - { - if (tag != tag_UniversalString) - throw new IOException ( - "DerValue.getUniversalString, not UniversalString " + tag); + public String getUniversalString() throws IOException { + if (tag != tag_UniversalString) + throw new IOException( + "DerValue.getUniversalString, not UniversalString " + tag); - return getASN1CharString (); + return getASN1CharString(); } - public String getUTF8String () - throws IOException - { - if (tag != tag_UTF8String) - throw new IOException ( - "DerValue.getUTF8String, not UTF8String " + tag); + public String getUTF8String() throws IOException { + if (tag != tag_UTF8String) + throw new IOException("DerValue.getUTF8String, not UTF8String " + + tag); - return getASN1CharString (); + return getASN1CharString(); } /** - * Returns true iff the other object is a DER value which - * is bitwise equal to this one. - * + * Returns true iff the other object is a DER value which is bitwise equal + * to this one. + * * @param other the object being compared with this one */ public boolean equals(Object other) { - if (other instanceof DerValue) - return equals ((DerValue)other); - else - return false; + if (other instanceof DerValue) + return equals((DerValue) other); + else + return false; } /** - * Bitwise equality comparison. DER encoded values have a single - * encoding, so that bitwise equality of the encoded values is an - * efficient way to establish equivalence of the unencoded values. - * + * Bitwise equality comparison. DER encoded values have a single encoding, + * so that bitwise equality of the encoded values is an efficient way to + * establish equivalence of the unencoded values. + * * @param other the object being compared with this one */ public boolean equals(DerValue other) { - data.reset (); - other.data.reset(); - if (this == other) - return true; - else if (tag != other.tag) { - return false; - } else { - return buffer.equals (other.buffer); - } + data.reset(); + other.data.reset(); + if (this == other) + return true; + else if (tag != other.tag) { + return false; + } else { + return buffer.equals(other.buffer); + } } /** * Returns a printable representation of the value. - * + * * @return printable representation of the value */ public String toString() { - try { - String s = getAsString(); - if (s != null) - return s; - if (tag == tag_Null) - return "[DerValue, null]"; - if (tag == tag_ObjectId) - return "OID." + getOID (); - - // integers - else - return "[DerValue, tag = " + tag - + ", length = " + length + "]"; - } catch (IOException e) { - throw new IllegalArgumentException ("misformatted DER value"); - } - } - - /** - * Returns a DER-encoded value, such that if it's passed to the - * DerValue constructor, a value equivalent to "this" is returned. - * + try { + String s = getAsString(); + if (s != null) + return s; + if (tag == tag_Null) + return "[DerValue, null]"; + if (tag == tag_ObjectId) + return "OID." + getOID(); + + // integers + else + return "[DerValue, tag = " + tag + ", length = " + length + "]"; + } catch (IOException e) { + throw new IllegalArgumentException("misformatted DER value"); + } + } + + /** + * Returns a DER-encoded value, such that if it's passed to the DerValue + * constructor, a value equivalent to "this" is returned. + * * @return DER-encoded value, including tag and length. */ public byte[] toByteArray() throws IOException { - DerOutputStream out = new DerOutputStream (); + DerOutputStream out = new DerOutputStream(); - encode (out); - data.reset (); - return out.toByteArray (); + encode(out); + data.reset(); + return out.toByteArray(); } /** - * For "set" and "sequence" types, this function may be used - * to return a DER stream of the members of the set or sequence. - * This operation is not supported for primitive types such as - * integers or bit strings. + * For "set" and "sequence" types, this function may be used to return a DER + * stream of the members of the set or sequence. This operation is not + * supported for primitive types such as integers or bit strings. */ public DerInputStream toDerInputStream() throws IOException { - if (tag == tag_Sequence || tag == tag_Set) - return new DerInputStream (buffer); - throw new IOException ("toDerInputStream rejects tag type " + tag); + if (tag == tag_Sequence || tag == tag_Set) + return new DerInputStream(buffer); + throw new IOException("toDerInputStream rejects tag type " + tag); } /** * Get the length of the encoded value. */ public int length() { - return length; + return length; } /** * Create the tag of the attribute. - * - * @param class the tag class type, one of UNIVERSAL, CONTEXT, - * APPLICATION or PRIVATE - * @param form if true, the value is constructed, otherwise it - * is primitive. + * + * @param class the tag class type, one of UNIVERSAL, CONTEXT, APPLICATION + * or PRIVATE + * @param form if true, the value is constructed, otherwise it is primitive. * @param val the tag value */ public static byte createTag(byte tagClass, boolean form, byte val) { byte tag = (byte) (tagClass | val); if (form) { - tag |= (byte)0x20; + tag |= (byte) 0x20; } return (tag); } /** - * Set the tag of the attribute. Commonly used to reset the - * tag value used for IMPLICIT encodings. - * + * Set the tag of the attribute. Commonly used to reset the tag value used + * for IMPLICIT encodings. + * * @param tag the tag value */ public void resetTag(byte tag) { diff --git a/pki/base/util/src/netscape/security/util/ExtPrettyPrint.java b/pki/base/util/src/netscape/security/util/ExtPrettyPrint.java index 2e57eac17..d32556efc 100644 --- a/pki/base/util/src/netscape/security/util/ExtPrettyPrint.java +++ b/pki/base/util/src/netscape/security/util/ExtPrettyPrint.java @@ -17,7 +17,6 @@ // --- END COPYRIGHT BLOCK --- package netscape.security.util; - import java.math.BigInteger; import java.text.DateFormat; import java.util.Enumeration; @@ -78,19 +77,18 @@ import netscape.security.x509.SubjectDirAttributesExtension; import netscape.security.x509.SubjectKeyIdentifierExtension; import netscape.security.x509.UserNotice; - /** - * This class will display the certificate content in predefined - * format. - * + * This class will display the certificate content in predefined format. + * * @author Andrew Wnuk * @version $Revision$, $Date$ */ public class ExtPrettyPrint { - /*========================================================== - * variables - *==========================================================*/ + /* + * ========================================================== variables + * ========================================================== + */ private Extension mExt = null; private ResourceBundle mResource = null; private ResourceBundle resource = null; @@ -99,34 +97,37 @@ public class ExtPrettyPrint { DateFormat dateFormater = null; - /*========================================================== - * constructors - *==========================================================*/ + /* + * ========================================================== constructors + * ========================================================== + */ public ExtPrettyPrint(Extension ext, int indentSize) { mExt = ext; - mResource = ResourceBundle.getBundle(PrettyPrintResources.class.getName()); + mResource = ResourceBundle.getBundle(PrettyPrintResources.class + .getName()); mIndentSize = indentSize; pp = new PrettyPrintFormat(":"); } - /*========================================================== - * public methods - *==========================================================*/ + /* + * ========================================================== public methods + * ========================================================== + */ /** - * This method return string representation of the certificate - * in predefined format using specified client local. I18N Support. - * + * This method return string representation of the certificate in predefined + * format using specified client local. I18N Support. + * * @param clientLocale Locale to be used for localization * @return string representation of the certificate */ - // public String toString(int indentSize) { + // public String toString(int indentSize) { public String toString() { StringBuffer sb = new StringBuffer(); - //check if the extension is known + // check if the extension is known if (mExt instanceof KeyUsageExtension) { return getKeyUsage(); } @@ -220,31 +221,36 @@ public class ExtPrettyPrint { return getCertificatePoliciesExtension(); } - //unknown cert extension + // unknown cert extension try { String extName = OIDMap.getName(mExt.getExtensionId()); if (extName == null) - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER) + - mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER) + + mExt.getExtensionId().toString() + "\n"); else - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER) + " " + extName + " - " + - mExt.getExtensionId().toString() + "\n"); - - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER) + + " " + extName + " - " + + mExt.getExtensionId().toString() + "\n"); + + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); - } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_VALUE) + "\n"); - sb.append(pp.toHexString(mExt.getExtensionValue(), mIndentSize + 8, 16)); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); + } + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_VALUE) + + "\n"); + sb.append(pp.toHexString(mExt.getExtensionValue(), mIndentSize + 8, + 16)); return sb.toString(); } catch (Exception e) { return ""; @@ -252,28 +258,33 @@ public class ExtPrettyPrint { } - /*========================================================== - * Private methods - *==========================================================*/ + /* + * ========================================================== Private + * methods========================================================== + */ private String getNSCCommentExtension() { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NSC_COMMENT) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_NSC_COMMENT) + + "- " + + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + ((NSCCommentExtension) mExt).toPrint(mIndentSize) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + ((NSCCommentExtension) mExt).toPrint(mIndentSize) + "\n"); return sb.toString(); } catch (Exception e) { return sb.toString(); @@ -284,21 +295,25 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NAME_CONSTRAINTS) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_NAME_CONSTRAINTS) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + ((NameConstraintsExtension) mExt).toPrint(mIndentSize + 4)); + sb.append(pp.indent(mIndentSize + 4) + + ((NameConstraintsExtension) mExt) + .toPrint(mIndentSize + 4)); return sb.toString(); } catch (Exception e) { @@ -310,60 +325,66 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_OCSP_NOCHECK) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_OCSP_NOCHECK) + + "- " + + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } return sb.toString(); } catch (Exception e) { return sb.toString(); } - } + } private String getSubjectInfoAccessExtension() { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_SIA) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_SIA) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_ACCESS_DESC) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_ACCESS_DESC) + + "\n"); SubjectInfoAccessExtension aia = (SubjectInfoAccessExtension) mExt; for (int i = 0; i < aia.numberOfAccessDescription(); i++) { - AccessDescription ad = (AccessDescription) - aia.getAccessDescription(i); + AccessDescription ad = (AccessDescription) aia + .getAccessDescription(i); ObjectIdentifier method = ad.getMethod(); if (method.equals(SubjectInfoAccessExtension.METHOD_OCSP)) { - sb.append(pp.indent(mIndentSize + 8) + "Method #" + i + ": " + - "ocsp" + "\n"); + sb.append(pp.indent(mIndentSize + 8) + "Method #" + i + + ": " + "ocsp" + "\n"); } else { - sb.append(pp.indent(mIndentSize + 8) + "Method #" + i + ": " + - method.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + "Method #" + i + + ": " + method.toString() + "\n"); } - sb.append(pp.indent(mIndentSize + 8) + "Location #" + i + ": " + - ad.getLocation().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + "Location #" + i + ": " + + ad.getLocation().toString() + "\n"); } return sb.toString(); } catch (Exception e) { @@ -375,37 +396,40 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_AIA) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_AIA) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_ACCESS_DESC) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_ACCESS_DESC) + + "\n"); AuthInfoAccessExtension aia = (AuthInfoAccessExtension) mExt; for (int i = 0; i < aia.numberOfAccessDescription(); i++) { - AccessDescription ad = (AccessDescription) - aia.getAccessDescription(i); + AccessDescription ad = (AccessDescription) aia + .getAccessDescription(i); ObjectIdentifier method = ad.getMethod(); if (method.equals(AuthInfoAccessExtension.METHOD_OCSP)) { - sb.append(pp.indent(mIndentSize + 8) + "Method #" + i + ": " + - "ocsp" + "\n"); + sb.append(pp.indent(mIndentSize + 8) + "Method #" + i + + ": " + "ocsp" + "\n"); } else { - sb.append(pp.indent(mIndentSize + 8) + "Method #" + i + ": " + - method.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + "Method #" + i + + ": " + method.toString() + "\n"); } - sb.append(pp.indent(mIndentSize + 8) + "Location #" + i + ": " + - ad.getLocation().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + "Location #" + i + ": " + + ad.getLocation().toString() + "\n"); } return sb.toString(); } catch (Exception e) { @@ -417,54 +441,66 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_PRESENCE_SERVER) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_PRESENCE_SERVER) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } PresenceServerExtension pse = (PresenceServerExtension) mExt; - sb.append(pp.indent(mIndentSize + 4) + "Version : " + pse.getVersion() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + "Street Address : " + pse.getStreetAddress() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + "Telephone Number : " + pse.getTelephoneNumber() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + "RFC822 Name : " + pse.getRFC822() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + "Version : " + + pse.getVersion() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + "Street Address : " + + pse.getStreetAddress() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + "Telephone Number : " + + pse.getTelephoneNumber() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + "RFC822 Name : " + + pse.getRFC822() + "\n"); sb.append(pp.indent(mIndentSize + 4) + "ID : " + pse.getID() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + "Host Name : " + pse.getHostName() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + "Port Number : " + pse.getPortNumber() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + "Max Users : " + pse.getMaxUsers() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + "Service Level : " + pse.getServiceLevel() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + "Host Name : " + + pse.getHostName() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + "Port Number : " + + pse.getPortNumber() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + "Max Users : " + + pse.getMaxUsers() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + "Service Level : " + + pse.getServiceLevel() + "\n"); return sb.toString(); } catch (Exception e) { return sb.toString(); } - } + } private String getPrivateKeyUsageExtension() { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_PRIVATE_KEY_USAGE) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_PRIVATE_KEY_USAGE) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } PrivateKeyUsageExtension usage = (PrivateKeyUsageExtension) mExt; @@ -477,34 +513,40 @@ public class ExtPrettyPrint { String notBefore = dateFormater.format(usage.getNotBefore()); String notAfter = dateFormater.format(usage.getNotAfter()); - sb.append(pp.indent(mIndentSize + 8) + "Not Before: " + notBefore + "\n"); - sb.append(pp.indent(mIndentSize + 8) + "Not After: " + notAfter + "\n"); + sb.append(pp.indent(mIndentSize + 8) + "Not Before: " + notBefore + + "\n"); + sb.append(pp.indent(mIndentSize + 8) + "Not After: " + notAfter + + "\n"); return sb.toString(); } catch (Exception e) { return sb.toString(); } - } + } private String getExtendedKeyUsageExtension() { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_EXTENDED_KEY_USAGE) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_EXTENDED_KEY_USAGE) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_EXTENDED_KEY_USAGE) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_EXTENDED_KEY_USAGE) + + "\n"); ExtendedKeyUsageExtension usage = (ExtendedKeyUsageExtension) mExt; Enumeration e = usage.getOIDs(); @@ -513,9 +555,11 @@ public class ExtPrettyPrint { ObjectIdentifier oid = (ObjectIdentifier) e.nextElement(); if (oid.equals(ExtendedKeyUsageExtension.OID_OCSP_SIGNING)) { - sb.append(pp.indent(mIndentSize + 8) + "OCSPSigning" + "\n"); + sb.append(pp.indent(mIndentSize + 8) + "OCSPSigning" + + "\n"); } else { - sb.append(pp.indent(mIndentSize + 8) + oid.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + oid.toString() + + "\n"); } } } @@ -532,49 +576,82 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_KEY_USAGE) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_KEY_USAGE) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_KEY_USAGE) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_KEY_USAGE) + + "\n"); KeyUsageExtension usage = (KeyUsageExtension) mExt; - if (((Boolean) usage.get(KeyUsageExtension.DIGITAL_SIGNATURE)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(KeyUsageExtension.DIGITAL_SIGNATURE) + "\n"); - } - if (((Boolean) usage.get(KeyUsageExtension.NON_REPUDIATION)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(KeyUsageExtension.NON_REPUDIATION) + "\n"); - } - if (((Boolean) usage.get(KeyUsageExtension.KEY_ENCIPHERMENT)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(KeyUsageExtension.KEY_ENCIPHERMENT) + "\n"); - } - if (((Boolean) usage.get(KeyUsageExtension.DATA_ENCIPHERMENT)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(KeyUsageExtension.DATA_ENCIPHERMENT) + "\n"); - } - if (((Boolean) usage.get(KeyUsageExtension.KEY_AGREEMENT)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(KeyUsageExtension.KEY_AGREEMENT) + "\n"); - } - if (((Boolean) usage.get(KeyUsageExtension.KEY_CERTSIGN)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(KeyUsageExtension.KEY_CERTSIGN) + "\n"); - } - if (((Boolean) usage.get(KeyUsageExtension.CRL_SIGN)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(KeyUsageExtension.CRL_SIGN) + "\n"); - } - if (((Boolean) usage.get(KeyUsageExtension.ENCIPHER_ONLY)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(KeyUsageExtension.ENCIPHER_ONLY) + "\n"); - } - if (((Boolean) usage.get(KeyUsageExtension.DECIPHER_ONLY)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(KeyUsageExtension.DECIPHER_ONLY) + "\n"); + if (((Boolean) usage.get(KeyUsageExtension.DIGITAL_SIGNATURE)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(KeyUsageExtension.DIGITAL_SIGNATURE) + + "\n"); + } + if (((Boolean) usage.get(KeyUsageExtension.NON_REPUDIATION)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(KeyUsageExtension.NON_REPUDIATION) + + "\n"); + } + if (((Boolean) usage.get(KeyUsageExtension.KEY_ENCIPHERMENT)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(KeyUsageExtension.KEY_ENCIPHERMENT) + + "\n"); + } + if (((Boolean) usage.get(KeyUsageExtension.DATA_ENCIPHERMENT)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(KeyUsageExtension.DATA_ENCIPHERMENT) + + "\n"); + } + if (((Boolean) usage.get(KeyUsageExtension.KEY_AGREEMENT)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(KeyUsageExtension.KEY_AGREEMENT) + + "\n"); + } + if (((Boolean) usage.get(KeyUsageExtension.KEY_CERTSIGN)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(KeyUsageExtension.KEY_CERTSIGN) + + "\n"); + } + if (((Boolean) usage.get(KeyUsageExtension.CRL_SIGN)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(KeyUsageExtension.CRL_SIGN) + + "\n"); + } + if (((Boolean) usage.get(KeyUsageExtension.ENCIPHER_ONLY)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(KeyUsageExtension.ENCIPHER_ONLY) + + "\n"); + } + if (((Boolean) usage.get(KeyUsageExtension.DECIPHER_ONLY)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(KeyUsageExtension.DECIPHER_ONLY) + + "\n"); } return sb.toString(); } catch (Exception e) { @@ -590,37 +667,66 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_CERT_TYPE) + "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_CERT_TYPE) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CERT_USAGE) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_CERT_USAGE) + + "\n"); NSCertTypeExtension type = (NSCertTypeExtension) mExt; - if (((Boolean) type.get(NSCertTypeExtension.SSL_CLIENT)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(NSCertTypeExtension.SSL_CLIENT) + "\n"); + if (((Boolean) type.get(NSCertTypeExtension.SSL_CLIENT)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(NSCertTypeExtension.SSL_CLIENT) + + "\n"); } - if (((Boolean) type.get(NSCertTypeExtension.SSL_SERVER)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(NSCertTypeExtension.SSL_SERVER) + "\n"); + if (((Boolean) type.get(NSCertTypeExtension.SSL_SERVER)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(NSCertTypeExtension.SSL_SERVER) + + "\n"); } if (((Boolean) type.get(NSCertTypeExtension.EMAIL)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(NSCertTypeExtension.EMAIL) + "\n"); + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(NSCertTypeExtension.EMAIL) + "\n"); } - if (((Boolean) type.get(NSCertTypeExtension.OBJECT_SIGNING)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(NSCertTypeExtension.OBJECT_SIGNING) + "\n"); + if (((Boolean) type.get(NSCertTypeExtension.OBJECT_SIGNING)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(NSCertTypeExtension.OBJECT_SIGNING) + + "\n"); } if (((Boolean) type.get(NSCertTypeExtension.SSL_CA)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(NSCertTypeExtension.SSL_CA) + "\n"); - } - if (((Boolean) type.get(NSCertTypeExtension.EMAIL_CA)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(NSCertTypeExtension.EMAIL_CA) + "\n"); - } - if (((Boolean) type.get(NSCertTypeExtension.OBJECT_SIGNING_CA)).booleanValue()) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(NSCertTypeExtension.OBJECT_SIGNING_CA) + "\n"); + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(NSCertTypeExtension.SSL_CA) + + "\n"); + } + if (((Boolean) type.get(NSCertTypeExtension.EMAIL_CA)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource.getString(NSCertTypeExtension.EMAIL_CA) + + "\n"); + } + if (((Boolean) type.get(NSCertTypeExtension.OBJECT_SIGNING_CA)) + .booleanValue()) { + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(NSCertTypeExtension.OBJECT_SIGNING_CA) + + "\n"); } return sb.toString(); } catch (Exception e) { @@ -636,19 +742,29 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_SKI) + "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_SKI) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } SubjectKeyIdentifierExtension id = (SubjectKeyIdentifierExtension) mExt; - KeyIdentifier keyId = (KeyIdentifier) id.get(SubjectKeyIdentifierExtension.KEY_ID); + KeyIdentifier keyId = (KeyIdentifier) id + .get(SubjectKeyIdentifierExtension.KEY_ID); if (keyId != null) { - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_KEY_ID) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_KEY_ID) + + "\n"); sb.append(pp.toHexString(keyId.getIdentifier(), 24, 16)); } return sb.toString(); @@ -664,39 +780,59 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_AKI) + "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_AKI) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } AuthorityKeyIdentifierExtension id = (AuthorityKeyIdentifierExtension) mExt; - KeyIdentifier keyId = (KeyIdentifier) id.get(AuthorityKeyIdentifierExtension.KEY_ID); + KeyIdentifier keyId = (KeyIdentifier) id + .get(AuthorityKeyIdentifierExtension.KEY_ID); if (keyId != null) { - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_KEY_ID) + "\n"); - sb.append(pp.toHexString(keyId.getIdentifier(), mIndentSize + 8, 16)); - // sb.append(pp.toHexString(keyId.getIdentifier(),24,16)); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_KEY_ID) + + "\n"); + sb.append(pp.toHexString(keyId.getIdentifier(), + mIndentSize + 8, 16)); + // sb.append(pp.toHexString(keyId.getIdentifier(),24,16)); } - GeneralNames authNames = (GeneralNames) id.get(AuthorityKeyIdentifierExtension.AUTH_NAME); + GeneralNames authNames = (GeneralNames) id + .get(AuthorityKeyIdentifierExtension.AUTH_NAME); if (authNames != null) { for (int i = 0; i < authNames.size(); i++) { GeneralName authName = (GeneralName) authNames.elementAt(i); if (authName != null) { - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_AUTH_NAME) + authName.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_AUTH_NAME) + + authName.toString() + "\n"); } } } - SerialNumber serial = (SerialNumber) id.get(AuthorityKeyIdentifierExtension.SERIAL_NUMBER); + SerialNumber serial = (SerialNumber) id + .get(AuthorityKeyIdentifierExtension.SERIAL_NUMBER); if (serial != null) { - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_SERIAL) + - "0x" + serial.getNumber().toBigInteger().toString(16).toUpperCase() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_SERIAL) + + "0x" + + serial.getNumber().toBigInteger().toString(16) + .toUpperCase() + "\n"); } return sb.toString(); } catch (Exception e) { @@ -711,19 +847,26 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_REVOCATION_REASON) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_REVOCATION_REASON) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); CRLReasonExtension ext = (CRLReasonExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_REASON) + - ext.getReason().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_REASON) + + ext.getReason().toString() + "\n"); return sb.toString(); } catch (Exception e) { @@ -737,24 +880,26 @@ public class ExtPrettyPrint { private String getInhibitAnyPolicyExtension() { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + - mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_INHIBIT_ANY_POLICY_EXT) + "- "+ - mExt.getExtensionId().toString() +"\n"); - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); - InhibitAnyPolicyExtension ext = (InhibitAnyPolicyExtension)mExt; + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_INHIBIT_ANY_POLICY_EXT) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + InhibitAnyPolicyExtension ext = (InhibitAnyPolicyExtension) mExt; if (((Extension) mExt).isCritical()) - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); else - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_SKIP_CERTS)); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_SKIP_CERTS)); BigInt num = ext.getSkipCerts(); - sb.append(""+num.toInt() + "\n"); + sb.append("" + num.toInt() + "\n"); return sb.toString(); } catch (Exception e) { return ""; @@ -768,38 +913,59 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_BASIC_CONSTRAINTS) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_BASIC_CONSTRAINTS) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); BasicConstraintsExtension ext = (BasicConstraintsExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_IS_CA)); - boolean isCA = ((Boolean) ext.get(BasicConstraintsExtension.IS_CA)).booleanValue(); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_IS_CA)); + boolean isCA = ((Boolean) ext.get(BasicConstraintsExtension.IS_CA)) + .booleanValue(); if (isCA) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - Integer pathLength = (Integer) ext.get(BasicConstraintsExtension.PATH_LEN); + Integer pathLength = (Integer) ext + .get(BasicConstraintsExtension.PATH_LEN); if (pathLength != null) { if (pathLength.longValue() >= 0) { - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_PATH_LEN) + - pathLength.toString() + "\n"); - } else if (pathLength.longValue() == -1 || pathLength.longValue() == -2) { - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_PATH_LEN) + - mResource.getString(PrettyPrintResources.TOKEN_PATH_LEN_UNLIMITED) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_PATH_LEN) + + pathLength.toString() + "\n"); + } else if (pathLength.longValue() == -1 + || pathLength.longValue() == -2) { + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_PATH_LEN) + + mResource + .getString(PrettyPrintResources.TOKEN_PATH_LEN_UNLIMITED) + + "\n"); } else { - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_PATH_LEN) + - mResource.getString(PrettyPrintResources.TOKEN_PATH_LEN_INVALID) + - " (" + pathLength.toString() + ")\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_PATH_LEN) + + mResource + .getString(PrettyPrintResources.TOKEN_PATH_LEN_INVALID) + + " (" + pathLength.toString() + ")\n"); } } @@ -816,23 +982,32 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_CRL_NUMBER) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_CRL_NUMBER) + + "- " + + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); CRLNumberExtension ext = (CRLNumberExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - BigInteger crlNumber = (BigInteger) ext.get(CRLNumberExtension.NUMBER); + BigInteger crlNumber = (BigInteger) ext + .get(CRLNumberExtension.NUMBER); if (crlNumber != null) { - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_NUMBER) + - crlNumber.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_NUMBER) + + crlNumber.toString() + "\n"); } return sb.toString(); @@ -848,23 +1023,31 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_DELTA_CRL_INDICATOR) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_DELTA_CRL_INDICATOR) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); DeltaCRLIndicatorExtension ext = (DeltaCRLIndicatorExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - BigInteger crlNumber = (BigInteger) ext.get(DeltaCRLIndicatorExtension.NUMBER); + BigInteger crlNumber = (BigInteger) ext + .get(DeltaCRLIndicatorExtension.NUMBER); if (crlNumber != null) { - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_BASE_CRL_NUMBER) + - crlNumber.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_BASE_CRL_NUMBER) + + crlNumber.toString() + "\n"); } return sb.toString(); @@ -880,32 +1063,43 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_ISSUER_ALT_NAME) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_ISSUER_ALT_NAME) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); IssuerAlternativeNameExtension ext = (IssuerAlternativeNameExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - GeneralNames issuerNames = (GeneralNames) ext.get(IssuerAlternativeNameExtension.ISSUER_NAME); + GeneralNames issuerNames = (GeneralNames) ext + .get(IssuerAlternativeNameExtension.ISSUER_NAME); if (issuerNames != null) { - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_ISSUER_NAMES) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_ISSUER_NAMES) + + "\n"); for (int i = 0; i < issuerNames.size(); i++) { - GeneralName issuerName = (GeneralName) issuerNames.elementAt(i); + GeneralName issuerName = (GeneralName) issuerNames + .elementAt(i); if (issuerName != null) { String nameType = ""; if (issuerName.getType() == GeneralNameInterface.NAME_DIRECTORY) nameType = "DirectoryName: "; - sb.append(pp.indent(mIndentSize + 8) + nameType + issuerName.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + nameType + + issuerName.toString() + "\n"); } } } @@ -923,30 +1117,41 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_SUBJECT_ALT_NAME) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_SUBJECT_ALT_NAME) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); SubjectAlternativeNameExtension ext = (SubjectAlternativeNameExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - GeneralNames subjectNames = (GeneralNames) ext.get(SubjectAlternativeNameExtension.SUBJECT_NAME); + GeneralNames subjectNames = (GeneralNames) ext + .get(SubjectAlternativeNameExtension.SUBJECT_NAME); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_VALUE) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_VALUE) + + "\n"); for (int i = 0; i < subjectNames.size(); i++) { - GeneralName subjectName = (GeneralName) subjectNames.elementAt(i); + GeneralName subjectName = (GeneralName) subjectNames + .elementAt(i); if (subjectName != null) { String nameType = ""; if (subjectName.getType() == GeneralNameInterface.NAME_DIRECTORY) nameType = "DirectoryName: "; - sb.append(pp.indent(mIndentSize + 8) + nameType + subjectName.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + nameType + + subjectName.toString() + "\n"); } } @@ -963,24 +1168,33 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_CERT_SCOPE_OF_USE) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_CERT_SCOPE_OF_USE) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); CertificateScopeOfUseExtension ext = (CertificateScopeOfUseExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } Vector entries = ext.getCertificateScopeEntries(); if (entries != null) { - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_SCOPE_OF_USE) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_SCOPE_OF_USE) + + "\n"); for (int i = 0; i < entries.size(); i++) { - CertificateScopeEntry se = (CertificateScopeEntry) entries.elementAt(i); + CertificateScopeEntry se = (CertificateScopeEntry) entries + .elementAt(i); GeneralName gn = se.getGeneralName(); if (gn != null) { @@ -988,13 +1202,15 @@ public class ExtPrettyPrint { if (gn.getType() == GeneralNameInterface.NAME_DIRECTORY) nameType = "DirectoryName: "; - sb.append(pp.indent(mIndentSize + 8) + nameType + gn.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + nameType + + gn.toString() + "\n"); } BigInt port = se.getPort(); if (port != null) { - sb.append(pp.indent(mIndentSize + 8) + PrettyPrintResources.TOKEN_PORT + - port.toBigInteger().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + + PrettyPrintResources.TOKEN_PORT + + port.toBigInteger().toString() + "\n"); } } } @@ -1015,19 +1231,20 @@ public class ExtPrettyPrint { // // Generic stuff: name, OID, criticality // - sb.append(pp.indent(mIndentSize) + - mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_FRESHEST_CRL_EXT) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_FRESHEST_CRL_EXT) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } // @@ -1037,9 +1254,10 @@ public class ExtPrettyPrint { int numPoints = ext.getNumPoints(); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRLDP_NUMPOINTS) - + numPoints + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_NUMPOINTS) + + numPoints + "\n"); for (int i = 0; i < numPoints; i++) { @@ -1052,9 +1270,10 @@ public class ExtPrettyPrint { idt = mIndentSize + 4; // reset each time through loop boolean isEmpty = true; - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_POINTN) + - i + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_POINTN) + + i + "\n"); CRLDistributionPoint pt = ext.getPointAt(i); @@ -1062,16 +1281,18 @@ public class ExtPrettyPrint { if (pt.getFullName() != null) { isEmpty = false; - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_DISTPOINT) - + pt.getFullName() + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_DISTPOINT) + + pt.getFullName() + "\n"); } if (pt.getRelativeName() != null) { isEmpty = false; - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_DISTPOINT) - + pt.getRelativeName() + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_DISTPOINT) + + pt.getRelativeName() + "\n"); } if (pt.getReasons() != null) { @@ -1079,16 +1300,18 @@ public class ExtPrettyPrint { byte[] reasonBits = pt.getReasons().toByteArray(); String reasonList = reasonBitsToReasonList(reasonBits); - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_REASONS) - + reasonList + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_REASONS) + + reasonList + "\n"); } - + if (pt.getCRLIssuer() != null) { isEmpty = false; - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_CRLISSUER) - + pt.getCRLIssuer() + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_CRLISSUER) + + pt.getCRLIssuer() + "\n"); } if (isEmpty) { @@ -1114,32 +1337,34 @@ public class ExtPrettyPrint { // // Generic stuff: name, OID, criticality // - sb.append(pp.indent(mIndentSize) + - mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_CRL_DP_EXT) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_CRL_DP_EXT) + + "- " + + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } // // Now the CRLDP-specific stuff // - CRLDistributionPointsExtension ext = - (CRLDistributionPointsExtension) mExt; + CRLDistributionPointsExtension ext = (CRLDistributionPointsExtension) mExt; int numPoints = ext.getNumPoints(); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRLDP_NUMPOINTS) - + numPoints + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_NUMPOINTS) + + numPoints + "\n"); for (int i = 0; i < numPoints; i++) { @@ -1152,9 +1377,10 @@ public class ExtPrettyPrint { idt = mIndentSize + 4; // reset each time through loop boolean isEmpty = true; - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_POINTN) + - i + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_POINTN) + + i + "\n"); CRLDistributionPoint pt = ext.getPointAt(i); @@ -1162,16 +1388,18 @@ public class ExtPrettyPrint { if (pt.getFullName() != null) { isEmpty = false; - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_DISTPOINT) - + pt.getFullName() + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_DISTPOINT) + + pt.getFullName() + "\n"); } if (pt.getRelativeName() != null) { isEmpty = false; - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_DISTPOINT) - + pt.getRelativeName() + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_DISTPOINT) + + pt.getRelativeName() + "\n"); } if (pt.getReasons() != null) { @@ -1179,16 +1407,18 @@ public class ExtPrettyPrint { byte[] reasonBits = pt.getReasons().toByteArray(); String reasonList = reasonBitsToReasonList(reasonBits); - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_REASONS) - + reasonList + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_REASONS) + + reasonList + "\n"); } - + if (pt.getCRLIssuer() != null) { isEmpty = false; - sb.append(pp.indent(idt) + - mResource.getString(PrettyPrintResources.TOKEN_CRLDP_CRLISSUER) - + pt.getCRLIssuer() + "\n"); + sb.append(pp.indent(idt) + + mResource + .getString(PrettyPrintResources.TOKEN_CRLDP_CRLISSUER) + + pt.getCRLIssuer() + "\n"); } if (isEmpty) { @@ -1228,66 +1458,99 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString(PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_ISSUING_DIST_POINT) + "- " + - mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_ISSUING_DIST_POINT) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } IssuingDistributionPointExtension ext = (IssuingDistributionPointExtension) mExt; - IssuingDistributionPoint issuingDistributionPoint = ext.getIssuingDistributionPoint(); + IssuingDistributionPoint issuingDistributionPoint = ext + .getIssuingDistributionPoint(); if (issuingDistributionPoint != null) { GeneralNames fullNames = issuingDistributionPoint.getFullName(); RDN relativeName = issuingDistributionPoint.getRelativeName(); if (fullNames != null || relativeName != null) { - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_DIST_POINT_NAME) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_DIST_POINT_NAME) + + "\n"); if (fullNames != null) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(PrettyPrintResources.TOKEN_FULL_NAME) + "\n"); + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(PrettyPrintResources.TOKEN_FULL_NAME) + + "\n"); for (int i = 0; i < fullNames.size(); i++) { - GeneralName fullName = (GeneralName) fullNames.elementAt(i); + GeneralName fullName = (GeneralName) fullNames + .elementAt(i); if (fullName != null) { - sb.append(pp.indent(mIndentSize + 12) + fullName.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 12) + + fullName.toString() + "\n"); } } } if (relativeName != null) { - sb.append(pp.indent(mIndentSize + 8) + mResource.getString(PrettyPrintResources.TOKEN_RELATIVE_NAME) + - relativeName.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(PrettyPrintResources.TOKEN_RELATIVE_NAME) + + relativeName.toString() + "\n"); } } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_ONLY_USER_CERTS)); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_ONLY_USER_CERTS)); if (issuingDistributionPoint.getOnlyContainsUserCerts()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_YES) + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_NO) + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_ONLY_CA_CERTS)); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_ONLY_CA_CERTS)); if (issuingDistributionPoint.getOnlyContainsCACerts()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_YES) + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_NO) + "\n"); } - BitArray onlySomeReasons = issuingDistributionPoint.getOnlySomeReasons(); + BitArray onlySomeReasons = issuingDistributionPoint + .getOnlySomeReasons(); if (onlySomeReasons != null) { - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_ONLY_SOME_REASONS)); - sb.append("0x" + pp.toHexString(onlySomeReasons.toByteArray())); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_ONLY_SOME_REASONS)); + sb.append("0x" + + pp.toHexString(onlySomeReasons.toByteArray())); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString(PrettyPrintResources.TOKEN_INDIRECT_CRL)); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_INDIRECT_CRL)); if (issuingDistributionPoint.getIndirectCRL()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_YES) + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_NO) + "\n"); } } @@ -1304,24 +1567,29 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_INVALIDITY_DATE) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_INVALIDITY_DATE) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); InvalidityDateExtension ext = (InvalidityDateExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_DATE_OF_INVALIDITY) + - ext.getInvalidityDate().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_DATE_OF_INVALIDITY) + + ext.getInvalidityDate().toString() + "\n"); return sb.toString(); - } catch (Exception e) { + } catch (Exception e) { return ""; } } @@ -1333,35 +1601,43 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_CERTIFICATE_ISSUER) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_CERTIFICATE_ISSUER) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); CertificateIssuerExtension ext = (CertificateIssuerExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - GeneralNames issuerNames = (GeneralNames) ext.get( - CertificateIssuerExtension.CERTIFICATE_ISSUER); + GeneralNames issuerNames = (GeneralNames) ext + .get(CertificateIssuerExtension.CERTIFICATE_ISSUER); if (issuerNames != null) { - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_ISSUER_NAMES) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_ISSUER_NAMES) + + "\n"); for (int i = 0; i < issuerNames.size(); i++) { - GeneralName issuerName = (GeneralName) issuerNames.elementAt(i); + GeneralName issuerName = (GeneralName) issuerNames + .elementAt(i); if (issuerName != null) { String nameType = ""; if (issuerName.getType() == GeneralNameInterface.NAME_DIRECTORY) nameType = "DirectoryName: "; - sb.append(pp.indent(mIndentSize + 8) + nameType + issuerName.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + nameType + + issuerName.toString() + "\n"); } } } @@ -1379,24 +1655,29 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_HOLD_INSTRUCTION) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_HOLD_INSTRUCTION) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); HoldInstructionExtension ext = (HoldInstructionExtension) mExt; if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_HOLD_INSTRUCTION_CODE) + - ext.getHoldInstructionCodeDescription() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_HOLD_INSTRUCTION_CODE) + + ext.getHoldInstructionCodeDescription() + "\n"); return sb.toString(); - } catch (Exception e) { + } catch (Exception e) { return ""; } } @@ -1408,38 +1689,38 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append( - mResource.getString( - PrettyPrintResources.TOKEN_POLICY_CONSTRAINTS) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_POLICY_CONSTRAINTS) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } PolicyConstraintsExtension ext = (PolicyConstraintsExtension) mExt; int require = ext.getRequireExplicitMapping(); int inhibit = ext.getInhibitPolicyMapping(); - sb.append( - pp.indent(mIndentSize + 4) + - mResource.getString( - PrettyPrintResources.TOKEN_REQUIRE_EXPLICIT_POLICY) + - ((require == -1) ? - mResource.getString(PrettyPrintResources.TOKEN_NOT_SET) : - String.valueOf(require)) + "\n"); - sb.append( - pp.indent(mIndentSize + 4) + - mResource.getString( - PrettyPrintResources.TOKEN_INHIBIT_POLICY_MAPPING) + - ((inhibit == -1) ? - mResource.getString(PrettyPrintResources.TOKEN_NOT_SET) : - String.valueOf(inhibit)) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_REQUIRE_EXPLICIT_POLICY) + + ((require == -1) ? mResource + .getString(PrettyPrintResources.TOKEN_NOT_SET) + : String.valueOf(require)) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_INHIBIT_POLICY_MAPPING) + + ((inhibit == -1) ? mResource + .getString(PrettyPrintResources.TOKEN_NOT_SET) + : String.valueOf(inhibit)) + "\n"); return sb.toString(); } catch (Exception e) { return ""; @@ -1453,43 +1734,50 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_POLICY_MAPPINGS) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_POLICY_MAPPINGS) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } PolicyMappingsExtension ext = (PolicyMappingsExtension) mExt; Enumeration maps = ext.getMappings(); - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_MAPPINGS)); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_MAPPINGS)); if (maps == null || !maps.hasMoreElements()) { - sb.append( - mResource.getString(PrettyPrintResources.TOKEN_NONE) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NONE) + + "\n"); } else { sb.append("\n"); for (int i = 0; maps.hasMoreElements(); i++) { - sb.append(pp.indent(mIndentSize + 8) + - mResource.getString( - PrettyPrintResources.TOKEN_MAP) + i + ":" + "\n"); - CertificatePolicyMap m = - (CertificatePolicyMap) maps.nextElement(); - - sb.append(pp.indent(mIndentSize + 12) + - mResource.getString( - PrettyPrintResources.TOKEN_ISSUER_DOMAIN_POLICY) + - m.getIssuerIdentifier().getIdentifier().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 12) + - mResource.getString( - PrettyPrintResources.TOKEN_SUBJECT_DOMAIN_POLICY) + - m.getSubjectIdentifier().getIdentifier().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(PrettyPrintResources.TOKEN_MAP) + + i + ":" + "\n"); + CertificatePolicyMap m = (CertificatePolicyMap) maps + .nextElement(); + + sb.append(pp.indent(mIndentSize + 12) + + mResource + .getString(PrettyPrintResources.TOKEN_ISSUER_DOMAIN_POLICY) + + m.getIssuerIdentifier().getIdentifier() + .toString() + "\n"); + sb.append(pp.indent(mIndentSize + 12) + + mResource + .getString(PrettyPrintResources.TOKEN_SUBJECT_DOMAIN_POLICY) + + m.getSubjectIdentifier().getIdentifier() + .toString() + "\n"); } } return sb.toString(); @@ -1505,53 +1793,59 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_SUBJECT_DIR_ATTR) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_SUBJECT_DIR_ATTR) + + "- " + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (((Extension) mExt).isCritical()) { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - SubjectDirAttributesExtension ext = - (SubjectDirAttributesExtension) mExt; + SubjectDirAttributesExtension ext = (SubjectDirAttributesExtension) mExt; - sb.append(pp.indent(mIndentSize + 4) + - mResource.getString(PrettyPrintResources.TOKEN_ATTRIBUTES)); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_ATTRIBUTES)); Enumeration attrs = ext.getAttributesList(); if (attrs == null || !attrs.hasMoreElements()) { - sb.append( - mResource.getString(PrettyPrintResources.TOKEN_NONE) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NONE) + + "\n"); } else { sb.append("\n"); for (int j = 0; attrs.hasMoreElements(); j++) { Attribute attr = (Attribute) attrs.nextElement(); - sb.append(pp.indent(mIndentSize + 8) + - mResource.getString( - PrettyPrintResources.TOKEN_ATTRIBUTE) + j + ":" + "\n"); - sb.append(pp.indent(mIndentSize + 12) + - mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER) + - attr.getOid().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 12) + - mResource.getString( - PrettyPrintResources.TOKEN_VALUES)); + sb.append(pp.indent(mIndentSize + 8) + + mResource + .getString(PrettyPrintResources.TOKEN_ATTRIBUTE) + + j + ":" + "\n"); + sb.append(pp.indent(mIndentSize + 12) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER) + + attr.getOid().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 12) + + mResource + .getString(PrettyPrintResources.TOKEN_VALUES)); Enumeration values = attr.getValues(); if (values == null || !values.hasMoreElements()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NONE) + "\n"); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_NONE) + + "\n"); } else { for (int k = 0; values.hasMoreElements(); k++) { String v = (String) values.nextElement(); - if (k != 0) + if (k != 0) sb.append(","); sb.append(v); } @@ -1569,51 +1863,70 @@ public class ExtPrettyPrint { StringBuffer sb = new StringBuffer(); try { - sb.append(pp.indent(mIndentSize) + mResource.getString( - PrettyPrintResources.TOKEN_IDENTIFIER)); - sb.append(mResource.getString(PrettyPrintResources.TOKEN_CERT_POLICIES) + - "- " + mExt.getExtensionId().toString() + "\n"); - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CRITICAL)); + sb.append(pp.indent(mIndentSize) + + mResource + .getString(PrettyPrintResources.TOKEN_IDENTIFIER)); + sb.append(mResource + .getString(PrettyPrintResources.TOKEN_CERT_POLICIES) + + "- " + + mExt.getExtensionId().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource.getString(PrettyPrintResources.TOKEN_CRITICAL)); if (mExt.isCritical()) { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_YES) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_YES) + + "\n"); } else { - sb.append(mResource.getString( - PrettyPrintResources.TOKEN_NO) + "\n"); + sb.append(mResource.getString(PrettyPrintResources.TOKEN_NO) + + "\n"); } - sb.append(pp.indent(mIndentSize + 4) + mResource.getString( - PrettyPrintResources.TOKEN_CERT_POLICIES) + "\n"); + sb.append(pp.indent(mIndentSize + 4) + + mResource + .getString(PrettyPrintResources.TOKEN_CERT_POLICIES) + + "\n"); CertificatePoliciesExtension cp = (CertificatePoliciesExtension) mExt; Vector cpv = (Vector) cp.get("infos"); Enumeration e = cpv.elements(); if (e != null) { while (e.hasMoreElements()) { - CertificatePolicyInfo cpi = (CertificatePolicyInfo) e.nextElement(); + CertificatePolicyInfo cpi = (CertificatePolicyInfo) e + .nextElement(); - sb.append(pp.indent(mIndentSize + 8) + "Policy Identifier: " + cpi.getPolicyIdentifier().getIdentifier().toString() + "\n"); + sb.append(pp.indent(mIndentSize + 8) + + "Policy Identifier: " + + cpi.getPolicyIdentifier().getIdentifier() + .toString() + "\n"); PolicyQualifiers cpq = cpi.getPolicyQualifiers(); if (cpq != null) { - for (int i=0; i < cpq.size(); i++) { + for (int i = 0; i < cpq.size(); i++) { PolicyQualifierInfo pq = cpq.getInfoAt(i); Qualifier q = pq.getQualifier(); if (q instanceof CPSuri) { - sb.append(pp.indent(mIndentSize + 12) + "Policy Qualifier Identifier: CPS Pointer Qualifier - " - + pq.getId() + "\n"); - sb.append(pp.indent(mIndentSize + 12) + "Policy Qualifier Data: " + ((CPSuri) q).getURI() + "\n"); - } - else if (q instanceof UserNotice) { - sb.append(pp.indent(mIndentSize + 12) + "Policy Qualifier Identifier: CPS User Notice Qualifier - " - + pq.getId() + "\n"); - NoticeReference nref = ((UserNotice) q).getNoticeReference(); - DisplayText dt = ((UserNotice) q).getDisplayText(); - sb.append(pp.indent(mIndentSize +12) + "Policy Qualifier Data: \n"); - if (nref != null) { - sb.append(pp.indent(mIndentSize+16) + "Organization: " + nref.getOrganization().toString() + "\n" ); - sb.append(pp.indent(mIndentSize+16) + "Notice Numbers: " ); + sb.append(pp.indent(mIndentSize + 12) + + "Policy Qualifier Identifier: CPS Pointer Qualifier - " + + pq.getId() + "\n"); + sb.append(pp.indent(mIndentSize + 12) + + "Policy Qualifier Data: " + + ((CPSuri) q).getURI() + "\n"); + } else if (q instanceof UserNotice) { + sb.append(pp.indent(mIndentSize + 12) + + "Policy Qualifier Identifier: CPS User Notice Qualifier - " + + pq.getId() + "\n"); + NoticeReference nref = ((UserNotice) q) + .getNoticeReference(); + DisplayText dt = ((UserNotice) q) + .getDisplayText(); + sb.append(pp.indent(mIndentSize + 12) + + "Policy Qualifier Data: \n"); + if (nref != null) { + sb.append(pp.indent(mIndentSize + 16) + + "Organization: " + + nref.getOrganization().toString() + + "\n"); + sb.append(pp.indent(mIndentSize + 16) + + "Notice Numbers: "); int[] nums = nref.getNumbers(); - for (int k=0; k<nums.length; k++) { + for (int k = 0; k < nums.length; k++) { if (k != 0) { sb.append(","); sb.append(nums[k]); @@ -1624,9 +1937,11 @@ public class ExtPrettyPrint { sb.append("\n"); } if (dt != null) { - sb.append(pp.indent(mIndentSize+16) + "Explicit Text: " + dt.toString() + "\n"); + sb.append(pp.indent(mIndentSize + 16) + + "Explicit Text: " + dt.toString() + + "\n"); } - } + } } } } @@ -1637,6 +1952,4 @@ public class ExtPrettyPrint { } } - } - diff --git a/pki/base/util/src/netscape/security/util/ObjectIdentifier.java b/pki/base/util/src/netscape/security/util/ObjectIdentifier.java index 505db7a9b..f0fb59092 100644 --- a/pki/base/util/src/netscape/security/util/ObjectIdentifier.java +++ b/pki/base/util/src/netscape/security/util/ObjectIdentifier.java @@ -21,62 +21,59 @@ import java.io.IOException; import java.io.Serializable; import java.util.StringTokenizer; - /** * Represent an ISO Object Identifier. - * - * <P>Object Identifiers are arbitrary length hierarchical identifiers. - * The individual components are numbers, and they define paths from the - * root of an ISO-managed identifier space. You will sometimes see a - * string name used instead of (or in addition to) the numerical id. - * These are synonyms for the numerical IDs, but are not widely used - * since most sites do not know all the requisite strings, while all - * sites can parse the numeric forms. - * - * <P>So for example, JavaSoft has the sole authority to assign the - * meaning to identifiers below the 1.3.6.1.4.42.2.17 node in the - * hierarchy, and other organizations can easily acquire the ability - * to assign such unique identifiers. - * + * + * <P> + * Object Identifiers are arbitrary length hierarchical identifiers. The + * individual components are numbers, and they define paths from the root of an + * ISO-managed identifier space. You will sometimes see a string name used + * instead of (or in addition to) the numerical id. These are synonyms for the + * numerical IDs, but are not widely used since most sites do not know all the + * requisite strings, while all sites can parse the numeric forms. + * + * <P> + * So for example, JavaSoft has the sole authority to assign the meaning to + * identifiers below the 1.3.6.1.4.42.2.17 node in the hierarchy, and other + * organizations can easily acquire the ability to assign such unique + * identifiers. + * * @version 1.23 - * + * * @author David Brownell * @author Amit Kapoor * @author Hemma Prafullchandra */ -final public -class ObjectIdentifier implements Serializable -{ +final public class ObjectIdentifier implements Serializable { /** use serialVersionUID from JDK 1.1. for interoperability */ private static final long serialVersionUID = 8697030238860181294L; /** - * Constructs an object identifier from a string. This string - * should be of the form 1.23.34.45.56 etc. + * Constructs an object identifier from a string. This string should be of + * the form 1.23.34.45.56 etc. */ - public ObjectIdentifier (String oid) - { - if (oid == null) - return; - + public ObjectIdentifier(String oid) { + if (oid == null) + return; + int ch = '.'; - int start = 0; + int start = 0; int end = 0; - + // Calculate length of oid componentLen = 0; - while ((end = oid.indexOf(ch,start)) != -1) { + while ((end = oid.indexOf(ch, start)) != -1) { start = end + 1; componentLen += 1; } componentLen += 1; components = new int[componentLen]; - + start = 0; int i = 0; String comp = null; - while ((end = oid.indexOf(ch,start)) != -1) { - comp = oid.substring(start,end); + while ((end = oid.indexOf(ch, start)) != -1) { + comp = oid.substring(start, end); components[i++] = Integer.valueOf(comp).intValue(); start = end + 1; } @@ -85,271 +82,255 @@ class ObjectIdentifier implements Serializable } /** - * Constructs an object ID from an array of integers. This - * is used to construct constant object IDs. + * Constructs an object ID from an array of integers. This is used to + * construct constant object IDs. */ - public ObjectIdentifier (int values []) - { - try { - components = (int []) values.clone (); - componentLen = values.length; - } catch (Throwable t) { - System.out.println ("X509.ObjectIdentifier(), no cloning!"); - } + public ObjectIdentifier(int values[]) { + try { + components = (int[]) values.clone(); + componentLen = values.length; + } catch (Throwable t) { + System.out.println("X509.ObjectIdentifier(), no cloning!"); + } } - /** - * Constructs an object ID from an ASN.1 encoded input stream. - * The encoding of the ID in the stream uses "DER", a BER/1 subset. - * In this case, that means a triple { typeId, length, data }. - * - * <P><STRONG>NOTE:</STRONG> When an exception is thrown, the - * input stream has not been returned to its "initial" state. - * + * Constructs an object ID from an ASN.1 encoded input stream. The encoding + * of the ID in the stream uses "DER", a BER/1 subset. In this case, that + * means a triple { typeId, length, data }. + * + * <P> + * <STRONG>NOTE:</STRONG> When an exception is thrown, the input stream has + * not been returned to its "initial" state. + * * @param in DER-encoded data holding an object ID * @exception IOException indicates a decoding error */ - public ObjectIdentifier (DerInputStream in) - throws IOException - { - byte type_id; - int bufferEnd; - - /* - * Object IDs are a "universal" type, and their tag needs only - * one byte of encoding. Verify that the tag of this datum - * is that of an object ID. - * - * Then get and check the length of the ID's encoding. We set - * up so that we can use in.available() to check for the end of - * this value in the data stream. - */ - type_id = (byte) in.getByte (); - if (type_id != DerValue.tag_ObjectId) - throw new IOException ( - "X509.ObjectIdentifier() -- data isn't an object ID" - + " (tag = " + type_id + ")" - ); - - bufferEnd = in.available () - in.getLength () - 1; - if (bufferEnd < 0) - throw new IOException ( - "X509.ObjectIdentifier() -- not enough data"); - - initFromEncoding (in, bufferEnd); + public ObjectIdentifier(DerInputStream in) throws IOException { + byte type_id; + int bufferEnd; + + /* + * Object IDs are a "universal" type, and their tag needs only one byte + * of encoding. Verify that the tag of this datum is that of an object + * ID. + * + * Then get and check the length of the ID's encoding. We set up so that + * we can use in.available() to check for the end of this value in the + * data stream. + */ + type_id = (byte) in.getByte(); + if (type_id != DerValue.tag_ObjectId) + throw new IOException( + "X509.ObjectIdentifier() -- data isn't an object ID" + + " (tag = " + type_id + ")"); + + bufferEnd = in.available() - in.getLength() - 1; + if (bufferEnd < 0) + throw new IOException("X509.ObjectIdentifier() -- not enough data"); + + initFromEncoding(in, bufferEnd); } /* - * Build the OID from the rest of a DER input buffer; the tag - * and length have been removed/verified + * Build the OID from the rest of a DER input buffer; the tag and length + * have been removed/verified */ - ObjectIdentifier (DerInputBuffer buf) throws IOException - { - initFromEncoding (new DerInputStream (buf), 0); + ObjectIdentifier(DerInputBuffer buf) throws IOException { + initFromEncoding(new DerInputStream(buf), 0); } /* - * Helper function -- get the OID from a stream, after tag and - * length are verified. + * Helper function -- get the OID from a stream, after tag and length are + * verified. */ - private void initFromEncoding (DerInputStream in, int bufferEnd) - throws IOException - { - - /* - * Now get the components ("sub IDs") one at a time. We fill a - * temporary buffer, resizing it as needed. - */ - int component; - boolean first_subid = true; - - for (components = new int [allocationQuantum], componentLen = 0; - in.available () > bufferEnd; - ) { - component = getComponent (in); - - if (first_subid) { - int X, Y; - - /* - * The ISO root has three children (0, 1, 2) and those nodes - * aren't allowed to assign IDs larger than 39. These rules - * are memorialized by some special casing in the BER encoding - * of object IDs ... or maybe it's vice versa. - * - * NOTE: the allocation quantum is large enough that we know - * we don't have to reallocate here! - */ - if (component < 40) - X = 0; - else if (component < 80) - X = 1; - else - X = 2; - Y = component - ( X * 40); - - components [0] = X; - components [1] = Y; - componentLen = 2; - - first_subid = false; - - } else { - - /* - * Other components are encoded less exotically. The only - * potential trouble is the need to grow the array. - */ - if (componentLen >= components.length) { - int tmp_components []; - - tmp_components = new int [components.length - + allocationQuantum]; - System.arraycopy (components, 0, tmp_components, 0, - components.length); - components = tmp_components; - } - components [componentLen++] = component; - } - } - - /* - * Final sanity check -- if we didn't use exactly the number of bytes - * specified, something's quite wrong. - */ - if (in.available () != bufferEnd) { - throw new IOException ( - "X509.ObjectIdentifier() -- malformed input data"); - } - } + private void initFromEncoding(DerInputStream in, int bufferEnd) + throws IOException { + + /* + * Now get the components ("sub IDs") one at a time. We fill a temporary + * buffer, resizing it as needed. + */ + int component; + boolean first_subid = true; + + for (components = new int[allocationQuantum], componentLen = 0; in + .available() > bufferEnd;) { + component = getComponent(in); + + if (first_subid) { + int X, Y; + + /* + * The ISO root has three children (0, 1, 2) and those nodes + * aren't allowed to assign IDs larger than 39. These rules are + * memorialized by some special casing in the BER encoding of + * object IDs ... or maybe it's vice versa. + * + * NOTE: the allocation quantum is large enough that we know we + * don't have to reallocate here! + */ + if (component < 40) + X = 0; + else if (component < 80) + X = 1; + else + X = 2; + Y = component - (X * 40); + + components[0] = X; + components[1] = Y; + componentLen = 2; + + first_subid = false; + + } else { + + /* + * Other components are encoded less exotically. The only + * potential trouble is the need to grow the array. + */ + if (componentLen >= components.length) { + int tmp_components[]; + + tmp_components = new int[components.length + + allocationQuantum]; + System.arraycopy(components, 0, tmp_components, 0, + components.length); + components = tmp_components; + } + components[componentLen++] = component; + } + } + /* + * Final sanity check -- if we didn't use exactly the number of bytes + * specified, something's quite wrong. + */ + if (in.available() != bufferEnd) { + throw new IOException( + "X509.ObjectIdentifier() -- malformed input data"); + } + } /* * n.b. the only public interface is DerOutputStream.putOID() */ - void encode (DerOutputStream out) throws IOException - { - DerOutputStream bytes = new DerOutputStream (); - int i; - - bytes.write ((components [0] * 40) + components [1]); - for (i = 2; i < componentLen; i++) - putComponent (bytes, components [i]); - - /* - * Now that we've constructed the component, encode - * it in the stream we were given. - */ - out.write (DerValue.tag_ObjectId, bytes); + void encode(DerOutputStream out) throws IOException { + DerOutputStream bytes = new DerOutputStream(); + int i; + + bytes.write((components[0] * 40) + components[1]); + for (i = 2; i < componentLen; i++) + putComponent(bytes, components[i]); + + /* + * Now that we've constructed the component, encode it in the stream we + * were given. + */ + out.write(DerValue.tag_ObjectId, bytes); } /* - * Tricky OID component parsing technique ... note that one bit - * per octet is lost, this returns at most 28 bits of component. - * Also, notice this parses in big-endian format. + * Tricky OID component parsing technique ... note that one bit per octet is + * lost, this returns at most 28 bits of component. Also, notice this parses + * in big-endian format. */ - private static int getComponent (DerInputStream in) - throws IOException - { + private static int getComponent(DerInputStream in) throws IOException { int retval, i, tmp; - for (i = 0, retval = 0; i < 4; i++) { - retval <<= 7; - tmp = in.getByte (); - retval |= (tmp & 0x07f); - if ((tmp & 0x080) == 0) - return retval; - } + for (i = 0, retval = 0; i < 4; i++) { + retval <<= 7; + tmp = in.getByte(); + retval |= (tmp & 0x07f); + if ((tmp & 0x080) == 0) + return retval; + } - throw new IOException ("X509.OID, component value too big"); + throw new IOException("X509.OID, component value too big"); } /* - * Reverse of the above routine. Notice it needs to emit in - * big-endian form, so it buffers the output until it's ready. - * (Minimum length encoding is a DER requirement.) + * Reverse of the above routine. Notice it needs to emit in big-endian form, + * so it buffers the output until it's ready. (Minimum length encoding is a + * DER requirement.) */ - private static void putComponent (DerOutputStream out, int val) - throws IOException - { - int i; - byte buf [] = new byte [4] ; - - for (i = 0; i < 4; i++) { - buf [i] = (byte) (val & 0x07f); - val >>>= 7; - if (val == 0) - break; - } - for ( ; i > 0; --i) - out.write (buf [i] | 0x080); - out.write (buf [0]); + private static void putComponent(DerOutputStream out, int val) + throws IOException { + int i; + byte buf[] = new byte[4]; + + for (i = 0; i < 4; i++) { + buf[i] = (byte) (val & 0x07f); + val >>>= 7; + if (val == 0) + break; + } + for (; i > 0; --i) + out.write(buf[i] | 0x080); + out.write(buf[0]); } // XXX this API should probably facilitate the JDK sort utility /** - * Compares this identifier with another, for sorting purposes. - * An identifier does not precede itself. - * + * Compares this identifier with another, for sorting purposes. An + * identifier does not precede itself. + * * @param other identifer that may precede this one. - * @return true iff <em>other</em> precedes this one - * in a particular sorting order. + * @return true iff <em>other</em> precedes this one in a particular sorting + * order. */ - public boolean precedes (ObjectIdentifier other) - { - int i; - - // shorter IDs go first - if (other == this || componentLen < other.componentLen) - return false; - if (other.componentLen < componentLen) - return true; - - // for each component, the lesser component goes first - for (i = 0; i < componentLen; i++) { - if (other.components [i] < components [i]) - return true; - } - - // identical IDs don't precede each other - return false; + public boolean precedes(ObjectIdentifier other) { + int i; + + // shorter IDs go first + if (other == this || componentLen < other.componentLen) + return false; + if (other.componentLen < componentLen) + return true; + + // for each component, the lesser component goes first + for (i = 0; i < componentLen; i++) { + if (other.components[i] < components[i]) + return true; + } + + // identical IDs don't precede each other + return false; } - public boolean equals (Object other) - { - if (other instanceof ObjectIdentifier) - return equals ((ObjectIdentifier) other); - else - return false; + public boolean equals(Object other) { + if (other instanceof ObjectIdentifier) + return equals((ObjectIdentifier) other); + else + return false; } /** * Compares this identifier with another, for equality. - * + * * @return true iff the names are identical. */ - public boolean equals (ObjectIdentifier other) - { - int i; - - if (other == this) - return true; - if (componentLen != other.componentLen) - return false; - for (i = 0; i < componentLen; i++) { - if (components [i] != other.components [i]) - return false; - } - return true; + public boolean equals(ObjectIdentifier other) { + int i; + + if (other == this) + return true; + if (componentLen != other.componentLen) + return false; + for (i = 0; i < componentLen; i++) { + if (components[i] != other.components[i]) + return false; + } + return true; } public int hashCode() { - int h=0; - int oflow=0; + int h = 0; + int oflow = 0; - for (int i=0;i<componentLen;i++) { + for (int i = 0; i < componentLen; i++) { oflow = (h & 0xff800000) >> 23; h <<= 9; h += components[i]; @@ -359,90 +340,85 @@ class ObjectIdentifier implements Serializable } /** - * Returns a string form of the object ID. The format is the - * conventional "dot" notation for such IDs, without any - * user-friendly descriptive strings, since those strings - * will not be understood everywhere. + * Returns a string form of the object ID. The format is the conventional + * "dot" notation for such IDs, without any user-friendly descriptive + * strings, since those strings will not be understood everywhere. */ - public String toString () - { - String retval; - int i; - - for (i = 0, retval = ""; i < componentLen; i++) { - if (i != 0) - retval += "."; - retval += components [i]; - } - return retval; + public String toString() { + String retval; + int i; + + for (i = 0, retval = ""; i < componentLen; i++) { + if (i != 0) + retval += "."; + retval += components[i]; + } + return retval; } /* - * To simplify, we assume no individual component of an object ID is - * larger than 32 bits. Then we represent the path from the root as - * an array that's (usually) only filled at the beginning. + * To simplify, we assume no individual component of an object ID is larger + * than 32 bits. Then we represent the path from the root as an array that's + * (usually) only filled at the beginning. */ - private int components []; // path from root - private int componentLen; // how much is used. + private int components[]; // path from root + private int componentLen; // how much is used. - private static final int allocationQuantum = 5; // >= 2 + private static final int allocationQuantum = 5; // >= 2 /** - * Netscape Enhancement: - * This function implements a object identifier factory. It - * should help reduces in-memory Object Identifier object. - * This function also provide additional checking on the OID. - * A valid OID should start with 0, 1, or 2. - * - * Notes: - * This function never returns null. IOException is raised - * in error conditions. + * Netscape Enhancement: This function implements a object identifier + * factory. It should help reduces in-memory Object Identifier object. This + * function also provide additional checking on the OID. A valid OID should + * start with 0, 1, or 2. + * + * Notes: This function never returns null. IOException is raised in error + * conditions. */ public static java.util.Hashtable mOIDs = new java.util.Hashtable(); + public static ObjectIdentifier getObjectIdentifier(String oid) - throws IOException - { - int value; - - if (oid == null) - throw new IOException("empty object identifier"); - - oid = oid.trim(); - - ObjectIdentifier thisOID = (ObjectIdentifier)mOIDs.get(oid); - if (thisOID != null) - return thisOID; - - StringTokenizer token = new StringTokenizer(oid, "."); - value = new Integer(token.nextToken()).intValue(); - /* First token should be 0, 1, 2 */ - if (value >= 0 && value <= 2) { - value = new Integer(token.nextToken()).intValue(); - /* Second token should be 0 <= && >= 39 */ - if (value >= 0 && value <= 39) { - thisOID = new ObjectIdentifier(oid); - if (thisOID.toString().equals(oid)) { - mOIDs.put(oid, thisOID); - return thisOID; - } - throw new IOException("invalid oid " + oid); - } else - throw new IOException("invalid oid " + oid); - } else - throw new IOException("invalid oid " + oid); + throws IOException { + int value; + + if (oid == null) + throw new IOException("empty object identifier"); + + oid = oid.trim(); + + ObjectIdentifier thisOID = (ObjectIdentifier) mOIDs.get(oid); + if (thisOID != null) + return thisOID; + + StringTokenizer token = new StringTokenizer(oid, "."); + value = new Integer(token.nextToken()).intValue(); + /* First token should be 0, 1, 2 */ + if (value >= 0 && value <= 2) { + value = new Integer(token.nextToken()).intValue(); + /* Second token should be 0 <= && >= 39 */ + if (value >= 0 && value <= 39) { + thisOID = new ObjectIdentifier(oid); + if (thisOID.toString().equals(oid)) { + mOIDs.put(oid, thisOID); + return thisOID; + } + throw new IOException("invalid oid " + oid); + } else + throw new IOException("invalid oid " + oid); + } else + throw new IOException("invalid oid " + oid); } public static ObjectIdentifier getObjectIdentifier(int values[]) - throws IOException - { - String retval; - int i; - - for (i = 0, retval = ""; i < values.length; i++) { - if (i != 0) - retval += "."; - retval += values [i]; - } - return getObjectIdentifier(retval); + throws IOException { + String retval; + int i; + + for (i = 0, retval = ""; i < values.length; i++) { + if (i != 0) + retval += "."; + retval += values[i]; + } + return getObjectIdentifier(retval); } } diff --git a/pki/base/util/src/netscape/security/util/PrettyPrintFormat.java b/pki/base/util/src/netscape/security/util/PrettyPrintFormat.java index 94a5d18c7..d62c2d046 100644 --- a/pki/base/util/src/netscape/security/util/PrettyPrintFormat.java +++ b/pki/base/util/src/netscape/security/util/PrettyPrintFormat.java @@ -17,106 +17,100 @@ // --- END COPYRIGHT BLOCK --- package netscape.security.util; - /** - * This class will display the certificate content in predefined - * format. - * + * This class will display the certificate content in predefined format. + * * @author Andrew Wnuk * @version $Revision$, $Date$ */ public class PrettyPrintFormat { - /*========================================================== - * variables - *==========================================================*/ + /* + * ========================================================== variables + * ========================================================== + */ private String mSeparator = ""; - private int mIndentSize = 0; - private int mLineLen = 0; - - /*========================================================== - * constants - * - *==========================================================*/ - private final static String spaces= - " "+ - " "+ - " "+ - " "+ - " "; - - /*========================================================== - * constructors - *==========================================================*/ - - public PrettyPrintFormat(String separator) - { - mSeparator = separator; + private int mIndentSize = 0; + private int mLineLen = 0; + + /* + * ========================================================== constants + * + * ========================================================== + */ + private final static String spaces = " " + + " " + + " " + + " " + + " "; + + /* + * ========================================================== constructors + * ========================================================== + */ + + public PrettyPrintFormat(String separator) { + mSeparator = separator; } - public PrettyPrintFormat(String separator, int lineLen) - { - mSeparator = separator; - mLineLen = lineLen; + public PrettyPrintFormat(String separator, int lineLen) { + mSeparator = separator; + mLineLen = lineLen; } - public PrettyPrintFormat(String separator, int lineLen, int indentSize) - { - mSeparator = separator; - mLineLen = lineLen; - mIndentSize = indentSize; + public PrettyPrintFormat(String separator, int lineLen, int indentSize) { + mSeparator = separator; + mLineLen = lineLen; + mIndentSize = indentSize; } - /*========================================================== - * Private methods - *==========================================================*/ - - - /*========================================================== - * public methods - *==========================================================*/ + /* + * ========================================================== Private + * methods========================================================== + */ + + /* + * ========================================================== public methods + * ========================================================== + */ /** - * Provide white space indention - * stevep - speed improvements. Factor of 10 improvement + * Provide white space indention stevep - speed improvements. Factor of 10 + * improvement + * * @param numSpace number of white space to be returned * @return white spaces */ - public String indent(int size) { - return spaces.substring(0,size); - } - - private static final char[] hexdigits = { - '0','1','2','3','4','5','6','7','8','9', - 'A','B','C','D','E','F' - }; + public String indent(int size) { + return spaces.substring(0, size); + } + private static final char[] hexdigits = { '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; /** - * Convert Byte Array to Hex String Format - * stevep - speedup by factor of 8 + * Convert Byte Array to Hex String Format stevep - speedup by factor of 8 + * * @param byte array of data to hexify - * @param indentSize number of spaces to prepend before each line - * @param lineLen number of bytes to output on each line (0 - means: put everything on one line - * @param separator the first character of this string will be used as - the separator between bytes. + * @param indentSize number of spaces to prepend before each line + * @param lineLen number of bytes to output on each line (0 means: put + * everything on one line + * @param separator the first character of this string will be used as the + * separator between bytes. * @return string representation */ - public String toHexString(byte[] in, int indentSize, - int lineLen, String separator) - { + public String toHexString(byte[] in, int indentSize, int lineLen, + String separator) { StringBuffer sb = new StringBuffer(); int hexCount = 0; char c[]; - int j=0; + int j = 0; - if (lineLen ==0) { - c = new char[in.length*3+1]; - } - else { - c = new char[lineLen*3+1]; + if (lineLen == 0) { + c = new char[in.length * 3 + 1]; + } else { + c = new char[lineLen * 3 + 1]; } char sep = separator.charAt(0); @@ -125,16 +119,16 @@ public class PrettyPrintFormat { for (int i = 0; i < in.length; i++) { if (lineLen > 0 && hexCount == lineLen) { c[j++] = '\n'; - sb.append(c,0,j); + sb.append(c, 0, j); sb.append(indent(indentSize)); - hexCount =0; - j=0; + hexCount = 0; + j = 0; } byte x = in[i]; // output hex digits to buffer c[j++] = hexdigits[(char) ((x >> 4) & 0xf)]; - c[j++] = hexdigits[(char) (x&0xf)]; + c[j++] = hexdigits[(char) (x & 0xf)]; // if not last char, output separator if (i != in.length - 1) { @@ -143,25 +137,24 @@ public class PrettyPrintFormat { hexCount++; } - if (j>0) { + if (j > 0) { c[j++] = '\n'; - sb.append(c,0,j); + sb.append(c, 0, j); } -// sb.append("\n"); + // sb.append("\n"); return sb.toString(); } - public String toHexString(byte[] in, int indentSize, int lineLen) { - return toHexString(in,indentSize,lineLen,mSeparator); + return toHexString(in, indentSize, lineLen, mSeparator); } public String toHexString(byte[] in, int indentSize) { - return toHexString(in,indentSize,mLineLen); + return toHexString(in, indentSize, mLineLen); } public String toHexString(byte[] in) { - return toHexString(in,mIndentSize); - } + return toHexString(in, mIndentSize); + } } diff --git a/pki/base/util/src/netscape/security/util/PrettyPrintResources.java b/pki/base/util/src/netscape/security/util/PrettyPrintResources.java index 45b08206f..58ea4fee1 100644 --- a/pki/base/util/src/netscape/security/util/PrettyPrintResources.java +++ b/pki/base/util/src/netscape/security/util/PrettyPrintResources.java @@ -17,21 +17,19 @@ // --- END COPYRIGHT BLOCK --- package netscape.security.util; - import java.util.ListResourceBundle; import netscape.security.extensions.NSCertTypeExtension; import netscape.security.x509.KeyUsageExtension; - /** * Resource Boundle for the Pretty Print - * + * * @author Jack Pan-Chen * @version $Revision$, $Date$ */ -public class PrettyPrintResources extends ListResourceBundle { +public class PrettyPrintResources extends ListResourceBundle { /** * Returns content @@ -41,11 +39,10 @@ public class PrettyPrintResources extends ListResourceBundle { } /** - * Constants. The suffix represents the number of - * possible parameters. + * Constants. The suffix represents the number of possible parameters. */ - //certificate pretty print + // certificate pretty print public final static String TOKEN_CERTIFICATE = "tokenCertificate"; public final static String TOKEN_DATA = "tokenData"; public final static String TOKEN_VERSION = "tokenVersion"; @@ -64,14 +61,14 @@ public class PrettyPrintResources extends ListResourceBundle { public final static String TOKEN_EXTENSIONS = "tokenExtensions"; public final static String TOKEN_SIGNATURE = "tokenSignature"; - //extension pretty print + // extension pretty print public final static String TOKEN_YES = "tokenYes"; public final static String TOKEN_NO = "tokenNo"; public final static String TOKEN_IDENTIFIER = "tokenIdentifier"; public final static String TOKEN_CRITICAL = "tokenCritical"; public final static String TOKEN_VALUE = "tokenValue"; - //specific extension token + // specific extension token public final static String TOKEN_KEY_TYPE = "tokenKeyType"; public final static String TOKEN_CERT_TYPE = "tokenCertType"; public final static String TOKEN_SKI = "tokenSKI"; @@ -178,126 +175,115 @@ public class PrettyPrintResources extends ListResourceBundle { public final static String TOKEN_CACHE_NOT_AVAILABLE = "cacheNotAvailable"; public final static String TOKEN_CACHE_IS_EMPTY = "cacheIsEmpty"; - //Tokens should have blank_space as trailer + // Tokens should have blank_space as trailer static final Object[][] contents = { - {TOKEN_CERTIFICATE, "Certificate: "}, - {TOKEN_DATA, "Data: "}, - {TOKEN_VERSION, "Version: "}, - {TOKEN_SERIAL, "Serial Number: "}, - {TOKEN_SIGALG, "Signature Algorithm: "}, - {TOKEN_ISSUER, "Issuer: "}, - {TOKEN_VALIDITY, "Validity: "}, - {TOKEN_NOT_BEFORE, "Not Before: "}, - {TOKEN_NOT_AFTER, "Not After: "}, - {TOKEN_SUBJECT, "Subject: "}, - {TOKEN_SPKI, "Subject Public Key Info: "}, - {TOKEN_ALGORITHM, "Algorithm: "}, - {TOKEN_PUBLIC_KEY, "Public Key: "}, - {TOKEN_PUBLIC_KEY_MODULUS, "Public Key Modulus: "}, - {TOKEN_PUBLIC_KEY_EXPONENT, "Exponent: "}, - {TOKEN_EXTENSIONS, "Extensions: "}, - {TOKEN_SIGNATURE, "Signature: "}, - {TOKEN_YES, "yes "}, - {TOKEN_NO, "no "}, - {TOKEN_IDENTIFIER, "Identifier: "}, - {TOKEN_CRITICAL, "Critical: "}, - {TOKEN_VALUE, "Value: "}, - {TOKEN_KEY_TYPE, "Key Type "}, - {TOKEN_CERT_TYPE, "Netscape Certificate Type "}, - {TOKEN_SKI, "Subject Key Identifier "}, - {TOKEN_AKI, "Authority Key Identifier "}, - {TOKEN_ACCESS_DESC, "Access Description: "}, - {TOKEN_OCSP_NOCHECK, "OCSP NoCheck: "}, - {TOKEN_EXTENDED_KEY_USAGE, "Extended Key Usage: "}, - {TOKEN_PRIVATE_KEY_USAGE, "Private Key Usage: "}, - {TOKEN_PRESENCE_SERVER, "Presence Server: "}, - {TOKEN_AIA, "Authority Info Access: "}, - {TOKEN_CERT_POLICIES, "Certificate Policies: "}, - {TOKEN_SIA, "Subject Info Access: "}, - {TOKEN_KEY_USAGE, "Key Usage: "}, - {KeyUsageExtension.DIGITAL_SIGNATURE, "Digital Signature "}, - {KeyUsageExtension.NON_REPUDIATION, "Non Repudiation "}, - {KeyUsageExtension.KEY_ENCIPHERMENT, "Key Encipherment "}, - {KeyUsageExtension.DATA_ENCIPHERMENT, "Data Encipherment "}, - {KeyUsageExtension.KEY_AGREEMENT, "Key Agreement "}, - {KeyUsageExtension.KEY_CERTSIGN, "Key CertSign "}, - {KeyUsageExtension.CRL_SIGN, "Crl Sign "}, - {KeyUsageExtension.ENCIPHER_ONLY, "Encipher Only "}, - {KeyUsageExtension.DECIPHER_ONLY, "Decipher Only "}, - {TOKEN_CERT_USAGE, "Certificate Usage: "}, - {NSCertTypeExtension.SSL_CLIENT, "SSL Client "}, - {NSCertTypeExtension.SSL_SERVER, "SSL Server "}, - {NSCertTypeExtension.EMAIL, "Secure Email "}, - {NSCertTypeExtension.OBJECT_SIGNING, "Object Signing "}, - {NSCertTypeExtension.SSL_CA, "SSL CA "}, - {NSCertTypeExtension.EMAIL_CA, "Secure Email CA "}, - {NSCertTypeExtension.OBJECT_SIGNING_CA, "ObjectSigning CA "}, - {TOKEN_KEY_ID, "Key Identifier: "}, - {TOKEN_AUTH_NAME, "Authority Name: "}, - {TOKEN_CRL, "Certificate Revocation List: "}, - {TOKEN_THIS_UPDATE, "This Update: "}, - {TOKEN_NEXT_UPDATE, "Next Update: "}, - {TOKEN_REVOKED_CERTIFICATES, "Revoked Certificates: "}, - {TOKEN_REVOCATION_DATE, "Revocation Date: "}, - {TOKEN_REVOCATION_REASON, "Revocation Reason "}, - {TOKEN_REASON, "Reason: "}, - {TOKEN_BASIC_CONSTRAINTS, "Basic Constraints "}, - {TOKEN_NAME_CONSTRAINTS, "Name Constraints "}, - {TOKEN_NSC_COMMENT, "Netscape Comment "}, - {TOKEN_IS_CA, "Is CA: "}, - {TOKEN_PATH_LEN, "Path Length Constraint: "}, - {TOKEN_PATH_LEN_UNLIMITED, "UNLIMITED"}, - {TOKEN_PATH_LEN_UNDEFINED, "UNDEFINED"}, - {TOKEN_PATH_LEN_INVALID, "INVALID"}, - {TOKEN_CRL_NUMBER, "CRL Number "}, - {TOKEN_NUMBER, "Number: "}, - {TOKEN_DELTA_CRL_INDICATOR, "Delta CRL Indicator "}, - {TOKEN_BASE_CRL_NUMBER, "Base CRL Number: "}, - {TOKEN_CERT_SCOPE_OF_USE, "Certificate Scope of Use "}, - {TOKEN_SCOPE_OF_USE, "Scope of Use: "}, - {TOKEN_PORT, "Port: "}, - {TOKEN_ISSUER_ALT_NAME, "Issuer Alternative Name "}, - {TOKEN_ISSUER_NAMES, "Issuer Names: "}, - {TOKEN_SUBJECT_ALT_NAME, "Subject Alternative Name "}, - {TOKEN_DECODING_ERROR, "Decoding Error"}, - {TOKEN_FRESHEST_CRL_EXT, "Freshest CRL "}, - {TOKEN_INHIBIT_ANY_POLICY_EXT, "Inhibit Any-Policy "}, - {TOKEN_SKIP_CERTS, "Skip Certs: "}, - {TOKEN_CRL_DP_EXT, "CRL Distribution Points "}, - {TOKEN_CRLDP_NUMPOINTS, "Number of Points: "}, - {TOKEN_CRLDP_POINTN, "Point "}, - {TOKEN_CRLDP_DISTPOINT, "Distribution Point: "}, - {TOKEN_CRLDP_REASONS, "Reason Flags: "}, - {TOKEN_CRLDP_CRLISSUER, "CRL Issuer: "}, - {TOKEN_ISSUING_DIST_POINT, "Issuing Distribution Point "}, - {TOKEN_DIST_POINT_NAME, "Distribution Point: "}, - {TOKEN_FULL_NAME, "Full Name: "}, - {TOKEN_RELATIVE_NAME, "Name Relative To CRL Issuer: "}, - {TOKEN_ONLY_USER_CERTS, "Only Contains User Certificates: "}, - {TOKEN_ONLY_CA_CERTS, "Only Contains CA Certificates: "}, - {TOKEN_ONLY_SOME_REASONS, "Only Some Reasons: "}, - {TOKEN_INDIRECT_CRL, "Indirect CRL: "}, - {TOKEN_INVALIDITY_DATE, "Invalidity Date "}, - {TOKEN_DATE_OF_INVALIDITY, "Invalidity Date: "}, - {TOKEN_CERTIFICATE_ISSUER, "Certificate Issuer "}, - {TOKEN_HOLD_INSTRUCTION, "Hold Instruction Code "}, - {TOKEN_HOLD_INSTRUCTION_CODE, "Hold Instruction Code: "}, - {TOKEN_POLICY_CONSTRAINTS, "Policy Constraints "}, - {TOKEN_INHIBIT_POLICY_MAPPING, "Inhibit Policy Mapping: "}, - {TOKEN_REQUIRE_EXPLICIT_POLICY, "Require Explicit Policy: "}, - {TOKEN_POLICY_MAPPINGS, "Policy Mappings "}, - {TOKEN_MAPPINGS, "Mappings: "}, - {TOKEN_MAP, "Map "}, - {TOKEN_ISSUER_DOMAIN_POLICY, "Issuer Domain Policy: "}, - {TOKEN_SUBJECT_DOMAIN_POLICY, "Subject Domain Policy: "}, - {TOKEN_SUBJECT_DIR_ATTR, "Subject Directory Attributes "}, - {TOKEN_ATTRIBUTES, "Attributes:" }, - {TOKEN_ATTRIBUTE, "Attribute "}, - {TOKEN_VALUES, "Values: "}, - {TOKEN_NOT_SET, "not set"}, - {TOKEN_NONE, "none"}, - {TOKEN_CACHE_NOT_AVAILABLE, "CRL cache is not available. "}, - {TOKEN_CACHE_IS_EMPTY, "CRL cache is empty. "}, - }; + { TOKEN_CERTIFICATE, "Certificate: " }, { TOKEN_DATA, "Data: " }, + { TOKEN_VERSION, "Version: " }, + { TOKEN_SERIAL, "Serial Number: " }, + { TOKEN_SIGALG, "Signature Algorithm: " }, + { TOKEN_ISSUER, "Issuer: " }, { TOKEN_VALIDITY, "Validity: " }, + { TOKEN_NOT_BEFORE, "Not Before: " }, + { TOKEN_NOT_AFTER, "Not After: " }, + { TOKEN_SUBJECT, "Subject: " }, + { TOKEN_SPKI, "Subject Public Key Info: " }, + { TOKEN_ALGORITHM, "Algorithm: " }, + { TOKEN_PUBLIC_KEY, "Public Key: " }, + { TOKEN_PUBLIC_KEY_MODULUS, "Public Key Modulus: " }, + { TOKEN_PUBLIC_KEY_EXPONENT, "Exponent: " }, + { TOKEN_EXTENSIONS, "Extensions: " }, + { TOKEN_SIGNATURE, "Signature: " }, { TOKEN_YES, "yes " }, + { TOKEN_NO, "no " }, { TOKEN_IDENTIFIER, "Identifier: " }, + { TOKEN_CRITICAL, "Critical: " }, { TOKEN_VALUE, "Value: " }, + { TOKEN_KEY_TYPE, "Key Type " }, + { TOKEN_CERT_TYPE, "Netscape Certificate Type " }, + { TOKEN_SKI, "Subject Key Identifier " }, + { TOKEN_AKI, "Authority Key Identifier " }, + { TOKEN_ACCESS_DESC, "Access Description: " }, + { TOKEN_OCSP_NOCHECK, "OCSP NoCheck: " }, + { TOKEN_EXTENDED_KEY_USAGE, "Extended Key Usage: " }, + { TOKEN_PRIVATE_KEY_USAGE, "Private Key Usage: " }, + { TOKEN_PRESENCE_SERVER, "Presence Server: " }, + { TOKEN_AIA, "Authority Info Access: " }, + { TOKEN_CERT_POLICIES, "Certificate Policies: " }, + { TOKEN_SIA, "Subject Info Access: " }, + { TOKEN_KEY_USAGE, "Key Usage: " }, + { KeyUsageExtension.DIGITAL_SIGNATURE, "Digital Signature " }, + { KeyUsageExtension.NON_REPUDIATION, "Non Repudiation " }, + { KeyUsageExtension.KEY_ENCIPHERMENT, "Key Encipherment " }, + { KeyUsageExtension.DATA_ENCIPHERMENT, "Data Encipherment " }, + { KeyUsageExtension.KEY_AGREEMENT, "Key Agreement " }, + { KeyUsageExtension.KEY_CERTSIGN, "Key CertSign " }, + { KeyUsageExtension.CRL_SIGN, "Crl Sign " }, + { KeyUsageExtension.ENCIPHER_ONLY, "Encipher Only " }, + { KeyUsageExtension.DECIPHER_ONLY, "Decipher Only " }, + { TOKEN_CERT_USAGE, "Certificate Usage: " }, + { NSCertTypeExtension.SSL_CLIENT, "SSL Client " }, + { NSCertTypeExtension.SSL_SERVER, "SSL Server " }, + { NSCertTypeExtension.EMAIL, "Secure Email " }, + { NSCertTypeExtension.OBJECT_SIGNING, "Object Signing " }, + { NSCertTypeExtension.SSL_CA, "SSL CA " }, + { NSCertTypeExtension.EMAIL_CA, "Secure Email CA " }, + { NSCertTypeExtension.OBJECT_SIGNING_CA, "ObjectSigning CA " }, + { TOKEN_KEY_ID, "Key Identifier: " }, + { TOKEN_AUTH_NAME, "Authority Name: " }, + { TOKEN_CRL, "Certificate Revocation List: " }, + { TOKEN_THIS_UPDATE, "This Update: " }, + { TOKEN_NEXT_UPDATE, "Next Update: " }, + { TOKEN_REVOKED_CERTIFICATES, "Revoked Certificates: " }, + { TOKEN_REVOCATION_DATE, "Revocation Date: " }, + { TOKEN_REVOCATION_REASON, "Revocation Reason " }, + { TOKEN_REASON, "Reason: " }, + { TOKEN_BASIC_CONSTRAINTS, "Basic Constraints " }, + { TOKEN_NAME_CONSTRAINTS, "Name Constraints " }, + { TOKEN_NSC_COMMENT, "Netscape Comment " }, + { TOKEN_IS_CA, "Is CA: " }, + { TOKEN_PATH_LEN, "Path Length Constraint: " }, + { TOKEN_PATH_LEN_UNLIMITED, "UNLIMITED" }, + { TOKEN_PATH_LEN_UNDEFINED, "UNDEFINED" }, + { TOKEN_PATH_LEN_INVALID, "INVALID" }, + { TOKEN_CRL_NUMBER, "CRL Number " }, { TOKEN_NUMBER, "Number: " }, + { TOKEN_DELTA_CRL_INDICATOR, "Delta CRL Indicator " }, + { TOKEN_BASE_CRL_NUMBER, "Base CRL Number: " }, + { TOKEN_CERT_SCOPE_OF_USE, "Certificate Scope of Use " }, + { TOKEN_SCOPE_OF_USE, "Scope of Use: " }, { TOKEN_PORT, "Port: " }, + { TOKEN_ISSUER_ALT_NAME, "Issuer Alternative Name " }, + { TOKEN_ISSUER_NAMES, "Issuer Names: " }, + { TOKEN_SUBJECT_ALT_NAME, "Subject Alternative Name " }, + { TOKEN_DECODING_ERROR, "Decoding Error" }, + { TOKEN_FRESHEST_CRL_EXT, "Freshest CRL " }, + { TOKEN_INHIBIT_ANY_POLICY_EXT, "Inhibit Any-Policy " }, + { TOKEN_SKIP_CERTS, "Skip Certs: " }, + { TOKEN_CRL_DP_EXT, "CRL Distribution Points " }, + { TOKEN_CRLDP_NUMPOINTS, "Number of Points: " }, + { TOKEN_CRLDP_POINTN, "Point " }, + { TOKEN_CRLDP_DISTPOINT, "Distribution Point: " }, + { TOKEN_CRLDP_REASONS, "Reason Flags: " }, + { TOKEN_CRLDP_CRLISSUER, "CRL Issuer: " }, + { TOKEN_ISSUING_DIST_POINT, "Issuing Distribution Point " }, + { TOKEN_DIST_POINT_NAME, "Distribution Point: " }, + { TOKEN_FULL_NAME, "Full Name: " }, + { TOKEN_RELATIVE_NAME, "Name Relative To CRL Issuer: " }, + { TOKEN_ONLY_USER_CERTS, "Only Contains User Certificates: " }, + { TOKEN_ONLY_CA_CERTS, "Only Contains CA Certificates: " }, + { TOKEN_ONLY_SOME_REASONS, "Only Some Reasons: " }, + { TOKEN_INDIRECT_CRL, "Indirect CRL: " }, + { TOKEN_INVALIDITY_DATE, "Invalidity Date " }, + { TOKEN_DATE_OF_INVALIDITY, "Invalidity Date: " }, + { TOKEN_CERTIFICATE_ISSUER, "Certificate Issuer " }, + { TOKEN_HOLD_INSTRUCTION, "Hold Instruction Code " }, + { TOKEN_HOLD_INSTRUCTION_CODE, "Hold Instruction Code: " }, + { TOKEN_POLICY_CONSTRAINTS, "Policy Constraints " }, + { TOKEN_INHIBIT_POLICY_MAPPING, "Inhibit Policy Mapping: " }, + { TOKEN_REQUIRE_EXPLICIT_POLICY, "Require Explicit Policy: " }, + { TOKEN_POLICY_MAPPINGS, "Policy Mappings " }, + { TOKEN_MAPPINGS, "Mappings: " }, { TOKEN_MAP, "Map " }, + { TOKEN_ISSUER_DOMAIN_POLICY, "Issuer Domain Policy: " }, + { TOKEN_SUBJECT_DOMAIN_POLICY, "Subject Domain Policy: " }, + { TOKEN_SUBJECT_DIR_ATTR, "Subject Directory Attributes " }, + { TOKEN_ATTRIBUTES, "Attributes:" }, + { TOKEN_ATTRIBUTE, "Attribute " }, { TOKEN_VALUES, "Values: " }, + { TOKEN_NOT_SET, "not set" }, { TOKEN_NONE, "none" }, + { TOKEN_CACHE_NOT_AVAILABLE, "CRL cache is not available. " }, + { TOKEN_CACHE_IS_EMPTY, "CRL cache is empty. " }, }; } diff --git a/pki/base/util/src/netscape/security/util/PubKeyPrettyPrint.java b/pki/base/util/src/netscape/security/util/PubKeyPrettyPrint.java index 669e4c222..8a8ac3ea9 100644 --- a/pki/base/util/src/netscape/security/util/PubKeyPrettyPrint.java +++ b/pki/base/util/src/netscape/security/util/PubKeyPrettyPrint.java @@ -17,7 +17,6 @@ // --- END COPYRIGHT BLOCK --- package netscape.security.util; - import java.security.PublicKey; import java.util.Locale; import java.util.ResourceBundle; @@ -25,42 +24,43 @@ import java.util.ResourceBundle; import netscape.security.provider.RSAPublicKey; import netscape.security.x509.X509Key; - /** - * This class will display the certificate content in predefined - * format. - * + * This class will display the certificate content in predefined format. + * * @author Jack Pan-Chen * @author Andrew Wnuk * @version $Revision$, $Date$ */ public class PubKeyPrettyPrint { - /*========================================================== - * variables - *==========================================================*/ + /* + * ========================================================== variables + * ========================================================== + */ private X509Key mX509Key = null; private PrettyPrintFormat pp = null; - /*========================================================== - * constructors - *==========================================================*/ + /* + * ========================================================== constructors + * ========================================================== + */ public PubKeyPrettyPrint(PublicKey key) { if (key instanceof X509Key) mX509Key = (X509Key) key; - + pp = new PrettyPrintFormat(":"); } - /*========================================================== - * public methods - *==========================================================*/ + /* + * ========================================================== public methods + * ========================================================== + */ /** - * This method return string representation of the certificate - * in predefined format using specified client local. I18N Support. - * + * This method return string representation of the certificate in predefined + * format using specified client local. I18N Support. + * * @param clientLocale Locale to be used for localization * @return string representation of the certificate */ @@ -71,39 +71,41 @@ public class PubKeyPrettyPrint { else return null; } - - public String X509toString(Locale clientLocale, int indentSize, int lineLen) { + public String X509toString(Locale clientLocale, int indentSize, int lineLen) { - //get I18N resources - ResourceBundle resource = ResourceBundle.getBundle( - PrettyPrintResources.class.getName()); + // get I18N resources + ResourceBundle resource = ResourceBundle + .getBundle(PrettyPrintResources.class.getName()); StringBuffer sb = new StringBuffer(); try { String alg = mX509Key.getAlgorithm(); - //XXX I18N Algorithm Name ? - sb.append(pp.indent(indentSize) + resource.getString( - PrettyPrintResources.TOKEN_ALGORITHM) + - alg + " - " + - mX509Key.getAlgorithmId().getOID().toString() + "\n"); + // XXX I18N Algorithm Name ? + sb.append(pp.indent(indentSize) + + resource.getString(PrettyPrintResources.TOKEN_ALGORITHM) + + alg + " - " + + mX509Key.getAlgorithmId().getOID().toString() + "\n"); if (alg.equals("RSA")) { RSAPublicKey rsakey = new RSAPublicKey(mX509Key.getEncoded()); - sb.append(pp.indent(indentSize) + resource.getString( - PrettyPrintResources.TOKEN_PUBLIC_KEY) + "\n"); - sb.append(pp.indent(indentSize + 4) + resource.getString( - PrettyPrintResources.TOKEN_PUBLIC_KEY_EXPONENT) + - rsakey.getPublicExponent().toInt() + "\n"); - sb.append(pp.indent(indentSize + 4) + resource.getString( - PrettyPrintResources.TOKEN_PUBLIC_KEY_MODULUS) + - "(" + rsakey.getKeySize() + " bits) :\n"); - sb.append(pp.toHexString( - rsakey.getModulus().toByteArray(), + sb.append(pp.indent(indentSize) + + resource + .getString(PrettyPrintResources.TOKEN_PUBLIC_KEY) + + "\n"); + sb.append(pp.indent(indentSize + 4) + + resource + .getString(PrettyPrintResources.TOKEN_PUBLIC_KEY_EXPONENT) + + rsakey.getPublicExponent().toInt() + "\n"); + sb.append(pp.indent(indentSize + 4) + + resource + .getString(PrettyPrintResources.TOKEN_PUBLIC_KEY_MODULUS) + + "(" + rsakey.getKeySize() + " bits) :\n"); + sb.append(pp.toHexString(rsakey.getModulus().toByteArray(), indentSize + 8, lineLen)); } else { @@ -111,9 +113,12 @@ public class PubKeyPrettyPrint { // the DSAParams (PQG) is not fully decoded. // So, we just print the entire public key blob - sb.append(pp.indent(indentSize) + resource.getString( - PrettyPrintResources.TOKEN_PUBLIC_KEY) + "\n"); - sb.append(pp.toHexString(mX509Key.getKey(), indentSize + 4, lineLen)); + sb.append(pp.indent(indentSize) + + resource + .getString(PrettyPrintResources.TOKEN_PUBLIC_KEY) + + "\n"); + sb.append(pp.toHexString(mX509Key.getKey(), indentSize + 4, + lineLen)); } } catch (Exception e) { |