1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* ====================================================================
2d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Copyright (c) 2002-2006 The OpenSSL Project.  All rights reserved.
3d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
4d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Redistribution and use in source and binary forms, with or without
5d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * modification, are permitted provided that the following conditions
6d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * are met:
7d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
8d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 1. Redistributions of source code must retain the above copyright
9d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer.
10d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
11d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 2. Redistributions in binary form must reproduce the above copyright
12d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer in
13d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    the documentation and/or other materials provided with the
14d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    distribution.
15d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 3. All advertising materials mentioning features or use of this
17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    software must display the following acknowledgment:
18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes software developed by the OpenSSL Project
19d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
21d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    endorse or promote products derived from this software without
23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    prior written permission. For written permission, please contact
24d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    openssl-core@openssl.org.
25d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
26d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 5. Products derived from this software may not be called "OpenSSL"
27d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    nor may "OpenSSL" appear in their names without prior written
28d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    permission of the OpenSSL Project.
29d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
30d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 6. Redistributions of any form whatsoever must retain the following
31d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    acknowledgment:
32d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes software developed by the OpenSSL Project
33d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
39d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OF THE POSSIBILITY OF SUCH DAMAGE.
47d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ==================================================================== */
48d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
49d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/aes.h>
50d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
51d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <assert.h>
52d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
53d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include "internal.h"
54d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
55d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
56d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#if defined(OPENSSL_NO_ASM) || \
57d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    (!defined(OPENSSL_X86) && !defined(OPENSSL_X86_64) && !defined(OPENSSL_ARM))
58d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
59d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Te0[x] = S [x].[02, 01, 01, 03];
60d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Te1[x] = S [x].[03, 02, 01, 01];
61d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Te2[x] = S [x].[01, 03, 02, 01];
62d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Te3[x] = S [x].[01, 01, 03, 02];
63d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
64d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Td0[x] = Si[x].[0e, 09, 0d, 0b];
65d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Td1[x] = Si[x].[0b, 0e, 09, 0d];
66d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Td2[x] = Si[x].[0d, 0b, 0e, 09];
67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Td3[x] = Si[x].[09, 0d, 0b, 0e];
68d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Td4[x] = Si[x].[01]; */
69d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
70d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t Te0[256] = {
71d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 0xfff2f20dU,
72d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 0x60303050U, 0x02010103U,
73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xce6767a9U, 0x562b2b7dU, 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U,
74d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xec76769aU, 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
75d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 0x41adadecU,
76d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 0x239c9cbfU, 0x53a4a4f7U,
77d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe4727296U, 0x9bc0c05bU, 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU,
78d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4c26266aU, 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
79d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 0xe2717193U,
80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xabd8d873U, 0x62313153U, 0x2a15153fU, 0x0804040cU, 0x95c7c752U,
81d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x46232365U, 0x9dc3c35eU, 0x30181828U, 0x379696a1U, 0x0a05050fU,
82d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2f9a9ab5U, 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
83d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 0x1209091bU,
84d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 0x361b1b2dU, 0xdc6e6eb2U,
85d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb45a5aeeU, 0x5ba0a0fbU, 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U,
86d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x7db3b3ceU, 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
87d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 0x40202060U,
88d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 0xd46a6abeU, 0x8dcbcb46U,
89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x67bebed9U, 0x7239394bU, 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U,
90d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x85cfcf4aU, 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
91d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 0x8a4545cfU,
92d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 0xa05050f0U, 0x783c3c44U,
93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x259f9fbaU, 0x4ba8a8e3U, 0xa25151f3U, 0x5da3a3feU, 0x804040c0U,
94d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x058f8f8aU, 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
95d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 0x20101030U,
96d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 0x81cdcd4cU, 0x180c0c14U,
97d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x26131335U, 0xc3ecec2fU, 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU,
98d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2e171739U, 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
99d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 0xc06060a0U,
100d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 0x44222266U, 0x542a2a7eU,
101d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x3b9090abU, 0x0b888883U, 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U,
102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2814143cU, 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 0x924949dbU,
104d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 0x9fc2c25dU, 0xbdd3d36eU,
105d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x43acacefU, 0xc46262a6U, 0x399191a8U, 0x319595a4U, 0xd3e4e437U,
106d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf279798bU, 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
107d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 0xd86c6cb4U,
108d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 0xca6565afU, 0xf47a7a8eU,
109d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x47aeaee9U, 0x10080818U, 0x6fbabad5U, 0xf0787888U, 0x4a25256fU,
110d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5c2e2e72U, 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
111d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 0x964b4bddU,
112d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 0xe0707090U, 0x7c3e3e42U,
113d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x71b5b5c4U, 0xcc6666aaU, 0x904848d8U, 0x06030305U, 0xf7f6f601U,
114d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1c0e0e12U, 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
115d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 0xd9e1e138U,
116d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xebf8f813U, 0x2b9898b3U, 0x22111133U, 0xd26969bbU, 0xa9d9d970U,
117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x078e8e89U, 0x339494a7U, 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U,
118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc9e9e920U, 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
119d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 0x65bfbfdaU,
120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 0x824141c3U, 0x299999b0U,
121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5a2d2d77U, 0x1e0f0f11U, 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U,
122d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2c16163aU, };
123d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
124d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t Te1[256] = {
125d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 0x0dfff2f2U,
126d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 0x50603030U, 0x03020101U,
127d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xa9ce6767U, 0x7d562b2bU, 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU,
128d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9aec7676U, 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 0xec41adadU,
130d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 0xbf239c9cU, 0xf753a4a4U,
131d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x96e47272U, 0x5b9bc0c0U, 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U,
132d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6a4c2626U, 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
133d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 0x93e27171U,
134d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 0x0c080404U, 0x5295c7c7U,
135d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x65462323U, 0x5e9dc3c3U, 0x28301818U, 0xa1379696U, 0x0f0a0505U,
136d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb52f9a9aU, 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 0x1b120909U,
138d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 0x2d361b1bU, 0xb2dc6e6eU,
139d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xeeb45a5aU, 0xfb5ba0a0U, 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U,
140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xce7db3b3U, 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 0x60402020U,
142d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 0xbed46a6aU, 0x468dcbcbU,
143d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd967bebeU, 0x4b723939U, 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U,
144d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4a85cfcfU, 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
145d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 0xcf8a4545U,
146d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 0xf0a05050U, 0x44783c3cU,
147d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xba259f9fU, 0xe34ba8a8U, 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U,
148d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8a058f8fU, 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
149d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 0x30201010U,
150d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 0x4c81cdcdU, 0x14180c0cU,
151d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x35261313U, 0x2fc3ececU, 0xe1be5f5fU, 0xa2359797U, 0xcc884444U,
152d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x392e1717U, 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
153d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 0xa0c06060U,
154d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 0x66442222U, 0x7e542a2aU,
155d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xab3b9090U, 0x830b8888U, 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U,
156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x3c281414U, 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
157d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 0xdb924949U,
158d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 0x5d9fc2c2U, 0x6ebdd3d3U,
159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xef43acacU, 0xa6c46262U, 0xa8399191U, 0xa4319595U, 0x37d3e4e4U,
160d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8bf27979U, 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
161d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 0xb4d86c6cU,
162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 0xafca6565U, 0x8ef47a7aU,
163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe947aeaeU, 0x18100808U, 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U,
164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x725c2e2eU, 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
165d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 0xdd964b4bU,
166d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 0x90e07070U, 0x427c3e3eU,
167d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc471b5b5U, 0xaacc6666U, 0xd8904848U, 0x05060303U, 0x01f7f6f6U,
168d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x121c0e0eU, 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
169d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 0x38d9e1e1U,
170d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 0xbbd26969U, 0x70a9d9d9U,
171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x89078e8eU, 0xa7339494U, 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U,
172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x20c9e9e9U, 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
173d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 0xda65bfbfU,
174d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 0xc3824141U, 0xb0299999U,
175d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x775a2d2dU, 0x111e0f0fU, 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU,
176d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x3a2c1616U, };
177d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
178d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t Te2[256] = {
179d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 0xf20dfff2U,
180d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 0x30506030U, 0x01030201U,
181d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x67a9ce67U, 0x2b7d562bU, 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU,
182d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x769aec76U, 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
183d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 0xadec41adU,
184d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 0x9cbf239cU, 0xa4f753a4U,
185d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x7296e472U, 0xc05b9bc0U, 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U,
186d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x266a4c26U, 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
187d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 0x7193e271U,
188d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd873abd8U, 0x31536231U, 0x153f2a15U, 0x040c0804U, 0xc75295c7U,
189d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x23654623U, 0xc35e9dc3U, 0x18283018U, 0x96a13796U, 0x050f0a05U,
190d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9ab52f9aU, 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
191d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 0x091b1209U,
192d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 0x1b2d361bU, 0x6eb2dc6eU,
193d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5aeeb45aU, 0xa0fb5ba0U, 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U,
194d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb3ce7db3U, 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
195d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 0x20604020U,
196d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 0x6abed46aU, 0xcb468dcbU,
197d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbed967beU, 0x394b7239U, 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U,
198d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcf4a85cfU, 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
199d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 0x45cf8a45U,
200d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 0x50f0a050U, 0x3c44783cU,
201d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9fba259fU, 0xa8e34ba8U, 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U,
202d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8f8a058fU, 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
203d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 0x10302010U,
204d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 0xcd4c81cdU, 0x0c14180cU,
205d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x13352613U, 0xec2fc3ecU, 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U,
206d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x17392e17U, 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
207d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 0x60a0c060U,
208d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 0x22664422U, 0x2a7e542aU,
209d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x90ab3b90U, 0x88830b88U, 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U,
210d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x143c2814U, 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
211d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 0x49db9249U,
212d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 0xc25d9fc2U, 0xd36ebdd3U,
213d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xacef43acU, 0x62a6c462U, 0x91a83991U, 0x95a43195U, 0xe437d3e4U,
214d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x798bf279U, 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
215d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 0x6cb4d86cU,
216d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 0x65afca65U, 0x7a8ef47aU,
217d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xaee947aeU, 0x08181008U, 0xbad56fbaU, 0x7888f078U, 0x256f4a25U,
218d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2e725c2eU, 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
219d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 0x4bdd964bU,
220d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 0x7090e070U, 0x3e427c3eU,
221d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb5c471b5U, 0x66aacc66U, 0x48d89048U, 0x03050603U, 0xf601f7f6U,
222d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0e121c0eU, 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
223d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 0xe138d9e1U,
224d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf813ebf8U, 0x98b32b98U, 0x11332211U, 0x69bbd269U, 0xd970a9d9U,
225d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8e89078eU, 0x94a73394U, 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U,
226d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe920c9e9U, 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
227d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 0xbfda65bfU,
228d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 0x41c38241U, 0x99b02999U,
229d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2d775a2dU, 0x0f111e0fU, 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU,
230d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x163a2c16U, };
231d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
232d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t Te3[256] = {
233d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 0xf2f20dffU,
234d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 0x30305060U, 0x01010302U,
235d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6767a9ceU, 0x2b2b7d56U, 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU,
236d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x76769aecU, 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
237d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 0xadadec41U,
238d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 0x9c9cbf23U, 0xa4a4f753U,
239d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x727296e4U, 0xc0c05b9bU, 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU,
240d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x26266a4cU, 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
241d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 0x717193e2U,
242d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd8d873abU, 0x31315362U, 0x15153f2aU, 0x04040c08U, 0xc7c75295U,
243d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x23236546U, 0xc3c35e9dU, 0x18182830U, 0x9696a137U, 0x05050f0aU,
244d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9a9ab52fU, 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
245d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 0x09091b12U,
246d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 0x1b1b2d36U, 0x6e6eb2dcU,
247d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5a5aeeb4U, 0xa0a0fb5bU, 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U,
248d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb3b3ce7dU, 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
249d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 0x20206040U,
250d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 0x6a6abed4U, 0xcbcb468dU,
251d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbebed967U, 0x39394b72U, 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U,
252d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcfcf4a85U, 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
253d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 0x4545cf8aU,
254d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 0x5050f0a0U, 0x3c3c4478U,
255d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9f9fba25U, 0xa8a8e34bU, 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U,
256d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8f8f8a05U, 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
257d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 0x10103020U,
258d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 0xcdcd4c81U, 0x0c0c1418U,
259d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x13133526U, 0xecec2fc3U, 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U,
260d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1717392eU, 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
261d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 0x6060a0c0U,
262d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 0x22226644U, 0x2a2a7e54U,
263d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9090ab3bU, 0x8888830bU, 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU,
264d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x14143c28U, 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
265d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 0x4949db92U,
266d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 0xc2c25d9fU, 0xd3d36ebdU,
267d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xacacef43U, 0x6262a6c4U, 0x9191a839U, 0x9595a431U, 0xe4e437d3U,
268d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x79798bf2U, 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
269d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 0x6c6cb4d8U,
270d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 0x6565afcaU, 0x7a7a8ef4U,
271d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xaeaee947U, 0x08081810U, 0xbabad56fU, 0x787888f0U, 0x25256f4aU,
272d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2e2e725cU, 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
273d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 0x4b4bdd96U,
274d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 0x707090e0U, 0x3e3e427cU,
275d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb5b5c471U, 0x6666aaccU, 0x4848d890U, 0x03030506U, 0xf6f601f7U,
276d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0e0e121cU, 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
277d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 0xe1e138d9U,
278d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf8f813ebU, 0x9898b32bU, 0x11113322U, 0x6969bbd2U, 0xd9d970a9U,
279d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8e8e8907U, 0x9494a733U, 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U,
280d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe9e920c9U, 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
281d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 0xbfbfda65U,
282d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 0x4141c382U, 0x9999b029U,
283d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2d2d775aU, 0x0f0f111eU, 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU,
284d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x16163a2cU, };
285d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
286d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t Td0[256] = {
287d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 0x3bab6bcbU,
288d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 0x2030fa55U, 0xad766df6U,
289d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x88cc7691U, 0xf5024c25U, 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U,
290d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb562a38fU, 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
291d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 0x038f5fe7U,
292d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x15929c95U, 0xbf6d7aebU, 0x955259daU, 0xd4be832dU, 0x587421d3U,
293d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x49e06929U, 0x8ec9c844U, 0x75c2896aU, 0xf48e7978U, 0x99583e6bU,
294d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x27b971ddU, 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
295d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 0xb16477e0U,
296d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 0x70486858U, 0x8f45fd19U,
297d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x94de6c87U, 0x527bf8b7U, 0xab73d323U, 0x724b02e2U, 0xe31f8f57U,
298d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6655ab2aU, 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
299d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 0x8acf1c2bU,
300d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 0x65daf4cdU, 0x0605bed5U,
301d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd134621fU, 0xc4a6fe8aU, 0x342e539dU, 0xa2f355a0U, 0x058ae132U,
302d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xa4f6eb75U, 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
303d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 0x91548db5U,
304d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x71c45d05U, 0x0406d46fU, 0x605015ffU, 0x1998fb24U, 0xd6bde997U,
305d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x894043ccU, 0x67d99e77U, 0xb0e842bdU, 0x07898b88U, 0xe7195b38U,
306d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x79c8eedbU, 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
307d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 0xfd0efffbU,
308d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0f853856U, 0x3daed51eU, 0x362d3927U, 0x0a0fd964U, 0x685ca621U,
309d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9b5b54d1U, 0x24362e3aU, 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U,
310d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1b9b919eU, 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
311d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 0x0e090d0bU,
312d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 0x57f11985U, 0xaf75074cU,
313d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xee99ddbbU, 0xa37f60fdU, 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U,
314d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5bfb7e34U, 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
315d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 0x854a247dU,
316d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 0x1d9e2f4bU, 0xdcb230f3U,
317d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0d8652ecU, 0x77c1e3d0U, 0x2bb3166cU, 0xa970b999U, 0x119448faU,
318d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x47e96422U, 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
319d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 0xa6f581cfU,
320d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 0x2c3a9de4U, 0x5078920dU,
321d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6a5fcc9bU, 0x547e4662U, 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU,
322d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x82c3aff5U, 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
323d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 0xcd267809U,
324d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 0xe6956e65U, 0xaaffe67eU,
325d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x21bccf08U, 0xef15e8e6U, 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U,
326d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x29b07cd6U, 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
327d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 0xf104984aU,
328d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 0x764dd68dU, 0x43efb04dU,
329d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xccaa4d54U, 0xe49604dfU, 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U,
330d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4665517fU, 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
331d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 0x9ad7618cU,
332d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 0xcea927eeU, 0xb761c935U,
333d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe11ce5edU, 0x7a47b13cU, 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U,
334d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x73c737bfU, 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
335d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 0x161dc372U,
336d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbce2250cU, 0x283c498bU, 0xff0d9541U, 0x39a80171U, 0x080cb3deU,
337d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd8b4e49cU, 0x6456c190U, 0x7bcb8461U, 0xd532b670U, 0x486c5c74U,
338d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd0b85742U, };
339d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
340d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t Td1[256] = {
341d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 0xcb3bab6bU,
342d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf11f9d45U, 0xabacfa58U, 0x934be303U, 0x552030faU, 0xf6ad766dU,
343d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9188cc76U, 0x25f5024cU, 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U,
344d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8fb562a3U, 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
345d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 0xe7038f5fU,
346d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9515929cU, 0xebbf6d7aU, 0xda955259U, 0x2dd4be83U, 0xd3587421U,
347d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2949e069U, 0x448ec9c8U, 0x6a75c289U, 0x78f48e79U, 0x6b99583eU,
348d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xdd27b971U, 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
349d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 0xe0b16477U,
350d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 0x58704868U, 0x198f45fdU,
351d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8794de6cU, 0xb7527bf8U, 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU,
352d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2a6655abU, 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
353d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 0x2b8acf1cU,
354d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 0xcd65daf4U, 0xd50605beU,
355d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1fd13462U, 0x8ac4a6feU, 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U,
356d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x75a4f6ebU, 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
357d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 0xb591548dU,
358d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0571c45dU, 0x6f0406d4U, 0xff605015U, 0x241998fbU, 0x97d6bde9U,
359d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcc894043U, 0x7767d99eU, 0xbdb0e842U, 0x8807898bU, 0x38e7195bU,
360d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xdb79c8eeU, 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
361d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 0xfbfd0effU,
362d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x560f8538U, 0x1e3daed5U, 0x27362d39U, 0x640a0fd9U, 0x21685ca6U,
363d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd19b5b54U, 0x3a24362eU, 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U,
364d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9e1b9b91U, 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
365d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 0x0b0e090dU,
366d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 0x8557f119U, 0x4caf7507U,
367d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbbee99ddU, 0xfda37f60U, 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU,
368d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x345bfb7eU, 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
369d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 0x7d854a24U,
370d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 0x4b1d9e2fU, 0xf3dcb230U,
371d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xec0d8652U, 0xd077c1e3U, 0x6c2bb316U, 0x99a970b9U, 0xfa119448U,
372d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2247e964U, 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
373d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 0xcfa6f581U,
374d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 0xe42c3a9dU, 0x0d507892U,
375d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9b6a5fccU, 0x62547e46U, 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U,
376d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf582c3afU, 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
377d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 0x09cd2678U,
378d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 0x65e6956eU, 0x7eaaffe6U,
379d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0821bccfU, 0xe6ef15e8U, 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U,
380d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xd629b07cU, 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
381d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 0x4af10498U,
382d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 0x8d764dd6U, 0x4d43efb0U,
383d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x54ccaa4dU, 0xdfe49604U, 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU,
384d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x7f466551U, 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
385d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 0x8c9ad761U,
386d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 0xeecea927U, 0x35b761c9U,
387d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xede11ce5U, 0x3c7a47b1U, 0x599cd2dfU, 0x3f55f273U, 0x791814ceU,
388d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbf73c737U, 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
389d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 0x72161dc3U,
390d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 0x7139a801U, 0xde080cb3U,
391d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9cd8b4e4U, 0x906456c1U, 0x617bcb84U, 0x70d532b6U, 0x74486c5cU,
392d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x42d0b857U, };
393d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
394d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t Td2[256] = {
395d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 0x6bcb3babU,
396d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 0xfa552030U, 0x6df6ad76U,
397d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x769188ccU, 0x4c25f502U, 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U,
398d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xa38fb562U, 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
399d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 0x5fe7038fU,
400d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 0x832dd4beU, 0x21d35874U,
401d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x692949e0U, 0xc8448ec9U, 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U,
402d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x71dd27b9U, 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
403d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 0x77e0b164U,
404d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 0x68587048U, 0xfd198f45U,
405d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6c8794deU, 0xf8b7527bU, 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU,
406d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xab2a6655U, 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
407d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 0x1c2b8acfU,
408d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 0xf4cd65daU, 0xbed50605U,
409d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x621fd134U, 0xfe8ac4a6U, 0x539d342eU, 0x55a0a2f3U, 0xe132058aU,
410d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xeb75a4f6U, 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
411d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 0x8db59154U,
412d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 0xfb241998U, 0xe997d6bdU,
413d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x43cc8940U, 0x9e7767d9U, 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U,
414d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xeedb79c8U, 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
415d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 0xfffbfd0eU,
416d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x38560f85U, 0xd51e3daeU, 0x3927362dU, 0xd9640a0fU, 0xa621685cU,
417d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x54d19b5bU, 0x2e3a2436U, 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU,
418d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x919e1b9bU, 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
419d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 0x0d0b0e09U,
420d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 0x198557f1U, 0x074caf75U,
421d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xddbbee99U, 0x60fda37fU, 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U,
422d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x7e345bfbU, 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
423d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 0x247d854aU,
424d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 0x2f4b1d9eU, 0x30f3dcb2U,
425d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x52ec0d86U, 0xe3d077c1U, 0x166c2bb3U, 0xb999a970U, 0x48fa1194U,
426d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x642247e9U, 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
427d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 0x81cfa6f5U,
428d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 0x9de42c3aU, 0x920d5078U,
429d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcc9b6a5fU, 0x4662547eU, 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U,
430d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xaff582c3U, 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
431d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 0x7809cd26U,
432d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 0x6e65e695U, 0xe67eaaffU,
433d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcf0821bcU, 0xe8e6ef15U, 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU,
434d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x7cd629b0U, 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
435d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 0x984af104U,
436d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 0xd68d764dU, 0xb04d43efU,
437d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4d54ccaaU, 0x04dfe496U, 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU,
438d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x517f4665U, 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
439d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 0x618c9ad7U,
440d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 0x27eecea9U, 0xc935b761U,
441d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe5ede11cU, 0xb13c7a47U, 0xdf599cd2U, 0x733f55f2U, 0xce791814U,
442d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x37bf73c7U, 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
443d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 0xc372161dU,
444d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 0x017139a8U, 0xb3de080cU,
445d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe49cd8b4U, 0xc1906456U, 0x84617bcbU, 0xb670d532U, 0x5c74486cU,
446d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5742d0b8U, };
447d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
448d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t Td3[256] = {
449d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 0xab6bcb3bU,
450d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 0x30fa5520U, 0x766df6adU,
451d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xcc769188U, 0x024c25f5U, 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U,
452d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x62a38fb5U, 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
453d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 0x8f5fe703U,
454d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 0xbe832dd4U, 0x7421d358U,
455d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe0692949U, 0xc9c8448eU, 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U,
456d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb971dd27U, 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
457d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 0x6477e0b1U,
458d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 0x48685870U, 0x45fd198fU,
459d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xde6c8794U, 0x7bf8b752U, 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U,
460d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x55ab2a66U, 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
461d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 0xcf1c2b8aU,
462d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 0xdaf4cd65U, 0x05bed506U,
463d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x34621fd1U, 0xa6fe8ac4U, 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U,
464d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf6eb75a4U, 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
465d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 0x548db591U,
466d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 0x98fb2419U, 0xbde997d6U,
467d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4043cc89U, 0xd99e7767U, 0xe842bdb0U, 0x898b8807U, 0x195b38e7U,
468d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc8eedb79U, 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
469d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 0x0efffbfdU,
470d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8538560fU, 0xaed51e3dU, 0x2d392736U, 0x0fd9640aU, 0x5ca62168U,
471d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5b54d19bU, 0x362e3a24U, 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U,
472d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9b919e1bU, 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
473d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 0x090d0b0eU,
474d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 0xf1198557U, 0x75074cafU,
475d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x99ddbbeeU, 0x7f60fda3U, 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U,
476d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xfb7e345bU, 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
477d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 0x4a247d85U,
478d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 0x9e2f4b1dU, 0xb230f3dcU,
479d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x8652ec0dU, 0xc1e3d077U, 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U,
480d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe9642247U, 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
481d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 0xf581cfa6U,
482d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 0x3a9de42cU, 0x78920d50U,
483d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5fcc9b6aU, 0x7e466254U, 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU,
484d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc3aff582U, 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
485d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 0x267809cdU,
486d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 0x956e65e6U, 0xffe67eaaU,
487d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xbccf0821U, 0x15e8e6efU, 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU,
488d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb07cd629U, 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
489d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 0x04984af1U,
490d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 0x4dd68d76U, 0xefb04d43U,
491d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xaa4d54ccU, 0x9604dfe4U, 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U,
492d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x65517f46U, 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
493d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 0xd7618c9aU,
494d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 0xa927eeceU, 0x61c935b7U,
495d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x1ce5ede1U, 0x47b13c7aU, 0xd2df599cU, 0xf2733f55U, 0x14ce7918U,
496d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc737bf73U, 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
497d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 0x1dc37216U,
498d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 0xa8017139U, 0x0cb3de08U,
499d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb4e49cd8U, 0x56c19064U, 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U,
500d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb85742d0U, };
501d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
502d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint8_t Td4[256] = {
503d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, 0xbfU, 0x40U, 0xa3U,
504d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU,
505d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xffU, 0x87U, 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, 0x54U,
506d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, 0xeeU, 0x4cU, 0x95U, 0x0bU,
507d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x42U, 0xfaU, 0xc3U, 0x4eU, 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U,
508d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb2U, 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, 0x72U, 0xf8U,
509d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU,
510d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x65U, 0xb6U, 0x92U, 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
511d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, 0x90U, 0xd8U, 0xabU,
512d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U,
513d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x45U, 0x06U, 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, 0xc1U,
514d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, 0x3aU, 0x91U, 0x11U, 0x41U,
515d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x4fU, 0x67U, 0xdcU, 0xeaU, 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U,
516d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x73U, 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, 0xe2U, 0xf9U,
517d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU,
518d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x29U, 0xc5U, 0x89U, 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
519d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, 0x9aU, 0xdbU, 0xc0U,
520d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U,
521d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xc7U, 0x31U, 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, 0x60U,
522d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, 0x2dU, 0xe5U, 0x7aU, 0x9fU,
523d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x93U, 0xc9U, 0x9cU, 0xefU, 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U,
524d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0xb0U, 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, 0x17U, 0x2bU,
525d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U,
526d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x21U, 0x0cU, 0x7dU, };
527d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
528d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t rcon[] = {
529d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
530d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000,
531d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
532d9e397b599b13d642138480a28c14db7a136bf0Adam Langley};
533d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
534d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint AES_set_encrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey) {
535d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t *rk;
536d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int i = 0;
537d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t temp;
538d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
539d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (!key || !aeskey) {
540d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    return -1;
541d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
542d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
543d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  switch (bits) {
544d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    case 128:
545d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      aeskey->rounds = 10;
546d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      break;
547d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    case 192:
548d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      aeskey->rounds = 12;
549d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      break;
550d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    case 256:
551d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      aeskey->rounds = 14;
552d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      break;
553d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    default:
554d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      return -2;
555d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
556d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
557d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk = aeskey->rd_key;
558d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
559d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk[0] = GETU32(key);
560d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk[1] = GETU32(key + 4);
561d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk[2] = GETU32(key + 8);
562d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk[3] = GETU32(key + 12);
563d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (bits == 128) {
564d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    while (1) {
565d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      temp = rk[3];
566d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[4] = rk[0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
567d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
568d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (Te0[(temp) & 0xff] & 0x0000ff00) ^
569d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (Te1[(temp >> 24)] & 0x000000ff) ^ rcon[i];
570d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[5] = rk[1] ^ rk[4];
571d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[6] = rk[2] ^ rk[5];
572d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[7] = rk[3] ^ rk[6];
573d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      if (++i == 10) {
574d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        return 0;
575d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      }
576d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk += 4;
577d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
578d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
579d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk[4] = GETU32(key + 16);
580d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk[5] = GETU32(key + 20);
581d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (bits == 192) {
582d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    while (1) {
583d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      temp = rk[5];
584d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[6] = rk[0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
585d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
586d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (Te0[(temp) & 0xff] & 0x0000ff00) ^
587d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (Te1[(temp >> 24)] & 0x000000ff) ^ rcon[i];
588d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[7] = rk[1] ^ rk[6];
589d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[8] = rk[2] ^ rk[7];
590d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[9] = rk[3] ^ rk[8];
591d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      if (++i == 8) {
592d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        return 0;
593d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      }
594d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[10] = rk[4] ^ rk[9];
595d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[11] = rk[5] ^ rk[10];
596d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk += 6;
597d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
598d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
599d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk[6] = GETU32(key + 24);
600d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk[7] = GETU32(key + 28);
601d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (bits == 256) {
602d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    while (1) {
603d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      temp = rk[7];
604d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[8] = rk[0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
605d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
606d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (Te0[(temp) & 0xff] & 0x0000ff00) ^
607d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (Te1[(temp >> 24)] & 0x000000ff) ^ rcon[i];
608d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[9] = rk[1] ^ rk[8];
609d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[10] = rk[2] ^ rk[9];
610d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[11] = rk[3] ^ rk[10];
611d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      if (++i == 7) {
612d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        return 0;
613d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      }
614d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      temp = rk[11];
615d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[12] = rk[4] ^ (Te2[(temp >> 24)] & 0xff000000) ^
616d9e397b599b13d642138480a28c14db7a136bf0Adam Langley               (Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^
617d9e397b599b13d642138480a28c14db7a136bf0Adam Langley               (Te0[(temp >> 8) & 0xff] & 0x0000ff00) ^
618d9e397b599b13d642138480a28c14db7a136bf0Adam Langley               (Te1[(temp) & 0xff] & 0x000000ff);
619d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[13] = rk[5] ^ rk[12];
620d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[14] = rk[6] ^ rk[13];
621d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk[15] = rk[7] ^ rk[14];
622d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
623d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      rk += 8;
624d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
625d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
626d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  return 0;
627d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
628d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
629d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint AES_set_decrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey) {
630d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t *rk;
631d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int i, j, status;
632d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t temp;
633d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
634d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* first, start with an encryption schedule */
635d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  status = AES_set_encrypt_key(key, bits, aeskey);
636d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (status < 0) {
637d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    return status;
638d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
639d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
640d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk = aeskey->rd_key;
641d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
642d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* invert the order of the round keys: */
643d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  for (i = 0, j = 4 * aeskey->rounds; i < j; i += 4, j -= 4) {
644d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    temp = rk[i];
645d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[i] = rk[j];
646d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[j] = temp;
647d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    temp = rk[i + 1];
648d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[i + 1] = rk[j + 1];
649d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[j + 1] = temp;
650d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    temp = rk[i + 2];
651d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[i + 2] = rk[j + 2];
652d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[j + 2] = temp;
653d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    temp = rk[i + 3];
654d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[i + 3] = rk[j + 3];
655d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[j + 3] = temp;
656d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
657d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* apply the inverse MixColumn transform to all round keys but the first and
658d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * the last: */
659d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  for (i = 1; i < (int)aeskey->rounds; i++) {
660d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk += 4;
661d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[0] =
662d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        Td0[Te1[(rk[0] >> 24)] & 0xff] ^ Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^
663d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        Td2[Te1[(rk[0] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[0]) & 0xff] & 0xff];
664d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[1] =
665d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        Td0[Te1[(rk[1] >> 24)] & 0xff] ^ Td1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^
666d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        Td2[Te1[(rk[1] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[1]) & 0xff] & 0xff];
667d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[2] =
668d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        Td0[Te1[(rk[2] >> 24)] & 0xff] ^ Td1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^
669d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        Td2[Te1[(rk[2] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[2]) & 0xff] & 0xff];
670d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk[3] =
671d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        Td0[Te1[(rk[3] >> 24)] & 0xff] ^ Td1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^
672d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        Td2[Te1[(rk[3] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[3]) & 0xff] & 0xff];
673d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
674d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  return 0;
675d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
676d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
677d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid AES_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
678d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint32_t *rk;
679d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
680d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#ifndef FULL_UNROLL
681d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int r;
682d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif /* ?FULL_UNROLL */
683d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
684d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  assert(in && out && key);
685d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk = key->rd_key;
686d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
687d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* map byte array block to cipher state
688d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * and add initial round key: */
689d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = GETU32(in) ^ rk[0];
690d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = GETU32(in + 4) ^ rk[1];
691d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = GETU32(in + 8) ^ rk[2];
692d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = GETU32(in + 12) ^ rk[3];
693d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#ifdef FULL_UNROLL
694d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 1: */
695d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
696d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s3 & 0xff] ^ rk[4];
697d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
698d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s0 & 0xff] ^ rk[5];
699d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
700d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s1 & 0xff] ^ rk[6];
701d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
702d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s2 & 0xff] ^ rk[7];
703d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 2: */
704d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
705d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t3 & 0xff] ^ rk[8];
706d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
707d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t0 & 0xff] ^ rk[9];
708d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
709d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t1 & 0xff] ^ rk[10];
710d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
711d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t2 & 0xff] ^ rk[11];
712d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 3: */
713d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
714d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s3 & 0xff] ^ rk[12];
715d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
716d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s0 & 0xff] ^ rk[13];
717d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
718d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s1 & 0xff] ^ rk[14];
719d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
720d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s2 & 0xff] ^ rk[15];
721d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 4: */
722d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
723d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t3 & 0xff] ^ rk[16];
724d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
725d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t0 & 0xff] ^ rk[17];
726d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
727d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t1 & 0xff] ^ rk[18];
728d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
729d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t2 & 0xff] ^ rk[19];
730d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 5: */
731d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
732d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s3 & 0xff] ^ rk[20];
733d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
734d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s0 & 0xff] ^ rk[21];
735d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
736d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s1 & 0xff] ^ rk[22];
737d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
738d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s2 & 0xff] ^ rk[23];
739d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 6: */
740d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
741d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t3 & 0xff] ^ rk[24];
742d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
743d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t0 & 0xff] ^ rk[25];
744d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
745d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t1 & 0xff] ^ rk[26];
746d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
747d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t2 & 0xff] ^ rk[27];
748d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 7: */
749d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
750d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s3 & 0xff] ^ rk[28];
751d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
752d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s0 & 0xff] ^ rk[29];
753d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
754d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s1 & 0xff] ^ rk[30];
755d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
756d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s2 & 0xff] ^ rk[31];
757d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 8: */
758d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
759d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t3 & 0xff] ^ rk[32];
760d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
761d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t0 & 0xff] ^ rk[33];
762d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
763d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t1 & 0xff] ^ rk[34];
764d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
765d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[t2 & 0xff] ^ rk[35];
766d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 9: */
767d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
768d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s3 & 0xff] ^ rk[36];
769d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
770d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s0 & 0xff] ^ rk[37];
771d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
772d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s1 & 0xff] ^ rk[38];
773d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
774d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Te3[s2 & 0xff] ^ rk[39];
775d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (key->rounds > 10) {
776d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    /* round 10: */
777d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
778d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[t3 & 0xff] ^ rk[40];
779d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
780d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[t0 & 0xff] ^ rk[41];
781d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
782d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[t1 & 0xff] ^ rk[42];
783d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
784d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[t2 & 0xff] ^ rk[43];
785d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    /* round 11: */
786d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
787d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[s3 & 0xff] ^ rk[44];
788d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
789d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[s0 & 0xff] ^ rk[45];
790d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
791d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[s1 & 0xff] ^ rk[46];
792d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
793d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[s2 & 0xff] ^ rk[47];
794d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (key->rounds > 12) {
795d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      /* round 12: */
796d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
797d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Te3[t3 & 0xff] ^ rk[48];
798d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
799d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Te3[t0 & 0xff] ^ rk[49];
800d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
801d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Te3[t1 & 0xff] ^ rk[50];
802d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
803d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Te3[t2 & 0xff] ^ rk[51];
804d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      /* round 13: */
805d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
806d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Te3[s3 & 0xff] ^ rk[52];
807d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
808d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Te3[s0 & 0xff] ^ rk[53];
809d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
810d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Te3[s1 & 0xff] ^ rk[54];
811d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
812d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Te3[s2 & 0xff] ^ rk[55];
813d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
814d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
815d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk += key->rounds << 2;
816d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#else  /* !FULL_UNROLL */
817d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /*
818d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * Nr - 1 full rounds:
819d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   */
820d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = key->rounds >> 1;
821d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  for (;;) {
822d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t0 = Te0[(s0 >> 24)] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
823d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[(s3) & 0xff] ^ rk[4];
824d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t1 = Te0[(s1 >> 24)] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
825d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[(s0) & 0xff] ^ rk[5];
826d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t2 = Te0[(s2 >> 24)] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
827d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[(s1) & 0xff] ^ rk[6];
828d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t3 = Te0[(s3 >> 24)] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
829d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[(s2) & 0xff] ^ rk[7];
830d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
831d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk += 8;
832d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (--r == 0) {
833d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      break;
834d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
835d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
836d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s0 = Te0[(t0 >> 24)] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
837d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[(t3) & 0xff] ^ rk[0];
838d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s1 = Te0[(t1 >> 24)] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
839d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[(t0) & 0xff] ^ rk[1];
840d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s2 = Te0[(t2 >> 24)] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
841d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[(t1) & 0xff] ^ rk[2];
842d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s3 = Te0[(t3 >> 24)] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
843d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Te3[(t2) & 0xff] ^ rk[3];
844d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
845d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif /* ?FULL_UNROLL */
846d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /*  apply last round and map cipher state to byte array block: */
847d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = (Te2[(t0 >> 24)] & 0xff000000) ^ (Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^
848d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       (Te0[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t3) & 0xff] & 0x000000ff) ^
849d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       rk[0];
850d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PUTU32(out, s0);
851d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = (Te2[(t1 >> 24)] & 0xff000000) ^ (Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^
852d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       (Te0[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t0) & 0xff] & 0x000000ff) ^
853d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       rk[1];
854d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PUTU32(out + 4, s1);
855d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = (Te2[(t2 >> 24)] & 0xff000000) ^ (Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^
856d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       (Te0[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t1) & 0xff] & 0x000000ff) ^
857d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       rk[2];
858d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PUTU32(out + 8, s2);
859d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = (Te2[(t3 >> 24)] & 0xff000000) ^ (Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^
860d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       (Te0[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t2) & 0xff] & 0x000000ff) ^
861d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       rk[3];
862d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PUTU32(out + 12, s3);
863d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
864d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
865d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid AES_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
866d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint32_t *rk;
867d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
868d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#ifndef FULL_UNROLL
869d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int r;
870d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif /* ?FULL_UNROLL */
871d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
872d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  assert(in && out && key);
873d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk = key->rd_key;
874d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
875d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* map byte array block to cipher state
876d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * and add initial round key: */
877d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = GETU32(in) ^ rk[0];
878d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = GETU32(in + 4) ^ rk[1];
879d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = GETU32(in + 8) ^ rk[2];
880d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = GETU32(in + 12) ^ rk[3];
881d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#ifdef FULL_UNROLL
882d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 1: */
883d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
884d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s1 & 0xff] ^ rk[4];
885d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
886d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s2 & 0xff] ^ rk[5];
887d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
888d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s3 & 0xff] ^ rk[6];
889d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
890d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s0 & 0xff] ^ rk[7];
891d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 2: */
892d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
893d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t1 & 0xff] ^ rk[8];
894d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
895d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t2 & 0xff] ^ rk[9];
896d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
897d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t3 & 0xff] ^ rk[10];
898d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
899d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t0 & 0xff] ^ rk[11];
900d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 3: */
901d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
902d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s1 & 0xff] ^ rk[12];
903d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
904d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s2 & 0xff] ^ rk[13];
905d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
906d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s3 & 0xff] ^ rk[14];
907d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
908d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s0 & 0xff] ^ rk[15];
909d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 4: */
910d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
911d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t1 & 0xff] ^ rk[16];
912d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
913d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t2 & 0xff] ^ rk[17];
914d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
915d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t3 & 0xff] ^ rk[18];
916d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
917d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t0 & 0xff] ^ rk[19];
918d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 5: */
919d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
920d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s1 & 0xff] ^ rk[20];
921d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
922d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s2 & 0xff] ^ rk[21];
923d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
924d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s3 & 0xff] ^ rk[22];
925d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
926d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s0 & 0xff] ^ rk[23];
927d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 6: */
928d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
929d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t1 & 0xff] ^ rk[24];
930d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
931d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t2 & 0xff] ^ rk[25];
932d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
933d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t3 & 0xff] ^ rk[26];
934d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
935d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t0 & 0xff] ^ rk[27];
936d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 7: */
937d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
938d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s1 & 0xff] ^ rk[28];
939d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
940d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s2 & 0xff] ^ rk[29];
941d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
942d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s3 & 0xff] ^ rk[30];
943d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
944d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s0 & 0xff] ^ rk[31];
945d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 8: */
946d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
947d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t1 & 0xff] ^ rk[32];
948d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
949d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t2 & 0xff] ^ rk[33];
950d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
951d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t3 & 0xff] ^ rk[34];
952d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
953d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[t0 & 0xff] ^ rk[35];
954d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* round 9: */
955d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
956d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s1 & 0xff] ^ rk[36];
957d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
958d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s2 & 0xff] ^ rk[37];
959d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
960d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s3 & 0xff] ^ rk[38];
961d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
962d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       Td3[s0 & 0xff] ^ rk[39];
963d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (key->rounds > 10) {
964d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    /* round 10: */
965d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
966d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[t1 & 0xff] ^ rk[40];
967d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
968d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[t2 & 0xff] ^ rk[41];
969d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
970d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[t3 & 0xff] ^ rk[42];
971d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
972d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[t0 & 0xff] ^ rk[43];
973d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    /* round 11: */
974d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
975d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[s1 & 0xff] ^ rk[44];
976d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
977d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[s2 & 0xff] ^ rk[45];
978d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
979d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[s3 & 0xff] ^ rk[46];
980d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
981d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[s0 & 0xff] ^ rk[47];
982d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (key->rounds > 12) {
983d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      /* round 12: */
984d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
985d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Td3[t1 & 0xff] ^ rk[48];
986d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
987d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Td3[t2 & 0xff] ^ rk[49];
988d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
989d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Td3[t3 & 0xff] ^ rk[50];
990d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
991d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Td3[t0 & 0xff] ^ rk[51];
992d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      /* round 13: */
993d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
994d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Td3[s1 & 0xff] ^ rk[52];
995d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
996d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Td3[s2 & 0xff] ^ rk[53];
997d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
998d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Td3[s3 & 0xff] ^ rk[54];
999d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
1000d9e397b599b13d642138480a28c14db7a136bf0Adam Langley           Td3[s0 & 0xff] ^ rk[55];
1001d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
1002d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
1003d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  rk += key->rounds << 2;
1004d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#else  /* !FULL_UNROLL */
1005d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /*
1006d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * Nr - 1 full rounds:
1007d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   */
1008d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = key->rounds >> 1;
1009d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  for (;;) {
1010d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t0 = Td0[(s0 >> 24)] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
1011d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[(s1) & 0xff] ^ rk[4];
1012d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t1 = Td0[(s1 >> 24)] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
1013d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[(s2) & 0xff] ^ rk[5];
1014d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t2 = Td0[(s2 >> 24)] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
1015d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[(s3) & 0xff] ^ rk[6];
1016d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t3 = Td0[(s3 >> 24)] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
1017d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[(s0) & 0xff] ^ rk[7];
1018d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1019d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    rk += 8;
1020d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (--r == 0) {
1021d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      break;
1022d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
1023d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1024d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s0 = Td0[(t0 >> 24)] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
1025d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[(t1) & 0xff] ^ rk[0];
1026d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s1 = Td0[(t1 >> 24)] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
1027d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[(t2) & 0xff] ^ rk[1];
1028d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s2 = Td0[(t2 >> 24)] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
1029d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[(t3) & 0xff] ^ rk[2];
1030d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s3 = Td0[(t3 >> 24)] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
1031d9e397b599b13d642138480a28c14db7a136bf0Adam Langley         Td3[(t0) & 0xff] ^ rk[3];
1032d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
1033d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif /* ?FULL_UNROLL */
1034d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* apply last round and
1035d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * map cipher state to byte array block: */
1036e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  s0 = ((uint32_t)Td4[(t0 >> 24)] << 24) ^
1037e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t3 >> 16) & 0xff] << 16) ^
1038e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t2 >> 8) & 0xff] << 8) ^
1039e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t1) & 0xff]) ^ rk[0];
1040d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PUTU32(out, s0);
1041e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  s1 = ((uint32_t)Td4[(t1 >> 24)] << 24) ^
1042e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t0 >> 16) & 0xff] << 16) ^
1043e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t3 >> 8) & 0xff] << 8) ^
1044e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t2) & 0xff]) ^ rk[1];
1045d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PUTU32(out + 4, s1);
1046e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  s2 = ((uint32_t)Td4[(t2 >> 24)] << 24) ^
1047e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t1 >> 16) & 0xff] << 16) ^
1048e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t0 >> 8) & 0xff] << 8) ^
1049e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t3) & 0xff]) ^ rk[2];
1050d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PUTU32(out + 8, s2);
1051e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  s3 = ((uint32_t)Td4[(t3 >> 24)] << 24) ^
1052e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t2 >> 16) & 0xff] << 16) ^
1053e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t1 >> 8) & 0xff] << 8) ^
1054e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley       ((uint32_t)Td4[(t0) & 0xff]) ^ rk[3];
1055d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PUTU32(out + 12, s3);
1056d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
1057d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1058d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#else
1059d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1060d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* In this case several functions are provided by asm code. However, one cannot
1061d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * control asm symbol visibility with command line flags and such so they are
1062d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * always hidden and wrapped by these C functions, which can be so
1063d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * controlled. */
1064d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1065d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid asm_AES_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key);
1066d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid AES_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
1067d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  asm_AES_encrypt(in, out, key);
1068d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
1069d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1070d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid asm_AES_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key);
1071d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid AES_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
1072d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  asm_AES_decrypt(in, out, key);
1073d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
1074d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1075d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint asm_AES_set_encrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey);
1076d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint AES_set_encrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey) {
1077d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  return asm_AES_set_encrypt_key(key, bits, aeskey);
1078d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
1079d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1080d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint asm_AES_set_decrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey);
1081d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint AES_set_decrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey) {
1082d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  return asm_AES_set_decrypt_key(key, bits, aeskey);
1083d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
1084d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1085d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif  /* OPENSSL_NO_ASM || (!OPENSSL_X86 && !OPENSSL_X86_64 && !OPENSSL_ARM) */
1086