diff options
Diffstat (limited to 'pki/base/util/src/netscape/security/util/DerValue.java')
-rw-r--r-- | pki/base/util/src/netscape/security/util/DerValue.java | 726 |
1 files changed, 360 insertions, 366 deletions
diff --git a/pki/base/util/src/netscape/security/util/DerValue.java b/pki/base/util/src/netscape/security/util/DerValue.java index 58ef8ecc..3a39bbde 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) { |