Latest bnd code
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1350613 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundleplugin/src/main/java/aQute/libg/asn1/BER.java b/bundleplugin/src/main/java/aQute/libg/asn1/BER.java
index 4416dd4..bde15aa 100644
--- a/bundleplugin/src/main/java/aQute/libg/asn1/BER.java
+++ b/bundleplugin/src/main/java/aQute/libg/asn1/BER.java
@@ -5,468 +5,463 @@
import java.util.*;
public class BER implements Types {
- DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss\\Z");
-
- final DataInputStream xin;
- long position;
+ DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss\\Z");
- public BER(InputStream in) {
- this.xin = new DataInputStream(in);
- }
+ final DataInputStream xin;
+ long position;
- public void dump(PrintStream out) throws Exception {
- int type = readByte();
- long length = readLength();
- if (type == -1 || length == -1)
- throw new EOFException("Empty file");
- dump(out, type, length, "");
- }
+ public BER(InputStream in) {
+ this.xin = new DataInputStream(in);
+ }
- void dump(PrintStream out, int type, long length, String indent)
- throws Exception {
- int clss = type >> 6;
- int nmbr = type & 0x1F;
- boolean cnst = (type & 0x20) != 0;
+ public void dump(PrintStream out) throws Exception {
+ int type = readByte();
+ long length = readLength();
+ if (type == -1 || length == -1)
+ throw new EOFException("Empty file");
+ dump(out, type, length, "");
+ }
- String tag = "[" + nmbr + "]";
- if (clss == 0)
- tag = TAGS[nmbr];
+ void dump(PrintStream out, int type, long length, String indent) throws Exception {
+ int clss = type >> 6;
+ int nmbr = type & 0x1F;
+ boolean cnst = (type & 0x20) != 0;
- if (cnst) {
- System.err.printf("%5d %s %s %s%n", length, indent, CLASSES[clss],
- tag);
- while (length > 1) {
- long atStart = getPosition();
- int t2 = read();
- long l2 = readLength();
- dump(out, t2, l2, indent + " ");
- length -= getPosition() - atStart;
- }
- } else {
- assert length < Integer.MAX_VALUE;
- assert length >= 0;
- byte[] data = new byte[(int) length];
- readFully(data);
- String summary;
+ String tag = "[" + nmbr + "]";
+ if (clss == 0)
+ tag = TAGS[nmbr];
- switch (nmbr) {
- case BOOLEAN:
- assert length == 1;
- summary = data[0] != 0 ? "true" : "false";
- break;
+ if (cnst) {
+ System.err.printf("%5d %s %s %s%n", length, indent, CLASSES[clss], tag);
+ while (length > 1) {
+ long atStart = getPosition();
+ int t2 = read();
+ long l2 = readLength();
+ dump(out, t2, l2, indent + " ");
+ length -= getPosition() - atStart;
+ }
+ } else {
+ assert length < Integer.MAX_VALUE;
+ assert length >= 0;
+ byte[] data = new byte[(int) length];
+ readFully(data);
+ String summary;
- case INTEGER:
- long n = toLong(data);
- summary = n + "";
- break;
+ switch (nmbr) {
+ case BOOLEAN :
+ assert length == 1;
+ summary = data[0] != 0 ? "true" : "false";
+ break;
- case UTF8_STRING:
- case IA5STRING:
- case VISIBLE_STRING:
- case UNIVERSAL_STRING:
- case PRINTABLE_STRING:
- case UTCTIME:
- summary = new String(data, "UTF-8");
- break;
+ case INTEGER :
+ long n = toLong(data);
+ summary = n + "";
+ break;
- case OBJECT_IDENTIFIER:
- summary = readOID(data);
- break;
+ case UTF8_STRING :
+ case IA5STRING :
+ case VISIBLE_STRING :
+ case UNIVERSAL_STRING :
+ case PRINTABLE_STRING :
+ case UTCTIME :
+ summary = new String(data, "UTF-8");
+ break;
- case GENERALIZED_TIME:
- case GRAPHIC_STRING:
- case GENERAL_STRING:
- case CHARACTER_STRING:
+ case OBJECT_IDENTIFIER :
+ summary = readOID(data);
+ break;
- case REAL:
- case EOC:
- case BIT_STRING:
- case OCTET_STRING:
- case NULL:
- case OBJECT_DESCRIPTOR:
- case EXTERNAL:
- case ENUMERATED:
- case EMBEDDED_PDV:
- case RELATIVE_OID:
- case NUMERIC_STRING:
- case T61_STRING:
- case VIDEOTEX_STRING:
- case BMP_STRING:
- default:
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < 10 && i < data.length; i++) {
- sb.append(Integer.toHexString(data[i]));
- }
- if (data.length > 10) {
- sb.append("...");
- }
- summary = sb.toString();
- break;
- }
- out.printf("%5d %s %s %s %s\n", length, indent, CLASSES[clss], tag,
- summary);
- }
- }
+ case GENERALIZED_TIME :
+ case GRAPHIC_STRING :
+ case GENERAL_STRING :
+ case CHARACTER_STRING :
- long toLong(byte[] data) {
- if (data[0] < 0) {
- for (int i = 0; i < data.length; i++)
- data[i] = (byte) (0xFF ^ data[i]);
+ case REAL :
+ case EOC :
+ case BIT_STRING :
+ case OCTET_STRING :
+ case NULL :
+ case OBJECT_DESCRIPTOR :
+ case EXTERNAL :
+ case ENUMERATED :
+ case EMBEDDED_PDV :
+ case RELATIVE_OID :
+ case NUMERIC_STRING :
+ case T61_STRING :
+ case VIDEOTEX_STRING :
+ case BMP_STRING :
+ default :
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < 10 && i < data.length; i++) {
+ sb.append(Integer.toHexString(data[i]));
+ }
+ if (data.length > 10) {
+ sb.append("...");
+ }
+ summary = sb.toString();
+ break;
+ }
+ out.printf("%5d %s %s %s %s\n", length, indent, CLASSES[clss], tag, summary);
+ }
+ }
- return -(toLong(data) + 1);
- }
- long n = 0;
- for (int i = 0; i < data.length; i++) {
- n = n * 256 + data[i];
- }
- return n;
- }
+ long toLong(byte[] data) {
+ if (data[0] < 0) {
+ for (int i = 0; i < data.length; i++)
+ data[i] = (byte) (0xFF ^ data[i]);
- /**
- * 8.1.3.3 For the definite form, the length octets shall consist of one or
- * more octets, and shall represent the number of octets in the contents
- * octets using either the short form (see 8.1.3.4) or the long form (see
- * 8.1.3.5) as a sender's option. NOTE – The short form can only be used if
- * the number of octets in the contents octets is less than or equal to 127.
- * 8.1.3.4 In the short form, the length octets shall consist of a single
- * octet in which bit 8 is zero and bits 7 to 1 encode the number of octets
- * in the contents octets (which may be zero), as an unsigned binary integer
- * with bit 7 as the most significant bit. EXAMPLE L = 38 can be encoded as
- * 001001102 8.1.3.5 In the long form, the length octets shall consist of an
- * initial octet and one or more subsequent octets. The initial octet shall
- * be encoded as follows: a) bit 8 shall be one; b) bits 7 to 1 shall encode
- * the number of subsequent octets in the length octets, as an unsigned
- * binary integer with bit 7 as the most significant bit; c) the value
- * 111111112 shall not be used. ISO/IEC 8825-1:2003 (E) NOTE 1 – This
- * restriction is introduced for possible future extension. Bits 8 to 1 of
- * the first subsequent octet, followed by bits 8 to 1 of the second
- * subsequent octet, followed in turn by bits 8 to 1 of each further octet
- * up to and including the last subsequent octet, shall be the encoding of
- * an unsigned binary integer equal to the number of octets in the contents
- * octets, with bit 8 of the first subsequent octet as the most significant
- * bit. EXAMPLE L = 201 can be encoded as: 100000012 110010012 NOTE 2 – In
- * the long form, it is a sender's option whether to use more length octets
- * than the minimum necessary. 8.1.3.6 For the indefinite form, the length
- * octets indicate that the contents octets are terminated by
- * end-of-contents octets (see 8.1.5), and shall consist of a single octet.
- * 8.1.3.6.1 The single octet shall have bit 8 set to one, and bits 7 to 1
- * set to zero. 8.1.3.6.2 If this form of length is used, then
- * end-of-contents octets (see 8.1.5) shall be present in the encoding
- * following the contents octets. 8.1.4 Contents octets The contents octets
- * shall consist of zero, one or more octets, and shall encode the data
- * value as specified in subsequent clauses. NOTE – The contents octets
- * depend on the type of the data value; subsequent clauses follow the same
- * sequence as the definition of types in ASN.1. 8.1.5 End-of-contents
- * octets The end-of-contents octets shall be present if the length is
- * encoded as specified in 8.1.3.6, otherwise they shall not be present. The
- * end-of-contents octets shall consist of two zero octets. NOTE – The
- * end-of-contents octets can be considered as the encoding of a value whose
- * tag is universal class, whose form is primitive, whose number of the tag
- * is zero, and whose contents are absent, thus:
- *
- * End-of-contents Length Contents 0016 0016 Absent
- *
- * @return
- */
- private long readLength() throws IOException {
- long n = readByte();
- if (n > 0) {
- // short form
- return n;
- }
+ return -(toLong(data) + 1);
+ }
+ long n = 0;
+ for (int i = 0; i < data.length; i++) {
+ n = n * 256 + data[i];
+ }
+ return n;
+ }
+
+ /**
+ * 8.1.3.3 For the definite form, the length octets shall consist of one or
+ * more octets, and shall represent the number of octets in the contents
+ * octets using either the short form (see 8.1.3.4) or the long form (see
+ * 8.1.3.5) as a sender's option. NOTE – The short form can only be used if
+ * the number of octets in the contents octets is less than or equal to 127.
+ * 8.1.3.4 In the short form, the length octets shall consist of a single
+ * octet in which bit 8 is zero and bits 7 to 1 encode the number of octets
+ * in the contents octets (which may be zero), as an unsigned binary integer
+ * with bit 7 as the most significant bit. EXAMPLE L = 38 can be encoded as
+ * 001001102 8.1.3.5 In the long form, the length octets shall consist of an
+ * initial octet and one or more subsequent octets. The initial octet shall
+ * be encoded as follows: a) bit 8 shall be one; b) bits 7 to 1 shall encode
+ * the number of subsequent octets in the length octets, as an unsigned
+ * binary integer with bit 7 as the most significant bit; c) the value
+ * 111111112 shall not be used. ISO/IEC 8825-1:2003 (E) NOTE 1 – This
+ * restriction is introduced for possible future extension. Bits 8 to 1 of
+ * the first subsequent octet, followed by bits 8 to 1 of the second
+ * subsequent octet, followed in turn by bits 8 to 1 of each further octet
+ * up to and including the last subsequent octet, shall be the encoding of
+ * an unsigned binary integer equal to the number of octets in the contents
+ * octets, with bit 8 of the first subsequent octet as the most significant
+ * bit. EXAMPLE L = 201 can be encoded as: 100000012 110010012 NOTE 2 – In
+ * the long form, it is a sender's option whether to use more length octets
+ * than the minimum necessary. 8.1.3.6 For the indefinite form, the length
+ * octets indicate that the contents octets are terminated by
+ * end-of-contents octets (see 8.1.5), and shall consist of a single octet.
+ * 8.1.3.6.1 The single octet shall have bit 8 set to one, and bits 7 to 1
+ * set to zero. 8.1.3.6.2 If this form of length is used, then
+ * end-of-contents octets (see 8.1.5) shall be present in the encoding
+ * following the contents octets. 8.1.4 Contents octets The contents octets
+ * shall consist of zero, one or more octets, and shall encode the data
+ * value as specified in subsequent clauses. NOTE – The contents octets
+ * depend on the type of the data value; subsequent clauses follow the same
+ * sequence as the definition of types in ASN.1. 8.1.5 End-of-contents
+ * octets The end-of-contents octets shall be present if the length is
+ * encoded as specified in 8.1.3.6, otherwise they shall not be present. The
+ * end-of-contents octets shall consist of two zero octets. NOTE – The
+ * end-of-contents octets can be considered as the encoding of a value whose
+ * tag is universal class, whose form is primitive, whose number of the tag
+ * is zero, and whose contents are absent, thus: End-of-contents Length
+ * Contents 0016 0016 Absent
+ *
+ * @return
+ */
+ private long readLength() throws IOException {
+ long n = readByte();
+ if (n > 0) {
+ // short form
+ return n;
+ }
// long form
int count = (int) (n & 0x7F);
if (count == 0) {
- // indefinite form
- return 0;
+ // indefinite form
+ return 0;
}
n = 0;
while (count-- > 0) {
- n = n * 256 + read();
+ n = n * 256 + read();
}
return n;
- }
+ }
- private int readByte() throws IOException {
- position++;
- return xin.readByte();
- }
+ private int readByte() throws IOException {
+ position++;
+ return xin.readByte();
+ }
- private void readFully(byte[] data) throws IOException {
- position += data.length;
- xin.readFully(data);
- }
+ private void readFully(byte[] data) throws IOException {
+ position += data.length;
+ xin.readFully(data);
+ }
- private long getPosition() {
- return position;
- }
+ private long getPosition() {
+ return position;
+ }
- private int read() throws IOException {
- position++;
- return xin.read();
- }
+ private int read() throws IOException {
+ position++;
+ return xin.read();
+ }
- String readOID(byte[] data) {
- StringBuilder sb = new StringBuilder();
- sb.append((0xFF & data[0]) / 40);
- sb.append(".");
- sb.append((0xFF & data[0]) % 40);
+ String readOID(byte[] data) {
+ StringBuilder sb = new StringBuilder();
+ sb.append((0xFF & data[0]) / 40);
+ sb.append(".");
+ sb.append((0xFF & data[0]) % 40);
- int i = 0;
- while (++i < data.length) {
- int n = 0;
- while (data[i] < 0) {
- n = n * 128 + (0x7F & data[i]);
- i++;
- }
- n = n * 128 + data[i];
- sb.append(".");
- sb.append(n);
- }
+ int i = 0;
+ while (++i < data.length) {
+ int n = 0;
+ while (data[i] < 0) {
+ n = n * 128 + (0x7F & data[i]);
+ i++;
+ }
+ n = n * 128 + data[i];
+ sb.append(".");
+ sb.append(n);
+ }
- return sb.toString();
- }
+ return sb.toString();
+ }
- int getPayloadLength(PDU pdu) throws Exception {
- switch (pdu.getTag() & 0x1F) {
- case EOC:
- return 1;
+ int getPayloadLength(PDU pdu) throws Exception {
+ switch (pdu.getTag() & 0x1F) {
+ case EOC :
+ return 1;
- case BOOLEAN:
- return 1;
+ case BOOLEAN :
+ return 1;
- case INTEGER:
- return size(pdu.getInt());
+ case INTEGER :
+ return size(pdu.getInt());
- case UTF8_STRING:
- String s = pdu.getString();
- byte[] encoded = s.getBytes("UTF-8");
- return encoded.length;
+ case UTF8_STRING :
+ String s = pdu.getString();
+ byte[] encoded = s.getBytes("UTF-8");
+ return encoded.length;
- case IA5STRING:
- case VISIBLE_STRING:
- case UNIVERSAL_STRING:
- case PRINTABLE_STRING:
- case GENERALIZED_TIME:
- case GRAPHIC_STRING:
- case GENERAL_STRING:
- case CHARACTER_STRING:
- case UTCTIME:
- case NUMERIC_STRING: {
- String str = pdu.getString();
- encoded = str.getBytes("ASCII");
- return encoded.length;
- }
+ case IA5STRING :
+ case VISIBLE_STRING :
+ case UNIVERSAL_STRING :
+ case PRINTABLE_STRING :
+ case GENERALIZED_TIME :
+ case GRAPHIC_STRING :
+ case GENERAL_STRING :
+ case CHARACTER_STRING :
+ case UTCTIME :
+ case NUMERIC_STRING : {
+ String str = pdu.getString();
+ encoded = str.getBytes("ASCII");
+ return encoded.length;
+ }
- case OBJECT_IDENTIFIER:
- case REAL:
- case BIT_STRING:
- return pdu.getBytes().length;
+ case OBJECT_IDENTIFIER :
+ case REAL :
+ case BIT_STRING :
+ return pdu.getBytes().length;
- case OCTET_STRING:
- case NULL:
- case OBJECT_DESCRIPTOR:
- case EXTERNAL:
- case ENUMERATED:
- case EMBEDDED_PDV:
- case RELATIVE_OID:
- case T61_STRING:
- case VIDEOTEX_STRING:
- case BMP_STRING:
- return pdu.getBytes().length;
+ case OCTET_STRING :
+ case NULL :
+ case OBJECT_DESCRIPTOR :
+ case EXTERNAL :
+ case ENUMERATED :
+ case EMBEDDED_PDV :
+ case RELATIVE_OID :
+ case T61_STRING :
+ case VIDEOTEX_STRING :
+ case BMP_STRING :
+ return pdu.getBytes().length;
- default:
- throw new IllegalArgumentException("Invalid type: " + pdu);
- }
- }
+ default :
+ throw new IllegalArgumentException("Invalid type: " + pdu);
+ }
+ }
- int size(long value) {
- if (value < 128)
- return 1;
+ int size(long value) {
+ if (value < 128)
+ return 1;
- if (value <= 0xFF)
- return 2;
+ if (value <= 0xFF)
+ return 2;
- if (value <= 0xFFFF)
- return 3;
+ if (value <= 0xFFFF)
+ return 3;
- if (value <= 0xFFFFFF)
- return 4;
+ if (value <= 0xFFFFFF)
+ return 4;
- if (value <= 0xFFFFFFFF)
- return 5;
+ if (value <= 0xFFFFFFFF)
+ return 5;
- if (value <= 0xFFFFFFFFFFL)
- return 6;
+ if (value <= 0xFFFFFFFFFFL)
+ return 6;
- if (value <= 0xFFFFFFFFFFFFL)
- return 7;
+ if (value <= 0xFFFFFFFFFFFFL)
+ return 7;
- if (value <= 0xFFFFFFFFFFFFFFL)
- return 8;
+ if (value <= 0xFFFFFFFFFFFFFFL)
+ return 8;
- if (value <= 0xFFFFFFFFFFFFFFFFL)
- return 9;
+ if (value <= 0xFFFFFFFFFFFFFFFFL)
+ return 9;
- throw new IllegalArgumentException("length too long");
- }
+ throw new IllegalArgumentException("length too long");
+ }
- public void write(OutputStream out, PDU pdu) throws Exception {
- byte id = 0;
+ public void write(OutputStream out, PDU pdu) throws Exception {
+ byte id = 0;
- switch (pdu.getClss()) {
- case UNIVERSAL:
- id |= 0;
- break;
- case APPLICATION:
- id |= 0x40;
- break;
- case CONTEXT:
- id |= 0x80;
- break;
- case PRIVATE:
- id |= 0xC0;
- break;
- }
+ switch (pdu.getClss()) {
+ case UNIVERSAL :
+ id |= 0;
+ break;
+ case APPLICATION :
+ id |= 0x40;
+ break;
+ case CONTEXT :
+ id |= 0x80;
+ break;
+ case PRIVATE :
+ id |= 0xC0;
+ break;
+ }
- if (pdu.isConstructed())
- id |= 0x20;
+ if (pdu.isConstructed())
+ id |= 0x20;
- int tag = pdu.getTag();
- if (tag >= 0 && tag < 31) {
- id |= tag;
- } else {
- throw new UnsupportedOperationException("Cant do tags > 30");
- }
+ int tag = pdu.getTag();
+ if (tag >= 0 && tag < 31) {
+ id |= tag;
+ } else {
+ throw new UnsupportedOperationException("Cant do tags > 30");
+ }
- out.write(id);
+ out.write(id);
- int length = getPayloadLength(pdu);
- int size = size(length);
- if (size == 1) {
- out.write(length);
- } else {
- out.write(size);
- while (--size >= 0) {
- byte data = (byte) ((length >> (size * 8)) & 0xFF);
- out.write(data);
- }
- }
- writePayload(out, pdu);
- }
+ int length = getPayloadLength(pdu);
+ int size = size(length);
+ if (size == 1) {
+ out.write(length);
+ } else {
+ out.write(size);
+ while (--size >= 0) {
+ byte data = (byte) ((length >> (size * 8)) & 0xFF);
+ out.write(data);
+ }
+ }
+ writePayload(out, pdu);
+ }
- void writePayload(OutputStream out, PDU pdu) throws Exception {
- switch (pdu.getTag()) {
- case EOC:
- out.write(0);
- break;
+ void writePayload(OutputStream out, PDU pdu) throws Exception {
+ switch (pdu.getTag()) {
+ case EOC :
+ out.write(0);
+ break;
- case BOOLEAN:
- if (pdu.getBoolean())
- out.write(-1);
- else
- out.write(0);
- break;
+ case BOOLEAN :
+ if (pdu.getBoolean())
+ out.write(-1);
+ else
+ out.write(0);
+ break;
- case ENUMERATED:
- case INTEGER: {
- long value = pdu.getInt();
- int size = size(value);
- for (int i = size; i >= 0; i--) {
- byte b = (byte) ((value >> (i * 8)) & 0xFF);
- out.write(b);
- }
- }
+ case ENUMERATED :
+ case INTEGER : {
+ long value = pdu.getInt();
+ int size = size(value);
+ for (int i = size; i >= 0; i--) {
+ byte b = (byte) ((value >> (i * 8)) & 0xFF);
+ out.write(b);
+ }
+ }
- case BIT_STRING: {
- byte bytes[] = pdu.getBytes();
- int unused = bytes[0];
- assert unused <= 7;
- int[] mask = { 0xFF, 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1 };
- bytes[bytes.length - 1] &= (byte) mask[unused];
- out.write(bytes);
- break;
- }
+ case BIT_STRING : {
+ byte bytes[] = pdu.getBytes();
+ int unused = bytes[0];
+ assert unused <= 7;
+ int[] mask = {
+ 0xFF, 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1
+ };
+ bytes[bytes.length - 1] &= (byte) mask[unused];
+ out.write(bytes);
+ break;
+ }
- case RELATIVE_OID:
- case OBJECT_IDENTIFIER: {
- int[] oid = pdu.getOID();
- assert oid.length > 2;
- assert oid[0] < 4;
- assert oid[1] < 40;
- byte top = (byte) (oid[0] * 40 + oid[1]);
- out.write(top);
- for (int i = 2; i < oid.length; i++) {
- putOid(out,oid[i]);
- }
- break;
- }
+ case RELATIVE_OID :
+ case OBJECT_IDENTIFIER : {
+ int[] oid = pdu.getOID();
+ assert oid.length > 2;
+ assert oid[0] < 4;
+ assert oid[1] < 40;
+ byte top = (byte) (oid[0] * 40 + oid[1]);
+ out.write(top);
+ for (int i = 2; i < oid.length; i++) {
+ putOid(out, oid[i]);
+ }
+ break;
+ }
- case OCTET_STRING: {
- byte bytes[] = pdu.getBytes();
- out.write(bytes);
- break;
- }
+ case OCTET_STRING : {
+ byte bytes[] = pdu.getBytes();
+ out.write(bytes);
+ break;
+ }
- case NULL:
- break;
+ case NULL :
+ break;
- case BMP_STRING:
- case GRAPHIC_STRING:
- case VISIBLE_STRING:
- case GENERAL_STRING:
- case UNIVERSAL_STRING:
- case CHARACTER_STRING:
- case NUMERIC_STRING:
- case PRINTABLE_STRING:
- case VIDEOTEX_STRING:
- case T61_STRING:
- case REAL:
- case EMBEDDED_PDV:
- case EXTERNAL:
- throw new UnsupportedEncodingException("dont know real, embedded PDV or external");
-
- case UTF8_STRING: {
- String s = pdu.getString();
- byte [] data = s.getBytes("UTF-8");
- out.write(data);
- break;
- }
-
- case OBJECT_DESCRIPTOR:
- case IA5STRING:
- String s = pdu.getString();
- byte [] data = s.getBytes("ASCII");
- out.write(data);
- break;
-
-
- case SEQUENCE:
- case SET: {
- PDU pdus[] = pdu.getChildren();
- for ( PDU p : pdus ) {
- write(out, p);
- }
- }
-
-
- case UTCTIME:
- case GENERALIZED_TIME:
- Date date = pdu.getDate();
- String ss= df.format(date);
- byte d[] = ss.getBytes("ASCII");
- out.write(d);
- break;
-
- }
- }
-
+ case BMP_STRING :
+ case GRAPHIC_STRING :
+ case VISIBLE_STRING :
+ case GENERAL_STRING :
+ case UNIVERSAL_STRING :
+ case CHARACTER_STRING :
+ case NUMERIC_STRING :
+ case PRINTABLE_STRING :
+ case VIDEOTEX_STRING :
+ case T61_STRING :
+ case REAL :
+ case EMBEDDED_PDV :
+ case EXTERNAL :
+ throw new UnsupportedEncodingException("dont know real, embedded PDV or external");
- private void putOid(OutputStream out, int i) throws IOException {
- if (i > 127) {
- putOid(out, i >> 7);
- out.write(0x80 + (i & 0x7F));
- } else
- out.write(i & 0x7F);
- }
+ case UTF8_STRING : {
+ String s = pdu.getString();
+ byte[] data = s.getBytes("UTF-8");
+ out.write(data);
+ break;
+ }
+
+ case OBJECT_DESCRIPTOR :
+ case IA5STRING :
+ String s = pdu.getString();
+ byte[] data = s.getBytes("ASCII");
+ out.write(data);
+ break;
+
+ case SEQUENCE :
+ case SET : {
+ PDU pdus[] = pdu.getChildren();
+ for (PDU p : pdus) {
+ write(out, p);
+ }
+ }
+
+ case UTCTIME :
+ case GENERALIZED_TIME :
+ Date date = pdu.getDate();
+ String ss = df.format(date);
+ byte d[] = ss.getBytes("ASCII");
+ out.write(d);
+ break;
+
+ }
+ }
+
+ private void putOid(OutputStream out, int i) throws IOException {
+ if (i > 127) {
+ putOid(out, i >> 7);
+ out.write(0x80 + (i & 0x7F));
+ } else
+ out.write(i & 0x7F);
+ }
}