xref: /freebsd/crypto/heimdal/lib/krb5/test_store.c (revision ed549cb0)
1c19800e8SDoug Rabson /*
2ae771770SStanislav Sedov  * Copyright (c) 2006 Kungliga Tekniska Högskolan
3c19800e8SDoug Rabson  * (Royal Institute of Technology, Stockholm, Sweden).
4c19800e8SDoug Rabson  * All rights reserved.
5c19800e8SDoug Rabson  *
6c19800e8SDoug Rabson  * Redistribution and use in source and binary forms, with or without
7c19800e8SDoug Rabson  * modification, are permitted provided that the following conditions
8c19800e8SDoug Rabson  * are met:
9c19800e8SDoug Rabson  *
10c19800e8SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
11c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer.
12c19800e8SDoug Rabson  *
13c19800e8SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
14c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
15c19800e8SDoug Rabson  *    documentation and/or other materials provided with the distribution.
16c19800e8SDoug Rabson  *
17c19800e8SDoug Rabson  * 3. Neither the name of KTH nor the names of its contributors may be
18c19800e8SDoug Rabson  *    used to endorse or promote products derived from this software without
19c19800e8SDoug Rabson  *    specific prior written permission.
20c19800e8SDoug Rabson  *
21c19800e8SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
22c19800e8SDoug Rabson  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23c19800e8SDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24c19800e8SDoug Rabson  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
25c19800e8SDoug Rabson  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26c19800e8SDoug Rabson  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27c19800e8SDoug Rabson  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28c19800e8SDoug Rabson  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29c19800e8SDoug Rabson  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30c19800e8SDoug Rabson  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31c19800e8SDoug Rabson  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32c19800e8SDoug Rabson 
33c19800e8SDoug Rabson #include "krb5_locl.h"
34c19800e8SDoug Rabson #include <getarg.h>
35c19800e8SDoug Rabson 
36c19800e8SDoug Rabson static void
test_int8(krb5_context context,krb5_storage * sp)37c19800e8SDoug Rabson test_int8(krb5_context context, krb5_storage *sp)
38c19800e8SDoug Rabson {
39c19800e8SDoug Rabson     krb5_error_code ret;
40c19800e8SDoug Rabson     int i;
41c19800e8SDoug Rabson     int8_t val[] = {
42c19800e8SDoug Rabson 	0, 1, -1, 128, -127
43c19800e8SDoug Rabson     }, v;
44c19800e8SDoug Rabson 
45ae771770SStanislav Sedov     krb5_storage_truncate(sp, 0);
46ae771770SStanislav Sedov 
47c19800e8SDoug Rabson     for (i = 0; i < sizeof(val[0])/sizeof(val); i++) {
48c19800e8SDoug Rabson 
49c19800e8SDoug Rabson 	ret = krb5_store_int8(sp, val[i]);
50c19800e8SDoug Rabson 	if (ret)
51c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_store_int8");
52c19800e8SDoug Rabson 	krb5_storage_seek(sp, 0, SEEK_SET);
53c19800e8SDoug Rabson 	ret = krb5_ret_int8(sp, &v);
54c19800e8SDoug Rabson 	if (ret)
55c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_ret_int8");
56c19800e8SDoug Rabson 	if (v != val[i])
57c19800e8SDoug Rabson 	    krb5_errx(context, 1, "store and ret mismatch");
58c19800e8SDoug Rabson     }
59c19800e8SDoug Rabson }
60c19800e8SDoug Rabson 
61c19800e8SDoug Rabson static void
test_int16(krb5_context context,krb5_storage * sp)62c19800e8SDoug Rabson test_int16(krb5_context context, krb5_storage *sp)
63c19800e8SDoug Rabson {
64c19800e8SDoug Rabson     krb5_error_code ret;
65c19800e8SDoug Rabson     int i;
66c19800e8SDoug Rabson     int16_t val[] = {
67ed549cb0SCy Schubert 	0, 1, -1, 32767, -32768
68c19800e8SDoug Rabson     }, v;
69c19800e8SDoug Rabson 
70ae771770SStanislav Sedov     krb5_storage_truncate(sp, 0);
71ae771770SStanislav Sedov 
72c19800e8SDoug Rabson     for (i = 0; i < sizeof(val[0])/sizeof(val); i++) {
73c19800e8SDoug Rabson 
74c19800e8SDoug Rabson 	ret = krb5_store_int16(sp, val[i]);
75c19800e8SDoug Rabson 	if (ret)
76c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_store_int16");
77c19800e8SDoug Rabson 	krb5_storage_seek(sp, 0, SEEK_SET);
78c19800e8SDoug Rabson 	ret = krb5_ret_int16(sp, &v);
79c19800e8SDoug Rabson 	if (ret)
80c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_ret_int16");
81c19800e8SDoug Rabson 	if (v != val[i])
82c19800e8SDoug Rabson 	    krb5_errx(context, 1, "store and ret mismatch");
83c19800e8SDoug Rabson     }
84c19800e8SDoug Rabson }
85c19800e8SDoug Rabson 
86c19800e8SDoug Rabson static void
test_int32(krb5_context context,krb5_storage * sp)87c19800e8SDoug Rabson test_int32(krb5_context context, krb5_storage *sp)
88c19800e8SDoug Rabson {
89c19800e8SDoug Rabson     krb5_error_code ret;
90c19800e8SDoug Rabson     int i;
91c19800e8SDoug Rabson     int32_t val[] = {
92c19800e8SDoug Rabson 	0, 1, -1, 2147483647, -2147483646
93c19800e8SDoug Rabson     }, v;
94c19800e8SDoug Rabson 
95ae771770SStanislav Sedov     krb5_storage_truncate(sp, 0);
96ae771770SStanislav Sedov 
97c19800e8SDoug Rabson     for (i = 0; i < sizeof(val[0])/sizeof(val); i++) {
98c19800e8SDoug Rabson 
99c19800e8SDoug Rabson 	ret = krb5_store_int32(sp, val[i]);
100c19800e8SDoug Rabson 	if (ret)
101c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_store_int32");
102c19800e8SDoug Rabson 	krb5_storage_seek(sp, 0, SEEK_SET);
103c19800e8SDoug Rabson 	ret = krb5_ret_int32(sp, &v);
104c19800e8SDoug Rabson 	if (ret)
105c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_ret_int32");
106c19800e8SDoug Rabson 	if (v != val[i])
107c19800e8SDoug Rabson 	    krb5_errx(context, 1, "store and ret mismatch");
108c19800e8SDoug Rabson     }
109c19800e8SDoug Rabson }
110c19800e8SDoug Rabson 
111c19800e8SDoug Rabson static void
test_uint8(krb5_context context,krb5_storage * sp)112c19800e8SDoug Rabson test_uint8(krb5_context context, krb5_storage *sp)
113c19800e8SDoug Rabson {
114c19800e8SDoug Rabson     krb5_error_code ret;
115c19800e8SDoug Rabson     int i;
116c19800e8SDoug Rabson     uint8_t val[] = {
117c19800e8SDoug Rabson 	0, 1, 255
118c19800e8SDoug Rabson     }, v;
119c19800e8SDoug Rabson 
120ae771770SStanislav Sedov     krb5_storage_truncate(sp, 0);
121ae771770SStanislav Sedov 
122c19800e8SDoug Rabson     for (i = 0; i < sizeof(val[0])/sizeof(val); i++) {
123c19800e8SDoug Rabson 
124c19800e8SDoug Rabson 	ret = krb5_store_uint8(sp, val[i]);
125c19800e8SDoug Rabson 	if (ret)
126c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_store_uint8");
127c19800e8SDoug Rabson 	krb5_storage_seek(sp, 0, SEEK_SET);
128c19800e8SDoug Rabson 	ret = krb5_ret_uint8(sp, &v);
129c19800e8SDoug Rabson 	if (ret)
130c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_ret_uint8");
131c19800e8SDoug Rabson 	if (v != val[i])
132c19800e8SDoug Rabson 	    krb5_errx(context, 1, "store and ret mismatch");
133c19800e8SDoug Rabson     }
134c19800e8SDoug Rabson }
135c19800e8SDoug Rabson 
136c19800e8SDoug Rabson static void
test_uint16(krb5_context context,krb5_storage * sp)137c19800e8SDoug Rabson test_uint16(krb5_context context, krb5_storage *sp)
138c19800e8SDoug Rabson {
139c19800e8SDoug Rabson     krb5_error_code ret;
140c19800e8SDoug Rabson     int i;
141c19800e8SDoug Rabson     uint16_t val[] = {
142c19800e8SDoug Rabson 	0, 1, 65535
143c19800e8SDoug Rabson     }, v;
144c19800e8SDoug Rabson 
145ae771770SStanislav Sedov     krb5_storage_truncate(sp, 0);
146ae771770SStanislav Sedov 
147c19800e8SDoug Rabson     for (i = 0; i < sizeof(val[0])/sizeof(val); i++) {
148c19800e8SDoug Rabson 
149c19800e8SDoug Rabson 	ret = krb5_store_uint16(sp, val[i]);
150c19800e8SDoug Rabson 	if (ret)
151c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_store_uint16");
152c19800e8SDoug Rabson 	krb5_storage_seek(sp, 0, SEEK_SET);
153c19800e8SDoug Rabson 	ret = krb5_ret_uint16(sp, &v);
154c19800e8SDoug Rabson 	if (ret)
155c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_ret_uint16");
156c19800e8SDoug Rabson 	if (v != val[i])
157c19800e8SDoug Rabson 	    krb5_errx(context, 1, "store and ret mismatch");
158c19800e8SDoug Rabson     }
159c19800e8SDoug Rabson }
160c19800e8SDoug Rabson 
161c19800e8SDoug Rabson static void
test_uint32(krb5_context context,krb5_storage * sp)162c19800e8SDoug Rabson test_uint32(krb5_context context, krb5_storage *sp)
163c19800e8SDoug Rabson {
164c19800e8SDoug Rabson     krb5_error_code ret;
165c19800e8SDoug Rabson     int i;
166c19800e8SDoug Rabson     uint32_t val[] = {
167c19800e8SDoug Rabson 	0, 1, 4294967295UL
168c19800e8SDoug Rabson     }, v;
169c19800e8SDoug Rabson 
170ae771770SStanislav Sedov     krb5_storage_truncate(sp, 0);
171ae771770SStanislav Sedov 
172c19800e8SDoug Rabson     for (i = 0; i < sizeof(val[0])/sizeof(val); i++) {
173c19800e8SDoug Rabson 
174c19800e8SDoug Rabson 	ret = krb5_store_uint32(sp, val[i]);
175c19800e8SDoug Rabson 	if (ret)
176c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_store_uint32");
177c19800e8SDoug Rabson 	krb5_storage_seek(sp, 0, SEEK_SET);
178c19800e8SDoug Rabson 	ret = krb5_ret_uint32(sp, &v);
179c19800e8SDoug Rabson 	if (ret)
180c19800e8SDoug Rabson 	    krb5_err(context, 1, ret, "krb5_ret_uint32");
181c19800e8SDoug Rabson 	if (v != val[i])
182c19800e8SDoug Rabson 	    krb5_errx(context, 1, "store and ret mismatch");
183c19800e8SDoug Rabson     }
184c19800e8SDoug Rabson }
185c19800e8SDoug Rabson 
186c19800e8SDoug Rabson 
187c19800e8SDoug Rabson static void
test_storage(krb5_context context,krb5_storage * sp)188ae771770SStanislav Sedov test_storage(krb5_context context, krb5_storage *sp)
189c19800e8SDoug Rabson {
190c19800e8SDoug Rabson     test_int8(context, sp);
191c19800e8SDoug Rabson     test_int16(context, sp);
192c19800e8SDoug Rabson     test_int32(context, sp);
193c19800e8SDoug Rabson     test_uint8(context, sp);
194c19800e8SDoug Rabson     test_uint16(context, sp);
195c19800e8SDoug Rabson     test_uint32(context, sp);
196ae771770SStanislav Sedov }
197c19800e8SDoug Rabson 
198ae771770SStanislav Sedov 
199ae771770SStanislav Sedov static void
test_truncate(krb5_context context,krb5_storage * sp,int fd)200ae771770SStanislav Sedov test_truncate(krb5_context context, krb5_storage *sp, int fd)
201ae771770SStanislav Sedov {
202ae771770SStanislav Sedov     struct stat sb;
203ae771770SStanislav Sedov 
204ae771770SStanislav Sedov     krb5_store_string(sp, "hej");
205ae771770SStanislav Sedov     krb5_storage_truncate(sp, 2);
206ae771770SStanislav Sedov 
207ae771770SStanislav Sedov     if (fstat(fd, &sb) != 0)
208ae771770SStanislav Sedov 	krb5_err(context, 1, errno, "fstat");
209ae771770SStanislav Sedov     if (sb.st_size != 2)
210ae771770SStanislav Sedov 	krb5_errx(context, 1, "length not 2");
211ae771770SStanislav Sedov 
212ae771770SStanislav Sedov     krb5_storage_truncate(sp, 1024);
213ae771770SStanislav Sedov 
214ae771770SStanislav Sedov     if (fstat(fd, &sb) != 0)
215ae771770SStanislav Sedov 	krb5_err(context, 1, errno, "fstat");
216ae771770SStanislav Sedov     if (sb.st_size != 1024)
217ae771770SStanislav Sedov 	krb5_errx(context, 1, "length not 2");
218ae771770SStanislav Sedov }
219ae771770SStanislav Sedov 
220ae771770SStanislav Sedov static void
check_too_large(krb5_context context,krb5_storage * sp)221ae771770SStanislav Sedov check_too_large(krb5_context context, krb5_storage *sp)
222ae771770SStanislav Sedov {
223ae771770SStanislav Sedov     uint32_t too_big_sizes[] = { INT_MAX, INT_MAX / 2, INT_MAX / 4, INT_MAX / 8 + 1};
224ae771770SStanislav Sedov     krb5_error_code ret;
225ae771770SStanislav Sedov     krb5_data data;
226ae771770SStanislav Sedov     size_t n;
227ae771770SStanislav Sedov 
228ae771770SStanislav Sedov     for (n = 0; n < sizeof(too_big_sizes) / sizeof(too_big_sizes); n++) {
229ae771770SStanislav Sedov 	krb5_storage_truncate(sp, 0);
230ae771770SStanislav Sedov 	krb5_store_uint32(sp, too_big_sizes[n]);
231ae771770SStanislav Sedov 	krb5_storage_seek(sp, 0, SEEK_SET);
232ae771770SStanislav Sedov 	ret = krb5_ret_data(sp, &data);
233ae771770SStanislav Sedov 	if (ret != HEIM_ERR_TOO_BIG)
234ae771770SStanislav Sedov 	    errx(1, "not too big: %lu", (unsigned long)n);
235ae771770SStanislav Sedov     }
236c19800e8SDoug Rabson }
237c19800e8SDoug Rabson 
238c19800e8SDoug Rabson /*
239c19800e8SDoug Rabson  *
240c19800e8SDoug Rabson  */
241c19800e8SDoug Rabson 
242c19800e8SDoug Rabson static int version_flag = 0;
243c19800e8SDoug Rabson static int help_flag	= 0;
244c19800e8SDoug Rabson 
245c19800e8SDoug Rabson static struct getargs args[] = {
246c19800e8SDoug Rabson     {"version",	0,	arg_flag,	&version_flag,
247c19800e8SDoug Rabson      "print version", NULL },
248c19800e8SDoug Rabson     {"help",	0,	arg_flag,	&help_flag,
249c19800e8SDoug Rabson      NULL, NULL }
250c19800e8SDoug Rabson };
251c19800e8SDoug Rabson 
252c19800e8SDoug Rabson static void
usage(int ret)253c19800e8SDoug Rabson usage (int ret)
254c19800e8SDoug Rabson {
255c19800e8SDoug Rabson     arg_printusage (args,
256c19800e8SDoug Rabson 		    sizeof(args)/sizeof(*args),
257c19800e8SDoug Rabson 		    NULL,
258c19800e8SDoug Rabson 		    "");
259c19800e8SDoug Rabson     exit (ret);
260c19800e8SDoug Rabson }
261c19800e8SDoug Rabson 
262c19800e8SDoug Rabson int
main(int argc,char ** argv)263c19800e8SDoug Rabson main(int argc, char **argv)
264c19800e8SDoug Rabson {
265c19800e8SDoug Rabson     krb5_context context;
266c19800e8SDoug Rabson     krb5_error_code ret;
267ae771770SStanislav Sedov     int fd, optidx = 0;
268ae771770SStanislav Sedov     krb5_storage *sp;
269ae771770SStanislav Sedov     const char *fn = "test-store-data";
270c19800e8SDoug Rabson 
271c19800e8SDoug Rabson     setprogname(argv[0]);
272c19800e8SDoug Rabson 
273c19800e8SDoug Rabson     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
274c19800e8SDoug Rabson 	usage(1);
275c19800e8SDoug Rabson 
276c19800e8SDoug Rabson     if (help_flag)
277c19800e8SDoug Rabson 	usage (0);
278c19800e8SDoug Rabson 
279c19800e8SDoug Rabson     if(version_flag){
280c19800e8SDoug Rabson 	print_version(NULL);
281c19800e8SDoug Rabson 	exit(0);
282c19800e8SDoug Rabson     }
283c19800e8SDoug Rabson 
284c19800e8SDoug Rabson     argc -= optidx;
285c19800e8SDoug Rabson     argv += optidx;
286c19800e8SDoug Rabson 
287c19800e8SDoug Rabson     ret = krb5_init_context (&context);
288c19800e8SDoug Rabson     if (ret)
289c19800e8SDoug Rabson 	errx (1, "krb5_init_context failed: %d", ret);
290c19800e8SDoug Rabson 
291ae771770SStanislav Sedov     /*
292ae771770SStanislav Sedov      * Test encoding/decoding of primotive types on diffrent backends
293ae771770SStanislav Sedov      */
294ae771770SStanislav Sedov 
295ae771770SStanislav Sedov     sp = krb5_storage_emem();
296ae771770SStanislav Sedov     if (sp == NULL)
297ae771770SStanislav Sedov 	krb5_errx(context, 1, "krb5_storage_emem: no mem");
298ae771770SStanislav Sedov 
299ae771770SStanislav Sedov     test_storage(context, sp);
300ae771770SStanislav Sedov     check_too_large(context, sp);
301ae771770SStanislav Sedov     krb5_storage_free(sp);
302ae771770SStanislav Sedov 
303ae771770SStanislav Sedov 
304ae771770SStanislav Sedov     fd = open(fn, O_RDWR|O_CREAT|O_TRUNC, 0600);
305ae771770SStanislav Sedov     if (fd < 0)
306ae771770SStanislav Sedov 	krb5_err(context, 1, errno, "open(%s)", fn);
307ae771770SStanislav Sedov 
308ae771770SStanislav Sedov     sp = krb5_storage_from_fd(fd);
309ae771770SStanislav Sedov     close(fd);
310ae771770SStanislav Sedov     if (sp == NULL)
311ae771770SStanislav Sedov 	krb5_errx(context, 1, "krb5_storage_from_fd: %s no mem", fn);
312ae771770SStanislav Sedov 
313ae771770SStanislav Sedov     test_storage(context, sp);
314ae771770SStanislav Sedov     krb5_storage_free(sp);
315ae771770SStanislav Sedov     unlink(fn);
316ae771770SStanislav Sedov 
317ae771770SStanislav Sedov     /*
318ae771770SStanislav Sedov      * test truncate behavior
319ae771770SStanislav Sedov      */
320ae771770SStanislav Sedov 
321ae771770SStanislav Sedov     fd = open(fn, O_RDWR|O_CREAT|O_TRUNC, 0600);
322ae771770SStanislav Sedov     if (fd < 0)
323ae771770SStanislav Sedov 	krb5_err(context, 1, errno, "open(%s)", fn);
324ae771770SStanislav Sedov 
325ae771770SStanislav Sedov     sp = krb5_storage_from_fd(fd);
326ae771770SStanislav Sedov     if (sp == NULL)
327ae771770SStanislav Sedov 	krb5_errx(context, 1, "krb5_storage_from_fd: %s no mem", fn);
328ae771770SStanislav Sedov 
329ae771770SStanislav Sedov     test_truncate(context, sp, fd);
330ae771770SStanislav Sedov     krb5_storage_free(sp);
331ae771770SStanislav Sedov     close(fd);
332ae771770SStanislav Sedov     unlink(fn);
333c19800e8SDoug Rabson 
334c19800e8SDoug Rabson     krb5_free_context(context);
335c19800e8SDoug Rabson 
336c19800e8SDoug Rabson     return 0;
337c19800e8SDoug Rabson }
338