From 3bcfce2881b8fa9d840e6a61d43843504064a562 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bodo=20M=C3=B6ller?= Date: Wed, 9 Jun 1999 17:28:30 +0000 Subject: [PATCH] Unify DES library: ncbc_enc.c wasn't used, but its content was almost duplicated in cbc_enc.c (without IV updating) and in des_enc.c As pointed out by others on the openssl-dev list, des_cbc_encrypt (without IV updating; defined in cbc_enc.c) exists only for historical reasons: des_ncbc_encrypt should be used instead (and the caller does not have to manually update the IV). If des_cbc_enrypt is not needed for backwards compatibility, the definition of des_ncbc_encrypt should be put back into des_enc.c, and both cbc_enc.c and ncbc_enc.c can be deleted. If des_cbc_encrypt *is* needed for backwards compatibility, its behaviour obviously should not change (i.e., don't add IV updating). --- crypto/des/cbc3_enc.c | 6 ++-- crypto/des/cbc_enc.c | 82 ++----------------------------------------- crypto/des/des_enc.c | 75 ++------------------------------------- crypto/des/ncbc_enc.c | 36 ++++++++++++++----- 4 files changed, 34 insertions(+), 165 deletions(-) diff --git a/crypto/des/cbc3_enc.c b/crypto/des/cbc3_enc.c index 50ed156c7a..3863a676d4 100644 --- a/crypto/des/cbc3_enc.c +++ b/crypto/des/cbc3_enc.c @@ -59,9 +59,9 @@ #include "des_locl.h" /* HAS BUGS? DON'T USE - this is only present for use in des.c */ -void des_3cbc_encrypt(des_cblock (*input), des_cblock (*output), long length, - des_key_schedule ks1, des_key_schedule ks2, des_cblock (*iv1), - des_cblock (*iv2), int enc) +void des_3cbc_encrypt(des_cblock *input, des_cblock *output, long length, + des_key_schedule ks1, des_key_schedule ks2, des_cblock *iv1, + des_cblock *iv2, int enc) { int off=((int)length-1)/8; long l8=((length+7)/8)*8; diff --git a/crypto/des/cbc_enc.c b/crypto/des/cbc_enc.c index c9c881b12a..677903ae4e 100644 --- a/crypto/des/cbc_enc.c +++ b/crypto/des/cbc_enc.c @@ -56,84 +56,6 @@ * [including the GNU Public Licence.] */ -#include "des_locl.h" - -/* Note that this is inconsistent with other DES functions in that it doesn't - update ivec */ -void des_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, - des_key_schedule schedule, des_cblock *ivec, int enc) - { - register DES_LONG tin0,tin1; - register DES_LONG tout0,tout1,xor0,xor1; - register long l=length; - DES_LONG tin[2]; - unsigned char *iv; - - iv = &(*ivec)[0]; - - if (enc) - { - c2l(iv,tout0); - c2l(iv,tout1); - for (l-=8; l>=0; l-=8) - { - c2l(in,tin0); - c2l(in,tin1); - tin0^=tout0; tin[0]=tin0; - tin1^=tout1; tin[1]=tin1; - des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); - tout0=tin[0]; l2c(tout0,out); - tout1=tin[1]; l2c(tout1,out); - } - if (l != -8) - { - c2ln(in,tin0,tin1,l+8); - tin0^=tout0; tin[0]=tin0; - tin1^=tout1; tin[1]=tin1; - des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); - tout0=tin[0]; l2c(tout0,out); - tout1=tin[1]; l2c(tout1,out); - } -#if 0 - iv = &(*ivec)[0]; - l2c(tout0,iv); - l2c(tout1,iv); -#endif - } - else - { - c2l(iv,xor0); - c2l(iv,xor1); - for (l-=8; l>=0; l-=8) - { - c2l(in,tin0); tin[0]=tin0; - c2l(in,tin1); tin[1]=tin1; - des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); - tout0=tin[0]^xor0; - tout1=tin[1]^xor1; - l2c(tout0,out); - l2c(tout1,out); - xor0=tin0; - xor1=tin1; - } - if (l != -8) - { - c2l(in,tin0); tin[0]=tin0; - c2l(in,tin1); tin[1]=tin1; - des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); - tout0=tin[0]^xor0; - tout1=tin[1]^xor1; - l2cn(tout0,tout1,out,l+8); - /* xor0=tin0; - xor1=tin1; */ - } -#if 0 - iv = &(*ivec)[0]; - l2c(xor0,iv); - l2c(xor1,iv); -#endif - } - tin0=tin1=tout0=tout1=xor0=xor1=0; - tin[0]=tin[1]=0; - } +#define CBC_ENC_C__DONT_UPDATE_IV +#include "ncbc_enc.c" /* des_cbc_encrypt */ diff --git a/crypto/des/des_enc.c b/crypto/des/des_enc.c index f47d2a02da..772d9cb271 100644 --- a/crypto/des/des_enc.c +++ b/crypto/des/des_enc.c @@ -289,79 +289,8 @@ void des_decrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2, #ifndef DES_DEFAULT_OPTIONS -void des_ncbc_encrypt(const unsigned char *in, unsigned char *out, long length, - des_key_schedule schedule, des_cblock *ivec, int enc) - { - register DES_LONG tin0,tin1; - register DES_LONG tout0,tout1,xor0,xor1; - register long l=length; - DES_LONG tin[2]; - unsigned char *iv; - - iv = &(*ivec)[0]; - - if (enc) - { - c2l(iv,tout0); - c2l(iv,tout1); - for (l-=8; l>=0; l-=8) - { - c2l(in,tin0); - c2l(in,tin1); - tin0^=tout0; tin[0]=tin0; - tin1^=tout1; tin[1]=tin1; - des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); - tout0=tin[0]; l2c(tout0,out); - tout1=tin[1]; l2c(tout1,out); - } - if (l != -8) - { - c2ln(in,tin0,tin1,l+8); - tin0^=tout0; tin[0]=tin0; - tin1^=tout1; tin[1]=tin1; - des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT); - tout0=tin[0]; l2c(tout0,out); - tout1=tin[1]; l2c(tout1,out); - } - iv = &(*ivec)[0]; - l2c(tout0,iv); - l2c(tout1,iv); - } - else - { - c2l(iv,xor0); - c2l(iv,xor1); - for (l-=8; l>=0; l-=8) - { - c2l(in,tin0); tin[0]=tin0; - c2l(in,tin1); tin[1]=tin1; - des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); - tout0=tin[0]^xor0; - tout1=tin[1]^xor1; - l2c(tout0,out); - l2c(tout1,out); - xor0=tin0; - xor1=tin1; - } - if (l != -8) - { - c2l(in,tin0); tin[0]=tin0; - c2l(in,tin1); tin[1]=tin1; - des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); - tout0=tin[0]^xor0; - tout1=tin[1]^xor1; - l2cn(tout0,tout1,out,l+8); - xor0=tin0; - xor1=tin1; - } - - iv = &(*ivec)[0]; - l2c(xor0,iv); - l2c(xor1,iv); - } - tin0=tin1=tout0=tout1=xor0=xor1=0; - tin[0]=tin[1]=0; - } +#undef CBC_ENC_C__DONT_UPDATE_IV +#include "ncbc_enc.c" /* des_ncbc_enrypt */ void des_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, long length, des_key_schedule ks1, des_key_schedule ks2, diff --git a/crypto/des/ncbc_enc.c b/crypto/des/ncbc_enc.c index a13e4fc22b..e0e67a417d 100644 --- a/crypto/des/ncbc_enc.c +++ b/crypto/des/ncbc_enc.c @@ -58,19 +58,21 @@ #include "des_locl.h" -void des_ncbc_encrypt(des_cblock (*input), des_cblock (*output), long length, - des_key_schedule schedule, des_cblock (*ivec), int enc) +#ifdef CBC_ENC_C__DONT_UPDATE_IV +void des_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, + des_key_schedule schedule, des_cblock *ivec, int enc) +#else +void des_ncbc_encrypt(const unsigned char *in, unsigned char *out, long length, + des_key_schedule schedule, des_cblock *ivec, int enc) +#endif { register DES_LONG tin0,tin1; register DES_LONG tout0,tout1,xor0,xor1; - register unsigned char *in,*out; register long l=length; DES_LONG tin[2]; unsigned char *iv; - in=(unsigned char *)input; - out=(unsigned char *)output; - iv=(unsigned char *)ivec; + iv = &(*ivec)[0]; if (enc) { @@ -95,9 +97,11 @@ void des_ncbc_encrypt(des_cblock (*input), des_cblock (*output), long length, tout0=tin[0]; l2c(tout0,out); tout1=tin[1]; l2c(tout1,out); } - iv=(unsigned char *)ivec; +#ifndef CBC_ENC_C__DONT_UPDATE_IV + iv = &(*ivec)[0]; l2c(tout0,iv); l2c(tout1,iv); +#endif } else { @@ -115,11 +119,25 @@ void des_ncbc_encrypt(des_cblock (*input), des_cblock (*output), long length, xor0=tin0; xor1=tin1; } - iv=(unsigned char *)ivec; + if (l != -8) + { + c2l(in,tin0); tin[0]=tin0; + c2l(in,tin1); tin[1]=tin1; + des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT); + tout0=tin[0]^xor0; + tout1=tin[1]^xor1; + l2cn(tout0,tout1,out,l+8); +#ifndef CBC_ENC_C__DONT_UPDATE_IV + xor0=tin0; + xor1=tin1; +#endif + } +#ifndef CBC_ENC_C__DONT_UPDATE_IV + iv = &(*ivec)[0]; l2c(xor0,iv); l2c(xor1,iv); +#endif } tin0=tin1=tout0=tout1=xor0=xor1=0; tin[0]=tin[1]=0; } - -- 2.25.1