This library implements some hash and cryptographic algorithms.

Dependents:   mBuinoBlinky PB_Emma_Ethernet SLOTrashHTTP Garagem ... more

This library implements the following algorithms :

  • RC4
  • AES (AES-128, AES-192, AES-256)
  • DES
  • Triple DES (EDE)
  • MD2
  • MD4
  • MD5
  • SHA-1
  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)

The hash algorithms have been optimized for the mbed and you should get decent performance. However, I did not optimize the ciphers. Also, I did not test extensively these algorithms : it should work but you may find some bugs. Block ciphers support two modes : ECB and CBC.

Warning

If you are using SHA-384 or SHA-512, be aware that it produces large binary files and the compilation (using the online compiler) takes much longer to execute. It may happen that the compiler stops because it timed-out. In this case, just compile again and it should work.

Computing hash

You can compute the hash of some data in two different ways. The first one is the easiest, each hash algorithm has a static method that takes some data and compute the hash from it.

Computing hash using method 1

#include "Crypto.h"
#include "mbed.h"

static const char msg[] = "mbed is great !";

int main()
{
    uint8_t hash[16];
    MD2::computeHash(hash, (uint8_t*)msg, strlen(msg));
    printf("hash: ");
    for(int i = 0; i < 16; ++i)
        printf("%02x", hash[i]);
    printf("\n");
    
    return 0;
}

The second one is slightly slower (around 2-3% slower) but it allows you to compute the hash of some data in several steps (by calling update method). This is the method you should use if you need to compute the hash from a large source and you don't have enough memory to store it in a single buffer.

Computing hash using method 2

#include "Crypto.h"
#include "mbed.h"

static const char msg[] = "mbed is great !";

int main()
{
    uint8_t hash[16];
    MD2 h;
    h.update((uint8_t*)msg, strlen(msg));
    h.finalize(hash);
    printf("hash: ");
    for(int i = 0; i < 16; ++i)
        printf("%02x", hash[i]);
    printf("\n");
    
    return 0;
}

TODO

  • optimize ciphers
  • add doc
Committer:
feb11
Date:
Thu Sep 12 15:08:51 2013 +0000
Revision:
5:06cd9c8afa0b
Parent:
4:0da19393bd57
Child:
6:19aa835f2bbb
change API & small improvements in SHA-2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feb11 0:7a1237bd2d13 1 #include "SHA2_64.h"
feb11 0:7a1237bd2d13 2 #include <string.h>
feb11 0:7a1237bd2d13 3
feb11 0:7a1237bd2d13 4
feb11 0:7a1237bd2d13 5 static const uint64_t H[] =
feb11 0:7a1237bd2d13 6 {
feb11 0:7a1237bd2d13 7 // SHA-384
feb11 0:7a1237bd2d13 8 0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939,
feb11 0:7a1237bd2d13 9 0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4,
feb11 0:7a1237bd2d13 10
feb11 0:7a1237bd2d13 11 // SHA-512
feb11 0:7a1237bd2d13 12 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
feb11 0:7a1237bd2d13 13 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
feb11 0:7a1237bd2d13 14 };
feb11 0:7a1237bd2d13 15
feb11 0:7a1237bd2d13 16 static uint64_t revWord(uint64_t w)
feb11 0:7a1237bd2d13 17 {
feb11 5:06cd9c8afa0b 18 return __rev(w >> 32)
feb11 5:06cd9c8afa0b 19 | ((uint64_t)(__rev(w)) << 32);
feb11 0:7a1237bd2d13 20 }
feb11 0:7a1237bd2d13 21
feb11 3:85c6ee25cf3e 22 #define ROTL(W,N) (((W) << (N)) | ((W) >> (64-(N))))
feb11 3:85c6ee25cf3e 23 #define ROTR(W,N) (((W) >> (N)) | ((W) << (64-(N))))
feb11 3:85c6ee25cf3e 24 #define CH(X,Y,Z) (((X) & (Y)) ^ ((~(X)) & (Z)))
feb11 3:85c6ee25cf3e 25 #define MAJ(X,Y,Z) (((X) & (Y)) ^ ((X) & (Z)) ^ ((Y) & (Z)))
feb11 3:85c6ee25cf3e 26 #define BSIG0(X) (ROTR(X,28) ^ ROTR(X,34) ^ ROTR(X,39))
feb11 3:85c6ee25cf3e 27 #define BSIG1(X) (ROTR(X,14) ^ ROTR(X,18) ^ ROTR(X,41))
feb11 3:85c6ee25cf3e 28 #define SSIG0(X) (ROTR((X),1) ^ ROTR((X),8) ^ ((X) >> 7))
feb11 3:85c6ee25cf3e 29 #define SSIG1(X) (ROTR((X),19) ^ ROTR((X),61) ^ ((X) >> 6))
feb11 0:7a1237bd2d13 30
feb11 4:0da19393bd57 31 #define R(A,B,C,D,E,F,G,H,K,T) T1 = H + BSIG1(E) + CH(E,F,G) + K + w[T]; \
feb11 4:0da19393bd57 32 T2 = BSIG0(A) + MAJ(A,B,C); \
feb11 4:0da19393bd57 33 D += T1; \
feb11 4:0da19393bd57 34 H = T1 + T2;
feb11 4:0da19393bd57 35
feb11 0:7a1237bd2d13 36
feb11 0:7a1237bd2d13 37 SHA2_64::SHA2_64(SHA2_64_TYPE t):
feb11 0:7a1237bd2d13 38 type(t),
feb11 0:7a1237bd2d13 39 totalBufferLength(0),
feb11 0:7a1237bd2d13 40 bufferLength(0)
feb11 0:7a1237bd2d13 41 {
feb11 0:7a1237bd2d13 42 switch(type)
feb11 0:7a1237bd2d13 43 {
feb11 0:7a1237bd2d13 44 case SHA_384:
feb11 0:7a1237bd2d13 45 h0 = H[0];
feb11 0:7a1237bd2d13 46 h1 = H[1];
feb11 0:7a1237bd2d13 47 h2 = H[2];
feb11 0:7a1237bd2d13 48 h3 = H[3];
feb11 0:7a1237bd2d13 49 h4 = H[4];
feb11 0:7a1237bd2d13 50 h5 = H[5];
feb11 0:7a1237bd2d13 51 h6 = H[6];
feb11 0:7a1237bd2d13 52 h7 = H[7];
feb11 0:7a1237bd2d13 53 break;
feb11 0:7a1237bd2d13 54
feb11 0:7a1237bd2d13 55 case SHA_512:
feb11 0:7a1237bd2d13 56 h0 = H[8];
feb11 0:7a1237bd2d13 57 h1 = H[9];
feb11 0:7a1237bd2d13 58 h2 = H[10];
feb11 0:7a1237bd2d13 59 h3 = H[11];
feb11 0:7a1237bd2d13 60 h4 = H[12];
feb11 0:7a1237bd2d13 61 h5 = H[13];
feb11 0:7a1237bd2d13 62 h6 = H[14];
feb11 0:7a1237bd2d13 63 h7 = H[15];
feb11 0:7a1237bd2d13 64 break;
feb11 0:7a1237bd2d13 65 }
feb11 0:7a1237bd2d13 66 }
feb11 0:7a1237bd2d13 67
feb11 5:06cd9c8afa0b 68 void SHA2_64::update(uint8_t *in, uint32_t length)
feb11 0:7a1237bd2d13 69 {
feb11 0:7a1237bd2d13 70 if(length < 128-bufferLength)
feb11 0:7a1237bd2d13 71 {
feb11 0:7a1237bd2d13 72 memcpy(&buffer[bufferLength], in, length);
feb11 0:7a1237bd2d13 73 bufferLength += length;
feb11 0:7a1237bd2d13 74 totalBufferLength += length;
feb11 0:7a1237bd2d13 75 return;
feb11 0:7a1237bd2d13 76 }
feb11 0:7a1237bd2d13 77 int offset = 128-bufferLength;
feb11 0:7a1237bd2d13 78 memcpy(&buffer[bufferLength], in, offset);
feb11 0:7a1237bd2d13 79 computeBlock(&h0,&h1,&h2,&h3,&h4,&h5,&h6,&h7,buffer);
feb11 0:7a1237bd2d13 80 while(length-offset > 128)
feb11 0:7a1237bd2d13 81 {
feb11 0:7a1237bd2d13 82 memcpy(buffer, &in[offset], 128);
feb11 0:7a1237bd2d13 83 computeBlock(&h0,&h1,&h2,&h3,&h4,&h5,&h6,&h7,buffer);
feb11 0:7a1237bd2d13 84 offset += 128;
feb11 0:7a1237bd2d13 85 }
feb11 0:7a1237bd2d13 86 if(offset > length)
feb11 0:7a1237bd2d13 87 offset -= 128;
feb11 0:7a1237bd2d13 88 bufferLength = length - offset;
feb11 0:7a1237bd2d13 89 memcpy(buffer, &in[offset], bufferLength);
feb11 0:7a1237bd2d13 90 totalBufferLength += length;
feb11 0:7a1237bd2d13 91 }
feb11 0:7a1237bd2d13 92
feb11 5:06cd9c8afa0b 93 void SHA2_64::finalize(uint8_t *digest)
feb11 0:7a1237bd2d13 94 {
feb11 5:06cd9c8afa0b 95 uint64_t lengthBit = totalBufferLength << 3;
feb11 5:06cd9c8afa0b 96 uint32_t padding;
feb11 0:7a1237bd2d13 97 if(totalBufferLength % 128 < 112)
feb11 0:7a1237bd2d13 98 padding = 112 - (totalBufferLength % 128);
feb11 0:7a1237bd2d13 99 else
feb11 0:7a1237bd2d13 100 padding = 112 + (128 - (totalBufferLength % 128));
feb11 5:06cd9c8afa0b 101
feb11 5:06cd9c8afa0b 102 buffer[bufferLength++] = 0x80;
feb11 5:06cd9c8afa0b 103 padding--;
feb11 5:06cd9c8afa0b 104 if(padding+bufferLength == 112)
feb11 5:06cd9c8afa0b 105 memset(&buffer[bufferLength], 0, padding);
feb11 5:06cd9c8afa0b 106 else
feb11 5:06cd9c8afa0b 107 {
feb11 5:06cd9c8afa0b 108 memset(&buffer[bufferLength], 0, 64-bufferLength);
feb11 5:06cd9c8afa0b 109 computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, buffer);
feb11 5:06cd9c8afa0b 110 memset(buffer, 0, 112);
feb11 5:06cd9c8afa0b 111 }
feb11 5:06cd9c8afa0b 112
feb11 0:7a1237bd2d13 113 lengthBit = revWord(lengthBit);
feb11 5:06cd9c8afa0b 114 memcpy(&buffer[120], &lengthBit, 8);
feb11 5:06cd9c8afa0b 115 memset(&buffer[112], 0, 8);
feb11 5:06cd9c8afa0b 116 computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, buffer);
feb11 5:06cd9c8afa0b 117
feb11 0:7a1237bd2d13 118
feb11 0:7a1237bd2d13 119 h0 = revWord(h0);
feb11 0:7a1237bd2d13 120 h1 = revWord(h1);
feb11 0:7a1237bd2d13 121 h2 = revWord(h2);
feb11 0:7a1237bd2d13 122 h3 = revWord(h3);
feb11 0:7a1237bd2d13 123 h4 = revWord(h4);
feb11 0:7a1237bd2d13 124 h5 = revWord(h5);
feb11 0:7a1237bd2d13 125
feb11 0:7a1237bd2d13 126
feb11 0:7a1237bd2d13 127 memcpy(digest, &h0, 8);
feb11 0:7a1237bd2d13 128 memcpy(&digest[8], &h1, 8);
feb11 0:7a1237bd2d13 129 memcpy(&digest[16], &h2, 8);
feb11 0:7a1237bd2d13 130 memcpy(&digest[24], &h3, 8);
feb11 0:7a1237bd2d13 131 memcpy(&digest[32], &h4, 8);
feb11 0:7a1237bd2d13 132 memcpy(&digest[40], &h5, 8);
feb11 0:7a1237bd2d13 133
feb11 0:7a1237bd2d13 134 if(type == SHA_512)
feb11 0:7a1237bd2d13 135 {
feb11 0:7a1237bd2d13 136 h6 = revWord(h6);
feb11 0:7a1237bd2d13 137 h7 = revWord(h7);
feb11 0:7a1237bd2d13 138 memcpy(&digest[48], &h6, 8);
feb11 0:7a1237bd2d13 139 memcpy(&digest[56], &h7, 8);
feb11 0:7a1237bd2d13 140 }
feb11 0:7a1237bd2d13 141
feb11 0:7a1237bd2d13 142 // reset state
feb11 0:7a1237bd2d13 143 switch(type)
feb11 0:7a1237bd2d13 144 {
feb11 0:7a1237bd2d13 145 case SHA_384:
feb11 0:7a1237bd2d13 146 h0 = H[0];
feb11 0:7a1237bd2d13 147 h1 = H[1];
feb11 0:7a1237bd2d13 148 h2 = H[2];
feb11 0:7a1237bd2d13 149 h3 = H[3];
feb11 0:7a1237bd2d13 150 h4 = H[4];
feb11 0:7a1237bd2d13 151 h5 = H[5];
feb11 0:7a1237bd2d13 152 h6 = H[6];
feb11 0:7a1237bd2d13 153 h7 = H[7];
feb11 0:7a1237bd2d13 154 break;
feb11 0:7a1237bd2d13 155
feb11 0:7a1237bd2d13 156 case SHA_512:
feb11 0:7a1237bd2d13 157 h0 = H[8];
feb11 0:7a1237bd2d13 158 h1 = H[9];
feb11 0:7a1237bd2d13 159 h2 = H[10];
feb11 0:7a1237bd2d13 160 h3 = H[11];
feb11 0:7a1237bd2d13 161 h4 = H[12];
feb11 0:7a1237bd2d13 162 h5 = H[13];
feb11 0:7a1237bd2d13 163 h6 = H[14];
feb11 0:7a1237bd2d13 164 h7 = H[15];
feb11 0:7a1237bd2d13 165 break;
feb11 0:7a1237bd2d13 166 }
feb11 0:7a1237bd2d13 167 totalBufferLength = 0;
feb11 0:7a1237bd2d13 168 bufferLength = 0;
feb11 0:7a1237bd2d13 169 }
feb11 0:7a1237bd2d13 170
feb11 0:7a1237bd2d13 171 void SHA2_64::computeBlock(uint64_t *h02,
feb11 0:7a1237bd2d13 172 uint64_t *h12,
feb11 0:7a1237bd2d13 173 uint64_t *h22,
feb11 0:7a1237bd2d13 174 uint64_t *h32,
feb11 0:7a1237bd2d13 175 uint64_t *h42,
feb11 0:7a1237bd2d13 176 uint64_t *h52,
feb11 0:7a1237bd2d13 177 uint64_t *h62,
feb11 0:7a1237bd2d13 178 uint64_t *h72,
feb11 0:7a1237bd2d13 179 uint8_t *buffer)
feb11 0:7a1237bd2d13 180 {
feb11 0:7a1237bd2d13 181 uint64_t w[80];
feb11 4:0da19393bd57 182 uint64_t *buffer2 = (uint64_t*)buffer;
feb11 4:0da19393bd57 183
feb11 4:0da19393bd57 184 w[0] = revWord(buffer2[0]);
feb11 4:0da19393bd57 185 w[1] = revWord(buffer2[1]);
feb11 4:0da19393bd57 186 w[2] = revWord(buffer2[2]);
feb11 4:0da19393bd57 187 w[3] = revWord(buffer2[3]);
feb11 4:0da19393bd57 188 w[4] = revWord(buffer2[4]);
feb11 4:0da19393bd57 189 w[5] = revWord(buffer2[5]);
feb11 4:0da19393bd57 190 w[6] = revWord(buffer2[6]);
feb11 4:0da19393bd57 191 w[7] = revWord(buffer2[7]);
feb11 4:0da19393bd57 192 w[8] = revWord(buffer2[8]);
feb11 4:0da19393bd57 193 w[9] = revWord(buffer2[9]);
feb11 4:0da19393bd57 194 w[10] = revWord(buffer2[10]);
feb11 4:0da19393bd57 195 w[11] = revWord(buffer2[11]);
feb11 4:0da19393bd57 196 w[12] = revWord(buffer2[12]);
feb11 4:0da19393bd57 197 w[13] = revWord(buffer2[13]);
feb11 4:0da19393bd57 198 w[14] = revWord(buffer2[14]);
feb11 4:0da19393bd57 199 w[15] = revWord(buffer2[15]);
feb11 4:0da19393bd57 200
feb11 0:7a1237bd2d13 201 for(int t = 16; t < 80; ++t)
feb11 0:7a1237bd2d13 202 w[t] = SSIG1(w[t-2]) + w[t-7] + SSIG0(w[t-15]) + w[t-16];
feb11 0:7a1237bd2d13 203
feb11 0:7a1237bd2d13 204 uint64_t a = *h02, b = *h12, c = *h22, d = *h32, e = *h42, f = *h52, g = *h62, h = *h72;
feb11 4:0da19393bd57 205 uint64_t T1, T2;
feb11 4:0da19393bd57 206
feb11 4:0da19393bd57 207
feb11 4:0da19393bd57 208 R(a,b,c,d,e,f,g,h,0x428a2f98d728ae22,0)
feb11 4:0da19393bd57 209 R(h,a,b,c,d,e,f,g,0x7137449123ef65cd,1)
feb11 4:0da19393bd57 210 R(g,h,a,b,c,d,e,f,0xb5c0fbcfec4d3b2f,2)
feb11 4:0da19393bd57 211 R(f,g,h,a,b,c,d,e,0xe9b5dba58189dbbc,3)
feb11 4:0da19393bd57 212 R(e,f,g,h,a,b,c,d,0x3956c25bf348b538,4)
feb11 4:0da19393bd57 213 R(d,e,f,g,h,a,b,c,0x59f111f1b605d019,5)
feb11 4:0da19393bd57 214 R(c,d,e,f,g,h,a,b,0x923f82a4af194f9b,6)
feb11 4:0da19393bd57 215 R(b,c,d,e,f,g,h,a,0xab1c5ed5da6d8118,7)
feb11 4:0da19393bd57 216
feb11 4:0da19393bd57 217 R(a,b,c,d,e,f,g,h,0xd807aa98a3030242,8)
feb11 4:0da19393bd57 218 R(h,a,b,c,d,e,f,g,0x12835b0145706fbe,9)
feb11 4:0da19393bd57 219 R(g,h,a,b,c,d,e,f,0x243185be4ee4b28c,10)
feb11 4:0da19393bd57 220 R(f,g,h,a,b,c,d,e,0x550c7dc3d5ffb4e2,11)
feb11 4:0da19393bd57 221 R(e,f,g,h,a,b,c,d,0x72be5d74f27b896f,12)
feb11 4:0da19393bd57 222 R(d,e,f,g,h,a,b,c,0x80deb1fe3b1696b1,13)
feb11 4:0da19393bd57 223 R(c,d,e,f,g,h,a,b,0x9bdc06a725c71235,14)
feb11 4:0da19393bd57 224 R(b,c,d,e,f,g,h,a,0xc19bf174cf692694,15)
feb11 4:0da19393bd57 225
feb11 4:0da19393bd57 226
feb11 4:0da19393bd57 227 R(a,b,c,d,e,f,g,h,0xe49b69c19ef14ad2,16)
feb11 4:0da19393bd57 228 R(h,a,b,c,d,e,f,g,0xefbe4786384f25e3,17)
feb11 4:0da19393bd57 229 R(g,h,a,b,c,d,e,f,0x0fc19dc68b8cd5b5,18)
feb11 4:0da19393bd57 230 R(f,g,h,a,b,c,d,e,0x240ca1cc77ac9c65,19)
feb11 4:0da19393bd57 231 R(e,f,g,h,a,b,c,d,0x2de92c6f592b0275,20)
feb11 4:0da19393bd57 232 R(d,e,f,g,h,a,b,c,0x4a7484aa6ea6e483,21)
feb11 4:0da19393bd57 233 R(c,d,e,f,g,h,a,b,0x5cb0a9dcbd41fbd4,22)
feb11 4:0da19393bd57 234 R(b,c,d,e,f,g,h,a,0x76f988da831153b5,23)
feb11 4:0da19393bd57 235
feb11 4:0da19393bd57 236 R(a,b,c,d,e,f,g,h,0x983e5152ee66dfab,24)
feb11 4:0da19393bd57 237 R(h,a,b,c,d,e,f,g,0xa831c66d2db43210,25)
feb11 4:0da19393bd57 238 R(g,h,a,b,c,d,e,f,0xb00327c898fb213f,26)
feb11 4:0da19393bd57 239 R(f,g,h,a,b,c,d,e,0xbf597fc7beef0ee4,27)
feb11 4:0da19393bd57 240 R(e,f,g,h,a,b,c,d,0xc6e00bf33da88fc2,28)
feb11 4:0da19393bd57 241 R(d,e,f,g,h,a,b,c,0xd5a79147930aa725,29)
feb11 4:0da19393bd57 242 R(c,d,e,f,g,h,a,b,0x06ca6351e003826f,30)
feb11 4:0da19393bd57 243 R(b,c,d,e,f,g,h,a,0x142929670a0e6e70,31)
feb11 4:0da19393bd57 244
feb11 4:0da19393bd57 245
feb11 4:0da19393bd57 246 R(a,b,c,d,e,f,g,h,0x27b70a8546d22ffc,32)
feb11 4:0da19393bd57 247 R(h,a,b,c,d,e,f,g,0x2e1b21385c26c926,33)
feb11 4:0da19393bd57 248 R(g,h,a,b,c,d,e,f,0x4d2c6dfc5ac42aed,34)
feb11 4:0da19393bd57 249 R(f,g,h,a,b,c,d,e,0x53380d139d95b3df,35)
feb11 4:0da19393bd57 250 R(e,f,g,h,a,b,c,d,0x650a73548baf63de,36)
feb11 4:0da19393bd57 251 R(d,e,f,g,h,a,b,c,0x766a0abb3c77b2a8,37)
feb11 4:0da19393bd57 252 R(c,d,e,f,g,h,a,b,0x81c2c92e47edaee6,38)
feb11 4:0da19393bd57 253 R(b,c,d,e,f,g,h,a,0x92722c851482353b,39)
feb11 4:0da19393bd57 254
feb11 4:0da19393bd57 255 R(a,b,c,d,e,f,g,h,0xa2bfe8a14cf10364,40)
feb11 4:0da19393bd57 256 R(h,a,b,c,d,e,f,g,0xa81a664bbc423001,41)
feb11 4:0da19393bd57 257 R(g,h,a,b,c,d,e,f,0xc24b8b70d0f89791,42)
feb11 4:0da19393bd57 258 R(f,g,h,a,b,c,d,e,0xc76c51a30654be30,43)
feb11 4:0da19393bd57 259 R(e,f,g,h,a,b,c,d,0xd192e819d6ef5218,44)
feb11 4:0da19393bd57 260 R(d,e,f,g,h,a,b,c,0xd69906245565a910,45)
feb11 4:0da19393bd57 261 R(c,d,e,f,g,h,a,b,0xf40e35855771202a,46)
feb11 4:0da19393bd57 262 R(b,c,d,e,f,g,h,a,0x106aa07032bbd1b8,47)
feb11 4:0da19393bd57 263
feb11 4:0da19393bd57 264 R(a,b,c,d,e,f,g,h,0x19a4c116b8d2d0c8,48)
feb11 4:0da19393bd57 265 R(h,a,b,c,d,e,f,g,0x1e376c085141ab53,49)
feb11 4:0da19393bd57 266 R(g,h,a,b,c,d,e,f,0x2748774cdf8eeb99,50)
feb11 4:0da19393bd57 267 R(f,g,h,a,b,c,d,e,0x34b0bcb5e19b48a8,51)
feb11 4:0da19393bd57 268 R(e,f,g,h,a,b,c,d,0x391c0cb3c5c95a63,52)
feb11 4:0da19393bd57 269 R(d,e,f,g,h,a,b,c,0x4ed8aa4ae3418acb,53)
feb11 4:0da19393bd57 270 R(c,d,e,f,g,h,a,b,0x5b9cca4f7763e373,54)
feb11 4:0da19393bd57 271 R(b,c,d,e,f,g,h,a,0x682e6ff3d6b2b8a3,55)
feb11 4:0da19393bd57 272
feb11 4:0da19393bd57 273 R(a,b,c,d,e,f,g,h,0x748f82ee5defb2fc,56)
feb11 4:0da19393bd57 274 R(h,a,b,c,d,e,f,g,0x78a5636f43172f60,57)
feb11 4:0da19393bd57 275 R(g,h,a,b,c,d,e,f,0x84c87814a1f0ab72,58)
feb11 4:0da19393bd57 276 R(f,g,h,a,b,c,d,e,0x8cc702081a6439ec,59)
feb11 4:0da19393bd57 277 R(e,f,g,h,a,b,c,d,0x90befffa23631e28,60)
feb11 4:0da19393bd57 278 R(d,e,f,g,h,a,b,c,0xa4506cebde82bde9,61)
feb11 4:0da19393bd57 279 R(c,d,e,f,g,h,a,b,0xbef9a3f7b2c67915,62)
feb11 4:0da19393bd57 280 R(b,c,d,e,f,g,h,a,0xc67178f2e372532b,63)
feb11 4:0da19393bd57 281
feb11 4:0da19393bd57 282 R(a,b,c,d,e,f,g,h,0xca273eceea26619c,64)
feb11 4:0da19393bd57 283 R(h,a,b,c,d,e,f,g,0xd186b8c721c0c207,65)
feb11 4:0da19393bd57 284 R(g,h,a,b,c,d,e,f,0xeada7dd6cde0eb1e,66)
feb11 4:0da19393bd57 285 R(f,g,h,a,b,c,d,e,0xf57d4f7fee6ed178,67)
feb11 4:0da19393bd57 286 R(e,f,g,h,a,b,c,d,0x06f067aa72176fba,68)
feb11 4:0da19393bd57 287 R(d,e,f,g,h,a,b,c,0x0a637dc5a2c898a6,69)
feb11 4:0da19393bd57 288 R(c,d,e,f,g,h,a,b,0x113f9804bef90dae,70)
feb11 4:0da19393bd57 289 R(b,c,d,e,f,g,h,a,0x1b710b35131c471b,71)
feb11 4:0da19393bd57 290
feb11 4:0da19393bd57 291 R(a,b,c,d,e,f,g,h,0x28db77f523047d84,72)
feb11 4:0da19393bd57 292 R(h,a,b,c,d,e,f,g,0x32caab7b40c72493,73)
feb11 4:0da19393bd57 293 R(g,h,a,b,c,d,e,f,0x3c9ebe0a15c9bebc,74)
feb11 4:0da19393bd57 294 R(f,g,h,a,b,c,d,e,0x431d67c49c100d4c,75)
feb11 4:0da19393bd57 295 R(e,f,g,h,a,b,c,d,0x4cc5d4becb3e42b6,76)
feb11 4:0da19393bd57 296 R(d,e,f,g,h,a,b,c,0x597f299cfc657e2a,77)
feb11 4:0da19393bd57 297 R(c,d,e,f,g,h,a,b,0x5fcb6fab3ad6faec,78)
feb11 4:0da19393bd57 298 R(b,c,d,e,f,g,h,a,0x6c44198c4a475817,79)
feb11 4:0da19393bd57 299
feb11 0:7a1237bd2d13 300 *h02 += a;
feb11 0:7a1237bd2d13 301 *h12 += b;
feb11 0:7a1237bd2d13 302 *h22 += c;
feb11 0:7a1237bd2d13 303 *h32 += d;
feb11 0:7a1237bd2d13 304 *h42 += e;
feb11 0:7a1237bd2d13 305 *h52 += f;
feb11 0:7a1237bd2d13 306 *h62 += g;
feb11 0:7a1237bd2d13 307 *h72 += h;
feb11 0:7a1237bd2d13 308 }
feb11 0:7a1237bd2d13 309
feb11 0:7a1237bd2d13 310 void SHA2_64::computeDigest(SHA2_64_TYPE type, uint8_t *digest, uint8_t *in, uint32_t length)
feb11 0:7a1237bd2d13 311 {
feb11 3:85c6ee25cf3e 312 uint64_t lengthBit = length * 8;
feb11 0:7a1237bd2d13 313 uint64_t h0 = H[type*8], h1 = H[type*8+1], h2 = H[type*8+2], h3 = H[type*8+3];
feb11 0:7a1237bd2d13 314 uint64_t h4 = H[type*8+4], h5 = H[type*8+5], h6 = H[type*8+6], h7 = H[type*8+7];
feb11 3:85c6ee25cf3e 315
feb11 3:85c6ee25cf3e 316 int padding;
feb11 0:7a1237bd2d13 317 if(length % 128 < 112)
feb11 0:7a1237bd2d13 318 padding = 112 - (length % 128);
feb11 0:7a1237bd2d13 319 else
feb11 0:7a1237bd2d13 320 padding = 112 + (128 - (length % 128));
feb11 3:85c6ee25cf3e 321
feb11 3:85c6ee25cf3e 322 while(length >= 128)
feb11 0:7a1237bd2d13 323 {
feb11 3:85c6ee25cf3e 324 computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, in);
feb11 3:85c6ee25cf3e 325 in += 128;
feb11 3:85c6ee25cf3e 326 length -= 128;
feb11 0:7a1237bd2d13 327 }
feb11 3:85c6ee25cf3e 328 uint8_t buffer[128];
feb11 3:85c6ee25cf3e 329 memcpy(buffer, in,length);
feb11 3:85c6ee25cf3e 330 buffer[length] = 0x80;
feb11 3:85c6ee25cf3e 331 length++;
feb11 3:85c6ee25cf3e 332 padding--;
feb11 3:85c6ee25cf3e 333
feb11 3:85c6ee25cf3e 334 if(padding+length == 112)
feb11 3:85c6ee25cf3e 335 memset(&buffer[length], 0, padding);
feb11 3:85c6ee25cf3e 336 else
feb11 3:85c6ee25cf3e 337 {
feb11 3:85c6ee25cf3e 338 memset(&buffer[length], 0, 128-length);
feb11 3:85c6ee25cf3e 339 computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, buffer);
feb11 5:06cd9c8afa0b 340 memset(buffer, 0, 112);
feb11 3:85c6ee25cf3e 341 }
feb11 3:85c6ee25cf3e 342
feb11 0:7a1237bd2d13 343 lengthBit = revWord(lengthBit);
feb11 0:7a1237bd2d13 344 memset(&buffer[112], 0, 8);
feb11 0:7a1237bd2d13 345 memcpy(&buffer[120], &lengthBit, 8);
feb11 0:7a1237bd2d13 346 computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, buffer);
feb11 0:7a1237bd2d13 347
feb11 0:7a1237bd2d13 348 h0 = revWord(h0);
feb11 0:7a1237bd2d13 349 h1 = revWord(h1);
feb11 0:7a1237bd2d13 350 h2 = revWord(h2);
feb11 0:7a1237bd2d13 351 h3 = revWord(h3);
feb11 0:7a1237bd2d13 352 h4 = revWord(h4);
feb11 0:7a1237bd2d13 353 h5 = revWord(h5);
feb11 0:7a1237bd2d13 354
feb11 0:7a1237bd2d13 355
feb11 0:7a1237bd2d13 356 memcpy(digest, &h0, 8);
feb11 0:7a1237bd2d13 357 memcpy(&digest[8], &h1, 8);
feb11 0:7a1237bd2d13 358 memcpy(&digest[16], &h2, 8);
feb11 0:7a1237bd2d13 359 memcpy(&digest[24], &h3, 8);
feb11 0:7a1237bd2d13 360 memcpy(&digest[32], &h4, 8);
feb11 0:7a1237bd2d13 361 memcpy(&digest[40], &h5, 8);
feb11 0:7a1237bd2d13 362
feb11 0:7a1237bd2d13 363 if(type == SHA_512)
feb11 0:7a1237bd2d13 364 {
feb11 0:7a1237bd2d13 365 h6 = revWord(h6);
feb11 0:7a1237bd2d13 366 h7 = revWord(h7);
feb11 0:7a1237bd2d13 367 memcpy(&digest[48], &h6, 8);
feb11 0:7a1237bd2d13 368 memcpy(&digest[56], &h7, 8);
feb11 0:7a1237bd2d13 369 }
feb11 0:7a1237bd2d13 370 }
feb11 0:7a1237bd2d13 371