/*
* Cryptographic API.
*
* Anubis Algorithm
*
* The Anubis algorithm was developed by Paulo S. L. M. Barreto and
* Vincent Rijmen.
*
* See
*
* P.S.L.M. Barreto, V. Rijmen,
* ``The Anubis block cipher,''
* NESSIE submission, 2000.
*
* This software implements the "tweaked" version of Anubis.
* Only the S-box and (consequently) the rounds constants have been
* changed.
*
* The original authors have disclaimed all copyright interest in this
* code and thus put it in the public domain. The subsequent authors
* have put this under the GNU General Public License.
*
* By Aaron Grothe ajgrothe@yahoo.com, October 28, 2004
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
*/
#include <crypto/algapi.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/unaligned.h>
#include <linux/types.h>
#define ANUBIS_MIN_KEY_SIZE 16
#define ANUBIS_MAX_KEY_SIZE 40
#define ANUBIS_BLOCK_SIZE 16
#define ANUBIS_MAX_N 10
#define ANUBIS_MAX_ROUNDS (8 + ANUBIS_MAX_N)
struct anubis_ctx {
int key_len; // in bits
int R;
u32 E[ANUBIS_MAX_ROUNDS + 1 ][4 ];
u32 D[ANUBIS_MAX_ROUNDS + 1 ][4 ];
};
static const u32 T0[256 ] = {
0 xba69d2bbU, 0 x54a84de5U, 0 x2f5ebce2U, 0 x74e8cd25U,
0 x53a651f7U, 0 xd3bb6bd0U, 0 xd2b96fd6U, 0 x4d9a29b3U,
0 x50a05dfdU, 0 xac458acfU, 0 x8d070e09U, 0 xbf63c6a5U,
0 x70e0dd3dU, 0 x52a455f1U, 0 x9a29527bU, 0 x4c982db5U,
0 xeac98f46U, 0 xd5b773c4U, 0 x97336655U, 0 xd1bf63dcU,
0 x3366ccaaU, 0 x51a259fbU, 0 x5bb671c7U, 0 xa651a2f3U,
0 xdea15ffeU, 0 x48903dadU, 0 xa84d9ad7U, 0 x992f5e71U,
0 xdbab4be0U, 0 x3264c8acU, 0 xb773e695U, 0 xfce5d732U,
0 xe3dbab70U, 0 x9e214263U, 0 x913f7e41U, 0 x9b2b567dU,
0 xe2d9af76U, 0 xbb6bd6bdU, 0 x4182199bU, 0 x6edca579U,
0 xa557aef9U, 0 xcb8b0b80U, 0 x6bd6b167U, 0 x95376e59U,
0 xa15fbee1U, 0 xf3fbeb10U, 0 xb17ffe81U, 0 x0204080cU,
0 xcc851792U, 0 xc49537a2U, 0 x1d3a744eU, 0 x14285078U,
0 xc39b2bb0U, 0 x63c69157U, 0 xdaa94fe6U, 0 x5dba69d3U,
0 x5fbe61dfU, 0 xdca557f2U, 0 x7dfae913U, 0 xcd871394U,
0 x7ffee11fU, 0 x5ab475c1U, 0 x6cd8ad75U, 0 x5cb86dd5U,
0 xf7f3fb08U, 0 x264c98d4U, 0 xffe3db38U, 0 xedc79354U,
0 xe8cd874aU, 0 x9d274e69U, 0 x6fdea17fU, 0 x8e010203U,
0 x19326456U, 0 xa05dbae7U, 0 xf0fde71aU, 0 x890f1e11U,
0 x0f1e3c22U, 0 x070e1c12U, 0 xaf4386c5U, 0 xfbebcb20U,
0 x08102030U, 0 x152a547eU, 0 x0d1a342eU, 0 x04081018U,
0 x01020406U, 0 x64c88d45U, 0 xdfa35bf8U, 0 x76ecc529U,
0 x79f2f90bU, 0 xdda753f4U, 0 x3d7af48eU, 0 x162c5874U,
0 x3f7efc82U, 0 x376edcb2U, 0 x6ddaa973U, 0 x3870e090U,
0 xb96fdeb1U, 0 x73e6d137U, 0 xe9cf834cU, 0 x356ad4beU,
0 x55aa49e3U, 0 x71e2d93bU, 0 x7bf6f107U, 0 x8c050a0fU,
0 x72e4d531U, 0 x880d1a17U, 0 xf6f1ff0eU, 0 x2a54a8fcU,
0 x3e7cf884U, 0 x5ebc65d9U, 0 x274e9cd2U, 0 x468c0589U,
0 x0c183028U, 0 x65ca8943U, 0 x68d0bd6dU, 0 x61c2995bU,
0 x03060c0aU, 0 xc19f23bcU, 0 x57ae41efU, 0 xd6b17fceU,
0 xd9af43ecU, 0 x58b07dcdU, 0 xd8ad47eaU, 0 x66cc8549U,
0 xd7b37bc8U, 0 x3a74e89cU, 0 xc88d078aU, 0 x3c78f088U,
0 xfae9cf26U, 0 x96316253U, 0 xa753a6f5U, 0 x982d5a77U,
0 xecc59752U, 0 xb86ddab7U, 0 xc7933ba8U, 0 xae4182c3U,
0 x69d2b96bU, 0 x4b9631a7U, 0 xab4b96ddU, 0 xa94f9ed1U,
0 x67ce814fU, 0 x0a14283cU, 0 x478e018fU, 0 xf2f9ef16U,
0 xb577ee99U, 0 x224488ccU, 0 xe5d7b364U, 0 xeec19f5eU,
0 xbe61c2a3U, 0 x2b56acfaU, 0 x811f3e21U, 0 x1224486cU,
0 x831b362dU, 0 x1b366c5aU, 0 x0e1c3824U, 0 x23468ccaU,
0 xf5f7f304U, 0 x458a0983U, 0 x214284c6U, 0 xce811f9eU,
0 x499239abU, 0 x2c58b0e8U, 0 xf9efc32cU, 0 xe6d1bf6eU,
0 xb671e293U, 0 x2850a0f0U, 0 x172e5c72U, 0 x8219322bU,
0 x1a34685cU, 0 x8b0b161dU, 0 xfee1df3eU, 0 x8a09121bU,
0 x09122436U, 0 xc98f038cU, 0 x87132635U, 0 x4e9c25b9U,
0 xe1dfa37cU, 0 x2e5cb8e4U, 0 xe4d5b762U, 0 xe0dda77aU,
0 xebcb8b40U, 0 x903d7a47U, 0 xa455aaffU, 0 x1e3c7844U,
0 x85172e39U, 0 x60c09d5dU, 0 x00000000U, 0 x254a94deU,
0 xf4f5f702U, 0 xf1ffe31cU, 0 x94356a5fU, 0 x0b162c3aU,
0 xe7d3bb68U, 0 x75eac923U, 0 xefc39b58U, 0 x3468d0b8U,
0 x3162c4a6U, 0 xd4b577c2U, 0 xd0bd67daU, 0 x86112233U,
0 x7efce519U, 0 xad478ec9U, 0 xfde7d334U, 0 x2952a4f6U,
0 x3060c0a0U, 0 x3b76ec9aU, 0 x9f234665U, 0 xf8edc72aU,
0 xc6913faeU, 0 x13264c6aU, 0 x060c1814U, 0 x050a141eU,
0 xc59733a4U, 0 x11224466U, 0 x77eec12fU, 0 x7cf8ed15U,
0 x7af4f501U, 0 x78f0fd0dU, 0 x366cd8b4U, 0 x1c387048U,
0 x3972e496U, 0 x59b279cbU, 0 x18306050U, 0 x56ac45e9U,
0 xb37bf68dU, 0 xb07dfa87U, 0 x244890d8U, 0 x204080c0U,
0 xb279f28bU, 0 x9239724bU, 0 xa35bb6edU, 0 xc09d27baU,
0 x44880d85U, 0 x62c49551U, 0 x10204060U, 0 xb475ea9fU,
0 x84152a3fU, 0 x43861197U, 0 x933b764dU, 0 xc2992fb6U,
0 x4a9435a1U, 0 xbd67cea9U, 0 x8f030605U, 0 x2d5ab4eeU,
0 xbc65caafU, 0 x9c254a6fU, 0 x6ad4b561U, 0 x40801d9dU,
0 xcf831b98U, 0 xa259b2ebU, 0 x801d3a27U, 0 x4f9e21bfU,
0 x1f3e7c42U, 0 xca890f86U, 0 xaa4992dbU, 0 x42841591U,
};
static const u32 T1[256 ] = {
0 x69babbd2U, 0 xa854e54dU, 0 x5e2fe2bcU, 0 xe87425cdU,
0 xa653f751U, 0 xbbd3d06bU, 0 xb9d2d66fU, 0 x9a4db329U,
0 xa050fd5dU, 0 x45accf8aU, 0 x078d090eU, 0 x63bfa5c6U,
0 xe0703dddU, 0 xa452f155U, 0 x299a7b52U, 0 x984cb52dU,
0 xc9ea468fU, 0 xb7d5c473U, 0 x33975566U, 0 xbfd1dc63U,
0 x6633aaccU, 0 xa251fb59U, 0 xb65bc771U, 0 x51a6f3a2U,
0 xa1defe5fU, 0 x9048ad3dU, 0 x4da8d79aU, 0 x2f99715eU,
0 xabdbe04bU, 0 x6432acc8U, 0 x73b795e6U, 0 xe5fc32d7U,
0 xdbe370abU, 0 x219e6342U, 0 x3f91417eU, 0 x2b9b7d56U,
0 xd9e276afU, 0 x6bbbbdd6U, 0 x82419b19U, 0 xdc6e79a5U,
0 x57a5f9aeU, 0 x8bcb800bU, 0 xd66b67b1U, 0 x3795596eU,
0 x5fa1e1beU, 0 xfbf310ebU, 0 x7fb181feU, 0 x04020c08U,
0 x85cc9217U, 0 x95c4a237U, 0 x3a1d4e74U, 0 x28147850U,
0 x9bc3b02bU, 0 xc6635791U, 0 xa9dae64fU, 0 xba5dd369U,
0 xbe5fdf61U, 0 xa5dcf257U, 0 xfa7d13e9U, 0 x87cd9413U,
0 xfe7f1fe1U, 0 xb45ac175U, 0 xd86c75adU, 0 xb85cd56dU,
0 xf3f708fbU, 0 x4c26d498U, 0 xe3ff38dbU, 0 xc7ed5493U,
0 xcde84a87U, 0 x279d694eU, 0 xde6f7fa1U, 0 x018e0302U,
0 x32195664U, 0 x5da0e7baU, 0 xfdf01ae7U, 0 x0f89111eU,
0 x1e0f223cU, 0 x0e07121cU, 0 x43afc586U, 0 xebfb20cbU,
0 x10083020U, 0 x2a157e54U, 0 x1a0d2e34U, 0 x08041810U,
0 x02010604U, 0 xc864458dU, 0 xa3dff85bU, 0 xec7629c5U,
0 xf2790bf9U, 0 xa7ddf453U, 0 x7a3d8ef4U, 0 x2c167458U,
0 x7e3f82fcU, 0 x6e37b2dcU, 0 xda6d73a9U, 0 x703890e0U,
0 x6fb9b1deU, 0 xe67337d1U, 0 xcfe94c83U, 0 x6a35bed4U,
0 xaa55e349U, 0 xe2713bd9U, 0 xf67b07f1U, 0 x058c0f0aU,
0 xe47231d5U, 0 x0d88171aU, 0 xf1f60effU, 0 x542afca8U,
0 x7c3e84f8U, 0 xbc5ed965U, 0 x4e27d29cU, 0 x8c468905U,
0 x180c2830U, 0 xca654389U, 0 xd0686dbdU, 0 xc2615b99U,
0 x06030a0cU, 0 x9fc1bc23U, 0 xae57ef41U, 0 xb1d6ce7fU,
0 xafd9ec43U, 0 xb058cd7dU, 0 xadd8ea47U, 0 xcc664985U,
0 xb3d7c87bU, 0 x743a9ce8U, 0 x8dc88a07U, 0 x783c88f0U,
0 xe9fa26cfU, 0 x31965362U, 0 x53a7f5a6U, 0 x2d98775aU,
0 xc5ec5297U, 0 x6db8b7daU, 0 x93c7a83bU, 0 x41aec382U,
0 xd2696bb9U, 0 x964ba731U, 0 x4babdd96U, 0 x4fa9d19eU,
0 xce674f81U, 0 x140a3c28U, 0 x8e478f01U, 0 xf9f216efU,
0 x77b599eeU, 0 x4422cc88U, 0 xd7e564b3U, 0 xc1ee5e9fU,
0 x61bea3c2U, 0 x562bfaacU, 0 x1f81213eU, 0 x24126c48U,
0 x1b832d36U, 0 x361b5a6cU, 0 x1c0e2438U, 0 x4623ca8cU,
0 xf7f504f3U, 0 x8a458309U, 0 x4221c684U, 0 x81ce9e1fU,
0 x9249ab39U, 0 x582ce8b0U, 0 xeff92cc3U, 0 xd1e66ebfU,
0 x71b693e2U, 0 x5028f0a0U, 0 x2e17725cU, 0 x19822b32U,
0 x341a5c68U, 0 x0b8b1d16U, 0 xe1fe3edfU, 0 x098a1b12U,
0 x12093624U, 0 x8fc98c03U, 0 x13873526U, 0 x9c4eb925U,
0 xdfe17ca3U, 0 x5c2ee4b8U, 0 xd5e462b7U, 0 xdde07aa7U,
0 xcbeb408bU, 0 x3d90477aU, 0 x55a4ffaaU, 0 x3c1e4478U,
0 x1785392eU, 0 xc0605d9dU, 0 x00000000U, 0 x4a25de94U,
0 xf5f402f7U, 0 xfff11ce3U, 0 x35945f6aU, 0 x160b3a2cU,
0 xd3e768bbU, 0 xea7523c9U, 0 xc3ef589bU, 0 x6834b8d0U,
0 x6231a6c4U, 0 xb5d4c277U, 0 xbdd0da67U, 0 x11863322U,
0 xfc7e19e5U, 0 x47adc98eU, 0 xe7fd34d3U, 0 x5229f6a4U,
0 x6030a0c0U, 0 x763b9aecU, 0 x239f6546U, 0 xedf82ac7U,
0 x91c6ae3fU, 0 x26136a4cU, 0 x0c061418U, 0 x0a051e14U,
0 x97c5a433U, 0 x22116644U, 0 xee772fc1U, 0 xf87c15edU,
0 xf47a01f5U, 0 xf0780dfdU, 0 x6c36b4d8U, 0 x381c4870U,
0 x723996e4U, 0 xb259cb79U, 0 x30185060U, 0 xac56e945U,
0 x7bb38df6U, 0 x7db087faU, 0 x4824d890U, 0 x4020c080U,
0 x79b28bf2U, 0 x39924b72U, 0 x5ba3edb6U, 0 x9dc0ba27U,
0 x8844850dU, 0 xc4625195U, 0 x20106040U, 0 x75b49feaU,
0 x15843f2aU, 0 x86439711U, 0 x3b934d76U, 0 x99c2b62fU,
0 x944aa135U, 0 x67bda9ceU, 0 x038f0506U, 0 x5a2deeb4U,
0 x65bcafcaU, 0 x259c6f4aU, 0 xd46a61b5U, 0 x80409d1dU,
0 x83cf981bU, 0 x59a2ebb2U, 0 x1d80273aU, 0 x9e4fbf21U,
0 x3e1f427cU, 0 x89ca860fU, 0 x49aadb92U, 0 x84429115U,
};
static const u32 T2[256 ] = {
0 xd2bbba69U, 0 x4de554a8U, 0 xbce22f5eU, 0 xcd2574e8U,
0 x51f753a6U, 0 x6bd0d3bbU, 0 x6fd6d2b9U, 0 x29b34d9aU,
0 x5dfd50a0U, 0 x8acfac45U, 0 x0e098d07U, 0 xc6a5bf63U,
0 xdd3d70e0U, 0 x55f152a4U, 0 x527b9a29U, 0 x2db54c98U,
0 x8f46eac9U, 0 x73c4d5b7U, 0 x66559733U, 0 x63dcd1bfU,
0 xccaa3366U, 0 x59fb51a2U, 0 x71c75bb6U, 0 xa2f3a651U,
0 x5ffedea1U, 0 x3dad4890U, 0 x9ad7a84dU, 0 x5e71992fU,
0 x4be0dbabU, 0 xc8ac3264U, 0 xe695b773U, 0 xd732fce5U,
0 xab70e3dbU, 0 x42639e21U, 0 x7e41913fU, 0 x567d9b2bU,
0 xaf76e2d9U, 0 xd6bdbb6bU, 0 x199b4182U, 0 xa5796edcU,
0 xaef9a557U, 0 x0b80cb8bU, 0 xb1676bd6U, 0 x6e599537U,
0 xbee1a15fU, 0 xeb10f3fbU, 0 xfe81b17fU, 0 x080c0204U,
0 x1792cc85U, 0 x37a2c495U, 0 x744e1d3aU, 0 x50781428U,
0 x2bb0c39bU, 0 x915763c6U, 0 x4fe6daa9U, 0 x69d35dbaU,
0 x61df5fbeU, 0 x57f2dca5U, 0 xe9137dfaU, 0 x1394cd87U,
0 xe11f7ffeU, 0 x75c15ab4U, 0 xad756cd8U, 0 x6dd55cb8U,
0 xfb08f7f3U, 0 x98d4264cU, 0 xdb38ffe3U, 0 x9354edc7U,
0 x874ae8cdU, 0 x4e699d27U, 0 xa17f6fdeU, 0 x02038e01U,
0 x64561932U, 0 xbae7a05dU, 0 xe71af0fdU, 0 x1e11890fU,
0 x3c220f1eU, 0 x1c12070eU, 0 x86c5af43U, 0 xcb20fbebU,
0 x20300810U, 0 x547e152aU, 0 x342e0d1aU, 0 x10180408U,
0 x04060102U, 0 x8d4564c8U, 0 x5bf8dfa3U, 0 xc52976ecU,
0 xf90b79f2U, 0 x53f4dda7U, 0 xf48e3d7aU, 0 x5874162cU,
0 xfc823f7eU, 0 xdcb2376eU, 0 xa9736ddaU, 0 xe0903870U,
0 xdeb1b96fU, 0 xd13773e6U, 0 x834ce9cfU, 0 xd4be356aU,
0 x49e355aaU, 0 xd93b71e2U, 0 xf1077bf6U, 0 x0a0f8c05U,
0 xd53172e4U, 0 x1a17880dU, 0 xff0ef6f1U, 0 xa8fc2a54U,
0 xf8843e7cU, 0 x65d95ebcU, 0 x9cd2274eU, 0 x0589468cU,
0 x30280c18U, 0 x894365caU, 0 xbd6d68d0U, 0 x995b61c2U,
0 x0c0a0306U, 0 x23bcc19fU, 0 x41ef57aeU, 0 x7fced6b1U,
0 x43ecd9afU, 0 x7dcd58b0U, 0 x47ead8adU, 0 x854966ccU,
0 x7bc8d7b3U, 0 xe89c3a74U, 0 x078ac88dU, 0 xf0883c78U,
0 xcf26fae9U, 0 x62539631U, 0 xa6f5a753U, 0 x5a77982dU,
0 x9752ecc5U, 0 xdab7b86dU, 0 x3ba8c793U, 0 x82c3ae41U,
0 xb96b69d2U, 0 x31a74b96U, 0 x96ddab4bU, 0 x9ed1a94fU,
0 x814f67ceU, 0 x283c0a14U, 0 x018f478eU, 0 xef16f2f9U,
0 xee99b577U, 0 x88cc2244U, 0 xb364e5d7U, 0 x9f5eeec1U,
0 xc2a3be61U, 0 xacfa2b56U, 0 x3e21811fU, 0 x486c1224U,
0 x362d831bU, 0 x6c5a1b36U, 0 x38240e1cU, 0 x8cca2346U,
0 xf304f5f7U, 0 x0983458aU, 0 x84c62142U, 0 x1f9ece81U,
0 x39ab4992U, 0 xb0e82c58U, 0 xc32cf9efU, 0 xbf6ee6d1U,
0 xe293b671U, 0 xa0f02850U, 0 x5c72172eU, 0 x322b8219U,
0 x685c1a34U, 0 x161d8b0bU, 0 xdf3efee1U, 0 x121b8a09U,
0 x24360912U, 0 x038cc98fU, 0 x26358713U, 0 x25b94e9cU,
0 xa37ce1dfU, 0 xb8e42e5cU, 0 xb762e4d5U, 0 xa77ae0ddU,
0 x8b40ebcbU, 0 x7a47903dU, 0 xaaffa455U, 0 x78441e3cU,
0 x2e398517U, 0 x9d5d60c0U, 0 x00000000U, 0 x94de254aU,
0 xf702f4f5U, 0 xe31cf1ffU, 0 x6a5f9435U, 0 x2c3a0b16U,
0 xbb68e7d3U, 0 xc92375eaU, 0 x9b58efc3U, 0 xd0b83468U,
0 xc4a63162U, 0 x77c2d4b5U, 0 x67dad0bdU, 0 x22338611U,
0 xe5197efcU, 0 x8ec9ad47U, 0 xd334fde7U, 0 xa4f62952U,
0 xc0a03060U, 0 xec9a3b76U, 0 x46659f23U, 0 xc72af8edU,
0 x3faec691U, 0 x4c6a1326U, 0 x1814060cU, 0 x141e050aU,
0 x33a4c597U, 0 x44661122U, 0 xc12f77eeU, 0 xed157cf8U,
0 xf5017af4U, 0 xfd0d78f0U, 0 xd8b4366cU, 0 x70481c38U,
0 xe4963972U, 0 x79cb59b2U, 0 x60501830U, 0 x45e956acU,
0 xf68db37bU, 0 xfa87b07dU, 0 x90d82448U, 0 x80c02040U,
0 xf28bb279U, 0 x724b9239U, 0 xb6eda35bU, 0 x27bac09dU,
0 x0d854488U, 0 x955162c4U, 0 x40601020U, 0 xea9fb475U,
0 x2a3f8415U, 0 x11974386U, 0 x764d933bU, 0 x2fb6c299U,
0 x35a14a94U, 0 xcea9bd67U, 0 x06058f03U, 0 xb4ee2d5aU,
0 xcaafbc65U, 0 x4a6f9c25U, 0 xb5616ad4U, 0 x1d9d4080U,
0 x1b98cf83U, 0 xb2eba259U, 0 x3a27801dU, 0 x21bf4f9eU,
0 x7c421f3eU, 0 x0f86ca89U, 0 x92dbaa49U, 0 x15914284U,
};
static const u32 T3[256 ] = {
0 xbbd269baU, 0 xe54da854U, 0 xe2bc5e2fU, 0 x25cde874U,
0 xf751a653U, 0 xd06bbbd3U, 0 xd66fb9d2U, 0 xb3299a4dU,
0 xfd5da050U, 0 xcf8a45acU, 0 x090e078dU, 0 xa5c663bfU,
0 x3ddde070U, 0 xf155a452U, 0 x7b52299aU, 0 xb52d984cU,
0 x468fc9eaU, 0 xc473b7d5U, 0 x55663397U, 0 xdc63bfd1U,
0 xaacc6633U, 0 xfb59a251U, 0 xc771b65bU, 0 xf3a251a6U,
0 xfe5fa1deU, 0 xad3d9048U, 0 xd79a4da8U, 0 x715e2f99U,
0 xe04babdbU, 0 xacc86432U, 0 x95e673b7U, 0 x32d7e5fcU,
0 x70abdbe3U, 0 x6342219eU, 0 x417e3f91U, 0 x7d562b9bU,
0 x76afd9e2U, 0 xbdd66bbbU, 0 x9b198241U, 0 x79a5dc6eU,
0 xf9ae57a5U, 0 x800b8bcbU, 0 x67b1d66bU, 0 x596e3795U,
0 xe1be5fa1U, 0 x10ebfbf3U, 0 x81fe7fb1U, 0 x0c080402U,
0 x921785ccU, 0 xa23795c4U, 0 x4e743a1dU, 0 x78502814U,
0 xb02b9bc3U, 0 x5791c663U, 0 xe64fa9daU, 0 xd369ba5dU,
0 xdf61be5fU, 0 xf257a5dcU, 0 x13e9fa7dU, 0 x941387cdU,
0 x1fe1fe7fU, 0 xc175b45aU, 0 x75add86cU, 0 xd56db85cU,
0 x08fbf3f7U, 0 xd4984c26U, 0 x38dbe3ffU, 0 x5493c7edU,
0 x4a87cde8U, 0 x694e279dU, 0 x7fa1de6fU, 0 x0302018eU,
0 x56643219U, 0 xe7ba5da0U, 0 x1ae7fdf0U, 0 x111e0f89U,
0 x223c1e0fU, 0 x121c0e07U, 0 xc58643afU, 0 x20cbebfbU,
0 x30201008U, 0 x7e542a15U, 0 x2e341a0dU, 0 x18100804U,
0 x06040201U, 0 x458dc864U, 0 xf85ba3dfU, 0 x29c5ec76U,
0 x0bf9f279U, 0 xf453a7ddU, 0 x8ef47a3dU, 0 x74582c16U,
0 x82fc7e3fU, 0 xb2dc6e37U, 0 x73a9da6dU, 0 x90e07038U,
0 xb1de6fb9U, 0 x37d1e673U, 0 x4c83cfe9U, 0 xbed46a35U,
0 xe349aa55U, 0 x3bd9e271U, 0 x07f1f67bU, 0 x0f0a058cU,
0 x31d5e472U, 0 x171a0d88U, 0 x0efff1f6U, 0 xfca8542aU,
0 x84f87c3eU, 0 xd965bc5eU, 0 xd29c4e27U, 0 x89058c46U,
0 x2830180cU, 0 x4389ca65U, 0 x6dbdd068U, 0 x5b99c261U,
0 x0a0c0603U, 0 xbc239fc1U, 0 xef41ae57U, 0 xce7fb1d6U,
0 xec43afd9U, 0 xcd7db058U, 0 xea47add8U, 0 x4985cc66U,
0 xc87bb3d7U, 0 x9ce8743aU, 0 x8a078dc8U, 0 x88f0783cU,
0 x26cfe9faU, 0 x53623196U, 0 xf5a653a7U, 0 x775a2d98U,
0 x5297c5ecU, 0 xb7da6db8U, 0 xa83b93c7U, 0 xc38241aeU,
0 x6bb9d269U, 0 xa731964bU, 0 xdd964babU, 0 xd19e4fa9U,
0 x4f81ce67U, 0 x3c28140aU, 0 x8f018e47U, 0 x16eff9f2U,
0 x99ee77b5U, 0 xcc884422U, 0 x64b3d7e5U, 0 x5e9fc1eeU,
0 xa3c261beU, 0 xfaac562bU, 0 x213e1f81U, 0 x6c482412U,
0 x2d361b83U, 0 x5a6c361bU, 0 x24381c0eU, 0 xca8c4623U,
0 x04f3f7f5U, 0 x83098a45U, 0 xc6844221U, 0 x9e1f81ceU,
0 xab399249U, 0 xe8b0582cU, 0 x2cc3eff9U, 0 x6ebfd1e6U,
0 x93e271b6U, 0 xf0a05028U, 0 x725c2e17U, 0 x2b321982U,
0 x5c68341aU, 0 x1d160b8bU, 0 x3edfe1feU, 0 x1b12098aU,
0 x36241209U, 0 x8c038fc9U, 0 x35261387U, 0 xb9259c4eU,
0 x7ca3dfe1U, 0 xe4b85c2eU, 0 x62b7d5e4U, 0 x7aa7dde0U,
0 x408bcbebU, 0 x477a3d90U, 0 xffaa55a4U, 0 x44783c1eU,
0 x392e1785U, 0 x5d9dc060U, 0 x00000000U, 0 xde944a25U,
0 x02f7f5f4U, 0 x1ce3fff1U, 0 x5f6a3594U, 0 x3a2c160bU,
0 x68bbd3e7U, 0 x23c9ea75U, 0 x589bc3efU, 0 xb8d06834U,
0 xa6c46231U, 0 xc277b5d4U, 0 xda67bdd0U, 0 x33221186U,
0 x19e5fc7eU, 0 xc98e47adU, 0 x34d3e7fdU, 0 xf6a45229U,
0 xa0c06030U, 0 x9aec763bU, 0 x6546239fU, 0 x2ac7edf8U,
0 xae3f91c6U, 0 x6a4c2613U, 0 x14180c06U, 0 x1e140a05U,
0 xa43397c5U, 0 x66442211U, 0 x2fc1ee77U, 0 x15edf87cU,
0 x01f5f47aU, 0 x0dfdf078U, 0 xb4d86c36U, 0 x4870381cU,
0 x96e47239U, 0 xcb79b259U, 0 x50603018U, 0 xe945ac56U,
0 x8df67bb3U, 0 x87fa7db0U, 0 xd8904824U, 0 xc0804020U,
0 x8bf279b2U, 0 x4b723992U, 0 xedb65ba3U, 0 xba279dc0U,
0 x850d8844U, 0 x5195c462U, 0 x60402010U, 0 x9fea75b4U,
0 x3f2a1584U, 0 x97118643U, 0 x4d763b93U, 0 xb62f99c2U,
0 xa135944aU, 0 xa9ce67bdU, 0 x0506038fU, 0 xeeb45a2dU,
0 xafca65bcU, 0 x6f4a259cU, 0 x61b5d46aU, 0 x9d1d8040U,
0 x981b83cfU, 0 xebb259a2U, 0 x273a1d80U, 0 xbf219e4fU,
0 x427c3e1fU, 0 x860f89caU, 0 xdb9249aaU, 0 x91158442U,
};
static const u32 T4[256 ] = {
0 xbabababaU, 0 x54545454U, 0 x2f2f2f2fU, 0 x74747474U,
0 x53535353U, 0 xd3d3d3d3U, 0 xd2d2d2d2U, 0 x4d4d4d4dU,
0 x50505050U, 0 xacacacacU, 0 x8d8d8d8dU, 0 xbfbfbfbfU,
0 x70707070U, 0 x52525252U, 0 x9a9a9a9aU, 0 x4c4c4c4cU,
0 xeaeaeaeaU, 0 xd5d5d5d5U, 0 x97979797U, 0 xd1d1d1d1U,
0 x33333333U, 0 x51515151U, 0 x5b5b5b5bU, 0 xa6a6a6a6U,
0 xdedededeU, 0 x48484848U, 0 xa8a8a8a8U, 0 x99999999U,
0 xdbdbdbdbU, 0 x32323232U, 0 xb7b7b7b7U, 0 xfcfcfcfcU,
0 xe3e3e3e3U, 0 x9e9e9e9eU, 0 x91919191U, 0 x9b9b9b9bU,
0 xe2e2e2e2U, 0 xbbbbbbbbU, 0 x41414141U, 0 x6e6e6e6eU,
0 xa5a5a5a5U, 0 xcbcbcbcbU, 0 x6b6b6b6bU, 0 x95959595U,
0 xa1a1a1a1U, 0 xf3f3f3f3U, 0 xb1b1b1b1U, 0 x02020202U,
0 xccccccccU, 0 xc4c4c4c4U, 0 x1d1d1d1dU, 0 x14141414U,
0 xc3c3c3c3U, 0 x63636363U, 0 xdadadadaU, 0 x5d5d5d5dU,
0 x5f5f5f5fU, 0 xdcdcdcdcU, 0 x7d7d7d7dU, 0 xcdcdcdcdU,
0 x7f7f7f7fU, 0 x5a5a5a5aU, 0 x6c6c6c6cU, 0 x5c5c5c5cU,
0 xf7f7f7f7U, 0 x26262626U, 0 xffffffffU, 0 xededededU,
0 xe8e8e8e8U, 0 x9d9d9d9dU, 0 x6f6f6f6fU, 0 x8e8e8e8eU,
0 x19191919U, 0 xa0a0a0a0U, 0 xf0f0f0f0U, 0 x89898989U,
0 x0f0f0f0fU, 0 x07070707U, 0 xafafafafU, 0 xfbfbfbfbU,
0 x08080808U, 0 x15151515U, 0 x0d0d0d0dU, 0 x04040404U,
0 x01010101U, 0 x64646464U, 0 xdfdfdfdfU, 0 x76767676U,
0 x79797979U, 0 xddddddddU, 0 x3d3d3d3dU, 0 x16161616U,
0 x3f3f3f3fU, 0 x37373737U, 0 x6d6d6d6dU, 0 x38383838U,
0 xb9b9b9b9U, 0 x73737373U, 0 xe9e9e9e9U, 0 x35353535U,
0 x55555555U, 0 x71717171U, 0 x7b7b7b7bU, 0 x8c8c8c8cU,
0 x72727272U, 0 x88888888U, 0 xf6f6f6f6U, 0 x2a2a2a2aU,
0 x3e3e3e3eU, 0 x5e5e5e5eU, 0 x27272727U, 0 x46464646U,
0 x0c0c0c0cU, 0 x65656565U, 0 x68686868U, 0 x61616161U,
0 x03030303U, 0 xc1c1c1c1U, 0 x57575757U, 0 xd6d6d6d6U,
0 xd9d9d9d9U, 0 x58585858U, 0 xd8d8d8d8U, 0 x66666666U,
0 xd7d7d7d7U, 0 x3a3a3a3aU, 0 xc8c8c8c8U, 0 x3c3c3c3cU,
0 xfafafafaU, 0 x96969696U, 0 xa7a7a7a7U, 0 x98989898U,
0 xececececU, 0 xb8b8b8b8U, 0 xc7c7c7c7U, 0 xaeaeaeaeU,
0 x69696969U, 0 x4b4b4b4bU, 0 xababababU, 0 xa9a9a9a9U,
0 x67676767U, 0 x0a0a0a0aU, 0 x47474747U, 0 xf2f2f2f2U,
0 xb5b5b5b5U, 0 x22222222U, 0 xe5e5e5e5U, 0 xeeeeeeeeU,
0 xbebebebeU, 0 x2b2b2b2bU, 0 x81818181U, 0 x12121212U,
0 x83838383U, 0 x1b1b1b1bU, 0 x0e0e0e0eU, 0 x23232323U,
0 xf5f5f5f5U, 0 x45454545U, 0 x21212121U, 0 xcecececeU,
0 x49494949U, 0 x2c2c2c2cU, 0 xf9f9f9f9U, 0 xe6e6e6e6U,
0 xb6b6b6b6U, 0 x28282828U, 0 x17171717U, 0 x82828282U,
0 x1a1a1a1aU, 0 x8b8b8b8bU, 0 xfefefefeU, 0 x8a8a8a8aU,
0 x09090909U, 0 xc9c9c9c9U, 0 x87878787U, 0 x4e4e4e4eU,
0 xe1e1e1e1U, 0 x2e2e2e2eU, 0 xe4e4e4e4U, 0 xe0e0e0e0U,
0 xebebebebU, 0 x90909090U, 0 xa4a4a4a4U, 0 x1e1e1e1eU,
0 x85858585U, 0 x60606060U, 0 x00000000U, 0 x25252525U,
0 xf4f4f4f4U, 0 xf1f1f1f1U, 0 x94949494U, 0 x0b0b0b0bU,
0 xe7e7e7e7U, 0 x75757575U, 0 xefefefefU, 0 x34343434U,
0 x31313131U, 0 xd4d4d4d4U, 0 xd0d0d0d0U, 0 x86868686U,
0 x7e7e7e7eU, 0 xadadadadU, 0 xfdfdfdfdU, 0 x29292929U,
0 x30303030U, 0 x3b3b3b3bU, 0 x9f9f9f9fU, 0 xf8f8f8f8U,
0 xc6c6c6c6U, 0 x13131313U, 0 x06060606U, 0 x05050505U,
0 xc5c5c5c5U, 0 x11111111U, 0 x77777777U, 0 x7c7c7c7cU,
0 x7a7a7a7aU, 0 x78787878U, 0 x36363636U, 0 x1c1c1c1cU,
0 x39393939U, 0 x59595959U, 0 x18181818U, 0 x56565656U,
0 xb3b3b3b3U, 0 xb0b0b0b0U, 0 x24242424U, 0 x20202020U,
0 xb2b2b2b2U, 0 x92929292U, 0 xa3a3a3a3U, 0 xc0c0c0c0U,
0 x44444444U, 0 x62626262U, 0 x10101010U, 0 xb4b4b4b4U,
0 x84848484U, 0 x43434343U, 0 x93939393U, 0 xc2c2c2c2U,
0 x4a4a4a4aU, 0 xbdbdbdbdU, 0 x8f8f8f8fU, 0 x2d2d2d2dU,
0 xbcbcbcbcU, 0 x9c9c9c9cU, 0 x6a6a6a6aU, 0 x40404040U,
0 xcfcfcfcfU, 0 xa2a2a2a2U, 0 x80808080U, 0 x4f4f4f4fU,
0 x1f1f1f1fU, 0 xcacacacaU, 0 xaaaaaaaaU, 0 x42424242U,
};
static const u32 T5[256 ] = {
0 x00000000U, 0 x01020608U, 0 x02040c10U, 0 x03060a18U,
0 x04081820U, 0 x050a1e28U, 0 x060c1430U, 0 x070e1238U,
0 x08103040U, 0 x09123648U, 0 x0a143c50U, 0 x0b163a58U,
0 x0c182860U, 0 x0d1a2e68U, 0 x0e1c2470U, 0 x0f1e2278U,
0 x10206080U, 0 x11226688U, 0 x12246c90U, 0 x13266a98U,
0 x142878a0U, 0 x152a7ea8U, 0 x162c74b0U, 0 x172e72b8U,
0 x183050c0U, 0 x193256c8U, 0 x1a345cd0U, 0 x1b365ad8U,
0 x1c3848e0U, 0 x1d3a4ee8U, 0 x1e3c44f0U, 0 x1f3e42f8U,
0 x2040c01dU, 0 x2142c615U, 0 x2244cc0dU, 0 x2346ca05U,
0 x2448d83dU, 0 x254ade35U, 0 x264cd42dU, 0 x274ed225U,
0 x2850f05dU, 0 x2952f655U, 0 x2a54fc4dU, 0 x2b56fa45U,
0 x2c58e87dU, 0 x2d5aee75U, 0 x2e5ce46dU, 0 x2f5ee265U,
0 x3060a09dU, 0 x3162a695U, 0 x3264ac8dU, 0 x3366aa85U,
0 x3468b8bdU, 0 x356abeb5U, 0 x366cb4adU, 0 x376eb2a5U,
0 x387090ddU, 0 x397296d5U, 0 x3a749ccdU, 0 x3b769ac5U,
0 x3c7888fdU, 0 x3d7a8ef5U, 0 x3e7c84edU, 0 x3f7e82e5U,
0 x40809d3aU, 0 x41829b32U, 0 x4284912aU, 0 x43869722U,
0 x4488851aU, 0 x458a8312U, 0 x468c890aU, 0 x478e8f02U,
0 x4890ad7aU, 0 x4992ab72U, 0 x4a94a16aU, 0 x4b96a762U,
0 x4c98b55aU, 0 x4d9ab352U, 0 x4e9cb94aU, 0 x4f9ebf42U,
0 x50a0fdbaU, 0 x51a2fbb2U, 0 x52a4f1aaU, 0 x53a6f7a2U,
0 x54a8e59aU, 0 x55aae392U, 0 x56ace98aU, 0 x57aeef82U,
0 x58b0cdfaU, 0 x59b2cbf2U, 0 x5ab4c1eaU, 0 x5bb6c7e2U,
0 x5cb8d5daU, 0 x5dbad3d2U, 0 x5ebcd9caU, 0 x5fbedfc2U,
0 x60c05d27U, 0 x61c25b2fU, 0 x62c45137U, 0 x63c6573fU,
0 x64c84507U, 0 x65ca430fU, 0 x66cc4917U, 0 x67ce4f1fU,
0 x68d06d67U, 0 x69d26b6fU, 0 x6ad46177U, 0 x6bd6677fU,
0 x6cd87547U, 0 x6dda734fU, 0 x6edc7957U, 0 x6fde7f5fU,
0 x70e03da7U, 0 x71e23bafU, 0 x72e431b7U, 0 x73e637bfU,
0 x74e82587U, 0 x75ea238fU, 0 x76ec2997U, 0 x77ee2f9fU,
0 x78f00de7U, 0 x79f20befU, 0 x7af401f7U, 0 x7bf607ffU,
0 x7cf815c7U, 0 x7dfa13cfU, 0 x7efc19d7U, 0 x7ffe1fdfU,
0 x801d2774U, 0 x811f217cU, 0 x82192b64U, 0 x831b2d6cU,
0 x84153f54U, 0 x8517395cU, 0 x86113344U, 0 x8713354cU,
0 x880d1734U, 0 x890f113cU, 0 x8a091b24U, 0 x8b0b1d2cU,
0 x8c050f14U, 0 x8d07091cU, 0 x8e010304U, 0 x8f03050cU,
0 x903d47f4U, 0 x913f41fcU, 0 x92394be4U, 0 x933b4decU,
0 x94355fd4U, 0 x953759dcU, 0 x963153c4U, 0 x973355ccU,
0 x982d77b4U, 0 x992f71bcU, 0 x9a297ba4U, 0 x9b2b7dacU,
0 x9c256f94U, 0 x9d27699cU, 0 x9e216384U, 0 x9f23658cU,
0 xa05de769U, 0 xa15fe161U, 0 xa259eb79U, 0 xa35bed71U,
0 xa455ff49U, 0 xa557f941U, 0 xa651f359U, 0 xa753f551U,
0 xa84dd729U, 0 xa94fd121U, 0 xaa49db39U, 0 xab4bdd31U,
0 xac45cf09U, 0 xad47c901U, 0 xae41c319U, 0 xaf43c511U,
0 xb07d87e9U, 0 xb17f81e1U, 0 xb2798bf9U, 0 xb37b8df1U,
0 xb4759fc9U, 0 xb57799c1U, 0 xb67193d9U, 0 xb77395d1U,
0 xb86db7a9U, 0 xb96fb1a1U, 0 xba69bbb9U, 0 xbb6bbdb1U,
0 xbc65af89U, 0 xbd67a981U, 0 xbe61a399U, 0 xbf63a591U,
0 xc09dba4eU, 0 xc19fbc46U, 0 xc299b65eU, 0 xc39bb056U,
0 xc495a26eU, 0 xc597a466U, 0 xc691ae7eU, 0 xc793a876U,
0 xc88d8a0eU, 0 xc98f8c06U, 0 xca89861eU, 0 xcb8b8016U,
0 xcc85922eU, 0 xcd879426U, 0 xce819e3eU, 0 xcf839836U,
0 xd0bddaceU, 0 xd1bfdcc6U, 0 xd2b9d6deU, 0 xd3bbd0d6U,
0 xd4b5c2eeU, 0 xd5b7c4e6U, 0 xd6b1cefeU, 0 xd7b3c8f6U,
0 xd8adea8eU, 0 xd9afec86U, 0 xdaa9e69eU, 0 xdbabe096U,
0 xdca5f2aeU, 0 xdda7f4a6U, 0 xdea1febeU, 0 xdfa3f8b6U,
0 xe0dd7a53U, 0 xe1df7c5bU, 0 xe2d97643U, 0 xe3db704bU,
0 xe4d56273U, 0 xe5d7647bU, 0 xe6d16e63U, 0 xe7d3686bU,
0 xe8cd4a13U, 0 xe9cf4c1bU, 0 xeac94603U, 0 xebcb400bU,
0 xecc55233U, 0 xedc7543bU, 0 xeec15e23U, 0 xefc3582bU,
0 xf0fd1ad3U, 0 xf1ff1cdbU, 0 xf2f916c3U, 0 xf3fb10cbU,
0 xf4f502f3U, 0 xf5f704fbU, 0 xf6f10ee3U, 0 xf7f308ebU,
0 xf8ed2a93U, 0 xf9ef2c9bU, 0 xfae92683U, 0 xfbeb208bU,
0 xfce532b3U, 0 xfde734bbU, 0 xfee13ea3U, 0 xffe338abU,
};
static const u32 rc[] = {
0 xba542f74U, 0 x53d3d24dU, 0 x50ac8dbfU, 0 x70529a4cU,
0 xead597d1U, 0 x33515ba6U, 0 xde48a899U, 0 xdb32b7fcU,
0 xe39e919bU, 0 xe2bb416eU, 0 xa5cb6b95U, 0 xa1f3b102U,
0 xccc41d14U, 0 xc363da5dU, 0 x5fdc7dcdU, 0 x7f5a6c5cU,
0 xf726ffedU, 0 xe89d6f8eU, 0 x19a0f089U,
};
static int anubis_setkey(struct crypto_tfm *tfm, const u8 *in_key,
unsigned int key_len)
{
struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
int N, R, i, r;
u32 kappa[ANUBIS_MAX_N];
u32 inter[ANUBIS_MAX_N];
switch (key_len) {
case 16 : case 20 : case 24 : case 28 :
case 32 : case 36 : case 40 :
break ;
default :
return -EINVAL;
}
ctx->key_len = key_len * 8 ;
N = ctx->key_len >> 5 ;
ctx->R = R = 8 + N;
/* * map cipher key to initial key state (mu): */
for (i = 0 ; i < N; i++)
kappa[i] = get_unaligned_be32(&in_key[4 * i]);
/*
* generate R + 1 round keys:
*/
for (r = 0 ; r <= R; r++) {
u32 K0, K1, K2, K3;
/*
* generate r-th round key K^r:
*/
K0 = T4[(kappa[N - 1 ] >> 24 ) ];
K1 = T4[(kappa[N - 1 ] >> 16 ) & 0 xff];
K2 = T4[(kappa[N - 1 ] >> 8 ) & 0 xff];
K3 = T4[(kappa[N - 1 ] ) & 0 xff];
for (i = N - 2 ; i >= 0 ; i--) {
K0 = T4[(kappa[i] >> 24 ) ] ^
(T5[(K0 >> 24 ) ] & 0 xff000000U) ^
(T5[(K0 >> 16 ) & 0 xff] & 0 x00ff0000U) ^
(T5[(K0 >> 8 ) & 0 xff] & 0 x0000ff00U) ^
(T5[(K0 ) & 0 xff] & 0 x000000ffU);
K1 = T4[(kappa[i] >> 16 ) & 0 xff] ^
(T5[(K1 >> 24 ) ] & 0 xff000000U) ^
(T5[(K1 >> 16 ) & 0 xff] & 0 x00ff0000U) ^
(T5[(K1 >> 8 ) & 0 xff] & 0 x0000ff00U) ^
(T5[(K1 ) & 0 xff] & 0 x000000ffU);
K2 = T4[(kappa[i] >> 8 ) & 0 xff] ^
(T5[(K2 >> 24 ) ] & 0 xff000000U) ^
(T5[(K2 >> 16 ) & 0 xff] & 0 x00ff0000U) ^
(T5[(K2 >> 8 ) & 0 xff] & 0 x0000ff00U) ^
(T5[(K2 ) & 0 xff] & 0 x000000ffU);
K3 = T4[(kappa[i] ) & 0 xff] ^
(T5[(K3 >> 24 ) ] & 0 xff000000U) ^
(T5[(K3 >> 16 ) & 0 xff] & 0 x00ff0000U) ^
(T5[(K3 >> 8 ) & 0 xff] & 0 x0000ff00U) ^
(T5[(K3 ) & 0 xff] & 0 x000000ffU);
}
ctx->E[r][0 ] = K0;
ctx->E[r][1 ] = K1;
ctx->E[r][2 ] = K2;
ctx->E[r][3 ] = K3;
/*
* compute kappa^{r+1} from kappa^r:
*/
if (r == R)
break ;
for (i = 0 ; i < N; i++) {
int j = i;
inter[i] = T0[(kappa[j--] >> 24 ) ];
if (j < 0 )
j = N - 1 ;
inter[i] ^= T1[(kappa[j--] >> 16 ) & 0 xff];
if (j < 0 )
j = N - 1 ;
inter[i] ^= T2[(kappa[j--] >> 8 ) & 0 xff];
if (j < 0 )
j = N - 1 ;
inter[i] ^= T3[(kappa[j ] ) & 0 xff];
}
kappa[0 ] = inter[0 ] ^ rc[r];
for (i = 1 ; i < N; i++)
kappa[i] = inter[i];
}
/*
* generate inverse key schedule: K'^0 = K^R, K'^R =
* K^0, K'^r = theta(K^{R-r}):
*/
for (i = 0 ; i < 4 ; i++) {
ctx->D[0 ][i] = ctx->E[R][i];
ctx->D[R][i] = ctx->E[0 ][i];
}
for (r = 1 ; r < R; r++) {
for (i = 0 ; i < 4 ; i++) {
u32 v = ctx->E[R - r][i];
ctx->D[r][i] =
T0[T4[(v >> 24 ) ] & 0 xff] ^
T1[T4[(v >> 16 ) & 0 xff] & 0 xff] ^
T2[T4[(v >> 8 ) & 0 xff] & 0 xff] ^
T3[T4[(v ) & 0 xff] & 0 xff];
}
}
return 0 ;
}
static void anubis_crypt(u32 roundKey[ANUBIS_MAX_ROUNDS + 1 ][4 ],
u8 *dst, const u8 *src, const int R)
{
int i, r;
u32 state[4 ];
u32 inter[4 ];
/*
* map plaintext block to cipher state (mu)
* and add initial round key (sigma[K^0]):
*/
for (i = 0 ; i < 4 ; i++)
state[i] = get_unaligned_be32(&src[4 * i]) ^ roundKey[0 ][i];
/*
* R - 1 full rounds:
*/
for (r = 1 ; r < R; r++) {
inter[0 ] =
T0[(state[0 ] >> 24 ) ] ^
T1[(state[1 ] >> 24 ) ] ^
T2[(state[2 ] >> 24 ) ] ^
T3[(state[3 ] >> 24 ) ] ^
roundKey[r][0 ];
inter[1 ] =
T0[(state[0 ] >> 16 ) & 0 xff] ^
T1[(state[1 ] >> 16 ) & 0 xff] ^
T2[(state[2 ] >> 16 ) & 0 xff] ^
T3[(state[3 ] >> 16 ) & 0 xff] ^
roundKey[r][1 ];
inter[2 ] =
T0[(state[0 ] >> 8 ) & 0 xff] ^
T1[(state[1 ] >> 8 ) & 0 xff] ^
T2[(state[2 ] >> 8 ) & 0 xff] ^
T3[(state[3 ] >> 8 ) & 0 xff] ^
roundKey[r][2 ];
inter[3 ] =
T0[(state[0 ] ) & 0 xff] ^
T1[(state[1 ] ) & 0 xff] ^
T2[(state[2 ] ) & 0 xff] ^
T3[(state[3 ] ) & 0 xff] ^
roundKey[r][3 ];
state[0 ] = inter[0 ];
state[1 ] = inter[1 ];
state[2 ] = inter[2 ];
state[3 ] = inter[3 ];
}
/*
* last round:
*/
inter[0 ] =
(T0[(state[0 ] >> 24 ) ] & 0 xff000000U) ^
(T1[(state[1 ] >> 24 ) ] & 0 x00ff0000U) ^
(T2[(state[2 ] >> 24 ) ] & 0 x0000ff00U) ^
(T3[(state[3 ] >> 24 ) ] & 0 x000000ffU) ^
roundKey[R][0 ];
inter[1 ] =
(T0[(state[0 ] >> 16 ) & 0 xff] & 0 xff000000U) ^
(T1[(state[1 ] >> 16 ) & 0 xff] & 0 x00ff0000U) ^
(T2[(state[2 ] >> 16 ) & 0 xff] & 0 x0000ff00U) ^
(T3[(state[3 ] >> 16 ) & 0 xff] & 0 x000000ffU) ^
roundKey[R][1 ];
inter[2 ] =
(T0[(state[0 ] >> 8 ) & 0 xff] & 0 xff000000U) ^
(T1[(state[1 ] >> 8 ) & 0 xff] & 0 x00ff0000U) ^
(T2[(state[2 ] >> 8 ) & 0 xff] & 0 x0000ff00U) ^
(T3[(state[3 ] >> 8 ) & 0 xff] & 0 x000000ffU) ^
roundKey[R][2 ];
inter[3 ] =
(T0[(state[0 ] ) & 0 xff] & 0 xff000000U) ^
(T1[(state[1 ] ) & 0 xff] & 0 x00ff0000U) ^
(T2[(state[2 ] ) & 0 xff] & 0 x0000ff00U) ^
(T3[(state[3 ] ) & 0 xff] & 0 x000000ffU) ^
roundKey[R][3 ];
/*
* map cipher state to ciphertext block (mu^{-1}):
*/
for (i = 0 ; i < 4 ; i++)
put_unaligned_be32(inter[i], &dst[4 * i]);
}
static void anubis_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
{
struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
anubis_crypt(ctx->E, dst, src, ctx->R);
}
static void anubis_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
{
struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
anubis_crypt(ctx->D, dst, src, ctx->R);
}
static struct crypto_alg anubis_alg = {
.cra_name = "anubis" ,
.cra_driver_name = "anubis-generic" ,
.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
.cra_blocksize = ANUBIS_BLOCK_SIZE,
.cra_ctxsize = sizeof (struct anubis_ctx),
.cra_module = THIS_MODULE,
.cra_u = { .cipher = {
.cia_min_keysize = ANUBIS_MIN_KEY_SIZE,
.cia_max_keysize = ANUBIS_MAX_KEY_SIZE,
.cia_setkey = anubis_setkey,
.cia_encrypt = anubis_encrypt,
.cia_decrypt = anubis_decrypt } }
};
static int __init anubis_mod_init(void )
{
int ret = 0 ;
ret = crypto_register_alg(&anubis_alg);
return ret;
}
static void __exit anubis_mod_fini(void )
{
crypto_unregister_alg(&anubis_alg);
}
module_init(anubis_mod_init);
module_exit(anubis_mod_fini);
MODULE_LICENSE("GPL" );
MODULE_DESCRIPTION("Anubis Cryptographic Algorithm" );
MODULE_ALIAS_CRYPTO("anubis" );
Messung V0.5 in Prozent C=96 H=91 G=93
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-06-08)
¤
*© Formatika GbR, Deutschland