1c19800e8SDoug Rabson /*
2*ae771770SStanislav Sedov * Copyright (c) 2005 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 <err.h>
35c19800e8SDoug Rabson #include <getarg.h>
36c19800e8SDoug Rabson
37c19800e8SDoug Rabson static void
test_dh2key(int i,krb5_context context,const heim_octet_string * dh,const heim_octet_string * c_n,const heim_octet_string * k_n,krb5_enctype etype,const heim_octet_string * result)38c19800e8SDoug Rabson test_dh2key(int i,
39c19800e8SDoug Rabson krb5_context context,
40c19800e8SDoug Rabson const heim_octet_string *dh,
41c19800e8SDoug Rabson const heim_octet_string *c_n,
42c19800e8SDoug Rabson const heim_octet_string *k_n,
43c19800e8SDoug Rabson krb5_enctype etype,
44c19800e8SDoug Rabson const heim_octet_string *result)
45c19800e8SDoug Rabson {
46c19800e8SDoug Rabson krb5_error_code ret;
47c19800e8SDoug Rabson krb5_keyblock key;
48c19800e8SDoug Rabson
49c19800e8SDoug Rabson ret = _krb5_pk_octetstring2key(context,
50c19800e8SDoug Rabson etype,
51c19800e8SDoug Rabson dh->data, dh->length,
52c19800e8SDoug Rabson c_n,
53c19800e8SDoug Rabson k_n,
54c19800e8SDoug Rabson &key);
55c19800e8SDoug Rabson if (ret != 0)
56c19800e8SDoug Rabson krb5_err(context, 1, ret, "_krb5_pk_octetstring2key: %d", i);
57c19800e8SDoug Rabson
58c19800e8SDoug Rabson if (key.keyvalue.length != result->length ||
59c19800e8SDoug Rabson memcmp(key.keyvalue.data, result->data, result->length) != 0)
60c19800e8SDoug Rabson krb5_errx(context, 1, "resulting key wrong: %d", i);
61c19800e8SDoug Rabson
62c19800e8SDoug Rabson krb5_free_keyblock_contents(context, &key);
63c19800e8SDoug Rabson }
64c19800e8SDoug Rabson
65c19800e8SDoug Rabson
66c19800e8SDoug Rabson struct {
67c19800e8SDoug Rabson krb5_enctype type;
68c19800e8SDoug Rabson krb5_data X;
69c19800e8SDoug Rabson krb5_data key;
70c19800e8SDoug Rabson } tests[] = {
71c19800e8SDoug Rabson /* 0 */
72c19800e8SDoug Rabson {
73c19800e8SDoug Rabson ETYPE_AES256_CTS_HMAC_SHA1_96,
74c19800e8SDoug Rabson {
75c19800e8SDoug Rabson 256,
76c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
77c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
78c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
79c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
80c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
81c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
82c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
83c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
84c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
85c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
86c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
87c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
88c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
89c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
90c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
91c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
92c19800e8SDoug Rabson },
93c19800e8SDoug Rabson {
94c19800e8SDoug Rabson 32,
95c19800e8SDoug Rabson "\x5e\xe5\x0d\x67\x5c\x80\x9f\xe5\x9e\x4a\x77\x62\xc5\x4b\x65\x83"
96c19800e8SDoug Rabson "\x75\x47\xea\xfb\x15\x9b\xd8\xcd\xc7\x5f\xfc\xa5\x91\x1e\x4c\x41"
97c19800e8SDoug Rabson }
98c19800e8SDoug Rabson },
99c19800e8SDoug Rabson /* 1 */
100c19800e8SDoug Rabson {
101c19800e8SDoug Rabson ETYPE_AES256_CTS_HMAC_SHA1_96,
102c19800e8SDoug Rabson {
103c19800e8SDoug Rabson 128,
104c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
105c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
106c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
107c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
108c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
109c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
110c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
111c19800e8SDoug Rabson "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
112c19800e8SDoug Rabson },
113c19800e8SDoug Rabson {
114c19800e8SDoug Rabson 32,
115c19800e8SDoug Rabson "\xac\xf7\x70\x7c\x08\x97\x3d\xdf\xdb\x27\xcd\x36\x14\x42\xcc\xfb"
116c19800e8SDoug Rabson "\xa3\x55\xc8\x88\x4c\xb4\x72\xf3\x7d\xa6\x36\xd0\x7d\x56\x78\x7e"
117c19800e8SDoug Rabson }
118c19800e8SDoug Rabson },
119c19800e8SDoug Rabson /* 2 */
120c19800e8SDoug Rabson {
121c19800e8SDoug Rabson ETYPE_AES256_CTS_HMAC_SHA1_96,
122c19800e8SDoug Rabson {
123c19800e8SDoug Rabson 128,
124c19800e8SDoug Rabson "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
125c19800e8SDoug Rabson "\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
126c19800e8SDoug Rabson "\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d"
127c19800e8SDoug Rabson "\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c"
128c19800e8SDoug Rabson "\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b"
129c19800e8SDoug Rabson "\x0c\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
130c19800e8SDoug Rabson "\x0b\x0c\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
131c19800e8SDoug Rabson "\x0a\x0b\x0c\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08"
132c19800e8SDoug Rabson },
133c19800e8SDoug Rabson {
134c19800e8SDoug Rabson 32,
135c19800e8SDoug Rabson "\xc4\x42\xda\x58\x5f\xcb\x80\xe4\x3b\x47\x94\x6f\x25\x40\x93\xe3"
136c19800e8SDoug Rabson "\x73\x29\xd9\x90\x01\x38\x0d\xb7\x83\x71\xdb\x3a\xcf\x5c\x79\x7e"
137c19800e8SDoug Rabson }
138c19800e8SDoug Rabson },
139c19800e8SDoug Rabson /* 3 */
140c19800e8SDoug Rabson {
141c19800e8SDoug Rabson ETYPE_AES256_CTS_HMAC_SHA1_96,
142c19800e8SDoug Rabson {
143c19800e8SDoug Rabson 77,
144c19800e8SDoug Rabson "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
145c19800e8SDoug Rabson "\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
146c19800e8SDoug Rabson "\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d"
147c19800e8SDoug Rabson "\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c"
148c19800e8SDoug Rabson "\x0d\x0e\x0f\x10\x00\x01\x02\x03"
149c19800e8SDoug Rabson "\x04\x05\x06\x07\x08"
150c19800e8SDoug Rabson },
151c19800e8SDoug Rabson {
152c19800e8SDoug Rabson 32,
153c19800e8SDoug Rabson "\x00\x53\x95\x3b\x84\xc8\x96\xf4\xeb\x38\x5c\x3f\x2e\x75\x1c\x4a"
154c19800e8SDoug Rabson "\x59\x0e\xd6\xff\xad\xca\x6f\xf6\x4f\x47\xeb\xeb\x8d\x78\x0f\xfc"
155c19800e8SDoug Rabson }
156c19800e8SDoug Rabson }
157c19800e8SDoug Rabson };
158c19800e8SDoug Rabson
159c19800e8SDoug Rabson
160c19800e8SDoug Rabson static int version_flag = 0;
161c19800e8SDoug Rabson static int help_flag = 0;
162c19800e8SDoug Rabson
163c19800e8SDoug Rabson static struct getargs args[] = {
164c19800e8SDoug Rabson {"version", 0, arg_flag, &version_flag,
165c19800e8SDoug Rabson "print version", NULL },
166c19800e8SDoug Rabson {"help", 0, arg_flag, &help_flag,
167c19800e8SDoug Rabson NULL, NULL }
168c19800e8SDoug Rabson };
169c19800e8SDoug Rabson
170c19800e8SDoug Rabson static void
usage(int ret)171c19800e8SDoug Rabson usage (int ret)
172c19800e8SDoug Rabson {
173c19800e8SDoug Rabson arg_printusage (args,
174c19800e8SDoug Rabson sizeof(args)/sizeof(*args),
175c19800e8SDoug Rabson NULL,
176c19800e8SDoug Rabson "");
177c19800e8SDoug Rabson exit (ret);
178c19800e8SDoug Rabson }
179c19800e8SDoug Rabson
180c19800e8SDoug Rabson
181c19800e8SDoug Rabson int
main(int argc,char ** argv)182c19800e8SDoug Rabson main(int argc, char **argv)
183c19800e8SDoug Rabson {
184c19800e8SDoug Rabson krb5_context context;
185c19800e8SDoug Rabson krb5_error_code ret;
186c19800e8SDoug Rabson int i, optidx = 0;
187c19800e8SDoug Rabson
188c19800e8SDoug Rabson setprogname(argv[0]);
189c19800e8SDoug Rabson
190c19800e8SDoug Rabson if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
191c19800e8SDoug Rabson usage(1);
192c19800e8SDoug Rabson
193c19800e8SDoug Rabson if (help_flag)
194c19800e8SDoug Rabson usage (0);
195c19800e8SDoug Rabson
196c19800e8SDoug Rabson if(version_flag){
197c19800e8SDoug Rabson print_version(NULL);
198c19800e8SDoug Rabson exit(0);
199c19800e8SDoug Rabson }
200c19800e8SDoug Rabson
201c19800e8SDoug Rabson argc -= optidx;
202c19800e8SDoug Rabson argv += optidx;
203c19800e8SDoug Rabson
204c19800e8SDoug Rabson ret = krb5_init_context(&context);
205c19800e8SDoug Rabson if (ret)
206c19800e8SDoug Rabson errx (1, "krb5_init_context failed: %d", ret);
207c19800e8SDoug Rabson
208c19800e8SDoug Rabson for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
209c19800e8SDoug Rabson test_dh2key(i, context, &tests[i].X, NULL, NULL,
210c19800e8SDoug Rabson tests[i].type, &tests[i].key);
211c19800e8SDoug Rabson }
212c19800e8SDoug Rabson
213c19800e8SDoug Rabson krb5_free_context(context);
214c19800e8SDoug Rabson
215c19800e8SDoug Rabson return 0;
216c19800e8SDoug Rabson }
217