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

Dependents:   AES_example shaun_larada Smartage

Fork of Crypto by Francois Berder

Revision:
5:06cd9c8afa0b
Parent:
4:0da19393bd57
Child:
6:19aa835f2bbb
diff -r 0da19393bd57 -r 06cd9c8afa0b SHA2_64.cpp
--- a/SHA2_64.cpp	Thu Sep 12 10:18:57 2013 +0000
+++ b/SHA2_64.cpp	Thu Sep 12 15:08:51 2013 +0000
@@ -15,8 +15,8 @@
 
 static uint64_t revWord(uint64_t w)
 {
-    return __rev((w & 0xFFFFFFFF00000000) >> 32) 
-         | ((uint64_t)(__rev(w & 0x00000000FFFFFFFF)) << 32);
+    return __rev(w >> 32) 
+         | ((uint64_t)(__rev(w)) << 32);
 }
 
 #define ROTL(W,N) (((W) << (N)) | ((W) >> (64-(N))))
@@ -65,7 +65,7 @@
     }
 }
 
-void SHA2_64::add(uint8_t *in, uint32_t length)
+void SHA2_64::update(uint8_t *in, uint32_t length)
 {
     if(length < 128-bufferLength)
     {
@@ -90,24 +90,31 @@
     totalBufferLength += length;
 }
 
-void SHA2_64::computeDigest(uint8_t *digest)
+void SHA2_64::finalize(uint8_t *digest)
 {
-    uint16_t padding;
+    uint64_t lengthBit = totalBufferLength << 3;
+    uint32_t padding;
     if(totalBufferLength % 128 < 112)
         padding = 112 - (totalBufferLength % 128);
     else
         padding = 112 + (128 - (totalBufferLength % 128));
-    uint8_t val = 0x80;
-    add(&val, 1);
-    val = 0;
-    for(int i = 0; i < padding-1; ++i)
-        add(&val,1);
-    totalBufferLength -= padding;
-    uint64_t lengthBit = 0;
-    add((uint8_t*)&lengthBit, 8);
-    lengthBit = (totalBufferLength - 8) * 8;
+
+    buffer[bufferLength++] = 0x80;
+    padding--;
+    if(padding+bufferLength == 112)
+        memset(&buffer[bufferLength], 0, padding);
+    else
+    {
+        memset(&buffer[bufferLength], 0, 64-bufferLength);
+        computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, buffer);
+        memset(buffer, 0, 112);
+    }
+    
     lengthBit = revWord(lengthBit);
-    add((uint8_t*)&lengthBit, 8);
+    memcpy(&buffer[120], &lengthBit, 8);    
+    memset(&buffer[112], 0, 8);    
+    computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, buffer);
+
 
     h0 = revWord(h0);
     h1 = revWord(h1);
@@ -330,7 +337,7 @@
     {
         memset(&buffer[length], 0, 128-length);
         computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, buffer);
-        memset(buffer, 0, length);
+        memset(buffer, 0, 112);
     }
     
     lengthBit = revWord(lengthBit);