#include "des_int.h"
#include "f_tables.h"
const mit_des_cblock mit_des_zeroblock ;
#undef mit_des_cbc_encrypt
int
mit_des_cbc_encrypt(const mit_des_cblock *in, mit_des_cblock *out,
unsigned long length, const mit_des_key_schedule schedule,
const mit_des_cblock ivec, int enc)
{
if (enc)
krb5int_des_cbc_encrypt(in, out, length, schedule, ivec);
else
krb5int_des_cbc_decrypt(in, out, length, schedule, ivec);
return 0;
}
void
krb5int_des_cbc_encrypt(const mit_des_cblock *in,
mit_des_cblock *out,
unsigned long length,
const mit_des_key_schedule schedule,
const mit_des_cblock ivec)
{
unsigned DES_INT32 left, right;
const unsigned DES_INT32 *kp;
const unsigned char *ip;
unsigned char *op;
kp = (const unsigned DES_INT32 *)schedule;
ip = ivec;
GET_HALF_BLOCK(left, ip);
GET_HALF_BLOCK(right, ip);
ip = *in;
op = *out;
while (length > 0) {
if (length >= 8) {
unsigned DES_INT32 temp;
GET_HALF_BLOCK(temp, ip);
left ^= temp;
GET_HALF_BLOCK(temp, ip);
right ^= temp;
length -= 8;
} else {
ip += (int) length;
switch(length) {
case 7:
right ^= (*(--ip) & FF_UINT32) << 8;
case 6:
right ^= (*(--ip) & FF_UINT32) << 16;
case 5:
right ^= (*(--ip) & FF_UINT32) << 24;
case 4:
left ^= *(--ip) & FF_UINT32;
case 3:
left ^= (*(--ip) & FF_UINT32) << 8;
case 2:
left ^= (*(--ip) & FF_UINT32) << 16;
case 1:
left ^= (*(--ip) & FF_UINT32) << 24;
break;
}
length = 0;
}
DES_DO_ENCRYPT(left, right, kp);
PUT_HALF_BLOCK(left, op);
PUT_HALF_BLOCK(right, op);
}
}
void
krb5int_des_cbc_decrypt(const mit_des_cblock *in,
mit_des_cblock *out,
unsigned long length,
const mit_des_key_schedule schedule,
const mit_des_cblock ivec)
{
unsigned DES_INT32 left, right;
const unsigned DES_INT32 *kp;
const unsigned char *ip;
unsigned char *op;
unsigned DES_INT32 ocipherl, ocipherr;
unsigned DES_INT32 cipherl, cipherr;
kp = (const unsigned DES_INT32 *)schedule;
if (length <= 0)
return;
ip = ivec;
GET_HALF_BLOCK(ocipherl, ip);
GET_HALF_BLOCK(ocipherr, ip);
ip = *in;
op = *out;
for (;;) {
GET_HALF_BLOCK(left, ip);
GET_HALF_BLOCK(right, ip);
cipherl = left;
cipherr = right;
DES_DO_DECRYPT(left, right, kp);
left ^= ocipherl;
right ^= ocipherr;
if (length > 8) {
length -= 8;
PUT_HALF_BLOCK(left, op);
PUT_HALF_BLOCK(right, op);
ocipherl = cipherl;
ocipherr = cipherr;
} else {
op += (int) length;
switch(length) {
case 8:
*(--op) = (unsigned char) (right & 0xff);
case 7:
*(--op) = (unsigned char) ((right >> 8) & 0xff);
case 6:
*(--op) = (unsigned char) ((right >> 16) & 0xff);
case 5:
*(--op) = (unsigned char) ((right >> 24) & 0xff);
case 4:
*(--op) = (unsigned char) (left & 0xff);
case 3:
*(--op) = (unsigned char) ((left >> 8) & 0xff);
case 2:
*(--op) = (unsigned char) ((left >> 16) & 0xff);
case 1:
*(--op) = (unsigned char) ((left >> 24) & 0xff);
break;
}
break;
}
}
}
#ifdef CONFIG_SMALL
void krb5int_des_do_encrypt_2 (unsigned DES_INT32 *left,
unsigned DES_INT32 *right,
const unsigned DES_INT32 *kp)
{
DES_DO_ENCRYPT_1 (*left, *right, kp);
}
void krb5int_des_do_decrypt_2 (unsigned DES_INT32 *left,
unsigned DES_INT32 *right,
const unsigned DES_INT32 *kp)
{
DES_DO_DECRYPT_1 (*left, *right, kp);
}
#endif