libsodium: Needed for Dnscrypto-proxy Release 1.3.0
[tomato.git] / release / src / router / libsodium / src / libsodium / crypto_hashblocks / sha256 / ref / blocks_sha256.c
blob8d89a886a744c6f00d24ed6adbd3a99e5217f988
1 #include "api.h"
3 typedef unsigned int uint32;
5 static uint32 load_bigendian(const unsigned char *x)
7 return
8 (uint32) (x[3]) \
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)
17 x[3] = u; u >>= 8;
18 x[2] = u; u >>= 8;
19 x[1] = u; u >>= 8;
20 x[0] = 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) + w0;
35 #define EXPAND \
36 M(w0 ,w14,w9 ,w1 ) \
37 M(w1 ,w15,w10,w2 ) \
38 M(w2 ,w0 ,w11,w3 ) \
39 M(w3 ,w1 ,w12,w4 ) \
40 M(w4 ,w2 ,w13,w5 ) \
41 M(w5 ,w3 ,w14,w6 ) \
42 M(w6 ,w4 ,w15,w7 ) \
43 M(w7 ,w5 ,w0 ,w8 ) \
44 M(w8 ,w6 ,w1 ,w9 ) \
45 M(w9 ,w7 ,w2 ,w10) \
46 M(w10,w8 ,w3 ,w11) \
47 M(w11,w9 ,w4 ,w12) \
48 M(w12,w10,w5 ,w13) \
49 M(w13,w11,w6 ,w14) \
50 M(w14,w12,w7 ,w15) \
51 M(w15,w13,w8 ,w0 )
53 #define F(w,k) \
54 T1 = h + Sigma1(e) + Ch(e,f,g) + k + w; \
55 T2 = Sigma0(a) + Maj(a,b,c); \
56 h = g; \
57 g = f; \
58 f = e; \
59 e = d + T1; \
60 d = c; \
61 c = b; \
62 b = a; \
63 a = T1 + T2;
65 int crypto_hashblocks(unsigned char *statebytes,const unsigned char *in,unsigned long long inlen)
67 uint32 state[8];
68 uint32 a;
69 uint32 b;
70 uint32 c;
71 uint32 d;
72 uint32 e;
73 uint32 f;
74 uint32 g;
75 uint32 h;
76 uint32 T1;
77 uint32 T2;
79 a = load_bigendian(statebytes + 0); state[0] = a;
80 b = load_bigendian(statebytes + 4); state[1] = b;
81 c = load_bigendian(statebytes + 8); state[2] = c;
82 d = load_bigendian(statebytes + 12); state[3] = d;
83 e = load_bigendian(statebytes + 16); state[4] = e;
84 f = load_bigendian(statebytes + 20); state[5] = f;
85 g = load_bigendian(statebytes + 24); state[6] = g;
86 h = load_bigendian(statebytes + 28); state[7] = h;
88 while (inlen >= 64) {
89 uint32 w0 = load_bigendian(in + 0);
90 uint32 w1 = load_bigendian(in + 4);
91 uint32 w2 = load_bigendian(in + 8);
92 uint32 w3 = load_bigendian(in + 12);
93 uint32 w4 = load_bigendian(in + 16);
94 uint32 w5 = load_bigendian(in + 20);
95 uint32 w6 = load_bigendian(in + 24);
96 uint32 w7 = load_bigendian(in + 28);
97 uint32 w8 = load_bigendian(in + 32);
98 uint32 w9 = load_bigendian(in + 36);
99 uint32 w10 = load_bigendian(in + 40);
100 uint32 w11 = load_bigendian(in + 44);
101 uint32 w12 = load_bigendian(in + 48);
102 uint32 w13 = load_bigendian(in + 52);
103 uint32 w14 = load_bigendian(in + 56);
104 uint32 w15 = load_bigendian(in + 60);
106 F(w0 ,0x428a2f98)
107 F(w1 ,0x71374491)
108 F(w2 ,0xb5c0fbcf)
109 F(w3 ,0xe9b5dba5)
110 F(w4 ,0x3956c25b)
111 F(w5 ,0x59f111f1)
112 F(w6 ,0x923f82a4)
113 F(w7 ,0xab1c5ed5)
114 F(w8 ,0xd807aa98)
115 F(w9 ,0x12835b01)
116 F(w10,0x243185be)
117 F(w11,0x550c7dc3)
118 F(w12,0x72be5d74)
119 F(w13,0x80deb1fe)
120 F(w14,0x9bdc06a7)
121 F(w15,0xc19bf174)
123 EXPAND
125 F(w0 ,0xe49b69c1)
126 F(w1 ,0xefbe4786)
127 F(w2 ,0x0fc19dc6)
128 F(w3 ,0x240ca1cc)
129 F(w4 ,0x2de92c6f)
130 F(w5 ,0x4a7484aa)
131 F(w6 ,0x5cb0a9dc)
132 F(w7 ,0x76f988da)
133 F(w8 ,0x983e5152)
134 F(w9 ,0xa831c66d)
135 F(w10,0xb00327c8)
136 F(w11,0xbf597fc7)
137 F(w12,0xc6e00bf3)
138 F(w13,0xd5a79147)
139 F(w14,0x06ca6351)
140 F(w15,0x14292967)
142 EXPAND
144 F(w0 ,0x27b70a85)
145 F(w1 ,0x2e1b2138)
146 F(w2 ,0x4d2c6dfc)
147 F(w3 ,0x53380d13)
148 F(w4 ,0x650a7354)
149 F(w5 ,0x766a0abb)
150 F(w6 ,0x81c2c92e)
151 F(w7 ,0x92722c85)
152 F(w8 ,0xa2bfe8a1)
153 F(w9 ,0xa81a664b)
154 F(w10,0xc24b8b70)
155 F(w11,0xc76c51a3)
156 F(w12,0xd192e819)
157 F(w13,0xd6990624)
158 F(w14,0xf40e3585)
159 F(w15,0x106aa070)
161 EXPAND
163 F(w0 ,0x19a4c116)
164 F(w1 ,0x1e376c08)
165 F(w2 ,0x2748774c)
166 F(w3 ,0x34b0bcb5)
167 F(w4 ,0x391c0cb3)
168 F(w5 ,0x4ed8aa4a)
169 F(w6 ,0x5b9cca4f)
170 F(w7 ,0x682e6ff3)
171 F(w8 ,0x748f82ee)
172 F(w9 ,0x78a5636f)
173 F(w10,0x84c87814)
174 F(w11,0x8cc70208)
175 F(w12,0x90befffa)
176 F(w13,0xa4506ceb)
177 F(w14,0xbef9a3f7)
178 F(w15,0xc67178f2)
180 a += state[0];
181 b += state[1];
182 c += state[2];
183 d += state[3];
184 e += state[4];
185 f += state[5];
186 g += state[6];
187 h += state[7];
189 state[0] = a;
190 state[1] = b;
191 state[2] = c;
192 state[3] = d;
193 state[4] = e;
194 state[5] = f;
195 state[6] = g;
196 state[7] = h;
198 in += 64;
199 inlen -= 64;
202 store_bigendian(statebytes + 0,state[0]);
203 store_bigendian(statebytes + 4,state[1]);
204 store_bigendian(statebytes + 8,state[2]);
205 store_bigendian(statebytes + 12,state[3]);
206 store_bigendian(statebytes + 16,state[4]);
207 store_bigendian(statebytes + 20,state[5]);
208 store_bigendian(statebytes + 24,state[6]);
209 store_bigendian(statebytes + 28,state[7]);
211 return 0;