Donatien Garnier / MiniTLS-GPL

Dependents:   MiniTLS-HTTPS-Example

Committer:
MiniTLS
Date:
Mon Jun 09 14:57:54 2014 +0000
Revision:
2:527a66d0a1a9
Change name to MiniTLS and added doc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MiniTLS 2:527a66d0a1a9 1 /*
MiniTLS 2:527a66d0a1a9 2 MiniTLS - A super trimmed down TLS/SSL Library for embedded devices
MiniTLS 2:527a66d0a1a9 3 Author: Donatien Garnier
MiniTLS 2:527a66d0a1a9 4 Copyright (C) 2013-2014 AppNearMe Ltd
MiniTLS 2:527a66d0a1a9 5
MiniTLS 2:527a66d0a1a9 6 This program is free software; you can redistribute it and/or
MiniTLS 2:527a66d0a1a9 7 modify it under the terms of the GNU General Public License
MiniTLS 2:527a66d0a1a9 8 as published by the Free Software Foundation; either version 2
MiniTLS 2:527a66d0a1a9 9 of the License, or (at your option) any later version.
MiniTLS 2:527a66d0a1a9 10
MiniTLS 2:527a66d0a1a9 11 This program is distributed in the hope that it will be useful,
MiniTLS 2:527a66d0a1a9 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
MiniTLS 2:527a66d0a1a9 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
MiniTLS 2:527a66d0a1a9 14 GNU General Public License for more details.
MiniTLS 2:527a66d0a1a9 15
MiniTLS 2:527a66d0a1a9 16 You should have received a copy of the GNU General Public License
MiniTLS 2:527a66d0a1a9 17 along with this program; if not, write to the Free Software
MiniTLS 2:527a66d0a1a9 18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
MiniTLS 2:527a66d0a1a9 19 *//**
MiniTLS 2:527a66d0a1a9 20 * \file crypto_sha256.c
MiniTLS 2:527a66d0a1a9 21 * \copyright Copyright (c) AppNearMe Ltd 2013
MiniTLS 2:527a66d0a1a9 22 * \author Donatien Garnier
MiniTLS 2:527a66d0a1a9 23 */
MiniTLS 2:527a66d0a1a9 24
MiniTLS 2:527a66d0a1a9 25 #define __DEBUG__ 0
MiniTLS 2:527a66d0a1a9 26 #define __MODULE__ "crypto_sha256.c"
MiniTLS 2:527a66d0a1a9 27
MiniTLS 2:527a66d0a1a9 28 //This module has been adapted from libtomcrypt (http://libtom.org/)
MiniTLS 2:527a66d0a1a9 29
MiniTLS 2:527a66d0a1a9 30 #include "core/fwk.h"
MiniTLS 2:527a66d0a1a9 31 #include "crypto_sha256.h"
MiniTLS 2:527a66d0a1a9 32 #include "inc/minitls_errors.h"
MiniTLS 2:527a66d0a1a9 33 #include "crypto_macros.h"
MiniTLS 2:527a66d0a1a9 34
MiniTLS 2:527a66d0a1a9 35 #define fatal(x) do{ ERR("Fatal error %s - %d", #x, x); while(1); }while(0)
MiniTLS 2:527a66d0a1a9 36
MiniTLS 2:527a66d0a1a9 37 static void crypto_sha256_compress(crypto_sha256_t* hash, unsigned char *buf);
MiniTLS 2:527a66d0a1a9 38
MiniTLS 2:527a66d0a1a9 39 void crypto_sha256_init(crypto_sha256_t* hash)
MiniTLS 2:527a66d0a1a9 40 {
MiniTLS 2:527a66d0a1a9 41 hash->state[0] = 0x6A09E667UL;
MiniTLS 2:527a66d0a1a9 42 hash->state[1] = 0xBB67AE85UL;
MiniTLS 2:527a66d0a1a9 43 hash->state[2] = 0x3C6EF372UL;
MiniTLS 2:527a66d0a1a9 44 hash->state[3] = 0xA54FF53AUL;
MiniTLS 2:527a66d0a1a9 45 hash->state[4] = 0x510E527FUL;
MiniTLS 2:527a66d0a1a9 46 hash->state[5] = 0x9B05688CUL;
MiniTLS 2:527a66d0a1a9 47 hash->state[6] = 0x1F83D9ABUL;
MiniTLS 2:527a66d0a1a9 48 hash->state[7] = 0x5BE0CD19UL;
MiniTLS 2:527a66d0a1a9 49 hash->curlen = 0;
MiniTLS 2:527a66d0a1a9 50 hash->length = 0;
MiniTLS 2:527a66d0a1a9 51 }
MiniTLS 2:527a66d0a1a9 52
MiniTLS 2:527a66d0a1a9 53 void crypto_sha256_update(crypto_sha256_t* hash, const uint8_t* data, size_t size)
MiniTLS 2:527a66d0a1a9 54 {
MiniTLS 2:527a66d0a1a9 55 unsigned long n;
MiniTLS 2:527a66d0a1a9 56
MiniTLS 2:527a66d0a1a9 57 if ( hash->curlen > sizeof( hash->buf)) {
MiniTLS 2:527a66d0a1a9 58 //return CRYPTO_ERR_PARAMETERS;
MiniTLS 2:527a66d0a1a9 59 fatal(CRYPTO_ERR_PARAMETERS);
MiniTLS 2:527a66d0a1a9 60 }
MiniTLS 2:527a66d0a1a9 61 while (size > 0) {
MiniTLS 2:527a66d0a1a9 62 if ( hash->curlen == 0 && size >= 64) {
MiniTLS 2:527a66d0a1a9 63 crypto_sha256_compress(hash, (unsigned char *)data);
MiniTLS 2:527a66d0a1a9 64 hash->length += 64 * 8;
MiniTLS 2:527a66d0a1a9 65 data += 64;
MiniTLS 2:527a66d0a1a9 66 size -= 64;
MiniTLS 2:527a66d0a1a9 67 } else {
MiniTLS 2:527a66d0a1a9 68 n = ( ((size)<((64 - hash->curlen)))?(size):((64 - hash->curlen)) );
MiniTLS 2:527a66d0a1a9 69 memcpy( hash->buf + hash->curlen, data, (size_t)n);
MiniTLS 2:527a66d0a1a9 70 hash->curlen += n;
MiniTLS 2:527a66d0a1a9 71 data += n;
MiniTLS 2:527a66d0a1a9 72 size -= n;
MiniTLS 2:527a66d0a1a9 73 if ( hash->curlen == 64) {
MiniTLS 2:527a66d0a1a9 74 crypto_sha256_compress (hash, hash->buf);
MiniTLS 2:527a66d0a1a9 75 hash->length += 8*64;
MiniTLS 2:527a66d0a1a9 76 hash->curlen = 0;
MiniTLS 2:527a66d0a1a9 77 }
MiniTLS 2:527a66d0a1a9 78 }
MiniTLS 2:527a66d0a1a9 79 }
MiniTLS 2:527a66d0a1a9 80 }
MiniTLS 2:527a66d0a1a9 81
MiniTLS 2:527a66d0a1a9 82 void crypto_sha256_end(crypto_sha256_t* hash, uint8_t* out)
MiniTLS 2:527a66d0a1a9 83 {
MiniTLS 2:527a66d0a1a9 84 int i;
MiniTLS 2:527a66d0a1a9 85
MiniTLS 2:527a66d0a1a9 86 if (hash->curlen >= sizeof(hash->buf)) {
MiniTLS 2:527a66d0a1a9 87 fatal(CRYPTO_ERR_PARAMETERS);
MiniTLS 2:527a66d0a1a9 88 }
MiniTLS 2:527a66d0a1a9 89
MiniTLS 2:527a66d0a1a9 90 /* increase the length of the message */
MiniTLS 2:527a66d0a1a9 91 hash->length += hash->curlen * 8;
MiniTLS 2:527a66d0a1a9 92
MiniTLS 2:527a66d0a1a9 93 /* append the '1' bit */
MiniTLS 2:527a66d0a1a9 94 hash->buf[hash->curlen++] = (unsigned char)0x80;
MiniTLS 2:527a66d0a1a9 95
MiniTLS 2:527a66d0a1a9 96 /* if the length is currently above 56 bytes we append zeros
MiniTLS 2:527a66d0a1a9 97 * then compress. Then we can fall back to padding zeros and length
MiniTLS 2:527a66d0a1a9 98 * encoding like normal.
MiniTLS 2:527a66d0a1a9 99 */
MiniTLS 2:527a66d0a1a9 100 if (hash->curlen > 56) {
MiniTLS 2:527a66d0a1a9 101 while (hash->curlen < 64) {
MiniTLS 2:527a66d0a1a9 102 hash->buf[hash->curlen++] = (unsigned char)0;
MiniTLS 2:527a66d0a1a9 103 }
MiniTLS 2:527a66d0a1a9 104 crypto_sha256_compress(hash, hash->buf);
MiniTLS 2:527a66d0a1a9 105 hash->curlen = 0;
MiniTLS 2:527a66d0a1a9 106 }
MiniTLS 2:527a66d0a1a9 107
MiniTLS 2:527a66d0a1a9 108 /* pad upto 56 bytes of zeroes */
MiniTLS 2:527a66d0a1a9 109 while (hash->curlen < 56) {
MiniTLS 2:527a66d0a1a9 110 hash->buf[hash->curlen++] = (unsigned char)0;
MiniTLS 2:527a66d0a1a9 111 }
MiniTLS 2:527a66d0a1a9 112
MiniTLS 2:527a66d0a1a9 113 /* store length */
MiniTLS 2:527a66d0a1a9 114 STORE64H(hash->length, hash->buf+56);
MiniTLS 2:527a66d0a1a9 115 crypto_sha256_compress(hash, hash->buf);
MiniTLS 2:527a66d0a1a9 116
MiniTLS 2:527a66d0a1a9 117 /* copy output */
MiniTLS 2:527a66d0a1a9 118 for (i = 0; i < 8; i++) {
MiniTLS 2:527a66d0a1a9 119 STORE32H(hash->state[i], out+(4*i));
MiniTLS 2:527a66d0a1a9 120 }
MiniTLS 2:527a66d0a1a9 121 #ifdef CRYPT_CLEAN_STACK
MiniTLS 2:527a66d0a1a9 122 zeromem(hash, sizeof(hash));
MiniTLS 2:527a66d0a1a9 123 #endif
MiniTLS 2:527a66d0a1a9 124 }
MiniTLS 2:527a66d0a1a9 125
MiniTLS 2:527a66d0a1a9 126 void crypto_sha256_copy(crypto_sha256_t* hashTo, crypto_sha256_t* hashFrom)
MiniTLS 2:527a66d0a1a9 127 {
MiniTLS 2:527a66d0a1a9 128 memcpy(hashTo, hashFrom, sizeof(crypto_sha256_t));
MiniTLS 2:527a66d0a1a9 129 }
MiniTLS 2:527a66d0a1a9 130
MiniTLS 2:527a66d0a1a9 131 /* Various logical functions */
MiniTLS 2:527a66d0a1a9 132 #define Ch(x,y,z) (z ^ (x & (y ^ z)))
MiniTLS 2:527a66d0a1a9 133 #define Maj(x,y,z) (((x | y) & z) | (x & y))
MiniTLS 2:527a66d0a1a9 134 #define S(x, n) RORc((x),(n))
MiniTLS 2:527a66d0a1a9 135 #define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
MiniTLS 2:527a66d0a1a9 136 #define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))
MiniTLS 2:527a66d0a1a9 137 #define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
MiniTLS 2:527a66d0a1a9 138 #define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
MiniTLS 2:527a66d0a1a9 139 #define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
MiniTLS 2:527a66d0a1a9 140
MiniTLS 2:527a66d0a1a9 141 void crypto_sha256_compress(crypto_sha256_t* hash, unsigned char *buf)
MiniTLS 2:527a66d0a1a9 142 {
MiniTLS 2:527a66d0a1a9 143 ulong32 S[8], W[64], t0, t1;
MiniTLS 2:527a66d0a1a9 144 #ifdef LTC_SMALL_CODE
MiniTLS 2:527a66d0a1a9 145 ulong32 t;
MiniTLS 2:527a66d0a1a9 146 #endif
MiniTLS 2:527a66d0a1a9 147 int i;
MiniTLS 2:527a66d0a1a9 148
MiniTLS 2:527a66d0a1a9 149 /* copy state into S */
MiniTLS 2:527a66d0a1a9 150 for (i = 0; i < 8; i++) {
MiniTLS 2:527a66d0a1a9 151 S[i] = hash->state[i];
MiniTLS 2:527a66d0a1a9 152 }
MiniTLS 2:527a66d0a1a9 153
MiniTLS 2:527a66d0a1a9 154 /* copy the state into 512-bits into W[0..15] */
MiniTLS 2:527a66d0a1a9 155 for (i = 0; i < 16; i++) {
MiniTLS 2:527a66d0a1a9 156 LOAD32H(W[i], buf + (4*i));
MiniTLS 2:527a66d0a1a9 157 }
MiniTLS 2:527a66d0a1a9 158
MiniTLS 2:527a66d0a1a9 159 /* fill W[16..63] */
MiniTLS 2:527a66d0a1a9 160 for (i = 16; i < 64; i++) {
MiniTLS 2:527a66d0a1a9 161 W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
MiniTLS 2:527a66d0a1a9 162 }
MiniTLS 2:527a66d0a1a9 163
MiniTLS 2:527a66d0a1a9 164 /* Compress */
MiniTLS 2:527a66d0a1a9 165 #ifdef LTC_SMALL_CODE
MiniTLS 2:527a66d0a1a9 166 #define RND(a,b,c,d,e,f,g,h,i) \
MiniTLS 2:527a66d0a1a9 167 t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
MiniTLS 2:527a66d0a1a9 168 t1 = Sigma0(a) + Maj(a, b, c); \
MiniTLS 2:527a66d0a1a9 169 d += t0; \
MiniTLS 2:527a66d0a1a9 170 h = t0 + t1;
MiniTLS 2:527a66d0a1a9 171
MiniTLS 2:527a66d0a1a9 172 for (i = 0; i < 64; ++i) {
MiniTLS 2:527a66d0a1a9 173 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i);
MiniTLS 2:527a66d0a1a9 174 t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4];
MiniTLS 2:527a66d0a1a9 175 S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;
MiniTLS 2:527a66d0a1a9 176 }
MiniTLS 2:527a66d0a1a9 177 #else
MiniTLS 2:527a66d0a1a9 178 #define RND(a,b,c,d,e,f,g,h,i,ki) \
MiniTLS 2:527a66d0a1a9 179 t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \
MiniTLS 2:527a66d0a1a9 180 t1 = Sigma0(a) + Maj(a, b, c); \
MiniTLS 2:527a66d0a1a9 181 d += t0; \
MiniTLS 2:527a66d0a1a9 182 h = t0 + t1;
MiniTLS 2:527a66d0a1a9 183
MiniTLS 2:527a66d0a1a9 184 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98);
MiniTLS 2:527a66d0a1a9 185 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491);
MiniTLS 2:527a66d0a1a9 186 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf);
MiniTLS 2:527a66d0a1a9 187 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5);
MiniTLS 2:527a66d0a1a9 188 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b);
MiniTLS 2:527a66d0a1a9 189 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1);
MiniTLS 2:527a66d0a1a9 190 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4);
MiniTLS 2:527a66d0a1a9 191 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5);
MiniTLS 2:527a66d0a1a9 192 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98);
MiniTLS 2:527a66d0a1a9 193 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01);
MiniTLS 2:527a66d0a1a9 194 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be);
MiniTLS 2:527a66d0a1a9 195 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3);
MiniTLS 2:527a66d0a1a9 196 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74);
MiniTLS 2:527a66d0a1a9 197 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe);
MiniTLS 2:527a66d0a1a9 198 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7);
MiniTLS 2:527a66d0a1a9 199 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174);
MiniTLS 2:527a66d0a1a9 200 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1);
MiniTLS 2:527a66d0a1a9 201 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786);
MiniTLS 2:527a66d0a1a9 202 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6);
MiniTLS 2:527a66d0a1a9 203 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc);
MiniTLS 2:527a66d0a1a9 204 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f);
MiniTLS 2:527a66d0a1a9 205 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa);
MiniTLS 2:527a66d0a1a9 206 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc);
MiniTLS 2:527a66d0a1a9 207 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da);
MiniTLS 2:527a66d0a1a9 208 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152);
MiniTLS 2:527a66d0a1a9 209 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d);
MiniTLS 2:527a66d0a1a9 210 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8);
MiniTLS 2:527a66d0a1a9 211 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7);
MiniTLS 2:527a66d0a1a9 212 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3);
MiniTLS 2:527a66d0a1a9 213 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147);
MiniTLS 2:527a66d0a1a9 214 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351);
MiniTLS 2:527a66d0a1a9 215 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967);
MiniTLS 2:527a66d0a1a9 216 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85);
MiniTLS 2:527a66d0a1a9 217 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138);
MiniTLS 2:527a66d0a1a9 218 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc);
MiniTLS 2:527a66d0a1a9 219 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13);
MiniTLS 2:527a66d0a1a9 220 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354);
MiniTLS 2:527a66d0a1a9 221 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb);
MiniTLS 2:527a66d0a1a9 222 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e);
MiniTLS 2:527a66d0a1a9 223 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85);
MiniTLS 2:527a66d0a1a9 224 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1);
MiniTLS 2:527a66d0a1a9 225 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b);
MiniTLS 2:527a66d0a1a9 226 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70);
MiniTLS 2:527a66d0a1a9 227 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3);
MiniTLS 2:527a66d0a1a9 228 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819);
MiniTLS 2:527a66d0a1a9 229 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624);
MiniTLS 2:527a66d0a1a9 230 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585);
MiniTLS 2:527a66d0a1a9 231 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070);
MiniTLS 2:527a66d0a1a9 232 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116);
MiniTLS 2:527a66d0a1a9 233 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08);
MiniTLS 2:527a66d0a1a9 234 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c);
MiniTLS 2:527a66d0a1a9 235 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5);
MiniTLS 2:527a66d0a1a9 236 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3);
MiniTLS 2:527a66d0a1a9 237 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a);
MiniTLS 2:527a66d0a1a9 238 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f);
MiniTLS 2:527a66d0a1a9 239 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3);
MiniTLS 2:527a66d0a1a9 240 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee);
MiniTLS 2:527a66d0a1a9 241 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f);
MiniTLS 2:527a66d0a1a9 242 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814);
MiniTLS 2:527a66d0a1a9 243 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208);
MiniTLS 2:527a66d0a1a9 244 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa);
MiniTLS 2:527a66d0a1a9 245 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb);
MiniTLS 2:527a66d0a1a9 246 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7);
MiniTLS 2:527a66d0a1a9 247 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2);
MiniTLS 2:527a66d0a1a9 248
MiniTLS 2:527a66d0a1a9 249 #undef RND
MiniTLS 2:527a66d0a1a9 250
MiniTLS 2:527a66d0a1a9 251 #endif
MiniTLS 2:527a66d0a1a9 252
MiniTLS 2:527a66d0a1a9 253 /* feedback */
MiniTLS 2:527a66d0a1a9 254 for (i = 0; i < 8; i++) {
MiniTLS 2:527a66d0a1a9 255 hash->state[i] = hash->state[i] + S[i];
MiniTLS 2:527a66d0a1a9 256 }
MiniTLS 2:527a66d0a1a9 257
MiniTLS 2:527a66d0a1a9 258 #if CRYPT_CLEAN_STACK
MiniTLS 2:527a66d0a1a9 259 burn_stack(sizeof(ulong32) * 74);
MiniTLS 2:527a66d0a1a9 260 #endif
MiniTLS 2:527a66d0a1a9 261 }