linux/crypto/anubis.c
<<
>>
Prefs
   1/*
   2 * Cryptographic API.
   3 *
   4 * Anubis Algorithm
   5 *
   6 * The Anubis algorithm was developed by Paulo S. L. M. Barreto and
   7 * Vincent Rijmen.
   8 *
   9 * See
  10 *
  11 *      P.S.L.M. Barreto, V. Rijmen,
  12 *      ``The Anubis block cipher,''
  13 *      NESSIE submission, 2000.
  14 *
  15 * This software implements the "tweaked" version of Anubis.
  16 * Only the S-box and (consequently) the rounds constants have been
  17 * changed.
  18 *
  19 * The original authors have disclaimed all copyright interest in this
  20 * code and thus put it in the public domain. The subsequent authors
  21 * have put this under the GNU General Public License.
  22 *
  23 * By Aaron Grothe ajgrothe@yahoo.com, October 28, 2004
  24 *
  25 * This program is free software; you can redistribute it and/or modify
  26 * it under the terms of the GNU General Public License as published by
  27 * the Free Software Foundation; either version 2 of the License, or
  28 * (at your option) any later version.
  29 *
  30 */
  31
  32#include <linux/init.h>
  33#include <linux/module.h>
  34#include <linux/mm.h>
  35#include <asm/byteorder.h>
  36#include <asm/scatterlist.h>
  37#include <linux/crypto.h>
  38#include <linux/types.h>
  39
  40#define ANUBIS_MIN_KEY_SIZE     16
  41#define ANUBIS_MAX_KEY_SIZE     40
  42#define ANUBIS_BLOCK_SIZE       16
  43#define ANUBIS_MAX_N            10
  44#define ANUBIS_MAX_ROUNDS       (8 + ANUBIS_MAX_N)
  45
  46struct anubis_ctx {
  47        int key_len; // in bits
  48        int R;
  49        u32 E[ANUBIS_MAX_ROUNDS + 1][4];
  50        u32 D[ANUBIS_MAX_ROUNDS + 1][4];
  51};
  52
  53static const u32 T0[256] = {
  54        0xba69d2bbU, 0x54a84de5U, 0x2f5ebce2U, 0x74e8cd25U,
  55        0x53a651f7U, 0xd3bb6bd0U, 0xd2b96fd6U, 0x4d9a29b3U,
  56        0x50a05dfdU, 0xac458acfU, 0x8d070e09U, 0xbf63c6a5U,
  57        0x70e0dd3dU, 0x52a455f1U, 0x9a29527bU, 0x4c982db5U,
  58        0xeac98f46U, 0xd5b773c4U, 0x97336655U, 0xd1bf63dcU,
  59        0x3366ccaaU, 0x51a259fbU, 0x5bb671c7U, 0xa651a2f3U,
  60        0xdea15ffeU, 0x48903dadU, 0xa84d9ad7U, 0x992f5e71U,
  61        0xdbab4be0U, 0x3264c8acU, 0xb773e695U, 0xfce5d732U,
  62        0xe3dbab70U, 0x9e214263U, 0x913f7e41U, 0x9b2b567dU,
  63        0xe2d9af76U, 0xbb6bd6bdU, 0x4182199bU, 0x6edca579U,
  64        0xa557aef9U, 0xcb8b0b80U, 0x6bd6b167U, 0x95376e59U,
  65        0xa15fbee1U, 0xf3fbeb10U, 0xb17ffe81U, 0x0204080cU,
  66        0xcc851792U, 0xc49537a2U, 0x1d3a744eU, 0x14285078U,
  67        0xc39b2bb0U, 0x63c69157U, 0xdaa94fe6U, 0x5dba69d3U,
  68        0x5fbe61dfU, 0xdca557f2U, 0x7dfae913U, 0xcd871394U,
  69        0x7ffee11fU, 0x5ab475c1U, 0x6cd8ad75U, 0x5cb86dd5U,
  70        0xf7f3fb08U, 0x264c98d4U, 0xffe3db38U, 0xedc79354U,
  71        0xe8cd874aU, 0x9d274e69U, 0x6fdea17fU, 0x8e010203U,
  72        0x19326456U, 0xa05dbae7U, 0xf0fde71aU, 0x890f1e11U,
  73        0x0f1e3c22U, 0x070e1c12U, 0xaf4386c5U, 0xfbebcb20U,
  74        0x08102030U, 0x152a547eU, 0x0d1a342eU, 0x04081018U,
  75        0x01020406U, 0x64c88d45U, 0xdfa35bf8U, 0x76ecc529U,
  76        0x79f2f90bU, 0xdda753f4U, 0x3d7af48eU, 0x162c5874U,
  77        0x3f7efc82U, 0x376edcb2U, 0x6ddaa973U, 0x3870e090U,
  78        0xb96fdeb1U, 0x73e6d137U, 0xe9cf834cU, 0x356ad4beU,
  79        0x55aa49e3U, 0x71e2d93bU, 0x7bf6f107U, 0x8c050a0fU,
  80        0x72e4d531U, 0x880d1a17U, 0xf6f1ff0eU, 0x2a54a8fcU,
  81        0x3e7cf884U, 0x5ebc65d9U, 0x274e9cd2U, 0x468c0589U,
  82        0x0c183028U, 0x65ca8943U, 0x68d0bd6dU, 0x61c2995bU,
  83        0x03060c0aU, 0xc19f23bcU, 0x57ae41efU, 0xd6b17fceU,
  84        0xd9af43ecU, 0x58b07dcdU, 0xd8ad47eaU, 0x66cc8549U,
  85        0xd7b37bc8U, 0x3a74e89cU, 0xc88d078aU, 0x3c78f088U,
  86        0xfae9cf26U, 0x96316253U, 0xa753a6f5U, 0x982d5a77U,
  87        0xecc59752U, 0xb86ddab7U, 0xc7933ba8U, 0xae4182c3U,
  88        0x69d2b96bU, 0x4b9631a7U, 0xab4b96ddU, 0xa94f9ed1U,
  89        0x67ce814fU, 0x0a14283cU, 0x478e018fU, 0xf2f9ef16U,
  90        0xb577ee99U, 0x224488ccU, 0xe5d7b364U, 0xeec19f5eU,
  91        0xbe61c2a3U, 0x2b56acfaU, 0x811f3e21U, 0x1224486cU,
  92        0x831b362dU, 0x1b366c5aU, 0x0e1c3824U, 0x23468ccaU,
  93        0xf5f7f304U, 0x458a0983U, 0x214284c6U, 0xce811f9eU,
  94        0x499239abU, 0x2c58b0e8U, 0xf9efc32cU, 0xe6d1bf6eU,
  95        0xb671e293U, 0x2850a0f0U, 0x172e5c72U, 0x8219322bU,
  96        0x1a34685cU, 0x8b0b161dU, 0xfee1df3eU, 0x8a09121bU,
  97        0x09122436U, 0xc98f038cU, 0x87132635U, 0x4e9c25b9U,
  98        0xe1dfa37cU, 0x2e5cb8e4U, 0xe4d5b762U, 0xe0dda77aU,
  99        0xebcb8b40U, 0x903d7a47U, 0xa455aaffU, 0x1e3c7844U,
 100        0x85172e39U, 0x60c09d5dU, 0x00000000U, 0x254a94deU,
 101        0xf4f5f702U, 0xf1ffe31cU, 0x94356a5fU, 0x0b162c3aU,
 102        0xe7d3bb68U, 0x75eac923U, 0xefc39b58U, 0x3468d0b8U,
 103        0x3162c4a6U, 0xd4b577c2U, 0xd0bd67daU, 0x86112233U,
 104        0x7efce519U, 0xad478ec9U, 0xfde7d334U, 0x2952a4f6U,
 105        0x3060c0a0U, 0x3b76ec9aU, 0x9f234665U, 0xf8edc72aU,
 106        0xc6913faeU, 0x13264c6aU, 0x060c1814U, 0x050a141eU,
 107        0xc59733a4U, 0x11224466U, 0x77eec12fU, 0x7cf8ed15U,
 108        0x7af4f501U, 0x78f0fd0dU, 0x366cd8b4U, 0x1c387048U,
 109        0x3972e496U, 0x59b279cbU, 0x18306050U, 0x56ac45e9U,
 110        0xb37bf68dU, 0xb07dfa87U, 0x244890d8U, 0x204080c0U,
 111        0xb279f28bU, 0x9239724bU, 0xa35bb6edU, 0xc09d27baU,
 112        0x44880d85U, 0x62c49551U, 0x10204060U, 0xb475ea9fU,
 113        0x84152a3fU, 0x43861197U, 0x933b764dU, 0xc2992fb6U,
 114        0x4a9435a1U, 0xbd67cea9U, 0x8f030605U, 0x2d5ab4eeU,
 115        0xbc65caafU, 0x9c254a6fU, 0x6ad4b561U, 0x40801d9dU,
 116        0xcf831b98U, 0xa259b2ebU, 0x801d3a27U, 0x4f9e21bfU,
 117        0x1f3e7c42U, 0xca890f86U, 0xaa4992dbU, 0x42841591U,
 118};
 119
 120static const u32 T1[256] = {
 121        0x69babbd2U, 0xa854e54dU, 0x5e2fe2bcU, 0xe87425cdU,
 122        0xa653f751U, 0xbbd3d06bU, 0xb9d2d66fU, 0x9a4db329U,
 123        0xa050fd5dU, 0x45accf8aU, 0x078d090eU, 0x63bfa5c6U,
 124        0xe0703dddU, 0xa452f155U, 0x299a7b52U, 0x984cb52dU,
 125        0xc9ea468fU, 0xb7d5c473U, 0x33975566U, 0xbfd1dc63U,
 126        0x6633aaccU, 0xa251fb59U, 0xb65bc771U, 0x51a6f3a2U,
 127        0xa1defe5fU, 0x9048ad3dU, 0x4da8d79aU, 0x2f99715eU,
 128        0xabdbe04bU, 0x6432acc8U, 0x73b795e6U, 0xe5fc32d7U,
 129        0xdbe370abU, 0x219e6342U, 0x3f91417eU, 0x2b9b7d56U,
 130        0xd9e276afU, 0x6bbbbdd6U, 0x82419b19U, 0xdc6e79a5U,
 131        0x57a5f9aeU, 0x8bcb800bU, 0xd66b67b1U, 0x3795596eU,
 132        0x5fa1e1beU, 0xfbf310ebU, 0x7fb181feU, 0x04020c08U,
 133        0x85cc9217U, 0x95c4a237U, 0x3a1d4e74U, 0x28147850U,
 134        0x9bc3b02bU, 0xc6635791U, 0xa9dae64fU, 0xba5dd369U,
 135        0xbe5fdf61U, 0xa5dcf257U, 0xfa7d13e9U, 0x87cd9413U,
 136        0xfe7f1fe1U, 0xb45ac175U, 0xd86c75adU, 0xb85cd56dU,
 137        0xf3f708fbU, 0x4c26d498U, 0xe3ff38dbU, 0xc7ed5493U,
 138        0xcde84a87U, 0x279d694eU, 0xde6f7fa1U, 0x018e0302U,
 139        0x32195664U, 0x5da0e7baU, 0xfdf01ae7U, 0x0f89111eU,
 140        0x1e0f223cU, 0x0e07121cU, 0x43afc586U, 0xebfb20cbU,
 141        0x10083020U, 0x2a157e54U, 0x1a0d2e34U, 0x08041810U,
 142        0x02010604U, 0xc864458dU, 0xa3dff85bU, 0xec7629c5U,
 143        0xf2790bf9U, 0xa7ddf453U, 0x7a3d8ef4U, 0x2c167458U,
 144        0x7e3f82fcU, 0x6e37b2dcU, 0xda6d73a9U, 0x703890e0U,
 145        0x6fb9b1deU, 0xe67337d1U, 0xcfe94c83U, 0x6a35bed4U,
 146        0xaa55e349U, 0xe2713bd9U, 0xf67b07f1U, 0x058c0f0aU,
 147        0xe47231d5U, 0x0d88171aU, 0xf1f60effU, 0x542afca8U,
 148        0x7c3e84f8U, 0xbc5ed965U, 0x4e27d29cU, 0x8c468905U,
 149        0x180c2830U, 0xca654389U, 0xd0686dbdU, 0xc2615b99U,
 150        0x06030a0cU, 0x9fc1bc23U, 0xae57ef41U, 0xb1d6ce7fU,
 151        0xafd9ec43U, 0xb058cd7dU, 0xadd8ea47U, 0xcc664985U,
 152        0xb3d7c87bU, 0x743a9ce8U, 0x8dc88a07U, 0x783c88f0U,
 153        0xe9fa26cfU, 0x31965362U, 0x53a7f5a6U, 0x2d98775aU,
 154        0xc5ec5297U, 0x6db8b7daU, 0x93c7a83bU, 0x41aec382U,
 155        0xd2696bb9U, 0x964ba731U, 0x4babdd96U, 0x4fa9d19eU,
 156        0xce674f81U, 0x140a3c28U, 0x8e478f01U, 0xf9f216efU,
 157        0x77b599eeU, 0x4422cc88U, 0xd7e564b3U, 0xc1ee5e9fU,
 158        0x61bea3c2U, 0x562bfaacU, 0x1f81213eU, 0x24126c48U,
 159        0x1b832d36U, 0x361b5a6cU, 0x1c0e2438U, 0x4623ca8cU,
 160        0xf7f504f3U, 0x8a458309U, 0x4221c684U, 0x81ce9e1fU,
 161        0x9249ab39U, 0x582ce8b0U, 0xeff92cc3U, 0xd1e66ebfU,
 162        0x71b693e2U, 0x5028f0a0U, 0x2e17725cU, 0x19822b32U,
 163        0x341a5c68U, 0x0b8b1d16U, 0xe1fe3edfU, 0x098a1b12U,
 164        0x12093624U, 0x8fc98c03U, 0x13873526U, 0x9c4eb925U,
 165        0xdfe17ca3U, 0x5c2ee4b8U, 0xd5e462b7U, 0xdde07aa7U,
 166        0xcbeb408bU, 0x3d90477aU, 0x55a4ffaaU, 0x3c1e4478U,
 167        0x1785392eU, 0xc0605d9dU, 0x00000000U, 0x4a25de94U,
 168        0xf5f402f7U, 0xfff11ce3U, 0x35945f6aU, 0x160b3a2cU,
 169        0xd3e768bbU, 0xea7523c9U, 0xc3ef589bU, 0x6834b8d0U,
 170        0x6231a6c4U, 0xb5d4c277U, 0xbdd0da67U, 0x11863322U,
 171        0xfc7e19e5U, 0x47adc98eU, 0xe7fd34d3U, 0x5229f6a4U,
 172        0x6030a0c0U, 0x763b9aecU, 0x239f6546U, 0xedf82ac7U,
 173        0x91c6ae3fU, 0x26136a4cU, 0x0c061418U, 0x0a051e14U,
 174        0x97c5a433U, 0x22116644U, 0xee772fc1U, 0xf87c15edU,
 175        0xf47a01f5U, 0xf0780dfdU, 0x6c36b4d8U, 0x381c4870U,
 176        0x723996e4U, 0xb259cb79U, 0x30185060U, 0xac56e945U,
 177        0x7bb38df6U, 0x7db087faU, 0x4824d890U, 0x4020c080U,
 178        0x79b28bf2U, 0x39924b72U, 0x5ba3edb6U, 0x9dc0ba27U,
 179        0x8844850dU, 0xc4625195U, 0x20106040U, 0x75b49feaU,
 180        0x15843f2aU, 0x86439711U, 0x3b934d76U, 0x99c2b62fU,
 181        0x944aa135U, 0x67bda9ceU, 0x038f0506U, 0x5a2deeb4U,
 182        0x65bcafcaU, 0x259c6f4aU, 0xd46a61b5U, 0x80409d1dU,
 183        0x83cf981bU, 0x59a2ebb2U, 0x1d80273aU, 0x9e4fbf21U,
 184        0x3e1f427cU, 0x89ca860fU, 0x49aadb92U, 0x84429115U,
 185};
 186
 187static const u32 T2[256] = {
 188        0xd2bbba69U, 0x4de554a8U, 0xbce22f5eU, 0xcd2574e8U,
 189        0x51f753a6U, 0x6bd0d3bbU, 0x6fd6d2b9U, 0x29b34d9aU,
 190        0x5dfd50a0U, 0x8acfac45U, 0x0e098d07U, 0xc6a5bf63U,
 191        0xdd3d70e0U, 0x55f152a4U, 0x527b9a29U, 0x2db54c98U,
 192        0x8f46eac9U, 0x73c4d5b7U, 0x66559733U, 0x63dcd1bfU,
 193        0xccaa3366U, 0x59fb51a2U, 0x71c75bb6U, 0xa2f3a651U,
 194        0x5ffedea1U, 0x3dad4890U, 0x9ad7a84dU, 0x5e71992fU,
 195        0x4be0dbabU, 0xc8ac3264U, 0xe695b773U, 0xd732fce5U,
 196        0xab70e3dbU, 0x42639e21U, 0x7e41913fU, 0x567d9b2bU,
 197        0xaf76e2d9U, 0xd6bdbb6bU, 0x199b4182U, 0xa5796edcU,
 198        0xaef9a557U, 0x0b80cb8bU, 0xb1676bd6U, 0x6e599537U,
 199        0xbee1a15fU, 0xeb10f3fbU, 0xfe81b17fU, 0x080c0204U,
 200        0x1792cc85U, 0x37a2c495U, 0x744e1d3aU, 0x50781428U,
 201        0x2bb0c39bU, 0x915763c6U, 0x4fe6daa9U, 0x69d35dbaU,
 202        0x61df5fbeU, 0x57f2dca5U, 0xe9137dfaU, 0x1394cd87U,
 203        0xe11f7ffeU, 0x75c15ab4U, 0xad756cd8U, 0x6dd55cb8U,
 204        0xfb08f7f3U, 0x98d4264cU, 0xdb38ffe3U, 0x9354edc7U,
 205        0x874ae8cdU, 0x4e699d27U, 0xa17f6fdeU, 0x02038e01U,
 206        0x64561932U, 0xbae7a05dU, 0xe71af0fdU, 0x1e11890fU,
 207        0x3c220f1eU, 0x1c12070eU, 0x86c5af43U, 0xcb20fbebU,
 208        0x20300810U, 0x547e152aU, 0x342e0d1aU, 0x10180408U,
 209        0x04060102U, 0x8d4564c8U, 0x5bf8dfa3U, 0xc52976ecU,
 210        0xf90b79f2U, 0x53f4dda7U, 0xf48e3d7aU, 0x5874162cU,
 211        0xfc823f7eU, 0xdcb2376eU, 0xa9736ddaU, 0xe0903870U,
 212        0xdeb1b96fU, 0xd13773e6U, 0x834ce9cfU, 0xd4be356aU,
 213        0x49e355aaU, 0xd93b71e2U, 0xf1077bf6U, 0x0a0f8c05U,
 214        0xd53172e4U, 0x1a17880dU, 0xff0ef6f1U, 0xa8fc2a54U,
 215        0xf8843e7cU, 0x65d95ebcU, 0x9cd2274eU, 0x0589468cU,
 216        0x30280c18U, 0x894365caU, 0xbd6d68d0U, 0x995b61c2U,
 217        0x0c0a0306U, 0x23bcc19fU, 0x41ef57aeU, 0x7fced6b1U,
 218        0x43ecd9afU, 0x7dcd58b0U, 0x47ead8adU, 0x854966ccU,
 219        0x7bc8d7b3U, 0xe89c3a74U, 0x078ac88dU, 0xf0883c78U,
 220        0xcf26fae9U, 0x62539631U, 0xa6f5a753U, 0x5a77982dU,
 221        0x9752ecc5U, 0xdab7b86dU, 0x3ba8c793U, 0x82c3ae41U,
 222        0xb96b69d2U, 0x31a74b96U, 0x96ddab4bU, 0x9ed1a94fU,
 223        0x814f67ceU, 0x283c0a14U, 0x018f478eU, 0xef16f2f9U,
 224        0xee99b577U, 0x88cc2244U, 0xb364e5d7U, 0x9f5eeec1U,
 225        0xc2a3be61U, 0xacfa2b56U, 0x3e21811fU, 0x486c1224U,
 226        0x362d831bU, 0x6c5a1b36U, 0x38240e1cU, 0x8cca2346U,
 227        0xf304f5f7U, 0x0983458aU, 0x84c62142U, 0x1f9ece81U,
 228        0x39ab4992U, 0xb0e82c58U, 0xc32cf9efU, 0xbf6ee6d1U,
 229        0xe293b671U, 0xa0f02850U, 0x5c72172eU, 0x322b8219U,
 230        0x685c1a34U, 0x161d8b0bU, 0xdf3efee1U, 0x121b8a09U,
 231        0x24360912U, 0x038cc98fU, 0x26358713U, 0x25b94e9cU,
 232        0xa37ce1dfU, 0xb8e42e5cU, 0xb762e4d5U, 0xa77ae0ddU,
 233        0x8b40ebcbU, 0x7a47903dU, 0xaaffa455U, 0x78441e3cU,
 234        0x2e398517U, 0x9d5d60c0U, 0x00000000U, 0x94de254aU,
 235        0xf702f4f5U, 0xe31cf1ffU, 0x6a5f9435U, 0x2c3a0b16U,
 236        0xbb68e7d3U, 0xc92375eaU, 0x9b58efc3U, 0xd0b83468U,
 237        0xc4a63162U, 0x77c2d4b5U, 0x67dad0bdU, 0x22338611U,
 238        0xe5197efcU, 0x8ec9ad47U, 0xd334fde7U, 0xa4f62952U,
 239        0xc0a03060U, 0xec9a3b76U, 0x46659f23U, 0xc72af8edU,
 240        0x3faec691U, 0x4c6a1326U, 0x1814060cU, 0x141e050aU,
 241        0x33a4c597U, 0x44661122U, 0xc12f77eeU, 0xed157cf8U,
 242        0xf5017af4U, 0xfd0d78f0U, 0xd8b4366cU, 0x70481c38U,
 243        0xe4963972U, 0x79cb59b2U, 0x60501830U, 0x45e956acU,
 244        0xf68db37bU, 0xfa87b07dU, 0x90d82448U, 0x80c02040U,
 245        0xf28bb279U, 0x724b9239U, 0xb6eda35bU, 0x27bac09dU,
 246        0x0d854488U, 0x955162c4U, 0x40601020U, 0xea9fb475U,
 247        0x2a3f8415U, 0x11974386U, 0x764d933bU, 0x2fb6c299U,
 248        0x35a14a94U, 0xcea9bd67U, 0x06058f03U, 0xb4ee2d5aU,
 249        0xcaafbc65U, 0x4a6f9c25U, 0xb5616ad4U, 0x1d9d4080U,
 250        0x1b98cf83U, 0xb2eba259U, 0x3a27801dU, 0x21bf4f9eU,
 251        0x7c421f3eU, 0x0f86ca89U, 0x92dbaa49U, 0x15914284U,
 252};
 253
 254static const u32 T3[256] = {
 255        0xbbd269baU, 0xe54da854U, 0xe2bc5e2fU, 0x25cde874U,
 256        0xf751a653U, 0xd06bbbd3U, 0xd66fb9d2U, 0xb3299a4dU,
 257        0xfd5da050U, 0xcf8a45acU, 0x090e078dU, 0xa5c663bfU,
 258        0x3ddde070U, 0xf155a452U, 0x7b52299aU, 0xb52d984cU,
 259        0x468fc9eaU, 0xc473b7d5U, 0x55663397U, 0xdc63bfd1U,
 260        0xaacc6633U, 0xfb59a251U, 0xc771b65bU, 0xf3a251a6U,
 261        0xfe5fa1deU, 0xad3d9048U, 0xd79a4da8U, 0x715e2f99U,
 262        0xe04babdbU, 0xacc86432U, 0x95e673b7U, 0x32d7e5fcU,
 263        0x70abdbe3U, 0x6342219eU, 0x417e3f91U, 0x7d562b9bU,
 264        0x76afd9e2U, 0xbdd66bbbU, 0x9b198241U, 0x79a5dc6eU,
 265        0xf9ae57a5U, 0x800b8bcbU, 0x67b1d66bU, 0x596e3795U,
 266        0xe1be5fa1U, 0x10ebfbf3U, 0x81fe7fb1U, 0x0c080402U,
 267        0x921785ccU, 0xa23795c4U, 0x4e743a1dU, 0x78502814U,
 268        0xb02b9bc3U, 0x5791c663U, 0xe64fa9daU, 0xd369ba5dU,
 269        0xdf61be5fU, 0xf257a5dcU, 0x13e9fa7dU, 0x941387cdU,
 270        0x1fe1fe7fU, 0xc175b45aU, 0x75add86cU, 0xd56db85cU,
 271        0x08fbf3f7U, 0xd4984c26U, 0x38dbe3ffU, 0x5493c7edU,
 272        0x4a87cde8U, 0x694e279dU, 0x7fa1de6fU, 0x0302018eU,
 273        0x56643219U, 0xe7ba5da0U, 0x1ae7fdf0U, 0x111e0f89U,
 274        0x223c1e0fU, 0x121c0e07U, 0xc58643afU, 0x20cbebfbU,
 275        0x30201008U, 0x7e542a15U, 0x2e341a0dU, 0x18100804U,
 276        0x06040201U, 0x458dc864U, 0xf85ba3dfU, 0x29c5ec76U,
 277        0x0bf9f279U, 0xf453a7ddU, 0x8ef47a3dU, 0x74582c16U,
 278        0x82fc7e3fU, 0xb2dc6e37U, 0x73a9da6dU, 0x90e07038U,
 279        0xb1de6fb9U, 0x37d1e673U, 0x4c83cfe9U, 0xbed46a35U,
 280        0xe349aa55U, 0x3bd9e271U, 0x07f1f67bU, 0x0f0a058cU,
 281        0x31d5e472U, 0x171a0d88U, 0x0efff1f6U, 0xfca8542aU,
 282        0x84f87c3eU, 0xd965bc5eU, 0xd29c4e27U, 0x89058c46U,
 283        0x2830180cU, 0x4389ca65U, 0x6dbdd068U, 0x5b99c261U,
 284        0x0a0c0603U, 0xbc239fc1U, 0xef41ae57U, 0xce7fb1d6U,
 285        0xec43afd9U, 0xcd7db058U, 0xea47add8U, 0x4985cc66U,
 286        0xc87bb3d7U, 0x9ce8743aU, 0x8a078dc8U, 0x88f0783cU,
 287        0x26cfe9faU, 0x53623196U, 0xf5a653a7U, 0x775a2d98U,
 288        0x5297c5ecU, 0xb7da6db8U, 0xa83b93c7U, 0xc38241aeU,
 289        0x6bb9d269U, 0xa731964bU, 0xdd964babU, 0xd19e4fa9U,
 290        0x4f81ce67U, 0x3c28140aU, 0x8f018e47U, 0x16eff9f2U,
 291        0x99ee77b5U, 0xcc884422U, 0x64b3d7e5U, 0x5e9fc1eeU,
 292        0xa3c261beU, 0xfaac562bU, 0x213e1f81U, 0x6c482412U,
 293        0x2d361b83U, 0x5a6c361bU, 0x24381c0eU, 0xca8c4623U,
 294        0x04f3f7f5U, 0x83098a45U, 0xc6844221U, 0x9e1f81ceU,
 295        0xab399249U, 0xe8b0582cU, 0x2cc3eff9U, 0x6ebfd1e6U,
 296        0x93e271b6U, 0xf0a05028U, 0x725c2e17U, 0x2b321982U,
 297        0x5c68341aU, 0x1d160b8bU, 0x3edfe1feU, 0x1b12098aU,
 298        0x36241209U, 0x8c038fc9U, 0x35261387U, 0xb9259c4eU,
 299        0x7ca3dfe1U, 0xe4b85c2eU, 0x62b7d5e4U, 0x7aa7dde0U,
 300        0x408bcbebU, 0x477a3d90U, 0xffaa55a4U, 0x44783c1eU,
 301        0x392e1785U, 0x5d9dc060U, 0x00000000U, 0xde944a25U,
 302        0x02f7f5f4U, 0x1ce3fff1U, 0x5f6a3594U, 0x3a2c160bU,
 303        0x68bbd3e7U, 0x23c9ea75U, 0x589bc3efU, 0xb8d06834U,
 304        0xa6c46231U, 0xc277b5d4U, 0xda67bdd0U, 0x33221186U,
 305        0x19e5fc7eU, 0xc98e47adU, 0x34d3e7fdU, 0xf6a45229U,
 306        0xa0c06030U, 0x9aec763bU, 0x6546239fU, 0x2ac7edf8U,
 307        0xae3f91c6U, 0x6a4c2613U, 0x14180c06U, 0x1e140a05U,
 308        0xa43397c5U, 0x66442211U, 0x2fc1ee77U, 0x15edf87cU,
 309        0x01f5f47aU, 0x0dfdf078U, 0xb4d86c36U, 0x4870381cU,
 310        0x96e47239U, 0xcb79b259U, 0x50603018U, 0xe945ac56U,
 311        0x8df67bb3U, 0x87fa7db0U, 0xd8904824U, 0xc0804020U,
 312        0x8bf279b2U, 0x4b723992U, 0xedb65ba3U, 0xba279dc0U,
 313        0x850d8844U, 0x5195c462U, 0x60402010U, 0x9fea75b4U,
 314        0x3f2a1584U, 0x97118643U, 0x4d763b93U, 0xb62f99c2U,
 315        0xa135944aU, 0xa9ce67bdU, 0x0506038fU, 0xeeb45a2dU,
 316        0xafca65bcU, 0x6f4a259cU, 0x61b5d46aU, 0x9d1d8040U,
 317        0x981b83cfU, 0xebb259a2U, 0x273a1d80U, 0xbf219e4fU,
 318        0x427c3e1fU, 0x860f89caU, 0xdb9249aaU, 0x91158442U,
 319};
 320
 321static const u32 T4[256] = {
 322        0xbabababaU, 0x54545454U, 0x2f2f2f2fU, 0x74747474U,
 323        0x53535353U, 0xd3d3d3d3U, 0xd2d2d2d2U, 0x4d4d4d4dU,
 324        0x50505050U, 0xacacacacU, 0x8d8d8d8dU, 0xbfbfbfbfU,
 325        0x70707070U, 0x52525252U, 0x9a9a9a9aU, 0x4c4c4c4cU,
 326        0xeaeaeaeaU, 0xd5d5d5d5U, 0x97979797U, 0xd1d1d1d1U,
 327        0x33333333U, 0x51515151U, 0x5b5b5b5bU, 0xa6a6a6a6U,
 328        0xdedededeU, 0x48484848U, 0xa8a8a8a8U, 0x99999999U,
 329        0xdbdbdbdbU, 0x32323232U, 0xb7b7b7b7U, 0xfcfcfcfcU,
 330        0xe3e3e3e3U, 0x9e9e9e9eU, 0x91919191U, 0x9b9b9b9bU,
 331        0xe2e2e2e2U, 0xbbbbbbbbU, 0x41414141U, 0x6e6e6e6eU,
 332        0xa5a5a5a5U, 0xcbcbcbcbU, 0x6b6b6b6bU, 0x95959595U,
 333        0xa1a1a1a1U, 0xf3f3f3f3U, 0xb1b1b1b1U, 0x02020202U,
 334        0xccccccccU, 0xc4c4c4c4U, 0x1d1d1d1dU, 0x14141414U,
 335        0xc3c3c3c3U, 0x63636363U, 0xdadadadaU, 0x5d5d5d5dU,
 336        0x5f5f5f5fU, 0xdcdcdcdcU, 0x7d7d7d7dU, 0xcdcdcdcdU,
 337        0x7f7f7f7fU, 0x5a5a5a5aU, 0x6c6c6c6cU, 0x5c5c5c5cU,
 338        0xf7f7f7f7U, 0x26262626U, 0xffffffffU, 0xededededU,
 339        0xe8e8e8e8U, 0x9d9d9d9dU, 0x6f6f6f6fU, 0x8e8e8e8eU,
 340        0x19191919U, 0xa0a0a0a0U, 0xf0f0f0f0U, 0x89898989U,
 341        0x0f0f0f0fU, 0x07070707U, 0xafafafafU, 0xfbfbfbfbU,
 342        0x08080808U, 0x15151515U, 0x0d0d0d0dU, 0x04040404U,
 343        0x01010101U, 0x64646464U, 0xdfdfdfdfU, 0x76767676U,
 344        0x79797979U, 0xddddddddU, 0x3d3d3d3dU, 0x16161616U,
 345        0x3f3f3f3fU, 0x37373737U, 0x6d6d6d6dU, 0x38383838U,
 346        0xb9b9b9b9U, 0x73737373U, 0xe9e9e9e9U, 0x35353535U,
 347        0x55555555U, 0x71717171U, 0x7b7b7b7bU, 0x8c8c8c8cU,
 348        0x72727272U, 0x88888888U, 0xf6f6f6f6U, 0x2a2a2a2aU,
 349        0x3e3e3e3eU, 0x5e5e5e5eU, 0x27272727U, 0x46464646U,
 350        0x0c0c0c0cU, 0x65656565U, 0x68686868U, 0x61616161U,
 351        0x03030303U, 0xc1c1c1c1U, 0x57575757U, 0xd6d6d6d6U,
 352        0xd9d9d9d9U, 0x58585858U, 0xd8d8d8d8U, 0x66666666U,
 353        0xd7d7d7d7U, 0x3a3a3a3aU, 0xc8c8c8c8U, 0x3c3c3c3cU,
 354        0xfafafafaU, 0x96969696U, 0xa7a7a7a7U, 0x98989898U,
 355        0xececececU, 0xb8b8b8b8U, 0xc7c7c7c7U, 0xaeaeaeaeU,
 356        0x69696969U, 0x4b4b4b4bU, 0xababababU, 0xa9a9a9a9U,
 357        0x67676767U, 0x0a0a0a0aU, 0x47474747U, 0xf2f2f2f2U,
 358        0xb5b5b5b5U, 0x22222222U, 0xe5e5e5e5U, 0xeeeeeeeeU,
 359        0xbebebebeU, 0x2b2b2b2bU, 0x81818181U, 0x12121212U,
 360        0x83838383U, 0x1b1b1b1bU, 0x0e0e0e0eU, 0x23232323U,
 361        0xf5f5f5f5U, 0x45454545U, 0x21212121U, 0xcecececeU,
 362        0x49494949U, 0x2c2c2c2cU, 0xf9f9f9f9U, 0xe6e6e6e6U,
 363        0xb6b6b6b6U, 0x28282828U, 0x17171717U, 0x82828282U,
 364        0x1a1a1a1aU, 0x8b8b8b8bU, 0xfefefefeU, 0x8a8a8a8aU,
 365        0x09090909U, 0xc9c9c9c9U, 0x87878787U, 0x4e4e4e4eU,
 366        0xe1e1e1e1U, 0x2e2e2e2eU, 0xe4e4e4e4U, 0xe0e0e0e0U,
 367        0xebebebebU, 0x90909090U, 0xa4a4a4a4U, 0x1e1e1e1eU,
 368        0x85858585U, 0x60606060U, 0x00000000U, 0x25252525U,
 369        0xf4f4f4f4U, 0xf1f1f1f1U, 0x94949494U, 0x0b0b0b0bU,
 370        0xe7e7e7e7U, 0x75757575U, 0xefefefefU, 0x34343434U,
 371        0x31313131U, 0xd4d4d4d4U, 0xd0d0d0d0U, 0x86868686U,
 372        0x7e7e7e7eU, 0xadadadadU, 0xfdfdfdfdU, 0x29292929U,
 373        0x30303030U, 0x3b3b3b3bU, 0x9f9f9f9fU, 0xf8f8f8f8U,
 374        0xc6c6c6c6U, 0x13131313U, 0x06060606U, 0x05050505U,
 375        0xc5c5c5c5U, 0x11111111U, 0x77777777U, 0x7c7c7c7cU,
 376        0x7a7a7a7aU, 0x78787878U, 0x36363636U, 0x1c1c1c1cU,
 377        0x39393939U, 0x59595959U, 0x18181818U, 0x56565656U,
 378        0xb3b3b3b3U, 0xb0b0b0b0U, 0x24242424U, 0x20202020U,
 379        0xb2b2b2b2U, 0x92929292U, 0xa3a3a3a3U, 0xc0c0c0c0U,
 380        0x44444444U, 0x62626262U, 0x10101010U, 0xb4b4b4b4U,
 381        0x84848484U, 0x43434343U, 0x93939393U, 0xc2c2c2c2U,
 382        0x4a4a4a4aU, 0xbdbdbdbdU, 0x8f8f8f8fU, 0x2d2d2d2dU,
 383        0xbcbcbcbcU, 0x9c9c9c9cU, 0x6a6a6a6aU, 0x40404040U,
 384        0xcfcfcfcfU, 0xa2a2a2a2U, 0x80808080U, 0x4f4f4f4fU,
 385        0x1f1f1f1fU, 0xcacacacaU, 0xaaaaaaaaU, 0x42424242U,
 386};
 387
 388static const u32 T5[256] = {
 389        0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
 390        0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
 391        0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
 392        0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
 393        0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
 394        0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
 395        0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
 396        0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
 397        0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
 398        0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
 399        0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
 400        0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
 401        0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
 402        0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
 403        0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
 404        0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
 405        0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
 406        0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
 407        0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
 408        0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
 409        0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
 410        0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
 411        0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
 412        0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
 413        0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
 414        0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
 415        0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
 416        0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
 417        0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
 418        0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
 419        0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
 420        0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
 421        0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
 422        0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
 423        0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
 424        0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
 425        0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
 426        0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
 427        0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
 428        0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
 429        0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
 430        0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
 431        0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
 432        0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
 433        0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
 434        0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
 435        0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
 436        0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
 437        0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
 438        0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
 439        0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
 440        0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
 441        0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
 442        0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
 443        0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
 444        0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
 445        0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
 446        0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
 447        0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
 448        0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
 449        0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
 450        0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
 451        0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
 452        0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
 453};
 454
 455static const u32 rc[] = {
 456        0xba542f74U, 0x53d3d24dU, 0x50ac8dbfU, 0x70529a4cU,
 457        0xead597d1U, 0x33515ba6U, 0xde48a899U, 0xdb32b7fcU,
 458        0xe39e919bU, 0xe2bb416eU, 0xa5cb6b95U, 0xa1f3b102U,
 459        0xccc41d14U, 0xc363da5dU, 0x5fdc7dcdU, 0x7f5a6c5cU,
 460        0xf726ffedU, 0xe89d6f8eU, 0x19a0f089U,
 461};
 462
 463static int anubis_setkey(struct crypto_tfm *tfm, const u8 *in_key,
 464                         unsigned int key_len)
 465{
 466        struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
 467        const __be32 *key = (const __be32 *)in_key;
 468        u32 *flags = &tfm->crt_flags;
 469        int N, R, i, r;
 470        u32 kappa[ANUBIS_MAX_N];
 471        u32 inter[ANUBIS_MAX_N];
 472
 473        switch (key_len)
 474        {
 475                case 16: case 20: case 24: case 28:
 476                case 32: case 36: case 40:
 477                        break;
 478                default:
 479                        *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
 480                        return - EINVAL;
 481        }
 482
 483        ctx->key_len = key_len * 8;
 484        N = ctx->key_len >> 5;
 485        ctx->R = R = 8 + N;
 486
 487        /* * map cipher key to initial key state (mu): */
 488        for (i = 0; i < N; i++)
 489                kappa[i] = be32_to_cpu(key[i]);
 490
 491        /*
 492         * generate R + 1 round keys:
 493         */
 494        for (r = 0; r <= R; r++) {
 495                u32 K0, K1, K2, K3;
 496                /*
 497                 * generate r-th round key K^r:
 498                 */
 499                K0 = T4[(kappa[N - 1] >> 24)       ];
 500                K1 = T4[(kappa[N - 1] >> 16) & 0xff];
 501                K2 = T4[(kappa[N - 1] >>  8) & 0xff];
 502                K3 = T4[(kappa[N - 1]      ) & 0xff];
 503                for (i = N - 2; i >= 0; i--) {
 504                        K0 = T4[(kappa[i] >> 24)       ] ^
 505                                (T5[(K0 >> 24)       ] & 0xff000000U) ^
 506                                (T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
 507                                (T5[(K0 >>  8) & 0xff] & 0x0000ff00U) ^
 508                                (T5[(K0      ) & 0xff] & 0x000000ffU);
 509                        K1 = T4[(kappa[i] >> 16) & 0xff] ^
 510                                (T5[(K1 >> 24)       ] & 0xff000000U) ^
 511                                (T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
 512                                (T5[(K1 >>  8) & 0xff] & 0x0000ff00U) ^
 513                                (T5[(K1      ) & 0xff] & 0x000000ffU);
 514                        K2 = T4[(kappa[i] >>  8) & 0xff] ^
 515                                (T5[(K2 >> 24)       ] & 0xff000000U) ^
 516                                (T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
 517                                (T5[(K2 >>  8) & 0xff] & 0x0000ff00U) ^
 518                                (T5[(K2      ) & 0xff] & 0x000000ffU);
 519                        K3 = T4[(kappa[i]      ) & 0xff] ^
 520                                (T5[(K3 >> 24)       ] & 0xff000000U) ^
 521                                (T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
 522                                (T5[(K3 >>  8) & 0xff] & 0x0000ff00U) ^
 523                                (T5[(K3      ) & 0xff] & 0x000000ffU);
 524                }
 525
 526                ctx->E[r][0] = K0;
 527                ctx->E[r][1] = K1;
 528                ctx->E[r][2] = K2;
 529                ctx->E[r][3] = K3;
 530
 531                /*
 532                 * compute kappa^{r+1} from kappa^r:
 533                 */
 534                if (r == R) {
 535                        break;
 536                }
 537                for (i = 0; i < N; i++) {
 538                        int j = i;
 539                        inter[i]  = T0[(kappa[j--] >> 24)       ];
 540                        if (j < 0) j = N - 1;
 541                        inter[i] ^= T1[(kappa[j--] >> 16) & 0xff];
 542                        if (j < 0) j = N - 1;
 543                        inter[i] ^= T2[(kappa[j--] >>  8) & 0xff];
 544                        if (j < 0) j = N - 1;
 545                        inter[i] ^= T3[(kappa[j  ]      ) & 0xff];
 546                }
 547                kappa[0] = inter[0] ^ rc[r];
 548                for (i = 1; i < N; i++) {
 549                        kappa[i] = inter[i];
 550                }
 551        }
 552
 553        /*
 554         * generate inverse key schedule: K'^0 = K^R, K'^R =
 555         *                                K^0, K'^r = theta(K^{R-r}):
 556         */
 557        for (i = 0; i < 4; i++) {
 558                ctx->D[0][i] = ctx->E[R][i];
 559                ctx->D[R][i] = ctx->E[0][i];
 560        }
 561        for (r = 1; r < R; r++) {
 562                for (i = 0; i < 4; i++) {
 563                        u32 v = ctx->E[R - r][i];
 564                        ctx->D[r][i] =
 565                                T0[T4[(v >> 24)       ] & 0xff] ^
 566                                T1[T4[(v >> 16) & 0xff] & 0xff] ^
 567                                T2[T4[(v >>  8) & 0xff] & 0xff] ^
 568                                T3[T4[(v      ) & 0xff] & 0xff];
 569                }
 570        }
 571
 572        return 0;
 573}
 574
 575static void anubis_crypt(u32 roundKey[ANUBIS_MAX_ROUNDS + 1][4],
 576                u8 *ciphertext, const u8 *plaintext, const int R)
 577{
 578        const __be32 *src = (const __be32 *)plaintext;
 579        __be32 *dst = (__be32 *)ciphertext;
 580        int i, r;
 581        u32 state[4];
 582        u32 inter[4];
 583
 584        /*
 585         * map plaintext block to cipher state (mu)
 586         * and add initial round key (sigma[K^0]):
 587         */
 588        for (i = 0; i < 4; i++)
 589                state[i] = be32_to_cpu(src[i]) ^ roundKey[0][i];
 590
 591        /*
 592         * R - 1 full rounds:
 593         */
 594
 595        for (r = 1; r < R; r++) {
 596                inter[0] =
 597                        T0[(state[0] >> 24)       ] ^
 598                        T1[(state[1] >> 24)       ] ^
 599                        T2[(state[2] >> 24)       ] ^
 600                        T3[(state[3] >> 24)       ] ^
 601                        roundKey[r][0];
 602                inter[1] =
 603                        T0[(state[0] >> 16) & 0xff] ^
 604                        T1[(state[1] >> 16) & 0xff] ^
 605                        T2[(state[2] >> 16) & 0xff] ^
 606                        T3[(state[3] >> 16) & 0xff] ^
 607                        roundKey[r][1];
 608                inter[2] =
 609                        T0[(state[0] >>  8) & 0xff] ^
 610                        T1[(state[1] >>  8) & 0xff] ^
 611                        T2[(state[2] >>  8) & 0xff] ^
 612                        T3[(state[3] >>  8) & 0xff] ^
 613                        roundKey[r][2];
 614                inter[3] =
 615                        T0[(state[0]      ) & 0xff] ^
 616                        T1[(state[1]      ) & 0xff] ^
 617                        T2[(state[2]      ) & 0xff] ^
 618                        T3[(state[3]      ) & 0xff] ^
 619                        roundKey[r][3];
 620                state[0] = inter[0];
 621                state[1] = inter[1];
 622                state[2] = inter[2];
 623                state[3] = inter[3];
 624        }
 625
 626        /*
 627         * last round:
 628         */
 629
 630        inter[0] =
 631                (T0[(state[0] >> 24)       ] & 0xff000000U) ^
 632                (T1[(state[1] >> 24)       ] & 0x00ff0000U) ^
 633                (T2[(state[2] >> 24)       ] & 0x0000ff00U) ^
 634                (T3[(state[3] >> 24)       ] & 0x000000ffU) ^
 635                roundKey[R][0];
 636        inter[1] =
 637                (T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
 638                (T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
 639                (T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
 640                (T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
 641                roundKey[R][1];
 642        inter[2] =
 643                (T0[(state[0] >>  8) & 0xff] & 0xff000000U) ^
 644                (T1[(state[1] >>  8) & 0xff] & 0x00ff0000U) ^
 645                (T2[(state[2] >>  8) & 0xff] & 0x0000ff00U) ^
 646                (T3[(state[3] >>  8) & 0xff] & 0x000000ffU) ^
 647                roundKey[R][2];
 648        inter[3] =
 649                (T0[(state[0]      ) & 0xff] & 0xff000000U) ^
 650                (T1[(state[1]      ) & 0xff] & 0x00ff0000U) ^
 651                (T2[(state[2]      ) & 0xff] & 0x0000ff00U) ^
 652                (T3[(state[3]      ) & 0xff] & 0x000000ffU) ^
 653                roundKey[R][3];
 654
 655        /*
 656         * map cipher state to ciphertext block (mu^{-1}):
 657         */
 658
 659        for (i = 0; i < 4; i++)
 660                dst[i] = cpu_to_be32(inter[i]);
 661}
 662
 663static void anubis_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
 664{
 665        struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
 666        anubis_crypt(ctx->E, dst, src, ctx->R);
 667}
 668
 669static void anubis_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
 670{
 671        struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
 672        anubis_crypt(ctx->D, dst, src, ctx->R);
 673}
 674
 675static struct crypto_alg anubis_alg = {
 676        .cra_name               =       "anubis",
 677        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
 678        .cra_blocksize          =       ANUBIS_BLOCK_SIZE,
 679        .cra_ctxsize            =       sizeof (struct anubis_ctx),
 680        .cra_alignmask          =       3,
 681        .cra_module             =       THIS_MODULE,
 682        .cra_list               =       LIST_HEAD_INIT(anubis_alg.cra_list),
 683        .cra_u                  =       { .cipher = {
 684        .cia_min_keysize        =       ANUBIS_MIN_KEY_SIZE,
 685        .cia_max_keysize        =       ANUBIS_MAX_KEY_SIZE,
 686        .cia_setkey             =       anubis_setkey,
 687        .cia_encrypt            =       anubis_encrypt,
 688        .cia_decrypt            =       anubis_decrypt } }
 689};
 690
 691static int __init init(void)
 692{
 693        int ret = 0;
 694        
 695        ret = crypto_register_alg(&anubis_alg);
 696        return ret;
 697}
 698
 699static void __exit fini(void)
 700{
 701        crypto_unregister_alg(&anubis_alg);
 702}
 703
 704module_init(init);
 705module_exit(fini);
 706
 707MODULE_LICENSE("GPL");
 708MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");
 709
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.