1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/aes/aes_core.c -*- mode:C; c-file-style: "eay" -*- */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/**
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * rijndael-alg-fst.c
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * @version 3.0 (December 2000)
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Optimised ANSI C code for the Rijndael cipher (now AES)
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * @author Paulo Barreto <paulo.barreto@terra.com.br>
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This code is hereby placed in the public domain.
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Note: rewritten a little bit to provide error control and an OpenSSL-
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   compatible API */
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef AES_DEBUG
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ifndef NDEBUG
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  define NDEBUG
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <assert.h>
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h>
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/aes.h>
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "aes_locl.h"
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
42221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef AES_ASM
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTe0[x] = S [x].[02, 01, 01, 03];
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTe1[x] = S [x].[03, 02, 01, 01];
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTe2[x] = S [x].[01, 03, 02, 01];
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTe3[x] = S [x].[01, 01, 03, 02];
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTd0[x] = Si[x].[0e, 09, 0d, 0b];
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTd1[x] = Si[x].[0b, 0e, 09, 0d];
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTd2[x] = Si[x].[0d, 0b, 0e, 09];
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTd3[x] = Si[x].[09, 0d, 0b, 0e];
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTd4[x] = Si[x].[01];
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project*/
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u32 Te0[256] = {
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u32 Te1[256] = {
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u32 Te2[256] = {
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u32 Te3[256] = {
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u32 Td0[256] = {
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u32 Td1[256] = {
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u32 Td2[256] = {
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u32 Td3[256] = {
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u8 Td4[256] = {
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const u32 rcon[] = {
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01000000, 0x02000000, 0x04000000, 0x08000000,
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x10000000, 0x20000000, 0x40000000, 0x80000000,
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/**
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Expand the cipher key into the encryption key schedule.
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint AES_set_encrypt_key(const unsigned char *userKey, const int bits,
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			AES_KEY *key) {
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	u32 *rk;
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	int i = 0;
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	u32 temp;
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!userKey || !key)
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return -1;
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bits != 128 && bits != 192 && bits != 256)
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return -2;
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk = key->rd_key;
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bits==128)
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		key->rounds = 10;
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (bits==192)
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		key->rounds = 12;
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		key->rounds = 14;
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk[0] = GETU32(userKey     );
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk[1] = GETU32(userKey +  4);
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk[2] = GETU32(userKey +  8);
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk[3] = GETU32(userKey + 12);
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bits == 128) {
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (1) {
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			temp  = rk[3];
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[4] = rk[0] ^
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te2[(temp >> 16) & 0xff] & 0xff000000) ^
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te0[(temp      ) & 0xff] & 0x0000ff00) ^
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te1[(temp >> 24)       ] & 0x000000ff) ^
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				rcon[i];
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[5] = rk[1] ^ rk[4];
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[6] = rk[2] ^ rk[5];
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[7] = rk[3] ^ rk[6];
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (++i == 10) {
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk += 4;
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk[4] = GETU32(userKey + 16);
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk[5] = GETU32(userKey + 20);
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bits == 192) {
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (1) {
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			temp = rk[ 5];
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[ 6] = rk[ 0] ^
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te2[(temp >> 16) & 0xff] & 0xff000000) ^
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te0[(temp      ) & 0xff] & 0x0000ff00) ^
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te1[(temp >> 24)       ] & 0x000000ff) ^
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				rcon[i];
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[ 7] = rk[ 1] ^ rk[ 6];
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[ 8] = rk[ 2] ^ rk[ 7];
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[ 9] = rk[ 3] ^ rk[ 8];
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (++i == 8) {
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[10] = rk[ 4] ^ rk[ 9];
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[11] = rk[ 5] ^ rk[10];
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk += 6;
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk[6] = GETU32(userKey + 24);
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk[7] = GETU32(userKey + 28);
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bits == 256) {
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (1) {
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			temp = rk[ 7];
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[ 8] = rk[ 0] ^
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te2[(temp >> 16) & 0xff] & 0xff000000) ^
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te3[(temp >>  8) & 0xff] & 0x00ff0000) ^
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te0[(temp      ) & 0xff] & 0x0000ff00) ^
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te1[(temp >> 24)       ] & 0x000000ff) ^
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				rcon[i];
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[ 9] = rk[ 1] ^ rk[ 8];
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[10] = rk[ 2] ^ rk[ 9];
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[11] = rk[ 3] ^ rk[10];
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (++i == 7) {
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			temp = rk[11];
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[12] = rk[ 4] ^
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te2[(temp >> 24)       ] & 0xff000000) ^
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te0[(temp >>  8) & 0xff] & 0x0000ff00) ^
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(Te1[(temp      ) & 0xff] & 0x000000ff);
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[13] = rk[ 5] ^ rk[12];
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[14] = rk[ 6] ^ rk[13];
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk[15] = rk[ 7] ^ rk[14];
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			rk += 8;
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        	}
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/**
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Expand the cipher key into the decryption key schedule.
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint AES_set_decrypt_key(const unsigned char *userKey, const int bits,
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 AES_KEY *key) {
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        u32 *rk;
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i, j, status;
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	u32 temp;
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* first, start with an encryption schedule */
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	status = AES_set_encrypt_key(userKey, bits, key);
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (status < 0)
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return status;
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk = key->rd_key;
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* invert the order of the round keys: */
744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* apply the inverse MixColumn transform to all round keys but the first and the last: */
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i = 1; i < (key->rounds); i++) {
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rk += 4;
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rk[0] =
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td0[Te1[(rk[0] >> 24)       ] & 0xff] ^
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td2[Te1[(rk[0] >>  8) & 0xff] & 0xff] ^
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td3[Te1[(rk[0]      ) & 0xff] & 0xff];
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rk[1] =
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td0[Te1[(rk[1] >> 24)       ] & 0xff] ^
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td2[Te1[(rk[1] >>  8) & 0xff] & 0xff] ^
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td3[Te1[(rk[1]      ) & 0xff] & 0xff];
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rk[2] =
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td0[Te1[(rk[2] >> 24)       ] & 0xff] ^
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td2[Te1[(rk[2] >>  8) & 0xff] & 0xff] ^
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td3[Te1[(rk[2]      ) & 0xff] & 0xff];
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rk[3] =
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td0[Te1[(rk[3] >> 24)       ] & 0xff] ^
770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td2[Te1[(rk[3] >>  8) & 0xff] & 0xff] ^
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			Td3[Te1[(rk[3]      ) & 0xff] & 0xff];
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Encrypt a single block
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in and out can overlap
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid AES_encrypt(const unsigned char *in, unsigned char *out,
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 const AES_KEY *key) {
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const u32 *rk;
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	u32 s0, s1, s2, s3, t0, t1, t2, t3;
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef FULL_UNROLL
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int r;
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* ?FULL_UNROLL */
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	assert(in && out && key);
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk = key->rd_key;
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/*
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * map byte array block to cipher state
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * and add initial round key:
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s0 = GETU32(in     ) ^ rk[0];
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s1 = GETU32(in +  4) ^ rk[1];
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s2 = GETU32(in +  8) ^ rk[2];
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s3 = GETU32(in + 12) ^ rk[3];
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FULL_UNROLL
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* round 1: */
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	/* round 2: */
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* round 3: */
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	/* round 4: */
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* round 5: */
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	/* round 6: */
828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* round 7: */
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	/* round 8: */
838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* round 9: */
843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (key->rounds > 10) {
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /* round 10: */
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /* round 11: */
854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (key->rounds > 12) {
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            /* round 12: */
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            /* round 13: */
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    rk += key->rounds << 2;
872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else  /* !FULL_UNROLL */
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /*
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project     * Nr - 1 full rounds:
875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project     */
876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    r = key->rounds >> 1;
877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    for (;;) {
878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t0 =
879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te0[(s0 >> 24)       ] ^
880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te1[(s1 >> 16) & 0xff] ^
881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te2[(s2 >>  8) & 0xff] ^
882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te3[(s3      ) & 0xff] ^
883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[4];
884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t1 =
885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te0[(s1 >> 24)       ] ^
886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te1[(s2 >> 16) & 0xff] ^
887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te2[(s3 >>  8) & 0xff] ^
888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te3[(s0      ) & 0xff] ^
889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[5];
890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t2 =
891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te0[(s2 >> 24)       ] ^
892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te1[(s3 >> 16) & 0xff] ^
893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te2[(s0 >>  8) & 0xff] ^
894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te3[(s1      ) & 0xff] ^
895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[6];
896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t3 =
897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te0[(s3 >> 24)       ] ^
898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te1[(s0 >> 16) & 0xff] ^
899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te2[(s1 >>  8) & 0xff] ^
900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te3[(s2      ) & 0xff] ^
901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[7];
902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        rk += 8;
904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (--r == 0) {
905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s0 =
909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te0[(t0 >> 24)       ] ^
910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te1[(t1 >> 16) & 0xff] ^
911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te2[(t2 >>  8) & 0xff] ^
912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te3[(t3      ) & 0xff] ^
913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[0];
914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s1 =
915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te0[(t1 >> 24)       ] ^
916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te1[(t2 >> 16) & 0xff] ^
917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te2[(t3 >>  8) & 0xff] ^
918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te3[(t0      ) & 0xff] ^
919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[1];
920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s2 =
921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te0[(t2 >> 24)       ] ^
922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te1[(t3 >> 16) & 0xff] ^
923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te2[(t0 >>  8) & 0xff] ^
924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te3[(t1      ) & 0xff] ^
925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[2];
926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s3 =
927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te0[(t3 >> 24)       ] ^
928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te1[(t0 >> 16) & 0xff] ^
929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te2[(t1 >>  8) & 0xff] ^
930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Te3[(t2      ) & 0xff] ^
931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[3];
932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* ?FULL_UNROLL */
934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /*
935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * apply last round and
936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * map cipher state to byte array block:
937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s0 =
939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te2[(t0 >> 24)       ] & 0xff000000) ^
940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^
941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te0[(t2 >>  8) & 0xff] & 0x0000ff00) ^
942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te1[(t3      ) & 0xff] & 0x000000ff) ^
943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rk[0];
944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUTU32(out     , s0);
945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s1 =
946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te2[(t1 >> 24)       ] & 0xff000000) ^
947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^
948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te0[(t3 >>  8) & 0xff] & 0x0000ff00) ^
949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te1[(t0      ) & 0xff] & 0x000000ff) ^
950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rk[1];
951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUTU32(out +  4, s1);
952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s2 =
953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te2[(t2 >> 24)       ] & 0xff000000) ^
954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^
955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te0[(t0 >>  8) & 0xff] & 0x0000ff00) ^
956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te1[(t1      ) & 0xff] & 0x000000ff) ^
957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rk[2];
958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUTU32(out +  8, s2);
959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s3 =
960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te2[(t3 >> 24)       ] & 0xff000000) ^
961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^
962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te0[(t1 >>  8) & 0xff] & 0x0000ff00) ^
963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(Te1[(t2      ) & 0xff] & 0x000000ff) ^
964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		rk[3];
965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUTU32(out + 12, s3);
966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Decrypt a single block
970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in and out can overlap
971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid AES_decrypt(const unsigned char *in, unsigned char *out,
973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 const AES_KEY *key) {
974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const u32 *rk;
976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	u32 s0, s1, s2, s3, t0, t1, t2, t3;
977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef FULL_UNROLL
978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int r;
979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* ?FULL_UNROLL */
980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	assert(in && out && key);
982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk = key->rd_key;
983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/*
985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * map byte array block to cipher state
986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * and add initial round key:
987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s0 = GETU32(in     ) ^ rk[0];
989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s1 = GETU32(in +  4) ^ rk[1];
990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s2 = GETU32(in +  8) ^ rk[2];
991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s3 = GETU32(in + 12) ^ rk[3];
992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FULL_UNROLL
993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* round 1: */
994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* round 2: */
999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* round 3: */
1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* round 4: */
1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
1011656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
1012656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
1013656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* round 5: */
1014656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
1015656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
1016656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
1017656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
1018656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* round 6: */
1019656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
1020656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
1021656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
1022656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
1023656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* round 7: */
1024656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
1025656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
1026656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
1027656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
1028656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* round 8: */
1029656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
1030656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
1031656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
1032656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* round 9: */
1034656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
1035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
1036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
1037656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
1038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (key->rounds > 10) {
1039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /* round 10: */
1040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
1041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
1042656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
1043656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
1044656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /* round 11: */
1045656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
1046656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
1047656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
1048656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
1049656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (key->rounds > 12) {
1050656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            /* round 12: */
1051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
1052656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
1053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
1054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
1055656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            /* round 13: */
1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1062656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rk += key->rounds << 2;
1063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else  /* !FULL_UNROLL */
1064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /*
1065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project     * Nr - 1 full rounds:
1066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project     */
1067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    r = key->rounds >> 1;
1068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    for (;;) {
1069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t0 =
1070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td0[(s0 >> 24)       ] ^
1071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td1[(s3 >> 16) & 0xff] ^
1072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td2[(s2 >>  8) & 0xff] ^
1073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td3[(s1      ) & 0xff] ^
1074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[4];
1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t1 =
1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td0[(s1 >> 24)       ] ^
1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td1[(s0 >> 16) & 0xff] ^
1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td2[(s3 >>  8) & 0xff] ^
1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td3[(s2      ) & 0xff] ^
1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[5];
1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t2 =
1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td0[(s2 >> 24)       ] ^
1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td1[(s1 >> 16) & 0xff] ^
1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td2[(s0 >>  8) & 0xff] ^
1085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td3[(s3      ) & 0xff] ^
1086656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[6];
1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        t3 =
1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td0[(s3 >> 24)       ] ^
1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td1[(s2 >> 16) & 0xff] ^
1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td2[(s1 >>  8) & 0xff] ^
1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td3[(s0      ) & 0xff] ^
1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[7];
1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        rk += 8;
1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (--r == 0) {
1096656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
1097656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
1098656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1099656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s0 =
1100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td0[(t0 >> 24)       ] ^
1101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td1[(t3 >> 16) & 0xff] ^
1102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td2[(t2 >>  8) & 0xff] ^
1103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td3[(t1      ) & 0xff] ^
1104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[0];
1105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s1 =
1106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td0[(t1 >> 24)       ] ^
1107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td1[(t0 >> 16) & 0xff] ^
1108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td2[(t3 >>  8) & 0xff] ^
1109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td3[(t2      ) & 0xff] ^
1110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[1];
1111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s2 =
1112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td0[(t2 >> 24)       ] ^
1113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td1[(t1 >> 16) & 0xff] ^
1114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td2[(t0 >>  8) & 0xff] ^
1115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td3[(t3      ) & 0xff] ^
1116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[2];
1117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        s3 =
1118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td0[(t3 >> 24)       ] ^
1119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td1[(t2 >> 16) & 0xff] ^
1120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td2[(t1 >>  8) & 0xff] ^
1121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            Td3[(t0      ) & 0xff] ^
1122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            rk[3];
1123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* ?FULL_UNROLL */
1125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /*
1126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * apply last round and
1127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * map cipher state to byte array block:
1128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
1129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s0 =
1130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t0 >> 24)       ] << 24) ^
1131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t3 >> 16) & 0xff] << 16) ^
1132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t2 >>  8) & 0xff] <<  8) ^
1133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t1      ) & 0xff])       ^
1134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		rk[0];
1135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUTU32(out     , s0);
1136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s1 =
1137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t1 >> 24)       ] << 24) ^
1138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t0 >> 16) & 0xff] << 16) ^
1139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t3 >>  8) & 0xff] <<  8) ^
1140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t2      ) & 0xff])       ^
1141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		rk[1];
1142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUTU32(out +  4, s1);
1143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s2 =
1144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t2 >> 24)       ] << 24) ^
1145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t1 >> 16) & 0xff] << 16) ^
1146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t0 >>  8) & 0xff] <<  8) ^
1147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t3      ) & 0xff])       ^
1148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		rk[2];
1149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUTU32(out +  8, s2);
1150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   	s3 =
1151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t3 >> 24)       ] << 24) ^
1152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t2 >> 16) & 0xff] << 16) ^
1153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t1 >>  8) & 0xff] <<  8) ^
1154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		(Td4[(t0      ) & 0xff])       ^
1155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   		rk[3];
1156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUTU32(out + 12, s3);
1157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else /* AES_ASM */
1160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic const u8 Te4[256] = {
1162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x63U, 0x7cU, 0x77U, 0x7bU, 0xf2U, 0x6bU, 0x6fU, 0xc5U,
1163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x30U, 0x01U, 0x67U, 0x2bU, 0xfeU, 0xd7U, 0xabU, 0x76U,
1164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xcaU, 0x82U, 0xc9U, 0x7dU, 0xfaU, 0x59U, 0x47U, 0xf0U,
1165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xadU, 0xd4U, 0xa2U, 0xafU, 0x9cU, 0xa4U, 0x72U, 0xc0U,
1166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xb7U, 0xfdU, 0x93U, 0x26U, 0x36U, 0x3fU, 0xf7U, 0xccU,
1167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x34U, 0xa5U, 0xe5U, 0xf1U, 0x71U, 0xd8U, 0x31U, 0x15U,
1168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x04U, 0xc7U, 0x23U, 0xc3U, 0x18U, 0x96U, 0x05U, 0x9aU,
1169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x07U, 0x12U, 0x80U, 0xe2U, 0xebU, 0x27U, 0xb2U, 0x75U,
1170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x09U, 0x83U, 0x2cU, 0x1aU, 0x1bU, 0x6eU, 0x5aU, 0xa0U,
1171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x52U, 0x3bU, 0xd6U, 0xb3U, 0x29U, 0xe3U, 0x2fU, 0x84U,
1172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x53U, 0xd1U, 0x00U, 0xedU, 0x20U, 0xfcU, 0xb1U, 0x5bU,
1173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x6aU, 0xcbU, 0xbeU, 0x39U, 0x4aU, 0x4cU, 0x58U, 0xcfU,
1174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xd0U, 0xefU, 0xaaU, 0xfbU, 0x43U, 0x4dU, 0x33U, 0x85U,
1175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x45U, 0xf9U, 0x02U, 0x7fU, 0x50U, 0x3cU, 0x9fU, 0xa8U,
1176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x51U, 0xa3U, 0x40U, 0x8fU, 0x92U, 0x9dU, 0x38U, 0xf5U,
1177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xbcU, 0xb6U, 0xdaU, 0x21U, 0x10U, 0xffU, 0xf3U, 0xd2U,
1178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xcdU, 0x0cU, 0x13U, 0xecU, 0x5fU, 0x97U, 0x44U, 0x17U,
1179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xc4U, 0xa7U, 0x7eU, 0x3dU, 0x64U, 0x5dU, 0x19U, 0x73U,
1180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x60U, 0x81U, 0x4fU, 0xdcU, 0x22U, 0x2aU, 0x90U, 0x88U,
1181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x46U, 0xeeU, 0xb8U, 0x14U, 0xdeU, 0x5eU, 0x0bU, 0xdbU,
1182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xe0U, 0x32U, 0x3aU, 0x0aU, 0x49U, 0x06U, 0x24U, 0x5cU,
1183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xc2U, 0xd3U, 0xacU, 0x62U, 0x91U, 0x95U, 0xe4U, 0x79U,
1184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xe7U, 0xc8U, 0x37U, 0x6dU, 0x8dU, 0xd5U, 0x4eU, 0xa9U,
1185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x6cU, 0x56U, 0xf4U, 0xeaU, 0x65U, 0x7aU, 0xaeU, 0x08U,
1186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xbaU, 0x78U, 0x25U, 0x2eU, 0x1cU, 0xa6U, 0xb4U, 0xc6U,
1187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xe8U, 0xddU, 0x74U, 0x1fU, 0x4bU, 0xbdU, 0x8bU, 0x8aU,
1188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x70U, 0x3eU, 0xb5U, 0x66U, 0x48U, 0x03U, 0xf6U, 0x0eU,
1189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x61U, 0x35U, 0x57U, 0xb9U, 0x86U, 0xc1U, 0x1dU, 0x9eU,
1190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0xe1U, 0xf8U, 0x98U, 0x11U, 0x69U, 0xd9U, 0x8eU, 0x94U,
1191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x9bU, 0x1eU, 0x87U, 0xe9U, 0xceU, 0x55U, 0x28U, 0xdfU,
1192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x8cU, 0xa1U, 0x89U, 0x0dU, 0xbfU, 0xe6U, 0x42U, 0x68U,
1193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    0x41U, 0x99U, 0x2dU, 0x0fU, 0xb0U, 0x54U, 0xbbU, 0x16U
1194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom};
1195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic const u32 rcon[] = {
1196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0x01000000, 0x02000000, 0x04000000, 0x08000000,
1197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0x10000000, 0x20000000, 0x40000000, 0x80000000,
1198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
1199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom};
1200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/**
1202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Expand the cipher key into the encryption key schedule.
1203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
1204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint AES_set_encrypt_key(const unsigned char *userKey, const int bits,
1205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			AES_KEY *key) {
1206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	u32 *rk;
1207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom   	int i = 0;
1208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	u32 temp;
1209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (!userKey || !key)
1211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return -1;
1212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (bits != 128 && bits != 192 && bits != 256)
1213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return -2;
1214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk = key->rd_key;
1216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (bits==128)
1218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		key->rounds = 10;
1219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if (bits==192)
1220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		key->rounds = 12;
1221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else
1222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		key->rounds = 14;
1223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk[0] = GETU32(userKey     );
1225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk[1] = GETU32(userKey +  4);
1226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk[2] = GETU32(userKey +  8);
1227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk[3] = GETU32(userKey + 12);
1228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (bits == 128) {
1229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		while (1) {
1230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			temp  = rk[3];
1231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[4] = rk[0] ^
1232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >> 16) & 0xff] << 24) ^
1233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >>  8) & 0xff] << 16) ^
1234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp      ) & 0xff] << 8) ^
1235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >> 24)       ]) ^
1236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				rcon[i];
1237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[5] = rk[1] ^ rk[4];
1238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[6] = rk[2] ^ rk[5];
1239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[7] = rk[3] ^ rk[6];
1240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (++i == 10) {
1241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
1242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
1243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk += 4;
1244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
1245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
1246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk[4] = GETU32(userKey + 16);
1247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk[5] = GETU32(userKey + 20);
1248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (bits == 192) {
1249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		while (1) {
1250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			temp = rk[ 5];
1251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[ 6] = rk[ 0] ^
1252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >> 16) & 0xff] << 24) ^
1253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >>  8) & 0xff] << 16) ^
1254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp      ) & 0xff] << 8) ^
1255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >> 24)       ]) ^
1256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				rcon[i];
1257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[ 7] = rk[ 1] ^ rk[ 6];
1258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[ 8] = rk[ 2] ^ rk[ 7];
1259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[ 9] = rk[ 3] ^ rk[ 8];
1260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (++i == 8) {
1261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
1262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
1263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[10] = rk[ 4] ^ rk[ 9];
1264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[11] = rk[ 5] ^ rk[10];
1265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk += 6;
1266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
1267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
1268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk[6] = GETU32(userKey + 24);
1269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk[7] = GETU32(userKey + 28);
1270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (bits == 256) {
1271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		while (1) {
1272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			temp = rk[ 7];
1273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[ 8] = rk[ 0] ^
1274221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >> 16) & 0xff] << 24) ^
1275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >>  8) & 0xff] << 16) ^
1276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp      ) & 0xff] << 8) ^
1277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >> 24)       ]) ^
1278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				rcon[i];
1279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[ 9] = rk[ 1] ^ rk[ 8];
1280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[10] = rk[ 2] ^ rk[ 9];
1281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[11] = rk[ 3] ^ rk[10];
1282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (++i == 7) {
1283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
1284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
1285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			temp = rk[11];
1286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[12] = rk[ 4] ^
1287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >> 24)       ] << 24) ^
1288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >> 16) & 0xff] << 16) ^
1289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp >>  8) & 0xff] << 8) ^
1290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(Te4[(temp      ) & 0xff]);
1291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[13] = rk[ 5] ^ rk[12];
1292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[14] = rk[ 6] ^ rk[13];
1293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[15] = rk[ 7] ^ rk[14];
1294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk += 8;
1296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        	}
1297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
1298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 0;
1299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/**
1302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Expand the cipher key into the decryption key schedule.
1303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
1304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint AES_set_decrypt_key(const unsigned char *userKey, const int bits,
1305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 AES_KEY *key) {
1306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        u32 *rk;
1308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int i, j, status;
1309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	u32 temp;
1310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* first, start with an encryption schedule */
1312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	status = AES_set_encrypt_key(userKey, bits, key);
1313221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (status < 0)
1314221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return status;
1315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rk = key->rd_key;
1317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* invert the order of the round keys: */
1319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {
1320221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
1321221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
1322221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
1323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
1324221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
1325221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* apply the inverse MixColumn transform to all round keys but the first and the last: */
1326221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (i = 1; i < (key->rounds); i++) {
1327221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		rk += 4;
1328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		for (j = 0; j < 4; j++) {
1329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			u32 tp1, tp2, tp4, tp8, tp9, tpb, tpd, tpe, m;
1330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1331221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			tp1 = rk[j];
1332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			m = tp1 & 0x80808080;
1333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			tp2 = ((tp1 & 0x7f7f7f7f) << 1) ^
1334221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				((m - (m >> 7)) & 0x1b1b1b1b);
1335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			m = tp2 & 0x80808080;
1336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			tp4 = ((tp2 & 0x7f7f7f7f) << 1) ^
1337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				((m - (m >> 7)) & 0x1b1b1b1b);
1338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			m = tp4 & 0x80808080;
1339221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			tp8 = ((tp4 & 0x7f7f7f7f) << 1) ^
1340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				((m - (m >> 7)) & 0x1b1b1b1b);
1341221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			tp9 = tp8 ^ tp1;
1342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			tpb = tp9 ^ tp2;
1343221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			tpd = tp9 ^ tp4;
1344221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			tpe = tp8 ^ tp4 ^ tp2;
1345221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(ROTATE)
1346221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[j] = tpe ^ ROTATE(tpd,16) ^
1347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				ROTATE(tp9,24) ^ ROTATE(tpb,8);
1348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else
1349221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			rk[j] = tpe ^ (tpd >> 16) ^ (tpd << 16) ^
1350221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(tp9 >> 8) ^ (tp9 << 24) ^
1351221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				(tpb >> 24) ^ (tpb << 8);
1352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
1353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
1354221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
1355221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 0;
1356221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1357221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* AES_ASM */
1359