blob: 12e700c46a2a3f40b7d52d64b08a2bcc036ea9dd [file] [log] [blame]
Lev Walkin4eceeba2007-07-23 06:48:26 +00001#include <stdio.h>
Lev Walkin59b176e2005-11-26 11:25:14 +00002#include <assert.h>
3
Lev Walkin4eceeba2007-07-23 06:48:26 +00004#include <per_support.h>
5
Lev Walkin523de9e2006-08-18 01:34:18 +00006static void
7check_per_decoding() {
Lev Walkin59b176e2005-11-26 11:25:14 +00008 uint8_t buf[] = { 0xB7, 0x19, 0x2F, 0xEE, 0xAD };
9 uint8_t tmpbuf[10];
10 int32_t z;
11 asn_per_data_t pos;
Lev Walkinfe3dc602007-06-24 08:47:29 +000012 memset(&pos, 0, sizeof(pos));
Lev Walkin59b176e2005-11-26 11:25:14 +000013
14 pos.buffer = buf;
15 pos.nboff = 0;
16 pos.nbits = sizeof(buf) * 8;
17
18 z = per_get_few_bits(&pos, 32);
19 assert(z == -1);
Lev Walkin60364882005-11-28 06:58:11 +000020 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000021
22 z = per_get_few_bits(&pos, 0);
23 assert(z == 0);
24 assert(pos.nboff == 0);
Lev Walkin60364882005-11-28 06:58:11 +000025 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000026
27 z = per_get_few_bits(&pos, 1);
28 assert(z == 1);
29 assert(pos.nboff == 1);
Lev Walkin60364882005-11-28 06:58:11 +000030 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000031
32 z = per_get_few_bits(&pos, 2);
33 assert(z == 1);
34 assert(pos.nboff == 3);
Lev Walkin60364882005-11-28 06:58:11 +000035 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000036
37 z = per_get_few_bits(&pos, 2);
38 assert(z == 2);
39 assert(pos.nboff == 5);
Lev Walkin60364882005-11-28 06:58:11 +000040 assert(pos.nbits == sizeof(buf) * 8);
Lev Walkin59b176e2005-11-26 11:25:14 +000041
42 z = per_get_few_bits(&pos, 3);
43 assert(z == 7);
44 assert(pos.nboff == 8);
45 assert(pos.nbits == sizeof(buf) * 8);
46
47 z = per_get_few_bits(&pos, 8);
48 assert(z == 0x19);
49 assert(pos.nboff == 8);
50 assert(pos.nbits == (sizeof(buf) - 1) * 8);
51
52 z = per_get_few_bits(&pos, 1);
53 assert(z == 0);
54 assert(pos.nboff == 1);
55 assert(pos.nbits == (sizeof(buf) - 2) * 8);
56
57 z = per_get_few_bits(&pos, 3);
58 assert(z == 2);
59 assert(pos.nboff == 4);
60 assert(pos.nbits == (sizeof(buf) - 2) * 8);
61
62 z = per_get_few_bits(&pos, 8);
63 assert(z == 254);
64 assert(pos.nboff == 12);
65
66 pos.buffer = buf;
67 pos.nboff = 2;
68 pos.nbits = sizeof(buf) * 8;
69 z = per_get_few_bits(&pos, 24);
70 assert(z == 14443711);
71
Lev Walkin60364882005-11-28 06:58:11 +000072 /* Get full 31-bit range */
73 pos.buffer = buf;
74 pos.nboff = 7;
75 pos.nbits = sizeof(buf) * 8;
76 z = per_get_few_bits(&pos, 31);
77 assert(z == 1179384747);
78
79 /* Get a bit shifted range */
80 pos.buffer = buf;
81 pos.nboff = 6;
82 pos.nbits = sizeof(buf) * 8;
83 z = per_get_few_bits(&pos, 31);
84 assert(z == 1663434197);
85
Lev Walkin59b176e2005-11-26 11:25:14 +000086 pos.buffer = buf;
87 pos.nboff = 0;
88 pos.nbits = sizeof(buf) * 8;
89 z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8);
90 assert(z == 0);
91 assert(buf[0] == tmpbuf[0]);
92 assert(buf[1] == tmpbuf[1]);
93 assert(buf[2] == tmpbuf[2]);
94 assert(buf[3] == tmpbuf[3]);
95 assert(buf[4] == tmpbuf[4]);
96
97 pos.buffer = buf;
98 pos.nboff = 1;
99 pos.nbits = sizeof(buf) * 8;
100 z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8);
101 assert(z == -1);
102
103 pos.buffer = buf;
104 pos.nboff = 1;
105 pos.nbits = sizeof(buf) * 8;
106 z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8 - 1);
107 assert(z == 0);
108 assert(tmpbuf[0] == 110);
109 assert(tmpbuf[1] == 50);
110 assert(tmpbuf[2] == 95);
111 assert(tmpbuf[3] == 221);
112 assert(tmpbuf[4] == 90);
113
114 pos.buffer = buf;
115 pos.nboff = 1;
116 pos.nbits = sizeof(buf) * 8;
117 z = per_get_many_bits(&pos, tmpbuf, 1, sizeof(buf) * 8 - 1);
118 assert(z == 0);
119 assert(tmpbuf[0] == 55);
120 assert(tmpbuf[0] != buf[0]);
121 assert(tmpbuf[1] == buf[1]);
122 assert(tmpbuf[2] == buf[2]);
123 assert(tmpbuf[3] == buf[3]);
124 assert(tmpbuf[4] == buf[4]);
Lev Walkin523de9e2006-08-18 01:34:18 +0000125}
Lev Walkin59b176e2005-11-26 11:25:14 +0000126
Lev Walkin523de9e2006-08-18 01:34:18 +0000127static int Ignore(const void *data, size_t size, void *op_key) {
128 return 0;
129}
130
131static void
132check_per_encoding() {
133 asn_per_outp_t po;
Lev Walkin0bcb49d2006-09-18 21:36:30 +0000134 int ret;
135
Lev Walkin523de9e2006-08-18 01:34:18 +0000136 po.buffer = po.tmpspace;
137 po.nboff = 0;
138 po.nbits = 0;
139 po.outper = Ignore;
140 po.op_key = 0;
141 po.tmpspace[0] = 0xff;
Lev Walkin523de9e2006-08-18 01:34:18 +0000142
143 ret = per_put_few_bits(&po, 0, 0);
144 assert(ret == 0);
145 assert(po.nboff == 0);
146 assert(po.buffer == po.tmpspace);
147 assert(po.tmpspace[0] == 0xff);
148
149 ret = per_put_few_bits(&po, 0, 1);
150 assert(ret == 0);
151 assert(po.nboff == 1);
152 assert(po.nbits == 8 * sizeof(po.tmpspace));
153 assert(po.buffer == po.tmpspace);
154 assert(po.tmpspace[0] == 0x00);
155
156 ret = per_put_few_bits(&po, 1, 1);
157 assert(ret == 0);
158 assert(po.nboff == 2);
159 assert(po.nbits == 8 * sizeof(po.tmpspace));
160 assert(po.buffer == po.tmpspace);
161 assert(po.tmpspace[0] == 0x40);
162
163 ret = per_put_few_bits(&po, 1, 1);
164 assert(ret == 0);
165 assert(po.nboff == 3);
166 assert(po.nbits == 8 * sizeof(po.tmpspace));
167 assert(po.buffer == po.tmpspace);
168 assert(po.tmpspace[0] == 0x60);
169
170 ret = per_put_few_bits(&po, 15, 5);
171 assert(ret == 0);
172 assert(po.nboff == 8);
173 assert(po.nbits == 8 * sizeof(po.tmpspace));
174 assert(po.buffer == po.tmpspace);
175 assert(po.tmpspace[0] == 0x6F);
176
177 ret = per_put_few_bits(&po, 0xf0ff, 16);
178 assert(ret == 0);
179 assert(po.nboff == 16);
180 assert(po.nbits == 8 * sizeof(po.tmpspace) - 8);
181 assert(po.buffer == po.tmpspace + 1);
182 assert(po.tmpspace[0] == 0x6F);
183 assert(po.tmpspace[1] == 0xf0);
184 assert(po.tmpspace[2] == 0xff);
185
186 po.nboff--;
187
188 ret = per_put_few_bits(&po, 2, 1);
189 assert(ret == 0);
190 assert(po.nboff == 8);
191 assert(po.nbits == 8 * sizeof(po.tmpspace) - 16);
192 assert(po.buffer == po.tmpspace + 2);
193 assert(po.tmpspace[0] == 0x6F);
194 assert(po.tmpspace[1] == 0xf0);
195 assert(po.tmpspace[2] == 0xfe);
196
197 ret = per_put_few_bits(&po, 2, 32);
198 assert(ret == -1);
199
200 ret = per_put_few_bits(&po, 2, -1);
201 assert(ret == -1);
202
203 ret = per_put_few_bits(&po, -1, 31);
204 assert(ret == 0);
205 assert(po.nboff == 31);
206 assert(po.nbits == 8 * sizeof(po.tmpspace) - 24);
207 assert(po.buffer == po.tmpspace + 3);
208 assert(po.tmpspace[0] == 0x6F);
209 assert(po.tmpspace[1] == 0xf0);
210 assert(po.tmpspace[2] == 0xfe);
211 assert(po.tmpspace[3] == 0xff);
212 assert(po.tmpspace[4] == 0xff);
213 assert(po.tmpspace[5] == 0xff);
214 assert(po.tmpspace[6] == 0xfe);
215
216
217}
218
219int
220main() {
221 check_per_decoding();
222 check_per_encoding();
Lev Walkin59b176e2005-11-26 11:25:14 +0000223 return 0;
224}