12 static unsigned char buf[4096];
13 static int buf_offset;
16 _buf_writer(const void *buffer, size_t size, void *app_key) {
17 unsigned char *b, *bend;
19 assert(buf_offset + size < sizeof(buf));
21 memcpy(buf + buf_offset, buffer, size);
28 printf("]:%zd\n", size);
34 save_object(void *bs, asn_TYPE_descriptor_t *td) {
35 asn_enc_rval_t rval; /* Return value */
40 rval = der_encode(td, bs, _buf_writer, 0);
41 if (rval.encoded == -1) {
43 "Cannot encode %s: %s\n",
44 rval.failed_type->name, strerror(errno));
45 assert(rval.encoded != -1);
49 buf[buf_offset++] = 0xab; /* Finalize with garbage */
51 asn_fprint(stderr, td, bs);
54 for(i = 0; i < buf_offset; i++)
55 printf(" %02x", buf[i]);
62 load_object(void *bs, asn_TYPE_descriptor_t *td) {
65 fprintf(stderr, "\nLOADING OBJECT OF SIZE %d\n", buf_offset);
67 rval = ber_decode(0, td, (void **)&bs, buf, buf_offset);
68 assert(rval.code == RC_OK);
70 asn_fprint(stderr, td, bs);
72 return (rval.code == RC_OK)?0:-1;
75 /* [3] IMPLICIT SEQUENCE { b BOOLEAN } */
76 uint8_t test_any_buf1[] = { 0xa3, 0x80, /* [3], constructed, indefinite */
77 0x01, 0x01, 0xff, /* b BOOLEAN ::= TRUE */
78 0x00, 0x00 /* End of content octets */ };
81 uint8_t test_any_buf2[] = { 0x01, 0x01, 0x13 };
85 asn_TYPE_descriptor_t *td1 = &asn_DEF_T1;
86 asn_TYPE_descriptor_t *td2 = &asn_DEF_T2;
92 * Test the T1 with constructed indefinite length ANY encoding.
94 memset(&t1, 0, sizeof(t1));
95 memset(&t1_new, 0, sizeof(t1_new));
98 t1.any.buf = test_any_buf1;
99 t1.any.size = sizeof(test_any_buf1);
101 /* Save->Load must succeed */
102 save_object(&t1, td1);
103 ret = load_object(&t1_new, td1);
106 assert(t1_new.i == 112233);
107 assert(t1_new.any.size == (ssize_t)sizeof(test_any_buf1));
108 assert(memcmp(t1_new.any.buf, test_any_buf1, sizeof(test_any_buf1)) == 0);
111 * Test the T1 with primitive encoding.
113 memset(&t1, 0, sizeof(t1));
114 ASN_STRUCT_RESET(asn_DEF_T1, &t1_new);
117 t1.any.buf = test_any_buf2;
118 t1.any.size = sizeof(test_any_buf2);
120 /* Save->Load must succeed */
121 save_object(&t1, td1);
122 ret = load_object(&t1_new, td1);
125 assert(t1_new.i == -112233);
126 assert(t1_new.any.size == (ssize_t)sizeof(test_any_buf2));
127 assert(memcmp(t1_new.any.buf, test_any_buf2, sizeof(test_any_buf2)) == 0);
128 ASN_STRUCT_RESET(asn_DEF_T1, &t1_new);
131 * Test the T2 empty sequence.
133 memset(&t2, 0, sizeof(t2));
134 memset(&t2_new, 0, sizeof(t2_new));
137 t2.any = calloc(1, sizeof(*t2.any));
141 /* Save->Load must succeed */
142 save_object(&t2, td2);
143 ret = load_object(&t2_new, td2);
146 assert(t2_new.i == 332211);
147 assert(t2_new.any->size == 0);
150 * Test the T2 sequence.
152 ASN_STRUCT_RESET(asn_DEF_T2, &t2);
153 ASN_STRUCT_RESET(asn_DEF_T2, &t2_new);
156 t2.any = calloc(1, sizeof(*t2.any));
157 t2.any->buf = test_any_buf1;
158 t2.any->size = sizeof(test_any_buf1);
160 /* Save->Load must succeed */
161 save_object(&t2, td2);
162 ret = load_object(&t2_new, td2);
165 assert(t2_new.i == 332211);
166 assert(t2_new.any->size == (ssize_t)sizeof(test_any_buf1));
167 assert(memcmp(t2_new.any->buf, test_any_buf1, sizeof(test_any_buf1)) == 0);
170 * Test the T2 sequence with primitive encoding.
174 ASN_STRUCT_RESET(asn_DEF_T2, &t2);
175 ASN_STRUCT_RESET(asn_DEF_T2, &t2_new);
178 t2.any = calloc(1, sizeof(*t2.any));
179 t2.any->buf = test_any_buf2;
180 t2.any->size = sizeof(test_any_buf2);
182 /* Save->Load must succeed */
183 save_object(&t2, td2);
184 ret = load_object(&t2_new, td2);
187 assert(t2_new.i == 0);
188 assert(t2_new.any->size == (ssize_t)sizeof(test_any_buf2));
189 assert(memcmp(t2_new.any->buf, test_any_buf2, sizeof(test_any_buf2)) == 0);
192 * Test T2 with ANY element omitted.
196 ASN_STRUCT_RESET(asn_DEF_T2, &t2_new);
198 save_object(&t2, td2);
199 ret = load_object(&t2_new, td2);
202 assert(t2_new.i == 0);
203 assert(t2_new.any == 0);