6
6
* The library is free for all purposes without any express
7
7
* guarantee it works.
9
* Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org
9
* Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
11
11
#include "tomcrypt.h"
47
47
return CRYPT_INVALID_ARG;
50
if (len % sizeof(LTC_FAST_TYPE)) {
50
if (cbc->blocklen % sizeof(LTC_FAST_TYPE)) {
51
51
return CRYPT_INVALID_ARG;
55
55
if (cipher_descriptor[cbc->cipher].accel_cbc_encrypt != NULL) {
56
cipher_descriptor[cbc->cipher].accel_cbc_encrypt(pt, ct, len / cbc->blocklen, cbc->IV, &cbc->key);
56
return cipher_descriptor[cbc->cipher].accel_cbc_encrypt(pt, ct, len / cbc->blocklen, cbc->IV, &cbc->key);
59
59
/* xor IV against plaintext */
60
60
#if defined(LTC_FAST)
61
for (x = 0; x < cbc->blocklen; x += sizeof(LTC_FAST_TYPE)) {
62
*((LTC_FAST_TYPE*)((unsigned char *)cbc->IV + x)) ^= *((LTC_FAST_TYPE*)((unsigned char *)pt + x));
61
for (x = 0; x < cbc->blocklen; x += sizeof(LTC_FAST_TYPE)) {
62
*((LTC_FAST_TYPE*)((unsigned char *)cbc->IV + x)) ^= *((LTC_FAST_TYPE*)((unsigned char *)pt + x));
65
65
for (x = 0; x < cbc->blocklen; x++) {
66
66
cbc->IV[x] ^= pt[x];
71
cipher_descriptor[cbc->cipher].ecb_encrypt(cbc->IV, ct, &cbc->key);
71
if ((err = cipher_descriptor[cbc->cipher].ecb_encrypt(cbc->IV, ct, &cbc->key)) != CRYPT_OK) {
73
75
/* store IV [ciphertext] for a future block */
74
76
#if defined(LTC_FAST)
75
for (x = 0; x < cbc->blocklen; x += sizeof(LTC_FAST_TYPE)) {
76
*((LTC_FAST_TYPE*)((unsigned char *)cbc->IV + x)) = *((LTC_FAST_TYPE*)((unsigned char *)ct + x));
77
for (x = 0; x < cbc->blocklen; x += sizeof(LTC_FAST_TYPE)) {
78
*((LTC_FAST_TYPE*)((unsigned char *)cbc->IV + x)) = *((LTC_FAST_TYPE*)((unsigned char *)ct + x));
79
81
for (x = 0; x < cbc->blocklen; x++) {
80
82
cbc->IV[x] = ct[x];
84
86
ct += cbc->blocklen;
85
87
pt += cbc->blocklen;