test_crypto_wrapping.c revision 233294
1116744Ssam/*
2185522Ssam * Copyright (c) 2005 Kungliga Tekniska H��gskolan
3116744Ssam * (Royal Institute of Technology, Stockholm, Sweden).
4116744Ssam * All rights reserved.
5116744Ssam *
6116744Ssam * Redistribution and use in source and binary forms, with or without
7116744Ssam * modification, are permitted provided that the following conditions
8116744Ssam * are met:
9116744Ssam *
10116744Ssam * 1. Redistributions of source code must retain the above copyright
11116744Ssam *    notice, this list of conditions and the following disclaimer.
12116744Ssam *
13116744Ssam * 2. Redistributions in binary form must reproduce the above copyright
14116744Ssam *    notice, this list of conditions and the following disclaimer in the
15116744Ssam *    documentation and/or other materials provided with the distribution.
16116744Ssam *
17116744Ssam * 3. Neither the name of KTH nor the names of its contributors may be
18116744Ssam *    used to endorse or promote products derived from this software without
19116744Ssam *    specific prior written permission.
20116744Ssam *
21116744Ssam * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
22116744Ssam * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23116744Ssam * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24116744Ssam * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
25116744Ssam * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26116744Ssam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27116744Ssam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28116744Ssam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29116744Ssam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30116744Ssam * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31116744Ssam * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32186094Ssam
33116744Ssam#include "krb5_locl.h"
34186094Ssam#include <err.h>
35186094Ssam#include <getarg.h>
36186094Ssam
37186094Ssamstatic void
38243837Sadriantest_wrapping(krb5_context context,
39235679Sadrian	      size_t min_size,
40244952Sadrian	      size_t max_size,
41186094Ssam	      size_t step,
42203286Srpaulo	      krb5_enctype etype)
43190571Ssam{
44186094Ssam    krb5_error_code ret;
45186094Ssam    krb5_keyblock key;
46186094Ssam    krb5_crypto crypto;
47186094Ssam    krb5_data data;
48186094Ssam    char *etype_name;
49186094Ssam    void *buf;
50185522Ssam    size_t size;
51185522Ssam
52185522Ssam    ret = krb5_generate_random_keyblock(context, etype, &key);
53186094Ssam    if (ret)
54186094Ssam	krb5_err(context, 1, ret, "krb5_generate_random_keyblock");
55186094Ssam
56186094Ssam    ret = krb5_enctype_to_string(context, etype, &etype_name);
57186094Ssam    if (ret)
58186094Ssam	krb5_err(context, 1, ret, "krb5_enctype_to_string");
59186094Ssam
60185522Ssam    buf = malloc(max_size);
61185522Ssam    if (buf == NULL)
62186094Ssam	krb5_errx(context, 1, "out of memory");
63186094Ssam    memset(buf, 0, max_size);
64186094Ssam
65186094Ssam    ret = krb5_crypto_init(context, &key, 0, &crypto);
66186094Ssam    if (ret)
67186094Ssam	krb5_err(context, 1, ret, "krb5_crypto_init");
68185522Ssam
69185522Ssam    for (size = min_size; size < max_size; size += step) {
70186094Ssam	size_t wrapped_size;
71186094Ssam
72186094Ssam	ret = krb5_encrypt(context, crypto, 0, buf, size, &data);
73186094Ssam	if (ret)
74186094Ssam	    krb5_err(context, 1, ret, "encrypt size %lu using %s",
75186094Ssam		     (unsigned long)size, etype_name);
76186094Ssam
77186094Ssam	wrapped_size = krb5_get_wrapped_length(context, crypto, size);
78186094Ssam
79227421Sadrian	if (wrapped_size != data.length)
80221163Sadrian	    krb5_errx(context, 1, "calculated wrapped length %lu != "
81221163Sadrian		      "real wrapped length %lu for data length %lu using "
82221163Sadrian		      "enctype %s",
83186094Ssam		      (unsigned long)wrapped_size,
84186094Ssam		      (unsigned long)data.length,
85186094Ssam		      (unsigned long)size,
86221163Sadrian		      etype_name);
87186094Ssam	krb5_data_free(&data);
88203286Srpaulo    }
89243838Sadrian
90243838Sadrian    free(etype_name);
91185522Ssam    free(buf);
92244945Sadrian    krb5_crypto_destroy(context, crypto);
93231927Sadrian    krb5_free_keyblock_contents(context, &key);
94217631Sadrian}
95221163Sadrian
96217631Sadrian
97217631Sadrian
98221163Sadrianstatic int version_flag = 0;
99217631Sadrianstatic int help_flag	= 0;
100186094Ssam
101217631Sadrianstatic struct getargs args[] = {
102221163Sadrian    {"version",	0,	arg_flag,	&version_flag,
103221163Sadrian     "print version", NULL },
104221163Sadrian    {"help",	0,	arg_flag,	&help_flag,
105221163Sadrian     NULL, NULL }
106221163Sadrian};
107221163Sadrian
108221163Sadrianstatic void
109221163Sadrianusage (int ret)
110221163Sadrian{
111221163Sadrian    arg_printusage (args,
112221163Sadrian		    sizeof(args)/sizeof(*args),
113217631Sadrian		    NULL,
114219393Sadrian		    "");
115221163Sadrian    exit (ret);
116221163Sadrian}
117220587Sadrian
118243838Sadrianint
119185522Ssammain(int argc, char **argv)
120222325Sadrian{
121222325Sadrian    krb5_context context;
122222325Sadrian    krb5_error_code ret;
123222325Sadrian    int i, optidx = 0;
124222325Sadrian
125222325Sadrian    krb5_enctype enctypes[] = {
126248079Sadrian#ifdef HEIM_WEAK_CRYPTO
127248181Sadrian	ETYPE_DES_CBC_CRC,
128248079Sadrian	ETYPE_DES_CBC_MD4,
129248079Sadrian	ETYPE_DES_CBC_MD5,
130248079Sadrian#endif
131248079Sadrian	ETYPE_DES3_CBC_SHA1,
132248079Sadrian	ETYPE_ARCFOUR_HMAC_MD5,
133248079Sadrian	ETYPE_AES128_CTS_HMAC_SHA1_96,
134248079Sadrian	ETYPE_AES256_CTS_HMAC_SHA1_96
135186094Ssam    };
136186094Ssam
137186094Ssam    setprogname(argv[0]);
138190571Ssam
139186094Ssam    if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
140186094Ssam	usage(1);
141186094Ssam
142186094Ssam    if (help_flag)
143186094Ssam	usage (0);
144186094Ssam
145186094Ssam    if(version_flag){
146116744Ssam	print_version(NULL);
147222585Sadrian	exit(0);
148222585Sadrian    }
149222585Sadrian
150222585Sadrian    argc -= optidx;
151185522Ssam    argv += optidx;
152248181Sadrian
153116744Ssam    ret = krb5_init_context(&context);
154229560Sadrian    if (ret)
155185522Ssam	errx (1, "krb5_init_context failed: %d", ret);
156185522Ssam
157229560Sadrian    for (i = 0; i < sizeof(enctypes)/sizeof(enctypes[0]); i++) {
158157438Ssam	krb5_enctype_enable(context, enctypes[i]);
159116744Ssam
160228818Sdim	test_wrapping(context, 0, 1024, 1, enctypes[i]);
161228818Sdim	test_wrapping(context, 1024, 1024 * 100, 1024, enctypes[i]);
162239462Sdim    }
163239462Sdim    krb5_free_context(context);
164228818Sdim
165248259Sadrian    return 0;
166248259Sadrian}
167248259Sadrian