1*0a6a1f1dSLionel Sambuc /* $NetBSD: check-der.c,v 1.1.1.2 2014/04/24 12:45:28 pettai Exp $ */
2ebfedea0SLionel Sambuc
3ebfedea0SLionel Sambuc /*
4ebfedea0SLionel Sambuc * Copyright (c) 1999 - 2007 Kungliga Tekniska Högskolan
5ebfedea0SLionel Sambuc * (Royal Institute of Technology, Stockholm, Sweden).
6ebfedea0SLionel Sambuc * All rights reserved.
7ebfedea0SLionel Sambuc *
8ebfedea0SLionel Sambuc * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
9ebfedea0SLionel Sambuc *
10ebfedea0SLionel Sambuc * Redistribution and use in source and binary forms, with or without
11ebfedea0SLionel Sambuc * modification, are permitted provided that the following conditions
12ebfedea0SLionel Sambuc * are met:
13ebfedea0SLionel Sambuc *
14ebfedea0SLionel Sambuc * 1. Redistributions of source code must retain the above copyright
15ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer.
16ebfedea0SLionel Sambuc *
17ebfedea0SLionel Sambuc * 2. Redistributions in binary form must reproduce the above copyright
18ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer in the
19ebfedea0SLionel Sambuc * documentation and/or other materials provided with the distribution.
20ebfedea0SLionel Sambuc *
21ebfedea0SLionel Sambuc * 3. Neither the name of the Institute nor the names of its contributors
22ebfedea0SLionel Sambuc * may be used to endorse or promote products derived from this software
23ebfedea0SLionel Sambuc * without specific prior written permission.
24ebfedea0SLionel Sambuc *
25ebfedea0SLionel Sambuc * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
26ebfedea0SLionel Sambuc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27ebfedea0SLionel Sambuc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28ebfedea0SLionel Sambuc * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
29ebfedea0SLionel Sambuc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30ebfedea0SLionel Sambuc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31ebfedea0SLionel Sambuc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32ebfedea0SLionel Sambuc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33ebfedea0SLionel Sambuc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34ebfedea0SLionel Sambuc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35ebfedea0SLionel Sambuc * SUCH DAMAGE.
36ebfedea0SLionel Sambuc */
37ebfedea0SLionel Sambuc
38ebfedea0SLionel Sambuc #include "der_locl.h"
39ebfedea0SLionel Sambuc #include <err.h>
40ebfedea0SLionel Sambuc #include <krb5/roken.h>
41ebfedea0SLionel Sambuc
42ebfedea0SLionel Sambuc #include <krb5/asn1-common.h>
43ebfedea0SLionel Sambuc #include <krb5/asn1_err.h>
44ebfedea0SLionel Sambuc #include <krb5/der.h>
45ebfedea0SLionel Sambuc
46ebfedea0SLionel Sambuc #include "check-common.h"
47ebfedea0SLionel Sambuc
48*0a6a1f1dSLionel Sambuc __RCSID("NetBSD");
49ebfedea0SLionel Sambuc
50ebfedea0SLionel Sambuc static int
cmp_integer(void * a,void * b)51ebfedea0SLionel Sambuc cmp_integer (void *a, void *b)
52ebfedea0SLionel Sambuc {
53ebfedea0SLionel Sambuc int *ia = (int *)a;
54ebfedea0SLionel Sambuc int *ib = (int *)b;
55ebfedea0SLionel Sambuc
56ebfedea0SLionel Sambuc return *ib - *ia;
57ebfedea0SLionel Sambuc }
58ebfedea0SLionel Sambuc
59ebfedea0SLionel Sambuc static int
test_integer(void)60ebfedea0SLionel Sambuc test_integer (void)
61ebfedea0SLionel Sambuc {
62ebfedea0SLionel Sambuc struct test_case tests[] = {
63ebfedea0SLionel Sambuc {NULL, 1, "\x00"},
64ebfedea0SLionel Sambuc {NULL, 1, "\x7f"},
65ebfedea0SLionel Sambuc {NULL, 2, "\x00\x80"},
66ebfedea0SLionel Sambuc {NULL, 2, "\x01\x00"},
67ebfedea0SLionel Sambuc {NULL, 1, "\x80"},
68ebfedea0SLionel Sambuc {NULL, 2, "\xff\x7f"},
69ebfedea0SLionel Sambuc {NULL, 1, "\xff"},
70ebfedea0SLionel Sambuc {NULL, 2, "\xff\x01"},
71ebfedea0SLionel Sambuc {NULL, 2, "\x00\xff"},
72ebfedea0SLionel Sambuc {NULL, 4, "\x7f\xff\xff\xff"}
73ebfedea0SLionel Sambuc };
74ebfedea0SLionel Sambuc
75ebfedea0SLionel Sambuc int values[] = {0, 127, 128, 256, -128, -129, -1, -255, 255,
76ebfedea0SLionel Sambuc 0x7fffffff};
77ebfedea0SLionel Sambuc int i, ret;
78ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
79ebfedea0SLionel Sambuc
80ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i) {
81ebfedea0SLionel Sambuc tests[i].val = &values[i];
82ebfedea0SLionel Sambuc if (asprintf (&tests[i].name, "integer %d", values[i]) < 0)
83ebfedea0SLionel Sambuc errx(1, "malloc");
84ebfedea0SLionel Sambuc if (tests[i].name == NULL)
85ebfedea0SLionel Sambuc errx(1, "malloc");
86ebfedea0SLionel Sambuc }
87ebfedea0SLionel Sambuc
88ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(int),
89ebfedea0SLionel Sambuc (generic_encode)der_put_integer,
90ebfedea0SLionel Sambuc (generic_length) der_length_integer,
91ebfedea0SLionel Sambuc (generic_decode)der_get_integer,
92ebfedea0SLionel Sambuc (generic_free)NULL,
93ebfedea0SLionel Sambuc cmp_integer,
94ebfedea0SLionel Sambuc NULL);
95ebfedea0SLionel Sambuc
96ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i)
97ebfedea0SLionel Sambuc free (tests[i].name);
98ebfedea0SLionel Sambuc return ret;
99ebfedea0SLionel Sambuc }
100ebfedea0SLionel Sambuc
101ebfedea0SLionel Sambuc static int
test_one_int(int val)102ebfedea0SLionel Sambuc test_one_int(int val)
103ebfedea0SLionel Sambuc {
104ebfedea0SLionel Sambuc int ret, dval;
105ebfedea0SLionel Sambuc unsigned char *buf;
106ebfedea0SLionel Sambuc size_t len_len, len;
107ebfedea0SLionel Sambuc
108ebfedea0SLionel Sambuc len = _heim_len_int(val);
109ebfedea0SLionel Sambuc
110ebfedea0SLionel Sambuc buf = emalloc(len + 2);
111ebfedea0SLionel Sambuc
112ebfedea0SLionel Sambuc buf[0] = '\xff';
113ebfedea0SLionel Sambuc buf[len + 1] = '\xff';
114ebfedea0SLionel Sambuc memset(buf + 1, 0, len);
115ebfedea0SLionel Sambuc
116ebfedea0SLionel Sambuc ret = der_put_integer(buf + 1 + len - 1, len, &val, &len_len);
117ebfedea0SLionel Sambuc if (ret) {
118ebfedea0SLionel Sambuc printf("integer %d encode failed %d\n", val, ret);
119ebfedea0SLionel Sambuc return 1;
120ebfedea0SLionel Sambuc }
121ebfedea0SLionel Sambuc if (len != len_len) {
122ebfedea0SLionel Sambuc printf("integer %d encode fail with %d len %lu, result len %lu\n",
123ebfedea0SLionel Sambuc val, ret, (unsigned long)len, (unsigned long)len_len);
124ebfedea0SLionel Sambuc return 1;
125ebfedea0SLionel Sambuc }
126ebfedea0SLionel Sambuc
127ebfedea0SLionel Sambuc ret = der_get_integer(buf + 1, len, &dval, &len_len);
128ebfedea0SLionel Sambuc if (ret) {
129ebfedea0SLionel Sambuc printf("integer %d decode failed %d\n", val, ret);
130ebfedea0SLionel Sambuc return 1;
131ebfedea0SLionel Sambuc }
132ebfedea0SLionel Sambuc if (len != len_len) {
133ebfedea0SLionel Sambuc printf("integer %d decoded diffrent len %lu != %lu",
134ebfedea0SLionel Sambuc val, (unsigned long)len, (unsigned long)len_len);
135ebfedea0SLionel Sambuc return 1;
136ebfedea0SLionel Sambuc }
137ebfedea0SLionel Sambuc if (val != dval) {
138ebfedea0SLionel Sambuc printf("decode decoded to diffrent value %d != %d",
139ebfedea0SLionel Sambuc val, dval);
140ebfedea0SLionel Sambuc return 1;
141ebfedea0SLionel Sambuc }
142ebfedea0SLionel Sambuc
143ebfedea0SLionel Sambuc if (buf[0] != (unsigned char)'\xff') {
144ebfedea0SLionel Sambuc printf("precanary dead %d\n", val);
145ebfedea0SLionel Sambuc return 1;
146ebfedea0SLionel Sambuc }
147ebfedea0SLionel Sambuc if (buf[len + 1] != (unsigned char)'\xff') {
148ebfedea0SLionel Sambuc printf("postecanary dead %d\n", val);
149ebfedea0SLionel Sambuc return 1;
150ebfedea0SLionel Sambuc }
151ebfedea0SLionel Sambuc free(buf);
152ebfedea0SLionel Sambuc return 0;
153ebfedea0SLionel Sambuc }
154ebfedea0SLionel Sambuc
155ebfedea0SLionel Sambuc static int
test_integer_more(void)156ebfedea0SLionel Sambuc test_integer_more (void)
157ebfedea0SLionel Sambuc {
158ebfedea0SLionel Sambuc int i, n1, n2, n3, n4, n5, n6;
159ebfedea0SLionel Sambuc
160ebfedea0SLionel Sambuc n2 = 0;
161ebfedea0SLionel Sambuc for (i = 0; i < (sizeof(int) * 8); i++) {
162ebfedea0SLionel Sambuc n1 = 0x01 << i;
163ebfedea0SLionel Sambuc n2 = n2 | n1;
164ebfedea0SLionel Sambuc n3 = ~n1;
165ebfedea0SLionel Sambuc n4 = ~n2;
166ebfedea0SLionel Sambuc n5 = (-1) & ~(0x3f << i);
167ebfedea0SLionel Sambuc n6 = (-1) & ~(0x7f << i);
168ebfedea0SLionel Sambuc
169ebfedea0SLionel Sambuc test_one_int(n1);
170ebfedea0SLionel Sambuc test_one_int(n2);
171ebfedea0SLionel Sambuc test_one_int(n3);
172ebfedea0SLionel Sambuc test_one_int(n4);
173ebfedea0SLionel Sambuc test_one_int(n5);
174ebfedea0SLionel Sambuc test_one_int(n6);
175ebfedea0SLionel Sambuc }
176ebfedea0SLionel Sambuc return 0;
177ebfedea0SLionel Sambuc }
178ebfedea0SLionel Sambuc
179ebfedea0SLionel Sambuc static int
cmp_unsigned(void * a,void * b)180ebfedea0SLionel Sambuc cmp_unsigned (void *a, void *b)
181ebfedea0SLionel Sambuc {
182ebfedea0SLionel Sambuc return *(unsigned int*)b - *(unsigned int*)a;
183ebfedea0SLionel Sambuc }
184ebfedea0SLionel Sambuc
185ebfedea0SLionel Sambuc static int
test_unsigned(void)186ebfedea0SLionel Sambuc test_unsigned (void)
187ebfedea0SLionel Sambuc {
188ebfedea0SLionel Sambuc struct test_case tests[] = {
189ebfedea0SLionel Sambuc {NULL, 1, "\x00"},
190ebfedea0SLionel Sambuc {NULL, 1, "\x7f"},
191ebfedea0SLionel Sambuc {NULL, 2, "\x00\x80"},
192ebfedea0SLionel Sambuc {NULL, 2, "\x01\x00"},
193ebfedea0SLionel Sambuc {NULL, 2, "\x02\x00"},
194ebfedea0SLionel Sambuc {NULL, 3, "\x00\x80\x00"},
195ebfedea0SLionel Sambuc {NULL, 5, "\x00\x80\x00\x00\x00"},
196ebfedea0SLionel Sambuc {NULL, 4, "\x7f\xff\xff\xff"}
197ebfedea0SLionel Sambuc };
198ebfedea0SLionel Sambuc
199ebfedea0SLionel Sambuc unsigned int values[] = {0, 127, 128, 256, 512, 32768,
200ebfedea0SLionel Sambuc 0x80000000, 0x7fffffff};
201ebfedea0SLionel Sambuc int i, ret;
202ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
203ebfedea0SLionel Sambuc
204ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i) {
205ebfedea0SLionel Sambuc tests[i].val = &values[i];
206ebfedea0SLionel Sambuc if (asprintf (&tests[i].name, "unsigned %u", values[i]) < 0)
207ebfedea0SLionel Sambuc errx(1, "malloc");
208ebfedea0SLionel Sambuc if (tests[i].name == NULL)
209ebfedea0SLionel Sambuc errx(1, "malloc");
210ebfedea0SLionel Sambuc }
211ebfedea0SLionel Sambuc
212ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(int),
213ebfedea0SLionel Sambuc (generic_encode)der_put_unsigned,
214ebfedea0SLionel Sambuc (generic_length)der_length_unsigned,
215ebfedea0SLionel Sambuc (generic_decode)der_get_unsigned,
216ebfedea0SLionel Sambuc (generic_free)NULL,
217ebfedea0SLionel Sambuc cmp_unsigned,
218ebfedea0SLionel Sambuc NULL);
219ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i)
220ebfedea0SLionel Sambuc free (tests[i].name);
221ebfedea0SLionel Sambuc return ret;
222ebfedea0SLionel Sambuc }
223ebfedea0SLionel Sambuc
224ebfedea0SLionel Sambuc static int
cmp_octet_string(void * a,void * b)225ebfedea0SLionel Sambuc cmp_octet_string (void *a, void *b)
226ebfedea0SLionel Sambuc {
227ebfedea0SLionel Sambuc heim_octet_string *oa = (heim_octet_string *)a;
228ebfedea0SLionel Sambuc heim_octet_string *ob = (heim_octet_string *)b;
229ebfedea0SLionel Sambuc
230ebfedea0SLionel Sambuc if (oa->length != ob->length)
231ebfedea0SLionel Sambuc return ob->length - oa->length;
232ebfedea0SLionel Sambuc
233ebfedea0SLionel Sambuc return (memcmp (oa->data, ob->data, oa->length));
234ebfedea0SLionel Sambuc }
235ebfedea0SLionel Sambuc
236ebfedea0SLionel Sambuc static int
test_octet_string(void)237ebfedea0SLionel Sambuc test_octet_string (void)
238ebfedea0SLionel Sambuc {
239ebfedea0SLionel Sambuc heim_octet_string s1 = {8, "\x01\x23\x45\x67\x89\xab\xcd\xef"};
240ebfedea0SLionel Sambuc
241ebfedea0SLionel Sambuc struct test_case tests[] = {
242ebfedea0SLionel Sambuc {NULL, 8, "\x01\x23\x45\x67\x89\xab\xcd\xef"}
243ebfedea0SLionel Sambuc };
244ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
245ebfedea0SLionel Sambuc int ret;
246ebfedea0SLionel Sambuc
247ebfedea0SLionel Sambuc tests[0].val = &s1;
248ebfedea0SLionel Sambuc if (asprintf (&tests[0].name, "a octet string") < 0)
249ebfedea0SLionel Sambuc errx(1, "malloc");
250ebfedea0SLionel Sambuc if (tests[0].name == NULL)
251ebfedea0SLionel Sambuc errx(1, "malloc");
252ebfedea0SLionel Sambuc
253ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(heim_octet_string),
254ebfedea0SLionel Sambuc (generic_encode)der_put_octet_string,
255ebfedea0SLionel Sambuc (generic_length)der_length_octet_string,
256ebfedea0SLionel Sambuc (generic_decode)der_get_octet_string,
257ebfedea0SLionel Sambuc (generic_free)der_free_octet_string,
258ebfedea0SLionel Sambuc cmp_octet_string,
259ebfedea0SLionel Sambuc NULL);
260ebfedea0SLionel Sambuc free(tests[0].name);
261ebfedea0SLionel Sambuc return ret;
262ebfedea0SLionel Sambuc }
263ebfedea0SLionel Sambuc
264ebfedea0SLionel Sambuc static int
cmp_bmp_string(void * a,void * b)265ebfedea0SLionel Sambuc cmp_bmp_string (void *a, void *b)
266ebfedea0SLionel Sambuc {
267ebfedea0SLionel Sambuc heim_bmp_string *oa = (heim_bmp_string *)a;
268ebfedea0SLionel Sambuc heim_bmp_string *ob = (heim_bmp_string *)b;
269ebfedea0SLionel Sambuc
270ebfedea0SLionel Sambuc return der_heim_bmp_string_cmp(oa, ob);
271ebfedea0SLionel Sambuc }
272ebfedea0SLionel Sambuc
273ebfedea0SLionel Sambuc static uint16_t bmp_d1[] = { 32 };
274ebfedea0SLionel Sambuc static uint16_t bmp_d2[] = { 32, 32 };
275ebfedea0SLionel Sambuc
276ebfedea0SLionel Sambuc static int
test_bmp_string(void)277ebfedea0SLionel Sambuc test_bmp_string (void)
278ebfedea0SLionel Sambuc {
279ebfedea0SLionel Sambuc heim_bmp_string s1 = { 1, bmp_d1 };
280ebfedea0SLionel Sambuc heim_bmp_string s2 = { 2, bmp_d2 };
281ebfedea0SLionel Sambuc
282ebfedea0SLionel Sambuc struct test_case tests[] = {
283ebfedea0SLionel Sambuc {NULL, 2, "\x00\x20"},
284ebfedea0SLionel Sambuc {NULL, 4, "\x00\x20\x00\x20"}
285ebfedea0SLionel Sambuc };
286ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
287ebfedea0SLionel Sambuc int ret;
288ebfedea0SLionel Sambuc
289ebfedea0SLionel Sambuc tests[0].val = &s1;
290ebfedea0SLionel Sambuc if (asprintf (&tests[0].name, "a bmp string") < 0)
291ebfedea0SLionel Sambuc errx(1, "malloc");
292ebfedea0SLionel Sambuc if (tests[0].name == NULL)
293ebfedea0SLionel Sambuc errx(1, "malloc");
294ebfedea0SLionel Sambuc tests[1].val = &s2;
295ebfedea0SLionel Sambuc if (asprintf (&tests[1].name, "second bmp string") < 0)
296ebfedea0SLionel Sambuc errx(1, "malloc");
297ebfedea0SLionel Sambuc if (tests[1].name == NULL)
298ebfedea0SLionel Sambuc errx(1, "malloc");
299ebfedea0SLionel Sambuc
300ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(heim_bmp_string),
301ebfedea0SLionel Sambuc (generic_encode)der_put_bmp_string,
302ebfedea0SLionel Sambuc (generic_length)der_length_bmp_string,
303ebfedea0SLionel Sambuc (generic_decode)der_get_bmp_string,
304ebfedea0SLionel Sambuc (generic_free)der_free_bmp_string,
305ebfedea0SLionel Sambuc cmp_bmp_string,
306ebfedea0SLionel Sambuc NULL);
307ebfedea0SLionel Sambuc free(tests[0].name);
308ebfedea0SLionel Sambuc free(tests[1].name);
309ebfedea0SLionel Sambuc return ret;
310ebfedea0SLionel Sambuc }
311ebfedea0SLionel Sambuc
312ebfedea0SLionel Sambuc static int
cmp_universal_string(void * a,void * b)313ebfedea0SLionel Sambuc cmp_universal_string (void *a, void *b)
314ebfedea0SLionel Sambuc {
315ebfedea0SLionel Sambuc heim_universal_string *oa = (heim_universal_string *)a;
316ebfedea0SLionel Sambuc heim_universal_string *ob = (heim_universal_string *)b;
317ebfedea0SLionel Sambuc
318ebfedea0SLionel Sambuc return der_heim_universal_string_cmp(oa, ob);
319ebfedea0SLionel Sambuc }
320ebfedea0SLionel Sambuc
321ebfedea0SLionel Sambuc static uint32_t universal_d1[] = { 32 };
322ebfedea0SLionel Sambuc static uint32_t universal_d2[] = { 32, 32 };
323ebfedea0SLionel Sambuc
324ebfedea0SLionel Sambuc static int
test_universal_string(void)325ebfedea0SLionel Sambuc test_universal_string (void)
326ebfedea0SLionel Sambuc {
327ebfedea0SLionel Sambuc heim_universal_string s1 = { 1, universal_d1 };
328ebfedea0SLionel Sambuc heim_universal_string s2 = { 2, universal_d2 };
329ebfedea0SLionel Sambuc
330ebfedea0SLionel Sambuc struct test_case tests[] = {
331ebfedea0SLionel Sambuc {NULL, 4, "\x00\x00\x00\x20"},
332ebfedea0SLionel Sambuc {NULL, 8, "\x00\x00\x00\x20\x00\x00\x00\x20"}
333ebfedea0SLionel Sambuc };
334ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
335ebfedea0SLionel Sambuc int ret;
336ebfedea0SLionel Sambuc
337ebfedea0SLionel Sambuc tests[0].val = &s1;
338ebfedea0SLionel Sambuc if (asprintf (&tests[0].name, "a universal string") < 0)
339ebfedea0SLionel Sambuc errx(1, "malloc");
340ebfedea0SLionel Sambuc if (tests[0].name == NULL)
341ebfedea0SLionel Sambuc errx(1, "malloc");
342ebfedea0SLionel Sambuc tests[1].val = &s2;
343ebfedea0SLionel Sambuc if (asprintf (&tests[1].name, "second universal string") < 0)
344ebfedea0SLionel Sambuc errx(1, "malloc");
345ebfedea0SLionel Sambuc if (tests[1].name == NULL)
346ebfedea0SLionel Sambuc errx(1, "malloc");
347ebfedea0SLionel Sambuc
348ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(heim_universal_string),
349ebfedea0SLionel Sambuc (generic_encode)der_put_universal_string,
350ebfedea0SLionel Sambuc (generic_length)der_length_universal_string,
351ebfedea0SLionel Sambuc (generic_decode)der_get_universal_string,
352ebfedea0SLionel Sambuc (generic_free)der_free_universal_string,
353ebfedea0SLionel Sambuc cmp_universal_string,
354ebfedea0SLionel Sambuc NULL);
355ebfedea0SLionel Sambuc free(tests[0].name);
356ebfedea0SLionel Sambuc free(tests[1].name);
357ebfedea0SLionel Sambuc return ret;
358ebfedea0SLionel Sambuc }
359ebfedea0SLionel Sambuc
360ebfedea0SLionel Sambuc static int
cmp_general_string(void * a,void * b)361ebfedea0SLionel Sambuc cmp_general_string (void *a, void *b)
362ebfedea0SLionel Sambuc {
363ebfedea0SLionel Sambuc char **sa = (char **)a;
364ebfedea0SLionel Sambuc char **sb = (char **)b;
365ebfedea0SLionel Sambuc
366ebfedea0SLionel Sambuc return strcmp (*sa, *sb);
367ebfedea0SLionel Sambuc }
368ebfedea0SLionel Sambuc
369ebfedea0SLionel Sambuc static int
test_general_string(void)370ebfedea0SLionel Sambuc test_general_string (void)
371ebfedea0SLionel Sambuc {
372ebfedea0SLionel Sambuc char *s1 = "Test User 1";
373ebfedea0SLionel Sambuc
374ebfedea0SLionel Sambuc struct test_case tests[] = {
375ebfedea0SLionel Sambuc {NULL, 11, "\x54\x65\x73\x74\x20\x55\x73\x65\x72\x20\x31"}
376ebfedea0SLionel Sambuc };
377ebfedea0SLionel Sambuc int ret, ntests = sizeof(tests) / sizeof(*tests);
378ebfedea0SLionel Sambuc
379ebfedea0SLionel Sambuc tests[0].val = &s1;
380ebfedea0SLionel Sambuc if (asprintf (&tests[0].name, "the string \"%s\"", s1) < 0)
381ebfedea0SLionel Sambuc errx(1, "malloc");
382ebfedea0SLionel Sambuc if (tests[0].name == NULL)
383ebfedea0SLionel Sambuc errx(1, "malloc");
384ebfedea0SLionel Sambuc
385ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(unsigned char *),
386ebfedea0SLionel Sambuc (generic_encode)der_put_general_string,
387ebfedea0SLionel Sambuc (generic_length)der_length_general_string,
388ebfedea0SLionel Sambuc (generic_decode)der_get_general_string,
389ebfedea0SLionel Sambuc (generic_free)der_free_general_string,
390ebfedea0SLionel Sambuc cmp_general_string,
391ebfedea0SLionel Sambuc NULL);
392ebfedea0SLionel Sambuc free(tests[0].name);
393ebfedea0SLionel Sambuc return ret;
394ebfedea0SLionel Sambuc }
395ebfedea0SLionel Sambuc
396ebfedea0SLionel Sambuc static int
cmp_generalized_time(void * a,void * b)397ebfedea0SLionel Sambuc cmp_generalized_time (void *a, void *b)
398ebfedea0SLionel Sambuc {
399ebfedea0SLionel Sambuc time_t *ta = (time_t *)a;
400ebfedea0SLionel Sambuc time_t *tb = (time_t *)b;
401ebfedea0SLionel Sambuc
402ebfedea0SLionel Sambuc return *tb - *ta;
403ebfedea0SLionel Sambuc }
404ebfedea0SLionel Sambuc
405ebfedea0SLionel Sambuc static int
test_generalized_time(void)406ebfedea0SLionel Sambuc test_generalized_time (void)
407ebfedea0SLionel Sambuc {
408ebfedea0SLionel Sambuc struct test_case tests[] = {
409ebfedea0SLionel Sambuc {NULL, 15, "19700101000000Z"},
410ebfedea0SLionel Sambuc {NULL, 15, "19851106210627Z"}
411ebfedea0SLionel Sambuc };
412ebfedea0SLionel Sambuc time_t values[] = {0, 500159187};
413ebfedea0SLionel Sambuc int i, ret;
414ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
415ebfedea0SLionel Sambuc
416ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i) {
417ebfedea0SLionel Sambuc tests[i].val = &values[i];
418ebfedea0SLionel Sambuc if (asprintf (&tests[i].name, "time %d", (int)values[i]) < 0)
419ebfedea0SLionel Sambuc errx(1, "malloc");
420ebfedea0SLionel Sambuc if (tests[i].name == NULL)
421ebfedea0SLionel Sambuc errx(1, "malloc");
422ebfedea0SLionel Sambuc }
423ebfedea0SLionel Sambuc
424ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(time_t),
425ebfedea0SLionel Sambuc (generic_encode)der_put_generalized_time,
426ebfedea0SLionel Sambuc (generic_length)der_length_generalized_time,
427ebfedea0SLionel Sambuc (generic_decode)der_get_generalized_time,
428ebfedea0SLionel Sambuc (generic_free)NULL,
429ebfedea0SLionel Sambuc cmp_generalized_time,
430ebfedea0SLionel Sambuc NULL);
431ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i)
432ebfedea0SLionel Sambuc free(tests[i].name);
433ebfedea0SLionel Sambuc return ret;
434ebfedea0SLionel Sambuc }
435ebfedea0SLionel Sambuc
436ebfedea0SLionel Sambuc static int
test_cmp_oid(void * a,void * b)437ebfedea0SLionel Sambuc test_cmp_oid (void *a, void *b)
438ebfedea0SLionel Sambuc {
439ebfedea0SLionel Sambuc return der_heim_oid_cmp((heim_oid *)a, (heim_oid *)b);
440ebfedea0SLionel Sambuc }
441ebfedea0SLionel Sambuc
442ebfedea0SLionel Sambuc static unsigned oid_comp1[] = { 1, 1, 1 };
443ebfedea0SLionel Sambuc static unsigned oid_comp2[] = { 1, 1 };
444ebfedea0SLionel Sambuc static unsigned oid_comp3[] = { 6, 15, 1 };
445ebfedea0SLionel Sambuc static unsigned oid_comp4[] = { 6, 15 };
446ebfedea0SLionel Sambuc
447ebfedea0SLionel Sambuc static int
test_oid(void)448ebfedea0SLionel Sambuc test_oid (void)
449ebfedea0SLionel Sambuc {
450ebfedea0SLionel Sambuc struct test_case tests[] = {
451ebfedea0SLionel Sambuc {NULL, 2, "\x29\x01"},
452ebfedea0SLionel Sambuc {NULL, 1, "\x29"},
453ebfedea0SLionel Sambuc {NULL, 2, "\xff\x01"},
454ebfedea0SLionel Sambuc {NULL, 1, "\xff"}
455ebfedea0SLionel Sambuc };
456ebfedea0SLionel Sambuc heim_oid values[] = {
457ebfedea0SLionel Sambuc { 3, oid_comp1 },
458ebfedea0SLionel Sambuc { 2, oid_comp2 },
459ebfedea0SLionel Sambuc { 3, oid_comp3 },
460ebfedea0SLionel Sambuc { 2, oid_comp4 }
461ebfedea0SLionel Sambuc };
462ebfedea0SLionel Sambuc int i, ret;
463ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
464ebfedea0SLionel Sambuc
465ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i) {
466ebfedea0SLionel Sambuc tests[i].val = &values[i];
467ebfedea0SLionel Sambuc if (asprintf (&tests[i].name, "oid %d", i) < 0)
468ebfedea0SLionel Sambuc errx(1, "malloc");
469ebfedea0SLionel Sambuc if (tests[i].name == NULL)
470ebfedea0SLionel Sambuc errx(1, "malloc");
471ebfedea0SLionel Sambuc }
472ebfedea0SLionel Sambuc
473ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(heim_oid),
474ebfedea0SLionel Sambuc (generic_encode)der_put_oid,
475ebfedea0SLionel Sambuc (generic_length)der_length_oid,
476ebfedea0SLionel Sambuc (generic_decode)der_get_oid,
477ebfedea0SLionel Sambuc (generic_free)der_free_oid,
478ebfedea0SLionel Sambuc test_cmp_oid,
479ebfedea0SLionel Sambuc NULL);
480ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i)
481ebfedea0SLionel Sambuc free(tests[i].name);
482ebfedea0SLionel Sambuc return ret;
483ebfedea0SLionel Sambuc }
484ebfedea0SLionel Sambuc
485ebfedea0SLionel Sambuc static int
test_cmp_bit_string(void * a,void * b)486ebfedea0SLionel Sambuc test_cmp_bit_string (void *a, void *b)
487ebfedea0SLionel Sambuc {
488ebfedea0SLionel Sambuc return der_heim_bit_string_cmp((heim_bit_string *)a, (heim_bit_string *)b);
489ebfedea0SLionel Sambuc }
490ebfedea0SLionel Sambuc
491ebfedea0SLionel Sambuc static int
test_bit_string(void)492ebfedea0SLionel Sambuc test_bit_string (void)
493ebfedea0SLionel Sambuc {
494ebfedea0SLionel Sambuc struct test_case tests[] = {
495ebfedea0SLionel Sambuc {NULL, 1, "\x00"}
496ebfedea0SLionel Sambuc };
497ebfedea0SLionel Sambuc heim_bit_string values[] = {
498ebfedea0SLionel Sambuc { 0, "" }
499ebfedea0SLionel Sambuc };
500ebfedea0SLionel Sambuc int i, ret;
501ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
502ebfedea0SLionel Sambuc
503ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i) {
504ebfedea0SLionel Sambuc tests[i].val = &values[i];
505ebfedea0SLionel Sambuc if (asprintf (&tests[i].name, "bit_string %d", i) < 0)
506ebfedea0SLionel Sambuc errx(1, "malloc");
507ebfedea0SLionel Sambuc if (tests[i].name == NULL)
508ebfedea0SLionel Sambuc errx(1, "malloc");
509ebfedea0SLionel Sambuc }
510ebfedea0SLionel Sambuc
511ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(heim_bit_string),
512ebfedea0SLionel Sambuc (generic_encode)der_put_bit_string,
513ebfedea0SLionel Sambuc (generic_length)der_length_bit_string,
514ebfedea0SLionel Sambuc (generic_decode)der_get_bit_string,
515ebfedea0SLionel Sambuc (generic_free)der_free_bit_string,
516ebfedea0SLionel Sambuc test_cmp_bit_string,
517ebfedea0SLionel Sambuc NULL);
518ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i)
519ebfedea0SLionel Sambuc free(tests[i].name);
520ebfedea0SLionel Sambuc return ret;
521ebfedea0SLionel Sambuc }
522ebfedea0SLionel Sambuc
523ebfedea0SLionel Sambuc static int
test_cmp_heim_integer(void * a,void * b)524ebfedea0SLionel Sambuc test_cmp_heim_integer (void *a, void *b)
525ebfedea0SLionel Sambuc {
526ebfedea0SLionel Sambuc return der_heim_integer_cmp((heim_integer *)a, (heim_integer *)b);
527ebfedea0SLionel Sambuc }
528ebfedea0SLionel Sambuc
529ebfedea0SLionel Sambuc static int
test_heim_integer(void)530ebfedea0SLionel Sambuc test_heim_integer (void)
531ebfedea0SLionel Sambuc {
532ebfedea0SLionel Sambuc struct test_case tests[] = {
533ebfedea0SLionel Sambuc {NULL, 2, "\xfe\x01"},
534ebfedea0SLionel Sambuc {NULL, 2, "\xef\x01"},
535ebfedea0SLionel Sambuc {NULL, 3, "\xff\x00\xff"},
536ebfedea0SLionel Sambuc {NULL, 3, "\xff\x01\x00"},
537ebfedea0SLionel Sambuc {NULL, 1, "\x00"},
538ebfedea0SLionel Sambuc {NULL, 1, "\x01"},
539ebfedea0SLionel Sambuc {NULL, 2, "\x00\x80"}
540ebfedea0SLionel Sambuc };
541ebfedea0SLionel Sambuc
542ebfedea0SLionel Sambuc heim_integer values[] = {
543ebfedea0SLionel Sambuc { 2, "\x01\xff", 1 },
544ebfedea0SLionel Sambuc { 2, "\x10\xff", 1 },
545ebfedea0SLionel Sambuc { 2, "\xff\x01", 1 },
546ebfedea0SLionel Sambuc { 2, "\xff\x00", 1 },
547ebfedea0SLionel Sambuc { 0, "", 0 },
548ebfedea0SLionel Sambuc { 1, "\x01", 0 },
549ebfedea0SLionel Sambuc { 1, "\x80", 0 }
550ebfedea0SLionel Sambuc };
551ebfedea0SLionel Sambuc int i, ret;
552ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(tests[0]);
553ebfedea0SLionel Sambuc size_t size;
554ebfedea0SLionel Sambuc heim_integer i2;
555ebfedea0SLionel Sambuc
556ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i) {
557ebfedea0SLionel Sambuc tests[i].val = &values[i];
558ebfedea0SLionel Sambuc if (asprintf (&tests[i].name, "heim_integer %d", i) < 0)
559ebfedea0SLionel Sambuc errx(1, "malloc");
560ebfedea0SLionel Sambuc if (tests[i].name == NULL)
561ebfedea0SLionel Sambuc errx(1, "malloc");
562ebfedea0SLionel Sambuc }
563ebfedea0SLionel Sambuc
564ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(heim_integer),
565ebfedea0SLionel Sambuc (generic_encode)der_put_heim_integer,
566ebfedea0SLionel Sambuc (generic_length)der_length_heim_integer,
567ebfedea0SLionel Sambuc (generic_decode)der_get_heim_integer,
568ebfedea0SLionel Sambuc (generic_free)der_free_heim_integer,
569ebfedea0SLionel Sambuc test_cmp_heim_integer,
570ebfedea0SLionel Sambuc NULL);
571ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i)
572ebfedea0SLionel Sambuc free (tests[i].name);
573ebfedea0SLionel Sambuc if (ret)
574ebfedea0SLionel Sambuc return ret;
575ebfedea0SLionel Sambuc
576ebfedea0SLionel Sambuc /* test zero length integer (BER format) */
577ebfedea0SLionel Sambuc ret = der_get_heim_integer(NULL, 0, &i2, &size);
578ebfedea0SLionel Sambuc if (ret)
579ebfedea0SLionel Sambuc errx(1, "der_get_heim_integer");
580ebfedea0SLionel Sambuc if (i2.length != 0)
581ebfedea0SLionel Sambuc errx(1, "der_get_heim_integer wrong length");
582ebfedea0SLionel Sambuc der_free_heim_integer(&i2);
583ebfedea0SLionel Sambuc
584ebfedea0SLionel Sambuc return 0;
585ebfedea0SLionel Sambuc }
586ebfedea0SLionel Sambuc
587ebfedea0SLionel Sambuc static int
test_cmp_boolean(void * a,void * b)588ebfedea0SLionel Sambuc test_cmp_boolean (void *a, void *b)
589ebfedea0SLionel Sambuc {
590ebfedea0SLionel Sambuc return !!*(int *)a != !!*(int *)b;
591ebfedea0SLionel Sambuc }
592ebfedea0SLionel Sambuc
593ebfedea0SLionel Sambuc static int
test_boolean(void)594ebfedea0SLionel Sambuc test_boolean (void)
595ebfedea0SLionel Sambuc {
596ebfedea0SLionel Sambuc struct test_case tests[] = {
597ebfedea0SLionel Sambuc {NULL, 1, "\xff"},
598ebfedea0SLionel Sambuc {NULL, 1, "\x00"}
599ebfedea0SLionel Sambuc };
600ebfedea0SLionel Sambuc
601ebfedea0SLionel Sambuc int values[] = { 1, 0 };
602ebfedea0SLionel Sambuc int i, ret;
603ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(tests[0]);
604ebfedea0SLionel Sambuc size_t size;
605ebfedea0SLionel Sambuc heim_integer i2;
606ebfedea0SLionel Sambuc
607ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i) {
608ebfedea0SLionel Sambuc tests[i].val = &values[i];
609ebfedea0SLionel Sambuc if (asprintf (&tests[i].name, "heim_boolean %d", i) < 0)
610ebfedea0SLionel Sambuc errx(1, "malloc");
611ebfedea0SLionel Sambuc if (tests[i].name == NULL)
612ebfedea0SLionel Sambuc errx(1, "malloc");
613ebfedea0SLionel Sambuc }
614ebfedea0SLionel Sambuc
615ebfedea0SLionel Sambuc ret = generic_test (tests, ntests, sizeof(int),
616ebfedea0SLionel Sambuc (generic_encode)der_put_boolean,
617ebfedea0SLionel Sambuc (generic_length)der_length_boolean,
618ebfedea0SLionel Sambuc (generic_decode)der_get_boolean,
619ebfedea0SLionel Sambuc (generic_free)NULL,
620ebfedea0SLionel Sambuc test_cmp_boolean,
621ebfedea0SLionel Sambuc NULL);
622ebfedea0SLionel Sambuc for (i = 0; i < ntests; ++i)
623ebfedea0SLionel Sambuc free (tests[i].name);
624ebfedea0SLionel Sambuc if (ret)
625ebfedea0SLionel Sambuc return ret;
626ebfedea0SLionel Sambuc
627ebfedea0SLionel Sambuc /* test zero length integer (BER format) */
628ebfedea0SLionel Sambuc ret = der_get_heim_integer(NULL, 0, &i2, &size);
629ebfedea0SLionel Sambuc if (ret)
630ebfedea0SLionel Sambuc errx(1, "der_get_heim_integer");
631ebfedea0SLionel Sambuc if (i2.length != 0)
632ebfedea0SLionel Sambuc errx(1, "der_get_heim_integer wrong length");
633ebfedea0SLionel Sambuc der_free_heim_integer(&i2);
634ebfedea0SLionel Sambuc
635ebfedea0SLionel Sambuc return 0;
636ebfedea0SLionel Sambuc }
637ebfedea0SLionel Sambuc
638ebfedea0SLionel Sambuc static int
check_fail_unsigned(void)639ebfedea0SLionel Sambuc check_fail_unsigned(void)
640ebfedea0SLionel Sambuc {
641ebfedea0SLionel Sambuc struct test_case tests[] = {
642ebfedea0SLionel Sambuc {NULL, sizeof(unsigned) + 1,
643ebfedea0SLionel Sambuc "\x01\x01\x01\x01\x01\x01\x01\x01\x01", "data overrun" }
644ebfedea0SLionel Sambuc };
645ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
646ebfedea0SLionel Sambuc
647ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(unsigned),
648ebfedea0SLionel Sambuc (generic_decode)der_get_unsigned);
649ebfedea0SLionel Sambuc }
650ebfedea0SLionel Sambuc
651ebfedea0SLionel Sambuc static int
check_fail_integer(void)652ebfedea0SLionel Sambuc check_fail_integer(void)
653ebfedea0SLionel Sambuc {
654ebfedea0SLionel Sambuc struct test_case tests[] = {
655ebfedea0SLionel Sambuc {NULL, sizeof(int) + 1,
656ebfedea0SLionel Sambuc "\x01\x01\x01\x01\x01\x01\x01\x01\x01", "data overrun" }
657ebfedea0SLionel Sambuc };
658ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
659ebfedea0SLionel Sambuc
660ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(int),
661ebfedea0SLionel Sambuc (generic_decode)der_get_integer);
662ebfedea0SLionel Sambuc }
663ebfedea0SLionel Sambuc
664ebfedea0SLionel Sambuc static int
check_fail_length(void)665ebfedea0SLionel Sambuc check_fail_length(void)
666ebfedea0SLionel Sambuc {
667ebfedea0SLionel Sambuc struct test_case tests[] = {
668ebfedea0SLionel Sambuc {NULL, 0, "", "empty input data"},
669ebfedea0SLionel Sambuc {NULL, 1, "\x82", "internal length overrun" }
670ebfedea0SLionel Sambuc };
671ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
672ebfedea0SLionel Sambuc
673ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(size_t),
674ebfedea0SLionel Sambuc (generic_decode)der_get_length);
675ebfedea0SLionel Sambuc }
676ebfedea0SLionel Sambuc
677ebfedea0SLionel Sambuc static int
check_fail_boolean(void)678ebfedea0SLionel Sambuc check_fail_boolean(void)
679ebfedea0SLionel Sambuc {
680ebfedea0SLionel Sambuc struct test_case tests[] = {
681ebfedea0SLionel Sambuc {NULL, 0, "", "empty input data"}
682ebfedea0SLionel Sambuc };
683ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
684ebfedea0SLionel Sambuc
685ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(int),
686ebfedea0SLionel Sambuc (generic_decode)der_get_boolean);
687ebfedea0SLionel Sambuc }
688ebfedea0SLionel Sambuc
689ebfedea0SLionel Sambuc static int
check_fail_general_string(void)690ebfedea0SLionel Sambuc check_fail_general_string(void)
691ebfedea0SLionel Sambuc {
692ebfedea0SLionel Sambuc struct test_case tests[] = {
693ebfedea0SLionel Sambuc { NULL, 3, "A\x00i", "NUL char in string"}
694ebfedea0SLionel Sambuc };
695ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
696ebfedea0SLionel Sambuc
697ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(heim_general_string),
698ebfedea0SLionel Sambuc (generic_decode)der_get_general_string);
699ebfedea0SLionel Sambuc }
700ebfedea0SLionel Sambuc
701ebfedea0SLionel Sambuc static int
check_fail_bmp_string(void)702ebfedea0SLionel Sambuc check_fail_bmp_string(void)
703ebfedea0SLionel Sambuc {
704ebfedea0SLionel Sambuc struct test_case tests[] = {
705ebfedea0SLionel Sambuc {NULL, 1, "\x00", "odd (1) length bmpstring"},
706ebfedea0SLionel Sambuc {NULL, 3, "\x00\x00\x00", "odd (3) length bmpstring"}
707ebfedea0SLionel Sambuc };
708ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
709ebfedea0SLionel Sambuc
710ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(heim_bmp_string),
711ebfedea0SLionel Sambuc (generic_decode)der_get_bmp_string);
712ebfedea0SLionel Sambuc }
713ebfedea0SLionel Sambuc
714ebfedea0SLionel Sambuc static int
check_fail_universal_string(void)715ebfedea0SLionel Sambuc check_fail_universal_string(void)
716ebfedea0SLionel Sambuc {
717ebfedea0SLionel Sambuc struct test_case tests[] = {
718ebfedea0SLionel Sambuc {NULL, 1, "\x00", "x & 3 == 1 universal string"},
719ebfedea0SLionel Sambuc {NULL, 2, "\x00\x00", "x & 3 == 2 universal string"},
720ebfedea0SLionel Sambuc {NULL, 3, "\x00\x00\x00", "x & 3 == 3 universal string"},
721ebfedea0SLionel Sambuc {NULL, 5, "\x00\x00\x00\x00\x00", "x & 3 == 1 universal string"},
722ebfedea0SLionel Sambuc {NULL, 6, "\x00\x00\x00\x00\x00\x00", "x & 3 == 2 universal string"},
723ebfedea0SLionel Sambuc {NULL, 7, "\x00\x00\x00\x00\x00\x00\x00", "x & 3 == 3 universal string"}
724ebfedea0SLionel Sambuc };
725ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
726ebfedea0SLionel Sambuc
727ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(heim_universal_string),
728ebfedea0SLionel Sambuc (generic_decode)der_get_universal_string);
729ebfedea0SLionel Sambuc }
730ebfedea0SLionel Sambuc
731ebfedea0SLionel Sambuc static int
check_fail_heim_integer(void)732ebfedea0SLionel Sambuc check_fail_heim_integer(void)
733ebfedea0SLionel Sambuc {
734ebfedea0SLionel Sambuc #if 0
735ebfedea0SLionel Sambuc struct test_case tests[] = {
736ebfedea0SLionel Sambuc };
737ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
738ebfedea0SLionel Sambuc
739ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(heim_integer),
740ebfedea0SLionel Sambuc (generic_decode)der_get_heim_integer);
741ebfedea0SLionel Sambuc #else
742ebfedea0SLionel Sambuc return 0;
743ebfedea0SLionel Sambuc #endif
744ebfedea0SLionel Sambuc }
745ebfedea0SLionel Sambuc
746ebfedea0SLionel Sambuc static int
check_fail_generalized_time(void)747ebfedea0SLionel Sambuc check_fail_generalized_time(void)
748ebfedea0SLionel Sambuc {
749ebfedea0SLionel Sambuc struct test_case tests[] = {
750ebfedea0SLionel Sambuc {NULL, 1, "\x00", "no time"}
751ebfedea0SLionel Sambuc };
752ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
753ebfedea0SLionel Sambuc
754ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(time_t),
755ebfedea0SLionel Sambuc (generic_decode)der_get_generalized_time);
756ebfedea0SLionel Sambuc }
757ebfedea0SLionel Sambuc
758ebfedea0SLionel Sambuc static int
check_fail_oid(void)759ebfedea0SLionel Sambuc check_fail_oid(void)
760ebfedea0SLionel Sambuc {
761ebfedea0SLionel Sambuc struct test_case tests[] = {
762ebfedea0SLionel Sambuc {NULL, 0, "", "empty input data"},
763ebfedea0SLionel Sambuc {NULL, 2, "\x00\x80", "last byte continuation" },
764ebfedea0SLionel Sambuc {NULL, 11, "\x00\x81\x80\x80\x80\x80\x80\x80\x80\x80\x00",
765ebfedea0SLionel Sambuc "oid element overflow" }
766ebfedea0SLionel Sambuc };
767ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
768ebfedea0SLionel Sambuc
769ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(heim_oid),
770ebfedea0SLionel Sambuc (generic_decode)der_get_oid);
771ebfedea0SLionel Sambuc }
772ebfedea0SLionel Sambuc
773ebfedea0SLionel Sambuc static int
check_fail_bitstring(void)774ebfedea0SLionel Sambuc check_fail_bitstring(void)
775ebfedea0SLionel Sambuc {
776ebfedea0SLionel Sambuc struct test_case tests[] = {
777ebfedea0SLionel Sambuc {NULL, 0, "", "empty input data"},
778ebfedea0SLionel Sambuc {NULL, 1, "\x08", "larger then 8 bits trailer"},
779ebfedea0SLionel Sambuc {NULL, 1, "\x01", "to few bytes for bits"},
780ebfedea0SLionel Sambuc {NULL, -2, "\x00", "length overrun"},
781ebfedea0SLionel Sambuc {NULL, -1, "", "length to short"}
782ebfedea0SLionel Sambuc };
783ebfedea0SLionel Sambuc int ntests = sizeof(tests) / sizeof(*tests);
784ebfedea0SLionel Sambuc
785ebfedea0SLionel Sambuc return generic_decode_fail(tests, ntests, sizeof(heim_bit_string),
786ebfedea0SLionel Sambuc (generic_decode)der_get_bit_string);
787ebfedea0SLionel Sambuc }
788ebfedea0SLionel Sambuc
789ebfedea0SLionel Sambuc static int
check_heim_integer_same(const char * p,const char * norm_p,heim_integer * i)790ebfedea0SLionel Sambuc check_heim_integer_same(const char *p, const char *norm_p, heim_integer *i)
791ebfedea0SLionel Sambuc {
792ebfedea0SLionel Sambuc heim_integer i2;
793ebfedea0SLionel Sambuc char *str;
794ebfedea0SLionel Sambuc int ret;
795ebfedea0SLionel Sambuc
796ebfedea0SLionel Sambuc ret = der_print_hex_heim_integer(i, &str);
797ebfedea0SLionel Sambuc if (ret)
798ebfedea0SLionel Sambuc errx(1, "der_print_hex_heim_integer: %d", ret);
799ebfedea0SLionel Sambuc
800ebfedea0SLionel Sambuc if (strcmp(str, norm_p) != 0)
801ebfedea0SLionel Sambuc errx(1, "der_print_hex_heim_integer: %s != %s", str, p);
802ebfedea0SLionel Sambuc
803ebfedea0SLionel Sambuc ret = der_parse_hex_heim_integer(str, &i2);
804ebfedea0SLionel Sambuc if (ret)
805ebfedea0SLionel Sambuc errx(1, "der_parse_hex_heim_integer: %d", ret);
806ebfedea0SLionel Sambuc
807ebfedea0SLionel Sambuc if (der_heim_integer_cmp(i, &i2) != 0)
808ebfedea0SLionel Sambuc errx(1, "der_heim_integer_cmp: p %s", p);
809ebfedea0SLionel Sambuc
810ebfedea0SLionel Sambuc der_free_heim_integer(&i2);
811ebfedea0SLionel Sambuc free(str);
812ebfedea0SLionel Sambuc
813ebfedea0SLionel Sambuc ret = der_parse_hex_heim_integer(p, &i2);
814ebfedea0SLionel Sambuc if (ret)
815ebfedea0SLionel Sambuc errx(1, "der_parse_hex_heim_integer: %d", ret);
816ebfedea0SLionel Sambuc
817ebfedea0SLionel Sambuc if (der_heim_integer_cmp(i, &i2) != 0)
818ebfedea0SLionel Sambuc errx(1, "der_heim_integer_cmp: norm");
819ebfedea0SLionel Sambuc
820ebfedea0SLionel Sambuc der_free_heim_integer(&i2);
821ebfedea0SLionel Sambuc
822ebfedea0SLionel Sambuc return 0;
823ebfedea0SLionel Sambuc }
824ebfedea0SLionel Sambuc
825ebfedea0SLionel Sambuc static int
test_heim_int_format(void)826ebfedea0SLionel Sambuc test_heim_int_format(void)
827ebfedea0SLionel Sambuc {
828ebfedea0SLionel Sambuc heim_integer i = { 1, "\x10", 0 };
829ebfedea0SLionel Sambuc heim_integer i2 = { 1, "\x10", 1 };
830ebfedea0SLionel Sambuc heim_integer i3 = { 1, "\01", 0 };
831ebfedea0SLionel Sambuc char *p =
832ebfedea0SLionel Sambuc "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
833ebfedea0SLionel Sambuc "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
834ebfedea0SLionel Sambuc "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
835ebfedea0SLionel Sambuc "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
836ebfedea0SLionel Sambuc "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE65381"
837ebfedea0SLionel Sambuc "FFFFFFFF" "FFFFFFFF";
838ebfedea0SLionel Sambuc heim_integer bni = {
839ebfedea0SLionel Sambuc 128,
840ebfedea0SLionel Sambuc "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2"
841ebfedea0SLionel Sambuc "\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1"
842ebfedea0SLionel Sambuc "\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6"
843ebfedea0SLionel Sambuc "\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD"
844ebfedea0SLionel Sambuc "\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D"
845ebfedea0SLionel Sambuc "\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45"
846ebfedea0SLionel Sambuc "\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9"
847ebfedea0SLionel Sambuc "\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED"
848ebfedea0SLionel Sambuc "\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11"
849ebfedea0SLionel Sambuc "\x7C\x4B\x1F\xE6\x49\x28\x66\x51\xEC\xE6\x53\x81"
850ebfedea0SLionel Sambuc "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF",
851ebfedea0SLionel Sambuc 0
852ebfedea0SLionel Sambuc };
853ebfedea0SLionel Sambuc heim_integer f;
854ebfedea0SLionel Sambuc int ret = 0;
855ebfedea0SLionel Sambuc
856ebfedea0SLionel Sambuc ret += check_heim_integer_same(p, p, &bni);
857ebfedea0SLionel Sambuc ret += check_heim_integer_same("10", "10", &i);
858ebfedea0SLionel Sambuc ret += check_heim_integer_same("00000010", "10", &i);
859ebfedea0SLionel Sambuc ret += check_heim_integer_same("-10", "-10", &i2);
860ebfedea0SLionel Sambuc ret += check_heim_integer_same("-00000010", "-10", &i2);
861ebfedea0SLionel Sambuc ret += check_heim_integer_same("01", "01", &i3);
862ebfedea0SLionel Sambuc ret += check_heim_integer_same("1", "01", &i3);
863ebfedea0SLionel Sambuc
864ebfedea0SLionel Sambuc {
865ebfedea0SLionel Sambuc int r;
866ebfedea0SLionel Sambuc r = der_parse_hex_heim_integer("-", &f);
867ebfedea0SLionel Sambuc if (r == 0) {
868ebfedea0SLionel Sambuc der_free_heim_integer(&f);
869ebfedea0SLionel Sambuc ret++;
870ebfedea0SLionel Sambuc }
871ebfedea0SLionel Sambuc /* used to cause UMR */
872ebfedea0SLionel Sambuc r = der_parse_hex_heim_integer("00", &f);
873ebfedea0SLionel Sambuc if (r == 0)
874ebfedea0SLionel Sambuc der_free_heim_integer(&f);
875ebfedea0SLionel Sambuc else
876ebfedea0SLionel Sambuc ret++;
877ebfedea0SLionel Sambuc }
878ebfedea0SLionel Sambuc
879ebfedea0SLionel Sambuc return ret;
880ebfedea0SLionel Sambuc }
881ebfedea0SLionel Sambuc
882ebfedea0SLionel Sambuc static int
test_heim_oid_format_same(const char * str,const heim_oid * oid)883ebfedea0SLionel Sambuc test_heim_oid_format_same(const char *str, const heim_oid *oid)
884ebfedea0SLionel Sambuc {
885ebfedea0SLionel Sambuc int ret;
886ebfedea0SLionel Sambuc char *p;
887ebfedea0SLionel Sambuc heim_oid o2;
888ebfedea0SLionel Sambuc
889ebfedea0SLionel Sambuc ret = der_print_heim_oid(oid, ' ', &p);
890ebfedea0SLionel Sambuc if (ret) {
891ebfedea0SLionel Sambuc printf("fail to print oid: %s\n", str);
892ebfedea0SLionel Sambuc return 1;
893ebfedea0SLionel Sambuc }
894ebfedea0SLionel Sambuc ret = strcmp(p, str);
895ebfedea0SLionel Sambuc if (ret) {
896ebfedea0SLionel Sambuc printf("oid %s != formated oid %s\n", str, p);
897ebfedea0SLionel Sambuc free(p);
898ebfedea0SLionel Sambuc return ret;
899ebfedea0SLionel Sambuc }
900ebfedea0SLionel Sambuc
901ebfedea0SLionel Sambuc ret = der_parse_heim_oid(p, " ", &o2);
902ebfedea0SLionel Sambuc if (ret) {
903ebfedea0SLionel Sambuc printf("failed to parse %s\n", p);
904ebfedea0SLionel Sambuc free(p);
905ebfedea0SLionel Sambuc return ret;
906ebfedea0SLionel Sambuc }
907ebfedea0SLionel Sambuc free(p);
908ebfedea0SLionel Sambuc ret = der_heim_oid_cmp(&o2, oid);
909ebfedea0SLionel Sambuc der_free_oid(&o2);
910ebfedea0SLionel Sambuc
911ebfedea0SLionel Sambuc return ret;
912ebfedea0SLionel Sambuc }
913ebfedea0SLionel Sambuc
914ebfedea0SLionel Sambuc static unsigned sha1_oid_tree[] = { 1, 3, 14, 3, 2, 26 };
915ebfedea0SLionel Sambuc
916ebfedea0SLionel Sambuc static int
test_heim_oid_format(void)917ebfedea0SLionel Sambuc test_heim_oid_format(void)
918ebfedea0SLionel Sambuc {
919ebfedea0SLionel Sambuc heim_oid sha1 = { 6, sha1_oid_tree };
920ebfedea0SLionel Sambuc int ret = 0;
921ebfedea0SLionel Sambuc
922ebfedea0SLionel Sambuc ret += test_heim_oid_format_same("1 3 14 3 2 26", &sha1);
923ebfedea0SLionel Sambuc
924ebfedea0SLionel Sambuc return ret;
925ebfedea0SLionel Sambuc }
926ebfedea0SLionel Sambuc
927ebfedea0SLionel Sambuc static int
check_trailing_nul(void)928ebfedea0SLionel Sambuc check_trailing_nul(void)
929ebfedea0SLionel Sambuc {
930ebfedea0SLionel Sambuc int i, ret;
931ebfedea0SLionel Sambuc struct {
932ebfedea0SLionel Sambuc int fail;
933ebfedea0SLionel Sambuc const unsigned char *p;
934ebfedea0SLionel Sambuc size_t len;
935ebfedea0SLionel Sambuc const char *s;
936ebfedea0SLionel Sambuc size_t size;
937ebfedea0SLionel Sambuc } foo[] = {
938ebfedea0SLionel Sambuc { 1, (const unsigned char *)"foo\x00o", 5, NULL, 0 },
939ebfedea0SLionel Sambuc { 1, (const unsigned char *)"\x00o", 2, NULL, 0 },
940ebfedea0SLionel Sambuc { 0, (const unsigned char *)"\x00\x00\x00\x00\x00", 5, "", 5 },
941ebfedea0SLionel Sambuc { 0, (const unsigned char *)"\x00", 1, "", 1 },
942ebfedea0SLionel Sambuc { 0, (const unsigned char *)"", 0, "", 0 },
943ebfedea0SLionel Sambuc { 0, (const unsigned char *)"foo\x00\x00", 5, "foo", 5 },
944ebfedea0SLionel Sambuc { 0, (const unsigned char *)"foo\0", 4, "foo", 4 },
945ebfedea0SLionel Sambuc { 0, (const unsigned char *)"foo", 3, "foo", 3 }
946ebfedea0SLionel Sambuc };
947ebfedea0SLionel Sambuc
948ebfedea0SLionel Sambuc for (i = 0; i < sizeof(foo)/sizeof(foo[0]); i++) {
949ebfedea0SLionel Sambuc char *s;
950ebfedea0SLionel Sambuc size_t size;
951ebfedea0SLionel Sambuc ret = der_get_general_string(foo[i].p, foo[i].len, &s, &size);
952ebfedea0SLionel Sambuc if (foo[i].fail) {
953ebfedea0SLionel Sambuc if (ret == 0)
954ebfedea0SLionel Sambuc errx(1, "check %d NULL didn't fail", i);
955ebfedea0SLionel Sambuc continue;
956ebfedea0SLionel Sambuc }
957ebfedea0SLionel Sambuc if (ret)
958ebfedea0SLionel Sambuc errx(1, "NULL check %d der_get_general_string failed", i);
959ebfedea0SLionel Sambuc if (foo[i].size != size)
960ebfedea0SLionel Sambuc errx(1, "NUL check i = %d size failed", i);
961ebfedea0SLionel Sambuc if (strcmp(foo[i].s, s) != 0)
962ebfedea0SLionel Sambuc errx(1, "NUL check i = %d content failed", i);
963ebfedea0SLionel Sambuc free(s);
964ebfedea0SLionel Sambuc }
965ebfedea0SLionel Sambuc return 0;
966ebfedea0SLionel Sambuc }
967ebfedea0SLionel Sambuc
968ebfedea0SLionel Sambuc static int
test_misc_cmp(void)969ebfedea0SLionel Sambuc test_misc_cmp(void)
970ebfedea0SLionel Sambuc {
971ebfedea0SLionel Sambuc int ret;
972ebfedea0SLionel Sambuc
973ebfedea0SLionel Sambuc /* diffrent lengths are diffrent */
974ebfedea0SLionel Sambuc {
975ebfedea0SLionel Sambuc const heim_octet_string os1 = { 1, "a" } , os2 = { 0, NULL };
976ebfedea0SLionel Sambuc ret = der_heim_octet_string_cmp(&os1, &os2);
977ebfedea0SLionel Sambuc if (ret == 0)
978ebfedea0SLionel Sambuc return 1;
979ebfedea0SLionel Sambuc }
980ebfedea0SLionel Sambuc /* diffrent data are diffrent */
981ebfedea0SLionel Sambuc {
982ebfedea0SLionel Sambuc const heim_octet_string os1 = { 1, "a" } , os2 = { 1, "b" };
983ebfedea0SLionel Sambuc ret = der_heim_octet_string_cmp(&os1, &os2);
984ebfedea0SLionel Sambuc if (ret == 0)
985ebfedea0SLionel Sambuc return 1;
986ebfedea0SLionel Sambuc }
987ebfedea0SLionel Sambuc /* diffrent lengths are diffrent */
988ebfedea0SLionel Sambuc {
989ebfedea0SLionel Sambuc const heim_bit_string bs1 = { 8, "a" } , bs2 = { 7, "a" };
990ebfedea0SLionel Sambuc ret = der_heim_bit_string_cmp(&bs1, &bs2);
991ebfedea0SLionel Sambuc if (ret == 0)
992ebfedea0SLionel Sambuc return 1;
993ebfedea0SLionel Sambuc }
994ebfedea0SLionel Sambuc /* diffrent data are diffrent */
995ebfedea0SLionel Sambuc {
996ebfedea0SLionel Sambuc const heim_bit_string bs1 = { 7, "\x0f" } , bs2 = { 7, "\x02" };
997ebfedea0SLionel Sambuc ret = der_heim_bit_string_cmp(&bs1, &bs2);
998ebfedea0SLionel Sambuc if (ret == 0)
999ebfedea0SLionel Sambuc return 1;
1000ebfedea0SLionel Sambuc }
1001ebfedea0SLionel Sambuc /* diffrent lengths are diffrent */
1002ebfedea0SLionel Sambuc {
1003ebfedea0SLionel Sambuc uint16_t data = 1;
1004ebfedea0SLionel Sambuc heim_bmp_string bs1 = { 1, NULL } , bs2 = { 0, NULL };
1005ebfedea0SLionel Sambuc bs1.data = &data;
1006ebfedea0SLionel Sambuc ret = der_heim_bmp_string_cmp(&bs1, &bs2);
1007ebfedea0SLionel Sambuc if (ret == 0)
1008ebfedea0SLionel Sambuc return 1;
1009ebfedea0SLionel Sambuc }
1010ebfedea0SLionel Sambuc /* diffrent lengths are diffrent */
1011ebfedea0SLionel Sambuc {
1012ebfedea0SLionel Sambuc uint32_t data;
1013ebfedea0SLionel Sambuc heim_universal_string us1 = { 1, NULL } , us2 = { 0, NULL };
1014ebfedea0SLionel Sambuc us1.data = &data;
1015ebfedea0SLionel Sambuc ret = der_heim_universal_string_cmp(&us1, &us2);
1016ebfedea0SLionel Sambuc if (ret == 0)
1017ebfedea0SLionel Sambuc return 1;
1018ebfedea0SLionel Sambuc }
1019ebfedea0SLionel Sambuc /* same */
1020ebfedea0SLionel Sambuc {
1021ebfedea0SLionel Sambuc uint32_t data = (uint32_t)'a';
1022ebfedea0SLionel Sambuc heim_universal_string us1 = { 1, NULL } , us2 = { 1, NULL };
1023ebfedea0SLionel Sambuc us1.data = &data;
1024ebfedea0SLionel Sambuc us2.data = &data;
1025ebfedea0SLionel Sambuc ret = der_heim_universal_string_cmp(&us1, &us2);
1026ebfedea0SLionel Sambuc if (ret != 0)
1027ebfedea0SLionel Sambuc return 1;
1028ebfedea0SLionel Sambuc }
1029ebfedea0SLionel Sambuc
1030ebfedea0SLionel Sambuc return 0;
1031ebfedea0SLionel Sambuc }
1032ebfedea0SLionel Sambuc
1033ebfedea0SLionel Sambuc static int
corner_generalized_time(void)1034ebfedea0SLionel Sambuc corner_generalized_time(void)
1035ebfedea0SLionel Sambuc {
1036ebfedea0SLionel Sambuc const char *str = "760520140000Z";
1037ebfedea0SLionel Sambuc size_t size;
1038ebfedea0SLionel Sambuc time_t t;
1039ebfedea0SLionel Sambuc int ret;
1040ebfedea0SLionel Sambuc
1041ebfedea0SLionel Sambuc ret = der_get_generalized_time((const unsigned char*)str, strlen(str),
1042ebfedea0SLionel Sambuc &t, &size);
1043ebfedea0SLionel Sambuc if (ret)
1044ebfedea0SLionel Sambuc return 1;
1045ebfedea0SLionel Sambuc return 0;
1046ebfedea0SLionel Sambuc }
1047ebfedea0SLionel Sambuc
1048ebfedea0SLionel Sambuc static int
corner_tag(void)1049ebfedea0SLionel Sambuc corner_tag(void)
1050ebfedea0SLionel Sambuc {
1051ebfedea0SLionel Sambuc struct {
1052ebfedea0SLionel Sambuc int ok;
1053ebfedea0SLionel Sambuc const char *ptr;
1054ebfedea0SLionel Sambuc size_t len;
1055ebfedea0SLionel Sambuc } tests[] = {
1056ebfedea0SLionel Sambuc { 1, "\x00", 1 },
1057ebfedea0SLionel Sambuc { 0, "\xff", 1 },
1058ebfedea0SLionel Sambuc { 0, "\xff\xff\xff\xff\xff\xff\xff\xff", 8 }
1059ebfedea0SLionel Sambuc };
1060ebfedea0SLionel Sambuc int i, ret;
1061ebfedea0SLionel Sambuc Der_class cl;
1062ebfedea0SLionel Sambuc Der_type ty;
1063ebfedea0SLionel Sambuc unsigned int tag;
1064ebfedea0SLionel Sambuc size_t size;
1065ebfedea0SLionel Sambuc
1066ebfedea0SLionel Sambuc for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
1067ebfedea0SLionel Sambuc ret = der_get_tag((const unsigned char*)tests[i].ptr,
1068ebfedea0SLionel Sambuc tests[i].len, &cl, &ty, &tag, &size);
1069ebfedea0SLionel Sambuc if (ret) {
1070ebfedea0SLionel Sambuc if (tests[i].ok)
1071ebfedea0SLionel Sambuc errx(1, "failed while shouldn't");
1072ebfedea0SLionel Sambuc } else {
1073ebfedea0SLionel Sambuc if (!tests[i].ok)
1074ebfedea0SLionel Sambuc errx(1, "passed while shouldn't");
1075ebfedea0SLionel Sambuc }
1076ebfedea0SLionel Sambuc }
1077ebfedea0SLionel Sambuc return 0;
1078ebfedea0SLionel Sambuc }
1079ebfedea0SLionel Sambuc
1080ebfedea0SLionel Sambuc int
main(int argc,char ** argv)1081ebfedea0SLionel Sambuc main(int argc, char **argv)
1082ebfedea0SLionel Sambuc {
1083ebfedea0SLionel Sambuc int ret = 0;
1084ebfedea0SLionel Sambuc
1085ebfedea0SLionel Sambuc ret += test_integer ();
1086ebfedea0SLionel Sambuc ret += test_integer_more();
1087ebfedea0SLionel Sambuc ret += test_unsigned ();
1088ebfedea0SLionel Sambuc ret += test_octet_string ();
1089ebfedea0SLionel Sambuc ret += test_bmp_string ();
1090ebfedea0SLionel Sambuc ret += test_universal_string ();
1091ebfedea0SLionel Sambuc ret += test_general_string ();
1092ebfedea0SLionel Sambuc ret += test_generalized_time ();
1093ebfedea0SLionel Sambuc ret += test_oid ();
1094ebfedea0SLionel Sambuc ret += test_bit_string();
1095ebfedea0SLionel Sambuc ret += test_heim_integer();
1096ebfedea0SLionel Sambuc ret += test_boolean();
1097ebfedea0SLionel Sambuc
1098ebfedea0SLionel Sambuc ret += check_fail_unsigned();
1099ebfedea0SLionel Sambuc ret += check_fail_integer();
1100ebfedea0SLionel Sambuc ret += check_fail_length();
1101ebfedea0SLionel Sambuc ret += check_fail_boolean();
1102ebfedea0SLionel Sambuc ret += check_fail_general_string();
1103ebfedea0SLionel Sambuc ret += check_fail_bmp_string();
1104ebfedea0SLionel Sambuc ret += check_fail_universal_string();
1105ebfedea0SLionel Sambuc ret += check_fail_heim_integer();
1106ebfedea0SLionel Sambuc ret += check_fail_generalized_time();
1107ebfedea0SLionel Sambuc ret += check_fail_oid();
1108ebfedea0SLionel Sambuc ret += check_fail_bitstring();
1109ebfedea0SLionel Sambuc ret += test_heim_int_format();
1110ebfedea0SLionel Sambuc ret += test_heim_oid_format();
1111ebfedea0SLionel Sambuc ret += check_trailing_nul();
1112ebfedea0SLionel Sambuc ret += test_misc_cmp();
1113ebfedea0SLionel Sambuc ret += corner_generalized_time();
1114ebfedea0SLionel Sambuc ret += corner_tag();
1115ebfedea0SLionel Sambuc
1116ebfedea0SLionel Sambuc return ret;
1117ebfedea0SLionel Sambuc }
1118