8 #if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA256)
21 memset (
c,0,
sizeof(*
c));
22 c->h[0]=0xc1059ed8UL;
c->h[1]=0x367cd507UL;
23 c->h[2]=0x3070dd17UL;
c->h[3]=0xf70e5939UL;
24 c->h[4]=0xffc00b31UL;
c->h[5]=0x68581511UL;
25 c->h[6]=0x64f98fa7UL;
c->h[7]=0xbefa4fa4UL;
32 memset (
c,0,
sizeof(*
c));
33 c->h[0]=0x6a09e667UL;
c->h[1]=0xbb67ae85UL;
34 c->h[2]=0x3c6ef372UL;
c->h[3]=0xa54ff53aUL;
35 c->h[4]=0x510e527fUL;
c->h[5]=0x9b05688cUL;
36 c->h[6]=0x1f83d9abUL;
c->h[7]=0x5be0cd19UL;
41 unsigned char *
SHA224(
const unsigned char *d,
size_t n,
unsigned char *md)
54 unsigned char *
SHA256(
const unsigned char *d,
size_t n,
unsigned char *md)
72 #define DATA_ORDER_IS_BIG_ENDIAN
74 #define HASH_LONG SHA_LONG
75 #define HASH_CTX SHA256_CTX
76 #define HASH_CBLOCK SHA_CBLOCK
85 #define HASH_MAKE_STRING(c,s) do { \
88 switch ((c)->md_len) \
89 { case SHA224_DIGEST_LENGTH: \
90 for (nn=0;nn<SHA224_DIGEST_LENGTH/4;nn++) \
91 { ll=(c)->h[nn]; HOST_l2c(ll,(s)); } \
93 case SHA256_DIGEST_LENGTH: \
94 for (nn=0;nn<SHA256_DIGEST_LENGTH/4;nn++) \
95 { ll=(c)->h[nn]; HOST_l2c(ll,(s)); } \
98 if ((c)->md_len > SHA256_DIGEST_LENGTH) \
100 for (nn=0;nn<(c)->md_len/4;nn++) \
101 { ll=(c)->h[nn]; HOST_l2c(ll,(s)); } \
106 #define HASH_UPDATE SHA256_Update
107 #define HASH_TRANSFORM SHA256_Transform
108 #define HASH_FINAL SHA256_Final
109 #define HASH_BLOCK_DATA_ORDER sha256_block_data_order
113 void sha256_block_data_order (
SHA256_CTX *ctx,
const void *in,
size_t num);
119 0x428a2f98UL,0x71374491UL,0xb5c0fbcfUL,0xe9b5dba5UL,
120 0x3956c25bUL,0x59f111f1UL,0x923f82a4UL,0xab1c5ed5UL,
121 0xd807aa98UL,0x12835b01UL,0x243185beUL,0x550c7dc3UL,
122 0x72be5d74UL,0x80deb1feUL,0x9bdc06a7UL,0xc19bf174UL,
123 0xe49b69c1UL,0xefbe4786UL,0x0fc19dc6UL,0x240ca1ccUL,
124 0x2de92c6fUL,0x4a7484aaUL,0x5cb0a9dcUL,0x76f988daUL,
125 0x983e5152UL,0xa831c66dUL,0xb00327c8UL,0xbf597fc7UL,
126 0xc6e00bf3UL,0xd5a79147UL,0x06ca6351UL,0x14292967UL,
127 0x27b70a85UL,0x2e1b2138UL,0x4d2c6dfcUL,0x53380d13UL,
128 0x650a7354UL,0x766a0abbUL,0x81c2c92eUL,0x92722c85UL,
129 0xa2bfe8a1UL,0xa81a664bUL,0xc24b8b70UL,0xc76c51a3UL,
130 0xd192e819UL,0xd6990624UL,0xf40e3585UL,0x106aa070UL,
131 0x19a4c116UL,0x1e376c08UL,0x2748774cUL,0x34b0bcb5UL,
132 0x391c0cb3UL,0x4ed8aa4aUL,0x5b9cca4fUL,0x682e6ff3UL,
133 0x748f82eeUL,0x78a5636fUL,0x84c87814UL,0x8cc70208UL,
134 0x90befffaUL,0xa4506cebUL,0xbef9a3f7UL,0xc67178f2UL };
141 #define Sigma0(x) (ROTATE((x),30) ^ ROTATE((x),19) ^ ROTATE((x),10))
142 #define Sigma1(x) (ROTATE((x),26) ^ ROTATE((x),21) ^ ROTATE((x),7))
143 #define sigma0(x) (ROTATE((x),25) ^ ROTATE((x),14) ^ ((x)>>3))
144 #define sigma1(x) (ROTATE((x),15) ^ ROTATE((x),13) ^ ((x)>>10))
146 #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
147 #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
149 #ifdef OPENSSL_SMALL_FOOTPRINT
151 static void sha256_block_data_order (
SHA256_CTX *ctx,
const void *in,
size_t num)
153 unsigned MD32_REG_T a,
b,
c,d,
e,
f,g,
h,s0,s1,T1,T2;
156 const unsigned char *
data=in;
160 a = ctx->
h[0]; b = ctx->
h[1]; c = ctx->
h[2]; d = ctx->
h[3];
161 e = ctx->
h[4]; f = ctx->
h[5]; g = ctx->
h[6]; h = ctx->
h[7];
165 HOST_c2l(data,l); T1 = X[i] = l;
166 T1 += h +
Sigma1(e) +
Ch(e,f,g) + K256[i];
168 h = g; g =
f; f =
e; e = d + T1;
169 d = c; c =
b; b =
a; a = T1 + T2;
174 s0 = X[(i+1)&0x0f]; s0 =
sigma0(s0);
175 s1 = X[(i+14)&0x0f]; s1 =
sigma1(s1);
177 T1 = X[i&0xf] += s0 + s1 + X[(i+9)&0xf];
178 T1 += h +
Sigma1(e) +
Ch(e,f,g) + K256[i];
180 h = g; g =
f; f =
e; e = d + T1;
181 d = c; c =
b; b =
a; a = T1 + T2;
184 ctx->
h[0] +=
a; ctx->
h[1] +=
b; ctx->
h[2] += c; ctx->
h[3] += d;
185 ctx->
h[4] +=
e; ctx->
h[5] +=
f; ctx->
h[6] += g; ctx->
h[7] +=
h;
192 #define ROUND_00_15(i,a,b,c,d,e,f,g,h) do { \
193 T1 += h + Sigma1(e) + Ch(e,f,g) + K256[i]; \
194 h = Sigma0(a) + Maj(a,b,c); \
195 d += T1; h += T1; } while (0)
197 #define ROUND_16_63(i,a,b,c,d,e,f,g,h,X) do { \
198 s0 = X[(i+1)&0x0f]; s0 = sigma0(s0); \
199 s1 = X[(i+14)&0x0f]; s1 = sigma1(s1); \
200 T1 = X[(i)&0x0f] += s0 + s1 + X[(i+9)&0x0f]; \
201 ROUND_00_15(i,a,b,c,d,e,f,g,h); } while (0)
203 static void sha256_block_data_order (
SHA256_CTX *ctx,
const void *in,
size_t num)
205 unsigned MD32_REG_T a,
b,
c,d,
e,
f,g,
h,s0,s1,T1;
208 const unsigned char *
data=in;
209 const union {
long one;
char little; } is_endian = {1};
213 a = ctx->
h[0]; b = ctx->
h[1]; c = ctx->
h[2]; d = ctx->
h[3];
214 e = ctx->
h[4]; f = ctx->
h[5]; g = ctx->
h[6]; h = ctx->
h[7];
216 if (!is_endian.little &&
sizeof(
SHA_LONG)==4 && ((
size_t)in%4)==0)
230 T1 = X[10] = W[10];
ROUND_00_15(10,g,h,a,b,c,d,e,f);
231 T1 = X[11] = W[11];
ROUND_00_15(11,f,g,h,a,b,c,d,e);
232 T1 = X[12] = W[12];
ROUND_00_15(12,e,f,g,h,a,b,c,d);
233 T1 = X[13] = W[13];
ROUND_00_15(13,d,e,f,g,h,a,b,c);
234 T1 = X[14] = W[14];
ROUND_00_15(14,c,d,e,f,g,h,a,b);
235 T1 = X[15] = W[15];
ROUND_00_15(15,b,c,d,e,f,g,h,a);
243 HOST_c2l(data,l); T1 = X[0] = l;
ROUND_00_15(0,a,b,c,d,e,f,g,h);
244 HOST_c2l(data,l); T1 = X[1] = l;
ROUND_00_15(1,h,a,b,c,d,e,f,g);
245 HOST_c2l(data,l); T1 = X[2] = l;
ROUND_00_15(2,g,h,a,b,c,d,e,f);
246 HOST_c2l(data,l); T1 = X[3] = l;
ROUND_00_15(3,f,g,h,a,b,c,d,e);
247 HOST_c2l(data,l); T1 = X[4] = l;
ROUND_00_15(4,e,f,g,h,a,b,c,d);
248 HOST_c2l(data,l); T1 = X[5] = l;
ROUND_00_15(5,d,e,f,g,h,a,b,c);
249 HOST_c2l(data,l); T1 = X[6] = l;
ROUND_00_15(6,c,d,e,f,g,h,a,b);
250 HOST_c2l(data,l); T1 = X[7] = l;
ROUND_00_15(7,b,c,d,e,f,g,h,a);
251 HOST_c2l(data,l); T1 = X[8] = l;
ROUND_00_15(8,a,b,c,d,e,f,g,h);
252 HOST_c2l(data,l); T1 = X[9] = l;
ROUND_00_15(9,h,a,b,c,d,e,f,g);
253 HOST_c2l(data,l); T1 = X[10] = l;
ROUND_00_15(10,g,h,a,b,c,d,e,f);
254 HOST_c2l(data,l); T1 = X[11] = l;
ROUND_00_15(11,f,g,h,a,b,c,d,e);
255 HOST_c2l(data,l); T1 = X[12] = l;
ROUND_00_15(12,e,f,g,h,a,b,c,d);
256 HOST_c2l(data,l); T1 = X[13] = l;
ROUND_00_15(13,d,e,f,g,h,a,b,c);
257 HOST_c2l(data,l); T1 = X[14] = l;
ROUND_00_15(14,c,d,e,f,g,h,a,b);
258 HOST_c2l(data,l); T1 = X[15] = l;
ROUND_00_15(15,b,c,d,e,f,g,h,a);
273 ctx->
h[0] +=
a; ctx->
h[1] +=
b; ctx->
h[2] += c; ctx->
h[3] += d;
274 ctx->
h[4] +=
e; ctx->
h[5] +=
f; ctx->
h[6] += g; ctx->
h[7] +=
h;