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