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
test_seq(int t,OM_uint32 flags,OM_uint32 start_seq,OM_uint32 * pattern,int pattern_len,OM_uint32 expected_error)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
main(int argc,char ** argv)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