From 77a6593e3c774a46678936779aa01fd9de2ee3e2 Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Mon, 7 Jul 1997 01:13:56 +0000 Subject: [PATCH] Implement des-cbc-crc, and des-cbc-md5 in separate function. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1994 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/krb5/encrypt.c | 106 ++++++++++++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 31 deletions(-) diff --git a/lib/krb5/encrypt.c b/lib/krb5/encrypt.c index 56340db04..8cbc38fa2 100644 --- a/lib/krb5/encrypt.c +++ b/lib/krb5/encrypt.c @@ -3,42 +3,86 @@ RCSID("$Id$"); +krb5_error_code +krb5_des_cbc_encrypt (krb5_context context, + void *ptr, + size_t len, + int etype, + krb5_keyblock *keyblock, + krb5_data *result) +{ + u_char *p; + size_t sz; + des_cblock key; + des_key_schedule schedule; + + switch(etype){ + case ETYPE_DES_CBC_MD5: + sz = 16; + break; + case ETYPE_DES_CBC_CRC: + sz = 4; + break; + default: + return KRB5_PROG_ETYPE_NOSUPP; + } + + sz += len + 8; + sz = (sz + 7) & ~7; /* pad to 8 bytes */ + p = calloc (1, sz); + if (p == NULL) + return ENOMEM; + des_new_random_key((des_cblock*)p); +#if 0 + des_rand_data ((des_cblock*)p, 8); +#endif + memcpy (p + 12, ptr, len); + switch(etype){ + case ETYPE_DES_CBC_MD5: + { + struct md5 m; + md5init(&m); + md5_update(&m, p, sz); + md5_finito(&m, p + 8); + break; + } + case ETYPE_DES_CBC_CRC: + { + u_int32_t crc; + crc_init_table (); + crc = crc_update (p, sz, 0); + p[8] = crc & 0xff; + p[9] = (crc >> 8) & 0xff; + p[10] = (crc >> 16) & 0xff; + p[11] = (crc >> 24) & 0xff; + break; + } + } + + memcpy (&key, keyblock->keyvalue.data, sizeof(key)); + des_set_key (&key, schedule); + des_cbc_encrypt ((des_cblock *)p, (des_cblock *)p, sz, + schedule, &key, DES_ENCRYPT); + + result->data = p; + result->length = sz; + return 0; + +} + krb5_error_code krb5_encrypt (krb5_context context, void *ptr, size_t len, + int etype, krb5_keyblock *keyblock, krb5_data *result) { - u_char *p; - u_long crc; - size_t sz; - des_cblock key; - des_key_schedule schedule; - - sz = len + 12; - sz = (sz + 7) & ~7; - p = malloc (sz); - if (p == NULL) - return ENOMEM; - memset (p, 0, sz); - des_new_random_key((des_cblock*)p); -#if 0 - des_rand_data ((des_cblock*)p, 8); -#endif - memcpy (p + 12, ptr, len); - crc_init_table (); - crc = crc_update (p, sz, 0); - p[8] = crc & 0xff; - p[9] = (crc >> 8) & 0xff; - p[10] = (crc >> 16) & 0xff; - p[11] = (crc >> 24) & 0xff; - - memcpy (&key, keyblock->keyvalue.data, sizeof(key)); - des_set_key (&key, schedule); - des_cbc_encrypt ((des_cblock *)p, (des_cblock *)p, sz, schedule, &key, DES_ENCRYPT); - - result->data = p; - result->length = sz; - return 0; + switch(etype){ + case ETYPE_DES_CBC_MD5: + case ETYPE_DES_CBC_CRC: + return krb5_des_cbc_encrypt(context, ptr, len, etype, + keyblock, result); + } + return KRB5_PROG_ETYPE_NOSUPP; }