Path: blob/master/libs/tomcrypt/src/modes/cbc/cbc_encrypt.c
5972 views
/* LibTomCrypt, modular cryptographic library -- Tom St Denis1*2* LibTomCrypt is a library that provides various cryptographic3* algorithms in a highly modular and flexible manner.4*5* The library is free for all purposes without any express6* guarantee it works.7*/8#include "tomcrypt.h"910/**11@file cbc_encrypt.c12CBC implementation, encrypt block, Tom St Denis13*/141516#ifdef LTC_CBC_MODE1718/**19CBC encrypt20@param pt Plaintext21@param ct [out] Ciphertext22@param len The number of bytes to process (must be multiple of block length)23@param cbc CBC state24@return CRYPT_OK if successful25*/26int cbc_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CBC *cbc)27{28int x, err;2930LTC_ARGCHK(pt != NULL);31LTC_ARGCHK(ct != NULL);32LTC_ARGCHK(cbc != NULL);3334if ((err = cipher_is_valid(cbc->cipher)) != CRYPT_OK) {35return err;36}3738/* is blocklen valid? */39if (cbc->blocklen < 1 || cbc->blocklen > (int)sizeof(cbc->IV)) {40return CRYPT_INVALID_ARG;41}4243if (len % cbc->blocklen) {44return CRYPT_INVALID_ARG;45}46#ifdef LTC_FAST47if (cbc->blocklen % sizeof(LTC_FAST_TYPE)) {48return CRYPT_INVALID_ARG;49}50#endif5152if (cipher_descriptor[cbc->cipher].accel_cbc_encrypt != NULL) {53return cipher_descriptor[cbc->cipher].accel_cbc_encrypt(pt, ct, len / cbc->blocklen, cbc->IV, &cbc->key);54} else {55while (len) {56/* xor IV against plaintext */57#if defined(LTC_FAST)58for (x = 0; x < cbc->blocklen; x += sizeof(LTC_FAST_TYPE)) {59*(LTC_FAST_TYPE_PTR_CAST((unsigned char *)cbc->IV + x)) ^= *(LTC_FAST_TYPE_PTR_CAST((unsigned char *)pt + x));60}61#else62for (x = 0; x < cbc->blocklen; x++) {63cbc->IV[x] ^= pt[x];64}65#endif6667/* encrypt */68if ((err = cipher_descriptor[cbc->cipher].ecb_encrypt(cbc->IV, ct, &cbc->key)) != CRYPT_OK) {69return err;70}7172/* store IV [ciphertext] for a future block */73#if defined(LTC_FAST)74for (x = 0; x < cbc->blocklen; x += sizeof(LTC_FAST_TYPE)) {75*(LTC_FAST_TYPE_PTR_CAST((unsigned char *)cbc->IV + x)) = *(LTC_FAST_TYPE_PTR_CAST((unsigned char *)ct + x));76}77#else78for (x = 0; x < cbc->blocklen; x++) {79cbc->IV[x] = ct[x];80}81#endif8283ct += cbc->blocklen;84pt += cbc->blocklen;85len -= cbc->blocklen;86}87}88return CRYPT_OK;89}9091#endif929394