Path: blob/main/crypto/heimdal/lib/krb5/aes-test.c
34878 views
/*1* Copyright (c) 2003 Kungliga Tekniska Högskolan2* (Royal Institute of Technology, Stockholm, Sweden).3* All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8*9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11*12* 2. Redistributions in binary form must reproduce the above copyright13* notice, this list of conditions and the following disclaimer in the14* documentation and/or other materials provided with the distribution.15*16* 3. Neither the name of KTH nor the names of its contributors may be17* used to endorse or promote products derived from this software without18* specific prior written permission.19*20* THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY21* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE22* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR23* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE24* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR25* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF26* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR27* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,28* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR29* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF30* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */3132#include "krb5_locl.h"33#include <hex.h>34#include <err.h>35#include <assert.h>3637#ifdef HAVE_OPENSSL38#include <openssl/evp.h>39#endif4041static int verbose = 0;4243static void44hex_dump_data(const void *data, size_t length)45{46char *p;4748hex_encode(data, length, &p);49printf("%s\n", p);50free(p);51}5253struct {54char *password;55char *salt;56int saltlen;57int iterations;58krb5_enctype enctype;59size_t keylen;60char *pbkdf2;61char *key;62} keys[] = {63{64"password", "ATHENA.MIT.EDUraeburn", -1,651,66ETYPE_AES128_CTS_HMAC_SHA1_96, 16,67"\xcd\xed\xb5\x28\x1b\xb2\xf8\x01\x56\x5a\x11\x22\xb2\x56\x35\x15",68"\x42\x26\x3c\x6e\x89\xf4\xfc\x28\xb8\xdf\x68\xee\x09\x79\x9f\x15"69},70{71"password", "ATHENA.MIT.EDUraeburn", -1,721,73ETYPE_AES256_CTS_HMAC_SHA1_96, 32,74"\xcd\xed\xb5\x28\x1b\xb2\xf8\x01\x56\x5a\x11\x22\xb2\x56\x35\x15"75"\x0a\xd1\xf7\xa0\x4b\xb9\xf3\xa3\x33\xec\xc0\xe2\xe1\xf7\x08\x37",76"\xfe\x69\x7b\x52\xbc\x0d\x3c\xe1\x44\x32\xba\x03\x6a\x92\xe6\x5b"77"\xbb\x52\x28\x09\x90\xa2\xfa\x27\x88\x39\x98\xd7\x2a\xf3\x01\x61"78},79{80"password", "ATHENA.MIT.EDUraeburn", -1,812,82ETYPE_AES128_CTS_HMAC_SHA1_96, 16,83"\x01\xdb\xee\x7f\x4a\x9e\x24\x3e\x98\x8b\x62\xc7\x3c\xda\x93\x5d",84"\xc6\x51\xbf\x29\xe2\x30\x0a\xc2\x7f\xa4\x69\xd6\x93\xbd\xda\x13"85},86{87"password", "ATHENA.MIT.EDUraeburn", -1,882,89ETYPE_AES256_CTS_HMAC_SHA1_96, 32,90"\x01\xdb\xee\x7f\x4a\x9e\x24\x3e\x98\x8b\x62\xc7\x3c\xda\x93\x5d"91"\xa0\x53\x78\xb9\x32\x44\xec\x8f\x48\xa9\x9e\x61\xad\x79\x9d\x86",92"\xa2\xe1\x6d\x16\xb3\x60\x69\xc1\x35\xd5\xe9\xd2\xe2\x5f\x89\x61"93"\x02\x68\x56\x18\xb9\x59\x14\xb4\x67\xc6\x76\x22\x22\x58\x24\xff"94},95{96"password", "ATHENA.MIT.EDUraeburn", -1,971200,98ETYPE_AES128_CTS_HMAC_SHA1_96, 16,99"\x5c\x08\xeb\x61\xfd\xf7\x1e\x4e\x4e\xc3\xcf\x6b\xa1\xf5\x51\x2b",100"\x4c\x01\xcd\x46\xd6\x32\xd0\x1e\x6d\xbe\x23\x0a\x01\xed\x64\x2a"101},102{103"password", "ATHENA.MIT.EDUraeburn", -1,1041200,105ETYPE_AES256_CTS_HMAC_SHA1_96, 32,106"\x5c\x08\xeb\x61\xfd\xf7\x1e\x4e\x4e\xc3\xcf\x6b\xa1\xf5\x51\x2b"107"\xa7\xe5\x2d\xdb\xc5\xe5\x14\x2f\x70\x8a\x31\xe2\xe6\x2b\x1e\x13",108"\x55\xa6\xac\x74\x0a\xd1\x7b\x48\x46\x94\x10\x51\xe1\xe8\xb0\xa7"109"\x54\x8d\x93\xb0\xab\x30\xa8\xbc\x3f\xf1\x62\x80\x38\x2b\x8c\x2a"110},111{112"password", "\x12\x34\x56\x78\x78\x56\x34\x12", 8,1135,114ETYPE_AES128_CTS_HMAC_SHA1_96, 16,115"\xd1\xda\xa7\x86\x15\xf2\x87\xe6\xa1\xc8\xb1\x20\xd7\x06\x2a\x49",116"\xe9\xb2\x3d\x52\x27\x37\x47\xdd\x5c\x35\xcb\x55\xbe\x61\x9d\x8e"117},118{119"password", "\x12\x34\x56\x78\x78\x56\x34\x12", 8,1205,121ETYPE_AES256_CTS_HMAC_SHA1_96, 32,122"\xd1\xda\xa7\x86\x15\xf2\x87\xe6\xa1\xc8\xb1\x20\xd7\x06\x2a\x49"123"\x3f\x98\xd2\x03\xe6\xbe\x49\xa6\xad\xf4\xfa\x57\x4b\x6e\x64\xee",124"\x97\xa4\xe7\x86\xbe\x20\xd8\x1a\x38\x2d\x5e\xbc\x96\xd5\x90\x9c"125"\xab\xcd\xad\xc8\x7c\xa4\x8f\x57\x45\x04\x15\x9f\x16\xc3\x6e\x31"126},127{128"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",129"pass phrase equals block size", -1,1301200,131ETYPE_AES128_CTS_HMAC_SHA1_96, 16,132"\x13\x9c\x30\xc0\x96\x6b\xc3\x2b\xa5\x5f\xdb\xf2\x12\x53\x0a\xc9",133"\x59\xd1\xbb\x78\x9a\x82\x8b\x1a\xa5\x4e\xf9\xc2\x88\x3f\x69\xed"134},135{136"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",137"pass phrase equals block size", -1,1381200,139ETYPE_AES256_CTS_HMAC_SHA1_96, 32,140"\x13\x9c\x30\xc0\x96\x6b\xc3\x2b\xa5\x5f\xdb\xf2\x12\x53\x0a\xc9"141"\xc5\xec\x59\xf1\xa4\x52\xf5\xcc\x9a\xd9\x40\xfe\xa0\x59\x8e\xd1",142"\x89\xad\xee\x36\x08\xdb\x8b\xc7\x1f\x1b\xfb\xfe\x45\x94\x86\xb0"143"\x56\x18\xb7\x0c\xba\xe2\x20\x92\x53\x4e\x56\xc5\x53\xba\x4b\x34"144},145{146"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",147"pass phrase exceeds block size", -1,1481200,149ETYPE_AES128_CTS_HMAC_SHA1_96, 16,150"\x9c\xca\xd6\xd4\x68\x77\x0c\xd5\x1b\x10\xe6\xa6\x87\x21\xbe\x61",151"\xcb\x80\x05\xdc\x5f\x90\x17\x9a\x7f\x02\x10\x4c\x00\x18\x75\x1d"152},153{154"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",155"pass phrase exceeds block size", -1,1561200,157ETYPE_AES256_CTS_HMAC_SHA1_96, 32,158"\x9c\xca\xd6\xd4\x68\x77\x0c\xd5\x1b\x10\xe6\xa6\x87\x21\xbe\x61"159"\x1a\x8b\x4d\x28\x26\x01\xdb\x3b\x36\xbe\x92\x46\x91\x5e\xc8\x2a",160"\xd7\x8c\x5c\x9c\xb8\x72\xa8\xc9\xda\xd4\x69\x7f\x0b\xb5\xb2\xd2"161"\x14\x96\xc8\x2b\xeb\x2c\xae\xda\x21\x12\xfc\xee\xa0\x57\x40\x1b"162163},164{165"\xf0\x9d\x84\x9e" /* g-clef */, "EXAMPLE.COMpianist", -1,16650,167ETYPE_AES128_CTS_HMAC_SHA1_96, 16,168"\x6b\x9c\xf2\x6d\x45\x45\x5a\x43\xa5\xb8\xbb\x27\x6a\x40\x3b\x39",169"\xf1\x49\xc1\xf2\xe1\x54\xa7\x34\x52\xd4\x3e\x7f\xe6\x2a\x56\xe5"170},171{172"\xf0\x9d\x84\x9e" /* g-clef */, "EXAMPLE.COMpianist", -1,17350,174ETYPE_AES256_CTS_HMAC_SHA1_96, 32,175"\x6b\x9c\xf2\x6d\x45\x45\x5a\x43\xa5\xb8\xbb\x27\x6a\x40\x3b\x39"176"\xe7\xfe\x37\xa0\xc4\x1e\x02\xc2\x81\xff\x30\x69\xe1\xe9\x4f\x52",177"\x4b\x6d\x98\x39\xf8\x44\x06\xdf\x1f\x09\xcc\x16\x6d\xb4\xb8\x3c"178"\x57\x18\x48\xb7\x84\xa3\xd6\xbd\xc3\x46\x58\x9a\x3e\x39\x3f\x9e"179},180{181"foo", "", -1,1820,183ETYPE_ARCFOUR_HMAC_MD5, 16,184NULL,185"\xac\x8e\x65\x7f\x83\xdf\x82\xbe\xea\x5d\x43\xbd\xaf\x78\x00\xcc"186},187{188"test", "", -1,1890,190ETYPE_ARCFOUR_HMAC_MD5, 16,191NULL,192"\x0c\xb6\x94\x88\x05\xf7\x97\xbf\x2a\x82\x80\x79\x73\xb8\x95\x37"193}194};195196static int197string_to_key_test(krb5_context context)198{199krb5_data password, opaque;200krb5_error_code ret;201krb5_salt salt;202int i, val = 0;203char iter[4];204205for (i = 0; i < sizeof(keys)/sizeof(keys[0]); i++) {206207password.data = keys[i].password;208password.length = strlen(password.data);209210salt.salttype = KRB5_PW_SALT;211salt.saltvalue.data = keys[i].salt;212if (keys[i].saltlen == -1)213salt.saltvalue.length = strlen(salt.saltvalue.data);214else215salt.saltvalue.length = keys[i].saltlen;216217opaque.data = iter;218opaque.length = sizeof(iter);219_krb5_put_int(iter, keys[i].iterations, 4);220221if (keys[i].pbkdf2) {222unsigned char keyout[32];223224if (keys[i].keylen > sizeof(keyout))225abort();226227PKCS5_PBKDF2_HMAC_SHA1(password.data, password.length,228salt.saltvalue.data, salt.saltvalue.length,229keys[i].iterations,230keys[i].keylen, keyout);231232if (memcmp(keyout, keys[i].pbkdf2, keys[i].keylen) != 0) {233krb5_warnx(context, "%d: pbkdf2", i);234val = 1;235continue;236}237238if (verbose) {239printf("PBKDF2:\n");240hex_dump_data(keyout, keys[i].keylen);241}242}243244{245krb5_keyblock key;246247ret = krb5_string_to_key_data_salt_opaque (context,248keys[i].enctype,249password,250salt,251opaque,252&key);253if (ret) {254krb5_warn(context, ret, "%d: string_to_key_data_salt_opaque",255i);256val = 1;257continue;258}259260if (key.keyvalue.length != keys[i].keylen) {261krb5_warnx(context, "%d: key wrong length (%lu/%lu)",262i, (unsigned long)key.keyvalue.length,263(unsigned long)keys[i].keylen);264val = 1;265continue;266}267268if (memcmp(key.keyvalue.data, keys[i].key, keys[i].keylen) != 0) {269krb5_warnx(context, "%d: key wrong", i);270val = 1;271continue;272}273274if (verbose) {275printf("key:\n");276hex_dump_data(key.keyvalue.data, key.keyvalue.length);277}278krb5_free_keyblock_contents(context, &key);279}280}281return val;282}283284static int285krb_enc(krb5_context context,286krb5_crypto crypto,287unsigned usage,288krb5_data *cipher,289krb5_data *clear)290{291krb5_data decrypt;292krb5_error_code ret;293294krb5_data_zero(&decrypt);295296ret = krb5_decrypt(context,297crypto,298usage,299cipher->data,300cipher->length,301&decrypt);302303if (ret) {304krb5_warn(context, ret, "krb5_decrypt");305return ret;306}307308if (decrypt.length != clear->length ||309memcmp(decrypt.data, clear->data, decrypt.length) != 0) {310krb5_warnx(context, "clear text not same");311return EINVAL;312}313314krb5_data_free(&decrypt);315316return 0;317}318319static int320krb_enc_iov2(krb5_context context,321krb5_crypto crypto,322unsigned usage,323size_t cipher_len,324krb5_data *clear)325{326krb5_crypto_iov iov[4];327krb5_data decrypt;328int ret;329char *p, *q;330size_t len, i;331332p = clear->data;333len = clear->length;334335iov[0].flags = KRB5_CRYPTO_TYPE_HEADER;336krb5_crypto_length(context, crypto, iov[0].flags, &iov[0].data.length);337iov[0].data.data = emalloc(iov[0].data.length);338339iov[1].flags = KRB5_CRYPTO_TYPE_DATA;340iov[1].data.length = len;341iov[1].data.data = emalloc(iov[1].data.length);342memcpy(iov[1].data.data, p, iov[1].data.length);343344/* padding buffer */345iov[2].flags = KRB5_CRYPTO_TYPE_PADDING;346krb5_crypto_length(context, crypto, KRB5_CRYPTO_TYPE_PADDING, &iov[2].data.length);347iov[2].data.data = emalloc(iov[2].data.length);348349iov[3].flags = KRB5_CRYPTO_TYPE_TRAILER;350krb5_crypto_length(context, crypto, iov[3].flags, &iov[3].data.length);351iov[3].data.data = emalloc(iov[3].data.length);352353ret = krb5_encrypt_iov_ivec(context, crypto, usage,354iov, sizeof(iov)/sizeof(iov[0]), NULL);355if (ret)356errx(1, "encrypt iov failed: %d", ret);357358/* check len */359for (i = 0, len = 0; i < sizeof(iov)/sizeof(iov[0]); i++)360len += iov[i].data.length;361if (len != cipher_len)362errx(1, "cipher len wrong");363364/*365* Plain decrypt366*/367368p = q = emalloc(len);369for (i = 0; i < sizeof(iov)/sizeof(iov[0]); i++) {370memcpy(q, iov[i].data.data, iov[i].data.length);371q += iov[i].data.length;372}373374ret = krb5_decrypt(context, crypto, usage, p, len, &decrypt);375if (ret)376krb5_err(context, 1, ret, "krb5_decrypt");377else378krb5_data_free(&decrypt);379380free(p);381382/*383* Now decrypt use iov384*/385386/* padding turn into data */387p = q = emalloc(iov[1].data.length + iov[2].data.length);388389memcpy(q, iov[1].data.data, iov[1].data.length);390q += iov[1].data.length;391memcpy(q, iov[2].data.data, iov[2].data.length);392393free(iov[1].data.data);394free(iov[2].data.data);395396iov[1].data.data = p;397iov[1].data.length += iov[2].data.length;398399iov[2].flags = KRB5_CRYPTO_TYPE_EMPTY;400iov[2].data.length = 0;401402ret = krb5_decrypt_iov_ivec(context, crypto, usage,403iov, sizeof(iov)/sizeof(iov[0]), NULL);404free(iov[0].data.data);405free(iov[3].data.data);406407if (ret)408krb5_err(context, 1, ret, "decrypt iov failed: %d", ret);409410if (clear->length != iov[1].data.length)411errx(1, "length incorrect");412413p = clear->data;414if (memcmp(iov[1].data.data, p, iov[1].data.length) != 0)415errx(1, "iov[1] incorrect");416417free(iov[1].data.data);418419return 0;420}421422423static int424krb_enc_iov(krb5_context context,425krb5_crypto crypto,426unsigned usage,427krb5_data *cipher,428krb5_data *clear)429{430krb5_crypto_iov iov[3];431int ret;432char *p;433size_t len;434435p = cipher->data;436len = cipher->length;437438iov[0].flags = KRB5_CRYPTO_TYPE_HEADER;439krb5_crypto_length(context, crypto, iov[0].flags, &iov[0].data.length);440iov[0].data.data = emalloc(iov[0].data.length);441memcpy(iov[0].data.data, p, iov[0].data.length);442p += iov[0].data.length;443len -= iov[0].data.length;444445iov[1].flags = KRB5_CRYPTO_TYPE_TRAILER;446krb5_crypto_length(context, crypto, iov[1].flags, &iov[1].data.length);447iov[1].data.data = emalloc(iov[1].data.length);448memcpy(iov[1].data.data, p + len - iov[1].data.length, iov[1].data.length);449len -= iov[1].data.length;450451iov[2].flags = KRB5_CRYPTO_TYPE_DATA;452iov[2].data.length = len;453iov[2].data.data = emalloc(len);454memcpy(iov[2].data.data, p, len);455456ret = krb5_decrypt_iov_ivec(context, crypto, usage,457iov, sizeof(iov)/sizeof(iov[0]), NULL);458if (ret)459krb5_err(context, 1, ret, "krb_enc_iov decrypt iov failed: %d", ret);460461if (clear->length != iov[2].data.length)462errx(1, "length incorrect");463464p = clear->data;465if (memcmp(iov[2].data.data, p, iov[2].data.length) != 0)466errx(1, "iov[2] incorrect");467468free(iov[0].data.data);469free(iov[1].data.data);470free(iov[2].data.data);471472473return 0;474}475476static int477krb_checksum_iov(krb5_context context,478krb5_crypto crypto,479unsigned usage,480krb5_data *plain)481{482krb5_crypto_iov iov[4];483int ret;484char *p;485size_t len;486487p = plain->data;488len = plain->length;489490iov[0].flags = KRB5_CRYPTO_TYPE_CHECKSUM;491krb5_crypto_length(context, crypto, iov[0].flags, &iov[0].data.length);492iov[0].data.data = emalloc(iov[0].data.length);493494iov[1].flags = KRB5_CRYPTO_TYPE_DATA;495iov[1].data.length = len;496iov[1].data.data = p;497498iov[2].flags = KRB5_CRYPTO_TYPE_TRAILER;499krb5_crypto_length(context, crypto, iov[0].flags, &iov[2].data.length);500iov[2].data.data = malloc(iov[2].data.length);501502ret = krb5_create_checksum_iov(context, crypto, usage,503iov, sizeof(iov)/sizeof(iov[0]), NULL);504if (ret)505krb5_err(context, 1, ret, "krb5_create_checksum_iov failed");506507ret = krb5_verify_checksum_iov(context, crypto, usage, iov, sizeof(iov)/sizeof(iov[0]), NULL);508if (ret)509krb5_err(context, 1, ret, "krb5_verify_checksum_iov");510511free(iov[0].data.data);512free(iov[2].data.data);513514return 0;515}516517518static int519krb_enc_mit(krb5_context context,520krb5_enctype enctype,521krb5_keyblock *key,522unsigned usage,523krb5_data *cipher,524krb5_data *clear)525{526#ifndef HEIMDAL_SMALLER527krb5_error_code ret;528krb5_enc_data e;529krb5_data decrypt;530size_t len;531532e.kvno = 0;533e.enctype = enctype;534e.ciphertext = *cipher;535536ret = krb5_c_decrypt(context, *key, usage, NULL, &e, &decrypt);537if (ret)538return ret;539540if (decrypt.length != clear->length ||541memcmp(decrypt.data, clear->data, decrypt.length) != 0) {542krb5_warnx(context, "clear text not same");543return EINVAL;544}545546krb5_data_free(&decrypt);547548ret = krb5_c_encrypt_length(context, enctype, clear->length, &len);549if (ret)550return ret;551552if (len != cipher->length) {553krb5_warnx(context, "c_encrypt_length wrong %lu != %lu",554(unsigned long)len, (unsigned long)cipher->length);555return EINVAL;556}557#endif /* HEIMDAL_SMALLER */558return 0;559}560561562struct {563krb5_enctype enctype;564unsigned usage;565size_t keylen;566void *key;567size_t elen;568void* edata;569size_t plen;570void *pdata;571} krbencs[] = {572{573ETYPE_AES256_CTS_HMAC_SHA1_96,5747,57532,576"\x47\x75\x69\x64\x65\x6c\x69\x6e\x65\x73\x20\x74\x6f\x20\x41\x75"577"\x74\x68\x6f\x72\x73\x20\x6f\x66\x20\x49\x6e\x74\x65\x72\x6e\x65",57844,579"\xcf\x79\x8f\x0d\x76\xf3\xe0\xbe\x8e\x66\x94\x70\xfa\xcc\x9e\x91"580"\xa9\xec\x1c\x5c\x21\xfb\x6e\xef\x1a\x7a\xc8\xc1\xcc\x5a\x95\x24"581"\x6f\x9f\xf4\xd5\xbe\x5d\x59\x97\x44\xd8\x47\xcd",58216,583"\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x2e\x0a"584}585};586587588static int589krb_enc_test(krb5_context context)590{591krb5_error_code ret;592krb5_crypto crypto;593krb5_keyblock kb;594krb5_data cipher, plain;595int i;596597for (i = 0; i < sizeof(krbencs)/sizeof(krbencs[0]); i++) {598599kb.keytype = krbencs[i].enctype;600kb.keyvalue.length = krbencs[i].keylen;601kb.keyvalue.data = krbencs[i].key;602603ret = krb5_crypto_init(context, &kb, krbencs[i].enctype, &crypto);604605cipher.length = krbencs[i].elen;606cipher.data = krbencs[i].edata;607plain.length = krbencs[i].plen;608plain.data = krbencs[i].pdata;609610ret = krb_enc(context, crypto, krbencs[i].usage, &cipher, &plain);611612if (ret)613errx(1, "krb_enc failed with %d for test %d", ret, i);614615ret = krb_enc_iov(context, crypto, krbencs[i].usage, &cipher, &plain);616if (ret)617errx(1, "krb_enc_iov failed with %d for test %d", ret, i);618619ret = krb_enc_iov2(context, crypto, krbencs[i].usage,620cipher.length, &plain);621if (ret)622errx(1, "krb_enc_iov2 failed with %d for test %d", ret, i);623624ret = krb_checksum_iov(context, crypto, krbencs[i].usage, &plain);625if (ret)626errx(1, "krb_checksum_iov failed with %d for test %d", ret, i);627628krb5_crypto_destroy(context, crypto);629630ret = krb_enc_mit(context, krbencs[i].enctype, &kb,631krbencs[i].usage, &cipher, &plain);632if (ret)633errx(1, "krb_enc_mit failed with %d for test %d", ret, i);634}635636return 0;637}638639static int640iov_test(krb5_context context)641{642krb5_enctype enctype = ENCTYPE_AES256_CTS_HMAC_SHA1_96;643krb5_error_code ret;644krb5_crypto crypto;645krb5_keyblock key;646krb5_data signonly, in, in2;647krb5_crypto_iov iov[6];648size_t len, i;649unsigned char *base, *p;650651ret = krb5_generate_random_keyblock(context, enctype, &key);652if (ret)653krb5_err(context, 1, ret, "krb5_generate_random_keyblock");654655ret = krb5_crypto_init(context, &key, 0, &crypto);656if (ret)657krb5_err(context, 1, ret, "krb5_crypto_init");658659660ret = krb5_crypto_length(context, crypto, KRB5_CRYPTO_TYPE_HEADER, &len);661if (ret)662krb5_err(context, 1, ret, "krb5_crypto_length");663664signonly.data = "This should be signed";665signonly.length = strlen(signonly.data);666in.data = "inputdata";667in.length = strlen(in.data);668669in2.data = "INPUTDATA";670in2.length = strlen(in2.data);671672673memset(iov, 0, sizeof(iov));674675iov[0].flags = KRB5_CRYPTO_TYPE_HEADER;676iov[1].flags = KRB5_CRYPTO_TYPE_DATA;677iov[1].data = in;678iov[2].flags = KRB5_CRYPTO_TYPE_SIGN_ONLY;679iov[2].data = signonly;680iov[3].flags = KRB5_CRYPTO_TYPE_EMPTY;681iov[4].flags = KRB5_CRYPTO_TYPE_PADDING;682iov[5].flags = KRB5_CRYPTO_TYPE_TRAILER;683684ret = krb5_crypto_length_iov(context, crypto, iov,685sizeof(iov)/sizeof(iov[0]));686if (ret)687krb5_err(context, 1, ret, "krb5_crypto_length_iov");688689for (len = 0, i = 0; i < sizeof(iov)/sizeof(iov[0]); i++) {690if (iov[i].flags == KRB5_CRYPTO_TYPE_SIGN_ONLY)691continue;692len += iov[i].data.length;693}694695base = emalloc(len);696697/*698* Allocate data for the fields699*/700701for (p = base, i = 0; i < sizeof(iov)/sizeof(iov[0]); i++) {702if (iov[i].flags == KRB5_CRYPTO_TYPE_SIGN_ONLY)703continue;;704iov[i].data.data = p;705p += iov[i].data.length;706}707assert(iov[1].data.length == in.length);708memcpy(iov[1].data.data, in.data, iov[1].data.length);709710/*711* Encrypt712*/713714ret = krb5_encrypt_iov_ivec(context, crypto, 7, iov,715sizeof(iov)/sizeof(iov[0]), NULL);716if (ret)717krb5_err(context, 1, ret, "krb5_encrypt_iov_ivec");718719/*720* Decrypt721*/722723ret = krb5_decrypt_iov_ivec(context, crypto, 7,724iov, sizeof(iov)/sizeof(iov[0]), NULL);725if (ret)726krb5_err(context, 1, ret, "krb5_decrypt_iov_ivec");727728/*729* Verify data730*/731732if (krb5_data_cmp(&iov[1].data, &in) != 0)733krb5_errx(context, 1, "decrypted data not same");734735/*736* Free memory737*/738739free(base);740741/* Set up for second try */742743iov[3].flags = KRB5_CRYPTO_TYPE_DATA;744iov[3].data = in;745746ret = krb5_crypto_length_iov(context, crypto,747iov, sizeof(iov)/sizeof(iov[0]));748if (ret)749krb5_err(context, 1, ret, "krb5_crypto_length_iov");750751for (len = 0, i = 0; i < sizeof(iov)/sizeof(iov[0]); i++) {752if (iov[i].flags == KRB5_CRYPTO_TYPE_SIGN_ONLY)753continue;754len += iov[i].data.length;755}756757base = emalloc(len);758759/*760* Allocate data for the fields761*/762763for (p = base, i = 0; i < sizeof(iov)/sizeof(iov[0]); i++) {764if (iov[i].flags == KRB5_CRYPTO_TYPE_SIGN_ONLY)765continue;;766iov[i].data.data = p;767p += iov[i].data.length;768}769assert(iov[1].data.length == in.length);770memcpy(iov[1].data.data, in.data, iov[1].data.length);771772assert(iov[3].data.length == in2.length);773memcpy(iov[3].data.data, in2.data, iov[3].data.length);774775776777/*778* Encrypt779*/780781ret = krb5_encrypt_iov_ivec(context, crypto, 7,782iov, sizeof(iov)/sizeof(iov[0]), NULL);783if (ret)784krb5_err(context, 1, ret, "krb5_encrypt_iov_ivec");785786/*787* Decrypt788*/789790ret = krb5_decrypt_iov_ivec(context, crypto, 7,791iov, sizeof(iov)/sizeof(iov[0]), NULL);792if (ret)793krb5_err(context, 1, ret, "krb5_decrypt_iov_ivec");794795/*796* Verify data797*/798799if (krb5_data_cmp(&iov[1].data, &in) != 0)800krb5_errx(context, 1, "decrypted data 2.1 not same");801802if (krb5_data_cmp(&iov[3].data, &in2) != 0)803krb5_errx(context, 1, "decrypted data 2.2 not same");804805/*806* Free memory807*/808809free(base);810811krb5_crypto_destroy(context, crypto);812813krb5_free_keyblock_contents(context, &key);814815return 0;816}817818819820static int821random_to_key(krb5_context context)822{823krb5_error_code ret;824krb5_keyblock key;825826ret = krb5_random_to_key(context,827ETYPE_DES3_CBC_SHA1,828"\x21\x39\x04\x58\x6A\xBD\x7F"829"\x21\x39\x04\x58\x6A\xBD\x7F"830"\x21\x39\x04\x58\x6A\xBD\x7F",83121,832&key);833if (ret){834krb5_warn(context, ret, "random_to_key");835return 1;836}837if (key.keyvalue.length != 24)838return 1;839840if (memcmp(key.keyvalue.data,841"\x20\x38\x04\x58\x6b\xbc\x7f\xc7"842"\x20\x38\x04\x58\x6b\xbc\x7f\xc7"843"\x20\x38\x04\x58\x6b\xbc\x7f\xc7",84424) != 0)845return 1;846847krb5_free_keyblock_contents(context, &key);848849return 0;850}851852int853main(int argc, char **argv)854{855krb5_error_code ret;856krb5_context context;857int val = 0;858859ret = krb5_init_context (&context);860if (ret)861errx (1, "krb5_init_context failed: %d", ret);862863val |= string_to_key_test(context);864865val |= krb_enc_test(context);866val |= random_to_key(context);867val |= iov_test(context);868869if (verbose && val == 0)870printf("all ok\n");871if (val)872printf("tests failed\n");873874krb5_free_context(context);875876return val;877}878879880