xref: /minix3/crypto/external/bsd/heimdal/dist/lib/asn1/check-der.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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