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:
Sat Sep 14 18:21:32 2013 +0000
Revision:
7:2dbbdfb08123
Parent:
SHA2_64.cpp@6:19aa835f2bbb
Child:
13:ac8e23b98dae
added DES (not tested yet)

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