Back to home page

LXR

 
 

    


0001 /*
0002  * Cryptographic API.
0003  *
0004  * Anubis Algorithm
0005  *
0006  * The Anubis algorithm was developed by Paulo S. L. M. Barreto and
0007  * Vincent Rijmen.
0008  *
0009  * See
0010  *
0011  *  P.S.L.M. Barreto, V. Rijmen,
0012  *  ``The Anubis block cipher,''
0013  *  NESSIE submission, 2000.
0014  *
0015  * This software implements the "tweaked" version of Anubis.
0016  * Only the S-box and (consequently) the rounds constants have been
0017  * changed.
0018  *
0019  * The original authors have disclaimed all copyright interest in this
0020  * code and thus put it in the public domain. The subsequent authors
0021  * have put this under the GNU General Public License.
0022  *
0023  * By Aaron Grothe ajgrothe@yahoo.com, October 28, 2004
0024  *
0025  * This program is free software; you can redistribute it and/or modify
0026  * it under the terms of the GNU General Public License as published by
0027  * the Free Software Foundation; either version 2 of the License, or
0028  * (at your option) any later version.
0029  *
0030  */
0031 
0032 #include <linux/init.h>
0033 #include <linux/module.h>
0034 #include <linux/mm.h>
0035 #include <asm/byteorder.h>
0036 #include <linux/crypto.h>
0037 #include <linux/types.h>
0038 
0039 #define ANUBIS_MIN_KEY_SIZE 16
0040 #define ANUBIS_MAX_KEY_SIZE 40
0041 #define ANUBIS_BLOCK_SIZE   16
0042 #define ANUBIS_MAX_N        10
0043 #define ANUBIS_MAX_ROUNDS   (8 + ANUBIS_MAX_N)
0044 
0045 struct anubis_ctx {
0046     int key_len; // in bits
0047     int R;
0048     u32 E[ANUBIS_MAX_ROUNDS + 1][4];
0049     u32 D[ANUBIS_MAX_ROUNDS + 1][4];
0050 };
0051 
0052 static const u32 T0[256] = {
0053     0xba69d2bbU, 0x54a84de5U, 0x2f5ebce2U, 0x74e8cd25U,
0054     0x53a651f7U, 0xd3bb6bd0U, 0xd2b96fd6U, 0x4d9a29b3U,
0055     0x50a05dfdU, 0xac458acfU, 0x8d070e09U, 0xbf63c6a5U,
0056     0x70e0dd3dU, 0x52a455f1U, 0x9a29527bU, 0x4c982db5U,
0057     0xeac98f46U, 0xd5b773c4U, 0x97336655U, 0xd1bf63dcU,
0058     0x3366ccaaU, 0x51a259fbU, 0x5bb671c7U, 0xa651a2f3U,
0059     0xdea15ffeU, 0x48903dadU, 0xa84d9ad7U, 0x992f5e71U,
0060     0xdbab4be0U, 0x3264c8acU, 0xb773e695U, 0xfce5d732U,
0061     0xe3dbab70U, 0x9e214263U, 0x913f7e41U, 0x9b2b567dU,
0062     0xe2d9af76U, 0xbb6bd6bdU, 0x4182199bU, 0x6edca579U,
0063     0xa557aef9U, 0xcb8b0b80U, 0x6bd6b167U, 0x95376e59U,
0064     0xa15fbee1U, 0xf3fbeb10U, 0xb17ffe81U, 0x0204080cU,
0065     0xcc851792U, 0xc49537a2U, 0x1d3a744eU, 0x14285078U,
0066     0xc39b2bb0U, 0x63c69157U, 0xdaa94fe6U, 0x5dba69d3U,
0067     0x5fbe61dfU, 0xdca557f2U, 0x7dfae913U, 0xcd871394U,
0068     0x7ffee11fU, 0x5ab475c1U, 0x6cd8ad75U, 0x5cb86dd5U,
0069     0xf7f3fb08U, 0x264c98d4U, 0xffe3db38U, 0xedc79354U,
0070     0xe8cd874aU, 0x9d274e69U, 0x6fdea17fU, 0x8e010203U,
0071     0x19326456U, 0xa05dbae7U, 0xf0fde71aU, 0x890f1e11U,
0072     0x0f1e3c22U, 0x070e1c12U, 0xaf4386c5U, 0xfbebcb20U,
0073     0x08102030U, 0x152a547eU, 0x0d1a342eU, 0x04081018U,
0074     0x01020406U, 0x64c88d45U, 0xdfa35bf8U, 0x76ecc529U,
0075     0x79f2f90bU, 0xdda753f4U, 0x3d7af48eU, 0x162c5874U,
0076     0x3f7efc82U, 0x376edcb2U, 0x6ddaa973U, 0x3870e090U,
0077     0xb96fdeb1U, 0x73e6d137U, 0xe9cf834cU, 0x356ad4beU,
0078     0x55aa49e3U, 0x71e2d93bU, 0x7bf6f107U, 0x8c050a0fU,
0079     0x72e4d531U, 0x880d1a17U, 0xf6f1ff0eU, 0x2a54a8fcU,
0080     0x3e7cf884U, 0x5ebc65d9U, 0x274e9cd2U, 0x468c0589U,
0081     0x0c183028U, 0x65ca8943U, 0x68d0bd6dU, 0x61c2995bU,
0082     0x03060c0aU, 0xc19f23bcU, 0x57ae41efU, 0xd6b17fceU,
0083     0xd9af43ecU, 0x58b07dcdU, 0xd8ad47eaU, 0x66cc8549U,
0084     0xd7b37bc8U, 0x3a74e89cU, 0xc88d078aU, 0x3c78f088U,
0085     0xfae9cf26U, 0x96316253U, 0xa753a6f5U, 0x982d5a77U,
0086     0xecc59752U, 0xb86ddab7U, 0xc7933ba8U, 0xae4182c3U,
0087     0x69d2b96bU, 0x4b9631a7U, 0xab4b96ddU, 0xa94f9ed1U,
0088     0x67ce814fU, 0x0a14283cU, 0x478e018fU, 0xf2f9ef16U,
0089     0xb577ee99U, 0x224488ccU, 0xe5d7b364U, 0xeec19f5eU,
0090     0xbe61c2a3U, 0x2b56acfaU, 0x811f3e21U, 0x1224486cU,
0091     0x831b362dU, 0x1b366c5aU, 0x0e1c3824U, 0x23468ccaU,
0092     0xf5f7f304U, 0x458a0983U, 0x214284c6U, 0xce811f9eU,
0093     0x499239abU, 0x2c58b0e8U, 0xf9efc32cU, 0xe6d1bf6eU,
0094     0xb671e293U, 0x2850a0f0U, 0x172e5c72U, 0x8219322bU,
0095     0x1a34685cU, 0x8b0b161dU, 0xfee1df3eU, 0x8a09121bU,
0096     0x09122436U, 0xc98f038cU, 0x87132635U, 0x4e9c25b9U,
0097     0xe1dfa37cU, 0x2e5cb8e4U, 0xe4d5b762U, 0xe0dda77aU,
0098     0xebcb8b40U, 0x903d7a47U, 0xa455aaffU, 0x1e3c7844U,
0099     0x85172e39U, 0x60c09d5dU, 0x00000000U, 0x254a94deU,
0100     0xf4f5f702U, 0xf1ffe31cU, 0x94356a5fU, 0x0b162c3aU,
0101     0xe7d3bb68U, 0x75eac923U, 0xefc39b58U, 0x3468d0b8U,
0102     0x3162c4a6U, 0xd4b577c2U, 0xd0bd67daU, 0x86112233U,
0103     0x7efce519U, 0xad478ec9U, 0xfde7d334U, 0x2952a4f6U,
0104     0x3060c0a0U, 0x3b76ec9aU, 0x9f234665U, 0xf8edc72aU,
0105     0xc6913faeU, 0x13264c6aU, 0x060c1814U, 0x050a141eU,
0106     0xc59733a4U, 0x11224466U, 0x77eec12fU, 0x7cf8ed15U,
0107     0x7af4f501U, 0x78f0fd0dU, 0x366cd8b4U, 0x1c387048U,
0108     0x3972e496U, 0x59b279cbU, 0x18306050U, 0x56ac45e9U,
0109     0xb37bf68dU, 0xb07dfa87U, 0x244890d8U, 0x204080c0U,
0110     0xb279f28bU, 0x9239724bU, 0xa35bb6edU, 0xc09d27baU,
0111     0x44880d85U, 0x62c49551U, 0x10204060U, 0xb475ea9fU,
0112     0x84152a3fU, 0x43861197U, 0x933b764dU, 0xc2992fb6U,
0113     0x4a9435a1U, 0xbd67cea9U, 0x8f030605U, 0x2d5ab4eeU,
0114     0xbc65caafU, 0x9c254a6fU, 0x6ad4b561U, 0x40801d9dU,
0115     0xcf831b98U, 0xa259b2ebU, 0x801d3a27U, 0x4f9e21bfU,
0116     0x1f3e7c42U, 0xca890f86U, 0xaa4992dbU, 0x42841591U,
0117 };
0118 
0119 static const u32 T1[256] = {
0120     0x69babbd2U, 0xa854e54dU, 0x5e2fe2bcU, 0xe87425cdU,
0121     0xa653f751U, 0xbbd3d06bU, 0xb9d2d66fU, 0x9a4db329U,
0122     0xa050fd5dU, 0x45accf8aU, 0x078d090eU, 0x63bfa5c6U,
0123     0xe0703dddU, 0xa452f155U, 0x299a7b52U, 0x984cb52dU,
0124     0xc9ea468fU, 0xb7d5c473U, 0x33975566U, 0xbfd1dc63U,
0125     0x6633aaccU, 0xa251fb59U, 0xb65bc771U, 0x51a6f3a2U,
0126     0xa1defe5fU, 0x9048ad3dU, 0x4da8d79aU, 0x2f99715eU,
0127     0xabdbe04bU, 0x6432acc8U, 0x73b795e6U, 0xe5fc32d7U,
0128     0xdbe370abU, 0x219e6342U, 0x3f91417eU, 0x2b9b7d56U,
0129     0xd9e276afU, 0x6bbbbdd6U, 0x82419b19U, 0xdc6e79a5U,
0130     0x57a5f9aeU, 0x8bcb800bU, 0xd66b67b1U, 0x3795596eU,
0131     0x5fa1e1beU, 0xfbf310ebU, 0x7fb181feU, 0x04020c08U,
0132     0x85cc9217U, 0x95c4a237U, 0x3a1d4e74U, 0x28147850U,
0133     0x9bc3b02bU, 0xc6635791U, 0xa9dae64fU, 0xba5dd369U,
0134     0xbe5fdf61U, 0xa5dcf257U, 0xfa7d13e9U, 0x87cd9413U,
0135     0xfe7f1fe1U, 0xb45ac175U, 0xd86c75adU, 0xb85cd56dU,
0136     0xf3f708fbU, 0x4c26d498U, 0xe3ff38dbU, 0xc7ed5493U,
0137     0xcde84a87U, 0x279d694eU, 0xde6f7fa1U, 0x018e0302U,
0138     0x32195664U, 0x5da0e7baU, 0xfdf01ae7U, 0x0f89111eU,
0139     0x1e0f223cU, 0x0e07121cU, 0x43afc586U, 0xebfb20cbU,
0140     0x10083020U, 0x2a157e54U, 0x1a0d2e34U, 0x08041810U,
0141     0x02010604U, 0xc864458dU, 0xa3dff85bU, 0xec7629c5U,
0142     0xf2790bf9U, 0xa7ddf453U, 0x7a3d8ef4U, 0x2c167458U,
0143     0x7e3f82fcU, 0x6e37b2dcU, 0xda6d73a9U, 0x703890e0U,
0144     0x6fb9b1deU, 0xe67337d1U, 0xcfe94c83U, 0x6a35bed4U,
0145     0xaa55e349U, 0xe2713bd9U, 0xf67b07f1U, 0x058c0f0aU,
0146     0xe47231d5U, 0x0d88171aU, 0xf1f60effU, 0x542afca8U,
0147     0x7c3e84f8U, 0xbc5ed965U, 0x4e27d29cU, 0x8c468905U,
0148     0x180c2830U, 0xca654389U, 0xd0686dbdU, 0xc2615b99U,
0149     0x06030a0cU, 0x9fc1bc23U, 0xae57ef41U, 0xb1d6ce7fU,
0150     0xafd9ec43U, 0xb058cd7dU, 0xadd8ea47U, 0xcc664985U,
0151     0xb3d7c87bU, 0x743a9ce8U, 0x8dc88a07U, 0x783c88f0U,
0152     0xe9fa26cfU, 0x31965362U, 0x53a7f5a6U, 0x2d98775aU,
0153     0xc5ec5297U, 0x6db8b7daU, 0x93c7a83bU, 0x41aec382U,
0154     0xd2696bb9U, 0x964ba731U, 0x4babdd96U, 0x4fa9d19eU,
0155     0xce674f81U, 0x140a3c28U, 0x8e478f01U, 0xf9f216efU,
0156     0x77b599eeU, 0x4422cc88U, 0xd7e564b3U, 0xc1ee5e9fU,
0157     0x61bea3c2U, 0x562bfaacU, 0x1f81213eU, 0x24126c48U,
0158     0x1b832d36U, 0x361b5a6cU, 0x1c0e2438U, 0x4623ca8cU,
0159     0xf7f504f3U, 0x8a458309U, 0x4221c684U, 0x81ce9e1fU,
0160     0x9249ab39U, 0x582ce8b0U, 0xeff92cc3U, 0xd1e66ebfU,
0161     0x71b693e2U, 0x5028f0a0U, 0x2e17725cU, 0x19822b32U,
0162     0x341a5c68U, 0x0b8b1d16U, 0xe1fe3edfU, 0x098a1b12U,
0163     0x12093624U, 0x8fc98c03U, 0x13873526U, 0x9c4eb925U,
0164     0xdfe17ca3U, 0x5c2ee4b8U, 0xd5e462b7U, 0xdde07aa7U,
0165     0xcbeb408bU, 0x3d90477aU, 0x55a4ffaaU, 0x3c1e4478U,
0166     0x1785392eU, 0xc0605d9dU, 0x00000000U, 0x4a25de94U,
0167     0xf5f402f7U, 0xfff11ce3U, 0x35945f6aU, 0x160b3a2cU,
0168     0xd3e768bbU, 0xea7523c9U, 0xc3ef589bU, 0x6834b8d0U,
0169     0x6231a6c4U, 0xb5d4c277U, 0xbdd0da67U, 0x11863322U,
0170     0xfc7e19e5U, 0x47adc98eU, 0xe7fd34d3U, 0x5229f6a4U,
0171     0x6030a0c0U, 0x763b9aecU, 0x239f6546U, 0xedf82ac7U,
0172     0x91c6ae3fU, 0x26136a4cU, 0x0c061418U, 0x0a051e14U,
0173     0x97c5a433U, 0x22116644U, 0xee772fc1U, 0xf87c15edU,
0174     0xf47a01f5U, 0xf0780dfdU, 0x6c36b4d8U, 0x381c4870U,
0175     0x723996e4U, 0xb259cb79U, 0x30185060U, 0xac56e945U,
0176     0x7bb38df6U, 0x7db087faU, 0x4824d890U, 0x4020c080U,
0177     0x79b28bf2U, 0x39924b72U, 0x5ba3edb6U, 0x9dc0ba27U,
0178     0x8844850dU, 0xc4625195U, 0x20106040U, 0x75b49feaU,
0179     0x15843f2aU, 0x86439711U, 0x3b934d76U, 0x99c2b62fU,
0180     0x944aa135U, 0x67bda9ceU, 0x038f0506U, 0x5a2deeb4U,
0181     0x65bcafcaU, 0x259c6f4aU, 0xd46a61b5U, 0x80409d1dU,
0182     0x83cf981bU, 0x59a2ebb2U, 0x1d80273aU, 0x9e4fbf21U,
0183     0x3e1f427cU, 0x89ca860fU, 0x49aadb92U, 0x84429115U,
0184 };
0185 
0186 static const u32 T2[256] = {
0187     0xd2bbba69U, 0x4de554a8U, 0xbce22f5eU, 0xcd2574e8U,
0188     0x51f753a6U, 0x6bd0d3bbU, 0x6fd6d2b9U, 0x29b34d9aU,
0189     0x5dfd50a0U, 0x8acfac45U, 0x0e098d07U, 0xc6a5bf63U,
0190     0xdd3d70e0U, 0x55f152a4U, 0x527b9a29U, 0x2db54c98U,
0191     0x8f46eac9U, 0x73c4d5b7U, 0x66559733U, 0x63dcd1bfU,
0192     0xccaa3366U, 0x59fb51a2U, 0x71c75bb6U, 0xa2f3a651U,
0193     0x5ffedea1U, 0x3dad4890U, 0x9ad7a84dU, 0x5e71992fU,
0194     0x4be0dbabU, 0xc8ac3264U, 0xe695b773U, 0xd732fce5U,
0195     0xab70e3dbU, 0x42639e21U, 0x7e41913fU, 0x567d9b2bU,
0196     0xaf76e2d9U, 0xd6bdbb6bU, 0x199b4182U, 0xa5796edcU,
0197     0xaef9a557U, 0x0b80cb8bU, 0xb1676bd6U, 0x6e599537U,
0198     0xbee1a15fU, 0xeb10f3fbU, 0xfe81b17fU, 0x080c0204U,
0199     0x1792cc85U, 0x37a2c495U, 0x744e1d3aU, 0x50781428U,
0200     0x2bb0c39bU, 0x915763c6U, 0x4fe6daa9U, 0x69d35dbaU,
0201     0x61df5fbeU, 0x57f2dca5U, 0xe9137dfaU, 0x1394cd87U,
0202     0xe11f7ffeU, 0x75c15ab4U, 0xad756cd8U, 0x6dd55cb8U,
0203     0xfb08f7f3U, 0x98d4264cU, 0xdb38ffe3U, 0x9354edc7U,
0204     0x874ae8cdU, 0x4e699d27U, 0xa17f6fdeU, 0x02038e01U,
0205     0x64561932U, 0xbae7a05dU, 0xe71af0fdU, 0x1e11890fU,
0206     0x3c220f1eU, 0x1c12070eU, 0x86c5af43U, 0xcb20fbebU,
0207     0x20300810U, 0x547e152aU, 0x342e0d1aU, 0x10180408U,
0208     0x04060102U, 0x8d4564c8U, 0x5bf8dfa3U, 0xc52976ecU,
0209     0xf90b79f2U, 0x53f4dda7U, 0xf48e3d7aU, 0x5874162cU,
0210     0xfc823f7eU, 0xdcb2376eU, 0xa9736ddaU, 0xe0903870U,
0211     0xdeb1b96fU, 0xd13773e6U, 0x834ce9cfU, 0xd4be356aU,
0212     0x49e355aaU, 0xd93b71e2U, 0xf1077bf6U, 0x0a0f8c05U,
0213     0xd53172e4U, 0x1a17880dU, 0xff0ef6f1U, 0xa8fc2a54U,
0214     0xf8843e7cU, 0x65d95ebcU, 0x9cd2274eU, 0x0589468cU,
0215     0x30280c18U, 0x894365caU, 0xbd6d68d0U, 0x995b61c2U,
0216     0x0c0a0306U, 0x23bcc19fU, 0x41ef57aeU, 0x7fced6b1U,
0217     0x43ecd9afU, 0x7dcd58b0U, 0x47ead8adU, 0x854966ccU,
0218     0x7bc8d7b3U, 0xe89c3a74U, 0x078ac88dU, 0xf0883c78U,
0219     0xcf26fae9U, 0x62539631U, 0xa6f5a753U, 0x5a77982dU,
0220     0x9752ecc5U, 0xdab7b86dU, 0x3ba8c793U, 0x82c3ae41U,
0221     0xb96b69d2U, 0x31a74b96U, 0x96ddab4bU, 0x9ed1a94fU,
0222     0x814f67ceU, 0x283c0a14U, 0x018f478eU, 0xef16f2f9U,
0223     0xee99b577U, 0x88cc2244U, 0xb364e5d7U, 0x9f5eeec1U,
0224     0xc2a3be61U, 0xacfa2b56U, 0x3e21811fU, 0x486c1224U,
0225     0x362d831bU, 0x6c5a1b36U, 0x38240e1cU, 0x8cca2346U,
0226     0xf304f5f7U, 0x0983458aU, 0x84c62142U, 0x1f9ece81U,
0227     0x39ab4992U, 0xb0e82c58U, 0xc32cf9efU, 0xbf6ee6d1U,
0228     0xe293b671U, 0xa0f02850U, 0x5c72172eU, 0x322b8219U,
0229     0x685c1a34U, 0x161d8b0bU, 0xdf3efee1U, 0x121b8a09U,
0230     0x24360912U, 0x038cc98fU, 0x26358713U, 0x25b94e9cU,
0231     0xa37ce1dfU, 0xb8e42e5cU, 0xb762e4d5U, 0xa77ae0ddU,
0232     0x8b40ebcbU, 0x7a47903dU, 0xaaffa455U, 0x78441e3cU,
0233     0x2e398517U, 0x9d5d60c0U, 0x00000000U, 0x94de254aU,
0234     0xf702f4f5U, 0xe31cf1ffU, 0x6a5f9435U, 0x2c3a0b16U,
0235     0xbb68e7d3U, 0xc92375eaU, 0x9b58efc3U, 0xd0b83468U,
0236     0xc4a63162U, 0x77c2d4b5U, 0x67dad0bdU, 0x22338611U,
0237     0xe5197efcU, 0x8ec9ad47U, 0xd334fde7U, 0xa4f62952U,
0238     0xc0a03060U, 0xec9a3b76U, 0x46659f23U, 0xc72af8edU,
0239     0x3faec691U, 0x4c6a1326U, 0x1814060cU, 0x141e050aU,
0240     0x33a4c597U, 0x44661122U, 0xc12f77eeU, 0xed157cf8U,
0241     0xf5017af4U, 0xfd0d78f0U, 0xd8b4366cU, 0x70481c38U,
0242     0xe4963972U, 0x79cb59b2U, 0x60501830U, 0x45e956acU,
0243     0xf68db37bU, 0xfa87b07dU, 0x90d82448U, 0x80c02040U,
0244     0xf28bb279U, 0x724b9239U, 0xb6eda35bU, 0x27bac09dU,
0245     0x0d854488U, 0x955162c4U, 0x40601020U, 0xea9fb475U,
0246     0x2a3f8415U, 0x11974386U, 0x764d933bU, 0x2fb6c299U,
0247     0x35a14a94U, 0xcea9bd67U, 0x06058f03U, 0xb4ee2d5aU,
0248     0xcaafbc65U, 0x4a6f9c25U, 0xb5616ad4U, 0x1d9d4080U,
0249     0x1b98cf83U, 0xb2eba259U, 0x3a27801dU, 0x21bf4f9eU,
0250     0x7c421f3eU, 0x0f86ca89U, 0x92dbaa49U, 0x15914284U,
0251 };
0252 
0253 static const u32 T3[256] = {
0254     0xbbd269baU, 0xe54da854U, 0xe2bc5e2fU, 0x25cde874U,
0255     0xf751a653U, 0xd06bbbd3U, 0xd66fb9d2U, 0xb3299a4dU,
0256     0xfd5da050U, 0xcf8a45acU, 0x090e078dU, 0xa5c663bfU,
0257     0x3ddde070U, 0xf155a452U, 0x7b52299aU, 0xb52d984cU,
0258     0x468fc9eaU, 0xc473b7d5U, 0x55663397U, 0xdc63bfd1U,
0259     0xaacc6633U, 0xfb59a251U, 0xc771b65bU, 0xf3a251a6U,
0260     0xfe5fa1deU, 0xad3d9048U, 0xd79a4da8U, 0x715e2f99U,
0261     0xe04babdbU, 0xacc86432U, 0x95e673b7U, 0x32d7e5fcU,
0262     0x70abdbe3U, 0x6342219eU, 0x417e3f91U, 0x7d562b9bU,
0263     0x76afd9e2U, 0xbdd66bbbU, 0x9b198241U, 0x79a5dc6eU,
0264     0xf9ae57a5U, 0x800b8bcbU, 0x67b1d66bU, 0x596e3795U,
0265     0xe1be5fa1U, 0x10ebfbf3U, 0x81fe7fb1U, 0x0c080402U,
0266     0x921785ccU, 0xa23795c4U, 0x4e743a1dU, 0x78502814U,
0267     0xb02b9bc3U, 0x5791c663U, 0xe64fa9daU, 0xd369ba5dU,
0268     0xdf61be5fU, 0xf257a5dcU, 0x13e9fa7dU, 0x941387cdU,
0269     0x1fe1fe7fU, 0xc175b45aU, 0x75add86cU, 0xd56db85cU,
0270     0x08fbf3f7U, 0xd4984c26U, 0x38dbe3ffU, 0x5493c7edU,
0271     0x4a87cde8U, 0x694e279dU, 0x7fa1de6fU, 0x0302018eU,
0272     0x56643219U, 0xe7ba5da0U, 0x1ae7fdf0U, 0x111e0f89U,
0273     0x223c1e0fU, 0x121c0e07U, 0xc58643afU, 0x20cbebfbU,
0274     0x30201008U, 0x7e542a15U, 0x2e341a0dU, 0x18100804U,
0275     0x06040201U, 0x458dc864U, 0xf85ba3dfU, 0x29c5ec76U,
0276     0x0bf9f279U, 0xf453a7ddU, 0x8ef47a3dU, 0x74582c16U,
0277     0x82fc7e3fU, 0xb2dc6e37U, 0x73a9da6dU, 0x90e07038U,
0278     0xb1de6fb9U, 0x37d1e673U, 0x4c83cfe9U, 0xbed46a35U,
0279     0xe349aa55U, 0x3bd9e271U, 0x07f1f67bU, 0x0f0a058cU,
0280     0x31d5e472U, 0x171a0d88U, 0x0efff1f6U, 0xfca8542aU,
0281     0x84f87c3eU, 0xd965bc5eU, 0xd29c4e27U, 0x89058c46U,
0282     0x2830180cU, 0x4389ca65U, 0x6dbdd068U, 0x5b99c261U,
0283     0x0a0c0603U, 0xbc239fc1U, 0xef41ae57U, 0xce7fb1d6U,
0284     0xec43afd9U, 0xcd7db058U, 0xea47add8U, 0x4985cc66U,
0285     0xc87bb3d7U, 0x9ce8743aU, 0x8a078dc8U, 0x88f0783cU,
0286     0x26cfe9faU, 0x53623196U, 0xf5a653a7U, 0x775a2d98U,
0287     0x5297c5ecU, 0xb7da6db8U, 0xa83b93c7U, 0xc38241aeU,
0288     0x6bb9d269U, 0xa731964bU, 0xdd964babU, 0xd19e4fa9U,
0289     0x4f81ce67U, 0x3c28140aU, 0x8f018e47U, 0x16eff9f2U,
0290     0x99ee77b5U, 0xcc884422U, 0x64b3d7e5U, 0x5e9fc1eeU,
0291     0xa3c261beU, 0xfaac562bU, 0x213e1f81U, 0x6c482412U,
0292     0x2d361b83U, 0x5a6c361bU, 0x24381c0eU, 0xca8c4623U,
0293     0x04f3f7f5U, 0x83098a45U, 0xc6844221U, 0x9e1f81ceU,
0294     0xab399249U, 0xe8b0582cU, 0x2cc3eff9U, 0x6ebfd1e6U,
0295     0x93e271b6U, 0xf0a05028U, 0x725c2e17U, 0x2b321982U,
0296     0x5c68341aU, 0x1d160b8bU, 0x3edfe1feU, 0x1b12098aU,
0297     0x36241209U, 0x8c038fc9U, 0x35261387U, 0xb9259c4eU,
0298     0x7ca3dfe1U, 0xe4b85c2eU, 0x62b7d5e4U, 0x7aa7dde0U,
0299     0x408bcbebU, 0x477a3d90U, 0xffaa55a4U, 0x44783c1eU,
0300     0x392e1785U, 0x5d9dc060U, 0x00000000U, 0xde944a25U,
0301     0x02f7f5f4U, 0x1ce3fff1U, 0x5f6a3594U, 0x3a2c160bU,
0302     0x68bbd3e7U, 0x23c9ea75U, 0x589bc3efU, 0xb8d06834U,
0303     0xa6c46231U, 0xc277b5d4U, 0xda67bdd0U, 0x33221186U,
0304     0x19e5fc7eU, 0xc98e47adU, 0x34d3e7fdU, 0xf6a45229U,
0305     0xa0c06030U, 0x9aec763bU, 0x6546239fU, 0x2ac7edf8U,
0306     0xae3f91c6U, 0x6a4c2613U, 0x14180c06U, 0x1e140a05U,
0307     0xa43397c5U, 0x66442211U, 0x2fc1ee77U, 0x15edf87cU,
0308     0x01f5f47aU, 0x0dfdf078U, 0xb4d86c36U, 0x4870381cU,
0309     0x96e47239U, 0xcb79b259U, 0x50603018U, 0xe945ac56U,
0310     0x8df67bb3U, 0x87fa7db0U, 0xd8904824U, 0xc0804020U,
0311     0x8bf279b2U, 0x4b723992U, 0xedb65ba3U, 0xba279dc0U,
0312     0x850d8844U, 0x5195c462U, 0x60402010U, 0x9fea75b4U,
0313     0x3f2a1584U, 0x97118643U, 0x4d763b93U, 0xb62f99c2U,
0314     0xa135944aU, 0xa9ce67bdU, 0x0506038fU, 0xeeb45a2dU,
0315     0xafca65bcU, 0x6f4a259cU, 0x61b5d46aU, 0x9d1d8040U,
0316     0x981b83cfU, 0xebb259a2U, 0x273a1d80U, 0xbf219e4fU,
0317     0x427c3e1fU, 0x860f89caU, 0xdb9249aaU, 0x91158442U,
0318 };
0319 
0320 static const u32 T4[256] = {
0321     0xbabababaU, 0x54545454U, 0x2f2f2f2fU, 0x74747474U,
0322     0x53535353U, 0xd3d3d3d3U, 0xd2d2d2d2U, 0x4d4d4d4dU,
0323     0x50505050U, 0xacacacacU, 0x8d8d8d8dU, 0xbfbfbfbfU,
0324     0x70707070U, 0x52525252U, 0x9a9a9a9aU, 0x4c4c4c4cU,
0325     0xeaeaeaeaU, 0xd5d5d5d5U, 0x97979797U, 0xd1d1d1d1U,
0326     0x33333333U, 0x51515151U, 0x5b5b5b5bU, 0xa6a6a6a6U,
0327     0xdedededeU, 0x48484848U, 0xa8a8a8a8U, 0x99999999U,
0328     0xdbdbdbdbU, 0x32323232U, 0xb7b7b7b7U, 0xfcfcfcfcU,
0329     0xe3e3e3e3U, 0x9e9e9e9eU, 0x91919191U, 0x9b9b9b9bU,
0330     0xe2e2e2e2U, 0xbbbbbbbbU, 0x41414141U, 0x6e6e6e6eU,
0331     0xa5a5a5a5U, 0xcbcbcbcbU, 0x6b6b6b6bU, 0x95959595U,
0332     0xa1a1a1a1U, 0xf3f3f3f3U, 0xb1b1b1b1U, 0x02020202U,
0333     0xccccccccU, 0xc4c4c4c4U, 0x1d1d1d1dU, 0x14141414U,
0334     0xc3c3c3c3U, 0x63636363U, 0xdadadadaU, 0x5d5d5d5dU,
0335     0x5f5f5f5fU, 0xdcdcdcdcU, 0x7d7d7d7dU, 0xcdcdcdcdU,
0336     0x7f7f7f7fU, 0x5a5a5a5aU, 0x6c6c6c6cU, 0x5c5c5c5cU,
0337     0xf7f7f7f7U, 0x26262626U, 0xffffffffU, 0xededededU,
0338     0xe8e8e8e8U, 0x9d9d9d9dU, 0x6f6f6f6fU, 0x8e8e8e8eU,
0339     0x19191919U, 0xa0a0a0a0U, 0xf0f0f0f0U, 0x89898989U,
0340     0x0f0f0f0fU, 0x07070707U, 0xafafafafU, 0xfbfbfbfbU,
0341     0x08080808U, 0x15151515U, 0x0d0d0d0dU, 0x04040404U,
0342     0x01010101U, 0x64646464U, 0xdfdfdfdfU, 0x76767676U,
0343     0x79797979U, 0xddddddddU, 0x3d3d3d3dU, 0x16161616U,
0344     0x3f3f3f3fU, 0x37373737U, 0x6d6d6d6dU, 0x38383838U,
0345     0xb9b9b9b9U, 0x73737373U, 0xe9e9e9e9U, 0x35353535U,
0346     0x55555555U, 0x71717171U, 0x7b7b7b7bU, 0x8c8c8c8cU,
0347     0x72727272U, 0x88888888U, 0xf6f6f6f6U, 0x2a2a2a2aU,
0348     0x3e3e3e3eU, 0x5e5e5e5eU, 0x27272727U, 0x46464646U,
0349     0x0c0c0c0cU, 0x65656565U, 0x68686868U, 0x61616161U,
0350     0x03030303U, 0xc1c1c1c1U, 0x57575757U, 0xd6d6d6d6U,
0351     0xd9d9d9d9U, 0x58585858U, 0xd8d8d8d8U, 0x66666666U,
0352     0xd7d7d7d7U, 0x3a3a3a3aU, 0xc8c8c8c8U, 0x3c3c3c3cU,
0353     0xfafafafaU, 0x96969696U, 0xa7a7a7a7U, 0x98989898U,
0354     0xececececU, 0xb8b8b8b8U, 0xc7c7c7c7U, 0xaeaeaeaeU,
0355     0x69696969U, 0x4b4b4b4bU, 0xababababU, 0xa9a9a9a9U,
0356     0x67676767U, 0x0a0a0a0aU, 0x47474747U, 0xf2f2f2f2U,
0357     0xb5b5b5b5U, 0x22222222U, 0xe5e5e5e5U, 0xeeeeeeeeU,
0358     0xbebebebeU, 0x2b2b2b2bU, 0x81818181U, 0x12121212U,
0359     0x83838383U, 0x1b1b1b1bU, 0x0e0e0e0eU, 0x23232323U,
0360     0xf5f5f5f5U, 0x45454545U, 0x21212121U, 0xcecececeU,
0361     0x49494949U, 0x2c2c2c2cU, 0xf9f9f9f9U, 0xe6e6e6e6U,
0362     0xb6b6b6b6U, 0x28282828U, 0x17171717U, 0x82828282U,
0363     0x1a1a1a1aU, 0x8b8b8b8bU, 0xfefefefeU, 0x8a8a8a8aU,
0364     0x09090909U, 0xc9c9c9c9U, 0x87878787U, 0x4e4e4e4eU,
0365     0xe1e1e1e1U, 0x2e2e2e2eU, 0xe4e4e4e4U, 0xe0e0e0e0U,
0366     0xebebebebU, 0x90909090U, 0xa4a4a4a4U, 0x1e1e1e1eU,
0367     0x85858585U, 0x60606060U, 0x00000000U, 0x25252525U,
0368     0xf4f4f4f4U, 0xf1f1f1f1U, 0x94949494U, 0x0b0b0b0bU,
0369     0xe7e7e7e7U, 0x75757575U, 0xefefefefU, 0x34343434U,
0370     0x31313131U, 0xd4d4d4d4U, 0xd0d0d0d0U, 0x86868686U,
0371     0x7e7e7e7eU, 0xadadadadU, 0xfdfdfdfdU, 0x29292929U,
0372     0x30303030U, 0x3b3b3b3bU, 0x9f9f9f9fU, 0xf8f8f8f8U,
0373     0xc6c6c6c6U, 0x13131313U, 0x06060606U, 0x05050505U,
0374     0xc5c5c5c5U, 0x11111111U, 0x77777777U, 0x7c7c7c7cU,
0375     0x7a7a7a7aU, 0x78787878U, 0x36363636U, 0x1c1c1c1cU,
0376     0x39393939U, 0x59595959U, 0x18181818U, 0x56565656U,
0377     0xb3b3b3b3U, 0xb0b0b0b0U, 0x24242424U, 0x20202020U,
0378     0xb2b2b2b2U, 0x92929292U, 0xa3a3a3a3U, 0xc0c0c0c0U,
0379     0x44444444U, 0x62626262U, 0x10101010U, 0xb4b4b4b4U,
0380     0x84848484U, 0x43434343U, 0x93939393U, 0xc2c2c2c2U,
0381     0x4a4a4a4aU, 0xbdbdbdbdU, 0x8f8f8f8fU, 0x2d2d2d2dU,
0382     0xbcbcbcbcU, 0x9c9c9c9cU, 0x6a6a6a6aU, 0x40404040U,
0383     0xcfcfcfcfU, 0xa2a2a2a2U, 0x80808080U, 0x4f4f4f4fU,
0384     0x1f1f1f1fU, 0xcacacacaU, 0xaaaaaaaaU, 0x42424242U,
0385 };
0386 
0387 static const u32 T5[256] = {
0388     0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
0389     0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
0390     0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
0391     0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
0392     0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
0393     0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
0394     0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
0395     0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
0396     0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
0397     0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
0398     0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
0399     0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
0400     0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
0401     0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
0402     0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
0403     0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
0404     0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
0405     0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
0406     0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
0407     0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
0408     0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
0409     0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
0410     0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
0411     0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
0412     0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
0413     0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
0414     0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
0415     0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
0416     0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
0417     0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
0418     0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
0419     0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
0420     0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
0421     0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
0422     0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
0423     0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
0424     0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
0425     0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
0426     0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
0427     0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
0428     0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
0429     0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
0430     0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
0431     0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
0432     0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
0433     0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
0434     0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
0435     0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
0436     0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
0437     0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
0438     0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
0439     0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
0440     0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
0441     0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
0442     0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
0443     0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
0444     0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
0445     0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
0446     0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
0447     0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
0448     0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
0449     0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
0450     0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
0451     0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
0452 };
0453 
0454 static const u32 rc[] = {
0455     0xba542f74U, 0x53d3d24dU, 0x50ac8dbfU, 0x70529a4cU,
0456     0xead597d1U, 0x33515ba6U, 0xde48a899U, 0xdb32b7fcU,
0457     0xe39e919bU, 0xe2bb416eU, 0xa5cb6b95U, 0xa1f3b102U,
0458     0xccc41d14U, 0xc363da5dU, 0x5fdc7dcdU, 0x7f5a6c5cU,
0459     0xf726ffedU, 0xe89d6f8eU, 0x19a0f089U,
0460 };
0461 
0462 static int anubis_setkey(struct crypto_tfm *tfm, const u8 *in_key,
0463              unsigned int key_len)
0464 {
0465     struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
0466     const __be32 *key = (const __be32 *)in_key;
0467     u32 *flags = &tfm->crt_flags;
0468     int N, R, i, r;
0469     u32 kappa[ANUBIS_MAX_N];
0470     u32 inter[ANUBIS_MAX_N];
0471 
0472     switch (key_len) {
0473         case 16: case 20: case 24: case 28:
0474         case 32: case 36: case 40:
0475             break;
0476         default:
0477             *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
0478             return -EINVAL;
0479     }
0480 
0481     ctx->key_len = key_len * 8;
0482     N = ctx->key_len >> 5;
0483     ctx->R = R = 8 + N;
0484 
0485     /* * map cipher key to initial key state (mu): */
0486     for (i = 0; i < N; i++)
0487         kappa[i] = be32_to_cpu(key[i]);
0488 
0489     /*
0490      * generate R + 1 round keys:
0491      */
0492     for (r = 0; r <= R; r++) {
0493         u32 K0, K1, K2, K3;
0494         /*
0495          * generate r-th round key K^r:
0496          */
0497         K0 = T4[(kappa[N - 1] >> 24)       ];
0498         K1 = T4[(kappa[N - 1] >> 16) & 0xff];
0499         K2 = T4[(kappa[N - 1] >>  8) & 0xff];
0500         K3 = T4[(kappa[N - 1]      ) & 0xff];
0501         for (i = N - 2; i >= 0; i--) {
0502             K0 = T4[(kappa[i] >> 24)       ] ^
0503                 (T5[(K0 >> 24)       ] & 0xff000000U) ^
0504                 (T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
0505                 (T5[(K0 >>  8) & 0xff] & 0x0000ff00U) ^
0506                 (T5[(K0      ) & 0xff] & 0x000000ffU);
0507             K1 = T4[(kappa[i] >> 16) & 0xff] ^
0508                 (T5[(K1 >> 24)       ] & 0xff000000U) ^
0509                 (T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
0510                 (T5[(K1 >>  8) & 0xff] & 0x0000ff00U) ^
0511                 (T5[(K1      ) & 0xff] & 0x000000ffU);
0512             K2 = T4[(kappa[i] >>  8) & 0xff] ^
0513                 (T5[(K2 >> 24)       ] & 0xff000000U) ^
0514                 (T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
0515                 (T5[(K2 >>  8) & 0xff] & 0x0000ff00U) ^
0516                 (T5[(K2      ) & 0xff] & 0x000000ffU);
0517             K3 = T4[(kappa[i]      ) & 0xff] ^
0518                 (T5[(K3 >> 24)       ] & 0xff000000U) ^
0519                 (T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
0520                 (T5[(K3 >>  8) & 0xff] & 0x0000ff00U) ^
0521                 (T5[(K3      ) & 0xff] & 0x000000ffU);
0522         }
0523 
0524         ctx->E[r][0] = K0;
0525         ctx->E[r][1] = K1;
0526         ctx->E[r][2] = K2;
0527         ctx->E[r][3] = K3;
0528 
0529         /*
0530          * compute kappa^{r+1} from kappa^r:
0531          */
0532         if (r == R)
0533             break;
0534         for (i = 0; i < N; i++) {
0535             int j = i;
0536             inter[i]  = T0[(kappa[j--] >> 24)       ];
0537             if (j < 0)
0538                 j = N - 1;
0539             inter[i] ^= T1[(kappa[j--] >> 16) & 0xff];
0540             if (j < 0)
0541                 j = N - 1;
0542             inter[i] ^= T2[(kappa[j--] >>  8) & 0xff];
0543             if (j < 0)
0544                 j = N - 1;
0545             inter[i] ^= T3[(kappa[j  ]      ) & 0xff];
0546         }
0547         kappa[0] = inter[0] ^ rc[r];
0548         for (i = 1; i < N; i++)
0549             kappa[i] = inter[i];
0550     }
0551 
0552     /*
0553      * generate inverse key schedule: K'^0 = K^R, K'^R =
0554      *                K^0, K'^r = theta(K^{R-r}):
0555      */
0556     for (i = 0; i < 4; i++) {
0557         ctx->D[0][i] = ctx->E[R][i];
0558         ctx->D[R][i] = ctx->E[0][i];
0559     }
0560     for (r = 1; r < R; r++) {
0561         for (i = 0; i < 4; i++) {
0562             u32 v = ctx->E[R - r][i];
0563             ctx->D[r][i] =
0564                 T0[T4[(v >> 24)       ] & 0xff] ^
0565                 T1[T4[(v >> 16) & 0xff] & 0xff] ^
0566                 T2[T4[(v >>  8) & 0xff] & 0xff] ^
0567                 T3[T4[(v      ) & 0xff] & 0xff];
0568         }
0569     }
0570 
0571     return 0;
0572 }
0573 
0574 static void anubis_crypt(u32 roundKey[ANUBIS_MAX_ROUNDS + 1][4],
0575         u8 *ciphertext, const u8 *plaintext, const int R)
0576 {
0577     const __be32 *src = (const __be32 *)plaintext;
0578     __be32 *dst = (__be32 *)ciphertext;
0579     int i, r;
0580     u32 state[4];
0581     u32 inter[4];
0582 
0583     /*
0584      * map plaintext block to cipher state (mu)
0585      * and add initial round key (sigma[K^0]):
0586      */
0587     for (i = 0; i < 4; i++)
0588         state[i] = be32_to_cpu(src[i]) ^ roundKey[0][i];
0589 
0590     /*
0591      * R - 1 full rounds:
0592      */
0593 
0594     for (r = 1; r < R; r++) {
0595         inter[0] =
0596             T0[(state[0] >> 24)       ] ^
0597             T1[(state[1] >> 24)       ] ^
0598             T2[(state[2] >> 24)       ] ^
0599             T3[(state[3] >> 24)       ] ^
0600             roundKey[r][0];
0601         inter[1] =
0602             T0[(state[0] >> 16) & 0xff] ^
0603             T1[(state[1] >> 16) & 0xff] ^
0604             T2[(state[2] >> 16) & 0xff] ^
0605             T3[(state[3] >> 16) & 0xff] ^
0606             roundKey[r][1];
0607         inter[2] =
0608             T0[(state[0] >>  8) & 0xff] ^
0609             T1[(state[1] >>  8) & 0xff] ^
0610             T2[(state[2] >>  8) & 0xff] ^
0611             T3[(state[3] >>  8) & 0xff] ^
0612             roundKey[r][2];
0613         inter[3] =
0614             T0[(state[0]      ) & 0xff] ^
0615             T1[(state[1]      ) & 0xff] ^
0616             T2[(state[2]      ) & 0xff] ^
0617             T3[(state[3]      ) & 0xff] ^
0618             roundKey[r][3];
0619         state[0] = inter[0];
0620         state[1] = inter[1];
0621         state[2] = inter[2];
0622         state[3] = inter[3];
0623     }
0624 
0625     /*
0626      * last round:
0627      */
0628 
0629     inter[0] =
0630         (T0[(state[0] >> 24)       ] & 0xff000000U) ^
0631         (T1[(state[1] >> 24)       ] & 0x00ff0000U) ^
0632         (T2[(state[2] >> 24)       ] & 0x0000ff00U) ^
0633         (T3[(state[3] >> 24)       ] & 0x000000ffU) ^
0634         roundKey[R][0];
0635     inter[1] =
0636         (T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
0637         (T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
0638         (T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
0639         (T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
0640         roundKey[R][1];
0641     inter[2] =
0642         (T0[(state[0] >>  8) & 0xff] & 0xff000000U) ^
0643         (T1[(state[1] >>  8) & 0xff] & 0x00ff0000U) ^
0644         (T2[(state[2] >>  8) & 0xff] & 0x0000ff00U) ^
0645         (T3[(state[3] >>  8) & 0xff] & 0x000000ffU) ^
0646         roundKey[R][2];
0647     inter[3] =
0648         (T0[(state[0]      ) & 0xff] & 0xff000000U) ^
0649         (T1[(state[1]      ) & 0xff] & 0x00ff0000U) ^
0650         (T2[(state[2]      ) & 0xff] & 0x0000ff00U) ^
0651         (T3[(state[3]      ) & 0xff] & 0x000000ffU) ^
0652         roundKey[R][3];
0653 
0654     /*
0655      * map cipher state to ciphertext block (mu^{-1}):
0656      */
0657 
0658     for (i = 0; i < 4; i++)
0659         dst[i] = cpu_to_be32(inter[i]);
0660 }
0661 
0662 static void anubis_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
0663 {
0664     struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
0665     anubis_crypt(ctx->E, dst, src, ctx->R);
0666 }
0667 
0668 static void anubis_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
0669 {
0670     struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
0671     anubis_crypt(ctx->D, dst, src, ctx->R);
0672 }
0673 
0674 static struct crypto_alg anubis_alg = {
0675     .cra_name       =   "anubis",
0676     .cra_flags      =   CRYPTO_ALG_TYPE_CIPHER,
0677     .cra_blocksize      =   ANUBIS_BLOCK_SIZE,
0678     .cra_ctxsize        =   sizeof (struct anubis_ctx),
0679     .cra_alignmask      =   3,
0680     .cra_module     =   THIS_MODULE,
0681     .cra_u          =   { .cipher = {
0682     .cia_min_keysize    =   ANUBIS_MIN_KEY_SIZE,
0683     .cia_max_keysize    =   ANUBIS_MAX_KEY_SIZE,
0684     .cia_setkey     =   anubis_setkey,
0685     .cia_encrypt        =   anubis_encrypt,
0686     .cia_decrypt        =   anubis_decrypt } }
0687 };
0688 
0689 static int __init anubis_mod_init(void)
0690 {
0691     int ret = 0;
0692 
0693     ret = crypto_register_alg(&anubis_alg);
0694     return ret;
0695 }
0696 
0697 static void __exit anubis_mod_fini(void)
0698 {
0699     crypto_unregister_alg(&anubis_alg);
0700 }
0701 
0702 module_init(anubis_mod_init);
0703 module_exit(anubis_mod_fini);
0704 
0705 MODULE_LICENSE("GPL");
0706 MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");
0707 MODULE_ALIAS_CRYPTO("anubis");