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

Dependents:   AES_example shaun_larada Smartage

Fork of Crypto by Francois Berder

Files at this revision

API Documentation at this revision

Comitter:
feb11
Date:
Sun May 11 13:36:45 2014 +0000
Parent:
13:ac8e23b98dae
Child:
15:6093fc19aad6
Commit message:
CBC mode completed

Changed in this revision

cipher/BlockCipher.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/cipher/BlockCipher.cpp	Sun May 11 11:14:51 2014 +0000
+++ b/cipher/BlockCipher.cpp	Sun May 11 13:36:45 2014 +0000
@@ -32,19 +32,41 @@
 
 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())
     {
-        encryptBlock(&out[i], &in[i]);
+        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]);
     }
+    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())
     {
-        decryptBlock(&out[i], &in[i]);
+        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]);
     }
 }
-