Fork of François Berder Crypto, fixed AES CBC and small rework
Dependents: AES_example shaun_larada Smartage
Fork of Crypto by
Diff: cipher/BlockCipher.cpp
- Revision:
- 15:6093fc19aad6
- Parent:
- 14:f04410cef037
- Child:
- 16:4399e2e6260b
diff -r f04410cef037 -r 6093fc19aad6 cipher/BlockCipher.cpp --- a/cipher/BlockCipher.cpp Sun May 11 13:36:45 2014 +0000 +++ b/cipher/BlockCipher.cpp Wed Jan 28 17:15:32 2015 +0000 @@ -5,19 +5,26 @@ Cipher(), blockSize(bs), mode(m), -IV(0) +IV(0), +tmpIV(0), +tmpdata(0) { - if(mode == CBC_MODE) + if(mode != ECB_MODE) { IV = new uint8_t[blockSize]; + tmpIV = new uint8_t[blockSize]; + tmpdatain = new uint8_t[blockSize]; + tmpdata = new uint8_t[blockSize]; memcpy(IV, iv, blockSize); } } BlockCipher::~BlockCipher() { - if(IV != 0) - delete[] IV; + if(IV != 0) delete[] IV; + if(tmpIV != 0) delete[] tmpIV; + if(tmpdatain != 0) delete[] tmpdatain; + if(tmpdata != 0) delete[] tmpdata; } CIPHER_TYPE BlockCipher::getType() const @@ -32,41 +39,64 @@ void BlockCipher::encrypt(uint8_t *out, uint8_t *in, uint32_t length) { - uint8_t *tmp = 0; - if(mode == CBC_MODE) - tmp = new uint8_t[getBlockSize()]; - for(uint32_t i = 0; i < length; i += getBlockSize()) + + switch (mode) { - if(mode == CBC_MODE) - { - memcpy(tmp, &in[i], getBlockSize()); - for(int j = 0; j < (int)getBlockSize(); ++j) - tmp[j] ^= IV[j]; - - encryptBlock(&out[i], tmp); - - memcpy(IV, &out[i], getBlockSize()); - } - else - encryptBlock(&out[i], &in[i]); + case ECB_MODE: + for(uint32_t i = 0; i < length; i += blockSize) + { + encryptBlock(out+i, in+i); + } + break; + case PCBC_MODE: + case CBC_MODE: + memcpy(tmpIV, IV, blockSize); + for(uint32_t i = 0; i < length; i += blockSize) + { + if(mode==PCBC_MODE) memcpy(tmpdata, in+i, blockSize); + memcpy(tmpdatain, in+i, blockSize); + for(int j = 0; j < blockSize; ++j) tmpdatain[j] ^= tmpIV[j]; + encryptBlock(out+i, tmpdatain); + memcpy(tmpIV, out+i, blockSize); + if(mode==PCBC_MODE) + { + for(int j = 0; j < blockSize; ++j) tmpIV[j] ^= tmpdata[j]; + } + } + break; } - if(mode == CBC_MODE) - delete[] tmp; } void BlockCipher::decrypt(uint8_t *out, uint8_t *in, uint32_t length) { - for(uint32_t i = 0; i < length; i += getBlockSize()) + switch (mode) { - if(mode == CBC_MODE) - { - decryptBlock(&out[i], &in[i]); - for(int j = 0; j < (int)getBlockSize(); ++j) - out[i+j] ^= IV[j]; - - memcpy(IV, &in[i], getBlockSize()); - } - else - decryptBlock(&out[i], &in[i]); + case ECB_MODE: + for(uint32_t i = 0; i < length; i += blockSize) + { + decryptBlock(out+i, in+i); + } + break; + case PCBC_MODE: + case CBC_MODE: + memcpy(tmpIV, IV, blockSize); + for(uint32_t i = 0; i < length; i += blockSize) + { + // if(mode==PCBC_MODE) memcpy(tmpdata, in+i, blockSize); + memcpy(tmpdatain, in+i, blockSize); + decryptBlock(out+i, tmpdatain); + for(int j = 0; j < blockSize; ++j) out[i+j] ^= tmpIV[j]; + memcpy(tmpIV, tmpdatain, blockSize); + if(mode==PCBC_MODE) + { + for(int j = 0; j < blockSize; ++j) tmpIV[j] ^= out[i+j]; + } + } + break; } } + +void BlockCipher::setIV(uint8_t *iv) +{ + if(IV!=0) memcpy(IV, iv, blockSize); +}