1 /*	$NetBSD: check-template.c,v 1.1.1.1 2011/04/13 18:14:40 elric Exp $	*/
2 
3 /*
4  * Copyright (c) 1999 - 2005 Kungliga Tekniska Högskolan
5  * (Royal Institute of Technology, Stockholm, Sweden).
6  * All rights reserved.
7  *
8  * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  *
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  *
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  *
21  * 3. Neither the name of the Institute nor the names of its contributors
22  *    may be used to endorse or promote products derived from this software
23  *    without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35  * SUCH DAMAGE.
36  */
37 
38 #include <config.h>
39 
40 #include <stdio.h>
41 #include <string.h>
42 #include <err.h>
43 #include <krb5/roken.h>
44 
45 #include <krb5/asn1-common.h>
46 #include <krb5/asn1_err.h>
47 #include <krb5/der.h>
48 #include <test_asn1.h>
49 
50 #include "check-common.h"
51 
52 static int
53 cmp_dummy (void *a, void *b)
54 {
55     return 0;
56 }
57 
58 static int
59 test_seqofseq(void)
60 {
61     struct test_case tests[] = {
62 	{ NULL,  2,
63 	  "\x30\x00",
64 	  "seqofseq 0" },
65 	{ NULL,  9,
66 	  "\x30\x07\x30\x05\xa0\x03\x02\x01\x00",
67 	  "seqofseq 1" },
68 	{ NULL,  16,
69 	  "\x30\x0e\x30\x05\xa0\x03\x02\x01\x00\x30\x05\xa0\x03\x02\x01\x01",
70 	  "seqofseq 2" }
71     };
72 
73     int ret = 0, ntests = sizeof(tests) / sizeof(*tests);
74     TESTSeqOfSeq c0, c1, c2;
75     struct TESTSeqOfSeq_val i[2];
76 
77     i[0].zero = 0;
78     i[1].zero = 1;
79 
80     c0.len = 0;
81     c0.val = NULL;
82     tests[0].val = &c0;
83 
84     c1.len = 1;
85     c1.val = i;
86     tests[1].val = &c1;
87 
88     c2.len = 2;
89     c2.val = i;
90     tests[2].val = &c2;
91 
92     ret += generic_test (tests, ntests, sizeof(TESTSeqOfSeq),
93 			 (generic_encode)encode_TESTSeqOfSeq,
94 			 (generic_length)length_TESTSeqOfSeq,
95 			 (generic_decode)decode_TESTSeqOfSeq,
96 			 (generic_free)free_TESTSeqOfSeq,
97 			 cmp_dummy,
98 			 NULL);
99     return ret;
100 }
101 
102 static int
103 test_seqofseq2(void)
104 {
105     struct test_case tests[] = {
106 	{ NULL,  2,
107 	  "\x30\x00",
108 	  "seqofseq2 0" },
109 	{ NULL,  11,
110 	  "\x30\x09\x30\x07\xa0\x05\x1b\x03\x65\x74\x74",
111 	  "seqofseq2 1" },
112 	{ NULL,  21,
113 	  "\x30\x13\x30\x07\xa0\x05\x1b\x03\x65\x74\x74\x30\x08\xa0"
114 	  "\x06\x1b\x04\x74\x76\x61\x61",
115 	  "seqofseq2 2" }
116     };
117 
118     int ret = 0, ntests = sizeof(tests) / sizeof(*tests);
119     TESTSeqOfSeq2 c0, c1, c2;
120     struct TESTSeqOfSeq2_val i[2];
121 
122     i[0].string = "ett";
123     i[1].string = "tvaa";
124 
125     c0.len = 0;
126     c0.val = NULL;
127     tests[0].val = &c0;
128 
129     c1.len = 1;
130     c1.val = i;
131     tests[1].val = &c1;
132 
133     c2.len = 2;
134     c2.val = i;
135     tests[2].val = &c2;
136 
137     ret += generic_test (tests, ntests, sizeof(TESTSeqOfSeq2),
138 			 (generic_encode)encode_TESTSeqOfSeq2,
139 			 (generic_length)length_TESTSeqOfSeq2,
140 			 (generic_decode)decode_TESTSeqOfSeq2,
141 			 (generic_free)free_TESTSeqOfSeq2,
142 			 cmp_dummy,
143 			 NULL);
144     return ret;
145 }
146 
147 static int
148 test_seqof2(void)
149 {
150     struct test_case tests[] = {
151 	{ NULL,  4,
152 	  "\x30\x02\x30\x00",
153 	  "seqof2 1" },
154 	{ NULL,  9,
155 	  "\x30\x07\x30\x05\x1b\x03\x66\x6f\x6f",
156 	  "seqof2 2" },
157 	{ NULL,  14,
158 	  "\x30\x0c\x30\x0a\x1b\x03\x66\x6f\x6f\x1b\x03\x62\x61\x72",
159 	  "seqof2 3" }
160     };
161 
162     int ret = 0, ntests = sizeof(tests) / sizeof(*tests);
163     TESTSeqOf2 c0, c1, c2;
164     heim_general_string i[2];
165 
166     i[0] = "foo";
167     i[1] = "bar";
168 
169     c0.strings.val = NULL;
170     c0.strings.len = 0;
171     tests[0].val = &c0;
172 
173     c1.strings.len = 1;
174     c1.strings.val = i;
175     tests[1].val = &c1;
176 
177     c2.strings.len = 2;
178     c2.strings.val = i;
179     tests[2].val = &c2;
180 
181     ret += generic_test (tests, ntests, sizeof(TESTSeqOf2),
182 			 (generic_encode)encode_TESTSeqOf2,
183 			 (generic_length)length_TESTSeqOf2,
184 			 (generic_decode)decode_TESTSeqOf2,
185 			 (generic_free)free_TESTSeqOf2,
186 			 cmp_dummy,
187 			 NULL);
188     return ret;
189 }
190 
191 static int
192 test_seqof3(void)
193 {
194     struct test_case tests[] = {
195 	{ NULL,  2,
196 	  "\x30\x00",
197 	  "seqof3 0" },
198 	{ NULL,  4,
199 	  "\x30\x02\x30\x00",
200 	  "seqof3 1" },
201 	{ NULL,  9,
202 	  "\x30\x07\x30\x05\x1b\x03\x66\x6f\x6f",
203 	  "seqof3 2" },
204 	{ NULL,  14,
205 	  "\x30\x0c\x30\x0a\x1b\x03\x66\x6f\x6f\x1b\x03\x62\x61\x72",
206 	  "seqof3 3" }
207     };
208 
209     int ret = 0, ntests = sizeof(tests) / sizeof(*tests);
210     TESTSeqOf3 c0, c1, c2, c3;
211     struct TESTSeqOf3_strings s1, s2, s3;
212     heim_general_string i[2];
213 
214     i[0] = "foo";
215     i[1] = "bar";
216 
217     c0.strings = NULL;
218     tests[0].val = &c0;
219 
220     s1.val = NULL;
221     s1.len = 0;
222     c1.strings = &s1;
223     tests[1].val = &c1;
224 
225     s2.len = 1;
226     s2.val = i;
227     c2.strings = &s2;
228     tests[2].val = &c2;
229 
230     s3.len = 2;
231     s3.val = i;
232     c3.strings = &s3;
233     tests[3].val = &c3;
234 
235     ret += generic_test (tests, ntests, sizeof(TESTSeqOf3),
236 			 (generic_encode)encode_TESTSeqOf3,
237 			 (generic_length)length_TESTSeqOf3,
238 			 (generic_decode)decode_TESTSeqOf3,
239 			 (generic_free)free_TESTSeqOf3,
240 			 cmp_dummy,
241 			 NULL);
242     return ret;
243 }
244 
245 
246 int
247 main(int argc, char **argv)
248 {
249     int ret = 0;
250 
251     ret += test_seqofseq();
252     ret += test_seqofseq2();
253     ret += test_seqof2();
254     ret += test_seqof3();
255 
256     return ret;
257 }
258