0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
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;
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
0484 for (i = 0; i < N; i++)
0485 kappa[i] = be32_to_cpu(key[i]);
0486
0487
0488
0489
0490 for (r = 0; r <= R; r++) {
0491 u32 K0, K1, K2, K3;
0492
0493
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
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
0552
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
0583
0584
0585 for (i = 0; i < 4; i++)
0586 state[i] = be32_to_cpu(src[i]) ^ roundKey[0][i];
0587
0588
0589
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
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
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");