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:
feb11
Date:
Tue Sep 24 07:19:04 2013 +0000
Revision:
10:bc9c23aa3870
Parent:
7:2dbbdfb08123
Child:
13:ac8e23b98dae
implemented HMAC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feb11 0:7a1237bd2d13 1 #include "SHA2_32.h"
feb11 0:7a1237bd2d13 2 #include <string.h>
feb11 10:bc9c23aa3870 3
feb11 0:7a1237bd2d13 4
feb11 4:0da19393bd57 5
feb11 4:0da19393bd57 6 static const uint8_t MASK = 0x0F;
feb11 4:0da19393bd57 7 #define W(t) (w[(t)] = SSIG1(w[((t)+14)&MASK]) + w[((t)+9)&MASK] + SSIG0(w[((t)+1)&MASK]) + w[t])
feb11 0:7a1237bd2d13 8
feb11 3:85c6ee25cf3e 9 #define ROTL(W,N) (((W) << (N)) | ((W) >> (32-(N))))
feb11 10:bc9c23aa3870 10 #define ROTR(W,N) (__ror(W,N))
feb11 3:85c6ee25cf3e 11 #define CH(X,Y,Z) (((X) & (Y)) ^ ((~(X)) & (Z)))
feb11 3:85c6ee25cf3e 12 #define MAJ(X,Y,Z) (((X) & (Y)) ^ ((X) & (Z)) ^ ((Y) & (Z)))
feb11 3:85c6ee25cf3e 13 #define BSIG0(X) (ROTR(X,2) ^ ROTR(X,13) ^ ROTR(X,22))
feb11 3:85c6ee25cf3e 14 #define BSIG1(X) (ROTR(X,6) ^ ROTR(X,11) ^ ROTR(X,25))
feb11 3:85c6ee25cf3e 15 #define SSIG0(X) (ROTR((X),7) ^ ROTR((X),18) ^ ((X) >> 3))
feb11 3:85c6ee25cf3e 16 #define SSIG1(X) (ROTR((X),17) ^ ROTR((X),19) ^ ((X) >> 10))
feb11 4:0da19393bd57 17 #define R(A,B,C,D,E,F,G,H,T,K) T1 = H + BSIG1(E) + CH(E,F,G) + K + (w[T] = __rev(buffer2[T])); \
feb11 4:0da19393bd57 18 T2 = BSIG0(A) + MAJ(A,B,C); \
feb11 4:0da19393bd57 19 D += T1; \
feb11 4:0da19393bd57 20 H = T1 + T2;
feb11 4:0da19393bd57 21 #define R2(A,B,C,D,E,F,G,H,T,K) T1 = H + BSIG1(E) + CH(E,F,G) + K + W(T&MASK); \
feb11 3:85c6ee25cf3e 22 T2 = BSIG0(A) + MAJ(A,B,C); \
feb11 3:85c6ee25cf3e 23 D += T1; \
feb11 3:85c6ee25cf3e 24 H = T1 + T2;
feb11 3:85c6ee25cf3e 25
feb11 0:7a1237bd2d13 26 static const uint32_t H[] =
feb11 0:7a1237bd2d13 27 {
feb11 0:7a1237bd2d13 28 // SHA-224
feb11 0:7a1237bd2d13 29 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
feb11 0:7a1237bd2d13 30 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,
feb11 0:7a1237bd2d13 31
feb11 0:7a1237bd2d13 32 // SHA-256
feb11 0:7a1237bd2d13 33 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
feb11 0:7a1237bd2d13 34 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
feb11 0:7a1237bd2d13 35 };
feb11 0:7a1237bd2d13 36
feb11 0:7a1237bd2d13 37 SHA2_32::SHA2_32(SHA_32_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_224:
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_256:
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_32::update(uint8_t *data, uint32_t length)
feb11 0:7a1237bd2d13 69 {
feb11 0:7a1237bd2d13 70 if(length < 64-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 = 64-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 > 64)
feb11 0:7a1237bd2d13 81 {
feb11 6:19aa835f2bbb 82 memcpy(buffer, &data[offset], 64);
feb11 0:7a1237bd2d13 83 computeBlock(&h0,&h1,&h2,&h3,&h4,&h5,&h6,&h7,buffer);
feb11 0:7a1237bd2d13 84 offset += 64;
feb11 0:7a1237bd2d13 85 }
feb11 0:7a1237bd2d13 86 if(offset > length)
feb11 0:7a1237bd2d13 87 offset -= 64;
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_32::finalize(uint8_t *hash)
feb11 0:7a1237bd2d13 94 {
feb11 6:19aa835f2bbb 95 uint32_t *hash2 = (uint32_t*)hash;
feb11 0:7a1237bd2d13 96 uint16_t padding;
feb11 0:7a1237bd2d13 97 if(totalBufferLength % 64 < 56)
feb11 0:7a1237bd2d13 98 padding = 56 - (totalBufferLength % 64);
feb11 0:7a1237bd2d13 99 else
feb11 0:7a1237bd2d13 100 padding = 56 + (64 - (totalBufferLength % 64));
feb11 3:85c6ee25cf3e 101
feb11 3:85c6ee25cf3e 102 buffer[bufferLength++] = 0x80;
feb11 3:85c6ee25cf3e 103 padding--;
feb11 3:85c6ee25cf3e 104 if(padding+bufferLength == 56)
feb11 3:85c6ee25cf3e 105 memset(&buffer[bufferLength], 0, padding);
feb11 3:85c6ee25cf3e 106 else
feb11 3:85c6ee25cf3e 107 {
feb11 3:85c6ee25cf3e 108 memset(&buffer[bufferLength], 0, 64-bufferLength);
feb11 3:85c6ee25cf3e 109 computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, buffer);
feb11 5:06cd9c8afa0b 110 memset(buffer, 0, 56);
feb11 3:85c6ee25cf3e 111 }
feb11 3:85c6ee25cf3e 112
feb11 3:85c6ee25cf3e 113 uint64_t lengthBit = totalBufferLength << 3;
feb11 0:7a1237bd2d13 114 uint32_t lengthBitLow = lengthBit;
feb11 0:7a1237bd2d13 115 uint32_t lengthBitHigh = lengthBit >> 32;
feb11 3:85c6ee25cf3e 116 lengthBitLow = __rev(lengthBitLow);
feb11 3:85c6ee25cf3e 117 lengthBitHigh = __rev(lengthBitHigh);
feb11 3:85c6ee25cf3e 118 memcpy(&buffer[60], &lengthBitLow, 4);
feb11 3:85c6ee25cf3e 119 memcpy(&buffer[56], &lengthBitHigh, 4);
feb11 3:85c6ee25cf3e 120 computeBlock(&h0, &h1, &h2, &h3, &h4, &h5, &h6, &h7, buffer);
feb11 0:7a1237bd2d13 121
feb11 6:19aa835f2bbb 122 hash2[0] = __rev(h0);
feb11 6:19aa835f2bbb 123 hash2[1] = __rev(h1);
feb11 6:19aa835f2bbb 124 hash2[2] = __rev(h2);
feb11 6:19aa835f2bbb 125 hash2[3] = __rev(h3);
feb11 6:19aa835f2bbb 126 hash2[4] = __rev(h4);
feb11 6:19aa835f2bbb 127 hash2[5] = __rev(h5);
feb11 6:19aa835f2bbb 128 hash2[6] = __rev(h6);
feb11 6:19aa835f2bbb 129
feb11 3:85c6ee25cf3e 130
feb11 0:7a1237bd2d13 131 if(type == SHA_256)
feb11 6:19aa835f2bbb 132 hash2[7] = __rev(h7);
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_224:
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_256:
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_32::computeHash(SHA_32_TYPE type, uint8_t *hash, uint8_t *data, uint32_t length)
feb11 6:19aa835f2bbb 164 {
feb11 6:19aa835f2bbb 165 uint32_t *hash2 = (uint32_t*)hash;
feb11 10:bc9c23aa3870 166
feb11 10:bc9c23aa3870 167 uint32_t h[8];
feb11 10:bc9c23aa3870 168 h[0] = H[type*8];
feb11 10:bc9c23aa3870 169 h[1] = H[type*8+1];
feb11 10:bc9c23aa3870 170 h[2] = H[type*8+2];
feb11 10:bc9c23aa3870 171 h[3] = H[type*8+3];
feb11 10:bc9c23aa3870 172 h[4] = H[type*8+4];
feb11 10:bc9c23aa3870 173 h[5] = H[type*8+5];
feb11 10:bc9c23aa3870 174 h[6] = H[type*8+6];
feb11 10:bc9c23aa3870 175 h[7] = H[type*8+7];
feb11 10:bc9c23aa3870 176
feb11 6:19aa835f2bbb 177 uint64_t lengthBit = length << 3;
feb11 10:bc9c23aa3870 178 uint32_t padding;
feb11 6:19aa835f2bbb 179 if(length % 64 < 56)
feb11 6:19aa835f2bbb 180 padding = 56 - (length % 64);
feb11 6:19aa835f2bbb 181 else
feb11 6:19aa835f2bbb 182 padding = 56 + (64 - (length % 64));
feb11 6:19aa835f2bbb 183
feb11 6:19aa835f2bbb 184 while(length >= 64)
feb11 6:19aa835f2bbb 185 {
feb11 10:bc9c23aa3870 186 computeBlock(h, &h[1], &h[2], &h[3], &h[4], &h[5], &h[6], &h[7], data);
feb11 6:19aa835f2bbb 187 length -= 64;
feb11 6:19aa835f2bbb 188 data += 64;
feb11 6:19aa835f2bbb 189 }
feb11 6:19aa835f2bbb 190 uint8_t buffer[64];
feb11 6:19aa835f2bbb 191 memcpy(buffer, data,length);
feb11 6:19aa835f2bbb 192 buffer[length++] = 0x80;
feb11 6:19aa835f2bbb 193 padding--;
feb11 6:19aa835f2bbb 194 if(padding+length == 56)
feb11 6:19aa835f2bbb 195 memset(&buffer[length], 0, padding);
feb11 6:19aa835f2bbb 196 else
feb11 6:19aa835f2bbb 197 {
feb11 6:19aa835f2bbb 198 memset(&buffer[length], 0, 64-length);
feb11 10:bc9c23aa3870 199 computeBlock(h, &h[1], &h[2], &h[3], &h[4], &h[5], &h[6], &h[7], buffer);
feb11 6:19aa835f2bbb 200 memset(buffer, 0, 56);
feb11 6:19aa835f2bbb 201 }
feb11 6:19aa835f2bbb 202
feb11 6:19aa835f2bbb 203 uint32_t lengthBitLow = lengthBit;
feb11 6:19aa835f2bbb 204 uint32_t lengthBitHigh = lengthBit >> 32;
feb11 6:19aa835f2bbb 205 lengthBitLow = __rev(lengthBitLow);
feb11 6:19aa835f2bbb 206 memcpy(&buffer[60], &lengthBitLow, 4);
feb11 6:19aa835f2bbb 207 lengthBitHigh = __rev(lengthBitHigh);
feb11 6:19aa835f2bbb 208 memcpy(&buffer[56], &lengthBitHigh, 4);
feb11 10:bc9c23aa3870 209 computeBlock(h, &h[1], &h[2], &h[3], &h[4], &h[5], &h[6], &h[7], buffer);
feb11 6:19aa835f2bbb 210
feb11 10:bc9c23aa3870 211 hash2[0] = __rev(h[0]);
feb11 10:bc9c23aa3870 212 hash2[1] = __rev(h[1]);
feb11 10:bc9c23aa3870 213 hash2[2] = __rev(h[2]);
feb11 10:bc9c23aa3870 214 hash2[3] = __rev(h[3]);
feb11 10:bc9c23aa3870 215 hash2[4] = __rev(h[4]);
feb11 10:bc9c23aa3870 216 hash2[5] = __rev(h[5]);
feb11 10:bc9c23aa3870 217 hash2[6] = __rev(h[6]);
feb11 6:19aa835f2bbb 218
feb11 6:19aa835f2bbb 219
feb11 6:19aa835f2bbb 220 if(type == SHA_256)
feb11 10:bc9c23aa3870 221 hash2[7] = __rev(h[7]);
feb11 6:19aa835f2bbb 222 }
feb11 6:19aa835f2bbb 223
feb11 10:bc9c23aa3870 224 __forceinline void SHA2_32::computeBlock(uint32_t *h02,
feb11 0:7a1237bd2d13 225 uint32_t *h12,
feb11 0:7a1237bd2d13 226 uint32_t *h22,
feb11 0:7a1237bd2d13 227 uint32_t *h32,
feb11 0:7a1237bd2d13 228 uint32_t *h42,
feb11 0:7a1237bd2d13 229 uint32_t *h52,
feb11 0:7a1237bd2d13 230 uint32_t *h62,
feb11 0:7a1237bd2d13 231 uint32_t *h72,
feb11 0:7a1237bd2d13 232 uint8_t *buffer)
feb11 0:7a1237bd2d13 233 {
feb11 4:0da19393bd57 234 uint32_t w[16];
feb11 3:85c6ee25cf3e 235 uint32_t *buffer2 = (uint32_t*)buffer;
feb11 3:85c6ee25cf3e 236 uint32_t a = *h02, b = *h12, c = *h22, d = *h32, e = *h42, f = *h52, g = *h62, h = *h72;
feb11 3:85c6ee25cf3e 237 uint32_t T1, T2;
feb11 4:0da19393bd57 238
feb11 4:0da19393bd57 239 R(a,b,c,d,e,f,g,h,0,0x428a2f98)
feb11 4:0da19393bd57 240 R(h,a,b,c,d,e,f,g,1,0x71374491)
feb11 4:0da19393bd57 241 R(g,h,a,b,c,d,e,f,2,0xb5c0fbcf)
feb11 4:0da19393bd57 242 R(f,g,h,a,b,c,d,e,3,0xe9b5dba5)
feb11 4:0da19393bd57 243 R(e,f,g,h,a,b,c,d,4,0x3956c25b)
feb11 4:0da19393bd57 244 R(d,e,f,g,h,a,b,c,5,0x59f111f1)
feb11 4:0da19393bd57 245 R(c,d,e,f,g,h,a,b,6,0x923f82a4)
feb11 4:0da19393bd57 246 R(b,c,d,e,f,g,h,a,7,0xab1c5ed5)
feb11 3:85c6ee25cf3e 247
feb11 4:0da19393bd57 248 R(a,b,c,d,e,f,g,h,8,0xd807aa98)
feb11 4:0da19393bd57 249 R(h,a,b,c,d,e,f,g,9,0x12835b01)
feb11 4:0da19393bd57 250 R(g,h,a,b,c,d,e,f,10,0x243185be)
feb11 4:0da19393bd57 251 R(f,g,h,a,b,c,d,e,11,0x550c7dc3)
feb11 4:0da19393bd57 252 R(e,f,g,h,a,b,c,d,12,0x72be5d74)
feb11 4:0da19393bd57 253 R(d,e,f,g,h,a,b,c,13,0x80deb1fe)
feb11 4:0da19393bd57 254 R(c,d,e,f,g,h,a,b,14,0x9bdc06a7)
feb11 4:0da19393bd57 255 R(b,c,d,e,f,g,h,a,15,0xc19bf174)
feb11 4:0da19393bd57 256
feb11 4:0da19393bd57 257 R2(a,b,c,d,e,f,g,h,16,0xe49b69c1)
feb11 4:0da19393bd57 258 R2(h,a,b,c,d,e,f,g,17,0xefbe4786)
feb11 4:0da19393bd57 259 R2(g,h,a,b,c,d,e,f,18,0x0fc19dc6)
feb11 4:0da19393bd57 260 R2(f,g,h,a,b,c,d,e,19,0x240ca1cc)
feb11 4:0da19393bd57 261 R2(e,f,g,h,a,b,c,d,20,0x2de92c6f)
feb11 4:0da19393bd57 262 R2(d,e,f,g,h,a,b,c,21,0x4a7484aa)
feb11 4:0da19393bd57 263 R2(c,d,e,f,g,h,a,b,22,0x5cb0a9dc)
feb11 4:0da19393bd57 264 R2(b,c,d,e,f,g,h,a,23,0x76f988da)
feb11 3:85c6ee25cf3e 265
feb11 4:0da19393bd57 266 R2(a,b,c,d,e,f,g,h,24,0x983e5152)
feb11 4:0da19393bd57 267 R2(h,a,b,c,d,e,f,g,25,0xa831c66d)
feb11 4:0da19393bd57 268 R2(g,h,a,b,c,d,e,f,26,0xb00327c8)
feb11 4:0da19393bd57 269 R2(f,g,h,a,b,c,d,e,27,0xbf597fc7)
feb11 4:0da19393bd57 270 R2(e,f,g,h,a,b,c,d,28,0xc6e00bf3)
feb11 4:0da19393bd57 271 R2(d,e,f,g,h,a,b,c,29,0xd5a79147)
feb11 4:0da19393bd57 272 R2(c,d,e,f,g,h,a,b,30,0x06ca6351)
feb11 4:0da19393bd57 273 R2(b,c,d,e,f,g,h,a,31,0x14292967)
feb11 4:0da19393bd57 274
feb11 4:0da19393bd57 275 R2(a,b,c,d,e,f,g,h,32,0x27b70a85)
feb11 4:0da19393bd57 276 R2(h,a,b,c,d,e,f,g,33,0x2e1b2138)
feb11 4:0da19393bd57 277 R2(g,h,a,b,c,d,e,f,34,0x4d2c6dfc)
feb11 4:0da19393bd57 278 R2(f,g,h,a,b,c,d,e,35,0x53380d13)
feb11 4:0da19393bd57 279 R2(e,f,g,h,a,b,c,d,36,0x650a7354)
feb11 4:0da19393bd57 280 R2(d,e,f,g,h,a,b,c,37,0x766a0abb)
feb11 4:0da19393bd57 281 R2(c,d,e,f,g,h,a,b,38,0x81c2c92e)
feb11 4:0da19393bd57 282 R2(b,c,d,e,f,g,h,a,39,0x92722c85)
feb11 3:85c6ee25cf3e 283
feb11 4:0da19393bd57 284 R2(a,b,c,d,e,f,g,h,40,0xa2bfe8a1)
feb11 4:0da19393bd57 285 R2(h,a,b,c,d,e,f,g,41,0xa81a664b)
feb11 4:0da19393bd57 286 R2(g,h,a,b,c,d,e,f,42,0xc24b8b70)
feb11 4:0da19393bd57 287 R2(f,g,h,a,b,c,d,e,43,0xc76c51a3)
feb11 4:0da19393bd57 288 R2(e,f,g,h,a,b,c,d,44,0xd192e819)
feb11 4:0da19393bd57 289 R2(d,e,f,g,h,a,b,c,45,0xd6990624)
feb11 4:0da19393bd57 290 R2(c,d,e,f,g,h,a,b,46,0xf40e3585)
feb11 4:0da19393bd57 291 R2(b,c,d,e,f,g,h,a,47,0x106aa070)
feb11 3:85c6ee25cf3e 292
feb11 4:0da19393bd57 293 R2(a,b,c,d,e,f,g,h,48,0x19a4c116)
feb11 4:0da19393bd57 294 R2(h,a,b,c,d,e,f,g,49,0x1e376c08)
feb11 4:0da19393bd57 295 R2(g,h,a,b,c,d,e,f,50,0x2748774c)
feb11 4:0da19393bd57 296 R2(f,g,h,a,b,c,d,e,51,0x34b0bcb5)
feb11 4:0da19393bd57 297 R2(e,f,g,h,a,b,c,d,52,0x391c0cb3)
feb11 4:0da19393bd57 298 R2(d,e,f,g,h,a,b,c,53,0x4ed8aa4a)
feb11 4:0da19393bd57 299 R2(c,d,e,f,g,h,a,b,54,0x5b9cca4f)
feb11 4:0da19393bd57 300 R2(b,c,d,e,f,g,h,a,55,0x682e6ff3)
feb11 4:0da19393bd57 301
feb11 4:0da19393bd57 302 R2(a,b,c,d,e,f,g,h,56,0x748f82ee)
feb11 4:0da19393bd57 303 R2(h,a,b,c,d,e,f,g,57,0x78a5636f)
feb11 4:0da19393bd57 304 R2(g,h,a,b,c,d,e,f,58,0x84c87814)
feb11 4:0da19393bd57 305 R2(f,g,h,a,b,c,d,e,59,0x8cc70208)
feb11 4:0da19393bd57 306 R2(e,f,g,h,a,b,c,d,60,0x90befffa)
feb11 4:0da19393bd57 307 R2(d,e,f,g,h,a,b,c,61,0xa4506ceb)
feb11 4:0da19393bd57 308 R2(c,d,e,f,g,h,a,b,62,0xbef9a3f7)
feb11 4:0da19393bd57 309 R2(b,c,d,e,f,g,h,a,63,0xc67178f2)
feb11 3:85c6ee25cf3e 310
feb11 0:7a1237bd2d13 311
feb11 0:7a1237bd2d13 312 *h02 += a;
feb11 0:7a1237bd2d13 313 *h12 += b;
feb11 0:7a1237bd2d13 314 *h22 += c;
feb11 0:7a1237bd2d13 315 *h32 += d;
feb11 0:7a1237bd2d13 316 *h42 += e;
feb11 0:7a1237bd2d13 317 *h52 += f;
feb11 0:7a1237bd2d13 318 *h62 += g;
feb11 0:7a1237bd2d13 319 *h72 += h;
feb11 0:7a1237bd2d13 320 }
feb11 0:7a1237bd2d13 321