// ECB Process blocks inline void Mode_BASE::ECB_Process(byte* out, const byte* in, word32 sz) { word32 blocks = sz / blockSz_; while (blocks--) { ProcessAndXorBlock(in, 0, out); out += blockSz_; in += blockSz_; } }
void BlockTransformation::ProcessAndXorMultipleBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, unsigned int numberOfBlocks) const { unsigned int blockSize = BlockSize(); while (numberOfBlocks--) { ProcessAndXorBlock(inBlocks, xorBlocks, outBlocks); inBlocks += blockSize; outBlocks += blockSize; if (xorBlocks) xorBlocks += blockSize; } }
// CBC Encrypt inline void Mode_BASE::CBC_Encrypt(byte* out, const byte* in, word32 sz) { word32 blocks = sz / blockSz_; while (blocks--) { xorbuf(reg_, in, blockSz_); ProcessAndXorBlock(reg_, 0, reg_); memcpy(out, reg_, blockSz_); out += blockSz_; in += blockSz_; } }
size_t BlockTransformation::AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const { CRYPTOPP_ASSERT(inBlocks); CRYPTOPP_ASSERT(outBlocks); CRYPTOPP_ASSERT(length); size_t blockSize = BlockSize(); size_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize; size_t xorIncrement = xorBlocks ? blockSize : 0; size_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize; if (flags & BT_ReverseDirection) { CRYPTOPP_ASSERT(length % blockSize == 0); inBlocks += length - blockSize; xorBlocks += length - blockSize; outBlocks += length - blockSize; inIncrement = 0-inIncrement; xorIncrement = 0-xorIncrement; outIncrement = 0-outIncrement; } while (length >= blockSize) { if (flags & BT_XorInput) { // Coverity finding. However, xorBlocks is never NULL if BT_XorInput. CRYPTOPP_ASSERT(xorBlocks); #if defined(__COVERITY__) if (xorBlocks) #endif xorbuf(outBlocks, xorBlocks, inBlocks, blockSize); ProcessBlock(outBlocks); } else { // xorBlocks can be NULL. See, for example, ECB_OneWay::ProcessData. ProcessAndXorBlock(inBlocks, xorBlocks, outBlocks); } if (flags & BT_InBlockIsCounter) const_cast<byte *>(inBlocks)[blockSize-1]++; inBlocks += inIncrement; outBlocks += outIncrement; xorBlocks += xorIncrement; length -= blockSize; } return length; }
// CBC Decrypt inline void Mode_BASE::CBC_Decrypt(byte* out, const byte* in, word32 sz) { word32 blocks = sz / blockSz_; byte hold[MaxBlockSz]; while (blocks--) { memcpy(tmp_, in, blockSz_); ProcessAndXorBlock(tmp_, 0, out); xorbuf(out, reg_, blockSz_); memcpy(hold, reg_, blockSz_); // swap reg_ and tmp_ memcpy(reg_, tmp_, blockSz_); memcpy(tmp_, hold, blockSz_); out += blockSz_; in += blockSz_; } }
size_t BlockTransformation::AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const { size_t blockSize = BlockSize(); size_t inIncrement = (flags & (BT_InBlockIsCounter|BT_DontIncrementInOutPointers)) ? 0 : blockSize; size_t xorIncrement = xorBlocks ? blockSize : 0; size_t outIncrement = (flags & BT_DontIncrementInOutPointers) ? 0 : blockSize; if (flags & BT_ReverseDirection) { assert(length % blockSize == 0); inBlocks += length - blockSize; xorBlocks += length - blockSize; outBlocks += length - blockSize; inIncrement = 0-inIncrement; xorIncrement = 0-xorIncrement; outIncrement = 0-outIncrement; } while (length >= blockSize) { if (flags & BT_XorInput) { xorbuf(outBlocks, xorBlocks, inBlocks, blockSize); ProcessBlock(outBlocks); } else ProcessAndXorBlock(inBlocks, xorBlocks, outBlocks); if (flags & BT_InBlockIsCounter) const_cast<byte *>(inBlocks)[blockSize-1]++; inBlocks += inIncrement; outBlocks += outIncrement; xorBlocks += xorIncrement; length -= blockSize; } return length; }