Blame crypto/aes/aes_core.c

Packit c4476c
/*
Packit c4476c
 * Copyright 2002-2020 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
 * rijndael-alg-fst.c
Packit c4476c
 *
Packit c4476c
 * @version 3.0 (December 2000)
Packit c4476c
 *
Packit c4476c
 * Optimised ANSI C code for the Rijndael cipher (now AES)
Packit c4476c
 *
Packit c4476c
 * @author Vincent Rijmen
Packit c4476c
 * @author Antoon Bosselaers
Packit c4476c
 * @author Paulo Barreto
Packit c4476c
 *
Packit c4476c
 * This code is hereby placed in the public domain.
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
/* Note: rewritten a little bit to provide error control and an OpenSSL-
Packit c4476c
   compatible API */
Packit c4476c
Packit c4476c
#include <assert.h>
Packit c4476c
Packit c4476c
#include <stdlib.h>
Packit c4476c
#include <openssl/crypto.h>
Packit c4476c
#include <openssl/aes.h>
Packit c4476c
#include "aes_local.h"
Packit c4476c
Packit c4476c
#if defined(OPENSSL_AES_CONST_TIME) && !defined(AES_ASM)
Packit c4476c
typedef union {
Packit c4476c
    unsigned char b[8];
Packit c4476c
    u32 w[2];
Packit c4476c
    u64 d;
Packit c4476c
} uni;
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * Compute w := (w * x) mod (x^8 + x^4 + x^3 + x^1 + 1)
Packit c4476c
 * Therefore the name "xtime".
Packit c4476c
 */
Packit c4476c
static void XtimeWord(u32 *w)
Packit c4476c
{
Packit c4476c
    u32 a, b;
Packit c4476c
Packit c4476c
    a = *w;
Packit c4476c
    b = a & 0x80808080u;
Packit c4476c
    a ^= b;
Packit c4476c
    b -= b >> 7;
Packit c4476c
    b &= 0x1B1B1B1Bu;
Packit c4476c
    b ^= a << 1;
Packit c4476c
    *w = b;
Packit c4476c
}
Packit c4476c
Packit c4476c
static void XtimeLong(u64 *w)
Packit c4476c
{
Packit c4476c
    u64 a, b;
Packit c4476c
Packit c4476c
    a = *w;
Packit c4476c
    b = a & 0x8080808080808080uLL;
Packit c4476c
    a ^= b;
Packit c4476c
    b -= b >> 7;
Packit c4476c
    b &= 0x1B1B1B1B1B1B1B1BuLL;
Packit c4476c
    b ^= a << 1;
Packit c4476c
    *w = b;
Packit c4476c
}
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * This computes w := S * w ^ -1 + c, where c = {01100011}.
Packit c4476c
 * Instead of using GF(2^8) mod (x^8+x^4+x^3+x+1} we do the inversion
Packit c4476c
 * in GF(GF(GF(2^2)^2)^2) mod (X^2+X+8)
Packit c4476c
 * and GF(GF(2^2)^2) mod (X^2+X+2)
Packit c4476c
 * and GF(2^2) mod (X^2+X+1)
Packit c4476c
 * The first part of the algorithm below transfers the coordinates
Packit c4476c
 * {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80} =>
Packit c4476c
 * {1,Y,Y^2,Y^3,Y^4,Y^5,Y^6,Y^7} with Y=0x41:
Packit c4476c
 * {0x01,0x41,0x66,0x6c,0x56,0x9a,0x58,0xc4}
Packit c4476c
 * The last part undoes the coordinate transfer and the final affine
Packit c4476c
 * transformation S:
Packit c4476c
 * b[i] = b[i] + b[(i+4)%8] + b[(i+5)%8] + b[(i+6)%8] + b[(i+7)%8] + c[i]
Packit c4476c
 * in one step.
Packit c4476c
 * The multiplication in GF(2^2^2^2) is done in ordinary coords:
Packit c4476c
 * A = (a0*1 + a1*x^4)
Packit c4476c
 * B = (b0*1 + b1*x^4)
Packit c4476c
 * AB = ((a0*b0 + 8*a1*b1)*1 + (a1*b0 + (a0+a1)*b1)*x^4)
Packit c4476c
 * When A = (a0,a1) is given we want to solve AB = 1:
Packit c4476c
 * (a) 1 = a0*b0 + 8*a1*b1
Packit c4476c
 * (b) 0 = a1*b0 + (a0+a1)*b1
Packit c4476c
 * => multiply (a) by a1 and (b) by a0
Packit c4476c
 * (c) a1 = a1*a0*b0 + (8*a1*a1)*b1
Packit c4476c
 * (d) 0 = a1*a0*b0 + (a0*a0+a1*a0)*b1
Packit c4476c
 * => add (c) + (d)
Packit c4476c
 * (e) a1 = (a0*a0 + a1*a0 + 8*a1*a1)*b1
Packit c4476c
 * => therefore
Packit c4476c
 * b1 = (a0*a0 + a1*a0 + 8*a1*a1)^-1 * a1
Packit c4476c
 * => and adding (a1*b0) to (b) we get
Packit c4476c
 * (f) a1*b0 = (a0+a1)*b1
Packit c4476c
 * => therefore
Packit c4476c
 * b0 = (a0*a0 + a1*a0 + 8*a1*a1)^-1 * (a0+a1)
Packit c4476c
 * Note this formula also works for the case
Packit c4476c
 * (a0+a1)*a0 + 8*a1*a1 = 0
Packit c4476c
 * if the inverse element for 0^-1 is mapped to 0.
Packit c4476c
 * Repeat the same for GF(2^2^2) and GF(2^2).
Packit c4476c
 * We get the following algorithm:
Packit c4476c
 * inv8(a0,a1):
Packit c4476c
 *   x0 = a0^a1
Packit c4476c
 *   [y0,y1] = mul4([x0,a1],[a0,a1]); (*)
Packit c4476c
 *   y1 = mul4(8,y1);
Packit c4476c
 *   t = inv4(y0^y1);
Packit c4476c
 *   [b0,b1] = mul4([x0,a1],[t,t]); (*)
Packit c4476c
 *   return [b0,b1];
Packit c4476c
 * The non-linear multiplies (*) can be done in parallel at no extra cost.
Packit c4476c
 */
Packit c4476c
static void SubWord(u32 *w)
Packit c4476c
{
Packit c4476c
    u32 x, y, a1, a2, a3, a4, a5, a6;
Packit c4476c
Packit c4476c
    x = *w;
Packit c4476c
    y = ((x & 0xFEFEFEFEu) >> 1) | ((x & 0x01010101u) << 7);
Packit c4476c
    x &= 0xDDDDDDDDu;
Packit c4476c
    x ^= y & 0x57575757u;
Packit c4476c
    y = ((y & 0xFEFEFEFEu) >> 1) | ((y & 0x01010101u) << 7);
Packit c4476c
    x ^= y & 0x1C1C1C1Cu;
Packit c4476c
    y = ((y & 0xFEFEFEFEu) >> 1) | ((y & 0x01010101u) << 7);
Packit c4476c
    x ^= y & 0x4A4A4A4Au;
Packit c4476c
    y = ((y & 0xFEFEFEFEu) >> 1) | ((y & 0x01010101u) << 7);
Packit c4476c
    x ^= y & 0x42424242u;
Packit c4476c
    y = ((y & 0xFEFEFEFEu) >> 1) | ((y & 0x01010101u) << 7);
Packit c4476c
    x ^= y & 0x64646464u;
Packit c4476c
    y = ((y & 0xFEFEFEFEu) >> 1) | ((y & 0x01010101u) << 7);
Packit c4476c
    x ^= y & 0xE0E0E0E0u;
Packit c4476c
    a1 = x;
Packit c4476c
    a1 ^= (x & 0xF0F0F0F0u) >> 4;
Packit c4476c
    a2 = ((x & 0xCCCCCCCCu) >> 2) | ((x & 0x33333333u) << 2);
Packit c4476c
    a3 = x & a1;
Packit c4476c
    a3 ^= (a3 & 0xAAAAAAAAu) >> 1;
Packit c4476c
    a3 ^= (((x << 1) & a1) ^ ((a1 << 1) & x)) & 0xAAAAAAAAu;
Packit c4476c
    a4 = a2 & a1;
Packit c4476c
    a4 ^= (a4 & 0xAAAAAAAAu) >> 1;
Packit c4476c
    a4 ^= (((a2 << 1) & a1) ^ ((a1 << 1) & a2)) & 0xAAAAAAAAu;
Packit c4476c
    a5 = (a3 & 0xCCCCCCCCu) >> 2;
Packit c4476c
    a3 ^= ((a4 << 2) ^ a4) & 0xCCCCCCCCu;
Packit c4476c
    a4 = a5 & 0x22222222u;
Packit c4476c
    a4 |= a4 >> 1;
Packit c4476c
    a4 ^= (a5 << 1) & 0x22222222u;
Packit c4476c
    a3 ^= a4;
Packit c4476c
    a5 = a3 & 0xA0A0A0A0u;
Packit c4476c
    a5 |= a5 >> 1;
Packit c4476c
    a5 ^= (a3 << 1) & 0xA0A0A0A0u;
Packit c4476c
    a4 = a5 & 0xC0C0C0C0u;
Packit c4476c
    a6 = a4 >> 2;
Packit c4476c
    a4 ^= (a5 << 2) & 0xC0C0C0C0u;
Packit c4476c
    a5 = a6 & 0x20202020u;
Packit c4476c
    a5 |= a5 >> 1;
Packit c4476c
    a5 ^= (a6 << 1) & 0x20202020u;
Packit c4476c
    a4 |= a5;
Packit c4476c
    a3 ^= a4 >> 4;
Packit c4476c
    a3 &= 0x0F0F0F0Fu;
Packit c4476c
    a2 = a3;
Packit c4476c
    a2 ^= (a3 & 0x0C0C0C0Cu) >> 2;
Packit c4476c
    a4 = a3 & a2;
Packit c4476c
    a4 ^= (a4 & 0x0A0A0A0A0Au) >> 1;
Packit c4476c
    a4 ^= (((a3 << 1) & a2) ^ ((a2 << 1) & a3)) & 0x0A0A0A0Au;
Packit c4476c
    a5 = a4 & 0x08080808u;
Packit c4476c
    a5 |= a5 >> 1;
Packit c4476c
    a5 ^= (a4 << 1) & 0x08080808u;
Packit c4476c
    a4 ^= a5 >> 2;
Packit c4476c
    a4 &= 0x03030303u;
Packit c4476c
    a4 ^= (a4 & 0x02020202u) >> 1;
Packit c4476c
    a4 |= a4 << 2;
Packit c4476c
    a3 = a2 & a4;
Packit c4476c
    a3 ^= (a3 & 0x0A0A0A0Au) >> 1;
Packit c4476c
    a3 ^= (((a2 << 1) & a4) ^ ((a4 << 1) & a2)) & 0x0A0A0A0Au;
Packit c4476c
    a3 |= a3 << 4;
Packit c4476c
    a2 = ((a1 & 0xCCCCCCCCu) >> 2) | ((a1 & 0x33333333u) << 2);
Packit c4476c
    x = a1 & a3;
Packit c4476c
    x ^= (x & 0xAAAAAAAAu) >> 1;
Packit c4476c
    x ^= (((a1 << 1) & a3) ^ ((a3 << 1) & a1)) & 0xAAAAAAAAu;
Packit c4476c
    a4 = a2 & a3;
Packit c4476c
    a4 ^= (a4 & 0xAAAAAAAAu) >> 1;
Packit c4476c
    a4 ^= (((a2 << 1) & a3) ^ ((a3 << 1) & a2)) & 0xAAAAAAAAu;
Packit c4476c
    a5 = (x & 0xCCCCCCCCu) >> 2;
Packit c4476c
    x ^= ((a4 << 2) ^ a4) & 0xCCCCCCCCu;
Packit c4476c
    a4 = a5 & 0x22222222u;
Packit c4476c
    a4 |= a4 >> 1;
Packit c4476c
    a4 ^= (a5 << 1) & 0x22222222u;
Packit c4476c
    x ^= a4;
Packit c4476c
    y = ((x & 0xFEFEFEFEu) >> 1) | ((x & 0x01010101u) << 7);
Packit c4476c
    x &= 0x39393939u;
Packit c4476c
    x ^= y & 0x3F3F3F3Fu;
Packit c4476c
    y = ((y & 0xFCFCFCFCu) >> 2) | ((y & 0x03030303u) << 6);
Packit c4476c
    x ^= y & 0x97979797u;
Packit c4476c
    y = ((y & 0xFEFEFEFEu) >> 1) | ((y & 0x01010101u) << 7);
Packit c4476c
    x ^= y & 0x9B9B9B9Bu;
Packit c4476c
    y = ((y & 0xFEFEFEFEu) >> 1) | ((y & 0x01010101u) << 7);
Packit c4476c
    x ^= y & 0x3C3C3C3Cu;
Packit c4476c
    y = ((y & 0xFEFEFEFEu) >> 1) | ((y & 0x01010101u) << 7);
Packit c4476c
    x ^= y & 0xDDDDDDDDu;
Packit c4476c
    y = ((y & 0xFEFEFEFEu) >> 1) | ((y & 0x01010101u) << 7);
Packit c4476c
    x ^= y & 0x72727272u;
Packit c4476c
    x ^= 0x63636363u;
Packit c4476c
    *w = x;
Packit c4476c
}
Packit c4476c
Packit c4476c
static void SubLong(u64 *w)
Packit c4476c
{
Packit c4476c
    u64 x, y, a1, a2, a3, a4, a5, a6;
Packit c4476c
Packit c4476c
    x = *w;
Packit c4476c
    y = ((x & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((x & 0x0101010101010101uLL) << 7);
Packit c4476c
    x &= 0xDDDDDDDDDDDDDDDDuLL;
Packit c4476c
    x ^= y & 0x5757575757575757uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x1C1C1C1C1C1C1C1CuLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x4A4A4A4A4A4A4A4AuLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x4242424242424242uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x6464646464646464uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0xE0E0E0E0E0E0E0E0uLL;
Packit c4476c
    a1 = x;
Packit c4476c
    a1 ^= (x & 0xF0F0F0F0F0F0F0F0uLL) >> 4;
Packit c4476c
    a2 = ((x & 0xCCCCCCCCCCCCCCCCuLL) >> 2) | ((x & 0x3333333333333333uLL) << 2);
Packit c4476c
    a3 = x & a1;
Packit c4476c
    a3 ^= (a3 & 0xAAAAAAAAAAAAAAAAuLL) >> 1;
Packit c4476c
    a3 ^= (((x << 1) & a1) ^ ((a1 << 1) & x)) & 0xAAAAAAAAAAAAAAAAuLL;
Packit c4476c
    a4 = a2 & a1;
Packit c4476c
    a4 ^= (a4 & 0xAAAAAAAAAAAAAAAAuLL) >> 1;
Packit c4476c
    a4 ^= (((a2 << 1) & a1) ^ ((a1 << 1) & a2)) & 0xAAAAAAAAAAAAAAAAuLL;
Packit c4476c
    a5 = (a3 & 0xCCCCCCCCCCCCCCCCuLL) >> 2;
Packit c4476c
    a3 ^= ((a4 << 2) ^ a4) & 0xCCCCCCCCCCCCCCCCuLL;
Packit c4476c
    a4 = a5 & 0x2222222222222222uLL;
Packit c4476c
    a4 |= a4 >> 1;
Packit c4476c
    a4 ^= (a5 << 1) & 0x2222222222222222uLL;
Packit c4476c
    a3 ^= a4;
Packit c4476c
    a5 = a3 & 0xA0A0A0A0A0A0A0A0uLL;
Packit c4476c
    a5 |= a5 >> 1;
Packit c4476c
    a5 ^= (a3 << 1) & 0xA0A0A0A0A0A0A0A0uLL;
Packit c4476c
    a4 = a5 & 0xC0C0C0C0C0C0C0C0uLL;
Packit c4476c
    a6 = a4 >> 2;
Packit c4476c
    a4 ^= (a5 << 2) & 0xC0C0C0C0C0C0C0C0uLL;
Packit c4476c
    a5 = a6 & 0x2020202020202020uLL;
Packit c4476c
    a5 |= a5 >> 1;
Packit c4476c
    a5 ^= (a6 << 1) & 0x2020202020202020uLL;
Packit c4476c
    a4 |= a5;
Packit c4476c
    a3 ^= a4 >> 4;
Packit c4476c
    a3 &= 0x0F0F0F0F0F0F0F0FuLL;
Packit c4476c
    a2 = a3;
Packit c4476c
    a2 ^= (a3 & 0x0C0C0C0C0C0C0C0CuLL) >> 2;
Packit c4476c
    a4 = a3 & a2;
Packit c4476c
    a4 ^= (a4 & 0x0A0A0A0A0A0A0A0AuLL) >> 1;
Packit c4476c
    a4 ^= (((a3 << 1) & a2) ^ ((a2 << 1) & a3)) & 0x0A0A0A0A0A0A0A0AuLL;
Packit c4476c
    a5 = a4 & 0x0808080808080808uLL;
Packit c4476c
    a5 |= a5 >> 1;
Packit c4476c
    a5 ^= (a4 << 1) & 0x0808080808080808uLL;
Packit c4476c
    a4 ^= a5 >> 2;
Packit c4476c
    a4 &= 0x0303030303030303uLL;
Packit c4476c
    a4 ^= (a4 & 0x0202020202020202uLL) >> 1;
Packit c4476c
    a4 |= a4 << 2;
Packit c4476c
    a3 = a2 & a4;
Packit c4476c
    a3 ^= (a3 & 0x0A0A0A0A0A0A0A0AuLL) >> 1;
Packit c4476c
    a3 ^= (((a2 << 1) & a4) ^ ((a4 << 1) & a2)) & 0x0A0A0A0A0A0A0A0AuLL;
Packit c4476c
    a3 |= a3 << 4;
Packit c4476c
    a2 = ((a1 & 0xCCCCCCCCCCCCCCCCuLL) >> 2) | ((a1 & 0x3333333333333333uLL) << 2);
Packit c4476c
    x = a1 & a3;
Packit c4476c
    x ^= (x & 0xAAAAAAAAAAAAAAAAuLL) >> 1;
Packit c4476c
    x ^= (((a1 << 1) & a3) ^ ((a3 << 1) & a1)) & 0xAAAAAAAAAAAAAAAAuLL;
Packit c4476c
    a4 = a2 & a3;
Packit c4476c
    a4 ^= (a4 & 0xAAAAAAAAAAAAAAAAuLL) >> 1;
Packit c4476c
    a4 ^= (((a2 << 1) & a3) ^ ((a3 << 1) & a2)) & 0xAAAAAAAAAAAAAAAAuLL;
Packit c4476c
    a5 = (x & 0xCCCCCCCCCCCCCCCCuLL) >> 2;
Packit c4476c
    x ^= ((a4 << 2) ^ a4) & 0xCCCCCCCCCCCCCCCCuLL;
Packit c4476c
    a4 = a5 & 0x2222222222222222uLL;
Packit c4476c
    a4 |= a4 >> 1;
Packit c4476c
    a4 ^= (a5 << 1) & 0x2222222222222222uLL;
Packit c4476c
    x ^= a4;
Packit c4476c
    y = ((x & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((x & 0x0101010101010101uLL) << 7);
Packit c4476c
    x &= 0x3939393939393939uLL;
Packit c4476c
    x ^= y & 0x3F3F3F3F3F3F3F3FuLL;
Packit c4476c
    y = ((y & 0xFCFCFCFCFCFCFCFCuLL) >> 2) | ((y & 0x0303030303030303uLL) << 6);
Packit c4476c
    x ^= y & 0x9797979797979797uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x9B9B9B9B9B9B9B9BuLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x3C3C3C3C3C3C3C3CuLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0xDDDDDDDDDDDDDDDDuLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x7272727272727272uLL;
Packit c4476c
    x ^= 0x6363636363636363uLL;
Packit c4476c
    *w = x;
Packit c4476c
}
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * This computes w := (S^-1 * (w + c))^-1
Packit c4476c
 */
Packit c4476c
static void InvSubLong(u64 *w)
Packit c4476c
{
Packit c4476c
    u64 x, y, a1, a2, a3, a4, a5, a6;
Packit c4476c
Packit c4476c
    x = *w;
Packit c4476c
    x ^= 0x6363636363636363uLL;
Packit c4476c
    y = ((x & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((x & 0x0101010101010101uLL) << 7);
Packit c4476c
    x &= 0xFDFDFDFDFDFDFDFDuLL;
Packit c4476c
    x ^= y & 0x5E5E5E5E5E5E5E5EuLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0xF3F3F3F3F3F3F3F3uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0xF5F5F5F5F5F5F5F5uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x7878787878787878uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x7777777777777777uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x1515151515151515uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0xA5A5A5A5A5A5A5A5uLL;
Packit c4476c
    a1 = x;
Packit c4476c
    a1 ^= (x & 0xF0F0F0F0F0F0F0F0uLL) >> 4;
Packit c4476c
    a2 = ((x & 0xCCCCCCCCCCCCCCCCuLL) >> 2) | ((x & 0x3333333333333333uLL) << 2);
Packit c4476c
    a3 = x & a1;
Packit c4476c
    a3 ^= (a3 & 0xAAAAAAAAAAAAAAAAuLL) >> 1;
Packit c4476c
    a3 ^= (((x << 1) & a1) ^ ((a1 << 1) & x)) & 0xAAAAAAAAAAAAAAAAuLL;
Packit c4476c
    a4 = a2 & a1;
Packit c4476c
    a4 ^= (a4 & 0xAAAAAAAAAAAAAAAAuLL) >> 1;
Packit c4476c
    a4 ^= (((a2 << 1) & a1) ^ ((a1 << 1) & a2)) & 0xAAAAAAAAAAAAAAAAuLL;
Packit c4476c
    a5 = (a3 & 0xCCCCCCCCCCCCCCCCuLL) >> 2;
Packit c4476c
    a3 ^= ((a4 << 2) ^ a4) & 0xCCCCCCCCCCCCCCCCuLL;
Packit c4476c
    a4 = a5 & 0x2222222222222222uLL;
Packit c4476c
    a4 |= a4 >> 1;
Packit c4476c
    a4 ^= (a5 << 1) & 0x2222222222222222uLL;
Packit c4476c
    a3 ^= a4;
Packit c4476c
    a5 = a3 & 0xA0A0A0A0A0A0A0A0uLL;
Packit c4476c
    a5 |= a5 >> 1;
Packit c4476c
    a5 ^= (a3 << 1) & 0xA0A0A0A0A0A0A0A0uLL;
Packit c4476c
    a4 = a5 & 0xC0C0C0C0C0C0C0C0uLL;
Packit c4476c
    a6 = a4 >> 2;
Packit c4476c
    a4 ^= (a5 << 2) & 0xC0C0C0C0C0C0C0C0uLL;
Packit c4476c
    a5 = a6 & 0x2020202020202020uLL;
Packit c4476c
    a5 |= a5 >> 1;
Packit c4476c
    a5 ^= (a6 << 1) & 0x2020202020202020uLL;
Packit c4476c
    a4 |= a5;
Packit c4476c
    a3 ^= a4 >> 4;
Packit c4476c
    a3 &= 0x0F0F0F0F0F0F0F0FuLL;
Packit c4476c
    a2 = a3;
Packit c4476c
    a2 ^= (a3 & 0x0C0C0C0C0C0C0C0CuLL) >> 2;
Packit c4476c
    a4 = a3 & a2;
Packit c4476c
    a4 ^= (a4 & 0x0A0A0A0A0A0A0A0AuLL) >> 1;
Packit c4476c
    a4 ^= (((a3 << 1) & a2) ^ ((a2 << 1) & a3)) & 0x0A0A0A0A0A0A0A0AuLL;
Packit c4476c
    a5 = a4 & 0x0808080808080808uLL;
Packit c4476c
    a5 |= a5 >> 1;
Packit c4476c
    a5 ^= (a4 << 1) & 0x0808080808080808uLL;
Packit c4476c
    a4 ^= a5 >> 2;
Packit c4476c
    a4 &= 0x0303030303030303uLL;
Packit c4476c
    a4 ^= (a4 & 0x0202020202020202uLL) >> 1;
Packit c4476c
    a4 |= a4 << 2;
Packit c4476c
    a3 = a2 & a4;
Packit c4476c
    a3 ^= (a3 & 0x0A0A0A0A0A0A0A0AuLL) >> 1;
Packit c4476c
    a3 ^= (((a2 << 1) & a4) ^ ((a4 << 1) & a2)) & 0x0A0A0A0A0A0A0A0AuLL;
Packit c4476c
    a3 |= a3 << 4;
Packit c4476c
    a2 = ((a1 & 0xCCCCCCCCCCCCCCCCuLL) >> 2) | ((a1 & 0x3333333333333333uLL) << 2);
Packit c4476c
    x = a1 & a3;
Packit c4476c
    x ^= (x & 0xAAAAAAAAAAAAAAAAuLL) >> 1;
Packit c4476c
    x ^= (((a1 << 1) & a3) ^ ((a3 << 1) & a1)) & 0xAAAAAAAAAAAAAAAAuLL;
Packit c4476c
    a4 = a2 & a3;
Packit c4476c
    a4 ^= (a4 & 0xAAAAAAAAAAAAAAAAuLL) >> 1;
Packit c4476c
    a4 ^= (((a2 << 1) & a3) ^ ((a3 << 1) & a2)) & 0xAAAAAAAAAAAAAAAAuLL;
Packit c4476c
    a5 = (x & 0xCCCCCCCCCCCCCCCCuLL) >> 2;
Packit c4476c
    x ^= ((a4 << 2) ^ a4) & 0xCCCCCCCCCCCCCCCCuLL;
Packit c4476c
    a4 = a5 & 0x2222222222222222uLL;
Packit c4476c
    a4 |= a4 >> 1;
Packit c4476c
    a4 ^= (a5 << 1) & 0x2222222222222222uLL;
Packit c4476c
    x ^= a4;
Packit c4476c
    y = ((x & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((x & 0x0101010101010101uLL) << 7);
Packit c4476c
    x &= 0xB5B5B5B5B5B5B5B5uLL;
Packit c4476c
    x ^= y & 0x4040404040404040uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x8080808080808080uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x1616161616161616uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0xEBEBEBEBEBEBEBEBuLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x9797979797979797uLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0xFBFBFBFBFBFBFBFBuLL;
Packit c4476c
    y = ((y & 0xFEFEFEFEFEFEFEFEuLL) >> 1) | ((y & 0x0101010101010101uLL) << 7);
Packit c4476c
    x ^= y & 0x7D7D7D7D7D7D7D7DuLL;
Packit c4476c
    *w = x;
Packit c4476c
}
Packit c4476c
Packit c4476c
static void ShiftRows(u64 *state)
Packit c4476c
{
Packit c4476c
    unsigned char s[4];
Packit c4476c
    unsigned char *s0;
Packit c4476c
    int r;
Packit c4476c
Packit c4476c
    s0 = (unsigned char *)state;
Packit c4476c
    for (r = 0; r < 4; r++) {
Packit c4476c
        s[0] = s0[0*4 + r];
Packit c4476c
        s[1] = s0[1*4 + r];
Packit c4476c
        s[2] = s0[2*4 + r];
Packit c4476c
        s[3] = s0[3*4 + r];
Packit c4476c
        s0[0*4 + r] = s[(r+0) % 4];
Packit c4476c
        s0[1*4 + r] = s[(r+1) % 4];
Packit c4476c
        s0[2*4 + r] = s[(r+2) % 4];
Packit c4476c
        s0[3*4 + r] = s[(r+3) % 4];
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
Packit c4476c
static void InvShiftRows(u64 *state)
Packit c4476c
{
Packit c4476c
    unsigned char s[4];
Packit c4476c
    unsigned char *s0;
Packit c4476c
    int r;
Packit c4476c
Packit c4476c
    s0 = (unsigned char *)state;
Packit c4476c
    for (r = 0; r < 4; r++) {
Packit c4476c
        s[0] = s0[0*4 + r];
Packit c4476c
        s[1] = s0[1*4 + r];
Packit c4476c
        s[2] = s0[2*4 + r];
Packit c4476c
        s[3] = s0[3*4 + r];
Packit c4476c
        s0[0*4 + r] = s[(4-r) % 4];
Packit c4476c
        s0[1*4 + r] = s[(5-r) % 4];
Packit c4476c
        s0[2*4 + r] = s[(6-r) % 4];
Packit c4476c
        s0[3*4 + r] = s[(7-r) % 4];
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
Packit c4476c
static void MixColumns(u64 *state)
Packit c4476c
{
Packit c4476c
    uni s1;
Packit c4476c
    uni s;
Packit c4476c
    int c;
Packit c4476c
Packit c4476c
    for (c = 0; c < 2; c++) {
Packit c4476c
        s1.d = state[c];
Packit c4476c
        s.d = s1.d;
Packit c4476c
        s.d ^= ((s.d & 0xFFFF0000FFFF0000uLL) >> 16)
Packit c4476c
               | ((s.d & 0x0000FFFF0000FFFFuLL) << 16);
Packit c4476c
        s.d ^= ((s.d & 0xFF00FF00FF00FF00uLL) >> 8)
Packit c4476c
               | ((s.d & 0x00FF00FF00FF00FFuLL) << 8);
Packit c4476c
        s.d ^= s1.d;
Packit c4476c
        XtimeLong(&s1.d);
Packit c4476c
        s.d ^= s1.d;
Packit c4476c
        s.b[0] ^= s1.b[1];
Packit c4476c
        s.b[1] ^= s1.b[2];
Packit c4476c
        s.b[2] ^= s1.b[3];
Packit c4476c
        s.b[3] ^= s1.b[0];
Packit c4476c
        s.b[4] ^= s1.b[5];
Packit c4476c
        s.b[5] ^= s1.b[6];
Packit c4476c
        s.b[6] ^= s1.b[7];
Packit c4476c
        s.b[7] ^= s1.b[4];
Packit c4476c
        state[c] = s.d;
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
Packit c4476c
static void InvMixColumns(u64 *state)
Packit c4476c
{
Packit c4476c
    uni s1;
Packit c4476c
    uni s;
Packit c4476c
    int c;
Packit c4476c
Packit c4476c
    for (c = 0; c < 2; c++) {
Packit c4476c
        s1.d = state[c];
Packit c4476c
        s.d = s1.d;
Packit c4476c
        s.d ^= ((s.d & 0xFFFF0000FFFF0000uLL) >> 16)
Packit c4476c
               | ((s.d & 0x0000FFFF0000FFFFuLL) << 16);
Packit c4476c
        s.d ^= ((s.d & 0xFF00FF00FF00FF00uLL) >> 8)
Packit c4476c
               | ((s.d & 0x00FF00FF00FF00FFuLL) << 8);
Packit c4476c
        s.d ^= s1.d;
Packit c4476c
        XtimeLong(&s1.d);
Packit c4476c
        s.d ^= s1.d;
Packit c4476c
        s.b[0] ^= s1.b[1];
Packit c4476c
        s.b[1] ^= s1.b[2];
Packit c4476c
        s.b[2] ^= s1.b[3];
Packit c4476c
        s.b[3] ^= s1.b[0];
Packit c4476c
        s.b[4] ^= s1.b[5];
Packit c4476c
        s.b[5] ^= s1.b[6];
Packit c4476c
        s.b[6] ^= s1.b[7];
Packit c4476c
        s.b[7] ^= s1.b[4];
Packit c4476c
        XtimeLong(&s1.d);
Packit c4476c
        s1.d ^= ((s1.d & 0xFFFF0000FFFF0000uLL) >> 16)
Packit c4476c
                | ((s1.d & 0x0000FFFF0000FFFFuLL) << 16);
Packit c4476c
        s.d ^= s1.d;
Packit c4476c
        XtimeLong(&s1.d);
Packit c4476c
        s1.d ^= ((s1.d & 0xFF00FF00FF00FF00uLL) >> 8)
Packit c4476c
                | ((s1.d & 0x00FF00FF00FF00FFuLL) << 8);
Packit c4476c
        s.d ^= s1.d;
Packit c4476c
        state[c] = s.d;
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
Packit c4476c
static void AddRoundKey(u64 *state, const u64 *w)
Packit c4476c
{
Packit c4476c
    state[0] ^= w[0];
Packit c4476c
    state[1] ^= w[1];
Packit c4476c
}
Packit c4476c
Packit c4476c
static void Cipher(const unsigned char *in, unsigned char *out,
Packit c4476c
                   const u64 *w, int nr)
Packit c4476c
{
Packit c4476c
    u64 state[2];
Packit c4476c
    int i;
Packit c4476c
Packit c4476c
    memcpy(state, in, 16);
Packit c4476c
Packit c4476c
    AddRoundKey(state, w);
Packit c4476c
Packit c4476c
    for (i = 1; i < nr; i++) {
Packit c4476c
        SubLong(&state[0]);
Packit c4476c
        SubLong(&state[1]);
Packit c4476c
        ShiftRows(state);
Packit c4476c
        MixColumns(state);
Packit c4476c
        AddRoundKey(state, w + i*2);
Packit c4476c
    }
Packit c4476c
Packit c4476c
    SubLong(&state[0]);
Packit c4476c
    SubLong(&state[1]);
Packit c4476c
    ShiftRows(state);
Packit c4476c
    AddRoundKey(state, w + nr*2);
Packit c4476c
Packit c4476c
    memcpy(out, state, 16);
Packit c4476c
}
Packit c4476c
Packit c4476c
static void InvCipher(const unsigned char *in, unsigned char *out,
Packit c4476c
                      const u64 *w, int nr)
Packit c4476c
Packit c4476c
{
Packit c4476c
    u64 state[2];
Packit c4476c
    int i;
Packit c4476c
Packit c4476c
    memcpy(state, in, 16);
Packit c4476c
Packit c4476c
    AddRoundKey(state, w + nr*2);
Packit c4476c
Packit c4476c
    for (i = nr - 1; i > 0; i--) {
Packit c4476c
        InvShiftRows(state);
Packit c4476c
        InvSubLong(&state[0]);
Packit c4476c
        InvSubLong(&state[1]);
Packit c4476c
        AddRoundKey(state, w + i*2);
Packit c4476c
        InvMixColumns(state);
Packit c4476c
    }
Packit c4476c
Packit c4476c
    InvShiftRows(state);
Packit c4476c
    InvSubLong(&state[0]);
Packit c4476c
    InvSubLong(&state[1]);
Packit c4476c
    AddRoundKey(state, w);
Packit c4476c
Packit c4476c
    memcpy(out, state, 16);
Packit c4476c
}
Packit c4476c
Packit c4476c
static void RotWord(u32 *x)
Packit c4476c
{
Packit c4476c
    unsigned char *w0;
Packit c4476c
    unsigned char tmp;
Packit c4476c
Packit c4476c
    w0 = (unsigned char *)x;
Packit c4476c
    tmp = w0[0];
Packit c4476c
    w0[0] = w0[1];
Packit c4476c
    w0[1] = w0[2];
Packit c4476c
    w0[2] = w0[3];
Packit c4476c
    w0[3] = tmp;
Packit c4476c
}
Packit c4476c
Packit c4476c
static void KeyExpansion(const unsigned char *key, u64 *w,
Packit c4476c
                         int nr, int nk)
Packit c4476c
{
Packit c4476c
    u32 rcon;
Packit c4476c
    uni prev;
Packit c4476c
    u32 temp;
Packit c4476c
    int i, n;
Packit c4476c
Packit c4476c
    memcpy(w, key, nk*4);
Packit c4476c
    memcpy(&rcon, "\1\0\0\0", 4);
Packit c4476c
    n = nk/2;
Packit c4476c
    prev.d = w[n-1];
Packit c4476c
    for (i = n; i < (nr+1)*2; i++) {
Packit c4476c
        temp = prev.w[1];
Packit c4476c
        if (i % n == 0) {
Packit c4476c
            RotWord(&temp);
Packit c4476c
            SubWord(&temp);
Packit c4476c
            temp ^= rcon;
Packit c4476c
            XtimeWord(&rcon);
Packit c4476c
        } else if (nk > 6 && i % n == 2) {
Packit c4476c
            SubWord(&temp);
Packit c4476c
        }
Packit c4476c
        prev.d = w[i-n];
Packit c4476c
        prev.w[0] ^= temp;
Packit c4476c
        prev.w[1] ^= prev.w[0];
Packit c4476c
        w[i] = prev.d;
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
Packit c4476c
/**
Packit c4476c
 * Expand the cipher key into the encryption key schedule.
Packit c4476c
 */
Packit c4476c
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
Packit c4476c
                        AES_KEY *key)
Packit c4476c
{
Packit c4476c
    u64 *rk;
Packit c4476c
Packit c4476c
    if (!userKey || !key)
Packit c4476c
        return -1;
Packit c4476c
    if (bits != 128 && bits != 192 && bits != 256)
Packit c4476c
        return -2;
Packit c4476c
Packit c4476c
    rk = (u64*)key->rd_key;
Packit c4476c
Packit c4476c
    if (bits == 128)
Packit c4476c
        key->rounds = 10;
Packit c4476c
    else if (bits == 192)
Packit c4476c
        key->rounds = 12;
Packit c4476c
    else
Packit c4476c
        key->rounds = 14;
Packit c4476c
Packit c4476c
    KeyExpansion(userKey, rk, key->rounds, bits/32);
Packit c4476c
    return 0;
Packit c4476c
}
Packit c4476c
Packit c4476c
/**
Packit c4476c
 * Expand the cipher key into the decryption key schedule.
Packit c4476c
 */
Packit c4476c
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
Packit c4476c
                        AES_KEY *key)
Packit c4476c
{
Packit c4476c
    return AES_set_encrypt_key(userKey, bits, key);
Packit c4476c
}
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * Encrypt a single block
Packit c4476c
 * in and out can overlap
Packit c4476c
 */
Packit c4476c
void AES_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                 const AES_KEY *key)
Packit c4476c
{
Packit c4476c
    const u64 *rk;
Packit c4476c
Packit c4476c
    assert(in && out && key);
Packit c4476c
    rk = (u64*)key->rd_key;
Packit c4476c
Packit c4476c
    Cipher(in, out, rk, key->rounds);
Packit c4476c
}
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * Decrypt a single block
Packit c4476c
 * in and out can overlap
Packit c4476c
 */
Packit c4476c
void AES_decrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                 const AES_KEY *key)
Packit c4476c
{
Packit c4476c
    const u64 *rk;
Packit c4476c
Packit c4476c
    assert(in && out && key);
Packit c4476c
    rk = (u64*)key->rd_key;
Packit c4476c
Packit c4476c
    InvCipher(in, out, rk, key->rounds);
Packit c4476c
}
Packit c4476c
Packit c4476c
# ifndef OPENSSL_SMALL_FOOTPRINT
Packit c4476c
void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                       size_t blocks, const AES_KEY *key,
Packit c4476c
                       const unsigned char *ivec);
Packit c4476c
Packit c4476c
static void RawToBits(const u8 raw[64], u64 bits[8])
Packit c4476c
{
Packit c4476c
    int i, j;
Packit c4476c
    u64 in, out;
Packit c4476c
Packit c4476c
    memset(bits, 0, 64);
Packit c4476c
    for (i = 0; i < 8; i++) {
Packit c4476c
        in = 0;
Packit c4476c
        for (j = 0; j < 8; j++)
Packit c4476c
            in |= ((u64)raw[i * 8 + j]) << (8 * j);
Packit c4476c
        out = in & 0xF0F0F0F00F0F0F0FuLL;
Packit c4476c
        out |= (in & 0x0F0F0F0F00000000uLL) >> 28;
Packit c4476c
        out |= (in & 0x00000000F0F0F0F0uLL) << 28;
Packit c4476c
        in = out & 0xCCCC3333CCCC3333uLL;
Packit c4476c
        in |= (out & 0x3333000033330000uLL) >> 14;
Packit c4476c
        in |= (out & 0x0000CCCC0000CCCCuLL) << 14;
Packit c4476c
        out = in & 0xAA55AA55AA55AA55uLL;
Packit c4476c
        out |= (in & 0x5500550055005500uLL) >> 7;
Packit c4476c
        out |= (in & 0x00AA00AA00AA00AAuLL) << 7;
Packit c4476c
        for (j = 0; j < 8; j++) {
Packit c4476c
            bits[j] |= (out & 0xFFuLL) << (8 * i);
Packit c4476c
            out = out >> 8;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
Packit c4476c
static void BitsToRaw(const u64 bits[8], u8 raw[64])
Packit c4476c
{
Packit c4476c
    int i, j;
Packit c4476c
    u64 in, out;
Packit c4476c
Packit c4476c
    for (i = 0; i < 8; i++) {
Packit c4476c
        in = 0;
Packit c4476c
        for (j = 0; j < 8; j++)
Packit c4476c
            in |= ((bits[j] >> (8 * i)) & 0xFFuLL) << (8 * j);
Packit c4476c
        out = in & 0xF0F0F0F00F0F0F0FuLL;
Packit c4476c
        out |= (in & 0x0F0F0F0F00000000uLL) >> 28;
Packit c4476c
        out |= (in & 0x00000000F0F0F0F0uLL) << 28;
Packit c4476c
        in = out & 0xCCCC3333CCCC3333uLL;
Packit c4476c
        in |= (out & 0x3333000033330000uLL) >> 14;
Packit c4476c
        in |= (out & 0x0000CCCC0000CCCCuLL) << 14;
Packit c4476c
        out = in & 0xAA55AA55AA55AA55uLL;
Packit c4476c
        out |= (in & 0x5500550055005500uLL) >> 7;
Packit c4476c
        out |= (in & 0x00AA00AA00AA00AAuLL) << 7;
Packit c4476c
        for (j = 0; j < 8; j++) {
Packit c4476c
            raw[i * 8 + j] = (u8)out;
Packit c4476c
            out = out >> 8;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
Packit c4476c
static void BitsXtime(u64 state[8])
Packit c4476c
{
Packit c4476c
    u64 b;
Packit c4476c
Packit c4476c
    b = state[7];
Packit c4476c
    state[7] = state[6];
Packit c4476c
    state[6] = state[5];
Packit c4476c
    state[5] = state[4];
Packit c4476c
    state[4] = state[3] ^ b;
Packit c4476c
    state[3] = state[2] ^ b;
Packit c4476c
    state[2] = state[1];
Packit c4476c
    state[1] = state[0] ^ b;
Packit c4476c
    state[0] = b;
Packit c4476c
}
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * This S-box implementation follows a circuit described in
Packit c4476c
 * Boyar and Peralta: "A new combinational logic minimization
Packit c4476c
 * technique with applications to cryptology."
Packit c4476c
 * https://eprint.iacr.org/2009/191.pdf
Packit c4476c
 *
Packit c4476c
 * The math is similar to above, in that it uses
Packit c4476c
 * a tower field of GF(2^2^2^2) but with a different
Packit c4476c
 * basis representation, that is better suited to
Packit c4476c
 * logic designs.
Packit c4476c
 */
Packit c4476c
static void BitsSub(u64 state[8])
Packit c4476c
{
Packit c4476c
    u64 x0, x1, x2, x3, x4, x5, x6, x7;
Packit c4476c
    u64 y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11;
Packit c4476c
    u64 y12, y13, y14, y15, y16, y17, y18, y19, y20, y21;
Packit c4476c
    u64 t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11;
Packit c4476c
    u64 t12, t13, t14, t15, t16, t17, t18, t19, t20, t21;
Packit c4476c
    u64 t22, t23, t24, t25, t26, t27, t28, t29, t30, t31;
Packit c4476c
    u64 t32, t33, t34, t35, t36, t37, t38, t39, t40, t41;
Packit c4476c
    u64 t42, t43, t44, t45, t46, t47, t48, t49, t50, t51;
Packit c4476c
    u64 t52, t53, t54, t55, t56, t57, t58, t59, t60, t61;
Packit c4476c
    u64 t62, t63, t64, t65, t66, t67;
Packit c4476c
    u64 z0, z1, z2, z3, z4, z5, z6, z7, z8, z9, z10, z11;
Packit c4476c
    u64 z12, z13, z14, z15, z16, z17;
Packit c4476c
    u64 s0, s1, s2, s3, s4, s5, s6, s7;
Packit c4476c
Packit c4476c
    x7 = state[0];
Packit c4476c
    x6 = state[1];
Packit c4476c
    x5 = state[2];
Packit c4476c
    x4 = state[3];
Packit c4476c
    x3 = state[4];
Packit c4476c
    x2 = state[5];
Packit c4476c
    x1 = state[6];
Packit c4476c
    x0 = state[7];
Packit c4476c
    y14 = x3 ^ x5;
Packit c4476c
    y13 = x0 ^ x6;
Packit c4476c
    y9 = x0 ^ x3;
Packit c4476c
    y8 = x0 ^ x5;
Packit c4476c
    t0 = x1 ^ x2;
Packit c4476c
    y1 = t0 ^ x7;
Packit c4476c
    y4 = y1 ^ x3;
Packit c4476c
    y12 = y13 ^ y14;
Packit c4476c
    y2 = y1 ^ x0;
Packit c4476c
    y5 = y1 ^ x6;
Packit c4476c
    y3 = y5 ^ y8;
Packit c4476c
    t1 = x4 ^ y12;
Packit c4476c
    y15 = t1 ^ x5;
Packit c4476c
    y20 = t1 ^ x1;
Packit c4476c
    y6 = y15 ^ x7;
Packit c4476c
    y10 = y15 ^ t0;
Packit c4476c
    y11 = y20 ^ y9;
Packit c4476c
    y7 = x7 ^ y11;
Packit c4476c
    y17 = y10 ^ y11;
Packit c4476c
    y19 = y10 ^ y8;
Packit c4476c
    y16 = t0 ^ y11;
Packit c4476c
    y21 = y13 ^ y16;
Packit c4476c
    y18 = x0 ^ y16;
Packit c4476c
    t2 = y12 & y15;
Packit c4476c
    t3 = y3 & y6;
Packit c4476c
    t4 = t3 ^ t2;
Packit c4476c
    t5 = y4 & x7;
Packit c4476c
    t6 = t5 ^ t2;
Packit c4476c
    t7 = y13 & y16;
Packit c4476c
    t8 = y5 & y1;
Packit c4476c
    t9 = t8 ^ t7;
Packit c4476c
    t10 = y2 & y7;
Packit c4476c
    t11 = t10 ^ t7;
Packit c4476c
    t12 = y9 & y11;
Packit c4476c
    t13 = y14 & y17;
Packit c4476c
    t14 = t13 ^ t12;
Packit c4476c
    t15 = y8 & y10;
Packit c4476c
    t16 = t15 ^ t12;
Packit c4476c
    t17 = t4 ^ t14;
Packit c4476c
    t18 = t6 ^ t16;
Packit c4476c
    t19 = t9 ^ t14;
Packit c4476c
    t20 = t11 ^ t16;
Packit c4476c
    t21 = t17 ^ y20;
Packit c4476c
    t22 = t18 ^ y19;
Packit c4476c
    t23 = t19 ^ y21;
Packit c4476c
    t24 = t20 ^ y18;
Packit c4476c
    t25 = t21 ^ t22;
Packit c4476c
    t26 = t21 & t23;
Packit c4476c
    t27 = t24 ^ t26;
Packit c4476c
    t28 = t25 & t27;
Packit c4476c
    t29 = t28 ^ t22;
Packit c4476c
    t30 = t23 ^ t24;
Packit c4476c
    t31 = t22 ^ t26;
Packit c4476c
    t32 = t31 & t30;
Packit c4476c
    t33 = t32 ^ t24;
Packit c4476c
    t34 = t23 ^ t33;
Packit c4476c
    t35 = t27 ^ t33;
Packit c4476c
    t36 = t24 & t35;
Packit c4476c
    t37 = t36 ^ t34;
Packit c4476c
    t38 = t27 ^ t36;
Packit c4476c
    t39 = t29 & t38;
Packit c4476c
    t40 = t25 ^ t39;
Packit c4476c
    t41 = t40 ^ t37;
Packit c4476c
    t42 = t29 ^ t33;
Packit c4476c
    t43 = t29 ^ t40;
Packit c4476c
    t44 = t33 ^ t37;
Packit c4476c
    t45 = t42 ^ t41;
Packit c4476c
    z0 = t44 & y15;
Packit c4476c
    z1 = t37 & y6;
Packit c4476c
    z2 = t33 & x7;
Packit c4476c
    z3 = t43 & y16;
Packit c4476c
    z4 = t40 & y1;
Packit c4476c
    z5 = t29 & y7;
Packit c4476c
    z6 = t42 & y11;
Packit c4476c
    z7 = t45 & y17;
Packit c4476c
    z8 = t41 & y10;
Packit c4476c
    z9 = t44 & y12;
Packit c4476c
    z10 = t37 & y3;
Packit c4476c
    z11 = t33 & y4;
Packit c4476c
    z12 = t43 & y13;
Packit c4476c
    z13 = t40 & y5;
Packit c4476c
    z14 = t29 & y2;
Packit c4476c
    z15 = t42 & y9;
Packit c4476c
    z16 = t45 & y14;
Packit c4476c
    z17 = t41 & y8;
Packit c4476c
    t46 = z15 ^ z16;
Packit c4476c
    t47 = z10 ^ z11;
Packit c4476c
    t48 = z5 ^ z13;
Packit c4476c
    t49 = z9 ^ z10;
Packit c4476c
    t50 = z2 ^ z12;
Packit c4476c
    t51 = z2 ^ z5;
Packit c4476c
    t52 = z7 ^ z8;
Packit c4476c
    t53 = z0 ^ z3;
Packit c4476c
    t54 = z6 ^ z7;
Packit c4476c
    t55 = z16 ^ z17;
Packit c4476c
    t56 = z12 ^ t48;
Packit c4476c
    t57 = t50 ^ t53;
Packit c4476c
    t58 = z4 ^ t46;
Packit c4476c
    t59 = z3 ^ t54;
Packit c4476c
    t60 = t46 ^ t57;
Packit c4476c
    t61 = z14 ^ t57;
Packit c4476c
    t62 = t52 ^ t58;
Packit c4476c
    t63 = t49 ^ t58;
Packit c4476c
    t64 = z4 ^ t59;
Packit c4476c
    t65 = t61 ^ t62;
Packit c4476c
    t66 = z1 ^ t63;
Packit c4476c
    s0 = t59 ^ t63;
Packit c4476c
    s6 = ~(t56 ^ t62);
Packit c4476c
    s7 = ~(t48 ^ t60);
Packit c4476c
    t67 = t64 ^ t65;
Packit c4476c
    s3 = t53 ^ t66;
Packit c4476c
    s4 = t51 ^ t66;
Packit c4476c
    s5 = t47 ^ t65;
Packit c4476c
    s1 = ~(t64 ^ s3);
Packit c4476c
    s2 = ~(t55 ^ t67);
Packit c4476c
    state[0] = s7;
Packit c4476c
    state[1] = s6;
Packit c4476c
    state[2] = s5;
Packit c4476c
    state[3] = s4;
Packit c4476c
    state[4] = s3;
Packit c4476c
    state[5] = s2;
Packit c4476c
    state[6] = s1;
Packit c4476c
    state[7] = s0;
Packit c4476c
}
Packit c4476c
Packit c4476c
static void BitsShiftRows(u64 state[8])
Packit c4476c
{
Packit c4476c
    u64 s, s0;
Packit c4476c
    int i;
Packit c4476c
Packit c4476c
    for (i = 0; i < 8; i++) {
Packit c4476c
        s = state[i];
Packit c4476c
        s0 = s & 0x1111111111111111uLL;
Packit c4476c
        s0 |= ((s & 0x2220222022202220uLL) >> 4) | ((s & 0x0002000200020002uLL) << 12);
Packit c4476c
        s0 |= ((s & 0x4400440044004400uLL) >> 8) | ((s & 0x0044004400440044uLL) << 8);
Packit c4476c
        s0 |= ((s & 0x8000800080008000uLL) >> 12) | ((s & 0x0888088808880888uLL) << 4);
Packit c4476c
        state[i] = s0;
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
Packit c4476c
static void BitsMixColumns(u64 state[8])
Packit c4476c
{
Packit c4476c
    u64 s1, s;
Packit c4476c
    u64 s0[8];
Packit c4476c
    int i;
Packit c4476c
Packit c4476c
    for (i = 0; i < 8; i++) {
Packit c4476c
        s1 = state[i];
Packit c4476c
        s = s1;
Packit c4476c
        s ^= ((s & 0xCCCCCCCCCCCCCCCCuLL) >> 2) | ((s & 0x3333333333333333uLL) << 2);
Packit c4476c
        s ^= ((s & 0xAAAAAAAAAAAAAAAAuLL) >> 1) | ((s & 0x5555555555555555uLL) << 1);
Packit c4476c
        s ^= s1;
Packit c4476c
        s0[i] = s;
Packit c4476c
    }
Packit c4476c
    BitsXtime(state);
Packit c4476c
    for (i = 0; i < 8; i++) {
Packit c4476c
        s1 = state[i];
Packit c4476c
        s = s0[i];
Packit c4476c
        s ^= s1;
Packit c4476c
        s ^= ((s1 & 0xEEEEEEEEEEEEEEEEuLL) >> 1) | ((s1 & 0x1111111111111111uLL) << 3);
Packit c4476c
        state[i] = s;
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
Packit c4476c
static void BitsAddRoundKey(u64 state[8], const u64 key[8])
Packit c4476c
{
Packit c4476c
    int i;
Packit c4476c
Packit c4476c
    for (i = 0; i < 8; i++)
Packit c4476c
        state[i] ^= key[i];
Packit c4476c
}
Packit c4476c
Packit c4476c
void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                       size_t blocks, const AES_KEY *key,
Packit c4476c
                       const unsigned char *ivec)
Packit c4476c
{
Packit c4476c
    struct {
Packit c4476c
        u8 cipher[64];
Packit c4476c
        u64 state[8];
Packit c4476c
        u64 rd_key[AES_MAXNR + 1][8];
Packit c4476c
    } *bs;
Packit c4476c
    u32 ctr32;
Packit c4476c
    int i;
Packit c4476c
Packit c4476c
    ctr32 = GETU32(ivec + 12);
Packit c4476c
    if (blocks >= 4
Packit c4476c
            && (bs = OPENSSL_malloc(sizeof(*bs)))) {
Packit c4476c
        for (i = 0; i < key->rounds + 1; i++) {
Packit c4476c
            memcpy(bs->cipher + 0, &key->rd_key[4 * i], 16);
Packit c4476c
            memcpy(bs->cipher + 16, bs->cipher, 16);
Packit c4476c
            memcpy(bs->cipher + 32, bs->cipher, 32);
Packit c4476c
            RawToBits(bs->cipher, bs->rd_key[i]);
Packit c4476c
        }
Packit c4476c
        while (blocks) {
Packit c4476c
            memcpy(bs->cipher, ivec, 12);
Packit c4476c
            PUTU32(bs->cipher + 12, ctr32);
Packit c4476c
            ctr32++;
Packit c4476c
            memcpy(bs->cipher + 16, ivec, 12);
Packit c4476c
            PUTU32(bs->cipher + 28, ctr32);
Packit c4476c
            ctr32++;
Packit c4476c
            memcpy(bs->cipher + 32, ivec, 12);
Packit c4476c
            PUTU32(bs->cipher + 44, ctr32);
Packit c4476c
            ctr32++;
Packit c4476c
            memcpy(bs->cipher + 48, ivec, 12);
Packit c4476c
            PUTU32(bs->cipher + 60, ctr32);
Packit c4476c
            ctr32++;
Packit c4476c
            RawToBits(bs->cipher, bs->state);
Packit c4476c
            BitsAddRoundKey(bs->state, bs->rd_key[0]);
Packit c4476c
            for (i = 1; i < key->rounds; i++) {
Packit c4476c
                BitsSub(bs->state);
Packit c4476c
                BitsShiftRows(bs->state);
Packit c4476c
                BitsMixColumns(bs->state);
Packit c4476c
                BitsAddRoundKey(bs->state, bs->rd_key[i]);
Packit c4476c
            }
Packit c4476c
            BitsSub(bs->state);
Packit c4476c
            BitsShiftRows(bs->state);
Packit c4476c
            BitsAddRoundKey(bs->state, bs->rd_key[key->rounds]);
Packit c4476c
            BitsToRaw(bs->state, bs->cipher);
Packit c4476c
            for (i = 0; i < 64 && blocks; i++) {
Packit c4476c
                out[i] = in[i] ^ bs->cipher[i];
Packit c4476c
                if ((i & 15) == 15)
Packit c4476c
                    blocks--;
Packit c4476c
            }
Packit c4476c
            in += i;
Packit c4476c
            out += i;
Packit c4476c
        }
Packit c4476c
        OPENSSL_clear_free(bs, sizeof(*bs));
Packit c4476c
    } else {
Packit c4476c
        unsigned char cipher[16];
Packit c4476c
Packit c4476c
        while (blocks) {
Packit c4476c
            memcpy(cipher, ivec, 12);
Packit c4476c
            PUTU32(cipher + 12, ctr32);
Packit c4476c
            AES_encrypt(cipher, cipher, key);
Packit c4476c
            for (i = 0; i < 16; i++)
Packit c4476c
                out[i] = in[i] ^ cipher[i];
Packit c4476c
            in += 16;
Packit c4476c
            out += 16;
Packit c4476c
            ctr32++;
Packit c4476c
            blocks--;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
}
Packit c4476c
# endif
Packit c4476c
#elif !defined(AES_ASM)
Packit c4476c
/*-
Packit c4476c
Te0[x] = S [x].[02, 01, 01, 03];
Packit c4476c
Te1[x] = S [x].[03, 02, 01, 01];
Packit c4476c
Te2[x] = S [x].[01, 03, 02, 01];
Packit c4476c
Te3[x] = S [x].[01, 01, 03, 02];
Packit c4476c
Packit c4476c
Td0[x] = Si[x].[0e, 09, 0d, 0b];
Packit c4476c
Td1[x] = Si[x].[0b, 0e, 09, 0d];
Packit c4476c
Td2[x] = Si[x].[0d, 0b, 0e, 09];
Packit c4476c
Td3[x] = Si[x].[09, 0d, 0b, 0e];
Packit c4476c
Td4[x] = Si[x].[01];
Packit c4476c
*/
Packit c4476c
Packit c4476c
static const u32 Te0[256] = {
Packit c4476c
    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
Packit c4476c
    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
Packit c4476c
    0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
Packit c4476c
    0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
Packit c4476c
    0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
Packit c4476c
    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
Packit c4476c
    0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
Packit c4476c
    0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
Packit c4476c
    0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
Packit c4476c
    0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
Packit c4476c
    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
Packit c4476c
    0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
Packit c4476c
    0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
Packit c4476c
    0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
Packit c4476c
    0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
Packit c4476c
    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
Packit c4476c
    0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
Packit c4476c
    0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
Packit c4476c
    0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
Packit c4476c
    0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
Packit c4476c
    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
Packit c4476c
    0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
Packit c4476c
    0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
Packit c4476c
    0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
Packit c4476c
    0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
Packit c4476c
    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
Packit c4476c
    0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
Packit c4476c
    0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
Packit c4476c
    0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
Packit c4476c
    0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
Packit c4476c
    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
Packit c4476c
    0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
Packit c4476c
    0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
Packit c4476c
    0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
Packit c4476c
    0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
Packit c4476c
    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
Packit c4476c
    0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
Packit c4476c
    0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
Packit c4476c
    0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
Packit c4476c
    0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
Packit c4476c
    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
Packit c4476c
    0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
Packit c4476c
    0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
Packit c4476c
    0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
Packit c4476c
    0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
Packit c4476c
    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
Packit c4476c
    0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
Packit c4476c
    0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
Packit c4476c
    0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
Packit c4476c
    0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
Packit c4476c
    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
Packit c4476c
    0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
Packit c4476c
    0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
Packit c4476c
    0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
Packit c4476c
    0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
Packit c4476c
    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
Packit c4476c
    0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
Packit c4476c
    0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
Packit c4476c
    0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
Packit c4476c
    0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
Packit c4476c
    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
Packit c4476c
    0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
Packit c4476c
    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
Packit c4476c
    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
Packit c4476c
};
Packit c4476c
static const u32 Te1[256] = {
Packit c4476c
    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
Packit c4476c
    0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
Packit c4476c
    0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
Packit c4476c
    0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
Packit c4476c
    0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
Packit c4476c
    0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
Packit c4476c
    0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
Packit c4476c
    0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
Packit c4476c
    0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
Packit c4476c
    0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
Packit c4476c
    0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
Packit c4476c
    0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
Packit c4476c
    0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
Packit c4476c
    0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
Packit c4476c
    0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
Packit c4476c
    0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
Packit c4476c
    0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
Packit c4476c
    0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
Packit c4476c
    0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
Packit c4476c
    0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
Packit c4476c
    0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
Packit c4476c
    0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
Packit c4476c
    0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
Packit c4476c
    0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
Packit c4476c
    0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
Packit c4476c
    0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
Packit c4476c
    0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
Packit c4476c
    0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
Packit c4476c
    0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
Packit c4476c
    0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
Packit c4476c
    0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
Packit c4476c
    0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
Packit c4476c
    0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
Packit c4476c
    0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
Packit c4476c
    0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
Packit c4476c
    0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
Packit c4476c
    0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
Packit c4476c
    0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
Packit c4476c
    0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
Packit c4476c
    0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
Packit c4476c
    0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
Packit c4476c
    0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
Packit c4476c
    0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
Packit c4476c
    0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
Packit c4476c
    0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
Packit c4476c
    0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
Packit c4476c
    0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
Packit c4476c
    0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
Packit c4476c
    0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
Packit c4476c
    0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
Packit c4476c
    0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
Packit c4476c
    0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
Packit c4476c
    0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
Packit c4476c
    0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
Packit c4476c
    0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
Packit c4476c
    0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
Packit c4476c
    0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
Packit c4476c
    0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
Packit c4476c
    0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
Packit c4476c
    0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
Packit c4476c
    0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
Packit c4476c
    0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
Packit c4476c
    0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
Packit c4476c
    0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
Packit c4476c
};
Packit c4476c
static const u32 Te2[256] = {
Packit c4476c
    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
Packit c4476c
    0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
Packit c4476c
    0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
Packit c4476c
    0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
Packit c4476c
    0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
Packit c4476c
    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
Packit c4476c
    0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
Packit c4476c
    0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
Packit c4476c
    0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
Packit c4476c
    0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
Packit c4476c
    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
Packit c4476c
    0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
Packit c4476c
    0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
Packit c4476c
    0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
Packit c4476c
    0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
Packit c4476c
    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
Packit c4476c
    0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
Packit c4476c
    0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
Packit c4476c
    0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
Packit c4476c
    0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
Packit c4476c
    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
Packit c4476c
    0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
Packit c4476c
    0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
Packit c4476c
    0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
Packit c4476c
    0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
Packit c4476c
    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
Packit c4476c
    0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
Packit c4476c
    0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
Packit c4476c
    0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
Packit c4476c
    0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
Packit c4476c
    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
Packit c4476c
    0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
Packit c4476c
    0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
Packit c4476c
    0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
Packit c4476c
    0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
Packit c4476c
    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
Packit c4476c
    0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
Packit c4476c
    0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
Packit c4476c
    0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
Packit c4476c
    0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
Packit c4476c
    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
Packit c4476c
    0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
Packit c4476c
    0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
Packit c4476c
    0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
Packit c4476c
    0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
Packit c4476c
    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
Packit c4476c
    0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
Packit c4476c
    0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
Packit c4476c
    0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
Packit c4476c
    0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
Packit c4476c
    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
Packit c4476c
    0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
Packit c4476c
    0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
Packit c4476c
    0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
Packit c4476c
    0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
Packit c4476c
    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
Packit c4476c
    0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
Packit c4476c
    0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
Packit c4476c
    0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
Packit c4476c
    0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
Packit c4476c
    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
Packit c4476c
    0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
Packit c4476c
    0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
Packit c4476c
    0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
Packit c4476c
};
Packit c4476c
static const u32 Te3[256] = {
Packit c4476c
    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
Packit c4476c
    0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
Packit c4476c
    0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
Packit c4476c
    0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
Packit c4476c
    0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
Packit c4476c
    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
Packit c4476c
    0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
Packit c4476c
    0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
Packit c4476c
    0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
Packit c4476c
    0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
Packit c4476c
    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
Packit c4476c
    0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
Packit c4476c
    0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
Packit c4476c
    0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
Packit c4476c
    0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
Packit c4476c
    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
Packit c4476c
    0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
Packit c4476c
    0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
Packit c4476c
    0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
Packit c4476c
    0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
Packit c4476c
    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
Packit c4476c
    0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
Packit c4476c
    0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
Packit c4476c
    0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
Packit c4476c
    0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
Packit c4476c
    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
Packit c4476c
    0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
Packit c4476c
    0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
Packit c4476c
    0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
Packit c4476c
    0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
Packit c4476c
    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
Packit c4476c
    0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
Packit c4476c
    0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
Packit c4476c
    0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
Packit c4476c
    0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
Packit c4476c
    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
Packit c4476c
    0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
Packit c4476c
    0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
Packit c4476c
    0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
Packit c4476c
    0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
Packit c4476c
    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
Packit c4476c
    0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
Packit c4476c
    0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
Packit c4476c
    0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
Packit c4476c
    0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
Packit c4476c
    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
Packit c4476c
    0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
Packit c4476c
    0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
Packit c4476c
    0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
Packit c4476c
    0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
Packit c4476c
    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
Packit c4476c
    0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
Packit c4476c
    0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
Packit c4476c
    0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
Packit c4476c
    0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
Packit c4476c
    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
Packit c4476c
    0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
Packit c4476c
    0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
Packit c4476c
    0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
Packit c4476c
    0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
Packit c4476c
    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
Packit c4476c
    0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
Packit c4476c
    0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
Packit c4476c
    0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
Packit c4476c
};
Packit c4476c
Packit c4476c
static const u32 Td0[256] = {
Packit c4476c
    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
Packit c4476c
    0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
Packit c4476c
    0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
Packit c4476c
    0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
Packit c4476c
    0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
Packit c4476c
    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
Packit c4476c
    0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
Packit c4476c
    0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
Packit c4476c
    0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
Packit c4476c
    0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
Packit c4476c
    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
Packit c4476c
    0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
Packit c4476c
    0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
Packit c4476c
    0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
Packit c4476c
    0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
Packit c4476c
    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
Packit c4476c
    0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
Packit c4476c
    0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
Packit c4476c
    0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
Packit c4476c
    0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
Packit c4476c
    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
Packit c4476c
    0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
Packit c4476c
    0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
Packit c4476c
    0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
Packit c4476c
    0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
Packit c4476c
    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
Packit c4476c
    0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
Packit c4476c
    0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
Packit c4476c
    0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
Packit c4476c
    0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
Packit c4476c
    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
Packit c4476c
    0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
Packit c4476c
    0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
Packit c4476c
    0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
Packit c4476c
    0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
Packit c4476c
    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
Packit c4476c
    0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
Packit c4476c
    0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
Packit c4476c
    0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
Packit c4476c
    0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
Packit c4476c
    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
Packit c4476c
    0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
Packit c4476c
    0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
Packit c4476c
    0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
Packit c4476c
    0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
Packit c4476c
    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
Packit c4476c
    0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
Packit c4476c
    0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
Packit c4476c
    0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
Packit c4476c
    0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
Packit c4476c
    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
Packit c4476c
    0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
Packit c4476c
    0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
Packit c4476c
    0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
Packit c4476c
    0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
Packit c4476c
    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
Packit c4476c
    0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
Packit c4476c
    0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
Packit c4476c
    0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
Packit c4476c
    0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
Packit c4476c
    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
Packit c4476c
    0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
Packit c4476c
    0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
Packit c4476c
    0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
Packit c4476c
};
Packit c4476c
static const u32 Td1[256] = {
Packit c4476c
    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
Packit c4476c
    0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
Packit c4476c
    0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
Packit c4476c
    0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
Packit c4476c
    0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
Packit c4476c
    0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
Packit c4476c
    0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
Packit c4476c
    0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
Packit c4476c
    0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
Packit c4476c
    0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
Packit c4476c
    0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
Packit c4476c
    0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
Packit c4476c
    0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
Packit c4476c
    0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
Packit c4476c
    0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
Packit c4476c
    0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
Packit c4476c
    0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
Packit c4476c
    0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
Packit c4476c
    0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
Packit c4476c
    0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
Packit c4476c
    0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
Packit c4476c
    0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
Packit c4476c
    0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
Packit c4476c
    0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
Packit c4476c
    0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
Packit c4476c
    0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
Packit c4476c
    0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
Packit c4476c
    0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
Packit c4476c
    0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
Packit c4476c
    0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
Packit c4476c
    0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
Packit c4476c
    0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
Packit c4476c
    0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
Packit c4476c
    0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
Packit c4476c
    0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
Packit c4476c
    0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
Packit c4476c
    0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
Packit c4476c
    0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
Packit c4476c
    0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
Packit c4476c
    0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
Packit c4476c
    0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
Packit c4476c
    0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
Packit c4476c
    0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
Packit c4476c
    0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
Packit c4476c
    0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
Packit c4476c
    0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
Packit c4476c
    0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
Packit c4476c
    0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
Packit c4476c
    0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
Packit c4476c
    0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
Packit c4476c
    0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
Packit c4476c
    0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
Packit c4476c
    0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
Packit c4476c
    0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
Packit c4476c
    0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
Packit c4476c
    0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
Packit c4476c
    0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
Packit c4476c
    0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
Packit c4476c
    0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
Packit c4476c
    0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
Packit c4476c
    0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
Packit c4476c
    0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
Packit c4476c
    0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
Packit c4476c
    0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
Packit c4476c
};
Packit c4476c
static const u32 Td2[256] = {
Packit c4476c
    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
Packit c4476c
    0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
Packit c4476c
    0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
Packit c4476c
    0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
Packit c4476c
    0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
Packit c4476c
    0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
Packit c4476c
    0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
Packit c4476c
    0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
Packit c4476c
    0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
Packit c4476c
    0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
Packit c4476c
    0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
Packit c4476c
    0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
Packit c4476c
    0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
Packit c4476c
    0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
Packit c4476c
    0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
Packit c4476c
    0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
Packit c4476c
    0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
Packit c4476c
    0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
Packit c4476c
    0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
Packit c4476c
    0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
Packit c4476c
    0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
Packit c4476c
    0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
Packit c4476c
    0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
Packit c4476c
    0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
Packit c4476c
    0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
Packit c4476c
    0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
Packit c4476c
    0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
Packit c4476c
    0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
Packit c4476c
    0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
Packit c4476c
    0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
Packit c4476c
    0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
Packit c4476c
    0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
Packit c4476c
    0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
Packit c4476c
    0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
Packit c4476c
    0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
Packit c4476c
    0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
Packit c4476c
    0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
Packit c4476c
    0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
Packit c4476c
    0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
Packit c4476c
    0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
Packit c4476c
    0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
Packit c4476c
    0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
Packit c4476c
    0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
Packit c4476c
    0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
Packit c4476c
    0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
Packit c4476c
    0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
Packit c4476c
    0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
Packit c4476c
    0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
Packit c4476c
    0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
Packit c4476c
    0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
Packit c4476c
    0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
Packit c4476c
    0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
Packit c4476c
    0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
Packit c4476c
    0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
Packit c4476c
    0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
Packit c4476c
    0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
Packit c4476c
    0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
Packit c4476c
    0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
Packit c4476c
    0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
Packit c4476c
    0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
Packit c4476c
    0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
Packit c4476c
    0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
Packit c4476c
    0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
Packit c4476c
    0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
Packit c4476c
};
Packit c4476c
static const u32 Td3[256] = {
Packit c4476c
    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
Packit c4476c
    0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
Packit c4476c
    0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
Packit c4476c
    0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
Packit c4476c
    0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
Packit c4476c
    0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
Packit c4476c
    0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
Packit c4476c
    0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
Packit c4476c
    0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
Packit c4476c
    0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
Packit c4476c
    0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
Packit c4476c
    0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
Packit c4476c
    0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
Packit c4476c
    0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
Packit c4476c
    0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
Packit c4476c
    0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
Packit c4476c
    0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
Packit c4476c
    0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
Packit c4476c
    0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
Packit c4476c
    0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
Packit c4476c
    0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
Packit c4476c
    0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
Packit c4476c
    0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
Packit c4476c
    0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
Packit c4476c
    0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
Packit c4476c
    0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
Packit c4476c
    0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
Packit c4476c
    0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
Packit c4476c
    0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
Packit c4476c
    0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
Packit c4476c
    0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
Packit c4476c
    0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
Packit c4476c
    0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
Packit c4476c
    0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
Packit c4476c
    0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
Packit c4476c
    0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
Packit c4476c
    0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
Packit c4476c
    0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
Packit c4476c
    0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
Packit c4476c
    0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
Packit c4476c
    0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
Packit c4476c
    0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
Packit c4476c
    0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
Packit c4476c
    0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
Packit c4476c
    0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
Packit c4476c
    0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
Packit c4476c
    0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
Packit c4476c
    0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
Packit c4476c
    0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
Packit c4476c
    0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
Packit c4476c
    0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
Packit c4476c
    0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
Packit c4476c
    0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
Packit c4476c
    0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
Packit c4476c
    0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
Packit c4476c
    0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
Packit c4476c
    0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
Packit c4476c
    0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
Packit c4476c
    0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
Packit c4476c
    0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
Packit c4476c
    0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
Packit c4476c
    0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
Packit c4476c
    0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
Packit c4476c
    0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
Packit c4476c
};
Packit c4476c
static const u8 Td4[256] = {
Packit c4476c
    0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,
Packit c4476c
    0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,
Packit c4476c
    0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,
Packit c4476c
    0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,
Packit c4476c
    0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,
Packit c4476c
    0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,
Packit c4476c
    0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,
Packit c4476c
    0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,
Packit c4476c
    0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,
Packit c4476c
    0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,
Packit c4476c
    0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
Packit c4476c
    0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,
Packit c4476c
    0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,
Packit c4476c
    0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,
Packit c4476c
    0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,
Packit c4476c
    0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,
Packit c4476c
    0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,
Packit c4476c
    0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,
Packit c4476c
    0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,
Packit c4476c
    0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,
Packit c4476c
    0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,
Packit c4476c
    0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
Packit c4476c
    0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,
Packit c4476c
    0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,
Packit c4476c
    0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,
Packit c4476c
    0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,
Packit c4476c
    0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,
Packit c4476c
    0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,
Packit c4476c
    0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,
Packit c4476c
    0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,
Packit c4476c
    0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,
Packit c4476c
    0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,
Packit c4476c
};
Packit c4476c
static const u32 rcon[] = {
Packit c4476c
    0x01000000, 0x02000000, 0x04000000, 0x08000000,
Packit c4476c
    0x10000000, 0x20000000, 0x40000000, 0x80000000,
Packit c4476c
    0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
Packit c4476c
};
Packit c4476c
Packit c4476c
/**
Packit c4476c
 * Expand the cipher key into the encryption key schedule.
Packit c4476c
 */
Packit c4476c
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
Packit c4476c
                        AES_KEY *key)
Packit c4476c
{
Packit c4476c
Packit c4476c
    u32 *rk;
Packit c4476c
    int i = 0;
Packit c4476c
    u32 temp;
Packit c4476c
Packit c4476c
    if (!userKey || !key)
Packit c4476c
        return -1;
Packit c4476c
    if (bits != 128 && bits != 192 && bits != 256)
Packit c4476c
        return -2;
Packit c4476c
Packit c4476c
    rk = key->rd_key;
Packit c4476c
Packit c4476c
    if (bits == 128)
Packit c4476c
        key->rounds = 10;
Packit c4476c
    else if (bits == 192)
Packit c4476c
        key->rounds = 12;
Packit c4476c
    else
Packit c4476c
        key->rounds = 14;
Packit c4476c
Packit c4476c
    rk[0] = GETU32(userKey     );
Packit c4476c
    rk[1] = GETU32(userKey +  4);
Packit c4476c
    rk[2] = GETU32(userKey +  8);
Packit c4476c
    rk[3] = GETU32(userKey + 12);
Packit c4476c
    if (bits == 128) {
Packit c4476c
        while (1) {
Packit c4476c
            temp  = rk[3];
Packit c4476c
            rk[4] = rk[0] ^
Packit c4476c
                (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
Packit c4476c
                (Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^
Packit c4476c
                (Te0[(temp      ) & 0xff] & 0x0000ff00) ^
Packit c4476c
                (Te1[(temp >> 24)       ] & 0x000000ff) ^
Packit c4476c
                rcon[i];
Packit c4476c
            rk[5] = rk[1] ^ rk[4];
Packit c4476c
            rk[6] = rk[2] ^ rk[5];
Packit c4476c
            rk[7] = rk[3] ^ rk[6];
Packit c4476c
            if (++i == 10) {
Packit c4476c
                return 0;
Packit c4476c
            }
Packit c4476c
            rk += 4;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    rk[4] = GETU32(userKey + 16);
Packit c4476c
    rk[5] = GETU32(userKey + 20);
Packit c4476c
    if (bits == 192) {
Packit c4476c
        while (1) {
Packit c4476c
            temp = rk[ 5];
Packit c4476c
            rk[ 6] = rk[ 0] ^
Packit c4476c
                (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
Packit c4476c
                (Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^
Packit c4476c
                (Te0[(temp      ) & 0xff] & 0x0000ff00) ^
Packit c4476c
                (Te1[(temp >> 24)       ] & 0x000000ff) ^
Packit c4476c
                rcon[i];
Packit c4476c
            rk[ 7] = rk[ 1] ^ rk[ 6];
Packit c4476c
            rk[ 8] = rk[ 2] ^ rk[ 7];
Packit c4476c
            rk[ 9] = rk[ 3] ^ rk[ 8];
Packit c4476c
            if (++i == 8) {
Packit c4476c
                return 0;
Packit c4476c
            }
Packit c4476c
            rk[10] = rk[ 4] ^ rk[ 9];
Packit c4476c
            rk[11] = rk[ 5] ^ rk[10];
Packit c4476c
            rk += 6;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    rk[6] = GETU32(userKey + 24);
Packit c4476c
    rk[7] = GETU32(userKey + 28);
Packit c4476c
    if (bits == 256) {
Packit c4476c
        while (1) {
Packit c4476c
            temp = rk[ 7];
Packit c4476c
            rk[ 8] = rk[ 0] ^
Packit c4476c
                (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
Packit c4476c
                (Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^
Packit c4476c
                (Te0[(temp      ) & 0xff] & 0x0000ff00) ^
Packit c4476c
                (Te1[(temp >> 24)       ] & 0x000000ff) ^
Packit c4476c
                rcon[i];
Packit c4476c
            rk[ 9] = rk[ 1] ^ rk[ 8];
Packit c4476c
            rk[10] = rk[ 2] ^ rk[ 9];
Packit c4476c
            rk[11] = rk[ 3] ^ rk[10];
Packit c4476c
            if (++i == 7) {
Packit c4476c
                return 0;
Packit c4476c
            }
Packit c4476c
            temp = rk[11];
Packit c4476c
            rk[12] = rk[ 4] ^
Packit c4476c
                (Te2[(temp >> 24)       ] & 0xff000000) ^
Packit c4476c
                (Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^
Packit c4476c
                (Te0[(temp >>  8) & 0xff] & 0x0000ff00) ^
Packit c4476c
                (Te1[(temp      ) & 0xff] & 0x000000ff);
Packit c4476c
            rk[13] = rk[ 5] ^ rk[12];
Packit c4476c
            rk[14] = rk[ 6] ^ rk[13];
Packit c4476c
            rk[15] = rk[ 7] ^ rk[14];
Packit c4476c
Packit c4476c
            rk += 8;
Packit c4476c
            }
Packit c4476c
    }
Packit c4476c
    return 0;
Packit c4476c
}
Packit c4476c
Packit c4476c
/**
Packit c4476c
 * Expand the cipher key into the decryption key schedule.
Packit c4476c
 */
Packit c4476c
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
Packit c4476c
                        AES_KEY *key)
Packit c4476c
{
Packit c4476c
Packit c4476c
    u32 *rk;
Packit c4476c
    int i, j, status;
Packit c4476c
    u32 temp;
Packit c4476c
Packit c4476c
    /* first, start with an encryption schedule */
Packit c4476c
    status = AES_set_encrypt_key(userKey, bits, key);
Packit c4476c
    if (status < 0)
Packit c4476c
        return status;
Packit c4476c
Packit c4476c
    rk = key->rd_key;
Packit c4476c
Packit c4476c
    /* invert the order of the round keys: */
Packit c4476c
    for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {
Packit c4476c
        temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
Packit c4476c
        temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
Packit c4476c
        temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
Packit c4476c
        temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
Packit c4476c
    }
Packit c4476c
    /* apply the inverse MixColumn transform to all round keys but the first and the last: */
Packit c4476c
    for (i = 1; i < (key->rounds); i++) {
Packit c4476c
        rk += 4;
Packit c4476c
        rk[0] =
Packit c4476c
            Td0[Te1[(rk[0] >> 24)       ] & 0xff] ^
Packit c4476c
            Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^
Packit c4476c
            Td2[Te1[(rk[0] >>  8) & 0xff] & 0xff] ^
Packit c4476c
            Td3[Te1[(rk[0]      ) & 0xff] & 0xff];
Packit c4476c
        rk[1] =
Packit c4476c
            Td0[Te1[(rk[1] >> 24)       ] & 0xff] ^
Packit c4476c
            Td1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^
Packit c4476c
            Td2[Te1[(rk[1] >>  8) & 0xff] & 0xff] ^
Packit c4476c
            Td3[Te1[(rk[1]      ) & 0xff] & 0xff];
Packit c4476c
        rk[2] =
Packit c4476c
            Td0[Te1[(rk[2] >> 24)       ] & 0xff] ^
Packit c4476c
            Td1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^
Packit c4476c
            Td2[Te1[(rk[2] >>  8) & 0xff] & 0xff] ^
Packit c4476c
            Td3[Te1[(rk[2]      ) & 0xff] & 0xff];
Packit c4476c
        rk[3] =
Packit c4476c
            Td0[Te1[(rk[3] >> 24)       ] & 0xff] ^
Packit c4476c
            Td1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^
Packit c4476c
            Td2[Te1[(rk[3] >>  8) & 0xff] & 0xff] ^
Packit c4476c
            Td3[Te1[(rk[3]      ) & 0xff] & 0xff];
Packit c4476c
    }
Packit c4476c
    return 0;
Packit c4476c
}
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * Encrypt a single block
Packit c4476c
 * in and out can overlap
Packit c4476c
 */
Packit c4476c
void AES_encrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                 const AES_KEY *key) {
Packit c4476c
Packit c4476c
    const u32 *rk;
Packit c4476c
    u32 s0, s1, s2, s3, t0, t1, t2, t3;
Packit c4476c
#ifndef FULL_UNROLL
Packit c4476c
    int r;
Packit c4476c
#endif /* ?FULL_UNROLL */
Packit c4476c
Packit c4476c
    assert(in && out && key);
Packit c4476c
    rk = key->rd_key;
Packit c4476c
Packit c4476c
    /*
Packit c4476c
     * map byte array block to cipher state
Packit c4476c
     * and add initial round key:
Packit c4476c
     */
Packit c4476c
    s0 = GETU32(in     ) ^ rk[0];
Packit c4476c
    s1 = GETU32(in +  4) ^ rk[1];
Packit c4476c
    s2 = GETU32(in +  8) ^ rk[2];
Packit c4476c
    s3 = GETU32(in + 12) ^ rk[3];
Packit c4476c
#ifdef FULL_UNROLL
Packit c4476c
    /* round 1: */
Packit c4476c
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
Packit c4476c
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
Packit c4476c
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
Packit c4476c
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
Packit c4476c
    /* round 2: */
Packit c4476c
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
Packit c4476c
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
Packit c4476c
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
Packit c4476c
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
Packit c4476c
    /* round 3: */
Packit c4476c
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
Packit c4476c
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
Packit c4476c
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
Packit c4476c
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
Packit c4476c
    /* round 4: */
Packit c4476c
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
Packit c4476c
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
Packit c4476c
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
Packit c4476c
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
Packit c4476c
    /* round 5: */
Packit c4476c
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
Packit c4476c
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
Packit c4476c
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
Packit c4476c
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
Packit c4476c
    /* round 6: */
Packit c4476c
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
Packit c4476c
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
Packit c4476c
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
Packit c4476c
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
Packit c4476c
    /* round 7: */
Packit c4476c
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
Packit c4476c
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
Packit c4476c
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
Packit c4476c
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
Packit c4476c
    /* round 8: */
Packit c4476c
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
Packit c4476c
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
Packit c4476c
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
Packit c4476c
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
Packit c4476c
    /* round 9: */
Packit c4476c
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
Packit c4476c
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
Packit c4476c
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
Packit c4476c
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
Packit c4476c
    if (key->rounds > 10) {
Packit c4476c
        /* round 10: */
Packit c4476c
        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
Packit c4476c
        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
Packit c4476c
        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
Packit c4476c
        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
Packit c4476c
        /* round 11: */
Packit c4476c
        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
Packit c4476c
        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
Packit c4476c
        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
Packit c4476c
        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
Packit c4476c
        if (key->rounds > 12) {
Packit c4476c
            /* round 12: */
Packit c4476c
            s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
Packit c4476c
            s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
Packit c4476c
            s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
Packit c4476c
            s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
Packit c4476c
            /* round 13: */
Packit c4476c
            t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
Packit c4476c
            t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
Packit c4476c
            t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
Packit c4476c
            t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    rk += key->rounds << 2;
Packit c4476c
#else  /* !FULL_UNROLL */
Packit c4476c
    /*
Packit c4476c
     * Nr - 1 full rounds:
Packit c4476c
     */
Packit c4476c
    r = key->rounds >> 1;
Packit c4476c
    for (;;) {
Packit c4476c
        t0 =
Packit c4476c
            Te0[(s0 >> 24)       ] ^
Packit c4476c
            Te1[(s1 >> 16) & 0xff] ^
Packit c4476c
            Te2[(s2 >>  8) & 0xff] ^
Packit c4476c
            Te3[(s3      ) & 0xff] ^
Packit c4476c
            rk[4];
Packit c4476c
        t1 =
Packit c4476c
            Te0[(s1 >> 24)       ] ^
Packit c4476c
            Te1[(s2 >> 16) & 0xff] ^
Packit c4476c
            Te2[(s3 >>  8) & 0xff] ^
Packit c4476c
            Te3[(s0      ) & 0xff] ^
Packit c4476c
            rk[5];
Packit c4476c
        t2 =
Packit c4476c
            Te0[(s2 >> 24)       ] ^
Packit c4476c
            Te1[(s3 >> 16) & 0xff] ^
Packit c4476c
            Te2[(s0 >>  8) & 0xff] ^
Packit c4476c
            Te3[(s1      ) & 0xff] ^
Packit c4476c
            rk[6];
Packit c4476c
        t3 =
Packit c4476c
            Te0[(s3 >> 24)       ] ^
Packit c4476c
            Te1[(s0 >> 16) & 0xff] ^
Packit c4476c
            Te2[(s1 >>  8) & 0xff] ^
Packit c4476c
            Te3[(s2      ) & 0xff] ^
Packit c4476c
            rk[7];
Packit c4476c
Packit c4476c
        rk += 8;
Packit c4476c
        if (--r == 0) {
Packit c4476c
            break;
Packit c4476c
        }
Packit c4476c
Packit c4476c
        s0 =
Packit c4476c
            Te0[(t0 >> 24)       ] ^
Packit c4476c
            Te1[(t1 >> 16) & 0xff] ^
Packit c4476c
            Te2[(t2 >>  8) & 0xff] ^
Packit c4476c
            Te3[(t3      ) & 0xff] ^
Packit c4476c
            rk[0];
Packit c4476c
        s1 =
Packit c4476c
            Te0[(t1 >> 24)       ] ^
Packit c4476c
            Te1[(t2 >> 16) & 0xff] ^
Packit c4476c
            Te2[(t3 >>  8) & 0xff] ^
Packit c4476c
            Te3[(t0      ) & 0xff] ^
Packit c4476c
            rk[1];
Packit c4476c
        s2 =
Packit c4476c
            Te0[(t2 >> 24)       ] ^
Packit c4476c
            Te1[(t3 >> 16) & 0xff] ^
Packit c4476c
            Te2[(t0 >>  8) & 0xff] ^
Packit c4476c
            Te3[(t1      ) & 0xff] ^
Packit c4476c
            rk[2];
Packit c4476c
        s3 =
Packit c4476c
            Te0[(t3 >> 24)       ] ^
Packit c4476c
            Te1[(t0 >> 16) & 0xff] ^
Packit c4476c
            Te2[(t1 >>  8) & 0xff] ^
Packit c4476c
            Te3[(t2      ) & 0xff] ^
Packit c4476c
            rk[3];
Packit c4476c
    }
Packit c4476c
#endif /* ?FULL_UNROLL */
Packit c4476c
    /*
Packit c4476c
     * apply last round and
Packit c4476c
     * map cipher state to byte array block:
Packit c4476c
     */
Packit c4476c
    s0 =
Packit c4476c
        (Te2[(t0 >> 24)       ] & 0xff000000) ^
Packit c4476c
        (Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^
Packit c4476c
        (Te0[(t2 >>  8) & 0xff] & 0x0000ff00) ^
Packit c4476c
        (Te1[(t3      ) & 0xff] & 0x000000ff) ^
Packit c4476c
        rk[0];
Packit c4476c
    PUTU32(out     , s0);
Packit c4476c
    s1 =
Packit c4476c
        (Te2[(t1 >> 24)       ] & 0xff000000) ^
Packit c4476c
        (Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^
Packit c4476c
        (Te0[(t3 >>  8) & 0xff] & 0x0000ff00) ^
Packit c4476c
        (Te1[(t0      ) & 0xff] & 0x000000ff) ^
Packit c4476c
        rk[1];
Packit c4476c
    PUTU32(out +  4, s1);
Packit c4476c
    s2 =
Packit c4476c
        (Te2[(t2 >> 24)       ] & 0xff000000) ^
Packit c4476c
        (Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^
Packit c4476c
        (Te0[(t0 >>  8) & 0xff] & 0x0000ff00) ^
Packit c4476c
        (Te1[(t1      ) & 0xff] & 0x000000ff) ^
Packit c4476c
        rk[2];
Packit c4476c
    PUTU32(out +  8, s2);
Packit c4476c
    s3 =
Packit c4476c
        (Te2[(t3 >> 24)       ] & 0xff000000) ^
Packit c4476c
        (Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^
Packit c4476c
        (Te0[(t1 >>  8) & 0xff] & 0x0000ff00) ^
Packit c4476c
        (Te1[(t2      ) & 0xff] & 0x000000ff) ^
Packit c4476c
        rk[3];
Packit c4476c
    PUTU32(out + 12, s3);
Packit c4476c
}
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * Decrypt a single block
Packit c4476c
 * in and out can overlap
Packit c4476c
 */
Packit c4476c
void AES_decrypt(const unsigned char *in, unsigned char *out,
Packit c4476c
                 const AES_KEY *key)
Packit c4476c
{
Packit c4476c
Packit c4476c
    const u32 *rk;
Packit c4476c
    u32 s0, s1, s2, s3, t0, t1, t2, t3;
Packit c4476c
#ifndef FULL_UNROLL
Packit c4476c
    int r;
Packit c4476c
#endif /* ?FULL_UNROLL */
Packit c4476c
Packit c4476c
    assert(in && out && key);
Packit c4476c
    rk = key->rd_key;
Packit c4476c
Packit c4476c
    /*
Packit c4476c
     * map byte array block to cipher state
Packit c4476c
     * and add initial round key:
Packit c4476c
     */
Packit c4476c
    s0 = GETU32(in     ) ^ rk[0];
Packit c4476c
    s1 = GETU32(in +  4) ^ rk[1];
Packit c4476c
    s2 = GETU32(in +  8) ^ rk[2];
Packit c4476c
    s3 = GETU32(in + 12) ^ rk[3];
Packit c4476c
#ifdef FULL_UNROLL
Packit c4476c
    /* round 1: */
Packit c4476c
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
Packit c4476c
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
Packit c4476c
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
Packit c4476c
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
Packit c4476c
    /* round 2: */
Packit c4476c
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
Packit c4476c
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
Packit c4476c
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
Packit c4476c
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
Packit c4476c
    /* round 3: */
Packit c4476c
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
Packit c4476c
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
Packit c4476c
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
Packit c4476c
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
Packit c4476c
    /* round 4: */
Packit c4476c
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
Packit c4476c
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
Packit c4476c
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
Packit c4476c
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
Packit c4476c
    /* round 5: */
Packit c4476c
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
Packit c4476c
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
Packit c4476c
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
Packit c4476c
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
Packit c4476c
    /* round 6: */
Packit c4476c
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
Packit c4476c
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
Packit c4476c
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
Packit c4476c
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
Packit c4476c
    /* round 7: */
Packit c4476c
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
Packit c4476c
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
Packit c4476c
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
Packit c4476c
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
Packit c4476c
    /* round 8: */
Packit c4476c
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
Packit c4476c
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
Packit c4476c
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
Packit c4476c
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
Packit c4476c
    /* round 9: */
Packit c4476c
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
Packit c4476c
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
Packit c4476c
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
Packit c4476c
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
Packit c4476c
    if (key->rounds > 10) {
Packit c4476c
        /* round 10: */
Packit c4476c
        s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
Packit c4476c
        s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
Packit c4476c
        s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
Packit c4476c
        s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
Packit c4476c
        /* round 11: */
Packit c4476c
        t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
Packit c4476c
        t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
Packit c4476c
        t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
Packit c4476c
        t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
Packit c4476c
        if (key->rounds > 12) {
Packit c4476c
            /* round 12: */
Packit c4476c
            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
Packit c4476c
            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
Packit c4476c
            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
Packit c4476c
            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
Packit c4476c
            /* round 13: */
Packit c4476c
            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
Packit c4476c
            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
Packit c4476c
            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
Packit c4476c
            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    rk += key->rounds << 2;
Packit c4476c
#else  /* !FULL_UNROLL */
Packit c4476c
    /*
Packit c4476c
     * Nr - 1 full rounds:
Packit c4476c
     */
Packit c4476c
    r = key->rounds >> 1;
Packit c4476c
    for (;;) {
Packit c4476c
        t0 =
Packit c4476c
            Td0[(s0 >> 24)       ] ^
Packit c4476c
            Td1[(s3 >> 16) & 0xff] ^
Packit c4476c
            Td2[(s2 >>  8) & 0xff] ^
Packit c4476c
            Td3[(s1      ) & 0xff] ^
Packit c4476c
            rk[4];
Packit c4476c
        t1 =
Packit c4476c
            Td0[(s1 >> 24)       ] ^
Packit c4476c
            Td1[(s0 >> 16) & 0xff] ^
Packit c4476c
            Td2[(s3 >>  8) & 0xff] ^
Packit c4476c
            Td3[(s2      ) & 0xff] ^
Packit c4476c
            rk[5];
Packit c4476c
        t2 =
Packit c4476c
            Td0[(s2 >> 24)       ] ^
Packit c4476c
            Td1[(s1 >> 16) & 0xff] ^
Packit c4476c
            Td2[(s0 >>  8) & 0xff] ^
Packit c4476c
            Td3[(s3      ) & 0xff] ^
Packit c4476c
            rk[6];
Packit c4476c
        t3 =
Packit c4476c
            Td0[(s3 >> 24)       ] ^
Packit c4476c
            Td1[(s2 >> 16) & 0xff] ^
Packit c4476c
            Td2[(s1 >>  8) & 0xff] ^
Packit c4476c
            Td3[(s0      ) & 0xff] ^
Packit c4476c
            rk[7];
Packit c4476c
Packit c4476c
        rk += 8;
Packit c4476c
        if (--r == 0) {
Packit c4476c
            break;
Packit c4476c
        }
Packit c4476c
Packit c4476c
        s0 =
Packit c4476c
            Td0[(t0 >> 24)       ] ^
Packit c4476c
            Td1[(t3 >> 16) & 0xff] ^
Packit c4476c
            Td2[(t2 >>  8) & 0xff] ^
Packit c4476c
            Td3[(t1      ) & 0xff] ^
Packit c4476c
            rk[0];
Packit c4476c
        s1 =
Packit c4476c
            Td0[(t1 >> 24)       ] ^
Packit c4476c
            Td1[(t0 >> 16) & 0xff] ^
Packit c4476c
            Td2[(t3 >>  8) & 0xff] ^
Packit c4476c
            Td3[(t2      ) & 0xff] ^
Packit c4476c
            rk[1];
Packit c4476c
        s2 =
Packit c4476c
            Td0[(t2 >> 24)       ] ^
Packit c4476c
            Td1[(t1 >> 16) & 0xff] ^
Packit c4476c
            Td2[(t0 >>  8) & 0xff] ^
Packit c4476c
            Td3[(t3      ) & 0xff] ^
Packit c4476c
            rk[2];
Packit c4476c
        s3 =
Packit c4476c
            Td0[(t3 >> 24)       ] ^
Packit c4476c
            Td1[(t2 >> 16) & 0xff] ^
Packit c4476c
            Td2[(t1 >>  8) & 0xff] ^
Packit c4476c
            Td3[(t0      ) & 0xff] ^
Packit c4476c
            rk[3];
Packit c4476c
    }
Packit c4476c
#endif /* ?FULL_UNROLL */
Packit c4476c
    /*
Packit c4476c
     * apply last round and
Packit c4476c
     * map cipher state to byte array block:
Packit c4476c
     */
Packit c4476c
    s0 =
Packit c4476c
        ((u32)Td4[(t0 >> 24)       ] << 24) ^
Packit c4476c
        ((u32)Td4[(t3 >> 16) & 0xff] << 16) ^
Packit c4476c
        ((u32)Td4[(t2 >>  8) & 0xff] <<  8) ^
Packit c4476c
        ((u32)Td4[(t1      ) & 0xff])       ^
Packit c4476c
        rk[0];
Packit c4476c
    PUTU32(out     , s0);
Packit c4476c
    s1 =
Packit c4476c
        ((u32)Td4[(t1 >> 24)       ] << 24) ^
Packit c4476c
        ((u32)Td4[(t0 >> 16) & 0xff] << 16) ^
Packit c4476c
        ((u32)Td4[(t3 >>  8) & 0xff] <<  8) ^
Packit c4476c
        ((u32)Td4[(t2      ) & 0xff])       ^
Packit c4476c
        rk[1];
Packit c4476c
    PUTU32(out +  4, s1);
Packit c4476c
    s2 =
Packit c4476c
        ((u32)Td4[(t2 >> 24)       ] << 24) ^
Packit c4476c
        ((u32)Td4[(t1 >> 16) & 0xff] << 16) ^
Packit c4476c
        ((u32)Td4[(t0 >>  8) & 0xff] <<  8) ^
Packit c4476c
        ((u32)Td4[(t3      ) & 0xff])       ^
Packit c4476c
        rk[2];
Packit c4476c
    PUTU32(out +  8, s2);
Packit c4476c
    s3 =
Packit c4476c
        ((u32)Td4[(t3 >> 24)       ] << 24) ^
Packit c4476c
        ((u32)Td4[(t2 >> 16) & 0xff] << 16) ^
Packit c4476c
        ((u32)Td4[(t1 >>  8) & 0xff] <<  8) ^
Packit c4476c
        ((u32)Td4[(t0      ) & 0xff])       ^
Packit c4476c
        rk[3];
Packit c4476c
    PUTU32(out + 12, s3);
Packit c4476c
}
Packit c4476c
Packit c4476c
#else /* AES_ASM */
Packit c4476c
Packit c4476c
static const u8 Te4[256] = {
Packit c4476c
    0x63U, 0x7cU, 0x77U, 0x7bU, 0xf2U, 0x6bU, 0x6fU, 0xc5U,
Packit c4476c
    0x30U, 0x01U, 0x67U, 0x2bU, 0xfeU, 0xd7U, 0xabU, 0x76U,
Packit c4476c
    0xcaU, 0x82U, 0xc9U, 0x7dU, 0xfaU, 0x59U, 0x47U, 0xf0U,
Packit c4476c
    0xadU, 0xd4U, 0xa2U, 0xafU, 0x9cU, 0xa4U, 0x72U, 0xc0U,
Packit c4476c
    0xb7U, 0xfdU, 0x93U, 0x26U, 0x36U, 0x3fU, 0xf7U, 0xccU,
Packit c4476c
    0x34U, 0xa5U, 0xe5U, 0xf1U, 0x71U, 0xd8U, 0x31U, 0x15U,
Packit c4476c
    0x04U, 0xc7U, 0x23U, 0xc3U, 0x18U, 0x96U, 0x05U, 0x9aU,
Packit c4476c
    0x07U, 0x12U, 0x80U, 0xe2U, 0xebU, 0x27U, 0xb2U, 0x75U,
Packit c4476c
    0x09U, 0x83U, 0x2cU, 0x1aU, 0x1bU, 0x6eU, 0x5aU, 0xa0U,
Packit c4476c
    0x52U, 0x3bU, 0xd6U, 0xb3U, 0x29U, 0xe3U, 0x2fU, 0x84U,
Packit c4476c
    0x53U, 0xd1U, 0x00U, 0xedU, 0x20U, 0xfcU, 0xb1U, 0x5bU,
Packit c4476c
    0x6aU, 0xcbU, 0xbeU, 0x39U, 0x4aU, 0x4cU, 0x58U, 0xcfU,
Packit c4476c
    0xd0U, 0xefU, 0xaaU, 0xfbU, 0x43U, 0x4dU, 0x33U, 0x85U,
Packit c4476c
    0x45U, 0xf9U, 0x02U, 0x7fU, 0x50U, 0x3cU, 0x9fU, 0xa8U,
Packit c4476c
    0x51U, 0xa3U, 0x40U, 0x8fU, 0x92U, 0x9dU, 0x38U, 0xf5U,
Packit c4476c
    0xbcU, 0xb6U, 0xdaU, 0x21U, 0x10U, 0xffU, 0xf3U, 0xd2U,
Packit c4476c
    0xcdU, 0x0cU, 0x13U, 0xecU, 0x5fU, 0x97U, 0x44U, 0x17U,
Packit c4476c
    0xc4U, 0xa7U, 0x7eU, 0x3dU, 0x64U, 0x5dU, 0x19U, 0x73U,
Packit c4476c
    0x60U, 0x81U, 0x4fU, 0xdcU, 0x22U, 0x2aU, 0x90U, 0x88U,
Packit c4476c
    0x46U, 0xeeU, 0xb8U, 0x14U, 0xdeU, 0x5eU, 0x0bU, 0xdbU,
Packit c4476c
    0xe0U, 0x32U, 0x3aU, 0x0aU, 0x49U, 0x06U, 0x24U, 0x5cU,
Packit c4476c
    0xc2U, 0xd3U, 0xacU, 0x62U, 0x91U, 0x95U, 0xe4U, 0x79U,
Packit c4476c
    0xe7U, 0xc8U, 0x37U, 0x6dU, 0x8dU, 0xd5U, 0x4eU, 0xa9U,
Packit c4476c
    0x6cU, 0x56U, 0xf4U, 0xeaU, 0x65U, 0x7aU, 0xaeU, 0x08U,
Packit c4476c
    0xbaU, 0x78U, 0x25U, 0x2eU, 0x1cU, 0xa6U, 0xb4U, 0xc6U,
Packit c4476c
    0xe8U, 0xddU, 0x74U, 0x1fU, 0x4bU, 0xbdU, 0x8bU, 0x8aU,
Packit c4476c
    0x70U, 0x3eU, 0xb5U, 0x66U, 0x48U, 0x03U, 0xf6U, 0x0eU,
Packit c4476c
    0x61U, 0x35U, 0x57U, 0xb9U, 0x86U, 0xc1U, 0x1dU, 0x9eU,
Packit c4476c
    0xe1U, 0xf8U, 0x98U, 0x11U, 0x69U, 0xd9U, 0x8eU, 0x94U,
Packit c4476c
    0x9bU, 0x1eU, 0x87U, 0xe9U, 0xceU, 0x55U, 0x28U, 0xdfU,
Packit c4476c
    0x8cU, 0xa1U, 0x89U, 0x0dU, 0xbfU, 0xe6U, 0x42U, 0x68U,
Packit c4476c
    0x41U, 0x99U, 0x2dU, 0x0fU, 0xb0U, 0x54U, 0xbbU, 0x16U
Packit c4476c
};
Packit c4476c
static const u32 rcon[] = {
Packit c4476c
    0x01000000, 0x02000000, 0x04000000, 0x08000000,
Packit c4476c
    0x10000000, 0x20000000, 0x40000000, 0x80000000,
Packit c4476c
    0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
Packit c4476c
};
Packit c4476c
Packit c4476c
/**
Packit c4476c
 * Expand the cipher key into the encryption key schedule.
Packit c4476c
 */
Packit c4476c
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
Packit c4476c
                        AES_KEY *key)
Packit c4476c
{
Packit c4476c
    u32 *rk;
Packit c4476c
    int i = 0;
Packit c4476c
    u32 temp;
Packit c4476c
Packit c4476c
    if (!userKey || !key)
Packit c4476c
        return -1;
Packit c4476c
    if (bits != 128 && bits != 192 && bits != 256)
Packit c4476c
        return -2;
Packit c4476c
Packit c4476c
    rk = key->rd_key;
Packit c4476c
Packit c4476c
    if (bits == 128)
Packit c4476c
        key->rounds = 10;
Packit c4476c
    else if (bits == 192)
Packit c4476c
        key->rounds = 12;
Packit c4476c
    else
Packit c4476c
        key->rounds = 14;
Packit c4476c
Packit c4476c
    rk[0] = GETU32(userKey     );
Packit c4476c
    rk[1] = GETU32(userKey +  4);
Packit c4476c
    rk[2] = GETU32(userKey +  8);
Packit c4476c
    rk[3] = GETU32(userKey + 12);
Packit c4476c
    if (bits == 128) {
Packit c4476c
        while (1) {
Packit c4476c
            temp  = rk[3];
Packit c4476c
            rk[4] = rk[0] ^
Packit c4476c
                ((u32)Te4[(temp >> 16) & 0xff] << 24) ^
Packit c4476c
                ((u32)Te4[(temp >>  8) & 0xff] << 16) ^
Packit c4476c
                ((u32)Te4[(temp      ) & 0xff] << 8) ^
Packit c4476c
                ((u32)Te4[(temp >> 24)       ]) ^
Packit c4476c
                rcon[i];
Packit c4476c
            rk[5] = rk[1] ^ rk[4];
Packit c4476c
            rk[6] = rk[2] ^ rk[5];
Packit c4476c
            rk[7] = rk[3] ^ rk[6];
Packit c4476c
            if (++i == 10) {
Packit c4476c
                return 0;
Packit c4476c
            }
Packit c4476c
            rk += 4;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    rk[4] = GETU32(userKey + 16);
Packit c4476c
    rk[5] = GETU32(userKey + 20);
Packit c4476c
    if (bits == 192) {
Packit c4476c
        while (1) {
Packit c4476c
            temp = rk[ 5];
Packit c4476c
            rk[ 6] = rk[ 0] ^
Packit c4476c
                ((u32)Te4[(temp >> 16) & 0xff] << 24) ^
Packit c4476c
                ((u32)Te4[(temp >>  8) & 0xff] << 16) ^
Packit c4476c
                ((u32)Te4[(temp      ) & 0xff] << 8) ^
Packit c4476c
                ((u32)Te4[(temp >> 24)       ]) ^
Packit c4476c
                rcon[i];
Packit c4476c
            rk[ 7] = rk[ 1] ^ rk[ 6];
Packit c4476c
            rk[ 8] = rk[ 2] ^ rk[ 7];
Packit c4476c
            rk[ 9] = rk[ 3] ^ rk[ 8];
Packit c4476c
            if (++i == 8) {
Packit c4476c
                return 0;
Packit c4476c
            }
Packit c4476c
            rk[10] = rk[ 4] ^ rk[ 9];
Packit c4476c
            rk[11] = rk[ 5] ^ rk[10];
Packit c4476c
            rk += 6;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    rk[6] = GETU32(userKey + 24);
Packit c4476c
    rk[7] = GETU32(userKey + 28);
Packit c4476c
    if (bits == 256) {
Packit c4476c
        while (1) {
Packit c4476c
            temp = rk[ 7];
Packit c4476c
            rk[ 8] = rk[ 0] ^
Packit c4476c
                ((u32)Te4[(temp >> 16) & 0xff] << 24) ^
Packit c4476c
                ((u32)Te4[(temp >>  8) & 0xff] << 16) ^
Packit c4476c
                ((u32)Te4[(temp      ) & 0xff] << 8) ^
Packit c4476c
                ((u32)Te4[(temp >> 24)       ]) ^
Packit c4476c
                rcon[i];
Packit c4476c
            rk[ 9] = rk[ 1] ^ rk[ 8];
Packit c4476c
            rk[10] = rk[ 2] ^ rk[ 9];
Packit c4476c
            rk[11] = rk[ 3] ^ rk[10];
Packit c4476c
            if (++i == 7) {
Packit c4476c
                return 0;
Packit c4476c
            }
Packit c4476c
            temp = rk[11];
Packit c4476c
            rk[12] = rk[ 4] ^
Packit c4476c
                ((u32)Te4[(temp >> 24)       ] << 24) ^
Packit c4476c
                ((u32)Te4[(temp >> 16) & 0xff] << 16) ^
Packit c4476c
                ((u32)Te4[(temp >>  8) & 0xff] << 8) ^
Packit c4476c
                ((u32)Te4[(temp      ) & 0xff]);
Packit c4476c
            rk[13] = rk[ 5] ^ rk[12];
Packit c4476c
            rk[14] = rk[ 6] ^ rk[13];
Packit c4476c
            rk[15] = rk[ 7] ^ rk[14];
Packit c4476c
Packit c4476c
            rk += 8;
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    return 0;
Packit c4476c
}
Packit c4476c
Packit c4476c
/**
Packit c4476c
 * Expand the cipher key into the decryption key schedule.
Packit c4476c
 */
Packit c4476c
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
Packit c4476c
                        AES_KEY *key)
Packit c4476c
{
Packit c4476c
Packit c4476c
    u32 *rk;
Packit c4476c
    int i, j, status;
Packit c4476c
    u32 temp;
Packit c4476c
Packit c4476c
    /* first, start with an encryption schedule */
Packit c4476c
    status = AES_set_encrypt_key(userKey, bits, key);
Packit c4476c
    if (status < 0)
Packit c4476c
        return status;
Packit c4476c
Packit c4476c
    rk = key->rd_key;
Packit c4476c
Packit c4476c
    /* invert the order of the round keys: */
Packit c4476c
    for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {
Packit c4476c
        temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
Packit c4476c
        temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
Packit c4476c
        temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
Packit c4476c
        temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
Packit c4476c
    }
Packit c4476c
    /* apply the inverse MixColumn transform to all round keys but the first and the last: */
Packit c4476c
    for (i = 1; i < (key->rounds); i++) {
Packit c4476c
        rk += 4;
Packit c4476c
        for (j = 0; j < 4; j++) {
Packit c4476c
            u32 tp1, tp2, tp4, tp8, tp9, tpb, tpd, tpe, m;
Packit c4476c
Packit c4476c
            tp1 = rk[j];
Packit c4476c
            m = tp1 & 0x80808080;
Packit c4476c
            tp2 = ((tp1 & 0x7f7f7f7f) << 1) ^
Packit c4476c
                ((m - (m >> 7)) & 0x1b1b1b1b);
Packit c4476c
            m = tp2 & 0x80808080;
Packit c4476c
            tp4 = ((tp2 & 0x7f7f7f7f) << 1) ^
Packit c4476c
                ((m - (m >> 7)) & 0x1b1b1b1b);
Packit c4476c
            m = tp4 & 0x80808080;
Packit c4476c
            tp8 = ((tp4 & 0x7f7f7f7f) << 1) ^
Packit c4476c
                ((m - (m >> 7)) & 0x1b1b1b1b);
Packit c4476c
            tp9 = tp8 ^ tp1;
Packit c4476c
            tpb = tp9 ^ tp2;
Packit c4476c
            tpd = tp9 ^ tp4;
Packit c4476c
            tpe = tp8 ^ tp4 ^ tp2;
Packit c4476c
#if defined(ROTATE)
Packit c4476c
            rk[j] = tpe ^ ROTATE(tpd,16) ^
Packit c4476c
                ROTATE(tp9,24) ^ ROTATE(tpb,8);
Packit c4476c
#else
Packit c4476c
            rk[j] = tpe ^ (tpd >> 16) ^ (tpd << 16) ^
Packit c4476c
                (tp9 >> 8) ^ (tp9 << 24) ^
Packit c4476c
                (tpb >> 24) ^ (tpb << 8);
Packit c4476c
#endif
Packit c4476c
        }
Packit c4476c
    }
Packit c4476c
    return 0;
Packit c4476c
}
Packit c4476c
Packit c4476c
#endif /* AES_ASM */