Path: blob/main/crypto/heimdal/lib/krb5/crypto-des.c
34878 views
/*1* Copyright (c) 1997 - 2008 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 the Institute nor the names of its contributors17* may be used to endorse or promote products derived from this software18* without specific prior written permission.19*20* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND21* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE22* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE23* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE24* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL25* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS26* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)27* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT28* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY29* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF30* SUCH DAMAGE.31*/3233#include "krb5_locl.h"3435#ifdef HEIM_WEAK_CRYPTO363738static void39krb5_DES_random_key(krb5_context context,40krb5_keyblock *key)41{42DES_cblock *k = key->keyvalue.data;43do {44krb5_generate_random_block(k, sizeof(DES_cblock));45DES_set_odd_parity(k);46} while(DES_is_weak_key(k));47}4849static void50krb5_DES_schedule_old(krb5_context context,51struct _krb5_key_type *kt,52struct _krb5_key_data *key)53{54DES_set_key_unchecked(key->key->keyvalue.data, key->schedule->data);55}5657static void58krb5_DES_random_to_key(krb5_context context,59krb5_keyblock *key,60const void *data,61size_t size)62{63DES_cblock *k = key->keyvalue.data;64memcpy(k, data, key->keyvalue.length);65DES_set_odd_parity(k);66if(DES_is_weak_key(k))67_krb5_xor(k, (const unsigned char*)"\0\0\0\0\0\0\0\xf0");68}6970static struct _krb5_key_type keytype_des_old = {71ETYPE_DES_CBC_CRC,72"des-old",7356,748,75sizeof(DES_key_schedule),76krb5_DES_random_key,77krb5_DES_schedule_old,78_krb5_des_salt,79krb5_DES_random_to_key,80NULL,81NULL82};8384static struct _krb5_key_type keytype_des = {85ETYPE_DES_CBC_CRC,86"des",8756,888,89sizeof(struct _krb5_evp_schedule),90krb5_DES_random_key,91_krb5_evp_schedule,92_krb5_des_salt,93krb5_DES_random_to_key,94_krb5_evp_cleanup,95EVP_des_cbc96};9798static krb5_error_code99CRC32_checksum(krb5_context context,100struct _krb5_key_data *key,101const void *data,102size_t len,103unsigned usage,104Checksum *C)105{106uint32_t crc;107unsigned char *r = C->checksum.data;108_krb5_crc_init_table ();109crc = _krb5_crc_update (data, len, 0);110r[0] = crc & 0xff;111r[1] = (crc >> 8) & 0xff;112r[2] = (crc >> 16) & 0xff;113r[3] = (crc >> 24) & 0xff;114return 0;115}116117static krb5_error_code118RSA_MD4_checksum(krb5_context context,119struct _krb5_key_data *key,120const void *data,121size_t len,122unsigned usage,123Checksum *C)124{125if (EVP_Digest(data, len, C->checksum.data, NULL, EVP_md4(), NULL) != 1)126krb5_abortx(context, "md4 checksum failed");127return 0;128}129130static krb5_error_code131RSA_MD4_DES_checksum(krb5_context context,132struct _krb5_key_data *key,133const void *data,134size_t len,135unsigned usage,136Checksum *cksum)137{138return _krb5_des_checksum(context, EVP_md4(), key, data, len, cksum);139}140141static krb5_error_code142RSA_MD4_DES_verify(krb5_context context,143struct _krb5_key_data *key,144const void *data,145size_t len,146unsigned usage,147Checksum *C)148{149return _krb5_des_verify(context, EVP_md4(), key, data, len, C);150}151152static krb5_error_code153RSA_MD5_DES_checksum(krb5_context context,154struct _krb5_key_data *key,155const void *data,156size_t len,157unsigned usage,158Checksum *C)159{160return _krb5_des_checksum(context, EVP_md5(), key, data, len, C);161}162163static krb5_error_code164RSA_MD5_DES_verify(krb5_context context,165struct _krb5_key_data *key,166const void *data,167size_t len,168unsigned usage,169Checksum *C)170{171return _krb5_des_verify(context, EVP_md5(), key, data, len, C);172}173174struct _krb5_checksum_type _krb5_checksum_crc32 = {175CKSUMTYPE_CRC32,176"crc32",1771,1784,1790,180CRC32_checksum,181NULL182};183184struct _krb5_checksum_type _krb5_checksum_rsa_md4 = {185CKSUMTYPE_RSA_MD4,186"rsa-md4",18764,18816,189F_CPROOF,190RSA_MD4_checksum,191NULL192};193194struct _krb5_checksum_type _krb5_checksum_rsa_md4_des = {195CKSUMTYPE_RSA_MD4_DES,196"rsa-md4-des",19764,19824,199F_KEYED | F_CPROOF | F_VARIANT,200RSA_MD4_DES_checksum,201RSA_MD4_DES_verify202};203204struct _krb5_checksum_type _krb5_checksum_rsa_md5_des = {205CKSUMTYPE_RSA_MD5_DES,206"rsa-md5-des",20764,20824,209F_KEYED | F_CPROOF | F_VARIANT,210RSA_MD5_DES_checksum,211RSA_MD5_DES_verify212};213214static krb5_error_code215evp_des_encrypt_null_ivec(krb5_context context,216struct _krb5_key_data *key,217void *data,218size_t len,219krb5_boolean encryptp,220int usage,221void *ignore_ivec)222{223struct _krb5_evp_schedule *ctx = key->schedule->data;224EVP_CIPHER_CTX *c;225DES_cblock ivec;226memset(&ivec, 0, sizeof(ivec));227c = encryptp ? ctx->ectx : ctx->dctx;228EVP_CipherInit_ex(c, NULL, NULL, NULL, (void *)&ivec, -1);229EVP_Cipher(c, data, data, len);230return 0;231}232233static krb5_error_code234evp_des_encrypt_key_ivec(krb5_context context,235struct _krb5_key_data *key,236void *data,237size_t len,238krb5_boolean encryptp,239int usage,240void *ignore_ivec)241{242struct _krb5_evp_schedule *ctx = key->schedule->data;243EVP_CIPHER_CTX *c;244DES_cblock ivec;245memcpy(&ivec, key->key->keyvalue.data, sizeof(ivec));246c = encryptp ? ctx->ectx : ctx->dctx;247EVP_CipherInit_ex(c, NULL, NULL, NULL, (void *)&ivec, -1);248EVP_Cipher(c, data, data, len);249return 0;250}251252static krb5_error_code253DES_CFB64_encrypt_null_ivec(krb5_context context,254struct _krb5_key_data *key,255void *data,256size_t len,257krb5_boolean encryptp,258int usage,259void *ignore_ivec)260{261DES_cblock ivec;262int num = 0;263DES_key_schedule *s = key->schedule->data;264memset(&ivec, 0, sizeof(ivec));265266DES_cfb64_encrypt(data, data, len, s, &ivec, &num, encryptp);267return 0;268}269270static krb5_error_code271DES_PCBC_encrypt_key_ivec(krb5_context context,272struct _krb5_key_data *key,273void *data,274size_t len,275krb5_boolean encryptp,276int usage,277void *ignore_ivec)278{279DES_cblock ivec;280DES_key_schedule *s = key->schedule->data;281memcpy(&ivec, key->key->keyvalue.data, sizeof(ivec));282283DES_pcbc_encrypt(data, data, len, s, &ivec, encryptp);284return 0;285}286287struct _krb5_encryption_type _krb5_enctype_des_cbc_crc = {288ETYPE_DES_CBC_CRC,289"des-cbc-crc",2908,2918,2928,293&keytype_des,294&_krb5_checksum_crc32,295NULL,296F_DISABLED|F_WEAK,297evp_des_encrypt_key_ivec,2980,299NULL300};301302struct _krb5_encryption_type _krb5_enctype_des_cbc_md4 = {303ETYPE_DES_CBC_MD4,304"des-cbc-md4",3058,3068,3078,308&keytype_des,309&_krb5_checksum_rsa_md4,310&_krb5_checksum_rsa_md4_des,311F_DISABLED|F_WEAK,312evp_des_encrypt_null_ivec,3130,314NULL315};316317struct _krb5_encryption_type _krb5_enctype_des_cbc_md5 = {318ETYPE_DES_CBC_MD5,319"des-cbc-md5",3208,3218,3228,323&keytype_des,324&_krb5_checksum_rsa_md5,325&_krb5_checksum_rsa_md5_des,326F_DISABLED|F_WEAK,327evp_des_encrypt_null_ivec,3280,329NULL330};331332struct _krb5_encryption_type _krb5_enctype_des_cbc_none = {333ETYPE_DES_CBC_NONE,334"des-cbc-none",3358,3368,3370,338&keytype_des,339&_krb5_checksum_none,340NULL,341F_PSEUDO|F_DISABLED|F_WEAK,342evp_des_encrypt_null_ivec,3430,344NULL345};346347struct _krb5_encryption_type _krb5_enctype_des_cfb64_none = {348ETYPE_DES_CFB64_NONE,349"des-cfb64-none",3501,3511,3520,353&keytype_des_old,354&_krb5_checksum_none,355NULL,356F_PSEUDO|F_DISABLED|F_WEAK,357DES_CFB64_encrypt_null_ivec,3580,359NULL360};361362struct _krb5_encryption_type _krb5_enctype_des_pcbc_none = {363ETYPE_DES_PCBC_NONE,364"des-pcbc-none",3658,3668,3670,368&keytype_des_old,369&_krb5_checksum_none,370NULL,371F_PSEUDO|F_DISABLED|F_WEAK,372DES_PCBC_encrypt_key_ivec,3730,374NULL375};376#endif /* HEIM_WEAK_CRYPTO */377378379