Fork of François Berder Crypto, fixed AES CBC and small rework

Dependents:   AES_example shaun_larada Smartage

Fork of Crypto by Francois Berder

Committer:
Geremia
Date:
Wed Jan 28 17:55:13 2015 +0000
Revision:
16:4399e2e6260b
Parent:
15:6093fc19aad6
AES: bugfixed CBC, added PCBC (i could add CFB and OFB if needed), added public setIV(), moved keyExpansion() to public, in and out buffers can be the same

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feb11 8:a090264e9b2d 1 #include "BlockCipher.h"
feb11 8:a090264e9b2d 2 #include <string.h>
feb11 8:a090264e9b2d 3
feb11 8:a090264e9b2d 4 BlockCipher::BlockCipher(uint32_t bs, BLOCK_CIPHER_MODE m, uint8_t *iv):
feb11 8:a090264e9b2d 5 Cipher(),
feb11 8:a090264e9b2d 6 blockSize(bs),
feb11 8:a090264e9b2d 7 mode(m),
Geremia 15:6093fc19aad6 8 IV(0),
Geremia 15:6093fc19aad6 9 tmpIV(0),
Geremia 15:6093fc19aad6 10 tmpdata(0)
feb11 8:a090264e9b2d 11 {
Geremia 15:6093fc19aad6 12 if(mode != ECB_MODE)
feb11 8:a090264e9b2d 13 {
feb11 8:a090264e9b2d 14 IV = new uint8_t[blockSize];
Geremia 15:6093fc19aad6 15 tmpIV = new uint8_t[blockSize];
Geremia 15:6093fc19aad6 16 tmpdatain = new uint8_t[blockSize];
Geremia 15:6093fc19aad6 17 tmpdata = new uint8_t[blockSize];
feb11 8:a090264e9b2d 18 memcpy(IV, iv, blockSize);
feb11 8:a090264e9b2d 19 }
feb11 8:a090264e9b2d 20 }
feb11 8:a090264e9b2d 21
feb11 8:a090264e9b2d 22 BlockCipher::~BlockCipher()
feb11 8:a090264e9b2d 23 {
Geremia 15:6093fc19aad6 24 if(IV != 0) delete[] IV;
Geremia 15:6093fc19aad6 25 if(tmpIV != 0) delete[] tmpIV;
Geremia 15:6093fc19aad6 26 if(tmpdatain != 0) delete[] tmpdatain;
Geremia 15:6093fc19aad6 27 if(tmpdata != 0) delete[] tmpdata;
feb11 8:a090264e9b2d 28 }
feb11 8:a090264e9b2d 29
feb11 8:a090264e9b2d 30 CIPHER_TYPE BlockCipher::getType() const
feb11 8:a090264e9b2d 31 {
feb11 8:a090264e9b2d 32 return BLOCK_CIPHER;
feb11 8:a090264e9b2d 33 }
feb11 8:a090264e9b2d 34
feb11 8:a090264e9b2d 35 uint32_t BlockCipher::getBlockSize() const
feb11 8:a090264e9b2d 36 {
feb11 8:a090264e9b2d 37 return blockSize;
feb11 8:a090264e9b2d 38 }
feb11 8:a090264e9b2d 39
feb11 8:a090264e9b2d 40 void BlockCipher::encrypt(uint8_t *out, uint8_t *in, uint32_t length)
feb11 8:a090264e9b2d 41 {
Geremia 15:6093fc19aad6 42
Geremia 15:6093fc19aad6 43 switch (mode)
feb11 8:a090264e9b2d 44 {
Geremia 15:6093fc19aad6 45 case ECB_MODE:
Geremia 15:6093fc19aad6 46 for(uint32_t i = 0; i < length; i += blockSize)
Geremia 15:6093fc19aad6 47 {
Geremia 15:6093fc19aad6 48 encryptBlock(out+i, in+i);
Geremia 15:6093fc19aad6 49 }
Geremia 15:6093fc19aad6 50 break;
Geremia 15:6093fc19aad6 51 case PCBC_MODE:
Geremia 15:6093fc19aad6 52 case CBC_MODE:
Geremia 15:6093fc19aad6 53 memcpy(tmpIV, IV, blockSize);
Geremia 15:6093fc19aad6 54 for(uint32_t i = 0; i < length; i += blockSize)
Geremia 15:6093fc19aad6 55 {
Geremia 15:6093fc19aad6 56 if(mode==PCBC_MODE) memcpy(tmpdata, in+i, blockSize);
Geremia 15:6093fc19aad6 57 memcpy(tmpdatain, in+i, blockSize);
Geremia 15:6093fc19aad6 58 for(int j = 0; j < blockSize; ++j) tmpdatain[j] ^= tmpIV[j];
Geremia 15:6093fc19aad6 59 encryptBlock(out+i, tmpdatain);
Geremia 15:6093fc19aad6 60 memcpy(tmpIV, out+i, blockSize);
Geremia 15:6093fc19aad6 61 if(mode==PCBC_MODE)
Geremia 15:6093fc19aad6 62 {
Geremia 15:6093fc19aad6 63 for(int j = 0; j < blockSize; ++j) tmpIV[j] ^= tmpdata[j];
Geremia 15:6093fc19aad6 64 }
Geremia 15:6093fc19aad6 65 }
Geremia 15:6093fc19aad6 66 break;
feb11 8:a090264e9b2d 67 }
feb11 8:a090264e9b2d 68 }
feb11 8:a090264e9b2d 69
feb11 8:a090264e9b2d 70 void BlockCipher::decrypt(uint8_t *out, uint8_t *in, uint32_t length)
feb11 8:a090264e9b2d 71 {
Geremia 15:6093fc19aad6 72 switch (mode)
feb11 8:a090264e9b2d 73 {
Geremia 15:6093fc19aad6 74 case ECB_MODE:
Geremia 15:6093fc19aad6 75 for(uint32_t i = 0; i < length; i += blockSize)
Geremia 15:6093fc19aad6 76 {
Geremia 15:6093fc19aad6 77 decryptBlock(out+i, in+i);
Geremia 15:6093fc19aad6 78 }
Geremia 15:6093fc19aad6 79 break;
Geremia 15:6093fc19aad6 80 case PCBC_MODE:
Geremia 15:6093fc19aad6 81 case CBC_MODE:
Geremia 15:6093fc19aad6 82 memcpy(tmpIV, IV, blockSize);
Geremia 15:6093fc19aad6 83 for(uint32_t i = 0; i < length; i += blockSize)
Geremia 15:6093fc19aad6 84 {
Geremia 15:6093fc19aad6 85 memcpy(tmpdatain, in+i, blockSize);
Geremia 15:6093fc19aad6 86 decryptBlock(out+i, tmpdatain);
Geremia 15:6093fc19aad6 87 for(int j = 0; j < blockSize; ++j) out[i+j] ^= tmpIV[j];
Geremia 15:6093fc19aad6 88 memcpy(tmpIV, tmpdatain, blockSize);
Geremia 15:6093fc19aad6 89 if(mode==PCBC_MODE)
Geremia 15:6093fc19aad6 90 {
Geremia 15:6093fc19aad6 91 for(int j = 0; j < blockSize; ++j) tmpIV[j] ^= out[i+j];
Geremia 15:6093fc19aad6 92 }
Geremia 15:6093fc19aad6 93 }
Geremia 15:6093fc19aad6 94 break;
feb11 8:a090264e9b2d 95 }
feb11 8:a090264e9b2d 96 }
Geremia 15:6093fc19aad6 97
Geremia 15:6093fc19aad6 98 void BlockCipher::setIV(uint8_t *iv)
Geremia 15:6093fc19aad6 99 {
Geremia 15:6093fc19aad6 100 if(IV!=0) memcpy(IV, iv, blockSize);
Geremia 15:6093fc19aad6 101 }