1 /*	$NetBSD: test_sequence.c,v 1.1.1.1 2011/04/13 18:14:46 elric Exp $	*/
2 
3 /*
4  * Copyright (c) 2003 Kungliga Tekniska Högskolan
5  * (Royal Institute of Technology, Stockholm, Sweden).
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the Institute nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #include "gsskrb5_locl.h"
37 
38 /* correct ordering */
39 OM_uint32 pattern1[] = {
40     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
41 };
42 
43 /* gap 10 */
44 OM_uint32 pattern2[] = {
45     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13
46 };
47 
48 /* dup 9 */
49 OM_uint32 pattern3[] = {
50     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13
51 };
52 
53 /* gaps */
54 OM_uint32 pattern4[] = {
55     0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16, 18, 100
56 };
57 
58 /* 11 before 10 */
59 OM_uint32 pattern5[] = {
60     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21
61 };
62 
63 /* long */
64 OM_uint32 pattern6[] = {
65     0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
66     10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
67     20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
68     30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
69     40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
70     50, 51, 52, 53, 54, 55, 56, 57, 58, 59
71 };
72 
73 /* dont start at 0 */
74 OM_uint32 pattern7[] = {
75     11, 12, 13
76 };
77 
78 /* wrap around */
79 OM_uint32 pattern8[] = {
80     4294967293U, 4294967294U, 4294967295U, 0, 1, 2
81 };
82 
83 static int
84 test_seq(int t, OM_uint32 flags, OM_uint32 start_seq,
85 	 OM_uint32 *pattern, int pattern_len, OM_uint32 expected_error)
86 {
87     struct gss_msg_order *o;
88     OM_uint32 maj_stat, min_stat;
89     krb5_storage *sp;
90     int i;
91 
92     maj_stat = _gssapi_msg_order_create(&min_stat, &o, flags,
93 					start_seq, 20, 0);
94     if (maj_stat)
95 	errx(1, "create: %d %d", maj_stat, min_stat);
96 
97     sp = krb5_storage_emem();
98     if (sp == NULL)
99 	errx(1, "krb5_storage_from_emem");
100 
101     _gssapi_msg_order_export(sp, o);
102 
103     for (i = 0; i < pattern_len; i++) {
104 	maj_stat = _gssapi_msg_order_check(o, pattern[i]);
105 	if (maj_stat)
106 	    break;
107     }
108     if (maj_stat != expected_error) {
109 	printf("test pattern %d failed with %d (should have been %d)\n",
110 	       t, maj_stat, expected_error);
111 	krb5_storage_free(sp);
112 	_gssapi_msg_order_destroy(&o);
113 	return 1;
114     }
115 
116 
117     _gssapi_msg_order_destroy(&o);
118 
119     /* try again, now with export/imported blob */
120     krb5_storage_seek(sp, 0, SEEK_SET);
121 
122     maj_stat = _gssapi_msg_order_import(&min_stat, sp, &o);
123     if (maj_stat)
124 	errx(1, "import: %d %d", maj_stat, min_stat);
125 
126     for (i = 0; i < pattern_len; i++) {
127 	maj_stat = _gssapi_msg_order_check(o, pattern[i]);
128 	if (maj_stat)
129 	    break;
130     }
131     if (maj_stat != expected_error) {
132 	printf("import/export test pattern %d failed "
133 	       "with %d (should have been %d)\n",
134 	       t, maj_stat, expected_error);
135 	_gssapi_msg_order_destroy(&o);
136 	krb5_storage_free(sp);
137 	return 1;
138     }
139 
140     _gssapi_msg_order_destroy(&o);
141     krb5_storage_free(sp);
142 
143     return 0;
144 }
145 
146 struct {
147     OM_uint32 flags;
148     OM_uint32 *pattern;
149     int pattern_len;
150     OM_uint32 error_code;
151     OM_uint32 start_seq;
152 } pl[] = {
153     {
154 	GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG,
155 	pattern1,
156 	sizeof(pattern1)/sizeof(pattern1[0]),
157 	0
158     },
159     {
160 	GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG,
161 	pattern2,
162 	sizeof(pattern2)/sizeof(pattern2[0]),
163 	GSS_S_GAP_TOKEN
164     },
165     {
166 	GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG,
167 	pattern3,
168 	sizeof(pattern3)/sizeof(pattern3[0]),
169 	GSS_S_DUPLICATE_TOKEN
170     },
171     {
172 	GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG,
173 	pattern4,
174 	sizeof(pattern4)/sizeof(pattern4[0]),
175 	GSS_S_GAP_TOKEN
176     },
177     {
178 	GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG,
179 	pattern5,
180 	sizeof(pattern5)/sizeof(pattern5[0]),
181 	GSS_S_GAP_TOKEN
182     },
183     {
184 	GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG,
185 	pattern6,
186 	sizeof(pattern6)/sizeof(pattern6[0]),
187 	GSS_S_COMPLETE
188     },
189     {
190 	GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG,
191 	pattern7,
192 	sizeof(pattern7)/sizeof(pattern7[0]),
193 	GSS_S_GAP_TOKEN
194     },
195     {
196 	GSS_C_REPLAY_FLAG|GSS_C_SEQUENCE_FLAG,
197 	pattern8,
198 	sizeof(pattern8)/sizeof(pattern8[0]),
199 	GSS_S_COMPLETE,
200 	4294967293U
201     },
202     {
203 	0,
204 	pattern1,
205 	sizeof(pattern1)/sizeof(pattern1[0]),
206 	GSS_S_COMPLETE
207     },
208     {
209 	0,
210 	pattern2,
211 	sizeof(pattern2)/sizeof(pattern2[0]),
212 	GSS_S_COMPLETE
213     },
214     {
215 	0,
216 	pattern3,
217 	sizeof(pattern3)/sizeof(pattern3[0]),
218 	GSS_S_COMPLETE
219     },
220     {
221 	0,
222 	pattern4,
223 	sizeof(pattern4)/sizeof(pattern4[0]),
224 	GSS_S_COMPLETE
225     },
226     {
227 	0,
228 	pattern5,
229 	sizeof(pattern5)/sizeof(pattern5[0]),
230 	GSS_S_COMPLETE
231     },
232     {
233 	0,
234 	pattern6,
235 	sizeof(pattern6)/sizeof(pattern6[0]),
236 	GSS_S_COMPLETE
237     },
238     {
239 	0,
240 	pattern7,
241 	sizeof(pattern7)/sizeof(pattern7[0]),
242 	GSS_S_COMPLETE
243     },
244     {
245 	0,
246 	pattern8,
247 	sizeof(pattern8)/sizeof(pattern8[0]),
248 	GSS_S_COMPLETE,
249 	4294967293U
250 
251     },
252     {
253 	GSS_C_REPLAY_FLAG,
254 	pattern1,
255 	sizeof(pattern1)/sizeof(pattern1[0]),
256 	GSS_S_COMPLETE
257     },
258     {
259 	GSS_C_REPLAY_FLAG,
260 	pattern2,
261 	sizeof(pattern2)/sizeof(pattern2[0]),
262 	GSS_S_COMPLETE
263     },
264     {
265 	GSS_C_REPLAY_FLAG,
266 	pattern3,
267 	sizeof(pattern3)/sizeof(pattern3[0]),
268 	GSS_S_DUPLICATE_TOKEN
269     },
270     {
271 	GSS_C_REPLAY_FLAG,
272 	pattern4,
273 	sizeof(pattern4)/sizeof(pattern4[0]),
274 	GSS_S_COMPLETE
275     },
276     {
277 	GSS_C_REPLAY_FLAG,
278 	pattern5,
279 	sizeof(pattern5)/sizeof(pattern5[0]),
280 	0
281     },
282     {
283 	GSS_C_REPLAY_FLAG,
284 	pattern6,
285 	sizeof(pattern6)/sizeof(pattern6[0]),
286 	GSS_S_COMPLETE
287     },
288     {
289 	GSS_C_REPLAY_FLAG,
290 	pattern7,
291 	sizeof(pattern7)/sizeof(pattern7[0]),
292 	GSS_S_COMPLETE
293     },
294     {
295 	GSS_C_SEQUENCE_FLAG,
296 	pattern8,
297 	sizeof(pattern8)/sizeof(pattern8[0]),
298 	GSS_S_COMPLETE,
299 	4294967293U
300     },
301     {
302 	GSS_C_SEQUENCE_FLAG,
303 	pattern1,
304 	sizeof(pattern1)/sizeof(pattern1[0]),
305 	0
306     },
307     {
308 	GSS_C_SEQUENCE_FLAG,
309 	pattern2,
310 	sizeof(pattern2)/sizeof(pattern2[0]),
311 	GSS_S_GAP_TOKEN
312     },
313     {
314 	GSS_C_SEQUENCE_FLAG,
315 	pattern3,
316 	sizeof(pattern3)/sizeof(pattern3[0]),
317 	GSS_S_DUPLICATE_TOKEN
318     },
319     {
320 	GSS_C_SEQUENCE_FLAG,
321 	pattern4,
322 	sizeof(pattern4)/sizeof(pattern4[0]),
323 	GSS_S_GAP_TOKEN
324     },
325     {
326 	GSS_C_SEQUENCE_FLAG,
327 	pattern5,
328 	sizeof(pattern5)/sizeof(pattern5[0]),
329 	GSS_S_GAP_TOKEN
330     },
331     {
332 	GSS_C_SEQUENCE_FLAG,
333 	pattern6,
334 	sizeof(pattern6)/sizeof(pattern6[0]),
335 	GSS_S_COMPLETE
336     },
337     {
338 	GSS_C_SEQUENCE_FLAG,
339 	pattern7,
340 	sizeof(pattern7)/sizeof(pattern7[0]),
341 	GSS_S_GAP_TOKEN
342     },
343     {
344 	GSS_C_REPLAY_FLAG,
345 	pattern8,
346 	sizeof(pattern8)/sizeof(pattern8[0]),
347 	GSS_S_COMPLETE,
348 	4294967293U
349     }
350 };
351 
352 int
353 main(int argc, char **argv)
354 {
355     int i, failed = 0;
356 
357     for (i = 0; i < sizeof(pl)/sizeof(pl[0]); i++) {
358 	if (test_seq(i,
359 		     pl[i].flags,
360 		     pl[i].start_seq,
361 		     pl[i].pattern,
362 		     pl[i].pattern_len,
363 		     pl[i].error_code))
364 	    failed++;
365     }
366     if (failed)
367 	printf("FAILED %d tests\n", failed);
368     return failed != 0;
369 }
370