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