blob: f7e84caaca89e71b06c855b8562a433f7633daa3 [file] [log] [blame]
Lev Walkin1eded352006-07-13 11:19:01 +00001#undef NDEBUG
2#include <stdio.h>
3#include <stdlib.h>
4#include <sys/types.h>
5#include <string.h>
6#include <assert.h>
7#include <errno.h>
8
9#include <T1.h>
10#include <T2.h>
11
12static unsigned char buf[4096];
13static int buf_offset;
14
15static int
16_buf_writer(const void *buffer, size_t size, void *app_key) {
17 unsigned char *b, *bend;
18 (void)app_key;
19 assert(buf_offset + size < sizeof(buf));
Vasil Velichkovedd82a92017-10-10 03:15:32 +030020 if (buffer) {
21 memcpy(buf + buf_offset, buffer, size);
22 }
Lev Walkin1eded352006-07-13 11:19:01 +000023 b = buf + buf_offset;
24 bend = b + size;
25 printf("=> [");
26 for(; b < bend; b++)
27 printf(" %02X", *b);
Lev Walkin1715b322013-03-28 04:02:13 -070028 printf("]:%zd\n", size);
Lev Walkin1eded352006-07-13 11:19:01 +000029 buf_offset += size;
30 return 0;
31}
32
33static int
34save_object(void *bs, asn_TYPE_descriptor_t *td) {
35 asn_enc_rval_t rval; /* Return value */
36 int i;
37
38 buf_offset = 0;
39
40 rval = der_encode(td, bs, _buf_writer, 0);
41 if (rval.encoded == -1) {
42 fprintf(stderr,
43 "Cannot encode %s: %s\n",
44 rval.failed_type->name, strerror(errno));
45 assert(rval.encoded != -1);
46 return -1; /* JIC */
47 }
48
49 buf[buf_offset++] = 0xab; /* Finalize with garbage */
50
51 asn_fprint(stderr, td, bs);
52
53 printf("OUT: [");
54 for(i = 0; i < buf_offset; i++)
55 printf(" %02x", buf[i]);
56 printf("]\n");
57
58 return 0;
59}
60
61static int
62load_object(void *bs, asn_TYPE_descriptor_t *td) {
63 asn_dec_rval_t rval;
64
65 fprintf(stderr, "\nLOADING OBJECT OF SIZE %d\n", buf_offset);
66
67 rval = ber_decode(0, td, (void **)&bs, buf, buf_offset);
68 assert(rval.code == RC_OK);
69
70 asn_fprint(stderr, td, bs);
71
72 return (rval.code == RC_OK)?0:-1;
73}
74
75/* [3] IMPLICIT SEQUENCE { b BOOLEAN } */
76uint8_t test_any_buf1[] = { 0xa3, 0x80, /* [3], constructed, indefinite */
77 0x01, 0x01, 0xff, /* b BOOLEAN ::= TRUE */
78 0x00, 0x00 /* End of content octets */ };
79
80/* b BOOLEAN */
81uint8_t test_any_buf2[] = { 0x01, 0x01, 0x13 };
82
83int
84main() {
85 asn_TYPE_descriptor_t *td1 = &asn_DEF_T1;
86 asn_TYPE_descriptor_t *td2 = &asn_DEF_T2;
87 T1_t t1, t1_new;
88 T2_t t2, t2_new;
89 int ret;
90
91 /*
92 * Test the T1 with constructed indefinite length ANY encoding.
93 */
94 memset(&t1, 0, sizeof(t1));
95 memset(&t1_new, 0, sizeof(t1_new));
96
97 t1.i = 112233;
98 t1.any.buf = test_any_buf1;
99 t1.any.size = sizeof(test_any_buf1);
100
101 /* Save->Load must succeed */
102 save_object(&t1, td1);
103 ret = load_object(&t1_new, td1);
104
105 assert(ret == 0);
106 assert(t1_new.i == 112233);
Lev Walkin5b63acf2014-01-14 01:48:37 -0800107 assert(t1_new.any.size == (ssize_t)sizeof(test_any_buf1));
Lev Walkin1eded352006-07-13 11:19:01 +0000108 assert(memcmp(t1_new.any.buf, test_any_buf1, sizeof(test_any_buf1)) == 0);
109
110 /*
111 * Test the T1 with primitive encoding.
112 */
113 memset(&t1, 0, sizeof(t1));
Vasil Velichkovcef21e02017-10-09 23:40:17 +0300114 ASN_STRUCT_RESET(asn_DEF_T1, &t1_new);
Lev Walkin1eded352006-07-13 11:19:01 +0000115
116 t1.i = -112233;
117 t1.any.buf = test_any_buf2;
118 t1.any.size = sizeof(test_any_buf2);
119
120 /* Save->Load must succeed */
121 save_object(&t1, td1);
122 ret = load_object(&t1_new, td1);
123
124 assert(ret == 0);
125 assert(t1_new.i == -112233);
Lev Walkin5b63acf2014-01-14 01:48:37 -0800126 assert(t1_new.any.size == (ssize_t)sizeof(test_any_buf2));
Lev Walkin1eded352006-07-13 11:19:01 +0000127 assert(memcmp(t1_new.any.buf, test_any_buf2, sizeof(test_any_buf2)) == 0);
Vasil Velichkovcef21e02017-10-09 23:40:17 +0300128 ASN_STRUCT_RESET(asn_DEF_T1, &t1_new);
Lev Walkin1eded352006-07-13 11:19:01 +0000129
130 /*
131 * Test the T2 empty sequence.
132 */
133 memset(&t2, 0, sizeof(t2));
134 memset(&t2_new, 0, sizeof(t2_new));
135
136 t2.i = 332211;
137 t2.any = calloc(1, sizeof(*t2.any));
138 t2.any->buf = 0;
139 t2.any->size = 0;
140
141 /* Save->Load must succeed */
142 save_object(&t2, td2);
143 ret = load_object(&t2_new, td2);
144
145 assert(ret == 0);
146 assert(t2_new.i == 332211);
147 assert(t2_new.any->size == 0);
148
149 /*
150 * Test the T2 sequence.
151 */
Vasil Velichkovcef21e02017-10-09 23:40:17 +0300152 ASN_STRUCT_RESET(asn_DEF_T2, &t2);
153 ASN_STRUCT_RESET(asn_DEF_T2, &t2_new);
Lev Walkin1eded352006-07-13 11:19:01 +0000154
155 t2.i = 332211;
156 t2.any = calloc(1, sizeof(*t2.any));
157 t2.any->buf = test_any_buf1;
158 t2.any->size = sizeof(test_any_buf1);
159
160 /* Save->Load must succeed */
161 save_object(&t2, td2);
162 ret = load_object(&t2_new, td2);
163
164 assert(ret == 0);
165 assert(t2_new.i == 332211);
Lev Walkin5b63acf2014-01-14 01:48:37 -0800166 assert(t2_new.any->size == (ssize_t)sizeof(test_any_buf1));
Lev Walkin1eded352006-07-13 11:19:01 +0000167 assert(memcmp(t2_new.any->buf, test_any_buf1, sizeof(test_any_buf1)) == 0);
168
169 /*
170 * Test the T2 sequence with primitive encoding.
171 */
Vasil Velichkovcef21e02017-10-09 23:40:17 +0300172 t2.any->buf = NULL;
173 t2.any->size = 0;
174 ASN_STRUCT_RESET(asn_DEF_T2, &t2);
175 ASN_STRUCT_RESET(asn_DEF_T2, &t2_new);
Lev Walkin1eded352006-07-13 11:19:01 +0000176
177 t2.i = 0;
178 t2.any = calloc(1, sizeof(*t2.any));
179 t2.any->buf = test_any_buf2;
180 t2.any->size = sizeof(test_any_buf2);
181
182 /* Save->Load must succeed */
183 save_object(&t2, td2);
184 ret = load_object(&t2_new, td2);
185
186 assert(ret == 0);
187 assert(t2_new.i == 0);
Lev Walkin5b63acf2014-01-14 01:48:37 -0800188 assert(t2_new.any->size == (ssize_t)sizeof(test_any_buf2));
Lev Walkin1eded352006-07-13 11:19:01 +0000189 assert(memcmp(t2_new.any->buf, test_any_buf2, sizeof(test_any_buf2)) == 0);
190
191 /*
192 * Test T2 with ANY element omitted.
193 */
194 free(t2.any);
195 t2.any = 0;
Vasil Velichkovcef21e02017-10-09 23:40:17 +0300196 ASN_STRUCT_RESET(asn_DEF_T2, &t2_new);
Lev Walkin1eded352006-07-13 11:19:01 +0000197
198 save_object(&t2, td2);
199 ret = load_object(&t2_new, td2);
200
201 assert(ret == 0);
202 assert(t2_new.i == 0);
203 assert(t2_new.any == 0);
204
205 printf("OK\n");
206
207 return ret;
208}