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