1 /* $OpenBSD: sha256.c,v 1.9 2015/09/10 15:56:26 jsing Exp $ */
2 /* ====================================================================
3 * Copyright (c) 2004 The OpenSSL Project. All rights reserved
4 * according to the OpenSSL license [found in ../../LICENSE].
5 * ====================================================================
8 #include <openssl/opensslconf.h>
10 #if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA256)
12 #include <machine/endian.h>
17 #include <openssl/crypto.h>
18 #include <openssl/sha.h>
19 #include <openssl/opensslv.h>
21 int SHA224_Init(SHA256_CTX
*c
)
23 memset (c
,0,sizeof(*c
));
24 c
->h
[0]=0xc1059ed8UL
; c
->h
[1]=0x367cd507UL
;
25 c
->h
[2]=0x3070dd17UL
; c
->h
[3]=0xf70e5939UL
;
26 c
->h
[4]=0xffc00b31UL
; c
->h
[5]=0x68581511UL
;
27 c
->h
[6]=0x64f98fa7UL
; c
->h
[7]=0xbefa4fa4UL
;
28 c
->md_len
=SHA224_DIGEST_LENGTH
;
32 int SHA256_Init(SHA256_CTX
*c
)
34 memset (c
,0,sizeof(*c
));
35 c
->h
[0]=0x6a09e667UL
; c
->h
[1]=0xbb67ae85UL
;
36 c
->h
[2]=0x3c6ef372UL
; c
->h
[3]=0xa54ff53aUL
;
37 c
->h
[4]=0x510e527fUL
; c
->h
[5]=0x9b05688cUL
;
38 c
->h
[6]=0x1f83d9abUL
; c
->h
[7]=0x5be0cd19UL
;
39 c
->md_len
=SHA256_DIGEST_LENGTH
;
43 unsigned char *SHA224(const unsigned char *d
, size_t n
, unsigned char *md
)
46 static unsigned char m
[SHA224_DIGEST_LENGTH
];
50 SHA256_Update(&c
,d
,n
);
52 explicit_bzero(&c
,sizeof(c
));
56 unsigned char *SHA256(const unsigned char *d
, size_t n
, unsigned char *md
)
59 static unsigned char m
[SHA256_DIGEST_LENGTH
];
63 SHA256_Update(&c
,d
,n
);
65 explicit_bzero(&c
,sizeof(c
));
69 int SHA224_Update(SHA256_CTX
*c
, const void *data
, size_t len
)
70 { return SHA256_Update (c
,data
,len
); }
71 int SHA224_Final (unsigned char *md
, SHA256_CTX
*c
)
72 { return SHA256_Final (md
,c
); }
74 #define DATA_ORDER_IS_BIG_ENDIAN
76 #define HASH_LONG SHA_LONG
77 #define HASH_CTX SHA256_CTX
78 #define HASH_CBLOCK SHA_CBLOCK
80 * Note that FIPS180-2 discusses "Truncation of the Hash Function Output."
81 * default: case below covers for it. It's not clear however if it's
82 * permitted to truncate to amount of bytes not divisible by 4. I bet not,
83 * but if it is, then default: case shall be extended. For reference.
84 * Idea behind separate cases for pre-defined lenghts is to let the
85 * compiler decide if it's appropriate to unroll small loops.
87 #define HASH_MAKE_STRING(c,s) do { \
90 switch ((c)->md_len) \
91 { case SHA224_DIGEST_LENGTH: \
92 for (nn=0;nn<SHA224_DIGEST_LENGTH/4;nn++) \
93 { ll=(c)->h[nn]; HOST_l2c(ll,(s)); } \
95 case SHA256_DIGEST_LENGTH: \
96 for (nn=0;nn<SHA256_DIGEST_LENGTH/4;nn++) \
97 { ll=(c)->h[nn]; HOST_l2c(ll,(s)); } \
100 if ((c)->md_len > SHA256_DIGEST_LENGTH) \
102 for (nn=0;nn<(c)->md_len/4;nn++) \
103 { ll=(c)->h[nn]; HOST_l2c(ll,(s)); } \
108 #define HASH_UPDATE SHA256_Update
109 #define HASH_TRANSFORM SHA256_Transform
110 #define HASH_FINAL SHA256_Final
111 #define HASH_BLOCK_DATA_ORDER sha256_block_data_order
115 void sha256_block_data_order (SHA256_CTX
*ctx
, const void *in
, size_t num
);
117 #include "md32_common.h"
120 static const SHA_LONG K256
[64] = {
121 0x428a2f98UL
,0x71374491UL
,0xb5c0fbcfUL
,0xe9b5dba5UL
,
122 0x3956c25bUL
,0x59f111f1UL
,0x923f82a4UL
,0xab1c5ed5UL
,
123 0xd807aa98UL
,0x12835b01UL
,0x243185beUL
,0x550c7dc3UL
,
124 0x72be5d74UL
,0x80deb1feUL
,0x9bdc06a7UL
,0xc19bf174UL
,
125 0xe49b69c1UL
,0xefbe4786UL
,0x0fc19dc6UL
,0x240ca1ccUL
,
126 0x2de92c6fUL
,0x4a7484aaUL
,0x5cb0a9dcUL
,0x76f988daUL
,
127 0x983e5152UL
,0xa831c66dUL
,0xb00327c8UL
,0xbf597fc7UL
,
128 0xc6e00bf3UL
,0xd5a79147UL
,0x06ca6351UL
,0x14292967UL
,
129 0x27b70a85UL
,0x2e1b2138UL
,0x4d2c6dfcUL
,0x53380d13UL
,
130 0x650a7354UL
,0x766a0abbUL
,0x81c2c92eUL
,0x92722c85UL
,
131 0xa2bfe8a1UL
,0xa81a664bUL
,0xc24b8b70UL
,0xc76c51a3UL
,
132 0xd192e819UL
,0xd6990624UL
,0xf40e3585UL
,0x106aa070UL
,
133 0x19a4c116UL
,0x1e376c08UL
,0x2748774cUL
,0x34b0bcb5UL
,
134 0x391c0cb3UL
,0x4ed8aa4aUL
,0x5b9cca4fUL
,0x682e6ff3UL
,
135 0x748f82eeUL
,0x78a5636fUL
,0x84c87814UL
,0x8cc70208UL
,
136 0x90befffaUL
,0xa4506cebUL
,0xbef9a3f7UL
,0xc67178f2UL
};
139 * FIPS specification refers to right rotations, while our ROTATE macro
140 * is left one. This is why you might notice that rotation coefficients
141 * differ from those observed in FIPS document by 32-N...
143 #define Sigma0(x) (ROTATE((x),30) ^ ROTATE((x),19) ^ ROTATE((x),10))
144 #define Sigma1(x) (ROTATE((x),26) ^ ROTATE((x),21) ^ ROTATE((x),7))
145 #define sigma0(x) (ROTATE((x),25) ^ ROTATE((x),14) ^ ((x)>>3))
146 #define sigma1(x) (ROTATE((x),15) ^ ROTATE((x),13) ^ ((x)>>10))
148 #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
149 #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
151 #ifdef OPENSSL_SMALL_FOOTPRINT
153 static void sha256_block_data_order (SHA256_CTX
*ctx
, const void *in
, size_t num
)
155 unsigned MD32_REG_T a
,b
,c
,d
,e
,f
,g
,h
,s0
,s1
,T1
,T2
;
158 const unsigned char *data
=in
;
162 a
= ctx
->h
[0]; b
= ctx
->h
[1]; c
= ctx
->h
[2]; d
= ctx
->h
[3];
163 e
= ctx
->h
[4]; f
= ctx
->h
[5]; g
= ctx
->h
[6]; h
= ctx
->h
[7];
167 HOST_c2l(data
,l
); T1
= X
[i
] = l
;
168 T1
+= h
+ Sigma1(e
) + Ch(e
,f
,g
) + K256
[i
];
169 T2
= Sigma0(a
) + Maj(a
,b
,c
);
170 h
= g
; g
= f
; f
= e
; e
= d
+ T1
;
171 d
= c
; c
= b
; b
= a
; a
= T1
+ T2
;
176 s0
= X
[(i
+1)&0x0f]; s0
= sigma0(s0
);
177 s1
= X
[(i
+14)&0x0f]; s1
= sigma1(s1
);
179 T1
= X
[i
&0xf] += s0
+ s1
+ X
[(i
+9)&0xf];
180 T1
+= h
+ Sigma1(e
) + Ch(e
,f
,g
) + K256
[i
];
181 T2
= Sigma0(a
) + Maj(a
,b
,c
);
182 h
= g
; g
= f
; f
= e
; e
= d
+ T1
;
183 d
= c
; c
= b
; b
= a
; a
= T1
+ T2
;
186 ctx
->h
[0] += a
; ctx
->h
[1] += b
; ctx
->h
[2] += c
; ctx
->h
[3] += d
;
187 ctx
->h
[4] += e
; ctx
->h
[5] += f
; ctx
->h
[6] += g
; ctx
->h
[7] += h
;
194 #define ROUND_00_15(i,a,b,c,d,e,f,g,h) do { \
195 T1 += h + Sigma1(e) + Ch(e,f,g) + K256[i]; \
196 h = Sigma0(a) + Maj(a,b,c); \
197 d += T1; h += T1; } while (0)
199 #define ROUND_16_63(i,a,b,c,d,e,f,g,h,X) do { \
200 s0 = X[(i+1)&0x0f]; s0 = sigma0(s0); \
201 s1 = X[(i+14)&0x0f]; s1 = sigma1(s1); \
202 T1 = X[(i)&0x0f] += s0 + s1 + X[(i+9)&0x0f]; \
203 ROUND_00_15(i,a,b,c,d,e,f,g,h); } while (0)
205 static void sha256_block_data_order (SHA256_CTX
*ctx
, const void *in
, size_t num
)
207 unsigned MD32_REG_T a
,b
,c
,d
,e
,f
,g
,h
,s0
,s1
,T1
;
210 const unsigned char *data
=in
;
214 a
= ctx
->h
[0]; b
= ctx
->h
[1]; c
= ctx
->h
[2]; d
= ctx
->h
[3];
215 e
= ctx
->h
[4]; f
= ctx
->h
[5]; g
= ctx
->h
[6]; h
= ctx
->h
[7];
217 if (BYTE_ORDER
!= LITTLE_ENDIAN
&&
218 sizeof(SHA_LONG
)==4 && ((size_t)in
%4)==0)
220 const SHA_LONG
*W
=(const SHA_LONG
*)data
;
222 T1
= X
[0] = W
[0]; ROUND_00_15(0,a
,b
,c
,d
,e
,f
,g
,h
);
223 T1
= X
[1] = W
[1]; ROUND_00_15(1,h
,a
,b
,c
,d
,e
,f
,g
);
224 T1
= X
[2] = W
[2]; ROUND_00_15(2,g
,h
,a
,b
,c
,d
,e
,f
);
225 T1
= X
[3] = W
[3]; ROUND_00_15(3,f
,g
,h
,a
,b
,c
,d
,e
);
226 T1
= X
[4] = W
[4]; ROUND_00_15(4,e
,f
,g
,h
,a
,b
,c
,d
);
227 T1
= X
[5] = W
[5]; ROUND_00_15(5,d
,e
,f
,g
,h
,a
,b
,c
);
228 T1
= X
[6] = W
[6]; ROUND_00_15(6,c
,d
,e
,f
,g
,h
,a
,b
);
229 T1
= X
[7] = W
[7]; ROUND_00_15(7,b
,c
,d
,e
,f
,g
,h
,a
);
230 T1
= X
[8] = W
[8]; ROUND_00_15(8,a
,b
,c
,d
,e
,f
,g
,h
);
231 T1
= X
[9] = W
[9]; ROUND_00_15(9,h
,a
,b
,c
,d
,e
,f
,g
);
232 T1
= X
[10] = W
[10]; ROUND_00_15(10,g
,h
,a
,b
,c
,d
,e
,f
);
233 T1
= X
[11] = W
[11]; ROUND_00_15(11,f
,g
,h
,a
,b
,c
,d
,e
);
234 T1
= X
[12] = W
[12]; ROUND_00_15(12,e
,f
,g
,h
,a
,b
,c
,d
);
235 T1
= X
[13] = W
[13]; ROUND_00_15(13,d
,e
,f
,g
,h
,a
,b
,c
);
236 T1
= X
[14] = W
[14]; ROUND_00_15(14,c
,d
,e
,f
,g
,h
,a
,b
);
237 T1
= X
[15] = W
[15]; ROUND_00_15(15,b
,c
,d
,e
,f
,g
,h
,a
);
239 data
+= SHA256_CBLOCK
;
245 HOST_c2l(data
,l
); T1
= X
[0] = l
; ROUND_00_15(0,a
,b
,c
,d
,e
,f
,g
,h
);
246 HOST_c2l(data
,l
); T1
= X
[1] = l
; ROUND_00_15(1,h
,a
,b
,c
,d
,e
,f
,g
);
247 HOST_c2l(data
,l
); T1
= X
[2] = l
; ROUND_00_15(2,g
,h
,a
,b
,c
,d
,e
,f
);
248 HOST_c2l(data
,l
); T1
= X
[3] = l
; ROUND_00_15(3,f
,g
,h
,a
,b
,c
,d
,e
);
249 HOST_c2l(data
,l
); T1
= X
[4] = l
; ROUND_00_15(4,e
,f
,g
,h
,a
,b
,c
,d
);
250 HOST_c2l(data
,l
); T1
= X
[5] = l
; ROUND_00_15(5,d
,e
,f
,g
,h
,a
,b
,c
);
251 HOST_c2l(data
,l
); T1
= X
[6] = l
; ROUND_00_15(6,c
,d
,e
,f
,g
,h
,a
,b
);
252 HOST_c2l(data
,l
); T1
= X
[7] = l
; ROUND_00_15(7,b
,c
,d
,e
,f
,g
,h
,a
);
253 HOST_c2l(data
,l
); T1
= X
[8] = l
; ROUND_00_15(8,a
,b
,c
,d
,e
,f
,g
,h
);
254 HOST_c2l(data
,l
); T1
= X
[9] = l
; ROUND_00_15(9,h
,a
,b
,c
,d
,e
,f
,g
);
255 HOST_c2l(data
,l
); T1
= X
[10] = l
; ROUND_00_15(10,g
,h
,a
,b
,c
,d
,e
,f
);
256 HOST_c2l(data
,l
); T1
= X
[11] = l
; ROUND_00_15(11,f
,g
,h
,a
,b
,c
,d
,e
);
257 HOST_c2l(data
,l
); T1
= X
[12] = l
; ROUND_00_15(12,e
,f
,g
,h
,a
,b
,c
,d
);
258 HOST_c2l(data
,l
); T1
= X
[13] = l
; ROUND_00_15(13,d
,e
,f
,g
,h
,a
,b
,c
);
259 HOST_c2l(data
,l
); T1
= X
[14] = l
; ROUND_00_15(14,c
,d
,e
,f
,g
,h
,a
,b
);
260 HOST_c2l(data
,l
); T1
= X
[15] = l
; ROUND_00_15(15,b
,c
,d
,e
,f
,g
,h
,a
);
265 ROUND_16_63(i
+0,a
,b
,c
,d
,e
,f
,g
,h
,X
);
266 ROUND_16_63(i
+1,h
,a
,b
,c
,d
,e
,f
,g
,X
);
267 ROUND_16_63(i
+2,g
,h
,a
,b
,c
,d
,e
,f
,X
);
268 ROUND_16_63(i
+3,f
,g
,h
,a
,b
,c
,d
,e
,X
);
269 ROUND_16_63(i
+4,e
,f
,g
,h
,a
,b
,c
,d
,X
);
270 ROUND_16_63(i
+5,d
,e
,f
,g
,h
,a
,b
,c
,X
);
271 ROUND_16_63(i
+6,c
,d
,e
,f
,g
,h
,a
,b
,X
);
272 ROUND_16_63(i
+7,b
,c
,d
,e
,f
,g
,h
,a
,X
);
275 ctx
->h
[0] += a
; ctx
->h
[1] += b
; ctx
->h
[2] += c
; ctx
->h
[3] += d
;
276 ctx
->h
[4] += e
; ctx
->h
[5] += f
; ctx
->h
[6] += g
; ctx
->h
[7] += h
;
282 #endif /* SHA256_ASM */
284 #endif /* OPENSSL_NO_SHA256 */