Back to home page

OSCL-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     int N, R, i, r;
0468     u32 kappa[ANUBIS_MAX_N];
0469     u32 inter[ANUBIS_MAX_N];
0470 
0471     switch (key_len) {
0472         case 16: case 20: case 24: case 28:
0473         case 32: case 36: case 40:
0474             break;
0475         default:
0476             return -EINVAL;
0477     }
0478 
0479     ctx->key_len = key_len * 8;
0480     N = ctx->key_len >> 5;
0481     ctx->R = R = 8 + N;
0482 
0483     /* * map cipher key to initial key state (mu): */
0484     for (i = 0; i < N; i++)
0485         kappa[i] = be32_to_cpu(key[i]);
0486 
0487     /*
0488      * generate R + 1 round keys:
0489      */
0490     for (r = 0; r <= R; r++) {
0491         u32 K0, K1, K2, K3;
0492         /*
0493          * generate r-th round key K^r:
0494          */
0495         K0 = T4[(kappa[N - 1] >> 24)       ];
0496         K1 = T4[(kappa[N - 1] >> 16) & 0xff];
0497         K2 = T4[(kappa[N - 1] >>  8) & 0xff];
0498         K3 = T4[(kappa[N - 1]      ) & 0xff];
0499         for (i = N - 2; i >= 0; i--) {
0500             K0 = T4[(kappa[i] >> 24)       ] ^
0501                 (T5[(K0 >> 24)       ] & 0xff000000U) ^
0502                 (T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
0503                 (T5[(K0 >>  8) & 0xff] & 0x0000ff00U) ^
0504                 (T5[(K0      ) & 0xff] & 0x000000ffU);
0505             K1 = T4[(kappa[i] >> 16) & 0xff] ^
0506                 (T5[(K1 >> 24)       ] & 0xff000000U) ^
0507                 (T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
0508                 (T5[(K1 >>  8) & 0xff] & 0x0000ff00U) ^
0509                 (T5[(K1      ) & 0xff] & 0x000000ffU);
0510             K2 = T4[(kappa[i] >>  8) & 0xff] ^
0511                 (T5[(K2 >> 24)       ] & 0xff000000U) ^
0512                 (T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
0513                 (T5[(K2 >>  8) & 0xff] & 0x0000ff00U) ^
0514                 (T5[(K2      ) & 0xff] & 0x000000ffU);
0515             K3 = T4[(kappa[i]      ) & 0xff] ^
0516                 (T5[(K3 >> 24)       ] & 0xff000000U) ^
0517                 (T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
0518                 (T5[(K3 >>  8) & 0xff] & 0x0000ff00U) ^
0519                 (T5[(K3      ) & 0xff] & 0x000000ffU);
0520         }
0521 
0522         ctx->E[r][0] = K0;
0523         ctx->E[r][1] = K1;
0524         ctx->E[r][2] = K2;
0525         ctx->E[r][3] = K3;
0526 
0527         /*
0528          * compute kappa^{r+1} from kappa^r:
0529          */
0530         if (r == R)
0531             break;
0532         for (i = 0; i < N; i++) {
0533             int j = i;
0534             inter[i]  = T0[(kappa[j--] >> 24)       ];
0535             if (j < 0)
0536                 j = N - 1;
0537             inter[i] ^= T1[(kappa[j--] >> 16) & 0xff];
0538             if (j < 0)
0539                 j = N - 1;
0540             inter[i] ^= T2[(kappa[j--] >>  8) & 0xff];
0541             if (j < 0)
0542                 j = N - 1;
0543             inter[i] ^= T3[(kappa[j  ]      ) & 0xff];
0544         }
0545         kappa[0] = inter[0] ^ rc[r];
0546         for (i = 1; i < N; i++)
0547             kappa[i] = inter[i];
0548     }
0549 
0550     /*
0551      * generate inverse key schedule: K'^0 = K^R, K'^R =
0552      *                K^0, K'^r = theta(K^{R-r}):
0553      */
0554     for (i = 0; i < 4; i++) {
0555         ctx->D[0][i] = ctx->E[R][i];
0556         ctx->D[R][i] = ctx->E[0][i];
0557     }
0558     for (r = 1; r < R; r++) {
0559         for (i = 0; i < 4; i++) {
0560             u32 v = ctx->E[R - r][i];
0561             ctx->D[r][i] =
0562                 T0[T4[(v >> 24)       ] & 0xff] ^
0563                 T1[T4[(v >> 16) & 0xff] & 0xff] ^
0564                 T2[T4[(v >>  8) & 0xff] & 0xff] ^
0565                 T3[T4[(v      ) & 0xff] & 0xff];
0566         }
0567     }
0568 
0569     return 0;
0570 }
0571 
0572 static void anubis_crypt(u32 roundKey[ANUBIS_MAX_ROUNDS + 1][4],
0573         u8 *ciphertext, const u8 *plaintext, const int R)
0574 {
0575     const __be32 *src = (const __be32 *)plaintext;
0576     __be32 *dst = (__be32 *)ciphertext;
0577     int i, r;
0578     u32 state[4];
0579     u32 inter[4];
0580 
0581     /*
0582      * map plaintext block to cipher state (mu)
0583      * and add initial round key (sigma[K^0]):
0584      */
0585     for (i = 0; i < 4; i++)
0586         state[i] = be32_to_cpu(src[i]) ^ roundKey[0][i];
0587 
0588     /*
0589      * R - 1 full rounds:
0590      */
0591 
0592     for (r = 1; r < R; r++) {
0593         inter[0] =
0594             T0[(state[0] >> 24)       ] ^
0595             T1[(state[1] >> 24)       ] ^
0596             T2[(state[2] >> 24)       ] ^
0597             T3[(state[3] >> 24)       ] ^
0598             roundKey[r][0];
0599         inter[1] =
0600             T0[(state[0] >> 16) & 0xff] ^
0601             T1[(state[1] >> 16) & 0xff] ^
0602             T2[(state[2] >> 16) & 0xff] ^
0603             T3[(state[3] >> 16) & 0xff] ^
0604             roundKey[r][1];
0605         inter[2] =
0606             T0[(state[0] >>  8) & 0xff] ^
0607             T1[(state[1] >>  8) & 0xff] ^
0608             T2[(state[2] >>  8) & 0xff] ^
0609             T3[(state[3] >>  8) & 0xff] ^
0610             roundKey[r][2];
0611         inter[3] =
0612             T0[(state[0]      ) & 0xff] ^
0613             T1[(state[1]      ) & 0xff] ^
0614             T2[(state[2]      ) & 0xff] ^
0615             T3[(state[3]      ) & 0xff] ^
0616             roundKey[r][3];
0617         state[0] = inter[0];
0618         state[1] = inter[1];
0619         state[2] = inter[2];
0620         state[3] = inter[3];
0621     }
0622 
0623     /*
0624      * last round:
0625      */
0626 
0627     inter[0] =
0628         (T0[(state[0] >> 24)       ] & 0xff000000U) ^
0629         (T1[(state[1] >> 24)       ] & 0x00ff0000U) ^
0630         (T2[(state[2] >> 24)       ] & 0x0000ff00U) ^
0631         (T3[(state[3] >> 24)       ] & 0x000000ffU) ^
0632         roundKey[R][0];
0633     inter[1] =
0634         (T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
0635         (T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
0636         (T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
0637         (T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
0638         roundKey[R][1];
0639     inter[2] =
0640         (T0[(state[0] >>  8) & 0xff] & 0xff000000U) ^
0641         (T1[(state[1] >>  8) & 0xff] & 0x00ff0000U) ^
0642         (T2[(state[2] >>  8) & 0xff] & 0x0000ff00U) ^
0643         (T3[(state[3] >>  8) & 0xff] & 0x000000ffU) ^
0644         roundKey[R][2];
0645     inter[3] =
0646         (T0[(state[0]      ) & 0xff] & 0xff000000U) ^
0647         (T1[(state[1]      ) & 0xff] & 0x00ff0000U) ^
0648         (T2[(state[2]      ) & 0xff] & 0x0000ff00U) ^
0649         (T3[(state[3]      ) & 0xff] & 0x000000ffU) ^
0650         roundKey[R][3];
0651 
0652     /*
0653      * map cipher state to ciphertext block (mu^{-1}):
0654      */
0655 
0656     for (i = 0; i < 4; i++)
0657         dst[i] = cpu_to_be32(inter[i]);
0658 }
0659 
0660 static void anubis_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
0661 {
0662     struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
0663     anubis_crypt(ctx->E, dst, src, ctx->R);
0664 }
0665 
0666 static void anubis_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
0667 {
0668     struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
0669     anubis_crypt(ctx->D, dst, src, ctx->R);
0670 }
0671 
0672 static struct crypto_alg anubis_alg = {
0673     .cra_name       =   "anubis",
0674     .cra_driver_name    =   "anubis-generic",
0675     .cra_flags      =   CRYPTO_ALG_TYPE_CIPHER,
0676     .cra_blocksize      =   ANUBIS_BLOCK_SIZE,
0677     .cra_ctxsize        =   sizeof (struct anubis_ctx),
0678     .cra_alignmask      =   3,
0679     .cra_module     =   THIS_MODULE,
0680     .cra_u          =   { .cipher = {
0681     .cia_min_keysize    =   ANUBIS_MIN_KEY_SIZE,
0682     .cia_max_keysize    =   ANUBIS_MAX_KEY_SIZE,
0683     .cia_setkey     =   anubis_setkey,
0684     .cia_encrypt        =   anubis_encrypt,
0685     .cia_decrypt        =   anubis_decrypt } }
0686 };
0687 
0688 static int __init anubis_mod_init(void)
0689 {
0690     int ret = 0;
0691 
0692     ret = crypto_register_alg(&anubis_alg);
0693     return ret;
0694 }
0695 
0696 static void __exit anubis_mod_fini(void)
0697 {
0698     crypto_unregister_alg(&anubis_alg);
0699 }
0700 
0701 subsys_initcall(anubis_mod_init);
0702 module_exit(anubis_mod_fini);
0703 
0704 MODULE_LICENSE("GPL");
0705 MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");
0706 MODULE_ALIAS_CRYPTO("anubis");