From 66830aa4ab0c36b601581afe16a2f2f622cb0953 Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Mon, 7 Jul 1997 00:51:50 +0000 Subject: [PATCH] Implement des-cbc-crc, and des-cbc-md5 in separate function. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1987 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/krb5/decrypt.c | 88 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/lib/krb5/decrypt.c b/lib/krb5/decrypt.c index 234cdd01e..1e69cd3c2 100644 --- a/lib/krb5/decrypt.c +++ b/lib/krb5/decrypt.c @@ -1,35 +1,79 @@ #include #include "crc.h" +#include RCSID("$Id$"); +krb5_error_code +krb5_des_cbc_decrypt(krb5_context context, + void *ptr, + size_t len, + int etype, + const krb5_keyblock *keyblock, + krb5_data *result) +{ + u_char *p = (u_char *)ptr; + size_t offset; + des_cblock key; + des_key_schedule schedule; + + memcpy (&key, keyblock->keyvalue.data, sizeof(key)); + des_set_key (&key, schedule); + des_cbc_encrypt ((des_cblock *)ptr, (des_cblock *)ptr, len, + schedule, &key, DES_DECRYPT); + switch(etype){ + case ETYPE_DES_CBC_MD5: + { + struct md5 m; + u_int32_t his_checksum[4]; + u_int32_t my_checksum[4]; + memcpy(his_checksum, p + 8, 16); + memset(p + 8, 0, 16); + md5init(&m); + md5_update (&m, ptr, len); + md5_finito(&m, my_checksum); + if(memcmp(his_checksum, my_checksum, 16)) + return KRB5KRB_AP_ERR_BAD_INTEGRITY; + offset = 24; + } + break; + + case ETYPE_DES_CBC_CRC: + { + u_int32_t my_crc, her_crc; + her_crc = (p[11] << 24) | (p[10] << 16) | + (p[9] << 8) | (p[8] << 0); + memset (p + 8, 0, sizeof(her_crc)); + crc_init_table (); + my_crc = crc_update (ptr, len, 0); + if (my_crc != her_crc) + return KRB5KRB_AP_ERR_BAD_INTEGRITY; + offset = 12; + } + break; + default: + return KRB5_PROG_ETYPE_NOSUPP; + } + result->length = len - offset; + result->data = malloc(result->length); + if (result->data == NULL) + return ENOMEM; + memcpy(result->data, p + 12, result->length); + return 0; +} + + krb5_error_code krb5_decrypt (krb5_context context, void *ptr, size_t len, + int etype, const krb5_keyblock *keyblock, krb5_data *result) { - u_char *p = (u_char *)ptr; - u_int32_t my_crc, her_crc; - des_cblock key; - des_key_schedule schedule; - - memcpy (&key, keyblock->keyvalue.data, sizeof(key)); - des_set_key (&key, schedule); - des_cbc_encrypt ((des_cblock *)ptr, (des_cblock *)ptr, len, - schedule, &key, DES_DECRYPT); - - her_crc = (p[11] << 24) | (p[10] << 16) | (p[9] << 8) | (p[8] << 0); - memset (p + 8, 0, sizeof(her_crc)); - crc_init_table (); - my_crc = crc_update (ptr, len, 0); - if (my_crc != her_crc) - return KRB5KRB_AP_ERR_BAD_INTEGRITY; - result->length = len - 12; - result->data = malloc(result->length); - if (result->data == NULL) - return ENOMEM; - memcpy (result->data, (u_char *)ptr + 12, result->length); - return 0; + switch(etype){ + case ETYPE_DES_CBC_CRC: + return des_cbc_crc_decrypt(context, ptr, len, etype, keyblock, result); + } + return KRB5_PROG_ETYPE_NOSUPP; }