xref: /openbmc/linux/crypto/anubis.c (revision 14386d47)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Cryptographic API.
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  * Anubis Algorithm
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  * The Anubis algorithm was developed by Paulo S. L. M. Barreto and
71da177e4SLinus Torvalds  * Vincent Rijmen.
81da177e4SLinus Torvalds  *
91da177e4SLinus Torvalds  * See
101da177e4SLinus Torvalds  *
111da177e4SLinus Torvalds  *	P.S.L.M. Barreto, V. Rijmen,
121da177e4SLinus Torvalds  *	``The Anubis block cipher,''
131da177e4SLinus Torvalds  *	NESSIE submission, 2000.
141da177e4SLinus Torvalds  *
151da177e4SLinus Torvalds  * This software implements the "tweaked" version of Anubis.
161da177e4SLinus Torvalds  * Only the S-box and (consequently) the rounds constants have been
171da177e4SLinus Torvalds  * changed.
181da177e4SLinus Torvalds  *
191da177e4SLinus Torvalds  * The original authors have disclaimed all copyright interest in this
201da177e4SLinus Torvalds  * code and thus put it in the public domain. The subsequent authors
211da177e4SLinus Torvalds  * have put this under the GNU General Public License.
221da177e4SLinus Torvalds  *
231da177e4SLinus Torvalds  * By Aaron Grothe ajgrothe@yahoo.com, October 28, 2004
241da177e4SLinus Torvalds  *
251da177e4SLinus Torvalds  * This program is free software; you can redistribute it and/or modify
261da177e4SLinus Torvalds  * it under the terms of the GNU General Public License as published by
271da177e4SLinus Torvalds  * the Free Software Foundation; either version 2 of the License, or
281da177e4SLinus Torvalds  * (at your option) any later version.
291da177e4SLinus Torvalds  *
301da177e4SLinus Torvalds  */
311da177e4SLinus Torvalds 
32*14386d47SHerbert Xu #include <crypto/algapi.h>
331da177e4SLinus Torvalds #include <linux/init.h>
341da177e4SLinus Torvalds #include <linux/module.h>
351da177e4SLinus Torvalds #include <linux/mm.h>
3606ace7a9SHerbert Xu #include <asm/byteorder.h>
3706ace7a9SHerbert Xu #include <linux/types.h>
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds #define ANUBIS_MIN_KEY_SIZE	16
401da177e4SLinus Torvalds #define ANUBIS_MAX_KEY_SIZE	40
411da177e4SLinus Torvalds #define ANUBIS_BLOCK_SIZE	16
421da177e4SLinus Torvalds #define ANUBIS_MAX_N		10
431da177e4SLinus Torvalds #define ANUBIS_MAX_ROUNDS	(8 + ANUBIS_MAX_N)
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds struct anubis_ctx {
461da177e4SLinus Torvalds 	int key_len; // in bits
471da177e4SLinus Torvalds 	int R;
481da177e4SLinus Torvalds 	u32 E[ANUBIS_MAX_ROUNDS + 1][4];
491da177e4SLinus Torvalds 	u32 D[ANUBIS_MAX_ROUNDS + 1][4];
501da177e4SLinus Torvalds };
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds static const u32 T0[256] = {
531da177e4SLinus Torvalds 	0xba69d2bbU, 0x54a84de5U, 0x2f5ebce2U, 0x74e8cd25U,
541da177e4SLinus Torvalds 	0x53a651f7U, 0xd3bb6bd0U, 0xd2b96fd6U, 0x4d9a29b3U,
551da177e4SLinus Torvalds 	0x50a05dfdU, 0xac458acfU, 0x8d070e09U, 0xbf63c6a5U,
561da177e4SLinus Torvalds 	0x70e0dd3dU, 0x52a455f1U, 0x9a29527bU, 0x4c982db5U,
571da177e4SLinus Torvalds 	0xeac98f46U, 0xd5b773c4U, 0x97336655U, 0xd1bf63dcU,
581da177e4SLinus Torvalds 	0x3366ccaaU, 0x51a259fbU, 0x5bb671c7U, 0xa651a2f3U,
591da177e4SLinus Torvalds 	0xdea15ffeU, 0x48903dadU, 0xa84d9ad7U, 0x992f5e71U,
601da177e4SLinus Torvalds 	0xdbab4be0U, 0x3264c8acU, 0xb773e695U, 0xfce5d732U,
611da177e4SLinus Torvalds 	0xe3dbab70U, 0x9e214263U, 0x913f7e41U, 0x9b2b567dU,
621da177e4SLinus Torvalds 	0xe2d9af76U, 0xbb6bd6bdU, 0x4182199bU, 0x6edca579U,
631da177e4SLinus Torvalds 	0xa557aef9U, 0xcb8b0b80U, 0x6bd6b167U, 0x95376e59U,
641da177e4SLinus Torvalds 	0xa15fbee1U, 0xf3fbeb10U, 0xb17ffe81U, 0x0204080cU,
651da177e4SLinus Torvalds 	0xcc851792U, 0xc49537a2U, 0x1d3a744eU, 0x14285078U,
661da177e4SLinus Torvalds 	0xc39b2bb0U, 0x63c69157U, 0xdaa94fe6U, 0x5dba69d3U,
671da177e4SLinus Torvalds 	0x5fbe61dfU, 0xdca557f2U, 0x7dfae913U, 0xcd871394U,
681da177e4SLinus Torvalds 	0x7ffee11fU, 0x5ab475c1U, 0x6cd8ad75U, 0x5cb86dd5U,
691da177e4SLinus Torvalds 	0xf7f3fb08U, 0x264c98d4U, 0xffe3db38U, 0xedc79354U,
701da177e4SLinus Torvalds 	0xe8cd874aU, 0x9d274e69U, 0x6fdea17fU, 0x8e010203U,
711da177e4SLinus Torvalds 	0x19326456U, 0xa05dbae7U, 0xf0fde71aU, 0x890f1e11U,
721da177e4SLinus Torvalds 	0x0f1e3c22U, 0x070e1c12U, 0xaf4386c5U, 0xfbebcb20U,
731da177e4SLinus Torvalds 	0x08102030U, 0x152a547eU, 0x0d1a342eU, 0x04081018U,
741da177e4SLinus Torvalds 	0x01020406U, 0x64c88d45U, 0xdfa35bf8U, 0x76ecc529U,
751da177e4SLinus Torvalds 	0x79f2f90bU, 0xdda753f4U, 0x3d7af48eU, 0x162c5874U,
761da177e4SLinus Torvalds 	0x3f7efc82U, 0x376edcb2U, 0x6ddaa973U, 0x3870e090U,
771da177e4SLinus Torvalds 	0xb96fdeb1U, 0x73e6d137U, 0xe9cf834cU, 0x356ad4beU,
781da177e4SLinus Torvalds 	0x55aa49e3U, 0x71e2d93bU, 0x7bf6f107U, 0x8c050a0fU,
791da177e4SLinus Torvalds 	0x72e4d531U, 0x880d1a17U, 0xf6f1ff0eU, 0x2a54a8fcU,
801da177e4SLinus Torvalds 	0x3e7cf884U, 0x5ebc65d9U, 0x274e9cd2U, 0x468c0589U,
811da177e4SLinus Torvalds 	0x0c183028U, 0x65ca8943U, 0x68d0bd6dU, 0x61c2995bU,
821da177e4SLinus Torvalds 	0x03060c0aU, 0xc19f23bcU, 0x57ae41efU, 0xd6b17fceU,
831da177e4SLinus Torvalds 	0xd9af43ecU, 0x58b07dcdU, 0xd8ad47eaU, 0x66cc8549U,
841da177e4SLinus Torvalds 	0xd7b37bc8U, 0x3a74e89cU, 0xc88d078aU, 0x3c78f088U,
851da177e4SLinus Torvalds 	0xfae9cf26U, 0x96316253U, 0xa753a6f5U, 0x982d5a77U,
861da177e4SLinus Torvalds 	0xecc59752U, 0xb86ddab7U, 0xc7933ba8U, 0xae4182c3U,
871da177e4SLinus Torvalds 	0x69d2b96bU, 0x4b9631a7U, 0xab4b96ddU, 0xa94f9ed1U,
881da177e4SLinus Torvalds 	0x67ce814fU, 0x0a14283cU, 0x478e018fU, 0xf2f9ef16U,
891da177e4SLinus Torvalds 	0xb577ee99U, 0x224488ccU, 0xe5d7b364U, 0xeec19f5eU,
901da177e4SLinus Torvalds 	0xbe61c2a3U, 0x2b56acfaU, 0x811f3e21U, 0x1224486cU,
911da177e4SLinus Torvalds 	0x831b362dU, 0x1b366c5aU, 0x0e1c3824U, 0x23468ccaU,
921da177e4SLinus Torvalds 	0xf5f7f304U, 0x458a0983U, 0x214284c6U, 0xce811f9eU,
931da177e4SLinus Torvalds 	0x499239abU, 0x2c58b0e8U, 0xf9efc32cU, 0xe6d1bf6eU,
941da177e4SLinus Torvalds 	0xb671e293U, 0x2850a0f0U, 0x172e5c72U, 0x8219322bU,
951da177e4SLinus Torvalds 	0x1a34685cU, 0x8b0b161dU, 0xfee1df3eU, 0x8a09121bU,
961da177e4SLinus Torvalds 	0x09122436U, 0xc98f038cU, 0x87132635U, 0x4e9c25b9U,
971da177e4SLinus Torvalds 	0xe1dfa37cU, 0x2e5cb8e4U, 0xe4d5b762U, 0xe0dda77aU,
981da177e4SLinus Torvalds 	0xebcb8b40U, 0x903d7a47U, 0xa455aaffU, 0x1e3c7844U,
991da177e4SLinus Torvalds 	0x85172e39U, 0x60c09d5dU, 0x00000000U, 0x254a94deU,
1001da177e4SLinus Torvalds 	0xf4f5f702U, 0xf1ffe31cU, 0x94356a5fU, 0x0b162c3aU,
1011da177e4SLinus Torvalds 	0xe7d3bb68U, 0x75eac923U, 0xefc39b58U, 0x3468d0b8U,
1021da177e4SLinus Torvalds 	0x3162c4a6U, 0xd4b577c2U, 0xd0bd67daU, 0x86112233U,
1031da177e4SLinus Torvalds 	0x7efce519U, 0xad478ec9U, 0xfde7d334U, 0x2952a4f6U,
1041da177e4SLinus Torvalds 	0x3060c0a0U, 0x3b76ec9aU, 0x9f234665U, 0xf8edc72aU,
1051da177e4SLinus Torvalds 	0xc6913faeU, 0x13264c6aU, 0x060c1814U, 0x050a141eU,
1061da177e4SLinus Torvalds 	0xc59733a4U, 0x11224466U, 0x77eec12fU, 0x7cf8ed15U,
1071da177e4SLinus Torvalds 	0x7af4f501U, 0x78f0fd0dU, 0x366cd8b4U, 0x1c387048U,
1081da177e4SLinus Torvalds 	0x3972e496U, 0x59b279cbU, 0x18306050U, 0x56ac45e9U,
1091da177e4SLinus Torvalds 	0xb37bf68dU, 0xb07dfa87U, 0x244890d8U, 0x204080c0U,
1101da177e4SLinus Torvalds 	0xb279f28bU, 0x9239724bU, 0xa35bb6edU, 0xc09d27baU,
1111da177e4SLinus Torvalds 	0x44880d85U, 0x62c49551U, 0x10204060U, 0xb475ea9fU,
1121da177e4SLinus Torvalds 	0x84152a3fU, 0x43861197U, 0x933b764dU, 0xc2992fb6U,
1131da177e4SLinus Torvalds 	0x4a9435a1U, 0xbd67cea9U, 0x8f030605U, 0x2d5ab4eeU,
1141da177e4SLinus Torvalds 	0xbc65caafU, 0x9c254a6fU, 0x6ad4b561U, 0x40801d9dU,
1151da177e4SLinus Torvalds 	0xcf831b98U, 0xa259b2ebU, 0x801d3a27U, 0x4f9e21bfU,
1161da177e4SLinus Torvalds 	0x1f3e7c42U, 0xca890f86U, 0xaa4992dbU, 0x42841591U,
1171da177e4SLinus Torvalds };
1181da177e4SLinus Torvalds 
1191da177e4SLinus Torvalds static const u32 T1[256] = {
1201da177e4SLinus Torvalds 	0x69babbd2U, 0xa854e54dU, 0x5e2fe2bcU, 0xe87425cdU,
1211da177e4SLinus Torvalds 	0xa653f751U, 0xbbd3d06bU, 0xb9d2d66fU, 0x9a4db329U,
1221da177e4SLinus Torvalds 	0xa050fd5dU, 0x45accf8aU, 0x078d090eU, 0x63bfa5c6U,
1231da177e4SLinus Torvalds 	0xe0703dddU, 0xa452f155U, 0x299a7b52U, 0x984cb52dU,
1241da177e4SLinus Torvalds 	0xc9ea468fU, 0xb7d5c473U, 0x33975566U, 0xbfd1dc63U,
1251da177e4SLinus Torvalds 	0x6633aaccU, 0xa251fb59U, 0xb65bc771U, 0x51a6f3a2U,
1261da177e4SLinus Torvalds 	0xa1defe5fU, 0x9048ad3dU, 0x4da8d79aU, 0x2f99715eU,
1271da177e4SLinus Torvalds 	0xabdbe04bU, 0x6432acc8U, 0x73b795e6U, 0xe5fc32d7U,
1281da177e4SLinus Torvalds 	0xdbe370abU, 0x219e6342U, 0x3f91417eU, 0x2b9b7d56U,
1291da177e4SLinus Torvalds 	0xd9e276afU, 0x6bbbbdd6U, 0x82419b19U, 0xdc6e79a5U,
1301da177e4SLinus Torvalds 	0x57a5f9aeU, 0x8bcb800bU, 0xd66b67b1U, 0x3795596eU,
1311da177e4SLinus Torvalds 	0x5fa1e1beU, 0xfbf310ebU, 0x7fb181feU, 0x04020c08U,
1321da177e4SLinus Torvalds 	0x85cc9217U, 0x95c4a237U, 0x3a1d4e74U, 0x28147850U,
1331da177e4SLinus Torvalds 	0x9bc3b02bU, 0xc6635791U, 0xa9dae64fU, 0xba5dd369U,
1341da177e4SLinus Torvalds 	0xbe5fdf61U, 0xa5dcf257U, 0xfa7d13e9U, 0x87cd9413U,
1351da177e4SLinus Torvalds 	0xfe7f1fe1U, 0xb45ac175U, 0xd86c75adU, 0xb85cd56dU,
1361da177e4SLinus Torvalds 	0xf3f708fbU, 0x4c26d498U, 0xe3ff38dbU, 0xc7ed5493U,
1371da177e4SLinus Torvalds 	0xcde84a87U, 0x279d694eU, 0xde6f7fa1U, 0x018e0302U,
1381da177e4SLinus Torvalds 	0x32195664U, 0x5da0e7baU, 0xfdf01ae7U, 0x0f89111eU,
1391da177e4SLinus Torvalds 	0x1e0f223cU, 0x0e07121cU, 0x43afc586U, 0xebfb20cbU,
1401da177e4SLinus Torvalds 	0x10083020U, 0x2a157e54U, 0x1a0d2e34U, 0x08041810U,
1411da177e4SLinus Torvalds 	0x02010604U, 0xc864458dU, 0xa3dff85bU, 0xec7629c5U,
1421da177e4SLinus Torvalds 	0xf2790bf9U, 0xa7ddf453U, 0x7a3d8ef4U, 0x2c167458U,
1431da177e4SLinus Torvalds 	0x7e3f82fcU, 0x6e37b2dcU, 0xda6d73a9U, 0x703890e0U,
1441da177e4SLinus Torvalds 	0x6fb9b1deU, 0xe67337d1U, 0xcfe94c83U, 0x6a35bed4U,
1451da177e4SLinus Torvalds 	0xaa55e349U, 0xe2713bd9U, 0xf67b07f1U, 0x058c0f0aU,
1461da177e4SLinus Torvalds 	0xe47231d5U, 0x0d88171aU, 0xf1f60effU, 0x542afca8U,
1471da177e4SLinus Torvalds 	0x7c3e84f8U, 0xbc5ed965U, 0x4e27d29cU, 0x8c468905U,
1481da177e4SLinus Torvalds 	0x180c2830U, 0xca654389U, 0xd0686dbdU, 0xc2615b99U,
1491da177e4SLinus Torvalds 	0x06030a0cU, 0x9fc1bc23U, 0xae57ef41U, 0xb1d6ce7fU,
1501da177e4SLinus Torvalds 	0xafd9ec43U, 0xb058cd7dU, 0xadd8ea47U, 0xcc664985U,
1511da177e4SLinus Torvalds 	0xb3d7c87bU, 0x743a9ce8U, 0x8dc88a07U, 0x783c88f0U,
1521da177e4SLinus Torvalds 	0xe9fa26cfU, 0x31965362U, 0x53a7f5a6U, 0x2d98775aU,
1531da177e4SLinus Torvalds 	0xc5ec5297U, 0x6db8b7daU, 0x93c7a83bU, 0x41aec382U,
1541da177e4SLinus Torvalds 	0xd2696bb9U, 0x964ba731U, 0x4babdd96U, 0x4fa9d19eU,
1551da177e4SLinus Torvalds 	0xce674f81U, 0x140a3c28U, 0x8e478f01U, 0xf9f216efU,
1561da177e4SLinus Torvalds 	0x77b599eeU, 0x4422cc88U, 0xd7e564b3U, 0xc1ee5e9fU,
1571da177e4SLinus Torvalds 	0x61bea3c2U, 0x562bfaacU, 0x1f81213eU, 0x24126c48U,
1581da177e4SLinus Torvalds 	0x1b832d36U, 0x361b5a6cU, 0x1c0e2438U, 0x4623ca8cU,
1591da177e4SLinus Torvalds 	0xf7f504f3U, 0x8a458309U, 0x4221c684U, 0x81ce9e1fU,
1601da177e4SLinus Torvalds 	0x9249ab39U, 0x582ce8b0U, 0xeff92cc3U, 0xd1e66ebfU,
1611da177e4SLinus Torvalds 	0x71b693e2U, 0x5028f0a0U, 0x2e17725cU, 0x19822b32U,
1621da177e4SLinus Torvalds 	0x341a5c68U, 0x0b8b1d16U, 0xe1fe3edfU, 0x098a1b12U,
1631da177e4SLinus Torvalds 	0x12093624U, 0x8fc98c03U, 0x13873526U, 0x9c4eb925U,
1641da177e4SLinus Torvalds 	0xdfe17ca3U, 0x5c2ee4b8U, 0xd5e462b7U, 0xdde07aa7U,
1651da177e4SLinus Torvalds 	0xcbeb408bU, 0x3d90477aU, 0x55a4ffaaU, 0x3c1e4478U,
1661da177e4SLinus Torvalds 	0x1785392eU, 0xc0605d9dU, 0x00000000U, 0x4a25de94U,
1671da177e4SLinus Torvalds 	0xf5f402f7U, 0xfff11ce3U, 0x35945f6aU, 0x160b3a2cU,
1681da177e4SLinus Torvalds 	0xd3e768bbU, 0xea7523c9U, 0xc3ef589bU, 0x6834b8d0U,
1691da177e4SLinus Torvalds 	0x6231a6c4U, 0xb5d4c277U, 0xbdd0da67U, 0x11863322U,
1701da177e4SLinus Torvalds 	0xfc7e19e5U, 0x47adc98eU, 0xe7fd34d3U, 0x5229f6a4U,
1711da177e4SLinus Torvalds 	0x6030a0c0U, 0x763b9aecU, 0x239f6546U, 0xedf82ac7U,
1721da177e4SLinus Torvalds 	0x91c6ae3fU, 0x26136a4cU, 0x0c061418U, 0x0a051e14U,
1731da177e4SLinus Torvalds 	0x97c5a433U, 0x22116644U, 0xee772fc1U, 0xf87c15edU,
1741da177e4SLinus Torvalds 	0xf47a01f5U, 0xf0780dfdU, 0x6c36b4d8U, 0x381c4870U,
1751da177e4SLinus Torvalds 	0x723996e4U, 0xb259cb79U, 0x30185060U, 0xac56e945U,
1761da177e4SLinus Torvalds 	0x7bb38df6U, 0x7db087faU, 0x4824d890U, 0x4020c080U,
1771da177e4SLinus Torvalds 	0x79b28bf2U, 0x39924b72U, 0x5ba3edb6U, 0x9dc0ba27U,
1781da177e4SLinus Torvalds 	0x8844850dU, 0xc4625195U, 0x20106040U, 0x75b49feaU,
1791da177e4SLinus Torvalds 	0x15843f2aU, 0x86439711U, 0x3b934d76U, 0x99c2b62fU,
1801da177e4SLinus Torvalds 	0x944aa135U, 0x67bda9ceU, 0x038f0506U, 0x5a2deeb4U,
1811da177e4SLinus Torvalds 	0x65bcafcaU, 0x259c6f4aU, 0xd46a61b5U, 0x80409d1dU,
1821da177e4SLinus Torvalds 	0x83cf981bU, 0x59a2ebb2U, 0x1d80273aU, 0x9e4fbf21U,
1831da177e4SLinus Torvalds 	0x3e1f427cU, 0x89ca860fU, 0x49aadb92U, 0x84429115U,
1841da177e4SLinus Torvalds };
1851da177e4SLinus Torvalds 
1861da177e4SLinus Torvalds static const u32 T2[256] = {
1871da177e4SLinus Torvalds 	0xd2bbba69U, 0x4de554a8U, 0xbce22f5eU, 0xcd2574e8U,
1881da177e4SLinus Torvalds 	0x51f753a6U, 0x6bd0d3bbU, 0x6fd6d2b9U, 0x29b34d9aU,
1891da177e4SLinus Torvalds 	0x5dfd50a0U, 0x8acfac45U, 0x0e098d07U, 0xc6a5bf63U,
1901da177e4SLinus Torvalds 	0xdd3d70e0U, 0x55f152a4U, 0x527b9a29U, 0x2db54c98U,
1911da177e4SLinus Torvalds 	0x8f46eac9U, 0x73c4d5b7U, 0x66559733U, 0x63dcd1bfU,
1921da177e4SLinus Torvalds 	0xccaa3366U, 0x59fb51a2U, 0x71c75bb6U, 0xa2f3a651U,
1931da177e4SLinus Torvalds 	0x5ffedea1U, 0x3dad4890U, 0x9ad7a84dU, 0x5e71992fU,
1941da177e4SLinus Torvalds 	0x4be0dbabU, 0xc8ac3264U, 0xe695b773U, 0xd732fce5U,
1951da177e4SLinus Torvalds 	0xab70e3dbU, 0x42639e21U, 0x7e41913fU, 0x567d9b2bU,
1961da177e4SLinus Torvalds 	0xaf76e2d9U, 0xd6bdbb6bU, 0x199b4182U, 0xa5796edcU,
1971da177e4SLinus Torvalds 	0xaef9a557U, 0x0b80cb8bU, 0xb1676bd6U, 0x6e599537U,
1981da177e4SLinus Torvalds 	0xbee1a15fU, 0xeb10f3fbU, 0xfe81b17fU, 0x080c0204U,
1991da177e4SLinus Torvalds 	0x1792cc85U, 0x37a2c495U, 0x744e1d3aU, 0x50781428U,
2001da177e4SLinus Torvalds 	0x2bb0c39bU, 0x915763c6U, 0x4fe6daa9U, 0x69d35dbaU,
2011da177e4SLinus Torvalds 	0x61df5fbeU, 0x57f2dca5U, 0xe9137dfaU, 0x1394cd87U,
2021da177e4SLinus Torvalds 	0xe11f7ffeU, 0x75c15ab4U, 0xad756cd8U, 0x6dd55cb8U,
2031da177e4SLinus Torvalds 	0xfb08f7f3U, 0x98d4264cU, 0xdb38ffe3U, 0x9354edc7U,
2041da177e4SLinus Torvalds 	0x874ae8cdU, 0x4e699d27U, 0xa17f6fdeU, 0x02038e01U,
2051da177e4SLinus Torvalds 	0x64561932U, 0xbae7a05dU, 0xe71af0fdU, 0x1e11890fU,
2061da177e4SLinus Torvalds 	0x3c220f1eU, 0x1c12070eU, 0x86c5af43U, 0xcb20fbebU,
2071da177e4SLinus Torvalds 	0x20300810U, 0x547e152aU, 0x342e0d1aU, 0x10180408U,
2081da177e4SLinus Torvalds 	0x04060102U, 0x8d4564c8U, 0x5bf8dfa3U, 0xc52976ecU,
2091da177e4SLinus Torvalds 	0xf90b79f2U, 0x53f4dda7U, 0xf48e3d7aU, 0x5874162cU,
2101da177e4SLinus Torvalds 	0xfc823f7eU, 0xdcb2376eU, 0xa9736ddaU, 0xe0903870U,
2111da177e4SLinus Torvalds 	0xdeb1b96fU, 0xd13773e6U, 0x834ce9cfU, 0xd4be356aU,
2121da177e4SLinus Torvalds 	0x49e355aaU, 0xd93b71e2U, 0xf1077bf6U, 0x0a0f8c05U,
2131da177e4SLinus Torvalds 	0xd53172e4U, 0x1a17880dU, 0xff0ef6f1U, 0xa8fc2a54U,
2141da177e4SLinus Torvalds 	0xf8843e7cU, 0x65d95ebcU, 0x9cd2274eU, 0x0589468cU,
2151da177e4SLinus Torvalds 	0x30280c18U, 0x894365caU, 0xbd6d68d0U, 0x995b61c2U,
2161da177e4SLinus Torvalds 	0x0c0a0306U, 0x23bcc19fU, 0x41ef57aeU, 0x7fced6b1U,
2171da177e4SLinus Torvalds 	0x43ecd9afU, 0x7dcd58b0U, 0x47ead8adU, 0x854966ccU,
2181da177e4SLinus Torvalds 	0x7bc8d7b3U, 0xe89c3a74U, 0x078ac88dU, 0xf0883c78U,
2191da177e4SLinus Torvalds 	0xcf26fae9U, 0x62539631U, 0xa6f5a753U, 0x5a77982dU,
2201da177e4SLinus Torvalds 	0x9752ecc5U, 0xdab7b86dU, 0x3ba8c793U, 0x82c3ae41U,
2211da177e4SLinus Torvalds 	0xb96b69d2U, 0x31a74b96U, 0x96ddab4bU, 0x9ed1a94fU,
2221da177e4SLinus Torvalds 	0x814f67ceU, 0x283c0a14U, 0x018f478eU, 0xef16f2f9U,
2231da177e4SLinus Torvalds 	0xee99b577U, 0x88cc2244U, 0xb364e5d7U, 0x9f5eeec1U,
2241da177e4SLinus Torvalds 	0xc2a3be61U, 0xacfa2b56U, 0x3e21811fU, 0x486c1224U,
2251da177e4SLinus Torvalds 	0x362d831bU, 0x6c5a1b36U, 0x38240e1cU, 0x8cca2346U,
2261da177e4SLinus Torvalds 	0xf304f5f7U, 0x0983458aU, 0x84c62142U, 0x1f9ece81U,
2271da177e4SLinus Torvalds 	0x39ab4992U, 0xb0e82c58U, 0xc32cf9efU, 0xbf6ee6d1U,
2281da177e4SLinus Torvalds 	0xe293b671U, 0xa0f02850U, 0x5c72172eU, 0x322b8219U,
2291da177e4SLinus Torvalds 	0x685c1a34U, 0x161d8b0bU, 0xdf3efee1U, 0x121b8a09U,
2301da177e4SLinus Torvalds 	0x24360912U, 0x038cc98fU, 0x26358713U, 0x25b94e9cU,
2311da177e4SLinus Torvalds 	0xa37ce1dfU, 0xb8e42e5cU, 0xb762e4d5U, 0xa77ae0ddU,
2321da177e4SLinus Torvalds 	0x8b40ebcbU, 0x7a47903dU, 0xaaffa455U, 0x78441e3cU,
2331da177e4SLinus Torvalds 	0x2e398517U, 0x9d5d60c0U, 0x00000000U, 0x94de254aU,
2341da177e4SLinus Torvalds 	0xf702f4f5U, 0xe31cf1ffU, 0x6a5f9435U, 0x2c3a0b16U,
2351da177e4SLinus Torvalds 	0xbb68e7d3U, 0xc92375eaU, 0x9b58efc3U, 0xd0b83468U,
2361da177e4SLinus Torvalds 	0xc4a63162U, 0x77c2d4b5U, 0x67dad0bdU, 0x22338611U,
2371da177e4SLinus Torvalds 	0xe5197efcU, 0x8ec9ad47U, 0xd334fde7U, 0xa4f62952U,
2381da177e4SLinus Torvalds 	0xc0a03060U, 0xec9a3b76U, 0x46659f23U, 0xc72af8edU,
2391da177e4SLinus Torvalds 	0x3faec691U, 0x4c6a1326U, 0x1814060cU, 0x141e050aU,
2401da177e4SLinus Torvalds 	0x33a4c597U, 0x44661122U, 0xc12f77eeU, 0xed157cf8U,
2411da177e4SLinus Torvalds 	0xf5017af4U, 0xfd0d78f0U, 0xd8b4366cU, 0x70481c38U,
2421da177e4SLinus Torvalds 	0xe4963972U, 0x79cb59b2U, 0x60501830U, 0x45e956acU,
2431da177e4SLinus Torvalds 	0xf68db37bU, 0xfa87b07dU, 0x90d82448U, 0x80c02040U,
2441da177e4SLinus Torvalds 	0xf28bb279U, 0x724b9239U, 0xb6eda35bU, 0x27bac09dU,
2451da177e4SLinus Torvalds 	0x0d854488U, 0x955162c4U, 0x40601020U, 0xea9fb475U,
2461da177e4SLinus Torvalds 	0x2a3f8415U, 0x11974386U, 0x764d933bU, 0x2fb6c299U,
2471da177e4SLinus Torvalds 	0x35a14a94U, 0xcea9bd67U, 0x06058f03U, 0xb4ee2d5aU,
2481da177e4SLinus Torvalds 	0xcaafbc65U, 0x4a6f9c25U, 0xb5616ad4U, 0x1d9d4080U,
2491da177e4SLinus Torvalds 	0x1b98cf83U, 0xb2eba259U, 0x3a27801dU, 0x21bf4f9eU,
2501da177e4SLinus Torvalds 	0x7c421f3eU, 0x0f86ca89U, 0x92dbaa49U, 0x15914284U,
2511da177e4SLinus Torvalds };
2521da177e4SLinus Torvalds 
2531da177e4SLinus Torvalds static const u32 T3[256] = {
2541da177e4SLinus Torvalds 	0xbbd269baU, 0xe54da854U, 0xe2bc5e2fU, 0x25cde874U,
2551da177e4SLinus Torvalds 	0xf751a653U, 0xd06bbbd3U, 0xd66fb9d2U, 0xb3299a4dU,
2561da177e4SLinus Torvalds 	0xfd5da050U, 0xcf8a45acU, 0x090e078dU, 0xa5c663bfU,
2571da177e4SLinus Torvalds 	0x3ddde070U, 0xf155a452U, 0x7b52299aU, 0xb52d984cU,
2581da177e4SLinus Torvalds 	0x468fc9eaU, 0xc473b7d5U, 0x55663397U, 0xdc63bfd1U,
2591da177e4SLinus Torvalds 	0xaacc6633U, 0xfb59a251U, 0xc771b65bU, 0xf3a251a6U,
2601da177e4SLinus Torvalds 	0xfe5fa1deU, 0xad3d9048U, 0xd79a4da8U, 0x715e2f99U,
2611da177e4SLinus Torvalds 	0xe04babdbU, 0xacc86432U, 0x95e673b7U, 0x32d7e5fcU,
2621da177e4SLinus Torvalds 	0x70abdbe3U, 0x6342219eU, 0x417e3f91U, 0x7d562b9bU,
2631da177e4SLinus Torvalds 	0x76afd9e2U, 0xbdd66bbbU, 0x9b198241U, 0x79a5dc6eU,
2641da177e4SLinus Torvalds 	0xf9ae57a5U, 0x800b8bcbU, 0x67b1d66bU, 0x596e3795U,
2651da177e4SLinus Torvalds 	0xe1be5fa1U, 0x10ebfbf3U, 0x81fe7fb1U, 0x0c080402U,
2661da177e4SLinus Torvalds 	0x921785ccU, 0xa23795c4U, 0x4e743a1dU, 0x78502814U,
2671da177e4SLinus Torvalds 	0xb02b9bc3U, 0x5791c663U, 0xe64fa9daU, 0xd369ba5dU,
2681da177e4SLinus Torvalds 	0xdf61be5fU, 0xf257a5dcU, 0x13e9fa7dU, 0x941387cdU,
2691da177e4SLinus Torvalds 	0x1fe1fe7fU, 0xc175b45aU, 0x75add86cU, 0xd56db85cU,
2701da177e4SLinus Torvalds 	0x08fbf3f7U, 0xd4984c26U, 0x38dbe3ffU, 0x5493c7edU,
2711da177e4SLinus Torvalds 	0x4a87cde8U, 0x694e279dU, 0x7fa1de6fU, 0x0302018eU,
2721da177e4SLinus Torvalds 	0x56643219U, 0xe7ba5da0U, 0x1ae7fdf0U, 0x111e0f89U,
2731da177e4SLinus Torvalds 	0x223c1e0fU, 0x121c0e07U, 0xc58643afU, 0x20cbebfbU,
2741da177e4SLinus Torvalds 	0x30201008U, 0x7e542a15U, 0x2e341a0dU, 0x18100804U,
2751da177e4SLinus Torvalds 	0x06040201U, 0x458dc864U, 0xf85ba3dfU, 0x29c5ec76U,
2761da177e4SLinus Torvalds 	0x0bf9f279U, 0xf453a7ddU, 0x8ef47a3dU, 0x74582c16U,
2771da177e4SLinus Torvalds 	0x82fc7e3fU, 0xb2dc6e37U, 0x73a9da6dU, 0x90e07038U,
2781da177e4SLinus Torvalds 	0xb1de6fb9U, 0x37d1e673U, 0x4c83cfe9U, 0xbed46a35U,
2791da177e4SLinus Torvalds 	0xe349aa55U, 0x3bd9e271U, 0x07f1f67bU, 0x0f0a058cU,
2801da177e4SLinus Torvalds 	0x31d5e472U, 0x171a0d88U, 0x0efff1f6U, 0xfca8542aU,
2811da177e4SLinus Torvalds 	0x84f87c3eU, 0xd965bc5eU, 0xd29c4e27U, 0x89058c46U,
2821da177e4SLinus Torvalds 	0x2830180cU, 0x4389ca65U, 0x6dbdd068U, 0x5b99c261U,
2831da177e4SLinus Torvalds 	0x0a0c0603U, 0xbc239fc1U, 0xef41ae57U, 0xce7fb1d6U,
2841da177e4SLinus Torvalds 	0xec43afd9U, 0xcd7db058U, 0xea47add8U, 0x4985cc66U,
2851da177e4SLinus Torvalds 	0xc87bb3d7U, 0x9ce8743aU, 0x8a078dc8U, 0x88f0783cU,
2861da177e4SLinus Torvalds 	0x26cfe9faU, 0x53623196U, 0xf5a653a7U, 0x775a2d98U,
2871da177e4SLinus Torvalds 	0x5297c5ecU, 0xb7da6db8U, 0xa83b93c7U, 0xc38241aeU,
2881da177e4SLinus Torvalds 	0x6bb9d269U, 0xa731964bU, 0xdd964babU, 0xd19e4fa9U,
2891da177e4SLinus Torvalds 	0x4f81ce67U, 0x3c28140aU, 0x8f018e47U, 0x16eff9f2U,
2901da177e4SLinus Torvalds 	0x99ee77b5U, 0xcc884422U, 0x64b3d7e5U, 0x5e9fc1eeU,
2911da177e4SLinus Torvalds 	0xa3c261beU, 0xfaac562bU, 0x213e1f81U, 0x6c482412U,
2921da177e4SLinus Torvalds 	0x2d361b83U, 0x5a6c361bU, 0x24381c0eU, 0xca8c4623U,
2931da177e4SLinus Torvalds 	0x04f3f7f5U, 0x83098a45U, 0xc6844221U, 0x9e1f81ceU,
2941da177e4SLinus Torvalds 	0xab399249U, 0xe8b0582cU, 0x2cc3eff9U, 0x6ebfd1e6U,
2951da177e4SLinus Torvalds 	0x93e271b6U, 0xf0a05028U, 0x725c2e17U, 0x2b321982U,
2961da177e4SLinus Torvalds 	0x5c68341aU, 0x1d160b8bU, 0x3edfe1feU, 0x1b12098aU,
2971da177e4SLinus Torvalds 	0x36241209U, 0x8c038fc9U, 0x35261387U, 0xb9259c4eU,
2981da177e4SLinus Torvalds 	0x7ca3dfe1U, 0xe4b85c2eU, 0x62b7d5e4U, 0x7aa7dde0U,
2991da177e4SLinus Torvalds 	0x408bcbebU, 0x477a3d90U, 0xffaa55a4U, 0x44783c1eU,
3001da177e4SLinus Torvalds 	0x392e1785U, 0x5d9dc060U, 0x00000000U, 0xde944a25U,
3011da177e4SLinus Torvalds 	0x02f7f5f4U, 0x1ce3fff1U, 0x5f6a3594U, 0x3a2c160bU,
3021da177e4SLinus Torvalds 	0x68bbd3e7U, 0x23c9ea75U, 0x589bc3efU, 0xb8d06834U,
3031da177e4SLinus Torvalds 	0xa6c46231U, 0xc277b5d4U, 0xda67bdd0U, 0x33221186U,
3041da177e4SLinus Torvalds 	0x19e5fc7eU, 0xc98e47adU, 0x34d3e7fdU, 0xf6a45229U,
3051da177e4SLinus Torvalds 	0xa0c06030U, 0x9aec763bU, 0x6546239fU, 0x2ac7edf8U,
3061da177e4SLinus Torvalds 	0xae3f91c6U, 0x6a4c2613U, 0x14180c06U, 0x1e140a05U,
3071da177e4SLinus Torvalds 	0xa43397c5U, 0x66442211U, 0x2fc1ee77U, 0x15edf87cU,
3081da177e4SLinus Torvalds 	0x01f5f47aU, 0x0dfdf078U, 0xb4d86c36U, 0x4870381cU,
3091da177e4SLinus Torvalds 	0x96e47239U, 0xcb79b259U, 0x50603018U, 0xe945ac56U,
3101da177e4SLinus Torvalds 	0x8df67bb3U, 0x87fa7db0U, 0xd8904824U, 0xc0804020U,
3111da177e4SLinus Torvalds 	0x8bf279b2U, 0x4b723992U, 0xedb65ba3U, 0xba279dc0U,
3121da177e4SLinus Torvalds 	0x850d8844U, 0x5195c462U, 0x60402010U, 0x9fea75b4U,
3131da177e4SLinus Torvalds 	0x3f2a1584U, 0x97118643U, 0x4d763b93U, 0xb62f99c2U,
3141da177e4SLinus Torvalds 	0xa135944aU, 0xa9ce67bdU, 0x0506038fU, 0xeeb45a2dU,
3151da177e4SLinus Torvalds 	0xafca65bcU, 0x6f4a259cU, 0x61b5d46aU, 0x9d1d8040U,
3161da177e4SLinus Torvalds 	0x981b83cfU, 0xebb259a2U, 0x273a1d80U, 0xbf219e4fU,
3171da177e4SLinus Torvalds 	0x427c3e1fU, 0x860f89caU, 0xdb9249aaU, 0x91158442U,
3181da177e4SLinus Torvalds };
3191da177e4SLinus Torvalds 
3201da177e4SLinus Torvalds static const u32 T4[256] = {
3211da177e4SLinus Torvalds 	0xbabababaU, 0x54545454U, 0x2f2f2f2fU, 0x74747474U,
3221da177e4SLinus Torvalds 	0x53535353U, 0xd3d3d3d3U, 0xd2d2d2d2U, 0x4d4d4d4dU,
3231da177e4SLinus Torvalds 	0x50505050U, 0xacacacacU, 0x8d8d8d8dU, 0xbfbfbfbfU,
3241da177e4SLinus Torvalds 	0x70707070U, 0x52525252U, 0x9a9a9a9aU, 0x4c4c4c4cU,
3251da177e4SLinus Torvalds 	0xeaeaeaeaU, 0xd5d5d5d5U, 0x97979797U, 0xd1d1d1d1U,
3261da177e4SLinus Torvalds 	0x33333333U, 0x51515151U, 0x5b5b5b5bU, 0xa6a6a6a6U,
3271da177e4SLinus Torvalds 	0xdedededeU, 0x48484848U, 0xa8a8a8a8U, 0x99999999U,
3281da177e4SLinus Torvalds 	0xdbdbdbdbU, 0x32323232U, 0xb7b7b7b7U, 0xfcfcfcfcU,
3291da177e4SLinus Torvalds 	0xe3e3e3e3U, 0x9e9e9e9eU, 0x91919191U, 0x9b9b9b9bU,
3301da177e4SLinus Torvalds 	0xe2e2e2e2U, 0xbbbbbbbbU, 0x41414141U, 0x6e6e6e6eU,
3311da177e4SLinus Torvalds 	0xa5a5a5a5U, 0xcbcbcbcbU, 0x6b6b6b6bU, 0x95959595U,
3321da177e4SLinus Torvalds 	0xa1a1a1a1U, 0xf3f3f3f3U, 0xb1b1b1b1U, 0x02020202U,
3331da177e4SLinus Torvalds 	0xccccccccU, 0xc4c4c4c4U, 0x1d1d1d1dU, 0x14141414U,
3341da177e4SLinus Torvalds 	0xc3c3c3c3U, 0x63636363U, 0xdadadadaU, 0x5d5d5d5dU,
3351da177e4SLinus Torvalds 	0x5f5f5f5fU, 0xdcdcdcdcU, 0x7d7d7d7dU, 0xcdcdcdcdU,
3361da177e4SLinus Torvalds 	0x7f7f7f7fU, 0x5a5a5a5aU, 0x6c6c6c6cU, 0x5c5c5c5cU,
3371da177e4SLinus Torvalds 	0xf7f7f7f7U, 0x26262626U, 0xffffffffU, 0xededededU,
3381da177e4SLinus Torvalds 	0xe8e8e8e8U, 0x9d9d9d9dU, 0x6f6f6f6fU, 0x8e8e8e8eU,
3391da177e4SLinus Torvalds 	0x19191919U, 0xa0a0a0a0U, 0xf0f0f0f0U, 0x89898989U,
3401da177e4SLinus Torvalds 	0x0f0f0f0fU, 0x07070707U, 0xafafafafU, 0xfbfbfbfbU,
3411da177e4SLinus Torvalds 	0x08080808U, 0x15151515U, 0x0d0d0d0dU, 0x04040404U,
3421da177e4SLinus Torvalds 	0x01010101U, 0x64646464U, 0xdfdfdfdfU, 0x76767676U,
3431da177e4SLinus Torvalds 	0x79797979U, 0xddddddddU, 0x3d3d3d3dU, 0x16161616U,
3441da177e4SLinus Torvalds 	0x3f3f3f3fU, 0x37373737U, 0x6d6d6d6dU, 0x38383838U,
3451da177e4SLinus Torvalds 	0xb9b9b9b9U, 0x73737373U, 0xe9e9e9e9U, 0x35353535U,
3461da177e4SLinus Torvalds 	0x55555555U, 0x71717171U, 0x7b7b7b7bU, 0x8c8c8c8cU,
3471da177e4SLinus Torvalds 	0x72727272U, 0x88888888U, 0xf6f6f6f6U, 0x2a2a2a2aU,
3481da177e4SLinus Torvalds 	0x3e3e3e3eU, 0x5e5e5e5eU, 0x27272727U, 0x46464646U,
3491da177e4SLinus Torvalds 	0x0c0c0c0cU, 0x65656565U, 0x68686868U, 0x61616161U,
3501da177e4SLinus Torvalds 	0x03030303U, 0xc1c1c1c1U, 0x57575757U, 0xd6d6d6d6U,
3511da177e4SLinus Torvalds 	0xd9d9d9d9U, 0x58585858U, 0xd8d8d8d8U, 0x66666666U,
3521da177e4SLinus Torvalds 	0xd7d7d7d7U, 0x3a3a3a3aU, 0xc8c8c8c8U, 0x3c3c3c3cU,
3531da177e4SLinus Torvalds 	0xfafafafaU, 0x96969696U, 0xa7a7a7a7U, 0x98989898U,
3541da177e4SLinus Torvalds 	0xececececU, 0xb8b8b8b8U, 0xc7c7c7c7U, 0xaeaeaeaeU,
3551da177e4SLinus Torvalds 	0x69696969U, 0x4b4b4b4bU, 0xababababU, 0xa9a9a9a9U,
3561da177e4SLinus Torvalds 	0x67676767U, 0x0a0a0a0aU, 0x47474747U, 0xf2f2f2f2U,
3571da177e4SLinus Torvalds 	0xb5b5b5b5U, 0x22222222U, 0xe5e5e5e5U, 0xeeeeeeeeU,
3581da177e4SLinus Torvalds 	0xbebebebeU, 0x2b2b2b2bU, 0x81818181U, 0x12121212U,
3591da177e4SLinus Torvalds 	0x83838383U, 0x1b1b1b1bU, 0x0e0e0e0eU, 0x23232323U,
3601da177e4SLinus Torvalds 	0xf5f5f5f5U, 0x45454545U, 0x21212121U, 0xcecececeU,
3611da177e4SLinus Torvalds 	0x49494949U, 0x2c2c2c2cU, 0xf9f9f9f9U, 0xe6e6e6e6U,
3621da177e4SLinus Torvalds 	0xb6b6b6b6U, 0x28282828U, 0x17171717U, 0x82828282U,
3631da177e4SLinus Torvalds 	0x1a1a1a1aU, 0x8b8b8b8bU, 0xfefefefeU, 0x8a8a8a8aU,
3641da177e4SLinus Torvalds 	0x09090909U, 0xc9c9c9c9U, 0x87878787U, 0x4e4e4e4eU,
3651da177e4SLinus Torvalds 	0xe1e1e1e1U, 0x2e2e2e2eU, 0xe4e4e4e4U, 0xe0e0e0e0U,
3661da177e4SLinus Torvalds 	0xebebebebU, 0x90909090U, 0xa4a4a4a4U, 0x1e1e1e1eU,
3671da177e4SLinus Torvalds 	0x85858585U, 0x60606060U, 0x00000000U, 0x25252525U,
3681da177e4SLinus Torvalds 	0xf4f4f4f4U, 0xf1f1f1f1U, 0x94949494U, 0x0b0b0b0bU,
3691da177e4SLinus Torvalds 	0xe7e7e7e7U, 0x75757575U, 0xefefefefU, 0x34343434U,
3701da177e4SLinus Torvalds 	0x31313131U, 0xd4d4d4d4U, 0xd0d0d0d0U, 0x86868686U,
3711da177e4SLinus Torvalds 	0x7e7e7e7eU, 0xadadadadU, 0xfdfdfdfdU, 0x29292929U,
3721da177e4SLinus Torvalds 	0x30303030U, 0x3b3b3b3bU, 0x9f9f9f9fU, 0xf8f8f8f8U,
3731da177e4SLinus Torvalds 	0xc6c6c6c6U, 0x13131313U, 0x06060606U, 0x05050505U,
3741da177e4SLinus Torvalds 	0xc5c5c5c5U, 0x11111111U, 0x77777777U, 0x7c7c7c7cU,
3751da177e4SLinus Torvalds 	0x7a7a7a7aU, 0x78787878U, 0x36363636U, 0x1c1c1c1cU,
3761da177e4SLinus Torvalds 	0x39393939U, 0x59595959U, 0x18181818U, 0x56565656U,
3771da177e4SLinus Torvalds 	0xb3b3b3b3U, 0xb0b0b0b0U, 0x24242424U, 0x20202020U,
3781da177e4SLinus Torvalds 	0xb2b2b2b2U, 0x92929292U, 0xa3a3a3a3U, 0xc0c0c0c0U,
3791da177e4SLinus Torvalds 	0x44444444U, 0x62626262U, 0x10101010U, 0xb4b4b4b4U,
3801da177e4SLinus Torvalds 	0x84848484U, 0x43434343U, 0x93939393U, 0xc2c2c2c2U,
3811da177e4SLinus Torvalds 	0x4a4a4a4aU, 0xbdbdbdbdU, 0x8f8f8f8fU, 0x2d2d2d2dU,
3821da177e4SLinus Torvalds 	0xbcbcbcbcU, 0x9c9c9c9cU, 0x6a6a6a6aU, 0x40404040U,
3831da177e4SLinus Torvalds 	0xcfcfcfcfU, 0xa2a2a2a2U, 0x80808080U, 0x4f4f4f4fU,
3841da177e4SLinus Torvalds 	0x1f1f1f1fU, 0xcacacacaU, 0xaaaaaaaaU, 0x42424242U,
3851da177e4SLinus Torvalds };
3861da177e4SLinus Torvalds 
3871da177e4SLinus Torvalds static const u32 T5[256] = {
3881da177e4SLinus Torvalds 	0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
3891da177e4SLinus Torvalds 	0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
3901da177e4SLinus Torvalds 	0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
3911da177e4SLinus Torvalds 	0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
3921da177e4SLinus Torvalds 	0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
3931da177e4SLinus Torvalds 	0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
3941da177e4SLinus Torvalds 	0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
3951da177e4SLinus Torvalds 	0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
3961da177e4SLinus Torvalds 	0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
3971da177e4SLinus Torvalds 	0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
3981da177e4SLinus Torvalds 	0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
3991da177e4SLinus Torvalds 	0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
4001da177e4SLinus Torvalds 	0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
4011da177e4SLinus Torvalds 	0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
4021da177e4SLinus Torvalds 	0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
4031da177e4SLinus Torvalds 	0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
4041da177e4SLinus Torvalds 	0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
4051da177e4SLinus Torvalds 	0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
4061da177e4SLinus Torvalds 	0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
4071da177e4SLinus Torvalds 	0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
4081da177e4SLinus Torvalds 	0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
4091da177e4SLinus Torvalds 	0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
4101da177e4SLinus Torvalds 	0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
4111da177e4SLinus Torvalds 	0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
4121da177e4SLinus Torvalds 	0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
4131da177e4SLinus Torvalds 	0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
4141da177e4SLinus Torvalds 	0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
4151da177e4SLinus Torvalds 	0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
4161da177e4SLinus Torvalds 	0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
4171da177e4SLinus Torvalds 	0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
4181da177e4SLinus Torvalds 	0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
4191da177e4SLinus Torvalds 	0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
4201da177e4SLinus Torvalds 	0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
4211da177e4SLinus Torvalds 	0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
4221da177e4SLinus Torvalds 	0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
4231da177e4SLinus Torvalds 	0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
4241da177e4SLinus Torvalds 	0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
4251da177e4SLinus Torvalds 	0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
4261da177e4SLinus Torvalds 	0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
4271da177e4SLinus Torvalds 	0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
4281da177e4SLinus Torvalds 	0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
4291da177e4SLinus Torvalds 	0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
4301da177e4SLinus Torvalds 	0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
4311da177e4SLinus Torvalds 	0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
4321da177e4SLinus Torvalds 	0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
4331da177e4SLinus Torvalds 	0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
4341da177e4SLinus Torvalds 	0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
4351da177e4SLinus Torvalds 	0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
4361da177e4SLinus Torvalds 	0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
4371da177e4SLinus Torvalds 	0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
4381da177e4SLinus Torvalds 	0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
4391da177e4SLinus Torvalds 	0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
4401da177e4SLinus Torvalds 	0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
4411da177e4SLinus Torvalds 	0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
4421da177e4SLinus Torvalds 	0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
4431da177e4SLinus Torvalds 	0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
4441da177e4SLinus Torvalds 	0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
4451da177e4SLinus Torvalds 	0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
4461da177e4SLinus Torvalds 	0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
4471da177e4SLinus Torvalds 	0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
4481da177e4SLinus Torvalds 	0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
4491da177e4SLinus Torvalds 	0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
4501da177e4SLinus Torvalds 	0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
4511da177e4SLinus Torvalds 	0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
4521da177e4SLinus Torvalds };
4531da177e4SLinus Torvalds 
4541da177e4SLinus Torvalds static const u32 rc[] = {
4551da177e4SLinus Torvalds 	0xba542f74U, 0x53d3d24dU, 0x50ac8dbfU, 0x70529a4cU,
4561da177e4SLinus Torvalds 	0xead597d1U, 0x33515ba6U, 0xde48a899U, 0xdb32b7fcU,
4571da177e4SLinus Torvalds 	0xe39e919bU, 0xe2bb416eU, 0xa5cb6b95U, 0xa1f3b102U,
4581da177e4SLinus Torvalds 	0xccc41d14U, 0xc363da5dU, 0x5fdc7dcdU, 0x7f5a6c5cU,
4591da177e4SLinus Torvalds 	0xf726ffedU, 0xe89d6f8eU, 0x19a0f089U,
4601da177e4SLinus Torvalds };
4611da177e4SLinus Torvalds 
anubis_setkey(struct crypto_tfm * tfm,const u8 * in_key,unsigned int key_len)4626c2bb98bSHerbert Xu static int anubis_setkey(struct crypto_tfm *tfm, const u8 *in_key,
463560c06aeSHerbert Xu 			 unsigned int key_len)
4641da177e4SLinus Torvalds {
4656c2bb98bSHerbert Xu 	struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
46606ace7a9SHerbert Xu 	const __be32 *key = (const __be32 *)in_key;
46706ace7a9SHerbert Xu 	int N, R, i, r;
4681da177e4SLinus Torvalds 	u32 kappa[ANUBIS_MAX_N];
4691da177e4SLinus Torvalds 	u32 inter[ANUBIS_MAX_N];
4701da177e4SLinus Torvalds 
471189bd4b0SRichard Hartmann 	switch (key_len) {
4721da177e4SLinus Torvalds 		case 16: case 20: case 24: case 28:
4731da177e4SLinus Torvalds 		case 32: case 36: case 40:
4741da177e4SLinus Torvalds 			break;
4751da177e4SLinus Torvalds 		default:
4761da177e4SLinus Torvalds 			return -EINVAL;
4771da177e4SLinus Torvalds 	}
4781da177e4SLinus Torvalds 
4791da177e4SLinus Torvalds 	ctx->key_len = key_len * 8;
4801da177e4SLinus Torvalds 	N = ctx->key_len >> 5;
4811da177e4SLinus Torvalds 	ctx->R = R = 8 + N;
4821da177e4SLinus Torvalds 
4831da177e4SLinus Torvalds 	/* * map cipher key to initial key state (mu): */
48406ace7a9SHerbert Xu 	for (i = 0; i < N; i++)
48506ace7a9SHerbert Xu 		kappa[i] = be32_to_cpu(key[i]);
4861da177e4SLinus Torvalds 
4871da177e4SLinus Torvalds 	/*
4881da177e4SLinus Torvalds 	 * generate R + 1 round keys:
4891da177e4SLinus Torvalds 	 */
4901da177e4SLinus Torvalds 	for (r = 0; r <= R; r++) {
4911da177e4SLinus Torvalds 		u32 K0, K1, K2, K3;
4921da177e4SLinus Torvalds 		/*
4931da177e4SLinus Torvalds 		 * generate r-th round key K^r:
4941da177e4SLinus Torvalds 		 */
4951da177e4SLinus Torvalds 		K0 = T4[(kappa[N - 1] >> 24)       ];
4961da177e4SLinus Torvalds 		K1 = T4[(kappa[N - 1] >> 16) & 0xff];
4971da177e4SLinus Torvalds 		K2 = T4[(kappa[N - 1] >>  8) & 0xff];
4981da177e4SLinus Torvalds 		K3 = T4[(kappa[N - 1]      ) & 0xff];
4991da177e4SLinus Torvalds 		for (i = N - 2; i >= 0; i--) {
5001da177e4SLinus Torvalds 			K0 = T4[(kappa[i] >> 24)       ] ^
5011da177e4SLinus Torvalds 				(T5[(K0 >> 24)       ] & 0xff000000U) ^
5021da177e4SLinus Torvalds 				(T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
5031da177e4SLinus Torvalds 				(T5[(K0 >>  8) & 0xff] & 0x0000ff00U) ^
5041da177e4SLinus Torvalds 				(T5[(K0      ) & 0xff] & 0x000000ffU);
5051da177e4SLinus Torvalds 			K1 = T4[(kappa[i] >> 16) & 0xff] ^
5061da177e4SLinus Torvalds 				(T5[(K1 >> 24)       ] & 0xff000000U) ^
5071da177e4SLinus Torvalds 				(T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
5081da177e4SLinus Torvalds 				(T5[(K1 >>  8) & 0xff] & 0x0000ff00U) ^
5091da177e4SLinus Torvalds 				(T5[(K1      ) & 0xff] & 0x000000ffU);
5101da177e4SLinus Torvalds 			K2 = T4[(kappa[i] >>  8) & 0xff] ^
5111da177e4SLinus Torvalds 				(T5[(K2 >> 24)       ] & 0xff000000U) ^
5121da177e4SLinus Torvalds 				(T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
5131da177e4SLinus Torvalds 				(T5[(K2 >>  8) & 0xff] & 0x0000ff00U) ^
5141da177e4SLinus Torvalds 				(T5[(K2      ) & 0xff] & 0x000000ffU);
5151da177e4SLinus Torvalds 			K3 = T4[(kappa[i]      ) & 0xff] ^
5161da177e4SLinus Torvalds 				(T5[(K3 >> 24)       ] & 0xff000000U) ^
5171da177e4SLinus Torvalds 				(T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
5181da177e4SLinus Torvalds 				(T5[(K3 >>  8) & 0xff] & 0x0000ff00U) ^
5191da177e4SLinus Torvalds 				(T5[(K3      ) & 0xff] & 0x000000ffU);
5201da177e4SLinus Torvalds 		}
5211da177e4SLinus Torvalds 
5221da177e4SLinus Torvalds 		ctx->E[r][0] = K0;
5231da177e4SLinus Torvalds 		ctx->E[r][1] = K1;
5241da177e4SLinus Torvalds 		ctx->E[r][2] = K2;
5251da177e4SLinus Torvalds 		ctx->E[r][3] = K3;
5261da177e4SLinus Torvalds 
5271da177e4SLinus Torvalds 		/*
5281da177e4SLinus Torvalds 		 * compute kappa^{r+1} from kappa^r:
5291da177e4SLinus Torvalds 		 */
530189bd4b0SRichard Hartmann 		if (r == R)
5311da177e4SLinus Torvalds 			break;
5321da177e4SLinus Torvalds 		for (i = 0; i < N; i++) {
5331da177e4SLinus Torvalds 			int j = i;
5341da177e4SLinus Torvalds 			inter[i]  = T0[(kappa[j--] >> 24)       ];
535189bd4b0SRichard Hartmann 			if (j < 0)
536189bd4b0SRichard Hartmann 				j = N - 1;
5371da177e4SLinus Torvalds 			inter[i] ^= T1[(kappa[j--] >> 16) & 0xff];
538189bd4b0SRichard Hartmann 			if (j < 0)
539189bd4b0SRichard Hartmann 				j = N - 1;
5401da177e4SLinus Torvalds 			inter[i] ^= T2[(kappa[j--] >>  8) & 0xff];
541189bd4b0SRichard Hartmann 			if (j < 0)
542189bd4b0SRichard Hartmann 				j = N - 1;
5431da177e4SLinus Torvalds 			inter[i] ^= T3[(kappa[j  ]      ) & 0xff];
5441da177e4SLinus Torvalds 		}
5451da177e4SLinus Torvalds 		kappa[0] = inter[0] ^ rc[r];
546189bd4b0SRichard Hartmann 		for (i = 1; i < N; i++)
5471da177e4SLinus Torvalds 			kappa[i] = inter[i];
5481da177e4SLinus Torvalds 	}
5491da177e4SLinus Torvalds 
5501da177e4SLinus Torvalds 	/*
5511da177e4SLinus Torvalds 	 * generate inverse key schedule: K'^0 = K^R, K'^R =
5521da177e4SLinus Torvalds 	 * 				  K^0, K'^r = theta(K^{R-r}):
5531da177e4SLinus Torvalds 	 */
5541da177e4SLinus Torvalds 	for (i = 0; i < 4; i++) {
5551da177e4SLinus Torvalds 		ctx->D[0][i] = ctx->E[R][i];
5561da177e4SLinus Torvalds 		ctx->D[R][i] = ctx->E[0][i];
5571da177e4SLinus Torvalds 	}
5581da177e4SLinus Torvalds 	for (r = 1; r < R; r++) {
5591da177e4SLinus Torvalds 		for (i = 0; i < 4; i++) {
5601da177e4SLinus Torvalds 			u32 v = ctx->E[R - r][i];
5611da177e4SLinus Torvalds 			ctx->D[r][i] =
5621da177e4SLinus Torvalds 				T0[T4[(v >> 24)       ] & 0xff] ^
5631da177e4SLinus Torvalds 				T1[T4[(v >> 16) & 0xff] & 0xff] ^
5641da177e4SLinus Torvalds 				T2[T4[(v >>  8) & 0xff] & 0xff] ^
5651da177e4SLinus Torvalds 				T3[T4[(v      ) & 0xff] & 0xff];
5661da177e4SLinus Torvalds 		}
5671da177e4SLinus Torvalds 	}
5681da177e4SLinus Torvalds 
5691da177e4SLinus Torvalds 	return 0;
5701da177e4SLinus Torvalds }
5711da177e4SLinus Torvalds 
anubis_crypt(u32 roundKey[ANUBIS_MAX_ROUNDS+1][4],u8 * ciphertext,const u8 * plaintext,const int R)5721da177e4SLinus Torvalds static void anubis_crypt(u32 roundKey[ANUBIS_MAX_ROUNDS + 1][4],
5731da177e4SLinus Torvalds 		u8 *ciphertext, const u8 *plaintext, const int R)
5741da177e4SLinus Torvalds {
57506ace7a9SHerbert Xu 	const __be32 *src = (const __be32 *)plaintext;
57606ace7a9SHerbert Xu 	__be32 *dst = (__be32 *)ciphertext;
57706ace7a9SHerbert Xu 	int i, r;
5781da177e4SLinus Torvalds 	u32 state[4];
5791da177e4SLinus Torvalds 	u32 inter[4];
5801da177e4SLinus Torvalds 
5811da177e4SLinus Torvalds 	/*
5821da177e4SLinus Torvalds 	 * map plaintext block to cipher state (mu)
5831da177e4SLinus Torvalds 	 * and add initial round key (sigma[K^0]):
5841da177e4SLinus Torvalds 	 */
58506ace7a9SHerbert Xu 	for (i = 0; i < 4; i++)
58606ace7a9SHerbert Xu 		state[i] = be32_to_cpu(src[i]) ^ roundKey[0][i];
5871da177e4SLinus Torvalds 
5881da177e4SLinus Torvalds 	/*
5891da177e4SLinus Torvalds 	 * R - 1 full rounds:
5901da177e4SLinus Torvalds 	 */
5911da177e4SLinus Torvalds 
5921da177e4SLinus Torvalds 	for (r = 1; r < R; r++) {
5931da177e4SLinus Torvalds 		inter[0] =
5941da177e4SLinus Torvalds 			T0[(state[0] >> 24)       ] ^
5951da177e4SLinus Torvalds 			T1[(state[1] >> 24)       ] ^
5961da177e4SLinus Torvalds 			T2[(state[2] >> 24)       ] ^
5971da177e4SLinus Torvalds 			T3[(state[3] >> 24)       ] ^
5981da177e4SLinus Torvalds 			roundKey[r][0];
5991da177e4SLinus Torvalds 		inter[1] =
6001da177e4SLinus Torvalds 			T0[(state[0] >> 16) & 0xff] ^
6011da177e4SLinus Torvalds 			T1[(state[1] >> 16) & 0xff] ^
6021da177e4SLinus Torvalds 			T2[(state[2] >> 16) & 0xff] ^
6031da177e4SLinus Torvalds 			T3[(state[3] >> 16) & 0xff] ^
6041da177e4SLinus Torvalds 			roundKey[r][1];
6051da177e4SLinus Torvalds 		inter[2] =
6061da177e4SLinus Torvalds 			T0[(state[0] >>  8) & 0xff] ^
6071da177e4SLinus Torvalds 			T1[(state[1] >>  8) & 0xff] ^
6081da177e4SLinus Torvalds 			T2[(state[2] >>  8) & 0xff] ^
6091da177e4SLinus Torvalds 			T3[(state[3] >>  8) & 0xff] ^
6101da177e4SLinus Torvalds 			roundKey[r][2];
6111da177e4SLinus Torvalds 		inter[3] =
6121da177e4SLinus Torvalds 			T0[(state[0]      ) & 0xff] ^
6131da177e4SLinus Torvalds 			T1[(state[1]      ) & 0xff] ^
6141da177e4SLinus Torvalds 			T2[(state[2]      ) & 0xff] ^
6151da177e4SLinus Torvalds 			T3[(state[3]      ) & 0xff] ^
6161da177e4SLinus Torvalds 			roundKey[r][3];
6171da177e4SLinus Torvalds 		state[0] = inter[0];
6181da177e4SLinus Torvalds 		state[1] = inter[1];
6191da177e4SLinus Torvalds 		state[2] = inter[2];
6201da177e4SLinus Torvalds 		state[3] = inter[3];
6211da177e4SLinus Torvalds 	}
6221da177e4SLinus Torvalds 
6231da177e4SLinus Torvalds 	/*
6241da177e4SLinus Torvalds 	 * last round:
6251da177e4SLinus Torvalds 	 */
6261da177e4SLinus Torvalds 
6271da177e4SLinus Torvalds 	inter[0] =
6281da177e4SLinus Torvalds 		(T0[(state[0] >> 24)       ] & 0xff000000U) ^
6291da177e4SLinus Torvalds 		(T1[(state[1] >> 24)       ] & 0x00ff0000U) ^
6301da177e4SLinus Torvalds 		(T2[(state[2] >> 24)       ] & 0x0000ff00U) ^
6311da177e4SLinus Torvalds 		(T3[(state[3] >> 24)       ] & 0x000000ffU) ^
6321da177e4SLinus Torvalds 		roundKey[R][0];
6331da177e4SLinus Torvalds 	inter[1] =
6341da177e4SLinus Torvalds 		(T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
6351da177e4SLinus Torvalds 		(T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
6361da177e4SLinus Torvalds 		(T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
6371da177e4SLinus Torvalds 		(T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
6381da177e4SLinus Torvalds 		roundKey[R][1];
6391da177e4SLinus Torvalds 	inter[2] =
6401da177e4SLinus Torvalds 		(T0[(state[0] >>  8) & 0xff] & 0xff000000U) ^
6411da177e4SLinus Torvalds 		(T1[(state[1] >>  8) & 0xff] & 0x00ff0000U) ^
6421da177e4SLinus Torvalds 		(T2[(state[2] >>  8) & 0xff] & 0x0000ff00U) ^
6431da177e4SLinus Torvalds 		(T3[(state[3] >>  8) & 0xff] & 0x000000ffU) ^
6441da177e4SLinus Torvalds 		roundKey[R][2];
6451da177e4SLinus Torvalds 	inter[3] =
6461da177e4SLinus Torvalds 		(T0[(state[0]      ) & 0xff] & 0xff000000U) ^
6471da177e4SLinus Torvalds 		(T1[(state[1]      ) & 0xff] & 0x00ff0000U) ^
6481da177e4SLinus Torvalds 		(T2[(state[2]      ) & 0xff] & 0x0000ff00U) ^
6491da177e4SLinus Torvalds 		(T3[(state[3]      ) & 0xff] & 0x000000ffU) ^
6501da177e4SLinus Torvalds 		roundKey[R][3];
6511da177e4SLinus Torvalds 
6521da177e4SLinus Torvalds 	/*
6531da177e4SLinus Torvalds 	 * map cipher state to ciphertext block (mu^{-1}):
6541da177e4SLinus Torvalds 	 */
6551da177e4SLinus Torvalds 
65606ace7a9SHerbert Xu 	for (i = 0; i < 4; i++)
65706ace7a9SHerbert Xu 		dst[i] = cpu_to_be32(inter[i]);
6581da177e4SLinus Torvalds }
6591da177e4SLinus Torvalds 
anubis_encrypt(struct crypto_tfm * tfm,u8 * dst,const u8 * src)6606c2bb98bSHerbert Xu static void anubis_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
6611da177e4SLinus Torvalds {
6626c2bb98bSHerbert Xu 	struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
6631da177e4SLinus Torvalds 	anubis_crypt(ctx->E, dst, src, ctx->R);
6641da177e4SLinus Torvalds }
6651da177e4SLinus Torvalds 
anubis_decrypt(struct crypto_tfm * tfm,u8 * dst,const u8 * src)6666c2bb98bSHerbert Xu static void anubis_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
6671da177e4SLinus Torvalds {
6686c2bb98bSHerbert Xu 	struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
6691da177e4SLinus Torvalds 	anubis_crypt(ctx->D, dst, src, ctx->R);
6701da177e4SLinus Torvalds }
6711da177e4SLinus Torvalds 
6721da177e4SLinus Torvalds static struct crypto_alg anubis_alg = {
6731da177e4SLinus Torvalds 	.cra_name		=	"anubis",
674d6ebf528SEric Biggers 	.cra_driver_name	=	"anubis-generic",
6751da177e4SLinus Torvalds 	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
6761da177e4SLinus Torvalds 	.cra_blocksize		=	ANUBIS_BLOCK_SIZE,
6771da177e4SLinus Torvalds 	.cra_ctxsize		=	sizeof (struct anubis_ctx),
678a429d260SHerbert Xu 	.cra_alignmask		=	3,
6791da177e4SLinus Torvalds 	.cra_module		=	THIS_MODULE,
6801da177e4SLinus Torvalds 	.cra_u			=	{ .cipher = {
6811da177e4SLinus Torvalds 	.cia_min_keysize	=	ANUBIS_MIN_KEY_SIZE,
6821da177e4SLinus Torvalds 	.cia_max_keysize	=	ANUBIS_MAX_KEY_SIZE,
6831da177e4SLinus Torvalds 	.cia_setkey		= 	anubis_setkey,
6841da177e4SLinus Torvalds 	.cia_encrypt		=	anubis_encrypt,
6851da177e4SLinus Torvalds 	.cia_decrypt		=	anubis_decrypt } }
6861da177e4SLinus Torvalds };
6871da177e4SLinus Torvalds 
anubis_mod_init(void)6883af5b90bSKamalesh Babulal static int __init anubis_mod_init(void)
6891da177e4SLinus Torvalds {
6901da177e4SLinus Torvalds 	int ret = 0;
6911da177e4SLinus Torvalds 
6921da177e4SLinus Torvalds 	ret = crypto_register_alg(&anubis_alg);
6931da177e4SLinus Torvalds 	return ret;
6941da177e4SLinus Torvalds }
6951da177e4SLinus Torvalds 
anubis_mod_fini(void)6963af5b90bSKamalesh Babulal static void __exit anubis_mod_fini(void)
6971da177e4SLinus Torvalds {
6981da177e4SLinus Torvalds 	crypto_unregister_alg(&anubis_alg);
6991da177e4SLinus Torvalds }
7001da177e4SLinus Torvalds 
701c4741b23SEric Biggers subsys_initcall(anubis_mod_init);
7023af5b90bSKamalesh Babulal module_exit(anubis_mod_fini);
7031da177e4SLinus Torvalds 
7041da177e4SLinus Torvalds MODULE_LICENSE("GPL");
7051da177e4SLinus Torvalds MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");
7065d26a105SKees Cook MODULE_ALIAS_CRYPTO("anubis");
707