1178825Sdfr/* 2233294Sstas * Copyright (c) 2003-2005 Kungliga Tekniska H��gskolan 3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden). 4233294Sstas * All rights reserved. 5178825Sdfr * 6233294Sstas * Redistribution and use in source and binary forms, with or without 7233294Sstas * modification, are permitted provided that the following conditions 8233294Sstas * are met: 9178825Sdfr * 10233294Sstas * 1. Redistributions of source code must retain the above copyright 11233294Sstas * notice, this list of conditions and the following disclaimer. 12178825Sdfr * 13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright 14233294Sstas * notice, this list of conditions and the following disclaimer in the 15233294Sstas * 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 37178825Sdfrstatic void 38178825Sdfrtime_encryption(krb5_context context, size_t size, 39178825Sdfr krb5_enctype etype, int iterations) 40178825Sdfr{ 41178825Sdfr struct timeval tv1, tv2; 42178825Sdfr krb5_error_code ret; 43178825Sdfr krb5_keyblock key; 44178825Sdfr krb5_crypto crypto; 45178825Sdfr krb5_data data; 46178825Sdfr char *etype_name; 47178825Sdfr void *buf; 48178825Sdfr int i; 49178825Sdfr 50178825Sdfr ret = krb5_generate_random_keyblock(context, etype, &key); 51178825Sdfr if (ret) 52178825Sdfr krb5_err(context, 1, ret, "krb5_generate_random_keyblock"); 53178825Sdfr 54178825Sdfr ret = krb5_enctype_to_string(context, etype, &etype_name); 55178825Sdfr if (ret) 56178825Sdfr krb5_err(context, 1, ret, "krb5_enctype_to_string"); 57178825Sdfr 58178825Sdfr buf = malloc(size); 59178825Sdfr if (buf == NULL) 60178825Sdfr krb5_errx(context, 1, "out of memory"); 61178825Sdfr memset(buf, 0, size); 62178825Sdfr 63178825Sdfr ret = krb5_crypto_init(context, &key, 0, &crypto); 64178825Sdfr if (ret) 65178825Sdfr krb5_err(context, 1, ret, "krb5_crypto_init"); 66178825Sdfr 67178825Sdfr gettimeofday(&tv1, NULL); 68178825Sdfr 69178825Sdfr for (i = 0; i < iterations; i++) { 70178825Sdfr ret = krb5_encrypt(context, crypto, 0, buf, size, &data); 71178825Sdfr if (ret) 72178825Sdfr krb5_err(context, 1, ret, "encrypt: %d", i); 73178825Sdfr krb5_data_free(&data); 74178825Sdfr } 75178825Sdfr 76178825Sdfr gettimeofday(&tv2, NULL); 77178825Sdfr 78178825Sdfr timevalsub(&tv2, &tv1); 79178825Sdfr 80233294Sstas printf("%s size: %7lu iterations: %d time: %3ld.%06ld\n", 81178825Sdfr etype_name, (unsigned long)size, iterations, 82178825Sdfr (long)tv2.tv_sec, (long)tv2.tv_usec); 83178825Sdfr 84178825Sdfr free(buf); 85178825Sdfr free(etype_name); 86178825Sdfr krb5_crypto_destroy(context, crypto); 87178825Sdfr krb5_free_keyblock_contents(context, &key); 88178825Sdfr} 89178825Sdfr 90178825Sdfrstatic void 91178825Sdfrtime_s2k(krb5_context context, 92233294Sstas krb5_enctype etype, 93178825Sdfr const char *password, 94178825Sdfr krb5_salt salt, 95178825Sdfr int iterations) 96178825Sdfr{ 97178825Sdfr struct timeval tv1, tv2; 98178825Sdfr krb5_error_code ret; 99178825Sdfr krb5_keyblock key; 100178825Sdfr krb5_data opaque; 101178825Sdfr char *etype_name; 102178825Sdfr int i; 103178825Sdfr 104178825Sdfr ret = krb5_enctype_to_string(context, etype, &etype_name); 105178825Sdfr if (ret) 106178825Sdfr krb5_err(context, 1, ret, "krb5_enctype_to_string"); 107178825Sdfr 108178825Sdfr opaque.data = NULL; 109178825Sdfr opaque.length = 0; 110178825Sdfr 111178825Sdfr gettimeofday(&tv1, NULL); 112178825Sdfr 113178825Sdfr for (i = 0; i < iterations; i++) { 114178825Sdfr ret = krb5_string_to_key_salt_opaque(context, etype, password, salt, 115178825Sdfr opaque, &key); 116178825Sdfr if (ret) 117178825Sdfr krb5_err(context, 1, ret, "krb5_string_to_key_data_salt_opaque"); 118178825Sdfr krb5_free_keyblock_contents(context, &key); 119178825Sdfr } 120178825Sdfr 121178825Sdfr gettimeofday(&tv2, NULL); 122178825Sdfr 123178825Sdfr timevalsub(&tv2, &tv1); 124178825Sdfr 125233294Sstas printf("%s string2key %d iterations time: %3ld.%06ld\n", 126178825Sdfr etype_name, iterations, (long)tv2.tv_sec, (long)tv2.tv_usec); 127178825Sdfr free(etype_name); 128178825Sdfr 129178825Sdfr} 130178825Sdfr 131178825Sdfrstatic int version_flag = 0; 132178825Sdfrstatic int help_flag = 0; 133178825Sdfr 134178825Sdfrstatic struct getargs args[] = { 135178825Sdfr {"version", 0, arg_flag, &version_flag, 136178825Sdfr "print version", NULL }, 137178825Sdfr {"help", 0, arg_flag, &help_flag, 138178825Sdfr NULL, NULL } 139178825Sdfr}; 140178825Sdfr 141178825Sdfrstatic void 142178825Sdfrusage (int ret) 143178825Sdfr{ 144178825Sdfr arg_printusage (args, 145178825Sdfr sizeof(args)/sizeof(*args), 146178825Sdfr NULL, 147178825Sdfr ""); 148178825Sdfr exit (ret); 149178825Sdfr} 150178825Sdfr 151178825Sdfrint 152178825Sdfrmain(int argc, char **argv) 153178825Sdfr{ 154178825Sdfr krb5_context context; 155178825Sdfr krb5_error_code ret; 156178825Sdfr int i, enciter, s2kiter; 157178825Sdfr int optidx = 0; 158178825Sdfr krb5_salt salt; 159178825Sdfr 160233294Sstas krb5_enctype enctypes[] = { 161178825Sdfr ETYPE_DES_CBC_CRC, 162178825Sdfr ETYPE_DES3_CBC_SHA1, 163178825Sdfr ETYPE_ARCFOUR_HMAC_MD5, 164178825Sdfr ETYPE_AES128_CTS_HMAC_SHA1_96, 165178825Sdfr ETYPE_AES256_CTS_HMAC_SHA1_96 166178825Sdfr }; 167178825Sdfr 168178825Sdfr setprogname(argv[0]); 169178825Sdfr 170178825Sdfr if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) 171178825Sdfr usage(1); 172233294Sstas 173178825Sdfr if (help_flag) 174178825Sdfr usage (0); 175178825Sdfr 176178825Sdfr if(version_flag){ 177178825Sdfr print_version(NULL); 178178825Sdfr exit(0); 179178825Sdfr } 180178825Sdfr 181178825Sdfr salt.salttype = KRB5_PW_SALT; 182178825Sdfr salt.saltvalue.data = NULL; 183178825Sdfr salt.saltvalue.length = 0; 184178825Sdfr 185178825Sdfr ret = krb5_init_context(&context); 186178825Sdfr if (ret) 187178825Sdfr errx (1, "krb5_init_context failed: %d", ret); 188178825Sdfr 189178825Sdfr enciter = 1000; 190178825Sdfr s2kiter = 100; 191178825Sdfr 192178825Sdfr for (i = 0; i < sizeof(enctypes)/sizeof(enctypes[0]); i++) { 193178825Sdfr 194233294Sstas krb5_enctype_enable(context, enctypes[i]); 195233294Sstas 196178825Sdfr time_encryption(context, 16, enctypes[i], enciter); 197178825Sdfr time_encryption(context, 32, enctypes[i], enciter); 198178825Sdfr time_encryption(context, 512, enctypes[i], enciter); 199178825Sdfr time_encryption(context, 1024, enctypes[i], enciter); 200178825Sdfr time_encryption(context, 2048, enctypes[i], enciter); 201178825Sdfr time_encryption(context, 4096, enctypes[i], enciter); 202178825Sdfr time_encryption(context, 8192, enctypes[i], enciter); 203178825Sdfr time_encryption(context, 16384, enctypes[i], enciter); 204178825Sdfr time_encryption(context, 32768, enctypes[i], enciter); 205178825Sdfr 206178825Sdfr time_s2k(context, enctypes[i], "mYsecreitPassword", salt, s2kiter); 207178825Sdfr } 208178825Sdfr 209178825Sdfr krb5_free_context(context); 210178825Sdfr 211178825Sdfr return 0; 212178825Sdfr} 213