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