1 /* $NetBSD: test_keytab.c,v 1.1.1.2 2014/04/24 12:45:51 pettai Exp $ */
4 * Copyright (c) 2005 Kungliga Tekniska Högskolan
5 * (Royal Institute of Technology, Stockholm, Sweden).
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
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.
19 * 3. Neither the name of KTH nor the names of its contributors may be
20 * used to endorse or promote products derived from this software without
21 * specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
24 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
35 #include "krb5_locl.h"
37 #include <krb5/getarg.h>
40 * Test that removal entry from of empty keytab doesn't corrupts
45 test_empty_keytab(krb5_context context
, const char *keytab
)
49 krb5_keytab_entry entry
;
51 ret
= krb5_kt_resolve(context
, keytab
, &id
);
53 krb5_err(context
, 1, ret
, "krb5_kt_resolve");
55 memset(&entry
, 0, sizeof(entry
));
57 krb5_kt_remove_entry(context
, id
, &entry
);
59 ret
= krb5_kt_have_content(context
, id
);
61 krb5_errx(context
, 1, "supposed to be empty keytab isn't");
63 ret
= krb5_kt_close(context
, id
);
65 krb5_err(context
, 1, ret
, "krb5_kt_close");
69 * Test that memory keytab are refcounted.
73 test_memory_keytab(krb5_context context
, const char *keytab
, const char *keytab2
)
76 krb5_keytab id
, id2
, id3
;
77 krb5_keytab_entry entry
, entry2
, entry3
;
79 ret
= krb5_kt_resolve(context
, keytab
, &id
);
81 krb5_err(context
, 1, ret
, "krb5_kt_resolve");
83 memset(&entry
, 0, sizeof(entry
));
84 ret
= krb5_parse_name(context
, "lha@SU.SE", &entry
.principal
);
86 krb5_err(context
, 1, ret
, "krb5_parse_name");
88 ret
= krb5_generate_random_keyblock(context
,
89 ETYPE_AES256_CTS_HMAC_SHA1_96
,
92 krb5_err(context
, 1, ret
, "krb5_generate_random_keyblock");
94 krb5_kt_add_entry(context
, id
, &entry
);
96 ret
= krb5_kt_resolve(context
, keytab
, &id2
);
98 krb5_err(context
, 1, ret
, "krb5_kt_resolve");
100 ret
= krb5_kt_get_entry(context
, id
,
103 ETYPE_AES256_CTS_HMAC_SHA1_96
,
106 krb5_err(context
, 1, ret
, "krb5_kt_get_entry");
107 krb5_kt_free_entry(context
, &entry2
);
109 ret
= krb5_kt_close(context
, id
);
111 krb5_err(context
, 1, ret
, "krb5_kt_close");
113 ret
= krb5_kt_get_entry(context
, id2
,
116 ETYPE_AES256_CTS_HMAC_SHA1_96
,
119 krb5_err(context
, 1, ret
, "krb5_kt_get_entry");
120 krb5_kt_free_entry(context
, &entry2
);
122 ret
= krb5_kt_close(context
, id2
);
124 krb5_err(context
, 1, ret
, "krb5_kt_close");
127 ret
= krb5_kt_resolve(context
, keytab2
, &id3
);
129 krb5_err(context
, 1, ret
, "krb5_kt_resolve");
131 memset(&entry3
, 0, sizeof(entry3
));
132 ret
= krb5_parse_name(context
, "lha3@SU.SE", &entry3
.principal
);
134 krb5_err(context
, 1, ret
, "krb5_parse_name");
136 ret
= krb5_generate_random_keyblock(context
,
137 ETYPE_AES256_CTS_HMAC_SHA1_96
,
140 krb5_err(context
, 1, ret
, "krb5_generate_random_keyblock");
142 krb5_kt_add_entry(context
, id3
, &entry3
);
145 ret
= krb5_kt_resolve(context
, keytab
, &id
);
147 krb5_err(context
, 1, ret
, "krb5_kt_resolve");
149 ret
= krb5_kt_get_entry(context
, id
,
152 ETYPE_AES256_CTS_HMAC_SHA1_96
,
155 krb5_errx(context
, 1, "krb5_kt_get_entry when if should fail");
157 krb5_kt_remove_entry(context
, id
, &entry
);
159 ret
= krb5_kt_close(context
, id
);
161 krb5_err(context
, 1, ret
, "krb5_kt_close");
163 krb5_kt_free_entry(context
, &entry
);
165 krb5_kt_remove_entry(context
, id3
, &entry3
);
167 ret
= krb5_kt_close(context
, id3
);
169 krb5_err(context
, 1, ret
, "krb5_kt_close");
171 krb5_free_principal(context
, entry3
.principal
);
172 krb5_free_keyblock_contents(context
, &entry3
.keyblock
);
176 perf_add(krb5_context context
, krb5_keytab id
, int times
)
181 perf_find(krb5_context context
, krb5_keytab id
, int times
)
186 perf_delete(krb5_context context
, krb5_keytab id
, int forward
, int times
)
191 static int version_flag
= 0;
192 static int help_flag
= 0;
193 static char *perf_str
= NULL
;
194 static int times
= 1000;
196 static struct getargs args
[] = {
197 {"performance", 0, arg_string
, &perf_str
,
198 "test performance for named keytab", "keytab" },
199 {"times", 0, arg_integer
, ×
,
200 "number of times to run the perforamce test", "number" },
201 {"version", 0, arg_flag
, &version_flag
,
202 "print version", NULL
},
203 {"help", 0, arg_flag
, &help_flag
,
210 arg_printusage (args
,
211 sizeof(args
)/sizeof(*args
),
218 main(int argc
, char **argv
)
220 krb5_context context
;
224 setprogname(argv
[0]);
226 if(getarg(args
, sizeof(args
) / sizeof(args
[0]), argc
, argv
, &optidx
))
241 errx(1, "argc != 0");
243 ret
= krb5_init_context(&context
);
245 errx (1, "krb5_init_context failed: %d", ret
);
250 ret
= krb5_kt_resolve(context
, perf_str
, &id
);
252 krb5_err(context
, 1, ret
, "krb5_kt_resolve: %s", perf_str
);
254 /* add, find, delete on keytab */
255 perf_add(context
, id
, times
);
256 perf_find(context
, id
, times
);
257 perf_delete(context
, id
, 0, times
);
259 /* add and find again on used keytab */
260 perf_add(context
, id
, times
);
261 perf_find(context
, id
, times
);
263 ret
= krb5_kt_destroy(context
, id
);
265 krb5_err(context
, 1, ret
, "krb5_kt_destroy: %s", perf_str
);
267 ret
= krb5_kt_resolve(context
, perf_str
, &id
);
269 krb5_err(context
, 1, ret
, "krb5_kt_resolve: %s", perf_str
);
271 /* try delete backwards */
273 perf_add(context
, id
, times
);
274 perf_delete(context
, id
, 1, times
);
277 ret
= krb5_kt_destroy(context
, id
);
279 krb5_err(context
, 1, ret
, "krb5_kt_destroy");
283 test_empty_keytab(context
, "MEMORY:foo");
284 test_empty_keytab(context
, "FILE:foo");
286 test_memory_keytab(context
, "MEMORY:foo", "MEMORY:foo2");
290 krb5_free_context(context
);