Line data Source code
1 : /**
2 : * The Whirlpool hashing function.
3 : *
4 : * <P>
5 : * <b>References</b>
6 : *
7 : * <P>
8 : * The Whirlpool algorithm was developed by
9 : * <a href="mailto:pbarreto@scopus.com.br">Paulo S. L. M. Barreto</a> and
10 : * <a href="mailto:vincent.rijmen@cryptomathic.com">Vincent Rijmen</a>.
11 : *
12 : * See
13 : * P.S.L.M. Barreto, V. Rijmen,
14 : * ``The Whirlpool hashing function,''
15 : * NESSIE submission, 2000 (tweaked version, 2001),
16 : * <https://www.cosic.esat.kuleuven.ac.be/nessie/workshop/submissions/whirlpool.zip>
17 : *
18 : * Based on "@version 3.0 (2003.03.12)" by Paulo S.L.M. Barreto and
19 : * Vincent Rijmen. Lookup "reference implementations" on
20 : * <http://planeta.terra.com.br/informatica/paulobarreto/>
21 : *
22 : * =============================================================================
23 : *
24 : * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
25 : * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 : * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
28 : * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 : * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 : * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
31 : * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32 : * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
33 : * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
34 : * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 : *
36 : */
37 :
38 : #include "wp_locl.h"
39 : #include <string.h>
40 :
41 : typedef unsigned char u8;
42 : #if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32)
43 : typedef unsigned __int64 u64;
44 : #elif defined(__arch64__)
45 : typedef unsigned long u64;
46 : #else
47 : typedef unsigned long long u64;
48 : #endif
49 :
50 : #define ROUNDS 10
51 :
52 : #define STRICT_ALIGNMENT
53 : #if defined(__i386) || defined(__i386__) || \
54 : defined(__x86_64) || defined(__x86_64__) || \
55 : defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64)
56 : /*
57 : * Well, formally there're couple of other architectures, which permit
58 : * unaligned loads, specifically those not crossing cache lines, IA-64 and
59 : * PowerPC...
60 : */
61 : # undef STRICT_ALIGNMENT
62 : #endif
63 :
64 : #undef SMALL_REGISTER_BANK
65 : #if defined(__i386) || defined(__i386__) || defined(_M_IX86)
66 : # define SMALL_REGISTER_BANK
67 : # if defined(WHIRLPOOL_ASM)
68 : # ifndef OPENSSL_SMALL_FOOTPRINT
69 : /*
70 : * it appears that for elder non-MMX
71 : * CPUs this is actually faster!
72 : */
73 : # define OPENSSL_SMALL_FOOTPRINT
74 : # endif
75 : # define GO_FOR_MMX(ctx,inp,num) do { \
76 : extern unsigned int OPENSSL_ia32cap_P[]; \
77 : void whirlpool_block_mmx(void *,const void *,size_t); \
78 : if (!(OPENSSL_ia32cap_P[0] & (1<<23))) break; \
79 : whirlpool_block_mmx(ctx->H.c,inp,num); return; \
80 : } while (0)
81 : # endif
82 : #endif
83 :
84 : #undef ROTATE
85 : #if defined(_MSC_VER)
86 : # if defined(_WIN64) /* applies to both IA-64 and AMD64 */
87 : # pragma intrinsic(_rotl64)
88 : # define ROTATE(a,n) _rotl64((a),n)
89 : # endif
90 : #elif defined(__GNUC__) && __GNUC__>=2
91 : # if defined(__x86_64) || defined(__x86_64__)
92 : # if defined(L_ENDIAN)
93 : # define ROTATE(a,n) ({ u64 ret; asm ("rolq %1,%0" \
94 : : "=r"(ret) : "J"(n),"0"(a) : "cc"); ret; })
95 : # elif defined(B_ENDIAN)
96 : /*
97 : * Most will argue that x86_64 is always little-endian. Well, yes, but
98 : * then we have stratus.com who has modified gcc to "emulate"
99 : * big-endian on x86. Is there evidence that they [or somebody else]
100 : * won't do same for x86_64? Naturally no. And this line is waiting
101 : * ready for that brave soul:-)
102 : */
103 : # define ROTATE(a,n) ({ u64 ret; asm ("rorq %1,%0" \
104 : : "=r"(ret) : "J"(n),"0"(a) : "cc"); ret; })
105 : # endif
106 : # elif defined(__ia64) || defined(__ia64__)
107 : # if defined(L_ENDIAN)
108 : # define ROTATE(a,n) ({ u64 ret; asm ("shrp %0=%1,%1,%2" \
109 : : "=r"(ret) : "r"(a),"M"(64-(n))); ret; })
110 : # elif defined(B_ENDIAN)
111 : # define ROTATE(a,n) ({ u64 ret; asm ("shrp %0=%1,%1,%2" \
112 : : "=r"(ret) : "r"(a),"M"(n)); ret; })
113 : # endif
114 : # endif
115 : #endif
116 :
117 : #if defined(OPENSSL_SMALL_FOOTPRINT)
118 : # if !defined(ROTATE)
119 : # if defined(L_ENDIAN) /* little-endians have to rotate left */
120 : # define ROTATE(i,n) ((i)<<(n) ^ (i)>>(64-n))
121 : # elif defined(B_ENDIAN) /* big-endians have to rotate right */
122 : # define ROTATE(i,n) ((i)>>(n) ^ (i)<<(64-n))
123 : # endif
124 : # endif
125 : # if defined(ROTATE) && !defined(STRICT_ALIGNMENT)
126 : # define STRICT_ALIGNMENT /* ensure smallest table size */
127 : # endif
128 : #endif
129 :
130 : /*
131 : * Table size depends on STRICT_ALIGNMENT and whether or not endian-
132 : * specific ROTATE macro is defined. If STRICT_ALIGNMENT is not
133 : * defined, which is normally the case on x86[_64] CPUs, the table is
134 : * 4KB large unconditionally. Otherwise if ROTATE is defined, the
135 : * table is 2KB large, and otherwise - 16KB. 2KB table requires a
136 : * whole bunch of additional rotations, but I'm willing to "trade,"
137 : * because 16KB table certainly trashes L1 cache. I wish all CPUs
138 : * could handle unaligned load as 4KB table doesn't trash the cache,
139 : * nor does it require additional rotations.
140 : */
141 : /*
142 : * Note that every Cn macro expands as two loads: one byte load and
143 : * one quadword load. One can argue that that many single-byte loads
144 : * is too excessive, as one could load a quadword and "milk" it for
145 : * eight 8-bit values instead. Well, yes, but in order to do so *and*
146 : * avoid excessive loads you have to accomodate a handful of 64-bit
147 : * values in the register bank and issue a bunch of shifts and mask.
148 : * It's a tradeoff: loads vs. shift and mask in big register bank[!].
149 : * On most CPUs eight single-byte loads are faster and I let other
150 : * ones to depend on smart compiler to fold byte loads if beneficial.
151 : * Hand-coded assembler would be another alternative:-)
152 : */
153 : #ifdef STRICT_ALIGNMENT
154 : # if defined(ROTATE)
155 : # define N 1
156 : # define LL(c0,c1,c2,c3,c4,c5,c6,c7) c0,c1,c2,c3,c4,c5,c6,c7
157 : # define C0(K,i) (Cx.q[K.c[(i)*8+0]])
158 : # define C1(K,i) ROTATE(Cx.q[K.c[(i)*8+1]],8)
159 : # define C2(K,i) ROTATE(Cx.q[K.c[(i)*8+2]],16)
160 : # define C3(K,i) ROTATE(Cx.q[K.c[(i)*8+3]],24)
161 : # define C4(K,i) ROTATE(Cx.q[K.c[(i)*8+4]],32)
162 : # define C5(K,i) ROTATE(Cx.q[K.c[(i)*8+5]],40)
163 : # define C6(K,i) ROTATE(Cx.q[K.c[(i)*8+6]],48)
164 : # define C7(K,i) ROTATE(Cx.q[K.c[(i)*8+7]],56)
165 : # else
166 : # define N 8
167 : # define LL(c0,c1,c2,c3,c4,c5,c6,c7) c0,c1,c2,c3,c4,c5,c6,c7, \
168 : c7,c0,c1,c2,c3,c4,c5,c6, \
169 : c6,c7,c0,c1,c2,c3,c4,c5, \
170 : c5,c6,c7,c0,c1,c2,c3,c4, \
171 : c4,c5,c6,c7,c0,c1,c2,c3, \
172 : c3,c4,c5,c6,c7,c0,c1,c2, \
173 : c2,c3,c4,c5,c6,c7,c0,c1, \
174 : c1,c2,c3,c4,c5,c6,c7,c0
175 : # define C0(K,i) (Cx.q[0+8*K.c[(i)*8+0]])
176 : # define C1(K,i) (Cx.q[1+8*K.c[(i)*8+1]])
177 : # define C2(K,i) (Cx.q[2+8*K.c[(i)*8+2]])
178 : # define C3(K,i) (Cx.q[3+8*K.c[(i)*8+3]])
179 : # define C4(K,i) (Cx.q[4+8*K.c[(i)*8+4]])
180 : # define C5(K,i) (Cx.q[5+8*K.c[(i)*8+5]])
181 : # define C6(K,i) (Cx.q[6+8*K.c[(i)*8+6]])
182 : # define C7(K,i) (Cx.q[7+8*K.c[(i)*8+7]])
183 : # endif
184 : #else
185 : # define N 2
186 : # define LL(c0,c1,c2,c3,c4,c5,c6,c7) c0,c1,c2,c3,c4,c5,c6,c7, \
187 : c0,c1,c2,c3,c4,c5,c6,c7
188 : # define C0(K,i) (((u64*)(Cx.c+0))[2*K.c[(i)*8+0]])
189 : # define C1(K,i) (((u64*)(Cx.c+7))[2*K.c[(i)*8+1]])
190 : # define C2(K,i) (((u64*)(Cx.c+6))[2*K.c[(i)*8+2]])
191 : # define C3(K,i) (((u64*)(Cx.c+5))[2*K.c[(i)*8+3]])
192 : # define C4(K,i) (((u64*)(Cx.c+4))[2*K.c[(i)*8+4]])
193 : # define C5(K,i) (((u64*)(Cx.c+3))[2*K.c[(i)*8+5]])
194 : # define C6(K,i) (((u64*)(Cx.c+2))[2*K.c[(i)*8+6]])
195 : # define C7(K,i) (((u64*)(Cx.c+1))[2*K.c[(i)*8+7]])
196 : #endif
197 :
198 : static const
199 : union {
200 : u8 c[(256 * N + ROUNDS) * sizeof(u64)];
201 : u64 q[(256 * N + ROUNDS)];
202 : } Cx = {
203 : {
204 : /* Note endian-neutral representation:-) */
205 : LL(0x18, 0x18, 0x60, 0x18, 0xc0, 0x78, 0x30, 0xd8),
206 : LL(0x23, 0x23, 0x8c, 0x23, 0x05, 0xaf, 0x46, 0x26),
207 : LL(0xc6, 0xc6, 0x3f, 0xc6, 0x7e, 0xf9, 0x91, 0xb8),
208 : LL(0xe8, 0xe8, 0x87, 0xe8, 0x13, 0x6f, 0xcd, 0xfb),
209 : LL(0x87, 0x87, 0x26, 0x87, 0x4c, 0xa1, 0x13, 0xcb),
210 : LL(0xb8, 0xb8, 0xda, 0xb8, 0xa9, 0x62, 0x6d, 0x11),
211 : LL(0x01, 0x01, 0x04, 0x01, 0x08, 0x05, 0x02, 0x09),
212 : LL(0x4f, 0x4f, 0x21, 0x4f, 0x42, 0x6e, 0x9e, 0x0d),
213 : LL(0x36, 0x36, 0xd8, 0x36, 0xad, 0xee, 0x6c, 0x9b),
214 : LL(0xa6, 0xa6, 0xa2, 0xa6, 0x59, 0x04, 0x51, 0xff),
215 : LL(0xd2, 0xd2, 0x6f, 0xd2, 0xde, 0xbd, 0xb9, 0x0c),
216 : LL(0xf5, 0xf5, 0xf3, 0xf5, 0xfb, 0x06, 0xf7, 0x0e),
217 : LL(0x79, 0x79, 0xf9, 0x79, 0xef, 0x80, 0xf2, 0x96),
218 : LL(0x6f, 0x6f, 0xa1, 0x6f, 0x5f, 0xce, 0xde, 0x30),
219 : LL(0x91, 0x91, 0x7e, 0x91, 0xfc, 0xef, 0x3f, 0x6d),
220 : LL(0x52, 0x52, 0x55, 0x52, 0xaa, 0x07, 0xa4, 0xf8),
221 : LL(0x60, 0x60, 0x9d, 0x60, 0x27, 0xfd, 0xc0, 0x47),
222 : LL(0xbc, 0xbc, 0xca, 0xbc, 0x89, 0x76, 0x65, 0x35),
223 : LL(0x9b, 0x9b, 0x56, 0x9b, 0xac, 0xcd, 0x2b, 0x37),
224 : LL(0x8e, 0x8e, 0x02, 0x8e, 0x04, 0x8c, 0x01, 0x8a),
225 : LL(0xa3, 0xa3, 0xb6, 0xa3, 0x71, 0x15, 0x5b, 0xd2),
226 : LL(0x0c, 0x0c, 0x30, 0x0c, 0x60, 0x3c, 0x18, 0x6c),
227 : LL(0x7b, 0x7b, 0xf1, 0x7b, 0xff, 0x8a, 0xf6, 0x84),
228 : LL(0x35, 0x35, 0xd4, 0x35, 0xb5, 0xe1, 0x6a, 0x80),
229 : LL(0x1d, 0x1d, 0x74, 0x1d, 0xe8, 0x69, 0x3a, 0xf5),
230 : LL(0xe0, 0xe0, 0xa7, 0xe0, 0x53, 0x47, 0xdd, 0xb3),
231 : LL(0xd7, 0xd7, 0x7b, 0xd7, 0xf6, 0xac, 0xb3, 0x21),
232 : LL(0xc2, 0xc2, 0x2f, 0xc2, 0x5e, 0xed, 0x99, 0x9c),
233 : LL(0x2e, 0x2e, 0xb8, 0x2e, 0x6d, 0x96, 0x5c, 0x43),
234 : LL(0x4b, 0x4b, 0x31, 0x4b, 0x62, 0x7a, 0x96, 0x29),
235 : LL(0xfe, 0xfe, 0xdf, 0xfe, 0xa3, 0x21, 0xe1, 0x5d),
236 : LL(0x57, 0x57, 0x41, 0x57, 0x82, 0x16, 0xae, 0xd5),
237 : LL(0x15, 0x15, 0x54, 0x15, 0xa8, 0x41, 0x2a, 0xbd),
238 : LL(0x77, 0x77, 0xc1, 0x77, 0x9f, 0xb6, 0xee, 0xe8),
239 : LL(0x37, 0x37, 0xdc, 0x37, 0xa5, 0xeb, 0x6e, 0x92),
240 : LL(0xe5, 0xe5, 0xb3, 0xe5, 0x7b, 0x56, 0xd7, 0x9e),
241 : LL(0x9f, 0x9f, 0x46, 0x9f, 0x8c, 0xd9, 0x23, 0x13),
242 : LL(0xf0, 0xf0, 0xe7, 0xf0, 0xd3, 0x17, 0xfd, 0x23),
243 : LL(0x4a, 0x4a, 0x35, 0x4a, 0x6a, 0x7f, 0x94, 0x20),
244 : LL(0xda, 0xda, 0x4f, 0xda, 0x9e, 0x95, 0xa9, 0x44),
245 : LL(0x58, 0x58, 0x7d, 0x58, 0xfa, 0x25, 0xb0, 0xa2),
246 : LL(0xc9, 0xc9, 0x03, 0xc9, 0x06, 0xca, 0x8f, 0xcf),
247 : LL(0x29, 0x29, 0xa4, 0x29, 0x55, 0x8d, 0x52, 0x7c),
248 : LL(0x0a, 0x0a, 0x28, 0x0a, 0x50, 0x22, 0x14, 0x5a),
249 : LL(0xb1, 0xb1, 0xfe, 0xb1, 0xe1, 0x4f, 0x7f, 0x50),
250 : LL(0xa0, 0xa0, 0xba, 0xa0, 0x69, 0x1a, 0x5d, 0xc9),
251 : LL(0x6b, 0x6b, 0xb1, 0x6b, 0x7f, 0xda, 0xd6, 0x14),
252 : LL(0x85, 0x85, 0x2e, 0x85, 0x5c, 0xab, 0x17, 0xd9),
253 : LL(0xbd, 0xbd, 0xce, 0xbd, 0x81, 0x73, 0x67, 0x3c),
254 : LL(0x5d, 0x5d, 0x69, 0x5d, 0xd2, 0x34, 0xba, 0x8f),
255 : LL(0x10, 0x10, 0x40, 0x10, 0x80, 0x50, 0x20, 0x90),
256 : LL(0xf4, 0xf4, 0xf7, 0xf4, 0xf3, 0x03, 0xf5, 0x07),
257 : LL(0xcb, 0xcb, 0x0b, 0xcb, 0x16, 0xc0, 0x8b, 0xdd),
258 : LL(0x3e, 0x3e, 0xf8, 0x3e, 0xed, 0xc6, 0x7c, 0xd3),
259 : LL(0x05, 0x05, 0x14, 0x05, 0x28, 0x11, 0x0a, 0x2d),
260 : LL(0x67, 0x67, 0x81, 0x67, 0x1f, 0xe6, 0xce, 0x78),
261 : LL(0xe4, 0xe4, 0xb7, 0xe4, 0x73, 0x53, 0xd5, 0x97),
262 : LL(0x27, 0x27, 0x9c, 0x27, 0x25, 0xbb, 0x4e, 0x02),
263 : LL(0x41, 0x41, 0x19, 0x41, 0x32, 0x58, 0x82, 0x73),
264 : LL(0x8b, 0x8b, 0x16, 0x8b, 0x2c, 0x9d, 0x0b, 0xa7),
265 : LL(0xa7, 0xa7, 0xa6, 0xa7, 0x51, 0x01, 0x53, 0xf6),
266 : LL(0x7d, 0x7d, 0xe9, 0x7d, 0xcf, 0x94, 0xfa, 0xb2),
267 : LL(0x95, 0x95, 0x6e, 0x95, 0xdc, 0xfb, 0x37, 0x49),
268 : LL(0xd8, 0xd8, 0x47, 0xd8, 0x8e, 0x9f, 0xad, 0x56),
269 : LL(0xfb, 0xfb, 0xcb, 0xfb, 0x8b, 0x30, 0xeb, 0x70),
270 : LL(0xee, 0xee, 0x9f, 0xee, 0x23, 0x71, 0xc1, 0xcd),
271 : LL(0x7c, 0x7c, 0xed, 0x7c, 0xc7, 0x91, 0xf8, 0xbb),
272 : LL(0x66, 0x66, 0x85, 0x66, 0x17, 0xe3, 0xcc, 0x71),
273 : LL(0xdd, 0xdd, 0x53, 0xdd, 0xa6, 0x8e, 0xa7, 0x7b),
274 : LL(0x17, 0x17, 0x5c, 0x17, 0xb8, 0x4b, 0x2e, 0xaf),
275 : LL(0x47, 0x47, 0x01, 0x47, 0x02, 0x46, 0x8e, 0x45),
276 : LL(0x9e, 0x9e, 0x42, 0x9e, 0x84, 0xdc, 0x21, 0x1a),
277 : LL(0xca, 0xca, 0x0f, 0xca, 0x1e, 0xc5, 0x89, 0xd4),
278 : LL(0x2d, 0x2d, 0xb4, 0x2d, 0x75, 0x99, 0x5a, 0x58),
279 : LL(0xbf, 0xbf, 0xc6, 0xbf, 0x91, 0x79, 0x63, 0x2e),
280 : LL(0x07, 0x07, 0x1c, 0x07, 0x38, 0x1b, 0x0e, 0x3f),
281 : LL(0xad, 0xad, 0x8e, 0xad, 0x01, 0x23, 0x47, 0xac),
282 : LL(0x5a, 0x5a, 0x75, 0x5a, 0xea, 0x2f, 0xb4, 0xb0),
283 : LL(0x83, 0x83, 0x36, 0x83, 0x6c, 0xb5, 0x1b, 0xef),
284 : LL(0x33, 0x33, 0xcc, 0x33, 0x85, 0xff, 0x66, 0xb6),
285 : LL(0x63, 0x63, 0x91, 0x63, 0x3f, 0xf2, 0xc6, 0x5c),
286 : LL(0x02, 0x02, 0x08, 0x02, 0x10, 0x0a, 0x04, 0x12),
287 : LL(0xaa, 0xaa, 0x92, 0xaa, 0x39, 0x38, 0x49, 0x93),
288 : LL(0x71, 0x71, 0xd9, 0x71, 0xaf, 0xa8, 0xe2, 0xde),
289 : LL(0xc8, 0xc8, 0x07, 0xc8, 0x0e, 0xcf, 0x8d, 0xc6),
290 : LL(0x19, 0x19, 0x64, 0x19, 0xc8, 0x7d, 0x32, 0xd1),
291 : LL(0x49, 0x49, 0x39, 0x49, 0x72, 0x70, 0x92, 0x3b),
292 : LL(0xd9, 0xd9, 0x43, 0xd9, 0x86, 0x9a, 0xaf, 0x5f),
293 : LL(0xf2, 0xf2, 0xef, 0xf2, 0xc3, 0x1d, 0xf9, 0x31),
294 : LL(0xe3, 0xe3, 0xab, 0xe3, 0x4b, 0x48, 0xdb, 0xa8),
295 : LL(0x5b, 0x5b, 0x71, 0x5b, 0xe2, 0x2a, 0xb6, 0xb9),
296 : LL(0x88, 0x88, 0x1a, 0x88, 0x34, 0x92, 0x0d, 0xbc),
297 : LL(0x9a, 0x9a, 0x52, 0x9a, 0xa4, 0xc8, 0x29, 0x3e),
298 : LL(0x26, 0x26, 0x98, 0x26, 0x2d, 0xbe, 0x4c, 0x0b),
299 : LL(0x32, 0x32, 0xc8, 0x32, 0x8d, 0xfa, 0x64, 0xbf),
300 : LL(0xb0, 0xb0, 0xfa, 0xb0, 0xe9, 0x4a, 0x7d, 0x59),
301 : LL(0xe9, 0xe9, 0x83, 0xe9, 0x1b, 0x6a, 0xcf, 0xf2),
302 : LL(0x0f, 0x0f, 0x3c, 0x0f, 0x78, 0x33, 0x1e, 0x77),
303 : LL(0xd5, 0xd5, 0x73, 0xd5, 0xe6, 0xa6, 0xb7, 0x33),
304 : LL(0x80, 0x80, 0x3a, 0x80, 0x74, 0xba, 0x1d, 0xf4),
305 : LL(0xbe, 0xbe, 0xc2, 0xbe, 0x99, 0x7c, 0x61, 0x27),
306 : LL(0xcd, 0xcd, 0x13, 0xcd, 0x26, 0xde, 0x87, 0xeb),
307 : LL(0x34, 0x34, 0xd0, 0x34, 0xbd, 0xe4, 0x68, 0x89),
308 : LL(0x48, 0x48, 0x3d, 0x48, 0x7a, 0x75, 0x90, 0x32),
309 : LL(0xff, 0xff, 0xdb, 0xff, 0xab, 0x24, 0xe3, 0x54),
310 : LL(0x7a, 0x7a, 0xf5, 0x7a, 0xf7, 0x8f, 0xf4, 0x8d),
311 : LL(0x90, 0x90, 0x7a, 0x90, 0xf4, 0xea, 0x3d, 0x64),
312 : LL(0x5f, 0x5f, 0x61, 0x5f, 0xc2, 0x3e, 0xbe, 0x9d),
313 : LL(0x20, 0x20, 0x80, 0x20, 0x1d, 0xa0, 0x40, 0x3d),
314 : LL(0x68, 0x68, 0xbd, 0x68, 0x67, 0xd5, 0xd0, 0x0f),
315 : LL(0x1a, 0x1a, 0x68, 0x1a, 0xd0, 0x72, 0x34, 0xca),
316 : LL(0xae, 0xae, 0x82, 0xae, 0x19, 0x2c, 0x41, 0xb7),
317 : LL(0xb4, 0xb4, 0xea, 0xb4, 0xc9, 0x5e, 0x75, 0x7d),
318 : LL(0x54, 0x54, 0x4d, 0x54, 0x9a, 0x19, 0xa8, 0xce),
319 : LL(0x93, 0x93, 0x76, 0x93, 0xec, 0xe5, 0x3b, 0x7f),
320 : LL(0x22, 0x22, 0x88, 0x22, 0x0d, 0xaa, 0x44, 0x2f),
321 : LL(0x64, 0x64, 0x8d, 0x64, 0x07, 0xe9, 0xc8, 0x63),
322 : LL(0xf1, 0xf1, 0xe3, 0xf1, 0xdb, 0x12, 0xff, 0x2a),
323 : LL(0x73, 0x73, 0xd1, 0x73, 0xbf, 0xa2, 0xe6, 0xcc),
324 : LL(0x12, 0x12, 0x48, 0x12, 0x90, 0x5a, 0x24, 0x82),
325 : LL(0x40, 0x40, 0x1d, 0x40, 0x3a, 0x5d, 0x80, 0x7a),
326 : LL(0x08, 0x08, 0x20, 0x08, 0x40, 0x28, 0x10, 0x48),
327 : LL(0xc3, 0xc3, 0x2b, 0xc3, 0x56, 0xe8, 0x9b, 0x95),
328 : LL(0xec, 0xec, 0x97, 0xec, 0x33, 0x7b, 0xc5, 0xdf),
329 : LL(0xdb, 0xdb, 0x4b, 0xdb, 0x96, 0x90, 0xab, 0x4d),
330 : LL(0xa1, 0xa1, 0xbe, 0xa1, 0x61, 0x1f, 0x5f, 0xc0),
331 : LL(0x8d, 0x8d, 0x0e, 0x8d, 0x1c, 0x83, 0x07, 0x91),
332 : LL(0x3d, 0x3d, 0xf4, 0x3d, 0xf5, 0xc9, 0x7a, 0xc8),
333 : LL(0x97, 0x97, 0x66, 0x97, 0xcc, 0xf1, 0x33, 0x5b),
334 : LL(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00),
335 : LL(0xcf, 0xcf, 0x1b, 0xcf, 0x36, 0xd4, 0x83, 0xf9),
336 : LL(0x2b, 0x2b, 0xac, 0x2b, 0x45, 0x87, 0x56, 0x6e),
337 : LL(0x76, 0x76, 0xc5, 0x76, 0x97, 0xb3, 0xec, 0xe1),
338 : LL(0x82, 0x82, 0x32, 0x82, 0x64, 0xb0, 0x19, 0xe6),
339 : LL(0xd6, 0xd6, 0x7f, 0xd6, 0xfe, 0xa9, 0xb1, 0x28),
340 : LL(0x1b, 0x1b, 0x6c, 0x1b, 0xd8, 0x77, 0x36, 0xc3),
341 : LL(0xb5, 0xb5, 0xee, 0xb5, 0xc1, 0x5b, 0x77, 0x74),
342 : LL(0xaf, 0xaf, 0x86, 0xaf, 0x11, 0x29, 0x43, 0xbe),
343 : LL(0x6a, 0x6a, 0xb5, 0x6a, 0x77, 0xdf, 0xd4, 0x1d),
344 : LL(0x50, 0x50, 0x5d, 0x50, 0xba, 0x0d, 0xa0, 0xea),
345 : LL(0x45, 0x45, 0x09, 0x45, 0x12, 0x4c, 0x8a, 0x57),
346 : LL(0xf3, 0xf3, 0xeb, 0xf3, 0xcb, 0x18, 0xfb, 0x38),
347 : LL(0x30, 0x30, 0xc0, 0x30, 0x9d, 0xf0, 0x60, 0xad),
348 : LL(0xef, 0xef, 0x9b, 0xef, 0x2b, 0x74, 0xc3, 0xc4),
349 : LL(0x3f, 0x3f, 0xfc, 0x3f, 0xe5, 0xc3, 0x7e, 0xda),
350 : LL(0x55, 0x55, 0x49, 0x55, 0x92, 0x1c, 0xaa, 0xc7),
351 : LL(0xa2, 0xa2, 0xb2, 0xa2, 0x79, 0x10, 0x59, 0xdb),
352 : LL(0xea, 0xea, 0x8f, 0xea, 0x03, 0x65, 0xc9, 0xe9),
353 : LL(0x65, 0x65, 0x89, 0x65, 0x0f, 0xec, 0xca, 0x6a),
354 : LL(0xba, 0xba, 0xd2, 0xba, 0xb9, 0x68, 0x69, 0x03),
355 : LL(0x2f, 0x2f, 0xbc, 0x2f, 0x65, 0x93, 0x5e, 0x4a),
356 : LL(0xc0, 0xc0, 0x27, 0xc0, 0x4e, 0xe7, 0x9d, 0x8e),
357 : LL(0xde, 0xde, 0x5f, 0xde, 0xbe, 0x81, 0xa1, 0x60),
358 : LL(0x1c, 0x1c, 0x70, 0x1c, 0xe0, 0x6c, 0x38, 0xfc),
359 : LL(0xfd, 0xfd, 0xd3, 0xfd, 0xbb, 0x2e, 0xe7, 0x46),
360 : LL(0x4d, 0x4d, 0x29, 0x4d, 0x52, 0x64, 0x9a, 0x1f),
361 : LL(0x92, 0x92, 0x72, 0x92, 0xe4, 0xe0, 0x39, 0x76),
362 : LL(0x75, 0x75, 0xc9, 0x75, 0x8f, 0xbc, 0xea, 0xfa),
363 : LL(0x06, 0x06, 0x18, 0x06, 0x30, 0x1e, 0x0c, 0x36),
364 : LL(0x8a, 0x8a, 0x12, 0x8a, 0x24, 0x98, 0x09, 0xae),
365 : LL(0xb2, 0xb2, 0xf2, 0xb2, 0xf9, 0x40, 0x79, 0x4b),
366 : LL(0xe6, 0xe6, 0xbf, 0xe6, 0x63, 0x59, 0xd1, 0x85),
367 : LL(0x0e, 0x0e, 0x38, 0x0e, 0x70, 0x36, 0x1c, 0x7e),
368 : LL(0x1f, 0x1f, 0x7c, 0x1f, 0xf8, 0x63, 0x3e, 0xe7),
369 : LL(0x62, 0x62, 0x95, 0x62, 0x37, 0xf7, 0xc4, 0x55),
370 : LL(0xd4, 0xd4, 0x77, 0xd4, 0xee, 0xa3, 0xb5, 0x3a),
371 : LL(0xa8, 0xa8, 0x9a, 0xa8, 0x29, 0x32, 0x4d, 0x81),
372 : LL(0x96, 0x96, 0x62, 0x96, 0xc4, 0xf4, 0x31, 0x52),
373 : LL(0xf9, 0xf9, 0xc3, 0xf9, 0x9b, 0x3a, 0xef, 0x62),
374 : LL(0xc5, 0xc5, 0x33, 0xc5, 0x66, 0xf6, 0x97, 0xa3),
375 : LL(0x25, 0x25, 0x94, 0x25, 0x35, 0xb1, 0x4a, 0x10),
376 : LL(0x59, 0x59, 0x79, 0x59, 0xf2, 0x20, 0xb2, 0xab),
377 : LL(0x84, 0x84, 0x2a, 0x84, 0x54, 0xae, 0x15, 0xd0),
378 : LL(0x72, 0x72, 0xd5, 0x72, 0xb7, 0xa7, 0xe4, 0xc5),
379 : LL(0x39, 0x39, 0xe4, 0x39, 0xd5, 0xdd, 0x72, 0xec),
380 : LL(0x4c, 0x4c, 0x2d, 0x4c, 0x5a, 0x61, 0x98, 0x16),
381 : LL(0x5e, 0x5e, 0x65, 0x5e, 0xca, 0x3b, 0xbc, 0x94),
382 : LL(0x78, 0x78, 0xfd, 0x78, 0xe7, 0x85, 0xf0, 0x9f),
383 : LL(0x38, 0x38, 0xe0, 0x38, 0xdd, 0xd8, 0x70, 0xe5),
384 : LL(0x8c, 0x8c, 0x0a, 0x8c, 0x14, 0x86, 0x05, 0x98),
385 : LL(0xd1, 0xd1, 0x63, 0xd1, 0xc6, 0xb2, 0xbf, 0x17),
386 : LL(0xa5, 0xa5, 0xae, 0xa5, 0x41, 0x0b, 0x57, 0xe4),
387 : LL(0xe2, 0xe2, 0xaf, 0xe2, 0x43, 0x4d, 0xd9, 0xa1),
388 : LL(0x61, 0x61, 0x99, 0x61, 0x2f, 0xf8, 0xc2, 0x4e),
389 : LL(0xb3, 0xb3, 0xf6, 0xb3, 0xf1, 0x45, 0x7b, 0x42),
390 : LL(0x21, 0x21, 0x84, 0x21, 0x15, 0xa5, 0x42, 0x34),
391 : LL(0x9c, 0x9c, 0x4a, 0x9c, 0x94, 0xd6, 0x25, 0x08),
392 : LL(0x1e, 0x1e, 0x78, 0x1e, 0xf0, 0x66, 0x3c, 0xee),
393 : LL(0x43, 0x43, 0x11, 0x43, 0x22, 0x52, 0x86, 0x61),
394 : LL(0xc7, 0xc7, 0x3b, 0xc7, 0x76, 0xfc, 0x93, 0xb1),
395 : LL(0xfc, 0xfc, 0xd7, 0xfc, 0xb3, 0x2b, 0xe5, 0x4f),
396 : LL(0x04, 0x04, 0x10, 0x04, 0x20, 0x14, 0x08, 0x24),
397 : LL(0x51, 0x51, 0x59, 0x51, 0xb2, 0x08, 0xa2, 0xe3),
398 : LL(0x99, 0x99, 0x5e, 0x99, 0xbc, 0xc7, 0x2f, 0x25),
399 : LL(0x6d, 0x6d, 0xa9, 0x6d, 0x4f, 0xc4, 0xda, 0x22),
400 : LL(0x0d, 0x0d, 0x34, 0x0d, 0x68, 0x39, 0x1a, 0x65),
401 : LL(0xfa, 0xfa, 0xcf, 0xfa, 0x83, 0x35, 0xe9, 0x79),
402 : LL(0xdf, 0xdf, 0x5b, 0xdf, 0xb6, 0x84, 0xa3, 0x69),
403 : LL(0x7e, 0x7e, 0xe5, 0x7e, 0xd7, 0x9b, 0xfc, 0xa9),
404 : LL(0x24, 0x24, 0x90, 0x24, 0x3d, 0xb4, 0x48, 0x19),
405 : LL(0x3b, 0x3b, 0xec, 0x3b, 0xc5, 0xd7, 0x76, 0xfe),
406 : LL(0xab, 0xab, 0x96, 0xab, 0x31, 0x3d, 0x4b, 0x9a),
407 : LL(0xce, 0xce, 0x1f, 0xce, 0x3e, 0xd1, 0x81, 0xf0),
408 : LL(0x11, 0x11, 0x44, 0x11, 0x88, 0x55, 0x22, 0x99),
409 : LL(0x8f, 0x8f, 0x06, 0x8f, 0x0c, 0x89, 0x03, 0x83),
410 : LL(0x4e, 0x4e, 0x25, 0x4e, 0x4a, 0x6b, 0x9c, 0x04),
411 : LL(0xb7, 0xb7, 0xe6, 0xb7, 0xd1, 0x51, 0x73, 0x66),
412 : LL(0xeb, 0xeb, 0x8b, 0xeb, 0x0b, 0x60, 0xcb, 0xe0),
413 : LL(0x3c, 0x3c, 0xf0, 0x3c, 0xfd, 0xcc, 0x78, 0xc1),
414 : LL(0x81, 0x81, 0x3e, 0x81, 0x7c, 0xbf, 0x1f, 0xfd),
415 : LL(0x94, 0x94, 0x6a, 0x94, 0xd4, 0xfe, 0x35, 0x40),
416 : LL(0xf7, 0xf7, 0xfb, 0xf7, 0xeb, 0x0c, 0xf3, 0x1c),
417 : LL(0xb9, 0xb9, 0xde, 0xb9, 0xa1, 0x67, 0x6f, 0x18),
418 : LL(0x13, 0x13, 0x4c, 0x13, 0x98, 0x5f, 0x26, 0x8b),
419 : LL(0x2c, 0x2c, 0xb0, 0x2c, 0x7d, 0x9c, 0x58, 0x51),
420 : LL(0xd3, 0xd3, 0x6b, 0xd3, 0xd6, 0xb8, 0xbb, 0x05),
421 : LL(0xe7, 0xe7, 0xbb, 0xe7, 0x6b, 0x5c, 0xd3, 0x8c),
422 : LL(0x6e, 0x6e, 0xa5, 0x6e, 0x57, 0xcb, 0xdc, 0x39),
423 : LL(0xc4, 0xc4, 0x37, 0xc4, 0x6e, 0xf3, 0x95, 0xaa),
424 : LL(0x03, 0x03, 0x0c, 0x03, 0x18, 0x0f, 0x06, 0x1b),
425 : LL(0x56, 0x56, 0x45, 0x56, 0x8a, 0x13, 0xac, 0xdc),
426 : LL(0x44, 0x44, 0x0d, 0x44, 0x1a, 0x49, 0x88, 0x5e),
427 : LL(0x7f, 0x7f, 0xe1, 0x7f, 0xdf, 0x9e, 0xfe, 0xa0),
428 : LL(0xa9, 0xa9, 0x9e, 0xa9, 0x21, 0x37, 0x4f, 0x88),
429 : LL(0x2a, 0x2a, 0xa8, 0x2a, 0x4d, 0x82, 0x54, 0x67),
430 : LL(0xbb, 0xbb, 0xd6, 0xbb, 0xb1, 0x6d, 0x6b, 0x0a),
431 : LL(0xc1, 0xc1, 0x23, 0xc1, 0x46, 0xe2, 0x9f, 0x87),
432 : LL(0x53, 0x53, 0x51, 0x53, 0xa2, 0x02, 0xa6, 0xf1),
433 : LL(0xdc, 0xdc, 0x57, 0xdc, 0xae, 0x8b, 0xa5, 0x72),
434 : LL(0x0b, 0x0b, 0x2c, 0x0b, 0x58, 0x27, 0x16, 0x53),
435 : LL(0x9d, 0x9d, 0x4e, 0x9d, 0x9c, 0xd3, 0x27, 0x01),
436 : LL(0x6c, 0x6c, 0xad, 0x6c, 0x47, 0xc1, 0xd8, 0x2b),
437 : LL(0x31, 0x31, 0xc4, 0x31, 0x95, 0xf5, 0x62, 0xa4),
438 : LL(0x74, 0x74, 0xcd, 0x74, 0x87, 0xb9, 0xe8, 0xf3),
439 : LL(0xf6, 0xf6, 0xff, 0xf6, 0xe3, 0x09, 0xf1, 0x15),
440 : LL(0x46, 0x46, 0x05, 0x46, 0x0a, 0x43, 0x8c, 0x4c),
441 : LL(0xac, 0xac, 0x8a, 0xac, 0x09, 0x26, 0x45, 0xa5),
442 : LL(0x89, 0x89, 0x1e, 0x89, 0x3c, 0x97, 0x0f, 0xb5),
443 : LL(0x14, 0x14, 0x50, 0x14, 0xa0, 0x44, 0x28, 0xb4),
444 : LL(0xe1, 0xe1, 0xa3, 0xe1, 0x5b, 0x42, 0xdf, 0xba),
445 : LL(0x16, 0x16, 0x58, 0x16, 0xb0, 0x4e, 0x2c, 0xa6),
446 : LL(0x3a, 0x3a, 0xe8, 0x3a, 0xcd, 0xd2, 0x74, 0xf7),
447 : LL(0x69, 0x69, 0xb9, 0x69, 0x6f, 0xd0, 0xd2, 0x06),
448 : LL(0x09, 0x09, 0x24, 0x09, 0x48, 0x2d, 0x12, 0x41),
449 : LL(0x70, 0x70, 0xdd, 0x70, 0xa7, 0xad, 0xe0, 0xd7),
450 : LL(0xb6, 0xb6, 0xe2, 0xb6, 0xd9, 0x54, 0x71, 0x6f),
451 : LL(0xd0, 0xd0, 0x67, 0xd0, 0xce, 0xb7, 0xbd, 0x1e),
452 : LL(0xed, 0xed, 0x93, 0xed, 0x3b, 0x7e, 0xc7, 0xd6),
453 : LL(0xcc, 0xcc, 0x17, 0xcc, 0x2e, 0xdb, 0x85, 0xe2),
454 : LL(0x42, 0x42, 0x15, 0x42, 0x2a, 0x57, 0x84, 0x68),
455 : LL(0x98, 0x98, 0x5a, 0x98, 0xb4, 0xc2, 0x2d, 0x2c),
456 : LL(0xa4, 0xa4, 0xaa, 0xa4, 0x49, 0x0e, 0x55, 0xed),
457 : LL(0x28, 0x28, 0xa0, 0x28, 0x5d, 0x88, 0x50, 0x75),
458 : LL(0x5c, 0x5c, 0x6d, 0x5c, 0xda, 0x31, 0xb8, 0x86),
459 : LL(0xf8, 0xf8, 0xc7, 0xf8, 0x93, 0x3f, 0xed, 0x6b),
460 : LL(0x86, 0x86, 0x22, 0x86, 0x44, 0xa4, 0x11, 0xc2),
461 : #define RC (&(Cx.q[256*N]))
462 : 0x18, 0x23, 0xc6, 0xe8, 0x87, 0xb8, 0x01, 0x4f,
463 : /* rc[ROUNDS] */
464 : 0x36, 0xa6, 0xd2, 0xf5, 0x79, 0x6f, 0x91, 0x52, 0x60, 0xbc, 0x9b,
465 : 0x8e, 0xa3, 0x0c, 0x7b, 0x35, 0x1d, 0xe0, 0xd7, 0xc2, 0x2e, 0x4b,
466 : 0xfe, 0x57, 0x15, 0x77, 0x37, 0xe5, 0x9f, 0xf0, 0x4a, 0xda, 0x58,
467 : 0xc9, 0x29, 0x0a, 0xb1, 0xa0, 0x6b, 0x85, 0xbd, 0x5d, 0x10, 0xf4,
468 : 0xcb, 0x3e, 0x05, 0x67, 0xe4, 0x27, 0x41, 0x8b, 0xa7, 0x7d, 0x95,
469 : 0xd8, 0xfb, 0xee, 0x7c, 0x66, 0xdd, 0x17, 0x47, 0x9e, 0xca, 0x2d,
470 : 0xbf, 0x07, 0xad, 0x5a, 0x83, 0x33
471 : }
472 : };
473 :
474 0 : void whirlpool_block(WHIRLPOOL_CTX *ctx, const void *inp, size_t n)
475 : {
476 : int r;
477 : const u8 *p = inp;
478 : union {
479 : u64 q[8];
480 : u8 c[64];
481 : } S, K, *H = (void *)ctx->H.q;
482 :
483 : #ifdef GO_FOR_MMX
484 : GO_FOR_MMX(ctx, inp, n);
485 : #endif
486 : do {
487 : #ifdef OPENSSL_SMALL_FOOTPRINT
488 : u64 L[8];
489 : int i;
490 :
491 : for (i = 0; i < 64; i++)
492 : S.c[i] = (K.c[i] = H->c[i]) ^ p[i];
493 : for (r = 0; r < ROUNDS; r++) {
494 : for (i = 0; i < 8; i++) {
495 : L[i] = i ? 0 : RC[r];
496 : L[i] ^= C0(K, i) ^ C1(K, (i - 1) & 7) ^
497 : C2(K, (i - 2) & 7) ^ C3(K, (i - 3) & 7) ^
498 : C4(K, (i - 4) & 7) ^ C5(K, (i - 5) & 7) ^
499 : C6(K, (i - 6) & 7) ^ C7(K, (i - 7) & 7);
500 : }
501 : memcpy(K.q, L, 64);
502 : for (i = 0; i < 8; i++) {
503 : L[i] ^= C0(S, i) ^ C1(S, (i - 1) & 7) ^
504 : C2(S, (i - 2) & 7) ^ C3(S, (i - 3) & 7) ^
505 : C4(S, (i - 4) & 7) ^ C5(S, (i - 5) & 7) ^
506 : C6(S, (i - 6) & 7) ^ C7(S, (i - 7) & 7);
507 : }
508 : memcpy(S.q, L, 64);
509 : }
510 : for (i = 0; i < 64; i++)
511 : H->c[i] ^= S.c[i] ^ p[i];
512 : #else
513 : u64 L0, L1, L2, L3, L4, L5, L6, L7;
514 :
515 : # ifdef STRICT_ALIGNMENT
516 : if ((size_t)p & 7) {
517 : memcpy(S.c, p, 64);
518 : S.q[0] ^= (K.q[0] = H->q[0]);
519 : S.q[1] ^= (K.q[1] = H->q[1]);
520 : S.q[2] ^= (K.q[2] = H->q[2]);
521 : S.q[3] ^= (K.q[3] = H->q[3]);
522 : S.q[4] ^= (K.q[4] = H->q[4]);
523 : S.q[5] ^= (K.q[5] = H->q[5]);
524 : S.q[6] ^= (K.q[6] = H->q[6]);
525 : S.q[7] ^= (K.q[7] = H->q[7]);
526 : } else
527 : # endif
528 : {
529 : const u64 *pa = (const u64 *)p;
530 0 : S.q[0] = (K.q[0] = H->q[0]) ^ pa[0];
531 0 : S.q[1] = (K.q[1] = H->q[1]) ^ pa[1];
532 0 : S.q[2] = (K.q[2] = H->q[2]) ^ pa[2];
533 0 : S.q[3] = (K.q[3] = H->q[3]) ^ pa[3];
534 0 : S.q[4] = (K.q[4] = H->q[4]) ^ pa[4];
535 0 : S.q[5] = (K.q[5] = H->q[5]) ^ pa[5];
536 0 : S.q[6] = (K.q[6] = H->q[6]) ^ pa[6];
537 0 : S.q[7] = (K.q[7] = H->q[7]) ^ pa[7];
538 : }
539 :
540 0 : for (r = 0; r < ROUNDS; r++) {
541 : # ifdef SMALL_REGISTER_BANK
542 : L0 = C0(K, 0) ^ C1(K, 7) ^ C2(K, 6) ^ C3(K, 5) ^
543 : C4(K, 4) ^ C5(K, 3) ^ C6(K, 2) ^ C7(K, 1) ^ RC[r];
544 : L1 = C0(K, 1) ^ C1(K, 0) ^ C2(K, 7) ^ C3(K, 6) ^
545 : C4(K, 5) ^ C5(K, 4) ^ C6(K, 3) ^ C7(K, 2);
546 : L2 = C0(K, 2) ^ C1(K, 1) ^ C2(K, 0) ^ C3(K, 7) ^
547 : C4(K, 6) ^ C5(K, 5) ^ C6(K, 4) ^ C7(K, 3);
548 : L3 = C0(K, 3) ^ C1(K, 2) ^ C2(K, 1) ^ C3(K, 0) ^
549 : C4(K, 7) ^ C5(K, 6) ^ C6(K, 5) ^ C7(K, 4);
550 : L4 = C0(K, 4) ^ C1(K, 3) ^ C2(K, 2) ^ C3(K, 1) ^
551 : C4(K, 0) ^ C5(K, 7) ^ C6(K, 6) ^ C7(K, 5);
552 : L5 = C0(K, 5) ^ C1(K, 4) ^ C2(K, 3) ^ C3(K, 2) ^
553 : C4(K, 1) ^ C5(K, 0) ^ C6(K, 7) ^ C7(K, 6);
554 : L6 = C0(K, 6) ^ C1(K, 5) ^ C2(K, 4) ^ C3(K, 3) ^
555 : C4(K, 2) ^ C5(K, 1) ^ C6(K, 0) ^ C7(K, 7);
556 : L7 = C0(K, 7) ^ C1(K, 6) ^ C2(K, 5) ^ C3(K, 4) ^
557 : C4(K, 3) ^ C5(K, 2) ^ C6(K, 1) ^ C7(K, 0);
558 :
559 : K.q[0] = L0;
560 : K.q[1] = L1;
561 : K.q[2] = L2;
562 : K.q[3] = L3;
563 : K.q[4] = L4;
564 : K.q[5] = L5;
565 : K.q[6] = L6;
566 : K.q[7] = L7;
567 :
568 : L0 ^= C0(S, 0) ^ C1(S, 7) ^ C2(S, 6) ^ C3(S, 5) ^
569 : C4(S, 4) ^ C5(S, 3) ^ C6(S, 2) ^ C7(S, 1);
570 : L1 ^= C0(S, 1) ^ C1(S, 0) ^ C2(S, 7) ^ C3(S, 6) ^
571 : C4(S, 5) ^ C5(S, 4) ^ C6(S, 3) ^ C7(S, 2);
572 : L2 ^= C0(S, 2) ^ C1(S, 1) ^ C2(S, 0) ^ C3(S, 7) ^
573 : C4(S, 6) ^ C5(S, 5) ^ C6(S, 4) ^ C7(S, 3);
574 : L3 ^= C0(S, 3) ^ C1(S, 2) ^ C2(S, 1) ^ C3(S, 0) ^
575 : C4(S, 7) ^ C5(S, 6) ^ C6(S, 5) ^ C7(S, 4);
576 : L4 ^= C0(S, 4) ^ C1(S, 3) ^ C2(S, 2) ^ C3(S, 1) ^
577 : C4(S, 0) ^ C5(S, 7) ^ C6(S, 6) ^ C7(S, 5);
578 : L5 ^= C0(S, 5) ^ C1(S, 4) ^ C2(S, 3) ^ C3(S, 2) ^
579 : C4(S, 1) ^ C5(S, 0) ^ C6(S, 7) ^ C7(S, 6);
580 : L6 ^= C0(S, 6) ^ C1(S, 5) ^ C2(S, 4) ^ C3(S, 3) ^
581 : C4(S, 2) ^ C5(S, 1) ^ C6(S, 0) ^ C7(S, 7);
582 : L7 ^= C0(S, 7) ^ C1(S, 6) ^ C2(S, 5) ^ C3(S, 4) ^
583 : C4(S, 3) ^ C5(S, 2) ^ C6(S, 1) ^ C7(S, 0);
584 :
585 : S.q[0] = L0;
586 : S.q[1] = L1;
587 : S.q[2] = L2;
588 : S.q[3] = L3;
589 : S.q[4] = L4;
590 : S.q[5] = L5;
591 : S.q[6] = L6;
592 : S.q[7] = L7;
593 : # else
594 0 : L0 = C0(K, 0);
595 0 : L1 = C1(K, 0);
596 0 : L2 = C2(K, 0);
597 0 : L3 = C3(K, 0);
598 0 : L4 = C4(K, 0);
599 0 : L5 = C5(K, 0);
600 0 : L6 = C6(K, 0);
601 0 : L7 = C7(K, 0);
602 0 : L0 ^= RC[r];
603 :
604 0 : L1 ^= C0(K, 1);
605 0 : L2 ^= C1(K, 1);
606 0 : L3 ^= C2(K, 1);
607 0 : L4 ^= C3(K, 1);
608 0 : L5 ^= C4(K, 1);
609 0 : L6 ^= C5(K, 1);
610 0 : L7 ^= C6(K, 1);
611 0 : L0 ^= C7(K, 1);
612 :
613 0 : L2 ^= C0(K, 2);
614 0 : L3 ^= C1(K, 2);
615 0 : L4 ^= C2(K, 2);
616 0 : L5 ^= C3(K, 2);
617 0 : L6 ^= C4(K, 2);
618 0 : L7 ^= C5(K, 2);
619 0 : L0 ^= C6(K, 2);
620 0 : L1 ^= C7(K, 2);
621 :
622 0 : L3 ^= C0(K, 3);
623 0 : L4 ^= C1(K, 3);
624 0 : L5 ^= C2(K, 3);
625 0 : L6 ^= C3(K, 3);
626 0 : L7 ^= C4(K, 3);
627 0 : L0 ^= C5(K, 3);
628 0 : L1 ^= C6(K, 3);
629 0 : L2 ^= C7(K, 3);
630 :
631 0 : L4 ^= C0(K, 4);
632 0 : L5 ^= C1(K, 4);
633 0 : L6 ^= C2(K, 4);
634 0 : L7 ^= C3(K, 4);
635 0 : L0 ^= C4(K, 4);
636 0 : L1 ^= C5(K, 4);
637 0 : L2 ^= C6(K, 4);
638 0 : L3 ^= C7(K, 4);
639 :
640 0 : L5 ^= C0(K, 5);
641 0 : L6 ^= C1(K, 5);
642 0 : L7 ^= C2(K, 5);
643 0 : L0 ^= C3(K, 5);
644 0 : L1 ^= C4(K, 5);
645 0 : L2 ^= C5(K, 5);
646 0 : L3 ^= C6(K, 5);
647 0 : L4 ^= C7(K, 5);
648 :
649 0 : L6 ^= C0(K, 6);
650 0 : L7 ^= C1(K, 6);
651 0 : L0 ^= C2(K, 6);
652 0 : L1 ^= C3(K, 6);
653 0 : L2 ^= C4(K, 6);
654 0 : L3 ^= C5(K, 6);
655 0 : L4 ^= C6(K, 6);
656 0 : L5 ^= C7(K, 6);
657 :
658 0 : L7 ^= C0(K, 7);
659 0 : L0 ^= C1(K, 7);
660 0 : L1 ^= C2(K, 7);
661 0 : L2 ^= C3(K, 7);
662 0 : L3 ^= C4(K, 7);
663 0 : L4 ^= C5(K, 7);
664 0 : L5 ^= C6(K, 7);
665 0 : L6 ^= C7(K, 7);
666 :
667 0 : K.q[0] = L0;
668 0 : K.q[1] = L1;
669 0 : K.q[2] = L2;
670 0 : K.q[3] = L3;
671 0 : K.q[4] = L4;
672 0 : K.q[5] = L5;
673 0 : K.q[6] = L6;
674 0 : K.q[7] = L7;
675 :
676 0 : L0 ^= C0(S, 0);
677 0 : L1 ^= C1(S, 0);
678 0 : L2 ^= C2(S, 0);
679 0 : L3 ^= C3(S, 0);
680 0 : L4 ^= C4(S, 0);
681 0 : L5 ^= C5(S, 0);
682 0 : L6 ^= C6(S, 0);
683 0 : L7 ^= C7(S, 0);
684 :
685 0 : L1 ^= C0(S, 1);
686 0 : L2 ^= C1(S, 1);
687 0 : L3 ^= C2(S, 1);
688 0 : L4 ^= C3(S, 1);
689 0 : L5 ^= C4(S, 1);
690 0 : L6 ^= C5(S, 1);
691 0 : L7 ^= C6(S, 1);
692 0 : L0 ^= C7(S, 1);
693 :
694 0 : L2 ^= C0(S, 2);
695 0 : L3 ^= C1(S, 2);
696 0 : L4 ^= C2(S, 2);
697 0 : L5 ^= C3(S, 2);
698 0 : L6 ^= C4(S, 2);
699 0 : L7 ^= C5(S, 2);
700 0 : L0 ^= C6(S, 2);
701 0 : L1 ^= C7(S, 2);
702 :
703 0 : L3 ^= C0(S, 3);
704 0 : L4 ^= C1(S, 3);
705 0 : L5 ^= C2(S, 3);
706 0 : L6 ^= C3(S, 3);
707 0 : L7 ^= C4(S, 3);
708 0 : L0 ^= C5(S, 3);
709 0 : L1 ^= C6(S, 3);
710 0 : L2 ^= C7(S, 3);
711 :
712 0 : L4 ^= C0(S, 4);
713 0 : L5 ^= C1(S, 4);
714 0 : L6 ^= C2(S, 4);
715 0 : L7 ^= C3(S, 4);
716 0 : L0 ^= C4(S, 4);
717 0 : L1 ^= C5(S, 4);
718 0 : L2 ^= C6(S, 4);
719 0 : L3 ^= C7(S, 4);
720 :
721 0 : L5 ^= C0(S, 5);
722 0 : L6 ^= C1(S, 5);
723 0 : L7 ^= C2(S, 5);
724 0 : L0 ^= C3(S, 5);
725 0 : L1 ^= C4(S, 5);
726 0 : L2 ^= C5(S, 5);
727 0 : L3 ^= C6(S, 5);
728 0 : L4 ^= C7(S, 5);
729 :
730 0 : L6 ^= C0(S, 6);
731 0 : L7 ^= C1(S, 6);
732 0 : L0 ^= C2(S, 6);
733 0 : L1 ^= C3(S, 6);
734 0 : L2 ^= C4(S, 6);
735 0 : L3 ^= C5(S, 6);
736 0 : L4 ^= C6(S, 6);
737 0 : L5 ^= C7(S, 6);
738 :
739 0 : L7 ^= C0(S, 7);
740 0 : L0 ^= C1(S, 7);
741 0 : L1 ^= C2(S, 7);
742 0 : L2 ^= C3(S, 7);
743 0 : L3 ^= C4(S, 7);
744 0 : L4 ^= C5(S, 7);
745 0 : L5 ^= C6(S, 7);
746 0 : L6 ^= C7(S, 7);
747 :
748 0 : S.q[0] = L0;
749 0 : S.q[1] = L1;
750 0 : S.q[2] = L2;
751 0 : S.q[3] = L3;
752 0 : S.q[4] = L4;
753 0 : S.q[5] = L5;
754 0 : S.q[6] = L6;
755 0 : S.q[7] = L7;
756 : # endif
757 : }
758 :
759 : # ifdef STRICT_ALIGNMENT
760 : if ((size_t)p & 7) {
761 : int i;
762 : for (i = 0; i < 64; i++)
763 : H->c[i] ^= S.c[i] ^ p[i];
764 : } else
765 : # endif
766 : {
767 : const u64 *pa = (const u64 *)p;
768 0 : H->q[0] ^= S.q[0] ^ pa[0];
769 0 : H->q[1] ^= S.q[1] ^ pa[1];
770 0 : H->q[2] ^= S.q[2] ^ pa[2];
771 0 : H->q[3] ^= S.q[3] ^ pa[3];
772 0 : H->q[4] ^= S.q[4] ^ pa[4];
773 0 : H->q[5] ^= S.q[5] ^ pa[5];
774 0 : H->q[6] ^= S.q[6] ^ pa[6];
775 0 : H->q[7] ^= S.q[7] ^ pa[7];
776 : }
777 : #endif
778 0 : p += 64;
779 0 : } while (--n);
780 0 : }
|