ANY/OCTET STRING/BIT STRING testing, plus numerous test cases
diff --git a/asn1c/tests/Makefile.am b/asn1c/tests/Makefile.am
index 24d0a38..9791613 100644
--- a/asn1c/tests/Makefile.am
+++ b/asn1c/tests/Makefile.am
@@ -11,7 +11,12 @@
TESTS = check-*.c
endif
-EXTRA_DIST = $(check_SCRIPTS) check-*.c*
+EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.*
clean:
- for t in test-*; do rm -rf $$t; done
+ rm -rf test-*
+
+SUFFIXES = .xbr .ber
+
+.xbr.ber:
+ ../enber $< > $@
diff --git a/asn1c/tests/Makefile.in b/asn1c/tests/Makefile.in
index e4b6b3b..00336bf 100644
--- a/asn1c/tests/Makefile.in
+++ b/asn1c/tests/Makefile.in
@@ -160,10 +160,12 @@
TESTS_ENVIRONMENT = CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" ./check-assembly.sh
@CPLUSPLUS_FOUND_FALSE@TESTS = check-*.c
@CPLUSPLUS_FOUND_TRUE@TESTS = check-*.c check-*.cc ## Include C++ test filed (.cc)
-EXTRA_DIST = $(check_SCRIPTS) check-*.c*
+EXTRA_DIST = $(check_SCRIPTS) check-*.c* data-*/*.*
+SUFFIXES = .xbr .ber
all: all-am
.SUFFIXES:
+.SUFFIXES: .xbr .ber
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -284,6 +286,7 @@
else :; fi
distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/data-*
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
@@ -396,7 +399,10 @@
clean:
- for t in test-*; do rm -rf $$t; done
+ rm -rf test-*
+
+.xbr.ber:
+ ../enber $< > $@
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/asn1c/tests/check-62.c b/asn1c/tests/check-62.c
new file mode 100644
index 0000000..06287a8
--- /dev/null
+++ b/asn1c/tests/check-62.c
@@ -0,0 +1,193 @@
+#undef NDEBUG
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h> /* for chdir(2) */
+#include <string.h>
+#include <dirent.h>
+#include <assert.h>
+#include <errno.h>
+
+#include <T.h>
+
+enum expectation {
+ EXP_OK, /* Encoding/decoding must succeed */
+ EXP_BROKEN, /* Decoding must fail */
+ EXP_RECLESS, /* Reconstruction is allowed to yield less data */
+};
+
+static unsigned char buf[4096];
+static int buf_offset;
+
+static int
+_buf_writer(const void *buffer, size_t size, void *app_key) {
+ unsigned char *b, *bend;
+ (void)app_key;
+ assert(buf_offset + size < sizeof(buf));
+ memcpy(buf + buf_offset, buffer, size);
+ b = buf + buf_offset;
+ bend = b + size;
+ printf("=> [");
+ for(; b < bend; b++)
+ printf(" %02X", *b);
+ printf("]:%ld\n", (long)size);
+ buf_offset += size;
+ return 0;
+}
+
+static int
+save_object(T_t *st) {
+ asn_enc_rval_t rval; /* Return value */
+
+ buf_offset = 0;
+
+ rval = der_encode(&asn1_DEF_T, st, _buf_writer, 0);
+ if (rval.encoded == -1) {
+ fprintf(stderr,
+ "Cannot encode %s: %s\n",
+ rval.failed_type->name, strerror(errno));
+ assert(rval.encoded != -1);
+ return -1; /* JIC */
+ }
+
+ fprintf(stderr, "SAVED OBJECT IN SIZE %d\n", buf_offset);
+
+ return 0;
+}
+
+static T_t *
+load_object(enum expectation expectation, char *fbuf, int size) {
+ ber_dec_rval_t rval;
+ T_t *st = 0;
+ int csize;
+
+ fprintf(stderr, "LOADING OBJECT OF SIZE %d\n", size);
+
+ /* Perform multiple iterations with multiple chunks sizes */
+ for(csize = 1; csize < 20; csize += 1) {
+ int fbuf_offset = 0;
+ int fbuf_left = size;
+ int fbuf_chunk = csize;
+
+ if(st) asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0);
+ st = 0;
+
+ do {
+ fprintf(stderr, "Decoding from %d with %d (left %d)\n",
+ fbuf_offset, fbuf_chunk, fbuf_left);
+ rval = ber_decode(&asn1_DEF_T, (void **)&st,
+ fbuf + fbuf_offset,
+ fbuf_chunk < fbuf_left
+ ? fbuf_chunk : fbuf_left);
+ fbuf_offset += rval.consumed;
+ fbuf_left -= rval.consumed;
+ if(rval.code == RC_WMORE)
+ fbuf_chunk += 1; /* Give little more */
+ else
+ fbuf_chunk = csize; /* Back off */
+ } while(fbuf_left && rval.code == RC_WMORE);
+
+ if(expectation != EXP_BROKEN) {
+ assert(rval.code == RC_OK);
+ } else {
+ assert(rval.code != RC_OK);
+ fprintf(stderr, "Failed, but this was expected\n");
+ asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0);
+ st = 0; /* ignore leak for now */
+ }
+ }
+
+ if(st) asn_fprint(stderr, &asn1_DEF_T, st);
+ return st;
+}
+
+
+static void
+process_data(enum expectation expectation, char *fbuf, int size) {
+ T_t *st;
+ int ret;
+
+ st = load_object(expectation, fbuf, size);
+ if(!st) return;
+
+ ret = save_object(st);
+ assert(buf_offset < sizeof(buf));
+ assert(ret == 0);
+
+ if(expectation == EXP_RECLESS) {
+ assert(buf_offset > 0 && buf_offset < size);
+ assert(memcmp(buf + 2, fbuf + 2, buf_offset - 2) == 0);
+ } else {
+ assert(buf_offset == size);
+ assert(memcmp(buf, fbuf, buf_offset) == 0);
+ }
+
+ asn1_DEF_T.free_struct(&asn1_DEF_T, st, 0);
+}
+
+/*
+ * Decode the .der files and try to regenerate them.
+ */
+static int
+process(const char *fname) {
+ char fbuf[4096];
+ char *ext = strrchr(fname, '.');
+ enum expectation expectation;
+ int ret;
+ int rd;
+ FILE *fp;
+
+ if(ext == 0 || strcmp(ext, ".ber"))
+ return 0;
+
+ switch(ext[-1]) {
+ case 'B': /* The file is intentionally broken */
+ expectation = EXP_BROKEN; break;
+ case 'L': /* Extensions are present */
+ expectation = EXP_RECLESS; break;
+ default:
+ expectation = EXP_OK; break;
+ }
+
+ fprintf(stderr, "\nProcessing file [../%s]\n", fname);
+
+ ret = chdir("../data-62");
+ assert(ret == 0);
+ fp = fopen(fname, "r");
+ ret = chdir("../test-check-62");
+ assert(ret == 0);
+ assert(fp);
+
+ rd = fread(fbuf, 1, sizeof(fbuf), fp);
+ fclose(fp);
+
+ assert(rd < sizeof(fbuf)); /* expect small files */
+
+ process_data(expectation, fbuf, rd);
+
+ return 1;
+}
+
+int
+main() {
+ DIR *dir;
+ struct dirent *dent;
+ int processed_files = 0;
+
+ dir = opendir("../data-62");
+ assert(dir);
+
+ while((dent = readdir(dir))) {
+ if(strncmp(dent->d_name, "data-62-", 8))
+ continue;
+
+ if(process(dent->d_name))
+ processed_files++;
+ }
+
+ assert(processed_files);
+ closedir(dir);
+
+ return 0;
+}
+
diff --git a/asn1c/tests/data-62/data-62-01.ber b/asn1c/tests/data-62/data-62-01.ber
new file mode 100644
index 0000000..9d0cd7d
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-01.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-01.xbr b/asn1c/tests/data-62/data-62-01.xbr
new file mode 100644
index 0000000..18f3e10
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-01.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="11">
+ <P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+ <C T="[1]" TL="2" V="6">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-02-B.ber b/asn1c/tests/data-62/data-62-02-B.ber
new file mode 100644
index 0000000..288fa2f
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-02-B.ber
@@ -0,0 +1,2 @@
+0
+¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-02-B.xbr b/asn1c/tests/data-62/data-62-02-B.xbr
new file mode 100644
index 0000000..3d4afbf
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-02-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="10">
+ <P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+ <C T="[1]" TL="2" V="6">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-03-B.ber b/asn1c/tests/data-62/data-62-03-B.ber
new file mode 100644
index 0000000..35271bc
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-03-B.ber
@@ -0,0 +1 @@
+0 ¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-03-B.xbr b/asn1c/tests/data-62/data-62-03-B.xbr
new file mode 100644
index 0000000..50930a6
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-03-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="9">
+ <P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+ <C T="[1]" TL="2" V="6">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-04-B.ber b/asn1c/tests/data-62/data-62-04-B.ber
new file mode 100644
index 0000000..c65a578
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-04-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-04-B.xbr b/asn1c/tests/data-62/data-62-04-B.xbr
new file mode 100644
index 0000000..f5b78c3
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-04-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="8">
+ <P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+ <C T="[1]" TL="2" V="6">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-05-B.ber b/asn1c/tests/data-62/data-62-05-B.ber
new file mode 100644
index 0000000..ff65b20
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-05-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-05-B.xbr b/asn1c/tests/data-62/data-62-05-B.xbr
new file mode 100644
index 0000000..dd075fc
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-05-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="7">
+ <P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+ <C T="[1]" TL="2" V="6">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-06-B.ber b/asn1c/tests/data-62/data-62-06-B.ber
new file mode 100644
index 0000000..530d54b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-06-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-06-B.xbr b/asn1c/tests/data-62/data-62-06-B.xbr
new file mode 100644
index 0000000..e5bdfd8
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-06-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="6">
+ <P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+ <C T="[1]" TL="2" V="6">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-07-B.ber b/asn1c/tests/data-62/data-62-07-B.ber
new file mode 100644
index 0000000..286ca58
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-07-B.ber
@@ -0,0 +1 @@
+0¡test
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-07-B.xbr b/asn1c/tests/data-62/data-62-07-B.xbr
new file mode 100644
index 0000000..9680309
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-07-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+ <P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+ <C T="[1]" TL="2" V="6">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-08-L.ber b/asn1c/tests/data-62/data-62-08-L.ber
new file mode 100644
index 0000000..d127e08
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-08-L.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-08-L.xbr b/asn1c/tests/data-62/data-62-08-L.xbr
new file mode 100644
index 0000000..8afad43
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-08-L.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+ <P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+ <C T="[1]" TL="2" V="6">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </C>
+ <P T="[UNIVERSAL 5]" TL="2" V="0"></P> -- extra component
+</C>
diff --git a/asn1c/tests/data-62/data-62-09-L.ber b/asn1c/tests/data-62/data-62-09-L.ber
new file mode 100644
index 0000000..b7856ca
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-09-L.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-09-L.xbr b/asn1c/tests/data-62/data-62-09-L.xbr
new file mode 100644
index 0000000..e24ba2c
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-09-L.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="16">
+ <P T="[UNIVERSAL 2]" TL="2" V="1">&x05;</P>
+ <C T="[1]" TL="2" V="6">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </C>
+ <P T="[UNIVERSAL 5]" TL="2" V="0"></P> -- extra component
+ <P T="[UNIVERSAL 1]" TL="2" V="1">&xff;</P> -- another extra component
+</C>
diff --git a/asn1c/tests/data-62/data-62-10.ber b/asn1c/tests/data-62/data-62-10.ber
new file mode 100644
index 0000000..0772c45
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-10.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-10.xbr b/asn1c/tests/data-62/data-62-10.xbr
new file mode 100644
index 0000000..7dd86f0
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-10.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="7">
+ <C T="[1]" TL="2" V="5">
+ <I T="[APPLICATION 123]" TL="3" V="Indefinite">
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-11.ber b/asn1c/tests/data-62/data-62-11.ber
new file mode 100644
index 0000000..8eeb0d8
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-11.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-11.xbr b/asn1c/tests/data-62/data-62-11.xbr
new file mode 100644
index 0000000..1ce0695
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-11.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="10">
+ <C T="[1]" TL="2" V="8">
+ <I T="[1]" TL="2">
+ </I>
+ <I T="[1]" TL="2">
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-12-B.ber b/asn1c/tests/data-62/data-62-12-B.ber
new file mode 100644
index 0000000..2ea1bdc
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-12-B.ber
@@ -0,0 +1 @@
+0¡¡
\ No newline at end of file
diff --git a/asn1c/tests/data-62/data-62-12-B.xbr b/asn1c/tests/data-62/data-62-12-B.xbr
new file mode 100644
index 0000000..b3a370c
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-12-B.xbr
@@ -0,0 +1,6 @@
+<C T="[UNIVERSAL 16]" TL="2" V="6">
+ <C T="[1]" TL="2" V="2">
+ <I T="[1]" TL="2">
+ -- Do not terminate: no end-of-content octets is intended
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-13-B.ber b/asn1c/tests/data-62/data-62-13-B.ber
new file mode 100644
index 0000000..47dc2ac
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-13-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-13-B.xbr b/asn1c/tests/data-62/data-62-13-B.xbr
new file mode 100644
index 0000000..4ee3002
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-13-B.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="8">
+ <C T="[1]" TL="2" V="6">
+ <I T="[PRIVATE 1]" TL="2">
+ </I>
+ <I T="[PRIVATE 2]" TL="2">
+ -- Do not terminate: no end-of-content octets is intended.
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-14.ber b/asn1c/tests/data-62/data-62-14.ber
new file mode 100644
index 0000000..c048f28
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-14.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-14.xbr b/asn1c/tests/data-62/data-62-14.xbr
new file mode 100644
index 0000000..0c7da7c
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-14.xbr
@@ -0,0 +1,10 @@
+<C T="[UNIVERSAL 16]" TL="2" V="14">
+ <C T="[1]" TL="2" V="12">
+ <I T="[PRIVATE 1]" TL="2">
+ <I T="[PRIVATE 2]" TL="2">
+ </I>
+ <I T="[PRIVATE 3]" TL="2">
+ </I>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-15-B.ber b/asn1c/tests/data-62/data-62-15-B.ber
new file mode 100644
index 0000000..f87367f
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-15-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-15-B.xbr b/asn1c/tests/data-62/data-62-15-B.xbr
new file mode 100644
index 0000000..c57f270
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-15-B.xbr
@@ -0,0 +1,10 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+ <C T="[1]" TL="2" V="10">
+ <I T="[PRIVATE 1]" TL="2">
+ <I T="[PRIVATE 2]" TL="2">
+ </I>
+ <I T="[PRIVATE 3]" TL="2">
+ -- missing EOC
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-16.ber b/asn1c/tests/data-62/data-62-16.ber
new file mode 100644
index 0000000..799e1e7
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-16.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-16.xbr b/asn1c/tests/data-62/data-62-16.xbr
new file mode 100644
index 0000000..600a6c1
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-16.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+ <C T="[1]" TL="2" V="10">
+ <I T="[PRIVATE 1]" TL="2">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-17-B.ber b/asn1c/tests/data-62/data-62-17-B.ber
new file mode 100644
index 0000000..5d98f99
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-17-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-17-B.xbr b/asn1c/tests/data-62/data-62-17-B.xbr
new file mode 100644
index 0000000..4e49f2b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-17-B.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+ <C T="[1]" TL="2" V="10">
+ <I T="[PRIVATE 1]" TL="2">
+ <P T="[UNIVERSAL 19]" TL="2" V="5">test2</P>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-18-B.ber b/asn1c/tests/data-62/data-62-18-B.ber
new file mode 100644
index 0000000..8200bca
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-18-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-18-B.xbr b/asn1c/tests/data-62/data-62-18-B.xbr
new file mode 100644
index 0000000..2177866
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-18-B.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+ <C T="[1]" TL="2" V="11">
+ <I T="[PRIVATE 1]" TL="2">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-19-B.ber b/asn1c/tests/data-62/data-62-19-B.ber
new file mode 100644
index 0000000..1e2641b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-19-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-19-B.xbr b/asn1c/tests/data-62/data-62-19-B.xbr
new file mode 100644
index 0000000..5e424cc
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-19-B.xbr
@@ -0,0 +1,7 @@
+<C T="[UNIVERSAL 16]" TL="2" V="12">
+ <C T="[1]" TL="2" V="11">
+ <I T="[PRIVATE 1]" TL="2">
+ <P T="[UNIVERSAL 19]" TL="2" V="4">test</P>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-20.ber b/asn1c/tests/data-62/data-62-20.ber
new file mode 100644
index 0000000..ea13838
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-20.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-20.xbr b/asn1c/tests/data-62/data-62-20.xbr
new file mode 100644
index 0000000..178fa66
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-20.xbr
@@ -0,0 +1,8 @@
+<C T="[UNIVERSAL 16]" TL="2" V="9">
+ <C T="[1]" TL="2" V="7">
+ <I T="[PRIVATE 1]" TL="2">
+ <C T="[123]" TL="3" V="0">
+ </C>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-21-B.ber b/asn1c/tests/data-62/data-62-21-B.ber
new file mode 100644
index 0000000..d109b4f
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-21-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-21-B.xbr b/asn1c/tests/data-62/data-62-21-B.xbr
new file mode 100644
index 0000000..7aeac97
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-21-B.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="9">
+ <C T="[1]" TL="2" V="7">
+ <I T="[PRIVATE 1]" TL="2">
+ <C T="[123]" TL="3" V="0">
+ <C T="[23]" TL="2" V="0">
+ <P T="[UNIVERSAL 5]" TL="2" V="0"></P>
+ </C>
+ </C>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-22.ber b/asn1c/tests/data-62/data-62-22.ber
new file mode 100644
index 0000000..93111e9
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-22.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-22.xbr b/asn1c/tests/data-62/data-62-22.xbr
new file mode 100644
index 0000000..ca220a7
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-22.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+ <C T="[1]" TL="2" V="11">
+ <I T="[PRIVATE 1]" TL="2">
+ <C T="[123]" TL="3" V="4">
+ <C T="[23]" TL="2" V="2">
+ <P T="[UNIVERSAL 5]" TL="2" V="0"></P>
+ </C>
+ </C>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-23-B.ber b/asn1c/tests/data-62/data-62-23-B.ber
new file mode 100644
index 0000000..a1f5af9
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-23-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-23-B.xbr b/asn1c/tests/data-62/data-62-23-B.xbr
new file mode 100644
index 0000000..7a2777e
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-23-B.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="13">
+ <C T="[1]" TL="2" V="11">
+ <I T="[PRIVATE 1]" TL="2">
+ <C T="[123]" TL="3" V="5">
+ <C T="[23]" TL="2" V="2">
+ <P T="[UNIVERSAL 5]" TL="2" V="0"></P>
+ </C>
+ </C>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-24-L.ber b/asn1c/tests/data-62/data-62-24-L.ber
new file mode 100644
index 0000000..d88d78b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-24-L.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-24-L.xbr b/asn1c/tests/data-62/data-62-24-L.xbr
new file mode 100644
index 0000000..9974a67
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-24-L.xbr
@@ -0,0 +1,12 @@
+<I T="[UNIVERSAL 16]" TL="2" V="Indefinite">
+ <C T="[1]" TL="2" V="14">
+ <I T="[PRIVATE 1]" TL="2">
+ <C T="[123]" TL="3" V="5">
+ <C T="[23]" TL="2" V="3">
+ <P T="[UNIVERSAL 19]" TL="2" V="1">z</P>
+ </C>
+ </C>
+ </I>
+ <P T="[UNIVERSAL 0]" TL="2" V="0"></P>
+ </C>
+</I>
diff --git a/asn1c/tests/data-62/data-62-25.ber b/asn1c/tests/data-62/data-62-25.ber
new file mode 100644
index 0000000..931978b
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-25.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-25.xbr b/asn1c/tests/data-62/data-62-25.xbr
new file mode 100644
index 0000000..d62e456
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-25.xbr
@@ -0,0 +1,11 @@
+<C T="[UNIVERSAL 16]" TL="2" V="14">
+ <C T="[1]" TL="2" V="12">
+ <I T="[PRIVATE 1]" TL="2">
+ <C T="[123]" TL="3" V="5">
+ <C T="[23]" TL="2" V="3">
+ <P T="[UNIVERSAL 19]" TL="2" V="1">z</P>
+ </C>
+ </C>
+ </I>
+ </C>
+</C>
diff --git a/asn1c/tests/data-62/data-62-26-B.ber b/asn1c/tests/data-62/data-62-26-B.ber
new file mode 100644
index 0000000..ef7d106
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-26-B.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-26-B.xbr b/asn1c/tests/data-62/data-62-26-B.xbr
new file mode 100644
index 0000000..13c0aa2
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-26-B.xbr
@@ -0,0 +1,11 @@
+<I T="[UNIVERSAL 16]" TL="2" V="Indefinite">
+ <C T="[1]" TL="2" V="14">
+ <I T="[PRIVATE 1]" TL="2">
+ <C T="[123]" TL="3" V="5">
+ <C T="[23]" TL="2" V="3">
+ <P T="[UNIVERSAL 19]" TL="2" V="1">z</P>
+ </C>
+ </C>
+ </I>
+ </C>
+</I>
diff --git a/asn1c/tests/data-62/data-62-27.ber b/asn1c/tests/data-62/data-62-27.ber
new file mode 100644
index 0000000..7cb619d
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-27.ber
Binary files differ
diff --git a/asn1c/tests/data-62/data-62-27.xbr b/asn1c/tests/data-62/data-62-27.xbr
new file mode 100644
index 0000000..2fb6422
--- /dev/null
+++ b/asn1c/tests/data-62/data-62-27.xbr
@@ -0,0 +1,4 @@
+<C T="[UNIVERSAL 16]" TL="2" V="2">
+ <C T="[1]" TL="2" V="0">
+ </C>
+</C>