1294336Sdes/* $OpenBSD: rijndael.c,v 1.20 2015/03/16 11:09:52 djm Exp $ */ 269587Sgreen 392555Sdes/** 492555Sdes * rijndael-alg-fst.c 592555Sdes * 692555Sdes * @version 3.0 (December 2000) 792555Sdes * 892555Sdes * Optimised ANSI C code for the Rijndael cipher (now AES) 992555Sdes * 1092555Sdes * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be> 1192555Sdes * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be> 1292555Sdes * @author Paulo Barreto <paulo.barreto@terra.com.br> 1392555Sdes * 1492555Sdes * This code is hereby placed in the public domain. 1592555Sdes * 1692555Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS 1792555Sdes * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 1892555Sdes * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1992555Sdes * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE 2092555Sdes * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2192555Sdes * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2292555Sdes * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2392555Sdes * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2492555Sdes * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2592555Sdes * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 2692555Sdes * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2792555Sdes */ 28294328Sdes 2998941Sdes#include "includes.h" 3098941Sdes 3192555Sdes#include <stdlib.h> 3292555Sdes#include <string.h> 3369587Sgreen 3492555Sdes#include "rijndael.h" 3569587Sgreen 36294328Sdes#undef FULL_UNROLL 3769587Sgreen 3892555Sdes/* 3992555SdesTe0[x] = S [x].[02, 01, 01, 03]; 4092555SdesTe1[x] = S [x].[03, 02, 01, 01]; 4192555SdesTe2[x] = S [x].[01, 03, 02, 01]; 4292555SdesTe3[x] = S [x].[01, 01, 03, 02]; 4369587Sgreen 4492555SdesTd0[x] = Si[x].[0e, 09, 0d, 0b]; 4592555SdesTd1[x] = Si[x].[0b, 0e, 09, 0d]; 4692555SdesTd2[x] = Si[x].[0d, 0b, 0e, 09]; 4792555SdesTd3[x] = Si[x].[09, 0d, 0b, 0e]; 48294332SdesTd4[x] = Si[x].[01]; 4969587Sgreen*/ 5069587Sgreen 5192555Sdesstatic const u32 Te0[256] = { 5292555Sdes 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 5392555Sdes 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 5492555Sdes 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, 5592555Sdes 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, 5692555Sdes 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, 5792555Sdes 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 5892555Sdes 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 5992555Sdes 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, 6092555Sdes 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, 6192555Sdes 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, 6292555Sdes 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 6392555Sdes 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, 6492555Sdes 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, 6592555Sdes 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, 6692555Sdes 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, 6792555Sdes 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 6892555Sdes 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 6992555Sdes 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, 7092555Sdes 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, 7192555Sdes 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, 7292555Sdes 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 7392555Sdes 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 7492555Sdes 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, 7592555Sdes 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, 7692555Sdes 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, 7792555Sdes 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 7892555Sdes 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 7992555Sdes 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, 8092555Sdes 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, 8192555Sdes 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, 8292555Sdes 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 8392555Sdes 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 8492555Sdes 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, 8592555Sdes 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, 8692555Sdes 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, 8792555Sdes 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 8892555Sdes 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 8992555Sdes 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, 9092555Sdes 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, 9192555Sdes 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, 9292555Sdes 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 9392555Sdes 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 9492555Sdes 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, 9592555Sdes 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, 9692555Sdes 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, 9792555Sdes 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 9892555Sdes 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 9992555Sdes 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, 10092555Sdes 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, 10192555Sdes 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, 10292555Sdes 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 10392555Sdes 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 10492555Sdes 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, 10592555Sdes 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, 10692555Sdes 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, 10792555Sdes 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 10892555Sdes 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, 10992555Sdes 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, 11092555Sdes 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, 11192555Sdes 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, 11292555Sdes 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 11392555Sdes 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 11492555Sdes 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, 11592555Sdes 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, 11692555Sdes}; 11792555Sdesstatic const u32 Te1[256] = { 11892555Sdes 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 11992555Sdes 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 12092555Sdes 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, 12192555Sdes 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, 12292555Sdes 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, 12392555Sdes 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 12492555Sdes 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 12592555Sdes 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, 12692555Sdes 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, 12792555Sdes 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, 12892555Sdes 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 12992555Sdes 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 13092555Sdes 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, 13192555Sdes 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, 13292555Sdes 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, 13392555Sdes 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 13492555Sdes 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 13592555Sdes 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, 13692555Sdes 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, 13792555Sdes 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, 13892555Sdes 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 13992555Sdes 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 14092555Sdes 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, 14192555Sdes 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, 14292555Sdes 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, 14392555Sdes 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 14492555Sdes 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 14592555Sdes 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, 14692555Sdes 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, 14792555Sdes 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, 14892555Sdes 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 14992555Sdes 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 15092555Sdes 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, 15192555Sdes 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, 15292555Sdes 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, 15392555Sdes 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 15492555Sdes 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 15592555Sdes 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, 15692555Sdes 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, 15792555Sdes 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, 15892555Sdes 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 15992555Sdes 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 16092555Sdes 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, 16192555Sdes 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, 16292555Sdes 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, 16392555Sdes 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 16492555Sdes 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 16592555Sdes 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, 16692555Sdes 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, 16792555Sdes 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, 16892555Sdes 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 16992555Sdes 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 17092555Sdes 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, 17192555Sdes 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, 17292555Sdes 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, 17392555Sdes 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 17492555Sdes 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 17592555Sdes 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, 17692555Sdes 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, 17792555Sdes 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, 17892555Sdes 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 17992555Sdes 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 18092555Sdes 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, 18192555Sdes 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, 18292555Sdes}; 18392555Sdesstatic const u32 Te2[256] = { 18492555Sdes 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 18592555Sdes 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 18692555Sdes 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, 18792555Sdes 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, 18892555Sdes 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, 18992555Sdes 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 19092555Sdes 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 19192555Sdes 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, 19292555Sdes 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, 19392555Sdes 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, 19492555Sdes 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 19592555Sdes 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, 19692555Sdes 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, 19792555Sdes 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, 19892555Sdes 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, 19992555Sdes 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 20092555Sdes 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 20192555Sdes 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, 20292555Sdes 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, 20392555Sdes 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, 20492555Sdes 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 20592555Sdes 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 20692555Sdes 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, 20792555Sdes 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, 20892555Sdes 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, 20992555Sdes 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 21092555Sdes 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 21192555Sdes 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, 21292555Sdes 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, 21392555Sdes 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, 21492555Sdes 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 21592555Sdes 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 21692555Sdes 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, 21792555Sdes 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, 21892555Sdes 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, 21992555Sdes 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 22092555Sdes 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 22192555Sdes 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, 22292555Sdes 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, 22392555Sdes 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, 22492555Sdes 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 22592555Sdes 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 22692555Sdes 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, 22792555Sdes 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, 22892555Sdes 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, 22992555Sdes 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 23092555Sdes 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 23192555Sdes 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, 23292555Sdes 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, 23392555Sdes 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, 23492555Sdes 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 23592555Sdes 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 23692555Sdes 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, 23792555Sdes 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, 23892555Sdes 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, 23992555Sdes 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 24092555Sdes 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, 24192555Sdes 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, 24292555Sdes 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, 24392555Sdes 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, 24492555Sdes 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 24592555Sdes 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 24692555Sdes 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, 24792555Sdes 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, 24892555Sdes}; 24992555Sdesstatic const u32 Te3[256] = { 25092555Sdes 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 25192555Sdes 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 25292555Sdes 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, 25392555Sdes 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, 25492555Sdes 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, 25592555Sdes 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 25692555Sdes 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 25792555Sdes 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, 25892555Sdes 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, 25992555Sdes 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, 26092555Sdes 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 26192555Sdes 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, 26292555Sdes 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, 26392555Sdes 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, 26492555Sdes 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, 26592555Sdes 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 26692555Sdes 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 26792555Sdes 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, 26892555Sdes 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, 26992555Sdes 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, 27092555Sdes 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 27192555Sdes 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 27292555Sdes 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, 27392555Sdes 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, 27492555Sdes 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, 27592555Sdes 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 27692555Sdes 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 27792555Sdes 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, 27892555Sdes 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, 27992555Sdes 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, 28092555Sdes 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 28192555Sdes 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 28292555Sdes 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, 28392555Sdes 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, 28492555Sdes 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, 28592555Sdes 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 28692555Sdes 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 28792555Sdes 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, 28892555Sdes 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, 28992555Sdes 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, 29092555Sdes 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 29192555Sdes 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 29292555Sdes 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, 29392555Sdes 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, 29492555Sdes 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, 29592555Sdes 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 29692555Sdes 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 29792555Sdes 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, 29892555Sdes 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, 29992555Sdes 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, 30092555Sdes 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 30192555Sdes 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 30292555Sdes 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, 30392555Sdes 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, 30492555Sdes 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, 30592555Sdes 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 30692555Sdes 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, 30792555Sdes 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, 30892555Sdes 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, 30992555Sdes 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, 31092555Sdes 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 31192555Sdes 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 31292555Sdes 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, 31392555Sdes 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, 31492555Sdes}; 315294332Sdes#if 0 31692555Sdesstatic const u32 Td0[256] = { 31792555Sdes 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 31892555Sdes 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 31992555Sdes 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, 32092555Sdes 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, 32192555Sdes 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, 32292555Sdes 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 32392555Sdes 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, 32492555Sdes 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, 32592555Sdes 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, 32692555Sdes 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, 32792555Sdes 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 32892555Sdes 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 32992555Sdes 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, 33092555Sdes 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, 33192555Sdes 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, 33292555Sdes 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 33392555Sdes 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 33492555Sdes 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, 33592555Sdes 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, 33692555Sdes 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, 33792555Sdes 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 33892555Sdes 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, 33992555Sdes 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, 34092555Sdes 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, 34192555Sdes 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, 34292555Sdes 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 34392555Sdes 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, 34492555Sdes 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, 34592555Sdes 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, 34692555Sdes 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, 34792555Sdes 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 34892555Sdes 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 34992555Sdes 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, 35092555Sdes 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, 35192555Sdes 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, 35292555Sdes 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 35392555Sdes 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 35492555Sdes 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, 35592555Sdes 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, 35692555Sdes 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, 35792555Sdes 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 35892555Sdes 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 35992555Sdes 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, 36092555Sdes 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, 36192555Sdes 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, 36292555Sdes 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 36392555Sdes 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 36492555Sdes 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, 36592555Sdes 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, 36692555Sdes 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, 36792555Sdes 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 36892555Sdes 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 36992555Sdes 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, 37092555Sdes 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, 37192555Sdes 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, 37292555Sdes 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 37392555Sdes 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 37492555Sdes 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, 37592555Sdes 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, 37692555Sdes 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, 37792555Sdes 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 37892555Sdes 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, 37992555Sdes 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, 38092555Sdes 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, 38192555Sdes}; 38292555Sdesstatic const u32 Td1[256] = { 38392555Sdes 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 38492555Sdes 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, 38592555Sdes 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, 38692555Sdes 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, 38792555Sdes 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, 38892555Sdes 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 38992555Sdes 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, 39092555Sdes 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, 39192555Sdes 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, 39292555Sdes 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, 39392555Sdes 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 39492555Sdes 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 39592555Sdes 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, 39692555Sdes 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, 39792555Sdes 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, 39892555Sdes 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 39992555Sdes 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 40092555Sdes 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, 40192555Sdes 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, 40292555Sdes 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, 40392555Sdes 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 40492555Sdes 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, 40592555Sdes 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, 40692555Sdes 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, 40792555Sdes 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, 40892555Sdes 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 40992555Sdes 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, 41092555Sdes 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, 41192555Sdes 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, 41292555Sdes 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, 41392555Sdes 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 41492555Sdes 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 41592555Sdes 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, 41692555Sdes 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, 41792555Sdes 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, 41892555Sdes 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 41992555Sdes 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 42092555Sdes 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, 42192555Sdes 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, 42292555Sdes 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, 42392555Sdes 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 42492555Sdes 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 42592555Sdes 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, 42692555Sdes 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, 42792555Sdes 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, 42892555Sdes 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 42992555Sdes 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 43092555Sdes 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, 43192555Sdes 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, 43292555Sdes 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, 43392555Sdes 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 43492555Sdes 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 43592555Sdes 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, 43692555Sdes 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, 43792555Sdes 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, 43892555Sdes 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 43992555Sdes 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 44092555Sdes 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, 44192555Sdes 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, 44292555Sdes 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, 44392555Sdes 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 44492555Sdes 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 44592555Sdes 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, 44692555Sdes 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, 44792555Sdes}; 44892555Sdesstatic const u32 Td2[256] = { 44992555Sdes 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 45092555Sdes 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 45192555Sdes 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, 45292555Sdes 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, 45392555Sdes 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, 45492555Sdes 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 45592555Sdes 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 45692555Sdes 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, 45792555Sdes 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, 45892555Sdes 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, 45992555Sdes 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 46092555Sdes 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 46192555Sdes 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, 46292555Sdes 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, 46392555Sdes 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, 46492555Sdes 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 46592555Sdes 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 46692555Sdes 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, 46792555Sdes 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, 46892555Sdes 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, 46992555Sdes 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 47092555Sdes 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 47192555Sdes 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, 47292555Sdes 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, 47392555Sdes 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, 47492555Sdes 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 47592555Sdes 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, 47692555Sdes 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, 47792555Sdes 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, 47892555Sdes 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, 47992555Sdes 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 48092555Sdes 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 48192555Sdes 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, 48292555Sdes 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, 48392555Sdes 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, 48492555Sdes 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 48592555Sdes 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 48692555Sdes 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, 48792555Sdes 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, 48892555Sdes 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, 48992555Sdes 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 49092555Sdes 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 49192555Sdes 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, 49292555Sdes 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, 49392555Sdes 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, 49492555Sdes 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 49592555Sdes 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 49692555Sdes 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, 49792555Sdes 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, 49892555Sdes 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, 49992555Sdes 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 50092555Sdes 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 50192555Sdes 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, 50292555Sdes 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, 50392555Sdes 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, 50492555Sdes 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 50592555Sdes 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 50692555Sdes 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, 50792555Sdes 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, 50892555Sdes 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, 50992555Sdes 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 51092555Sdes 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 51192555Sdes 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, 51292555Sdes 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, 51392555Sdes}; 51492555Sdesstatic const u32 Td3[256] = { 51592555Sdes 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 51692555Sdes 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 51792555Sdes 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, 51892555Sdes 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, 51992555Sdes 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, 52092555Sdes 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 52192555Sdes 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 52292555Sdes 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, 52392555Sdes 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, 52492555Sdes 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, 52592555Sdes 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 52692555Sdes 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 52792555Sdes 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, 52892555Sdes 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, 52992555Sdes 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, 53092555Sdes 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 53192555Sdes 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 53292555Sdes 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, 53392555Sdes 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, 53492555Sdes 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, 53592555Sdes 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 53692555Sdes 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 53792555Sdes 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, 53892555Sdes 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, 53992555Sdes 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, 54092555Sdes 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 54192555Sdes 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, 54292555Sdes 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, 54392555Sdes 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, 54492555Sdes 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, 54592555Sdes 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 54692555Sdes 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 54792555Sdes 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, 54892555Sdes 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, 54992555Sdes 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, 55092555Sdes 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 55192555Sdes 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 55292555Sdes 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, 55392555Sdes 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, 55492555Sdes 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, 55592555Sdes 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 55692555Sdes 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 55792555Sdes 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, 55892555Sdes 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, 55992555Sdes 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, 56092555Sdes 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 56192555Sdes 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 56292555Sdes 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, 56392555Sdes 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, 56492555Sdes 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, 56592555Sdes 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 56692555Sdes 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 56792555Sdes 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, 56892555Sdes 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, 56992555Sdes 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, 57092555Sdes 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 57192555Sdes 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 57292555Sdes 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, 57392555Sdes 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, 57492555Sdes 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, 57592555Sdes 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 57692555Sdes 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 57792555Sdes 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, 57892555Sdes 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, 57992555Sdes}; 580294332Sdesstatic const u8 Td4[256] = { 581294332Sdes 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, 582294332Sdes 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, 583294332Sdes 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, 584294332Sdes 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, 585294332Sdes 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, 586294332Sdes 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, 587294332Sdes 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, 588294332Sdes 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, 589294332Sdes 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, 590294332Sdes 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, 591294332Sdes 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, 592294332Sdes 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, 593294332Sdes 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, 594294332Sdes 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, 595294332Sdes 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, 596294332Sdes 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, 597294332Sdes 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, 598294332Sdes 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, 599294332Sdes 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, 600294332Sdes 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, 601294332Sdes 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, 602294332Sdes 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, 603294332Sdes 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, 604294332Sdes 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, 605294332Sdes 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, 606294332Sdes 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, 607294332Sdes 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, 608294332Sdes 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, 609294332Sdes 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, 610294332Sdes 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, 611294332Sdes 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, 612294332Sdes 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, 61392555Sdes}; 614294332Sdes#endif 61592555Sdesstatic const u32 rcon[] = { 61692555Sdes 0x01000000, 0x02000000, 0x04000000, 0x08000000, 61792555Sdes 0x10000000, 0x20000000, 0x40000000, 0x80000000, 61892555Sdes 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ 61992555Sdes}; 62069587Sgreen 62192555Sdes#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) 62292555Sdes#define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } 62369587Sgreen 62492555Sdes/** 62592555Sdes * Expand the cipher key into the encryption key schedule. 62692555Sdes * 62792555Sdes * @return the number of rounds for the given cipher key size. 62892555Sdes */ 629294328Sdesint 630294328SdesrijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) 631294328Sdes{ 632294328Sdes int i = 0; 63392555Sdes u32 temp; 63469587Sgreen 63592555Sdes rk[0] = GETU32(cipherKey ); 63692555Sdes rk[1] = GETU32(cipherKey + 4); 63792555Sdes rk[2] = GETU32(cipherKey + 8); 63892555Sdes rk[3] = GETU32(cipherKey + 12); 63992555Sdes if (keyBits == 128) { 64092555Sdes for (;;) { 64192555Sdes temp = rk[3]; 64292555Sdes rk[4] = rk[0] ^ 643294332Sdes (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ 644294332Sdes (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ 645294332Sdes (Te0[(temp ) & 0xff] & 0x0000ff00) ^ 646294332Sdes (Te1[(temp >> 24) ] & 0x000000ff) ^ 64792555Sdes rcon[i]; 64892555Sdes rk[5] = rk[1] ^ rk[4]; 64992555Sdes rk[6] = rk[2] ^ rk[5]; 65092555Sdes rk[7] = rk[3] ^ rk[6]; 65192555Sdes if (++i == 10) { 65292555Sdes return 10; 65392555Sdes } 65492555Sdes rk += 4; 65592555Sdes } 65669587Sgreen } 65792555Sdes rk[4] = GETU32(cipherKey + 16); 65892555Sdes rk[5] = GETU32(cipherKey + 20); 65992555Sdes if (keyBits == 192) { 66092555Sdes for (;;) { 66192555Sdes temp = rk[ 5]; 66292555Sdes rk[ 6] = rk[ 0] ^ 663294332Sdes (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ 664294332Sdes (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ 665294332Sdes (Te0[(temp ) & 0xff] & 0x0000ff00) ^ 666294332Sdes (Te1[(temp >> 24) ] & 0x000000ff) ^ 66792555Sdes rcon[i]; 66892555Sdes rk[ 7] = rk[ 1] ^ rk[ 6]; 66992555Sdes rk[ 8] = rk[ 2] ^ rk[ 7]; 67092555Sdes rk[ 9] = rk[ 3] ^ rk[ 8]; 67192555Sdes if (++i == 8) { 67292555Sdes return 12; 67392555Sdes } 67492555Sdes rk[10] = rk[ 4] ^ rk[ 9]; 67592555Sdes rk[11] = rk[ 5] ^ rk[10]; 67692555Sdes rk += 6; 67792555Sdes } 67869587Sgreen } 67992555Sdes rk[6] = GETU32(cipherKey + 24); 68092555Sdes rk[7] = GETU32(cipherKey + 28); 68192555Sdes if (keyBits == 256) { 68292555Sdes for (;;) { 68392555Sdes temp = rk[ 7]; 68492555Sdes rk[ 8] = rk[ 0] ^ 685294332Sdes (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ 686294332Sdes (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ 687294332Sdes (Te0[(temp ) & 0xff] & 0x0000ff00) ^ 688294332Sdes (Te1[(temp >> 24) ] & 0x000000ff) ^ 68992555Sdes rcon[i]; 69092555Sdes rk[ 9] = rk[ 1] ^ rk[ 8]; 69192555Sdes rk[10] = rk[ 2] ^ rk[ 9]; 69292555Sdes rk[11] = rk[ 3] ^ rk[10]; 693294328Sdes if (++i == 7) { 694294328Sdes return 14; 695294328Sdes } 69692555Sdes temp = rk[11]; 69792555Sdes rk[12] = rk[ 4] ^ 698294332Sdes (Te2[(temp >> 24) ] & 0xff000000) ^ 699294332Sdes (Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^ 700294332Sdes (Te0[(temp >> 8) & 0xff] & 0x0000ff00) ^ 701294332Sdes (Te1[(temp ) & 0xff] & 0x000000ff); 70292555Sdes rk[13] = rk[ 5] ^ rk[12]; 70392555Sdes rk[14] = rk[ 6] ^ rk[13]; 704294328Sdes rk[15] = rk[ 7] ^ rk[14]; 70592555Sdes rk += 8; 70692555Sdes } 70769587Sgreen } 70892555Sdes return 0; 70992555Sdes} 71069587Sgreen 711294332Sdes#if 0 71292555Sdes/** 71392555Sdes * Expand the cipher key into the decryption key schedule. 71492555Sdes * 71592555Sdes * @return the number of rounds for the given cipher key size. 71692555Sdes */ 717294328Sdesint 718294332SdesrijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) 719294328Sdes{ 72092555Sdes int Nr, i, j; 72192555Sdes u32 temp; 72269587Sgreen 723294328Sdes /* expand the cipher key: */ 724294332Sdes Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); 725294328Sdes 72692555Sdes /* invert the order of the round keys: */ 72792555Sdes for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { 72892555Sdes temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; 72992555Sdes temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; 73092555Sdes temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; 73192555Sdes temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; 73292555Sdes } 73392555Sdes /* apply the inverse MixColumn transform to all round keys but the first and the last: */ 73492555Sdes for (i = 1; i < Nr; i++) { 73592555Sdes rk += 4; 73692555Sdes rk[0] = 737294332Sdes Td0[Te1[(rk[0] >> 24) ] & 0xff] ^ 738294332Sdes Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^ 739294332Sdes Td2[Te1[(rk[0] >> 8) & 0xff] & 0xff] ^ 740294332Sdes Td3[Te1[(rk[0] ) & 0xff] & 0xff]; 74192555Sdes rk[1] = 742294332Sdes Td0[Te1[(rk[1] >> 24) ] & 0xff] ^ 743294332Sdes Td1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^ 744294332Sdes Td2[Te1[(rk[1] >> 8) & 0xff] & 0xff] ^ 745294332Sdes Td3[Te1[(rk[1] ) & 0xff] & 0xff]; 74692555Sdes rk[2] = 747294332Sdes Td0[Te1[(rk[2] >> 24) ] & 0xff] ^ 748294332Sdes Td1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^ 749294332Sdes Td2[Te1[(rk[2] >> 8) & 0xff] & 0xff] ^ 750294332Sdes Td3[Te1[(rk[2] ) & 0xff] & 0xff]; 75192555Sdes rk[3] = 752294332Sdes Td0[Te1[(rk[3] >> 24) ] & 0xff] ^ 753294332Sdes Td1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^ 754294332Sdes Td2[Te1[(rk[3] >> 8) & 0xff] & 0xff] ^ 755294332Sdes Td3[Te1[(rk[3] ) & 0xff] & 0xff]; 75692555Sdes } 75792555Sdes return Nr; 75869587Sgreen} 759294332Sdes#endif 76069587Sgreen 761294328Sdesvoid 762294328SdesrijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], 763294328Sdes u8 ct[16]) 764294328Sdes{ 76592555Sdes u32 s0, s1, s2, s3, t0, t1, t2, t3; 76692555Sdes#ifndef FULL_UNROLL 76792555Sdes int r; 76892555Sdes#endif /* ?FULL_UNROLL */ 76969587Sgreen 77092555Sdes /* 77192555Sdes * map byte array block to cipher state 77292555Sdes * and add initial round key: 77392555Sdes */ 77492555Sdes s0 = GETU32(pt ) ^ rk[0]; 77592555Sdes s1 = GETU32(pt + 4) ^ rk[1]; 77692555Sdes s2 = GETU32(pt + 8) ^ rk[2]; 77792555Sdes s3 = GETU32(pt + 12) ^ rk[3]; 77892555Sdes#ifdef FULL_UNROLL 77992555Sdes /* round 1: */ 780294328Sdes t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; 781294328Sdes t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; 782294328Sdes t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; 783294328Sdes t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; 784294328Sdes /* round 2: */ 785294328Sdes s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; 786294328Sdes s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; 787294328Sdes s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; 788294328Sdes s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; 78992555Sdes /* round 3: */ 790294328Sdes t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; 791294328Sdes t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; 792294328Sdes t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; 793294328Sdes t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; 794294328Sdes /* round 4: */ 795294328Sdes s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; 796294328Sdes s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; 797294328Sdes s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; 798294328Sdes s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; 79992555Sdes /* round 5: */ 800294328Sdes t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; 801294328Sdes t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; 802294328Sdes t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; 803294328Sdes t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; 804294328Sdes /* round 6: */ 805294328Sdes s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; 806294328Sdes s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; 807294328Sdes s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; 808294328Sdes s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; 80992555Sdes /* round 7: */ 810294328Sdes t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; 811294328Sdes t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; 812294328Sdes t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; 813294328Sdes t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; 814294328Sdes /* round 8: */ 815294328Sdes s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; 816294328Sdes s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; 817294328Sdes s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; 818294328Sdes s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; 81992555Sdes /* round 9: */ 820294328Sdes t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; 821294328Sdes t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; 822294328Sdes t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; 823294328Sdes t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; 82492555Sdes if (Nr > 10) { 82592555Sdes /* round 10: */ 82692555Sdes s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; 82792555Sdes s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; 82892555Sdes s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; 82992555Sdes s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; 83092555Sdes /* round 11: */ 83192555Sdes t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; 83292555Sdes t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; 83392555Sdes t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; 83492555Sdes t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; 83592555Sdes if (Nr > 12) { 83692555Sdes /* round 12: */ 83792555Sdes s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; 83892555Sdes s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; 83992555Sdes s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; 84092555Sdes s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; 84192555Sdes /* round 13: */ 84292555Sdes t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; 84392555Sdes t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; 84492555Sdes t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; 84592555Sdes t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; 84692555Sdes } 84792555Sdes } 84892555Sdes rk += Nr << 2; 84992555Sdes#else /* !FULL_UNROLL */ 85092555Sdes /* 85192555Sdes * Nr - 1 full rounds: 85292555Sdes */ 85392555Sdes r = Nr >> 1; 85492555Sdes for (;;) { 85592555Sdes t0 = 85692555Sdes Te0[(s0 >> 24) ] ^ 85792555Sdes Te1[(s1 >> 16) & 0xff] ^ 85892555Sdes Te2[(s2 >> 8) & 0xff] ^ 85992555Sdes Te3[(s3 ) & 0xff] ^ 86092555Sdes rk[4]; 86192555Sdes t1 = 86292555Sdes Te0[(s1 >> 24) ] ^ 86392555Sdes Te1[(s2 >> 16) & 0xff] ^ 86492555Sdes Te2[(s3 >> 8) & 0xff] ^ 86592555Sdes Te3[(s0 ) & 0xff] ^ 86692555Sdes rk[5]; 86792555Sdes t2 = 86892555Sdes Te0[(s2 >> 24) ] ^ 86992555Sdes Te1[(s3 >> 16) & 0xff] ^ 87092555Sdes Te2[(s0 >> 8) & 0xff] ^ 87192555Sdes Te3[(s1 ) & 0xff] ^ 87292555Sdes rk[6]; 87392555Sdes t3 = 87492555Sdes Te0[(s3 >> 24) ] ^ 87592555Sdes Te1[(s0 >> 16) & 0xff] ^ 87692555Sdes Te2[(s1 >> 8) & 0xff] ^ 87792555Sdes Te3[(s2 ) & 0xff] ^ 87892555Sdes rk[7]; 87969587Sgreen 88092555Sdes rk += 8; 88192555Sdes if (--r == 0) { 88292555Sdes break; 88392555Sdes } 88469587Sgreen 88592555Sdes s0 = 88692555Sdes Te0[(t0 >> 24) ] ^ 88792555Sdes Te1[(t1 >> 16) & 0xff] ^ 88892555Sdes Te2[(t2 >> 8) & 0xff] ^ 88992555Sdes Te3[(t3 ) & 0xff] ^ 89092555Sdes rk[0]; 89192555Sdes s1 = 89292555Sdes Te0[(t1 >> 24) ] ^ 89392555Sdes Te1[(t2 >> 16) & 0xff] ^ 89492555Sdes Te2[(t3 >> 8) & 0xff] ^ 89592555Sdes Te3[(t0 ) & 0xff] ^ 89692555Sdes rk[1]; 89792555Sdes s2 = 89892555Sdes Te0[(t2 >> 24) ] ^ 89992555Sdes Te1[(t3 >> 16) & 0xff] ^ 90092555Sdes Te2[(t0 >> 8) & 0xff] ^ 90192555Sdes Te3[(t1 ) & 0xff] ^ 90292555Sdes rk[2]; 90392555Sdes s3 = 90492555Sdes Te0[(t3 >> 24) ] ^ 90592555Sdes Te1[(t0 >> 16) & 0xff] ^ 90692555Sdes Te2[(t1 >> 8) & 0xff] ^ 90792555Sdes Te3[(t2 ) & 0xff] ^ 90892555Sdes rk[3]; 90992555Sdes } 91092555Sdes#endif /* ?FULL_UNROLL */ 91192555Sdes /* 91292555Sdes * apply last round and 91392555Sdes * map cipher state to byte array block: 91492555Sdes */ 91592555Sdes s0 = 916294332Sdes (Te2[(t0 >> 24) ] & 0xff000000) ^ 917294332Sdes (Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^ 918294332Sdes (Te0[(t2 >> 8) & 0xff] & 0x0000ff00) ^ 919294332Sdes (Te1[(t3 ) & 0xff] & 0x000000ff) ^ 92092555Sdes rk[0]; 92192555Sdes PUTU32(ct , s0); 92292555Sdes s1 = 923294332Sdes (Te2[(t1 >> 24) ] & 0xff000000) ^ 924294332Sdes (Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^ 925294332Sdes (Te0[(t3 >> 8) & 0xff] & 0x0000ff00) ^ 926294332Sdes (Te1[(t0 ) & 0xff] & 0x000000ff) ^ 92792555Sdes rk[1]; 92892555Sdes PUTU32(ct + 4, s1); 92992555Sdes s2 = 930294332Sdes (Te2[(t2 >> 24) ] & 0xff000000) ^ 931294332Sdes (Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^ 932294332Sdes (Te0[(t0 >> 8) & 0xff] & 0x0000ff00) ^ 933294332Sdes (Te1[(t1 ) & 0xff] & 0x000000ff) ^ 93492555Sdes rk[2]; 93592555Sdes PUTU32(ct + 8, s2); 93692555Sdes s3 = 937294332Sdes (Te2[(t3 >> 24) ] & 0xff000000) ^ 938294332Sdes (Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^ 939294332Sdes (Te0[(t1 >> 8) & 0xff] & 0x0000ff00) ^ 940294332Sdes (Te1[(t2 ) & 0xff] & 0x000000ff) ^ 94192555Sdes rk[3]; 94292555Sdes PUTU32(ct + 12, s3); 94369587Sgreen} 94469587Sgreen 945294332Sdes#if 0 946294328Sdesstatic void 947294328SdesrijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], 948294328Sdes u8 pt[16]) 949294328Sdes{ 95092555Sdes u32 s0, s1, s2, s3, t0, t1, t2, t3; 95192555Sdes#ifndef FULL_UNROLL 95292555Sdes int r; 95392555Sdes#endif /* ?FULL_UNROLL */ 95469587Sgreen 95592555Sdes /* 95692555Sdes * map byte array block to cipher state 95792555Sdes * and add initial round key: 95892555Sdes */ 95992555Sdes s0 = GETU32(ct ) ^ rk[0]; 96092555Sdes s1 = GETU32(ct + 4) ^ rk[1]; 96192555Sdes s2 = GETU32(ct + 8) ^ rk[2]; 96292555Sdes s3 = GETU32(ct + 12) ^ rk[3]; 96392555Sdes#ifdef FULL_UNROLL 96492555Sdes /* round 1: */ 96592555Sdes t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; 96692555Sdes t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; 96792555Sdes t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; 96892555Sdes t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; 96992555Sdes /* round 2: */ 97092555Sdes s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; 97192555Sdes s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; 97292555Sdes s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; 97392555Sdes s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; 97492555Sdes /* round 3: */ 97592555Sdes t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; 97692555Sdes t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; 97792555Sdes t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; 97892555Sdes t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; 97992555Sdes /* round 4: */ 98092555Sdes s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; 98192555Sdes s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; 98292555Sdes s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; 98392555Sdes s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; 98492555Sdes /* round 5: */ 98592555Sdes t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; 98692555Sdes t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; 98792555Sdes t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; 98892555Sdes t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; 98992555Sdes /* round 6: */ 99092555Sdes s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; 99192555Sdes s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; 99292555Sdes s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; 99392555Sdes s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; 99492555Sdes /* round 7: */ 99592555Sdes t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; 99692555Sdes t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; 99792555Sdes t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; 99892555Sdes t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; 99992555Sdes /* round 8: */ 100092555Sdes s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; 100192555Sdes s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; 100292555Sdes s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; 100392555Sdes s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; 100492555Sdes /* round 9: */ 100592555Sdes t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; 100692555Sdes t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; 100792555Sdes t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; 100892555Sdes t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; 100992555Sdes if (Nr > 10) { 101092555Sdes /* round 10: */ 101192555Sdes s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; 101292555Sdes s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; 101392555Sdes s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; 101492555Sdes s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; 101592555Sdes /* round 11: */ 101692555Sdes t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; 101792555Sdes t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; 101892555Sdes t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; 101992555Sdes t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; 102092555Sdes if (Nr > 12) { 102192555Sdes /* round 12: */ 102292555Sdes s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; 102392555Sdes s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; 102492555Sdes s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; 102592555Sdes s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; 102692555Sdes /* round 13: */ 102792555Sdes t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; 102892555Sdes t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; 102992555Sdes t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; 103092555Sdes t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; 103169587Sgreen } 103292555Sdes } 103392555Sdes rk += Nr << 2; 103492555Sdes#else /* !FULL_UNROLL */ 103592555Sdes /* 103692555Sdes * Nr - 1 full rounds: 103792555Sdes */ 103892555Sdes r = Nr >> 1; 103992555Sdes for (;;) { 104092555Sdes t0 = 104192555Sdes Td0[(s0 >> 24) ] ^ 104292555Sdes Td1[(s3 >> 16) & 0xff] ^ 104392555Sdes Td2[(s2 >> 8) & 0xff] ^ 104492555Sdes Td3[(s1 ) & 0xff] ^ 104592555Sdes rk[4]; 104692555Sdes t1 = 104792555Sdes Td0[(s1 >> 24) ] ^ 104892555Sdes Td1[(s0 >> 16) & 0xff] ^ 104992555Sdes Td2[(s3 >> 8) & 0xff] ^ 105092555Sdes Td3[(s2 ) & 0xff] ^ 105192555Sdes rk[5]; 105292555Sdes t2 = 105392555Sdes Td0[(s2 >> 24) ] ^ 105492555Sdes Td1[(s1 >> 16) & 0xff] ^ 105592555Sdes Td2[(s0 >> 8) & 0xff] ^ 105692555Sdes Td3[(s3 ) & 0xff] ^ 105792555Sdes rk[6]; 105892555Sdes t3 = 105992555Sdes Td0[(s3 >> 24) ] ^ 106092555Sdes Td1[(s2 >> 16) & 0xff] ^ 106192555Sdes Td2[(s1 >> 8) & 0xff] ^ 106292555Sdes Td3[(s0 ) & 0xff] ^ 106392555Sdes rk[7]; 106469587Sgreen 106592555Sdes rk += 8; 106692555Sdes if (--r == 0) { 106792555Sdes break; 106869587Sgreen } 106969587Sgreen 107092555Sdes s0 = 107192555Sdes Td0[(t0 >> 24) ] ^ 107292555Sdes Td1[(t3 >> 16) & 0xff] ^ 107392555Sdes Td2[(t2 >> 8) & 0xff] ^ 107492555Sdes Td3[(t1 ) & 0xff] ^ 107592555Sdes rk[0]; 107692555Sdes s1 = 107792555Sdes Td0[(t1 >> 24) ] ^ 107892555Sdes Td1[(t0 >> 16) & 0xff] ^ 107992555Sdes Td2[(t3 >> 8) & 0xff] ^ 108092555Sdes Td3[(t2 ) & 0xff] ^ 108192555Sdes rk[1]; 108292555Sdes s2 = 108392555Sdes Td0[(t2 >> 24) ] ^ 108492555Sdes Td1[(t1 >> 16) & 0xff] ^ 108592555Sdes Td2[(t0 >> 8) & 0xff] ^ 108692555Sdes Td3[(t3 ) & 0xff] ^ 108792555Sdes rk[2]; 108892555Sdes s3 = 108992555Sdes Td0[(t3 >> 24) ] ^ 109092555Sdes Td1[(t2 >> 16) & 0xff] ^ 109192555Sdes Td2[(t1 >> 8) & 0xff] ^ 109292555Sdes Td3[(t0 ) & 0xff] ^ 109392555Sdes rk[3]; 109492555Sdes } 109592555Sdes#endif /* ?FULL_UNROLL */ 109692555Sdes /* 109792555Sdes * apply last round and 109892555Sdes * map cipher state to byte array block: 109992555Sdes */ 1100294328Sdes s0 = 1101294332Sdes (Td4[(t0 >> 24) ] << 24) ^ 1102294332Sdes (Td4[(t3 >> 16) & 0xff] << 16) ^ 1103294332Sdes (Td4[(t2 >> 8) & 0xff] << 8) ^ 1104294332Sdes (Td4[(t1 ) & 0xff]) ^ 1105294328Sdes rk[0]; 110692555Sdes PUTU32(pt , s0); 1107294328Sdes s1 = 1108294332Sdes (Td4[(t1 >> 24) ] << 24) ^ 1109294332Sdes (Td4[(t0 >> 16) & 0xff] << 16) ^ 1110294332Sdes (Td4[(t3 >> 8) & 0xff] << 8) ^ 1111294332Sdes (Td4[(t2 ) & 0xff]) ^ 1112294328Sdes rk[1]; 111392555Sdes PUTU32(pt + 4, s1); 1114294328Sdes s2 = 1115294332Sdes (Td4[(t2 >> 24) ] << 24) ^ 1116294332Sdes (Td4[(t1 >> 16) & 0xff] << 16) ^ 1117294332Sdes (Td4[(t0 >> 8) & 0xff] << 8) ^ 1118294332Sdes (Td4[(t3 ) & 0xff]) ^ 1119294328Sdes rk[2]; 112092555Sdes PUTU32(pt + 8, s2); 1121294328Sdes s3 = 1122294332Sdes (Td4[(t3 >> 24) ] << 24) ^ 1123294332Sdes (Td4[(t2 >> 16) & 0xff] << 16) ^ 1124294332Sdes (Td4[(t1 >> 8) & 0xff] << 8) ^ 1125294332Sdes (Td4[(t0 ) & 0xff]) ^ 1126294328Sdes rk[3]; 112792555Sdes PUTU32(pt + 12, s3); 112869587Sgreen} 1129294332Sdes#endif 1130