1 #include "crypto_hashblocks.h"
3 typedef unsigned int uint32
;
5 static uint32
load_bigendian(const unsigned char *x
)
9 | (((uint32
) (x
[2])) << 8) \
10 | (((uint32
) (x
[1])) << 16) \
11 | (((uint32
) (x
[0])) << 24)
15 static void store_bigendian(unsigned char *x
,uint32 u
)
23 #define SHR(x,c) ((x) >> (c))
24 #define ROTR(x,c) (((x) >> (c)) | ((x) << (32 - (c))))
26 #define Ch(x,y,z) ((x & y) ^ (~x & z))
27 #define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
28 #define Sigma0(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
29 #define Sigma1(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
30 #define sigma0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
31 #define sigma1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
33 #define M(w0,w14,w9,w1) w0 += sigma1(w14) + w9 + sigma0(w1);
53 #define F(r0,r1,r2,r3,r4,r5,r6,r7,w,k) \
54 r7 += Sigma1(r4) + Ch(r4,r5,r6) + k + w; \
56 r7 += Sigma0(r0) + Maj(r0,r1,r2);
58 #define G(r0,r1,r2,r3,r4,r5,r6,r7,i) \
59 F(r0,r1,r2,r3,r4,r5,r6,r7,w0 ,round[i + 0]) \
60 F(r7,r0,r1,r2,r3,r4,r5,r6,w1 ,round[i + 1]) \
61 F(r6,r7,r0,r1,r2,r3,r4,r5,w2 ,round[i + 2]) \
62 F(r5,r6,r7,r0,r1,r2,r3,r4,w3 ,round[i + 3]) \
63 F(r4,r5,r6,r7,r0,r1,r2,r3,w4 ,round[i + 4]) \
64 F(r3,r4,r5,r6,r7,r0,r1,r2,w5 ,round[i + 5]) \
65 F(r2,r3,r4,r5,r6,r7,r0,r1,w6 ,round[i + 6]) \
66 F(r1,r2,r3,r4,r5,r6,r7,r0,w7 ,round[i + 7]) \
67 F(r0,r1,r2,r3,r4,r5,r6,r7,w8 ,round[i + 8]) \
68 F(r7,r0,r1,r2,r3,r4,r5,r6,w9 ,round[i + 9]) \
69 F(r6,r7,r0,r1,r2,r3,r4,r5,w10,round[i + 10]) \
70 F(r5,r6,r7,r0,r1,r2,r3,r4,w11,round[i + 11]) \
71 F(r4,r5,r6,r7,r0,r1,r2,r3,w12,round[i + 12]) \
72 F(r3,r4,r5,r6,r7,r0,r1,r2,w13,round[i + 13]) \
73 F(r2,r3,r4,r5,r6,r7,r0,r1,w14,round[i + 14]) \
74 F(r1,r2,r3,r4,r5,r6,r7,r0,w15,round[i + 15])
76 static const uint32 round
[64] = {
143 int crypto_hashblocks(unsigned char *statebytes
,const unsigned char *in
,unsigned long long inlen
)
155 r0
= load_bigendian(statebytes
+ 0); state
[0] = r0
;
156 r1
= load_bigendian(statebytes
+ 4); state
[1] = r1
;
157 r2
= load_bigendian(statebytes
+ 8); state
[2] = r2
;
158 r3
= load_bigendian(statebytes
+ 12); state
[3] = r3
;
159 r4
= load_bigendian(statebytes
+ 16); state
[4] = r4
;
160 r5
= load_bigendian(statebytes
+ 20); state
[5] = r5
;
161 r6
= load_bigendian(statebytes
+ 24); state
[6] = r6
;
162 r7
= load_bigendian(statebytes
+ 28); state
[7] = r7
;
164 while (inlen
>= 64) {
165 uint32 w0
= load_bigendian(in
+ 0);
166 uint32 w1
= load_bigendian(in
+ 4);
167 uint32 w2
= load_bigendian(in
+ 8);
168 uint32 w3
= load_bigendian(in
+ 12);
169 uint32 w4
= load_bigendian(in
+ 16);
170 uint32 w5
= load_bigendian(in
+ 20);
171 uint32 w6
= load_bigendian(in
+ 24);
172 uint32 w7
= load_bigendian(in
+ 28);
173 uint32 w8
= load_bigendian(in
+ 32);
174 uint32 w9
= load_bigendian(in
+ 36);
175 uint32 w10
= load_bigendian(in
+ 40);
176 uint32 w11
= load_bigendian(in
+ 44);
177 uint32 w12
= load_bigendian(in
+ 48);
178 uint32 w13
= load_bigendian(in
+ 52);
179 uint32 w14
= load_bigendian(in
+ 56);
180 uint32 w15
= load_bigendian(in
+ 60);
182 G(r0
,r1
,r2
,r3
,r4
,r5
,r6
,r7
,0)
186 G(r0
,r1
,r2
,r3
,r4
,r5
,r6
,r7
,16)
190 G(r0
,r1
,r2
,r3
,r4
,r5
,r6
,r7
,32)
194 G(r0
,r1
,r2
,r3
,r4
,r5
,r6
,r7
,48)
218 store_bigendian(statebytes
+ 0,state
[0]);
219 store_bigendian(statebytes
+ 4,state
[1]);
220 store_bigendian(statebytes
+ 8,state
[2]);
221 store_bigendian(statebytes
+ 12,state
[3]);
222 store_bigendian(statebytes
+ 16,state
[4]);
223 store_bigendian(statebytes
+ 20,state
[5]);
224 store_bigendian(statebytes
+ 24,state
[6]);
225 store_bigendian(statebytes
+ 28,state
[7]);