#include "crypto_int.h"
#include "des_int.h"
#include "f_tables.h"
#ifdef K5_BUILTIN_DES
const mit_des_cblock mit_des_zeroblock ;
void
krb5int_des_cbc_encrypt(krb5_crypto_iov *data, unsigned long num_data,
const mit_des_key_schedule schedule,
mit_des_cblock ivec)
{
unsigned DES_INT32 left, right;
const unsigned DES_INT32 *kp;
const unsigned char *ip;
struct iov_cursor cursor;
unsigned char block[MIT_DES_BLOCK_LENGTH];
kp = (const unsigned DES_INT32 *)schedule;
ip = (ivec != NULL) ? ivec : mit_des_zeroblock;
left = load_32_be(ip);
right = load_32_be(ip + 4);
k5_iov_cursor_init(&cursor, data, num_data, MIT_DES_BLOCK_LENGTH, FALSE);
while (k5_iov_cursor_get(&cursor, block)) {
left ^= load_32_be(block);
right ^= load_32_be(block + 4);
DES_DO_ENCRYPT(left, right, kp);
store_32_be(left, block);
store_32_be(right, block + 4);
k5_iov_cursor_put(&cursor, block);
}
if (ivec != NULL) {
store_32_be(left, ivec);
store_32_be(right, ivec + 4);
}
}
void
krb5int_des_cbc_decrypt(krb5_crypto_iov *data, unsigned long num_data,
const mit_des_key_schedule schedule,
mit_des_cblock ivec)
{
unsigned DES_INT32 left, right;
const unsigned DES_INT32 *kp;
const unsigned char *ip;
unsigned DES_INT32 ocipherl, ocipherr;
unsigned DES_INT32 cipherl, cipherr;
struct iov_cursor cursor;
unsigned char block[MIT_DES_BLOCK_LENGTH];
kp = (const unsigned DES_INT32 *)schedule;
ip = (ivec != NULL) ? ivec : mit_des_zeroblock;
ocipherl = load_32_be(ip);
ocipherr = load_32_be(ip + 4);
k5_iov_cursor_init(&cursor, data, num_data, MIT_DES_BLOCK_LENGTH, FALSE);
while (k5_iov_cursor_get(&cursor, block)) {
cipherl = left = load_32_be(block);
cipherr = right = load_32_be(block + 4);
DES_DO_DECRYPT(left, right, kp);
left ^= ocipherl;
right ^= ocipherr;
store_32_be(left, block);
store_32_be(right, block + 4);
ocipherl = cipherl;
ocipherr = cipherr;
k5_iov_cursor_put(&cursor, block);
}
if (ivec != NULL) {
store_32_be(ocipherl, ivec);
store_32_be(ocipherr, ivec + 4);
}
}
void
krb5int_des_cbc_mac(const krb5_crypto_iov *data, unsigned long num_data,
const mit_des_key_schedule schedule, mit_des_cblock ivec,
mit_des_cblock out)
{
unsigned DES_INT32 left, right;
const unsigned DES_INT32 *kp;
const unsigned char *ip;
struct iov_cursor cursor;
unsigned char block[MIT_DES_BLOCK_LENGTH];
kp = (const unsigned DES_INT32 *)schedule;
ip = (ivec != NULL) ? ivec : mit_des_zeroblock;
left = load_32_be(ip);
right = load_32_be(ip + 4);
k5_iov_cursor_init(&cursor, data, num_data, MIT_DES_BLOCK_LENGTH, TRUE);
while (k5_iov_cursor_get(&cursor, block)) {
left ^= load_32_be(block);
right ^= load_32_be(block + 4);
DES_DO_ENCRYPT(left, right, kp);
}
store_32_be(left, out);
store_32_be(right, out + 4);
}
#if defined(CONFIG_SMALL) && !defined(CONFIG_SMALL_NO_CRYPTO)
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
#endif