Blame crypto/whrlpool/wp_block.c

Packit c4476c
/*
Packit c4476c
 * Copyright 2005-2019 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
 *
Packit c4476c
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
 * this file except in compliance with the License.  You can obtain a copy
Packit c4476c
 * in the file LICENSE in the source distribution or at
Packit c4476c
 * https://www.openssl.org/source/license.html
Packit c4476c
 */
Packit c4476c
Packit c4476c
/**
Packit c4476c
 * The Whirlpool hashing function.
Packit c4476c
 *
Packit c4476c
 * See
Packit c4476c
 *      P.S.L.M. Barreto, V. Rijmen,
Packit c4476c
 *      ``The Whirlpool hashing function,''
Packit c4476c
 *      NESSIE submission, 2000 (tweaked version, 2001),
Packit c4476c
 *      <https://www.cosic.esat.kuleuven.ac.be/nessie/workshop/submissions/whirlpool.zip>
Packit c4476c
 *
Packit c4476c
 * Based on "@version 3.0 (2003.03.12)" by Paulo S.L.M. Barreto and
Packit c4476c
 * Vincent Rijmen. Lookup "reference implementations" on
Packit c4476c
 * <http://planeta.terra.com.br/informatica/paulobarreto/>
Packit c4476c
 *
Packit c4476c
 * =============================================================================
Packit c4476c
 *
Packit c4476c
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
Packit c4476c
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Packit c4476c
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit c4476c
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
Packit c4476c
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Packit c4476c
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Packit c4476c
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Packit c4476c
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
Packit c4476c
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
Packit c4476c
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
Packit c4476c
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit c4476c
 *
Packit c4476c
 */
Packit c4476c
Packit c4476c
#include "wp_local.h"
Packit c4476c
#include <string.h>
Packit c4476c
Packit c4476c
typedef unsigned char u8;
Packit c4476c
#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32)
Packit c4476c
typedef unsigned __int64 u64;
Packit c4476c
#elif defined(__arch64__)
Packit c4476c
typedef unsigned long u64;
Packit c4476c
#else
Packit c4476c
typedef unsigned long long u64;
Packit c4476c
#endif
Packit c4476c
Packit c4476c
#define ROUNDS  10
Packit c4476c
Packit c4476c
#define STRICT_ALIGNMENT
Packit c4476c
#if !defined(PEDANTIC) && (defined(__i386) || defined(__i386__) || \
Packit c4476c
                           defined(__x86_64) || defined(__x86_64__) || \
Packit c4476c
                           defined(_M_IX86) || defined(_M_AMD64) || \
Packit c4476c
                           defined(_M_X64))
Packit c4476c
/*
Packit c4476c
 * Well, formally there're couple of other architectures, which permit
Packit c4476c
 * unaligned loads, specifically those not crossing cache lines, IA-64 and
Packit c4476c
 * PowerPC...
Packit c4476c
 */
Packit c4476c
# undef STRICT_ALIGNMENT
Packit c4476c
#endif
Packit c4476c
Packit c4476c
#undef SMALL_REGISTER_BANK
Packit c4476c
#if defined(__i386) || defined(__i386__) || defined(_M_IX86)
Packit c4476c
# define SMALL_REGISTER_BANK
Packit c4476c
# if defined(WHIRLPOOL_ASM)
Packit c4476c
#  ifndef OPENSSL_SMALL_FOOTPRINT
Packit c4476c
/*
Packit c4476c
 * it appears that for elder non-MMX
Packit c4476c
 * CPUs this is actually faster!
Packit c4476c
 */
Packit c4476c
#   define OPENSSL_SMALL_FOOTPRINT
Packit c4476c
#  endif
Packit c4476c
#  define GO_FOR_MMX(ctx,inp,num)     do {                    \
Packit c4476c
        extern unsigned long OPENSSL_ia32cap_P[];               \
Packit c4476c
        void whirlpool_block_mmx(void *,const void *,size_t);   \
Packit c4476c
        if (!(OPENSSL_ia32cap_P[0] & (1<<23)))  break;          \
Packit c4476c
        whirlpool_block_mmx(ctx->H.c,inp,num);  return;         \
Packit c4476c
                                        } while (0)
Packit c4476c
# endif
Packit c4476c
#endif
Packit c4476c
Packit c4476c
#undef ROTATE
Packit c4476c
#ifndef PEDANTIC
Packit c4476c
# if defined(_MSC_VER)
Packit c4476c
#  if defined(_WIN64)            /* applies to both IA-64 and AMD64 */
Packit c4476c
#   include <stdlib.h>
Packit c4476c
#   pragma intrinsic(_rotl64)
Packit c4476c
#   define ROTATE(a,n) _rotl64((a),n)
Packit c4476c
#  endif
Packit c4476c
# elif defined(__GNUC__) && __GNUC__>=2
Packit c4476c
#  if defined(__x86_64) || defined(__x86_64__)
Packit c4476c
#   if defined(L_ENDIAN)
Packit c4476c
#    define ROTATE(a,n)       ({ u64 ret; asm ("rolq %1,%0"   \
Packit c4476c
                                   : "=r"(ret) : "J"(n),"0"(a) : "cc"); ret; })
Packit c4476c
#   elif defined(B_ENDIAN)
Packit c4476c
       /*
Packit c4476c
        * Most will argue that x86_64 is always little-endian. Well, yes, but
Packit c4476c
        * then we have stratus.com who has modified gcc to "emulate"
Packit c4476c
        * big-endian on x86. Is there evidence that they [or somebody else]
Packit c4476c
        * won't do same for x86_64? Naturally no. And this line is waiting
Packit c4476c
        * ready for that brave soul:-)
Packit c4476c
        */
Packit c4476c
#    define ROTATE(a,n)       ({ u64 ret; asm ("rorq %1,%0"   \
Packit c4476c
                                   : "=r"(ret) : "J"(n),"0"(a) : "cc"); ret; })
Packit c4476c
#   endif
Packit c4476c
#  elif defined(__ia64) || defined(__ia64__)
Packit c4476c
#   if defined(L_ENDIAN)
Packit c4476c
#    define ROTATE(a,n)       ({ u64 ret; asm ("shrp %0=%1,%1,%2"     \
Packit c4476c
                                   : "=r"(ret) : "r"(a),"M"(64-(n))); ret; })
Packit c4476c
#   elif defined(B_ENDIAN)
Packit c4476c
#    define ROTATE(a,n)       ({ u64 ret; asm ("shrp %0=%1,%1,%2"     \
Packit c4476c
                                   : "=r"(ret) : "r"(a),"M"(n)); ret; })
Packit c4476c
#   endif
Packit c4476c
#  endif
Packit c4476c
# endif
Packit c4476c
#endif
Packit c4476c
Packit c4476c
#if defined(OPENSSL_SMALL_FOOTPRINT)
Packit c4476c
# if !defined(ROTATE)
Packit c4476c
#  if defined(L_ENDIAN)         /* little-endians have to rotate left */
Packit c4476c
#   define ROTATE(i,n)       ((i)<<(n) ^ (i)>>(64-n))
Packit c4476c
#  elif defined(B_ENDIAN)       /* big-endians have to rotate right */
Packit c4476c
#   define ROTATE(i,n)       ((i)>>(n) ^ (i)<<(64-n))
Packit c4476c
#  endif
Packit c4476c
# endif
Packit c4476c
# if defined(ROTATE) && !defined(STRICT_ALIGNMENT)
Packit c4476c
#  define STRICT_ALIGNMENT      /* ensure smallest table size */
Packit c4476c
# endif
Packit c4476c
#endif
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * Table size depends on STRICT_ALIGNMENT and whether or not endian-
Packit c4476c
 * specific ROTATE macro is defined. If STRICT_ALIGNMENT is not
Packit c4476c
 * defined, which is normally the case on x86[_64] CPUs, the table is
Packit c4476c
 * 4KB large unconditionally. Otherwise if ROTATE is defined, the
Packit c4476c
 * table is 2KB large, and otherwise - 16KB. 2KB table requires a
Packit c4476c
 * whole bunch of additional rotations, but I'm willing to "trade,"
Packit c4476c
 * because 16KB table certainly trashes L1 cache. I wish all CPUs
Packit c4476c
 * could handle unaligned load as 4KB table doesn't trash the cache,
Packit c4476c
 * nor does it require additional rotations.
Packit c4476c
 */
Packit c4476c
/*
Packit c4476c
 * Note that every Cn macro expands as two loads: one byte load and
Packit c4476c
 * one quadword load. One can argue that that many single-byte loads
Packit c4476c
 * is too excessive, as one could load a quadword and "milk" it for
Packit c4476c
 * eight 8-bit values instead. Well, yes, but in order to do so *and*
Packit c4476c
 * avoid excessive loads you have to accommodate a handful of 64-bit
Packit c4476c
 * values in the register bank and issue a bunch of shifts and mask.
Packit c4476c
 * It's a tradeoff: loads vs. shift and mask in big register bank[!].
Packit c4476c
 * On most CPUs eight single-byte loads are faster and I let other
Packit c4476c
 * ones to depend on smart compiler to fold byte loads if beneficial.
Packit c4476c
 * Hand-coded assembler would be another alternative:-)
Packit c4476c
 */
Packit c4476c
#ifdef STRICT_ALIGNMENT
Packit c4476c
# if defined(ROTATE)
Packit c4476c
#  define N   1
Packit c4476c
#  define LL(c0,c1,c2,c3,c4,c5,c6,c7) c0,c1,c2,c3,c4,c5,c6,c7
Packit c4476c
#  define C0(K,i)     (Cx.q[K.c[(i)*8+0]])
Packit c4476c
#  define C1(K,i)     ROTATE(Cx.q[K.c[(i)*8+1]],8)
Packit c4476c
#  define C2(K,i)     ROTATE(Cx.q[K.c[(i)*8+2]],16)
Packit c4476c
#  define C3(K,i)     ROTATE(Cx.q[K.c[(i)*8+3]],24)
Packit c4476c
#  define C4(K,i)     ROTATE(Cx.q[K.c[(i)*8+4]],32)
Packit c4476c
#  define C5(K,i)     ROTATE(Cx.q[K.c[(i)*8+5]],40)
Packit c4476c
#  define C6(K,i)     ROTATE(Cx.q[K.c[(i)*8+6]],48)
Packit c4476c
#  define C7(K,i)     ROTATE(Cx.q[K.c[(i)*8+7]],56)
Packit c4476c
# else
Packit c4476c
#  define N   8
Packit c4476c
#  define LL(c0,c1,c2,c3,c4,c5,c6,c7) c0,c1,c2,c3,c4,c5,c6,c7, \
Packit c4476c
                                        c7,c0,c1,c2,c3,c4,c5,c6, \
Packit c4476c
                                        c6,c7,c0,c1,c2,c3,c4,c5, \
Packit c4476c
                                        c5,c6,c7,c0,c1,c2,c3,c4, \
Packit c4476c
                                        c4,c5,c6,c7,c0,c1,c2,c3, \
Packit c4476c
                                        c3,c4,c5,c6,c7,c0,c1,c2, \
Packit c4476c
                                        c2,c3,c4,c5,c6,c7,c0,c1, \
Packit c4476c
                                        c1,c2,c3,c4,c5,c6,c7,c0
Packit c4476c
#  define C0(K,i)     (Cx.q[0+8*K.c[(i)*8+0]])
Packit c4476c
#  define C1(K,i)     (Cx.q[1+8*K.c[(i)*8+1]])
Packit c4476c
#  define C2(K,i)     (Cx.q[2+8*K.c[(i)*8+2]])
Packit c4476c
#  define C3(K,i)     (Cx.q[3+8*K.c[(i)*8+3]])
Packit c4476c
#  define C4(K,i)     (Cx.q[4+8*K.c[(i)*8+4]])
Packit c4476c
#  define C5(K,i)     (Cx.q[5+8*K.c[(i)*8+5]])
Packit c4476c
#  define C6(K,i)     (Cx.q[6+8*K.c[(i)*8+6]])
Packit c4476c
#  define C7(K,i)     (Cx.q[7+8*K.c[(i)*8+7]])
Packit c4476c
# endif
Packit c4476c
#else
Packit c4476c
# define N     2
Packit c4476c
# define LL(c0,c1,c2,c3,c4,c5,c6,c7)   c0,c1,c2,c3,c4,c5,c6,c7, \
Packit c4476c
                                        c0,c1,c2,c3,c4,c5,c6,c7
Packit c4476c
# define C0(K,i)       (((u64*)(Cx.c+0))[2*K.c[(i)*8+0]])
Packit c4476c
# define C1(K,i)       (((u64*)(Cx.c+7))[2*K.c[(i)*8+1]])
Packit c4476c
# define C2(K,i)       (((u64*)(Cx.c+6))[2*K.c[(i)*8+2]])
Packit c4476c
# define C3(K,i)       (((u64*)(Cx.c+5))[2*K.c[(i)*8+3]])
Packit c4476c
# define C4(K,i)       (((u64*)(Cx.c+4))[2*K.c[(i)*8+4]])
Packit c4476c
# define C5(K,i)       (((u64*)(Cx.c+3))[2*K.c[(i)*8+5]])
Packit c4476c
# define C6(K,i)       (((u64*)(Cx.c+2))[2*K.c[(i)*8+6]])
Packit c4476c
# define C7(K,i)       (((u64*)(Cx.c+1))[2*K.c[(i)*8+7]])
Packit c4476c
#endif
Packit c4476c
Packit c4476c
static const
Packit c4476c
    union {
Packit c4476c
    u8 c[(256 * N + ROUNDS) * sizeof(u64)];
Packit c4476c
    u64 q[(256 * N + ROUNDS)];
Packit c4476c
} Cx = {
Packit c4476c
        {
Packit c4476c
            /* Note endian-neutral representation:-) */
Packit c4476c
            LL(0x18, 0x18, 0x60, 0x18, 0xc0, 0x78, 0x30, 0xd8),
Packit c4476c
            LL(0x23, 0x23, 0x8c, 0x23, 0x05, 0xaf, 0x46, 0x26),
Packit c4476c
            LL(0xc6, 0xc6, 0x3f, 0xc6, 0x7e, 0xf9, 0x91, 0xb8),
Packit c4476c
            LL(0xe8, 0xe8, 0x87, 0xe8, 0x13, 0x6f, 0xcd, 0xfb),
Packit c4476c
            LL(0x87, 0x87, 0x26, 0x87, 0x4c, 0xa1, 0x13, 0xcb),
Packit c4476c
            LL(0xb8, 0xb8, 0xda, 0xb8, 0xa9, 0x62, 0x6d, 0x11),
Packit c4476c
            LL(0x01, 0x01, 0x04, 0x01, 0x08, 0x05, 0x02, 0x09),
Packit c4476c
            LL(0x4f, 0x4f, 0x21, 0x4f, 0x42, 0x6e, 0x9e, 0x0d),
Packit c4476c
            LL(0x36, 0x36, 0xd8, 0x36, 0xad, 0xee, 0x6c, 0x9b),
Packit c4476c
            LL(0xa6, 0xa6, 0xa2, 0xa6, 0x59, 0x04, 0x51, 0xff),
Packit c4476c
            LL(0xd2, 0xd2, 0x6f, 0xd2, 0xde, 0xbd, 0xb9, 0x0c),
Packit c4476c
            LL(0xf5, 0xf5, 0xf3, 0xf5, 0xfb, 0x06, 0xf7, 0x0e),
Packit c4476c
            LL(0x79, 0x79, 0xf9, 0x79, 0xef, 0x80, 0xf2, 0x96),
Packit c4476c
            LL(0x6f, 0x6f, 0xa1, 0x6f, 0x5f, 0xce, 0xde, 0x30),
Packit c4476c
            LL(0x91, 0x91, 0x7e, 0x91, 0xfc, 0xef, 0x3f, 0x6d),
Packit c4476c
            LL(0x52, 0x52, 0x55, 0x52, 0xaa, 0x07, 0xa4, 0xf8),
Packit c4476c
            LL(0x60, 0x60, 0x9d, 0x60, 0x27, 0xfd, 0xc0, 0x47),
Packit c4476c
            LL(0xbc, 0xbc, 0xca, 0xbc, 0x89, 0x76, 0x65, 0x35),
Packit c4476c
            LL(0x9b, 0x9b, 0x56, 0x9b, 0xac, 0xcd, 0x2b, 0x37),
Packit c4476c
            LL(0x8e, 0x8e, 0x02, 0x8e, 0x04, 0x8c, 0x01, 0x8a),
Packit c4476c
            LL(0xa3, 0xa3, 0xb6, 0xa3, 0x71, 0x15, 0x5b, 0xd2),
Packit c4476c
            LL(0x0c, 0x0c, 0x30, 0x0c, 0x60, 0x3c, 0x18, 0x6c),
Packit c4476c
            LL(0x7b, 0x7b, 0xf1, 0x7b, 0xff, 0x8a, 0xf6, 0x84),
Packit c4476c
            LL(0x35, 0x35, 0xd4, 0x35, 0xb5, 0xe1, 0x6a, 0x80),
Packit c4476c
            LL(0x1d, 0x1d, 0x74, 0x1d, 0xe8, 0x69, 0x3a, 0xf5),
Packit c4476c
            LL(0xe0, 0xe0, 0xa7, 0xe0, 0x53, 0x47, 0xdd, 0xb3),
Packit c4476c
            LL(0xd7, 0xd7, 0x7b, 0xd7, 0xf6, 0xac, 0xb3, 0x21),
Packit c4476c
            LL(0xc2, 0xc2, 0x2f, 0xc2, 0x5e, 0xed, 0x99, 0x9c),
Packit c4476c
            LL(0x2e, 0x2e, 0xb8, 0x2e, 0x6d, 0x96, 0x5c, 0x43),
Packit c4476c
            LL(0x4b, 0x4b, 0x31, 0x4b, 0x62, 0x7a, 0x96, 0x29),
Packit c4476c
            LL(0xfe, 0xfe, 0xdf, 0xfe, 0xa3, 0x21, 0xe1, 0x5d),
Packit c4476c
            LL(0x57, 0x57, 0x41, 0x57, 0x82, 0x16, 0xae, 0xd5),
Packit c4476c
            LL(0x15, 0x15, 0x54, 0x15, 0xa8, 0x41, 0x2a, 0xbd),
Packit c4476c
            LL(0x77, 0x77, 0xc1, 0x77, 0x9f, 0xb6, 0xee, 0xe8),
Packit c4476c
            LL(0x37, 0x37, 0xdc, 0x37, 0xa5, 0xeb, 0x6e, 0x92),
Packit c4476c
            LL(0xe5, 0xe5, 0xb3, 0xe5, 0x7b, 0x56, 0xd7, 0x9e),
Packit c4476c
            LL(0x9f, 0x9f, 0x46, 0x9f, 0x8c, 0xd9, 0x23, 0x13),
Packit c4476c
            LL(0xf0, 0xf0, 0xe7, 0xf0, 0xd3, 0x17, 0xfd, 0x23),
Packit c4476c
            LL(0x4a, 0x4a, 0x35, 0x4a, 0x6a, 0x7f, 0x94, 0x20),
Packit c4476c
            LL(0xda, 0xda, 0x4f, 0xda, 0x9e, 0x95, 0xa9, 0x44),
Packit c4476c
            LL(0x58, 0x58, 0x7d, 0x58, 0xfa, 0x25, 0xb0, 0xa2),
Packit c4476c
            LL(0xc9, 0xc9, 0x03, 0xc9, 0x06, 0xca, 0x8f, 0xcf),
Packit c4476c
            LL(0x29, 0x29, 0xa4, 0x29, 0x55, 0x8d, 0x52, 0x7c),
Packit c4476c
            LL(0x0a, 0x0a, 0x28, 0x0a, 0x50, 0x22, 0x14, 0x5a),
Packit c4476c
            LL(0xb1, 0xb1, 0xfe, 0xb1, 0xe1, 0x4f, 0x7f, 0x50),
Packit c4476c
            LL(0xa0, 0xa0, 0xba, 0xa0, 0x69, 0x1a, 0x5d, 0xc9),
Packit c4476c
            LL(0x6b, 0x6b, 0xb1, 0x6b, 0x7f, 0xda, 0xd6, 0x14),
Packit c4476c
            LL(0x85, 0x85, 0x2e, 0x85, 0x5c, 0xab, 0x17, 0xd9),
Packit c4476c
            LL(0xbd, 0xbd, 0xce, 0xbd, 0x81, 0x73, 0x67, 0x3c),
Packit c4476c
            LL(0x5d, 0x5d, 0x69, 0x5d, 0xd2, 0x34, 0xba, 0x8f),
Packit c4476c
            LL(0x10, 0x10, 0x40, 0x10, 0x80, 0x50, 0x20, 0x90),
Packit c4476c
            LL(0xf4, 0xf4, 0xf7, 0xf4, 0xf3, 0x03, 0xf5, 0x07),
Packit c4476c
            LL(0xcb, 0xcb, 0x0b, 0xcb, 0x16, 0xc0, 0x8b, 0xdd),
Packit c4476c
            LL(0x3e, 0x3e, 0xf8, 0x3e, 0xed, 0xc6, 0x7c, 0xd3),
Packit c4476c
            LL(0x05, 0x05, 0x14, 0x05, 0x28, 0x11, 0x0a, 0x2d),
Packit c4476c
            LL(0x67, 0x67, 0x81, 0x67, 0x1f, 0xe6, 0xce, 0x78),
Packit c4476c
            LL(0xe4, 0xe4, 0xb7, 0xe4, 0x73, 0x53, 0xd5, 0x97),
Packit c4476c
            LL(0x27, 0x27, 0x9c, 0x27, 0x25, 0xbb, 0x4e, 0x02),
Packit c4476c
            LL(0x41, 0x41, 0x19, 0x41, 0x32, 0x58, 0x82, 0x73),
Packit c4476c
            LL(0x8b, 0x8b, 0x16, 0x8b, 0x2c, 0x9d, 0x0b, 0xa7),
Packit c4476c
            LL(0xa7, 0xa7, 0xa6, 0xa7, 0x51, 0x01, 0x53, 0xf6),
Packit c4476c
            LL(0x7d, 0x7d, 0xe9, 0x7d, 0xcf, 0x94, 0xfa, 0xb2),
Packit c4476c
            LL(0x95, 0x95, 0x6e, 0x95, 0xdc, 0xfb, 0x37, 0x49),
Packit c4476c
            LL(0xd8, 0xd8, 0x47, 0xd8, 0x8e, 0x9f, 0xad, 0x56),
Packit c4476c
            LL(0xfb, 0xfb, 0xcb, 0xfb, 0x8b, 0x30, 0xeb, 0x70),
Packit c4476c
            LL(0xee, 0xee, 0x9f, 0xee, 0x23, 0x71, 0xc1, 0xcd),
Packit c4476c
            LL(0x7c, 0x7c, 0xed, 0x7c, 0xc7, 0x91, 0xf8, 0xbb),
Packit c4476c
            LL(0x66, 0x66, 0x85, 0x66, 0x17, 0xe3, 0xcc, 0x71),
Packit c4476c
            LL(0xdd, 0xdd, 0x53, 0xdd, 0xa6, 0x8e, 0xa7, 0x7b),
Packit c4476c
            LL(0x17, 0x17, 0x5c, 0x17, 0xb8, 0x4b, 0x2e, 0xaf),
Packit c4476c
            LL(0x47, 0x47, 0x01, 0x47, 0x02, 0x46, 0x8e, 0x45),
Packit c4476c
            LL(0x9e, 0x9e, 0x42, 0x9e, 0x84, 0xdc, 0x21, 0x1a),
Packit c4476c
            LL(0xca, 0xca, 0x0f, 0xca, 0x1e, 0xc5, 0x89, 0xd4),
Packit c4476c
            LL(0x2d, 0x2d, 0xb4, 0x2d, 0x75, 0x99, 0x5a, 0x58),
Packit c4476c
            LL(0xbf, 0xbf, 0xc6, 0xbf, 0x91, 0x79, 0x63, 0x2e),
Packit c4476c
            LL(0x07, 0x07, 0x1c, 0x07, 0x38, 0x1b, 0x0e, 0x3f),
Packit c4476c
            LL(0xad, 0xad, 0x8e, 0xad, 0x01, 0x23, 0x47, 0xac),
Packit c4476c
            LL(0x5a, 0x5a, 0x75, 0x5a, 0xea, 0x2f, 0xb4, 0xb0),
Packit c4476c
            LL(0x83, 0x83, 0x36, 0x83, 0x6c, 0xb5, 0x1b, 0xef),
Packit c4476c
            LL(0x33, 0x33, 0xcc, 0x33, 0x85, 0xff, 0x66, 0xb6),
Packit c4476c
            LL(0x63, 0x63, 0x91, 0x63, 0x3f, 0xf2, 0xc6, 0x5c),
Packit c4476c
            LL(0x02, 0x02, 0x08, 0x02, 0x10, 0x0a, 0x04, 0x12),
Packit c4476c
            LL(0xaa, 0xaa, 0x92, 0xaa, 0x39, 0x38, 0x49, 0x93),
Packit c4476c
            LL(0x71, 0x71, 0xd9, 0x71, 0xaf, 0xa8, 0xe2, 0xde),
Packit c4476c
            LL(0xc8, 0xc8, 0x07, 0xc8, 0x0e, 0xcf, 0x8d, 0xc6),
Packit c4476c
            LL(0x19, 0x19, 0x64, 0x19, 0xc8, 0x7d, 0x32, 0xd1),
Packit c4476c
            LL(0x49, 0x49, 0x39, 0x49, 0x72, 0x70, 0x92, 0x3b),
Packit c4476c
            LL(0xd9, 0xd9, 0x43, 0xd9, 0x86, 0x9a, 0xaf, 0x5f),
Packit c4476c
            LL(0xf2, 0xf2, 0xef, 0xf2, 0xc3, 0x1d, 0xf9, 0x31),
Packit c4476c
            LL(0xe3, 0xe3, 0xab, 0xe3, 0x4b, 0x48, 0xdb, 0xa8),
Packit c4476c
            LL(0x5b, 0x5b, 0x71, 0x5b, 0xe2, 0x2a, 0xb6, 0xb9),
Packit c4476c
            LL(0x88, 0x88, 0x1a, 0x88, 0x34, 0x92, 0x0d, 0xbc),
Packit c4476c
            LL(0x9a, 0x9a, 0x52, 0x9a, 0xa4, 0xc8, 0x29, 0x3e),
Packit c4476c
            LL(0x26, 0x26, 0x98, 0x26, 0x2d, 0xbe, 0x4c, 0x0b),
Packit c4476c
            LL(0x32, 0x32, 0xc8, 0x32, 0x8d, 0xfa, 0x64, 0xbf),
Packit c4476c
            LL(0xb0, 0xb0, 0xfa, 0xb0, 0xe9, 0x4a, 0x7d, 0x59),
Packit c4476c
            LL(0xe9, 0xe9, 0x83, 0xe9, 0x1b, 0x6a, 0xcf, 0xf2),
Packit c4476c
            LL(0x0f, 0x0f, 0x3c, 0x0f, 0x78, 0x33, 0x1e, 0x77),
Packit c4476c
            LL(0xd5, 0xd5, 0x73, 0xd5, 0xe6, 0xa6, 0xb7, 0x33),
Packit c4476c
            LL(0x80, 0x80, 0x3a, 0x80, 0x74, 0xba, 0x1d, 0xf4),
Packit c4476c
            LL(0xbe, 0xbe, 0xc2, 0xbe, 0x99, 0x7c, 0x61, 0x27),
Packit c4476c
            LL(0xcd, 0xcd, 0x13, 0xcd, 0x26, 0xde, 0x87, 0xeb),
Packit c4476c
            LL(0x34, 0x34, 0xd0, 0x34, 0xbd, 0xe4, 0x68, 0x89),
Packit c4476c
            LL(0x48, 0x48, 0x3d, 0x48, 0x7a, 0x75, 0x90, 0x32),
Packit c4476c
            LL(0xff, 0xff, 0xdb, 0xff, 0xab, 0x24, 0xe3, 0x54),
Packit c4476c
            LL(0x7a, 0x7a, 0xf5, 0x7a, 0xf7, 0x8f, 0xf4, 0x8d),
Packit c4476c
            LL(0x90, 0x90, 0x7a, 0x90, 0xf4, 0xea, 0x3d, 0x64),
Packit c4476c
            LL(0x5f, 0x5f, 0x61, 0x5f, 0xc2, 0x3e, 0xbe, 0x9d),
Packit c4476c
            LL(0x20, 0x20, 0x80, 0x20, 0x1d, 0xa0, 0x40, 0x3d),
Packit c4476c
            LL(0x68, 0x68, 0xbd, 0x68, 0x67, 0xd5, 0xd0, 0x0f),
Packit c4476c
            LL(0x1a, 0x1a, 0x68, 0x1a, 0xd0, 0x72, 0x34, 0xca),
Packit c4476c
            LL(0xae, 0xae, 0x82, 0xae, 0x19, 0x2c, 0x41, 0xb7),
Packit c4476c
            LL(0xb4, 0xb4, 0xea, 0xb4, 0xc9, 0x5e, 0x75, 0x7d),
Packit c4476c
            LL(0x54, 0x54, 0x4d, 0x54, 0x9a, 0x19, 0xa8, 0xce),
Packit c4476c
            LL(0x93, 0x93, 0x76, 0x93, 0xec, 0xe5, 0x3b, 0x7f),
Packit c4476c
            LL(0x22, 0x22, 0x88, 0x22, 0x0d, 0xaa, 0x44, 0x2f),
Packit c4476c
            LL(0x64, 0x64, 0x8d, 0x64, 0x07, 0xe9, 0xc8, 0x63),
Packit c4476c
            LL(0xf1, 0xf1, 0xe3, 0xf1, 0xdb, 0x12, 0xff, 0x2a),
Packit c4476c
            LL(0x73, 0x73, 0xd1, 0x73, 0xbf, 0xa2, 0xe6, 0xcc),
Packit c4476c
            LL(0x12, 0x12, 0x48, 0x12, 0x90, 0x5a, 0x24, 0x82),
Packit c4476c
            LL(0x40, 0x40, 0x1d, 0x40, 0x3a, 0x5d, 0x80, 0x7a),
Packit c4476c
            LL(0x08, 0x08, 0x20, 0x08, 0x40, 0x28, 0x10, 0x48),
Packit c4476c
            LL(0xc3, 0xc3, 0x2b, 0xc3, 0x56, 0xe8, 0x9b, 0x95),
Packit c4476c
            LL(0xec, 0xec, 0x97, 0xec, 0x33, 0x7b, 0xc5, 0xdf),
Packit c4476c
            LL(0xdb, 0xdb, 0x4b, 0xdb, 0x96, 0x90, 0xab, 0x4d),
Packit c4476c
            LL(0xa1, 0xa1, 0xbe, 0xa1, 0x61, 0x1f, 0x5f, 0xc0),
Packit c4476c
            LL(0x8d, 0x8d, 0x0e, 0x8d, 0x1c, 0x83, 0x07, 0x91),
Packit c4476c
            LL(0x3d, 0x3d, 0xf4, 0x3d, 0xf5, 0xc9, 0x7a, 0xc8),
Packit c4476c
            LL(0x97, 0x97, 0x66, 0x97, 0xcc, 0xf1, 0x33, 0x5b),
Packit c4476c
            LL(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00),
Packit c4476c
            LL(0xcf, 0xcf, 0x1b, 0xcf, 0x36, 0xd4, 0x83, 0xf9),
Packit c4476c
            LL(0x2b, 0x2b, 0xac, 0x2b, 0x45, 0x87, 0x56, 0x6e),
Packit c4476c
            LL(0x76, 0x76, 0xc5, 0x76, 0x97, 0xb3, 0xec, 0xe1),
Packit c4476c
            LL(0x82, 0x82, 0x32, 0x82, 0x64, 0xb0, 0x19, 0xe6),
Packit c4476c
            LL(0xd6, 0xd6, 0x7f, 0xd6, 0xfe, 0xa9, 0xb1, 0x28),
Packit c4476c
            LL(0x1b, 0x1b, 0x6c, 0x1b, 0xd8, 0x77, 0x36, 0xc3),
Packit c4476c
            LL(0xb5, 0xb5, 0xee, 0xb5, 0xc1, 0x5b, 0x77, 0x74),
Packit c4476c
            LL(0xaf, 0xaf, 0x86, 0xaf, 0x11, 0x29, 0x43, 0xbe),
Packit c4476c
            LL(0x6a, 0x6a, 0xb5, 0x6a, 0x77, 0xdf, 0xd4, 0x1d),
Packit c4476c
            LL(0x50, 0x50, 0x5d, 0x50, 0xba, 0x0d, 0xa0, 0xea),
Packit c4476c
            LL(0x45, 0x45, 0x09, 0x45, 0x12, 0x4c, 0x8a, 0x57),
Packit c4476c
            LL(0xf3, 0xf3, 0xeb, 0xf3, 0xcb, 0x18, 0xfb, 0x38),
Packit c4476c
            LL(0x30, 0x30, 0xc0, 0x30, 0x9d, 0xf0, 0x60, 0xad),
Packit c4476c
            LL(0xef, 0xef, 0x9b, 0xef, 0x2b, 0x74, 0xc3, 0xc4),
Packit c4476c
            LL(0x3f, 0x3f, 0xfc, 0x3f, 0xe5, 0xc3, 0x7e, 0xda),
Packit c4476c
            LL(0x55, 0x55, 0x49, 0x55, 0x92, 0x1c, 0xaa, 0xc7),
Packit c4476c
            LL(0xa2, 0xa2, 0xb2, 0xa2, 0x79, 0x10, 0x59, 0xdb),
Packit c4476c
            LL(0xea, 0xea, 0x8f, 0xea, 0x03, 0x65, 0xc9, 0xe9),
Packit c4476c
            LL(0x65, 0x65, 0x89, 0x65, 0x0f, 0xec, 0xca, 0x6a),
Packit c4476c
            LL(0xba, 0xba, 0xd2, 0xba, 0xb9, 0x68, 0x69, 0x03),
Packit c4476c
            LL(0x2f, 0x2f, 0xbc, 0x2f, 0x65, 0x93, 0x5e, 0x4a),
Packit c4476c
            LL(0xc0, 0xc0, 0x27, 0xc0, 0x4e, 0xe7, 0x9d, 0x8e),
Packit c4476c
            LL(0xde, 0xde, 0x5f, 0xde, 0xbe, 0x81, 0xa1, 0x60),
Packit c4476c
            LL(0x1c, 0x1c, 0x70, 0x1c, 0xe0, 0x6c, 0x38, 0xfc),
Packit c4476c
            LL(0xfd, 0xfd, 0xd3, 0xfd, 0xbb, 0x2e, 0xe7, 0x46),
Packit c4476c
            LL(0x4d, 0x4d, 0x29, 0x4d, 0x52, 0x64, 0x9a, 0x1f),
Packit c4476c
            LL(0x92, 0x92, 0x72, 0x92, 0xe4, 0xe0, 0x39, 0x76),
Packit c4476c
            LL(0x75, 0x75, 0xc9, 0x75, 0x8f, 0xbc, 0xea, 0xfa),
Packit c4476c
            LL(0x06, 0x06, 0x18, 0x06, 0x30, 0x1e, 0x0c, 0x36),
Packit c4476c
            LL(0x8a, 0x8a, 0x12, 0x8a, 0x24, 0x98, 0x09, 0xae),
Packit c4476c
            LL(0xb2, 0xb2, 0xf2, 0xb2, 0xf9, 0x40, 0x79, 0x4b),
Packit c4476c
            LL(0xe6, 0xe6, 0xbf, 0xe6, 0x63, 0x59, 0xd1, 0x85),
Packit c4476c
            LL(0x0e, 0x0e, 0x38, 0x0e, 0x70, 0x36, 0x1c, 0x7e),
Packit c4476c
            LL(0x1f, 0x1f, 0x7c, 0x1f, 0xf8, 0x63, 0x3e, 0xe7),
Packit c4476c
            LL(0x62, 0x62, 0x95, 0x62, 0x37, 0xf7, 0xc4, 0x55),
Packit c4476c
            LL(0xd4, 0xd4, 0x77, 0xd4, 0xee, 0xa3, 0xb5, 0x3a),
Packit c4476c
            LL(0xa8, 0xa8, 0x9a, 0xa8, 0x29, 0x32, 0x4d, 0x81),
Packit c4476c
            LL(0x96, 0x96, 0x62, 0x96, 0xc4, 0xf4, 0x31, 0x52),
Packit c4476c
            LL(0xf9, 0xf9, 0xc3, 0xf9, 0x9b, 0x3a, 0xef, 0x62),
Packit c4476c
            LL(0xc5, 0xc5, 0x33, 0xc5, 0x66, 0xf6, 0x97, 0xa3),
Packit c4476c
            LL(0x25, 0x25, 0x94, 0x25, 0x35, 0xb1, 0x4a, 0x10),
Packit c4476c
            LL(0x59, 0x59, 0x79, 0x59, 0xf2, 0x20, 0xb2, 0xab),
Packit c4476c
            LL(0x84, 0x84, 0x2a, 0x84, 0x54, 0xae, 0x15, 0xd0),
Packit c4476c
            LL(0x72, 0x72, 0xd5, 0x72, 0xb7, 0xa7, 0xe4, 0xc5),
Packit c4476c
            LL(0x39, 0x39, 0xe4, 0x39, 0xd5, 0xdd, 0x72, 0xec),
Packit c4476c
            LL(0x4c, 0x4c, 0x2d, 0x4c, 0x5a, 0x61, 0x98, 0x16),
Packit c4476c
            LL(0x5e, 0x5e, 0x65, 0x5e, 0xca, 0x3b, 0xbc, 0x94),
Packit c4476c
            LL(0x78, 0x78, 0xfd, 0x78, 0xe7, 0x85, 0xf0, 0x9f),
Packit c4476c
            LL(0x38, 0x38, 0xe0, 0x38, 0xdd, 0xd8, 0x70, 0xe5),
Packit c4476c
            LL(0x8c, 0x8c, 0x0a, 0x8c, 0x14, 0x86, 0x05, 0x98),
Packit c4476c
            LL(0xd1, 0xd1, 0x63, 0xd1, 0xc6, 0xb2, 0xbf, 0x17),
Packit c4476c
            LL(0xa5, 0xa5, 0xae, 0xa5, 0x41, 0x0b, 0x57, 0xe4),
Packit c4476c
            LL(0xe2, 0xe2, 0xaf, 0xe2, 0x43, 0x4d, 0xd9, 0xa1),
Packit c4476c
            LL(0x61, 0x61, 0x99, 0x61, 0x2f, 0xf8, 0xc2, 0x4e),
Packit c4476c
            LL(0xb3, 0xb3, 0xf6, 0xb3, 0xf1, 0x45, 0x7b, 0x42),
Packit c4476c
            LL(0x21, 0x21, 0x84, 0x21, 0x15, 0xa5, 0x42, 0x34),
Packit c4476c
            LL(0x9c, 0x9c, 0x4a, 0x9c, 0x94, 0xd6, 0x25, 0x08),
Packit c4476c
            LL(0x1e, 0x1e, 0x78, 0x1e, 0xf0, 0x66, 0x3c, 0xee),
Packit c4476c
            LL(0x43, 0x43, 0x11, 0x43, 0x22, 0x52, 0x86, 0x61),
Packit c4476c
            LL(0xc7, 0xc7, 0x3b, 0xc7, 0x76, 0xfc, 0x93, 0xb1),
Packit c4476c
            LL(0xfc, 0xfc, 0xd7, 0xfc, 0xb3, 0x2b, 0xe5, 0x4f),
Packit c4476c
            LL(0x04, 0x04, 0x10, 0x04, 0x20, 0x14, 0x08, 0x24),
Packit c4476c
            LL(0x51, 0x51, 0x59, 0x51, 0xb2, 0x08, 0xa2, 0xe3),
Packit c4476c
            LL(0x99, 0x99, 0x5e, 0x99, 0xbc, 0xc7, 0x2f, 0x25),
Packit c4476c
            LL(0x6d, 0x6d, 0xa9, 0x6d, 0x4f, 0xc4, 0xda, 0x22),
Packit c4476c
            LL(0x0d, 0x0d, 0x34, 0x0d, 0x68, 0x39, 0x1a, 0x65),
Packit c4476c
            LL(0xfa, 0xfa, 0xcf, 0xfa, 0x83, 0x35, 0xe9, 0x79),
Packit c4476c
            LL(0xdf, 0xdf, 0x5b, 0xdf, 0xb6, 0x84, 0xa3, 0x69),
Packit c4476c
            LL(0x7e, 0x7e, 0xe5, 0x7e, 0xd7, 0x9b, 0xfc, 0xa9),
Packit c4476c
            LL(0x24, 0x24, 0x90, 0x24, 0x3d, 0xb4, 0x48, 0x19),
Packit c4476c
            LL(0x3b, 0x3b, 0xec, 0x3b, 0xc5, 0xd7, 0x76, 0xfe),
Packit c4476c
            LL(0xab, 0xab, 0x96, 0xab, 0x31, 0x3d, 0x4b, 0x9a),
Packit c4476c
            LL(0xce, 0xce, 0x1f, 0xce, 0x3e, 0xd1, 0x81, 0xf0),
Packit c4476c
            LL(0x11, 0x11, 0x44, 0x11, 0x88, 0x55, 0x22, 0x99),
Packit c4476c
            LL(0x8f, 0x8f, 0x06, 0x8f, 0x0c, 0x89, 0x03, 0x83),
Packit c4476c
            LL(0x4e, 0x4e, 0x25, 0x4e, 0x4a, 0x6b, 0x9c, 0x04),
Packit c4476c
            LL(0xb7, 0xb7, 0xe6, 0xb7, 0xd1, 0x51, 0x73, 0x66),
Packit c4476c
            LL(0xeb, 0xeb, 0x8b, 0xeb, 0x0b, 0x60, 0xcb, 0xe0),
Packit c4476c
            LL(0x3c, 0x3c, 0xf0, 0x3c, 0xfd, 0xcc, 0x78, 0xc1),
Packit c4476c
            LL(0x81, 0x81, 0x3e, 0x81, 0x7c, 0xbf, 0x1f, 0xfd),
Packit c4476c
            LL(0x94, 0x94, 0x6a, 0x94, 0xd4, 0xfe, 0x35, 0x40),
Packit c4476c
            LL(0xf7, 0xf7, 0xfb, 0xf7, 0xeb, 0x0c, 0xf3, 0x1c),
Packit c4476c
            LL(0xb9, 0xb9, 0xde, 0xb9, 0xa1, 0x67, 0x6f, 0x18),
Packit c4476c
            LL(0x13, 0x13, 0x4c, 0x13, 0x98, 0x5f, 0x26, 0x8b),
Packit c4476c
            LL(0x2c, 0x2c, 0xb0, 0x2c, 0x7d, 0x9c, 0x58, 0x51),
Packit c4476c
            LL(0xd3, 0xd3, 0x6b, 0xd3, 0xd6, 0xb8, 0xbb, 0x05),
Packit c4476c
            LL(0xe7, 0xe7, 0xbb, 0xe7, 0x6b, 0x5c, 0xd3, 0x8c),
Packit c4476c
            LL(0x6e, 0x6e, 0xa5, 0x6e, 0x57, 0xcb, 0xdc, 0x39),
Packit c4476c
            LL(0xc4, 0xc4, 0x37, 0xc4, 0x6e, 0xf3, 0x95, 0xaa),
Packit c4476c
            LL(0x03, 0x03, 0x0c, 0x03, 0x18, 0x0f, 0x06, 0x1b),
Packit c4476c
            LL(0x56, 0x56, 0x45, 0x56, 0x8a, 0x13, 0xac, 0xdc),
Packit c4476c
            LL(0x44, 0x44, 0x0d, 0x44, 0x1a, 0x49, 0x88, 0x5e),
Packit c4476c
            LL(0x7f, 0x7f, 0xe1, 0x7f, 0xdf, 0x9e, 0xfe, 0xa0),
Packit c4476c
            LL(0xa9, 0xa9, 0x9e, 0xa9, 0x21, 0x37, 0x4f, 0x88),
Packit c4476c
            LL(0x2a, 0x2a, 0xa8, 0x2a, 0x4d, 0x82, 0x54, 0x67),
Packit c4476c
            LL(0xbb, 0xbb, 0xd6, 0xbb, 0xb1, 0x6d, 0x6b, 0x0a),
Packit c4476c
            LL(0xc1, 0xc1, 0x23, 0xc1, 0x46, 0xe2, 0x9f, 0x87),
Packit c4476c
            LL(0x53, 0x53, 0x51, 0x53, 0xa2, 0x02, 0xa6, 0xf1),
Packit c4476c
            LL(0xdc, 0xdc, 0x57, 0xdc, 0xae, 0x8b, 0xa5, 0x72),
Packit c4476c
            LL(0x0b, 0x0b, 0x2c, 0x0b, 0x58, 0x27, 0x16, 0x53),
Packit c4476c
            LL(0x9d, 0x9d, 0x4e, 0x9d, 0x9c, 0xd3, 0x27, 0x01),
Packit c4476c
            LL(0x6c, 0x6c, 0xad, 0x6c, 0x47, 0xc1, 0xd8, 0x2b),
Packit c4476c
            LL(0x31, 0x31, 0xc4, 0x31, 0x95, 0xf5, 0x62, 0xa4),
Packit c4476c
            LL(0x74, 0x74, 0xcd, 0x74, 0x87, 0xb9, 0xe8, 0xf3),
Packit c4476c
            LL(0xf6, 0xf6, 0xff, 0xf6, 0xe3, 0x09, 0xf1, 0x15),
Packit c4476c
            LL(0x46, 0x46, 0x05, 0x46, 0x0a, 0x43, 0x8c, 0x4c),
Packit c4476c
            LL(0xac, 0xac, 0x8a, 0xac, 0x09, 0x26, 0x45, 0xa5),
Packit c4476c
            LL(0x89, 0x89, 0x1e, 0x89, 0x3c, 0x97, 0x0f, 0xb5),
Packit c4476c
            LL(0x14, 0x14, 0x50, 0x14, 0xa0, 0x44, 0x28, 0xb4),
Packit c4476c
            LL(0xe1, 0xe1, 0xa3, 0xe1, 0x5b, 0x42, 0xdf, 0xba),
Packit c4476c
            LL(0x16, 0x16, 0x58, 0x16, 0xb0, 0x4e, 0x2c, 0xa6),
Packit c4476c
            LL(0x3a, 0x3a, 0xe8, 0x3a, 0xcd, 0xd2, 0x74, 0xf7),
Packit c4476c
            LL(0x69, 0x69, 0xb9, 0x69, 0x6f, 0xd0, 0xd2, 0x06),
Packit c4476c
            LL(0x09, 0x09, 0x24, 0x09, 0x48, 0x2d, 0x12, 0x41),
Packit c4476c
            LL(0x70, 0x70, 0xdd, 0x70, 0xa7, 0xad, 0xe0, 0xd7),
Packit c4476c
            LL(0xb6, 0xb6, 0xe2, 0xb6, 0xd9, 0x54, 0x71, 0x6f),
Packit c4476c
            LL(0xd0, 0xd0, 0x67, 0xd0, 0xce, 0xb7, 0xbd, 0x1e),
Packit c4476c
            LL(0xed, 0xed, 0x93, 0xed, 0x3b, 0x7e, 0xc7, 0xd6),
Packit c4476c
            LL(0xcc, 0xcc, 0x17, 0xcc, 0x2e, 0xdb, 0x85, 0xe2),
Packit c4476c
            LL(0x42, 0x42, 0x15, 0x42, 0x2a, 0x57, 0x84, 0x68),
Packit c4476c
            LL(0x98, 0x98, 0x5a, 0x98, 0xb4, 0xc2, 0x2d, 0x2c),
Packit c4476c
            LL(0xa4, 0xa4, 0xaa, 0xa4, 0x49, 0x0e, 0x55, 0xed),
Packit c4476c
            LL(0x28, 0x28, 0xa0, 0x28, 0x5d, 0x88, 0x50, 0x75),
Packit c4476c
            LL(0x5c, 0x5c, 0x6d, 0x5c, 0xda, 0x31, 0xb8, 0x86),
Packit c4476c
            LL(0xf8, 0xf8, 0xc7, 0xf8, 0x93, 0x3f, 0xed, 0x6b),
Packit c4476c
            LL(0x86, 0x86, 0x22, 0x86, 0x44, 0xa4, 0x11, 0xc2),
Packit c4476c
#define RC      (&(Cx.q[256*N]))
Packit c4476c
            0x18, 0x23, 0xc6, 0xe8, 0x87, 0xb8, 0x01, 0x4f,
Packit c4476c
            /* rc[ROUNDS] */
Packit c4476c
            0x36, 0xa6, 0xd2, 0xf5, 0x79, 0x6f, 0x91, 0x52, 0x60, 0xbc, 0x9b,
Packit c4476c
            0x8e, 0xa3, 0x0c, 0x7b, 0x35, 0x1d, 0xe0, 0xd7, 0xc2, 0x2e, 0x4b,
Packit c4476c
            0xfe, 0x57, 0x15, 0x77, 0x37, 0xe5, 0x9f, 0xf0, 0x4a, 0xda, 0x58,
Packit c4476c
            0xc9, 0x29, 0x0a, 0xb1, 0xa0, 0x6b, 0x85, 0xbd, 0x5d, 0x10, 0xf4,
Packit c4476c
            0xcb, 0x3e, 0x05, 0x67, 0xe4, 0x27, 0x41, 0x8b, 0xa7, 0x7d, 0x95,
Packit c4476c
            0xd8, 0xfb, 0xee, 0x7c, 0x66, 0xdd, 0x17, 0x47, 0x9e, 0xca, 0x2d,
Packit c4476c
            0xbf, 0x07, 0xad, 0x5a, 0x83, 0x33
Packit c4476c
        }
Packit c4476c
    };
Packit c4476c
Packit c4476c
void whirlpool_block(WHIRLPOOL_CTX *ctx, const void *inp, size_t n)
Packit c4476c
{
Packit c4476c
    int r;
Packit c4476c
    const u8 *p = inp;
Packit c4476c
    union {
Packit c4476c
        u64 q[8];
Packit c4476c
        u8 c[64];
Packit c4476c
    } S, K, *H = (void *)ctx->H.q;
Packit c4476c
Packit c4476c
#ifdef GO_FOR_MMX
Packit c4476c
    GO_FOR_MMX(ctx, inp, n);
Packit c4476c
#endif
Packit c4476c
    do {
Packit c4476c
#ifdef OPENSSL_SMALL_FOOTPRINT
Packit c4476c
        u64 L[8];
Packit c4476c
        int i;
Packit c4476c
Packit c4476c
        for (i = 0; i < 64; i++)
Packit c4476c
            S.c[i] = (K.c[i] = H->c[i]) ^ p[i];
Packit c4476c
        for (r = 0; r < ROUNDS; r++) {
Packit c4476c
            for (i = 0; i < 8; i++) {
Packit c4476c
                L[i] = i ? 0 : RC[r];
Packit c4476c
                L[i] ^= C0(K, i) ^ C1(K, (i - 1) & 7) ^
Packit c4476c
                    C2(K, (i - 2) & 7) ^ C3(K, (i - 3) & 7) ^
Packit c4476c
                    C4(K, (i - 4) & 7) ^ C5(K, (i - 5) & 7) ^
Packit c4476c
                    C6(K, (i - 6) & 7) ^ C7(K, (i - 7) & 7);
Packit c4476c
            }
Packit c4476c
            memcpy(K.q, L, 64);
Packit c4476c
            for (i = 0; i < 8; i++) {
Packit c4476c
                L[i] ^= C0(S, i) ^ C1(S, (i - 1) & 7) ^
Packit c4476c
                    C2(S, (i - 2) & 7) ^ C3(S, (i - 3) & 7) ^
Packit c4476c
                    C4(S, (i - 4) & 7) ^ C5(S, (i - 5) & 7) ^
Packit c4476c
                    C6(S, (i - 6) & 7) ^ C7(S, (i - 7) & 7);
Packit c4476c
            }
Packit c4476c
            memcpy(S.q, L, 64);
Packit c4476c
        }
Packit c4476c
        for (i = 0; i < 64; i++)
Packit c4476c
            H->c[i] ^= S.c[i] ^ p[i];
Packit c4476c
#else
Packit c4476c
        u64 L0, L1, L2, L3, L4, L5, L6, L7;
Packit c4476c
Packit c4476c
# ifdef STRICT_ALIGNMENT
Packit c4476c
        if ((size_t)p & 7) {
Packit c4476c
            memcpy(S.c, p, 64);
Packit c4476c
            S.q[0] ^= (K.q[0] = H->q[0]);
Packit c4476c
            S.q[1] ^= (K.q[1] = H->q[1]);
Packit c4476c
            S.q[2] ^= (K.q[2] = H->q[2]);
Packit c4476c
            S.q[3] ^= (K.q[3] = H->q[3]);
Packit c4476c
            S.q[4] ^= (K.q[4] = H->q[4]);
Packit c4476c
            S.q[5] ^= (K.q[5] = H->q[5]);
Packit c4476c
            S.q[6] ^= (K.q[6] = H->q[6]);
Packit c4476c
            S.q[7] ^= (K.q[7] = H->q[7]);
Packit c4476c
        } else
Packit c4476c
# endif
Packit c4476c
        {
Packit c4476c
            const u64 *pa = (const u64 *)p;
Packit c4476c
            S.q[0] = (K.q[0] = H->q[0]) ^ pa[0];
Packit c4476c
            S.q[1] = (K.q[1] = H->q[1]) ^ pa[1];
Packit c4476c
            S.q[2] = (K.q[2] = H->q[2]) ^ pa[2];
Packit c4476c
            S.q[3] = (K.q[3] = H->q[3]) ^ pa[3];
Packit c4476c
            S.q[4] = (K.q[4] = H->q[4]) ^ pa[4];
Packit c4476c
            S.q[5] = (K.q[5] = H->q[5]) ^ pa[5];
Packit c4476c
            S.q[6] = (K.q[6] = H->q[6]) ^ pa[6];
Packit c4476c
            S.q[7] = (K.q[7] = H->q[7]) ^ pa[7];
Packit c4476c
        }
Packit c4476c
Packit c4476c
        for (r = 0; r < ROUNDS; r++) {
Packit c4476c
# ifdef SMALL_REGISTER_BANK
Packit c4476c
            L0 = C0(K, 0) ^ C1(K, 7) ^ C2(K, 6) ^ C3(K, 5) ^
Packit c4476c
                C4(K, 4) ^ C5(K, 3) ^ C6(K, 2) ^ C7(K, 1) ^ RC[r];
Packit c4476c
            L1 = C0(K, 1) ^ C1(K, 0) ^ C2(K, 7) ^ C3(K, 6) ^
Packit c4476c
                C4(K, 5) ^ C5(K, 4) ^ C6(K, 3) ^ C7(K, 2);
Packit c4476c
            L2 = C0(K, 2) ^ C1(K, 1) ^ C2(K, 0) ^ C3(K, 7) ^
Packit c4476c
                C4(K, 6) ^ C5(K, 5) ^ C6(K, 4) ^ C7(K, 3);
Packit c4476c
            L3 = C0(K, 3) ^ C1(K, 2) ^ C2(K, 1) ^ C3(K, 0) ^
Packit c4476c
                C4(K, 7) ^ C5(K, 6) ^ C6(K, 5) ^ C7(K, 4);
Packit c4476c
            L4 = C0(K, 4) ^ C1(K, 3) ^ C2(K, 2) ^ C3(K, 1) ^
Packit c4476c
                C4(K, 0) ^ C5(K, 7) ^ C6(K, 6) ^ C7(K, 5);
Packit c4476c
            L5 = C0(K, 5) ^ C1(K, 4) ^ C2(K, 3) ^ C3(K, 2) ^
Packit c4476c
                C4(K, 1) ^ C5(K, 0) ^ C6(K, 7) ^ C7(K, 6);
Packit c4476c
            L6 = C0(K, 6) ^ C1(K, 5) ^ C2(K, 4) ^ C3(K, 3) ^
Packit c4476c
                C4(K, 2) ^ C5(K, 1) ^ C6(K, 0) ^ C7(K, 7);
Packit c4476c
            L7 = C0(K, 7) ^ C1(K, 6) ^ C2(K, 5) ^ C3(K, 4) ^
Packit c4476c
                C4(K, 3) ^ C5(K, 2) ^ C6(K, 1) ^ C7(K, 0);
Packit c4476c
Packit c4476c
            K.q[0] = L0;
Packit c4476c
            K.q[1] = L1;
Packit c4476c
            K.q[2] = L2;
Packit c4476c
            K.q[3] = L3;
Packit c4476c
            K.q[4] = L4;
Packit c4476c
            K.q[5] = L5;
Packit c4476c
            K.q[6] = L6;
Packit c4476c
            K.q[7] = L7;
Packit c4476c
Packit c4476c
            L0 ^= C0(S, 0) ^ C1(S, 7) ^ C2(S, 6) ^ C3(S, 5) ^
Packit c4476c
                C4(S, 4) ^ C5(S, 3) ^ C6(S, 2) ^ C7(S, 1);
Packit c4476c
            L1 ^= C0(S, 1) ^ C1(S, 0) ^ C2(S, 7) ^ C3(S, 6) ^
Packit c4476c
                C4(S, 5) ^ C5(S, 4) ^ C6(S, 3) ^ C7(S, 2);
Packit c4476c
            L2 ^= C0(S, 2) ^ C1(S, 1) ^ C2(S, 0) ^ C3(S, 7) ^
Packit c4476c
                C4(S, 6) ^ C5(S, 5) ^ C6(S, 4) ^ C7(S, 3);
Packit c4476c
            L3 ^= C0(S, 3) ^ C1(S, 2) ^ C2(S, 1) ^ C3(S, 0) ^
Packit c4476c
                C4(S, 7) ^ C5(S, 6) ^ C6(S, 5) ^ C7(S, 4);
Packit c4476c
            L4 ^= C0(S, 4) ^ C1(S, 3) ^ C2(S, 2) ^ C3(S, 1) ^
Packit c4476c
                C4(S, 0) ^ C5(S, 7) ^ C6(S, 6) ^ C7(S, 5);
Packit c4476c
            L5 ^= C0(S, 5) ^ C1(S, 4) ^ C2(S, 3) ^ C3(S, 2) ^
Packit c4476c
                C4(S, 1) ^ C5(S, 0) ^ C6(S, 7) ^ C7(S, 6);
Packit c4476c
            L6 ^= C0(S, 6) ^ C1(S, 5) ^ C2(S, 4) ^ C3(S, 3) ^
Packit c4476c
                C4(S, 2) ^ C5(S, 1) ^ C6(S, 0) ^ C7(S, 7);
Packit c4476c
            L7 ^= C0(S, 7) ^ C1(S, 6) ^ C2(S, 5) ^ C3(S, 4) ^
Packit c4476c
                C4(S, 3) ^ C5(S, 2) ^ C6(S, 1) ^ C7(S, 0);
Packit c4476c
Packit c4476c
            S.q[0] = L0;
Packit c4476c
            S.q[1] = L1;
Packit c4476c
            S.q[2] = L2;
Packit c4476c
            S.q[3] = L3;
Packit c4476c
            S.q[4] = L4;
Packit c4476c
            S.q[5] = L5;
Packit c4476c
            S.q[6] = L6;
Packit c4476c
            S.q[7] = L7;
Packit c4476c
# else
Packit c4476c
            L0 = C0(K, 0);
Packit c4476c
            L1 = C1(K, 0);
Packit c4476c
            L2 = C2(K, 0);
Packit c4476c
            L3 = C3(K, 0);
Packit c4476c
            L4 = C4(K, 0);
Packit c4476c
            L5 = C5(K, 0);
Packit c4476c
            L6 = C6(K, 0);
Packit c4476c
            L7 = C7(K, 0);
Packit c4476c
            L0 ^= RC[r];
Packit c4476c
Packit c4476c
            L1 ^= C0(K, 1);
Packit c4476c
            L2 ^= C1(K, 1);
Packit c4476c
            L3 ^= C2(K, 1);
Packit c4476c
            L4 ^= C3(K, 1);
Packit c4476c
            L5 ^= C4(K, 1);
Packit c4476c
            L6 ^= C5(K, 1);
Packit c4476c
            L7 ^= C6(K, 1);
Packit c4476c
            L0 ^= C7(K, 1);
Packit c4476c
Packit c4476c
            L2 ^= C0(K, 2);
Packit c4476c
            L3 ^= C1(K, 2);
Packit c4476c
            L4 ^= C2(K, 2);
Packit c4476c
            L5 ^= C3(K, 2);
Packit c4476c
            L6 ^= C4(K, 2);
Packit c4476c
            L7 ^= C5(K, 2);
Packit c4476c
            L0 ^= C6(K, 2);
Packit c4476c
            L1 ^= C7(K, 2);
Packit c4476c
Packit c4476c
            L3 ^= C0(K, 3);
Packit c4476c
            L4 ^= C1(K, 3);
Packit c4476c
            L5 ^= C2(K, 3);
Packit c4476c
            L6 ^= C3(K, 3);
Packit c4476c
            L7 ^= C4(K, 3);
Packit c4476c
            L0 ^= C5(K, 3);
Packit c4476c
            L1 ^= C6(K, 3);
Packit c4476c
            L2 ^= C7(K, 3);
Packit c4476c
Packit c4476c
            L4 ^= C0(K, 4);
Packit c4476c
            L5 ^= C1(K, 4);
Packit c4476c
            L6 ^= C2(K, 4);
Packit c4476c
            L7 ^= C3(K, 4);
Packit c4476c
            L0 ^= C4(K, 4);
Packit c4476c
            L1 ^= C5(K, 4);
Packit c4476c
            L2 ^= C6(K, 4);
Packit c4476c
            L3 ^= C7(K, 4);
Packit c4476c
Packit c4476c
            L5 ^= C0(K, 5);
Packit c4476c
            L6 ^= C1(K, 5);
Packit c4476c
            L7 ^= C2(K, 5);
Packit c4476c
            L0 ^= C3(K, 5);
Packit c4476c
            L1 ^= C4(K, 5);
Packit c4476c
            L2 ^= C5(K, 5);
Packit c4476c
            L3 ^= C6(K, 5);
Packit c4476c
            L4 ^= C7(K, 5);
Packit c4476c
Packit c4476c
            L6 ^= C0(K, 6);
Packit c4476c
            L7 ^= C1(K, 6);
Packit c4476c
            L0 ^= C2(K, 6);
Packit c4476c
            L1 ^= C3(K, 6);
Packit c4476c
            L2 ^= C4(K, 6);
Packit c4476c
            L3 ^= C5(K, 6);
Packit c4476c
            L4 ^= C6(K, 6);
Packit c4476c
            L5 ^= C7(K, 6);
Packit c4476c
Packit c4476c
            L7 ^= C0(K, 7);
Packit c4476c
            L0 ^= C1(K, 7);
Packit c4476c
            L1 ^= C2(K, 7);
Packit c4476c
            L2 ^= C3(K, 7);
Packit c4476c
            L3 ^= C4(K, 7);
Packit c4476c
            L4 ^= C5(K, 7);
Packit c4476c
            L5 ^= C6(K, 7);
Packit c4476c
            L6 ^= C7(K, 7);
Packit c4476c
Packit c4476c
            K.q[0] = L0;
Packit c4476c
            K.q[1] = L1;
Packit c4476c
            K.q[2] = L2;
Packit c4476c
            K.q[3] = L3;
Packit c4476c
            K.q[4] = L4;
Packit c4476c
            K.q[5] = L5;
Packit c4476c
            K.q[6] = L6;
Packit c4476c
            K.q[7] = L7;
Packit c4476c
Packit c4476c
            L0 ^= C0(S, 0);
Packit c4476c
            L1 ^= C1(S, 0);
Packit c4476c
            L2 ^= C2(S, 0);
Packit c4476c
            L3 ^= C3(S, 0);
Packit c4476c
            L4 ^= C4(S, 0);
Packit c4476c
            L5 ^= C5(S, 0);
Packit c4476c
            L6 ^= C6(S, 0);
Packit c4476c
            L7 ^= C7(S, 0);
Packit c4476c
Packit c4476c
            L1 ^= C0(S, 1);
Packit c4476c
            L2 ^= C1(S, 1);
Packit c4476c
            L3 ^= C2(S, 1);
Packit c4476c
            L4 ^= C3(S, 1);
Packit c4476c
            L5 ^= C4(S, 1);
Packit c4476c
            L6 ^= C5(S, 1);
Packit c4476c
            L7 ^= C6(S, 1);
Packit c4476c
            L0 ^= C7(S, 1);
Packit c4476c
Packit c4476c
            L2 ^= C0(S, 2);
Packit c4476c
            L3 ^= C1(S, 2);
Packit c4476c
            L4 ^= C2(S, 2);
Packit c4476c
            L5 ^= C3(S, 2);
Packit c4476c
            L6 ^= C4(S, 2);
Packit c4476c
            L7 ^= C5(S, 2);
Packit c4476c
            L0 ^= C6(S, 2);
Packit c4476c
            L1 ^= C7(S, 2);
Packit c4476c
Packit c4476c
            L3 ^= C0(S, 3);
Packit c4476c
            L4 ^= C1(S, 3);
Packit c4476c
            L5 ^= C2(S, 3);
Packit c4476c
            L6 ^= C3(S, 3);
Packit c4476c
            L7 ^= C4(S, 3);
Packit c4476c
            L0 ^= C5(S, 3);
Packit c4476c
            L1 ^= C6(S, 3);
Packit c4476c
            L2 ^= C7(S, 3);
Packit c4476c
Packit c4476c
            L4 ^= C0(S, 4);
Packit c4476c
            L5 ^= C1(S, 4);
Packit c4476c
            L6 ^= C2(S, 4);
Packit c4476c
            L7 ^= C3(S, 4);
Packit c4476c
            L0 ^= C4(S, 4);
Packit c4476c
            L1 ^= C5(S, 4);
Packit c4476c
            L2 ^= C6(S, 4);
Packit c4476c
            L3 ^= C7(S, 4);
Packit c4476c
Packit c4476c
            L5 ^= C0(S, 5);
Packit c4476c
            L6 ^= C1(S, 5);
Packit c4476c
            L7 ^= C2(S, 5);
Packit c4476c
            L0 ^= C3(S, 5);
Packit c4476c
            L1 ^= C4(S, 5);
Packit c4476c
            L2 ^= C5(S, 5);
Packit c4476c
            L3 ^= C6(S, 5);
Packit c4476c
            L4 ^= C7(S, 5);
Packit c4476c
Packit c4476c
            L6 ^= C0(S, 6);
Packit c4476c
            L7 ^= C1(S, 6);
Packit c4476c
            L0 ^= C2(S, 6);
Packit c4476c
            L1 ^= C3(S, 6);
Packit c4476c
            L2 ^= C4(S, 6);
Packit c4476c
            L3 ^= C5(S, 6);
Packit c4476c
            L4 ^= C6(S, 6);
Packit c4476c
            L5 ^= C7(S, 6);
Packit c4476c
Packit c4476c
            L7 ^= C0(S, 7);
Packit c4476c
            L0 ^= C1(S, 7);
Packit c4476c
            L1 ^= C2(S, 7);
Packit c4476c
            L2 ^= C3(S, 7);
Packit c4476c
            L3 ^= C4(S, 7);
Packit c4476c
            L4 ^= C5(S, 7);
Packit c4476c
            L5 ^= C6(S, 7);
Packit c4476c
            L6 ^= C7(S, 7);
Packit c4476c
Packit c4476c
            S.q[0] = L0;
Packit c4476c
            S.q[1] = L1;
Packit c4476c
            S.q[2] = L2;
Packit c4476c
            S.q[3] = L3;
Packit c4476c
            S.q[4] = L4;
Packit c4476c
            S.q[5] = L5;
Packit c4476c
            S.q[6] = L6;
Packit c4476c
            S.q[7] = L7;
Packit c4476c
# endif
Packit c4476c
        }
Packit c4476c
Packit c4476c
# ifdef STRICT_ALIGNMENT
Packit c4476c
        if ((size_t)p & 7) {
Packit c4476c
            int i;
Packit c4476c
            for (i = 0; i < 64; i++)
Packit c4476c
                H->c[i] ^= S.c[i] ^ p[i];
Packit c4476c
        } else
Packit c4476c
# endif
Packit c4476c
        {
Packit c4476c
            const u64 *pa = (const u64 *)p;
Packit c4476c
            H->q[0] ^= S.q[0] ^ pa[0];
Packit c4476c
            H->q[1] ^= S.q[1] ^ pa[1];
Packit c4476c
            H->q[2] ^= S.q[2] ^ pa[2];
Packit c4476c
            H->q[3] ^= S.q[3] ^ pa[3];
Packit c4476c
            H->q[4] ^= S.q[4] ^ pa[4];
Packit c4476c
            H->q[5] ^= S.q[5] ^ pa[5];
Packit c4476c
            H->q[6] ^= S.q[6] ^ pa[6];
Packit c4476c
            H->q[7] ^= S.q[7] ^ pa[7];
Packit c4476c
        }
Packit c4476c
#endif
Packit c4476c
        p += 64;
Packit c4476c
    } while (--n);
Packit c4476c
}