1178825Sdfr/*
2178825Sdfr * Copyright (c) 2005 Kungliga Tekniska H�gskolan
3178825Sdfr * (Royal Institute of Technology, Stockholm, Sweden).
4178825Sdfr * All rights reserved.
5178825Sdfr *
6178825Sdfr * Redistribution and use in source and binary forms, with or without
7178825Sdfr * modification, are permitted provided that the following conditions
8178825Sdfr * are met:
9178825Sdfr *
10178825Sdfr * 1. Redistributions of source code must retain the above copyright
11178825Sdfr *    notice, this list of conditions and the following disclaimer.
12178825Sdfr *
13178825Sdfr * 2. Redistributions in binary form must reproduce the above copyright
14178825Sdfr *    notice, this list of conditions and the following disclaimer in the
15178825Sdfr *    documentation and/or other materials provided with the distribution.
16178825Sdfr *
17178825Sdfr * 3. Neither the name of KTH nor the names of its contributors may be
18178825Sdfr *    used to endorse or promote products derived from this software without
19178825Sdfr *    specific prior written permission.
20178825Sdfr *
21178825Sdfr * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
22178825Sdfr * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23178825Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24178825Sdfr * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
25178825Sdfr * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26178825Sdfr * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27178825Sdfr * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28178825Sdfr * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29178825Sdfr * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30178825Sdfr * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31178825Sdfr * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32178825Sdfr
33178825Sdfr#include "krb5_locl.h"
34178825Sdfr#include <err.h>
35178825Sdfr#include <getarg.h>
36178825Sdfr
37178825SdfrRCSID("$Id: test_pkinit_dh2key.c 18809 2006-10-22 07:11:43Z lha $");
38178825Sdfr
39178825Sdfrstatic void
40178825Sdfrtest_dh2key(int i,
41178825Sdfr	    krb5_context context,
42178825Sdfr	    const heim_octet_string *dh,
43178825Sdfr	    const heim_octet_string *c_n,
44178825Sdfr	    const heim_octet_string *k_n,
45178825Sdfr	    krb5_enctype etype,
46178825Sdfr	    const heim_octet_string *result)
47178825Sdfr{
48178825Sdfr    krb5_error_code ret;
49178825Sdfr    krb5_keyblock key;
50178825Sdfr
51178825Sdfr    ret = _krb5_pk_octetstring2key(context,
52178825Sdfr				   etype,
53178825Sdfr				   dh->data, dh->length,
54178825Sdfr				   c_n,
55178825Sdfr				   k_n,
56178825Sdfr				   &key);
57178825Sdfr    if (ret != 0)
58178825Sdfr	krb5_err(context, 1, ret, "_krb5_pk_octetstring2key: %d", i);
59178825Sdfr
60178825Sdfr    if (key.keyvalue.length != result->length ||
61178825Sdfr	memcmp(key.keyvalue.data, result->data, result->length) != 0)
62178825Sdfr	krb5_errx(context, 1, "resulting key wrong: %d", i);
63178825Sdfr
64178825Sdfr    krb5_free_keyblock_contents(context, &key);
65178825Sdfr}
66178825Sdfr
67178825Sdfr
68178825Sdfrstruct {
69178825Sdfr    krb5_enctype type;
70178825Sdfr    krb5_data X;
71178825Sdfr    krb5_data key;
72178825Sdfr} tests[] = {
73178825Sdfr    /* 0 */
74178825Sdfr    {
75178825Sdfr	ETYPE_AES256_CTS_HMAC_SHA1_96,
76178825Sdfr	{
77178825Sdfr	    256,
78178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
79178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
80178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
81178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
82178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
83178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
84178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
85178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
86178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
87178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
88178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
89178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
90178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
91178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
92178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
93178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
94178825Sdfr	},
95178825Sdfr	{
96178825Sdfr	    32,
97178825Sdfr	    "\x5e\xe5\x0d\x67\x5c\x80\x9f\xe5\x9e\x4a\x77\x62\xc5\x4b\x65\x83"
98178825Sdfr	    "\x75\x47\xea\xfb\x15\x9b\xd8\xcd\xc7\x5f\xfc\xa5\x91\x1e\x4c\x41"
99178825Sdfr	}
100178825Sdfr    },
101178825Sdfr    /* 1 */
102178825Sdfr    {
103178825Sdfr	ETYPE_AES256_CTS_HMAC_SHA1_96,
104178825Sdfr	{
105178825Sdfr	    128,
106178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
107178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
108178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
109178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
110178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
111178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
112178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
113178825Sdfr	    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
114178825Sdfr	},
115178825Sdfr	{
116178825Sdfr	    32,
117178825Sdfr	    "\xac\xf7\x70\x7c\x08\x97\x3d\xdf\xdb\x27\xcd\x36\x14\x42\xcc\xfb"
118178825Sdfr	    "\xa3\x55\xc8\x88\x4c\xb4\x72\xf3\x7d\xa6\x36\xd0\x7d\x56\x78\x7e"
119178825Sdfr	}
120178825Sdfr    },
121178825Sdfr    /* 2 */
122178825Sdfr    {
123178825Sdfr	ETYPE_AES256_CTS_HMAC_SHA1_96,
124178825Sdfr	{
125178825Sdfr	    128,
126178825Sdfr	    "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
127178825Sdfr	    "\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
128178825Sdfr	    "\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d"
129178825Sdfr	    "\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c"
130178825Sdfr	    "\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b"
131178825Sdfr	    "\x0c\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"
132178825Sdfr	    "\x0b\x0c\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
133178825Sdfr	    "\x0a\x0b\x0c\x0d\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08"
134178825Sdfr	},
135178825Sdfr	{
136178825Sdfr	    32,
137178825Sdfr	    "\xc4\x42\xda\x58\x5f\xcb\x80\xe4\x3b\x47\x94\x6f\x25\x40\x93\xe3"
138178825Sdfr	    "\x73\x29\xd9\x90\x01\x38\x0d\xb7\x83\x71\xdb\x3a\xcf\x5c\x79\x7e"
139178825Sdfr	}
140178825Sdfr    },
141178825Sdfr    /* 3 */
142178825Sdfr    {
143178825Sdfr	ETYPE_AES256_CTS_HMAC_SHA1_96,
144178825Sdfr	{
145178825Sdfr	    77,
146178825Sdfr	    "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
147178825Sdfr	    "\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
148178825Sdfr	    "\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d"
149178825Sdfr	    "\x0e\x0f\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c"
150178825Sdfr	    "\x0d\x0e\x0f\x10\x00\x01\x02\x03"
151178825Sdfr	    "\x04\x05\x06\x07\x08"
152178825Sdfr	},
153178825Sdfr	{
154178825Sdfr	    32,
155178825Sdfr	    "\x00\x53\x95\x3b\x84\xc8\x96\xf4\xeb\x38\x5c\x3f\x2e\x75\x1c\x4a"
156178825Sdfr	    "\x59\x0e\xd6\xff\xad\xca\x6f\xf6\x4f\x47\xeb\xeb\x8d\x78\x0f\xfc"
157178825Sdfr	}
158178825Sdfr    }
159178825Sdfr};
160178825Sdfr
161178825Sdfr
162178825Sdfrstatic int version_flag = 0;
163178825Sdfrstatic int help_flag	= 0;
164178825Sdfr
165178825Sdfrstatic struct getargs args[] = {
166178825Sdfr    {"version",	0,	arg_flag,	&version_flag,
167178825Sdfr     "print version", NULL },
168178825Sdfr    {"help",	0,	arg_flag,	&help_flag,
169178825Sdfr     NULL, NULL }
170178825Sdfr};
171178825Sdfr
172178825Sdfrstatic void
173178825Sdfrusage (int ret)
174178825Sdfr{
175178825Sdfr    arg_printusage (args,
176178825Sdfr		    sizeof(args)/sizeof(*args),
177178825Sdfr		    NULL,
178178825Sdfr		    "");
179178825Sdfr    exit (ret);
180178825Sdfr}
181178825Sdfr
182178825Sdfr
183178825Sdfrint
184178825Sdfrmain(int argc, char **argv)
185178825Sdfr{
186178825Sdfr    krb5_context context;
187178825Sdfr    krb5_error_code ret;
188178825Sdfr    int i, optidx = 0;
189178825Sdfr
190178825Sdfr    setprogname(argv[0]);
191178825Sdfr
192178825Sdfr    if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
193178825Sdfr	usage(1);
194178825Sdfr
195178825Sdfr    if (help_flag)
196178825Sdfr	usage (0);
197178825Sdfr
198178825Sdfr    if(version_flag){
199178825Sdfr	print_version(NULL);
200178825Sdfr	exit(0);
201178825Sdfr    }
202178825Sdfr
203178825Sdfr    argc -= optidx;
204178825Sdfr    argv += optidx;
205178825Sdfr
206178825Sdfr    ret = krb5_init_context(&context);
207178825Sdfr    if (ret)
208178825Sdfr	errx (1, "krb5_init_context failed: %d", ret);
209178825Sdfr
210178825Sdfr    for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
211178825Sdfr	test_dh2key(i, context, &tests[i].X, NULL, NULL,
212178825Sdfr		    tests[i].type, &tests[i].key);
213178825Sdfr    }
214178825Sdfr
215178825Sdfr    krb5_free_context(context);
216178825Sdfr
217178825Sdfr    return 0;
218178825Sdfr}
219