blob: aeb2477041d0bb7b74351f345eee82c41838fc09 [file] [log] [blame]
Lev Walkin59b176e2005-11-26 11:25:14 +00001#include <per_support.c>
2#include <assert.h>
3
Lev Walkin523de9e2006-08-18 01:34:18 +00004static void
5check_per_decoding() {
Lev Walkin59b176e2005-11-26 11:25:14 +00006 uint8_t buf[] = { 0xB7, 0x19, 0x2F, 0xEE, 0xAD };
7 uint8_t tmpbuf[10];
8 int32_t z;
9 asn_per_data_t pos;
10
11 pos.buffer = buf;
12 pos.nboff = 0;
13 pos.nbits = sizeof(buf) * 8;
14
15 z = per_get_few_bits(&pos, 32);
16 assert(z == -1);
Lev Walkin60364882005-11-28 06:58:11 +000017 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000018
19 z = per_get_few_bits(&pos, 0);
20 assert(z == 0);
21 assert(pos.nboff == 0);
Lev Walkin60364882005-11-28 06:58:11 +000022 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000023
24 z = per_get_few_bits(&pos, 1);
25 assert(z == 1);
26 assert(pos.nboff == 1);
Lev Walkin60364882005-11-28 06:58:11 +000027 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000028
29 z = per_get_few_bits(&pos, 2);
30 assert(z == 1);
31 assert(pos.nboff == 3);
Lev Walkin60364882005-11-28 06:58:11 +000032 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000033
34 z = per_get_few_bits(&pos, 2);
35 assert(z == 2);
36 assert(pos.nboff == 5);
Lev Walkin60364882005-11-28 06:58:11 +000037 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000038
39 z = per_get_few_bits(&pos, 3);
40 assert(z == 7);
41 assert(pos.nboff == 8);
42 assert(pos.nbits == sizeof(buf) * 8);
43
44 z = per_get_few_bits(&pos, 8);
45 assert(z == 0x19);
46 assert(pos.nboff == 8);
47 assert(pos.nbits == (sizeof(buf) - 1) * 8);
48
49 z = per_get_few_bits(&pos, 1);
50 assert(z == 0);
51 assert(pos.nboff == 1);
52 assert(pos.nbits == (sizeof(buf) - 2) * 8);
53
54 z = per_get_few_bits(&pos, 3);
55 assert(z == 2);
56 assert(pos.nboff == 4);
57 assert(pos.nbits == (sizeof(buf) - 2) * 8);
58
59 z = per_get_few_bits(&pos, 8);
60 assert(z == 254);
61 assert(pos.nboff == 12);
62
63 pos.buffer = buf;
64 pos.nboff = 2;
65 pos.nbits = sizeof(buf) * 8;
66 z = per_get_few_bits(&pos, 24);
67 assert(z == 14443711);
68
Lev Walkin60364882005-11-28 06:58:11 +000069 /* Get full 31-bit range */
70 pos.buffer = buf;
71 pos.nboff = 7;
72 pos.nbits = sizeof(buf) * 8;
73 z = per_get_few_bits(&pos, 31);
74 assert(z == 1179384747);
75
76 /* Get a bit shifted range */
77 pos.buffer = buf;
78 pos.nboff = 6;
79 pos.nbits = sizeof(buf) * 8;
80 z = per_get_few_bits(&pos, 31);
81 assert(z == 1663434197);
82
Lev Walkin59b176e2005-11-26 11:25:14 +000083 pos.buffer = buf;
84 pos.nboff = 0;
85 pos.nbits = sizeof(buf) * 8;
86 z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8);
87 assert(z == 0);
88 assert(buf[0] == tmpbuf[0]);
89 assert(buf[1] == tmpbuf[1]);
90 assert(buf[2] == tmpbuf[2]);
91 assert(buf[3] == tmpbuf[3]);
92 assert(buf[4] == tmpbuf[4]);
93
94 pos.buffer = buf;
95 pos.nboff = 1;
96 pos.nbits = sizeof(buf) * 8;
97 z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8);
98 assert(z == -1);
99
100 pos.buffer = buf;
101 pos.nboff = 1;
102 pos.nbits = sizeof(buf) * 8;
103 z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8 - 1);
104 assert(z == 0);
105 assert(tmpbuf[0] == 110);
106 assert(tmpbuf[1] == 50);
107 assert(tmpbuf[2] == 95);
108 assert(tmpbuf[3] == 221);
109 assert(tmpbuf[4] == 90);
110
111 pos.buffer = buf;
112 pos.nboff = 1;
113 pos.nbits = sizeof(buf) * 8;
114 z = per_get_many_bits(&pos, tmpbuf, 1, sizeof(buf) * 8 - 1);
115 assert(z == 0);
116 assert(tmpbuf[0] == 55);
117 assert(tmpbuf[0] != buf[0]);
118 assert(tmpbuf[1] == buf[1]);
119 assert(tmpbuf[2] == buf[2]);
120 assert(tmpbuf[3] == buf[3]);
121 assert(tmpbuf[4] == buf[4]);
Lev Walkin523de9e2006-08-18 01:34:18 +0000122}
Lev Walkin59b176e2005-11-26 11:25:14 +0000123
Lev Walkin523de9e2006-08-18 01:34:18 +0000124static int Ignore(const void *data, size_t size, void *op_key) {
125 return 0;
126}
127
128static void
129check_per_encoding() {
130 asn_per_outp_t po;
Lev Walkin0bcb49d2006-09-18 21:36:30 +0000131 int ret;
132
Lev Walkin523de9e2006-08-18 01:34:18 +0000133 po.buffer = po.tmpspace;
134 po.nboff = 0;
135 po.nbits = 0;
136 po.outper = Ignore;
137 po.op_key = 0;
138 po.tmpspace[0] = 0xff;
Lev Walkin523de9e2006-08-18 01:34:18 +0000139
140 ret = per_put_few_bits(&po, 0, 0);
141 assert(ret == 0);
142 assert(po.nboff == 0);
143 assert(po.buffer == po.tmpspace);
144 assert(po.tmpspace[0] == 0xff);
145
146 ret = per_put_few_bits(&po, 0, 1);
147 assert(ret == 0);
148 assert(po.nboff == 1);
149 assert(po.nbits == 8 * sizeof(po.tmpspace));
150 assert(po.buffer == po.tmpspace);
151 assert(po.tmpspace[0] == 0x00);
152
153 ret = per_put_few_bits(&po, 1, 1);
154 assert(ret == 0);
155 assert(po.nboff == 2);
156 assert(po.nbits == 8 * sizeof(po.tmpspace));
157 assert(po.buffer == po.tmpspace);
158 assert(po.tmpspace[0] == 0x40);
159
160 ret = per_put_few_bits(&po, 1, 1);
161 assert(ret == 0);
162 assert(po.nboff == 3);
163 assert(po.nbits == 8 * sizeof(po.tmpspace));
164 assert(po.buffer == po.tmpspace);
165 assert(po.tmpspace[0] == 0x60);
166
167 ret = per_put_few_bits(&po, 15, 5);
168 assert(ret == 0);
169 assert(po.nboff == 8);
170 assert(po.nbits == 8 * sizeof(po.tmpspace));
171 assert(po.buffer == po.tmpspace);
172 assert(po.tmpspace[0] == 0x6F);
173
174 ret = per_put_few_bits(&po, 0xf0ff, 16);
175 assert(ret == 0);
176 assert(po.nboff == 16);
177 assert(po.nbits == 8 * sizeof(po.tmpspace) - 8);
178 assert(po.buffer == po.tmpspace + 1);
179 assert(po.tmpspace[0] == 0x6F);
180 assert(po.tmpspace[1] == 0xf0);
181 assert(po.tmpspace[2] == 0xff);
182
183 po.nboff--;
184
185 ret = per_put_few_bits(&po, 2, 1);
186 assert(ret == 0);
187 assert(po.nboff == 8);
188 assert(po.nbits == 8 * sizeof(po.tmpspace) - 16);
189 assert(po.buffer == po.tmpspace + 2);
190 assert(po.tmpspace[0] == 0x6F);
191 assert(po.tmpspace[1] == 0xf0);
192 assert(po.tmpspace[2] == 0xfe);
193
194 ret = per_put_few_bits(&po, 2, 32);
195 assert(ret == -1);
196
197 ret = per_put_few_bits(&po, 2, -1);
198 assert(ret == -1);
199
200 ret = per_put_few_bits(&po, -1, 31);
201 assert(ret == 0);
202 assert(po.nboff == 31);
203 assert(po.nbits == 8 * sizeof(po.tmpspace) - 24);
204 assert(po.buffer == po.tmpspace + 3);
205 assert(po.tmpspace[0] == 0x6F);
206 assert(po.tmpspace[1] == 0xf0);
207 assert(po.tmpspace[2] == 0xfe);
208 assert(po.tmpspace[3] == 0xff);
209 assert(po.tmpspace[4] == 0xff);
210 assert(po.tmpspace[5] == 0xff);
211 assert(po.tmpspace[6] == 0xfe);
212
213
214}
215
216int
217main() {
218 check_per_decoding();
219 check_per_encoding();
Lev Walkin59b176e2005-11-26 11:25:14 +0000220 return 0;
221}