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