1 /* 2 * Copyright (c) 2005 Kungliga Tekniska Högskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of KTH nor the names of its contributors may be 18 * used to endorse or promote products derived from this software without 19 * specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 22 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 28 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 32 33 #include "krb5_locl.h" 34 #include <err.h> 35 #include <getarg.h> 36 37 static void 38 test_wrapping(krb5_context context, 39 size_t min_size, 40 size_t max_size, 41 size_t step, 42 krb5_enctype etype) 43 { 44 krb5_error_code ret; 45 krb5_keyblock key; 46 krb5_crypto crypto; 47 krb5_data data; 48 char *etype_name; 49 void *buf; 50 size_t size; 51 52 ret = krb5_generate_random_keyblock(context, etype, &key); 53 if (ret) 54 krb5_err(context, 1, ret, "krb5_generate_random_keyblock"); 55 56 ret = krb5_enctype_to_string(context, etype, &etype_name); 57 if (ret) 58 krb5_err(context, 1, ret, "krb5_enctype_to_string"); 59 60 buf = malloc(max_size); 61 if (buf == NULL) 62 krb5_errx(context, 1, "out of memory"); 63 memset(buf, 0, max_size); 64 65 ret = krb5_crypto_init(context, &key, 0, &crypto); 66 if (ret) 67 krb5_err(context, 1, ret, "krb5_crypto_init"); 68 69 for (size = min_size; size < max_size; size += step) { 70 size_t wrapped_size; 71 72 ret = krb5_encrypt(context, crypto, 0, buf, size, &data); 73 if (ret) 74 krb5_err(context, 1, ret, "encrypt size %lu using %s", 75 (unsigned long)size, etype_name); 76 77 wrapped_size = krb5_get_wrapped_length(context, crypto, size); 78 79 if (wrapped_size != data.length) 80 krb5_errx(context, 1, "calculated wrapped length %lu != " 81 "real wrapped length %lu for data length %lu using " 82 "enctype %s", 83 (unsigned long)wrapped_size, 84 (unsigned long)data.length, 85 (unsigned long)size, 86 etype_name); 87 krb5_data_free(&data); 88 } 89 90 free(etype_name); 91 free(buf); 92 krb5_crypto_destroy(context, crypto); 93 krb5_free_keyblock_contents(context, &key); 94 } 95 96 97 98 static int version_flag = 0; 99 static int help_flag = 0; 100 101 static struct getargs args[] = { 102 {"version", 0, arg_flag, &version_flag, 103 "print version", NULL }, 104 {"help", 0, arg_flag, &help_flag, 105 NULL, NULL } 106 }; 107 108 static void 109 usage (int ret) 110 { 111 arg_printusage (args, 112 sizeof(args)/sizeof(*args), 113 NULL, 114 ""); 115 exit (ret); 116 } 117 118 int 119 main(int argc, char **argv) 120 { 121 krb5_context context; 122 krb5_error_code ret; 123 int i, optidx = 0; 124 125 krb5_enctype enctypes[] = { 126 #ifdef HEIM_WEAK_CRYPTO 127 ETYPE_DES_CBC_CRC, 128 ETYPE_DES_CBC_MD4, 129 ETYPE_DES_CBC_MD5, 130 #endif 131 ETYPE_DES3_CBC_SHA1, 132 ETYPE_ARCFOUR_HMAC_MD5, 133 ETYPE_AES128_CTS_HMAC_SHA1_96, 134 ETYPE_AES256_CTS_HMAC_SHA1_96 135 }; 136 137 setprogname(argv[0]); 138 139 if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) 140 usage(1); 141 142 if (help_flag) 143 usage (0); 144 145 if(version_flag){ 146 print_version(NULL); 147 exit(0); 148 } 149 150 argc -= optidx; 151 argv += optidx; 152 153 ret = krb5_init_context(&context); 154 if (ret) 155 errx (1, "krb5_init_context failed: %d", ret); 156 157 for (i = 0; i < sizeof(enctypes)/sizeof(enctypes[0]); i++) { 158 krb5_enctype_enable(context, enctypes[i]); 159 160 test_wrapping(context, 0, 1024, 1, enctypes[i]); 161 test_wrapping(context, 1024, 1024 * 100, 1024, enctypes[i]); 162 } 163 krb5_free_context(context); 164 165 return 0; 166 } 167