linux/crypto/camellia.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2006
   3 * NTT (Nippon Telegraph and Telephone Corporation).
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License
   7 * as published by the Free Software Foundation; either version 2
   8 * of the License, or (at your option) any later version.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write to the Free Software
  17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18 */
  19
  20/*
  21 * Algorithm Specification
  22 *  http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
  23 */
  24
  25/*
  26 *
  27 * NOTE --- NOTE --- NOTE --- NOTE
  28 * This implementation assumes that all memory addresses passed
  29 * as parameters are four-byte aligned.
  30 *
  31 */
  32
  33#include <linux/crypto.h>
  34#include <linux/errno.h>
  35#include <linux/init.h>
  36#include <linux/kernel.h>
  37#include <linux/module.h>
  38#include <linux/bitops.h>
  39#include <asm/unaligned.h>
  40
  41static const u32 camellia_sp1110[256] = {
  42        0x70707000,0x82828200,0x2c2c2c00,0xececec00,
  43        0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500,
  44        0xe4e4e400,0x85858500,0x57575700,0x35353500,
  45        0xeaeaea00,0x0c0c0c00,0xaeaeae00,0x41414100,
  46        0x23232300,0xefefef00,0x6b6b6b00,0x93939300,
  47        0x45454500,0x19191900,0xa5a5a500,0x21212100,
  48        0xededed00,0x0e0e0e00,0x4f4f4f00,0x4e4e4e00,
  49        0x1d1d1d00,0x65656500,0x92929200,0xbdbdbd00,
  50        0x86868600,0xb8b8b800,0xafafaf00,0x8f8f8f00,
  51        0x7c7c7c00,0xebebeb00,0x1f1f1f00,0xcecece00,
  52        0x3e3e3e00,0x30303000,0xdcdcdc00,0x5f5f5f00,
  53        0x5e5e5e00,0xc5c5c500,0x0b0b0b00,0x1a1a1a00,
  54        0xa6a6a600,0xe1e1e100,0x39393900,0xcacaca00,
  55        0xd5d5d500,0x47474700,0x5d5d5d00,0x3d3d3d00,
  56        0xd9d9d900,0x01010100,0x5a5a5a00,0xd6d6d600,
  57        0x51515100,0x56565600,0x6c6c6c00,0x4d4d4d00,
  58        0x8b8b8b00,0x0d0d0d00,0x9a9a9a00,0x66666600,
  59        0xfbfbfb00,0xcccccc00,0xb0b0b000,0x2d2d2d00,
  60        0x74747400,0x12121200,0x2b2b2b00,0x20202000,
  61        0xf0f0f000,0xb1b1b100,0x84848400,0x99999900,
  62        0xdfdfdf00,0x4c4c4c00,0xcbcbcb00,0xc2c2c200,
  63        0x34343400,0x7e7e7e00,0x76767600,0x05050500,
  64        0x6d6d6d00,0xb7b7b700,0xa9a9a900,0x31313100,
  65        0xd1d1d100,0x17171700,0x04040400,0xd7d7d700,
  66        0x14141400,0x58585800,0x3a3a3a00,0x61616100,
  67        0xdedede00,0x1b1b1b00,0x11111100,0x1c1c1c00,
  68        0x32323200,0x0f0f0f00,0x9c9c9c00,0x16161600,
  69        0x53535300,0x18181800,0xf2f2f200,0x22222200,
  70        0xfefefe00,0x44444400,0xcfcfcf00,0xb2b2b200,
  71        0xc3c3c300,0xb5b5b500,0x7a7a7a00,0x91919100,
  72        0x24242400,0x08080800,0xe8e8e800,0xa8a8a800,
  73        0x60606000,0xfcfcfc00,0x69696900,0x50505000,
  74        0xaaaaaa00,0xd0d0d000,0xa0a0a000,0x7d7d7d00,
  75        0xa1a1a100,0x89898900,0x62626200,0x97979700,
  76        0x54545400,0x5b5b5b00,0x1e1e1e00,0x95959500,
  77        0xe0e0e000,0xffffff00,0x64646400,0xd2d2d200,
  78        0x10101000,0xc4c4c400,0x00000000,0x48484800,
  79        0xa3a3a300,0xf7f7f700,0x75757500,0xdbdbdb00,
  80        0x8a8a8a00,0x03030300,0xe6e6e600,0xdadada00,
  81        0x09090900,0x3f3f3f00,0xdddddd00,0x94949400,
  82        0x87878700,0x5c5c5c00,0x83838300,0x02020200,
  83        0xcdcdcd00,0x4a4a4a00,0x90909000,0x33333300,
  84        0x73737300,0x67676700,0xf6f6f600,0xf3f3f300,
  85        0x9d9d9d00,0x7f7f7f00,0xbfbfbf00,0xe2e2e200,
  86        0x52525200,0x9b9b9b00,0xd8d8d800,0x26262600,
  87        0xc8c8c800,0x37373700,0xc6c6c600,0x3b3b3b00,
  88        0x81818100,0x96969600,0x6f6f6f00,0x4b4b4b00,
  89        0x13131300,0xbebebe00,0x63636300,0x2e2e2e00,
  90        0xe9e9e900,0x79797900,0xa7a7a700,0x8c8c8c00,
  91        0x9f9f9f00,0x6e6e6e00,0xbcbcbc00,0x8e8e8e00,
  92        0x29292900,0xf5f5f500,0xf9f9f900,0xb6b6b600,
  93        0x2f2f2f00,0xfdfdfd00,0xb4b4b400,0x59595900,
  94        0x78787800,0x98989800,0x06060600,0x6a6a6a00,
  95        0xe7e7e700,0x46464600,0x71717100,0xbababa00,
  96        0xd4d4d400,0x25252500,0xababab00,0x42424200,
  97        0x88888800,0xa2a2a200,0x8d8d8d00,0xfafafa00,
  98        0x72727200,0x07070700,0xb9b9b900,0x55555500,
  99        0xf8f8f800,0xeeeeee00,0xacacac00,0x0a0a0a00,
 100        0x36363600,0x49494900,0x2a2a2a00,0x68686800,
 101        0x3c3c3c00,0x38383800,0xf1f1f100,0xa4a4a400,
 102        0x40404000,0x28282800,0xd3d3d300,0x7b7b7b00,
 103        0xbbbbbb00,0xc9c9c900,0x43434300,0xc1c1c100,
 104        0x15151500,0xe3e3e300,0xadadad00,0xf4f4f400,
 105        0x77777700,0xc7c7c700,0x80808000,0x9e9e9e00,
 106};
 107
 108static const u32 camellia_sp0222[256] = {
 109        0x00e0e0e0,0x00050505,0x00585858,0x00d9d9d9,
 110        0x00676767,0x004e4e4e,0x00818181,0x00cbcbcb,
 111        0x00c9c9c9,0x000b0b0b,0x00aeaeae,0x006a6a6a,
 112        0x00d5d5d5,0x00181818,0x005d5d5d,0x00828282,
 113        0x00464646,0x00dfdfdf,0x00d6d6d6,0x00272727,
 114        0x008a8a8a,0x00323232,0x004b4b4b,0x00424242,
 115        0x00dbdbdb,0x001c1c1c,0x009e9e9e,0x009c9c9c,
 116        0x003a3a3a,0x00cacaca,0x00252525,0x007b7b7b,
 117        0x000d0d0d,0x00717171,0x005f5f5f,0x001f1f1f,
 118        0x00f8f8f8,0x00d7d7d7,0x003e3e3e,0x009d9d9d,
 119        0x007c7c7c,0x00606060,0x00b9b9b9,0x00bebebe,
 120        0x00bcbcbc,0x008b8b8b,0x00161616,0x00343434,
 121        0x004d4d4d,0x00c3c3c3,0x00727272,0x00959595,
 122        0x00ababab,0x008e8e8e,0x00bababa,0x007a7a7a,
 123        0x00b3b3b3,0x00020202,0x00b4b4b4,0x00adadad,
 124        0x00a2a2a2,0x00acacac,0x00d8d8d8,0x009a9a9a,
 125        0x00171717,0x001a1a1a,0x00353535,0x00cccccc,
 126        0x00f7f7f7,0x00999999,0x00616161,0x005a5a5a,
 127        0x00e8e8e8,0x00242424,0x00565656,0x00404040,
 128        0x00e1e1e1,0x00636363,0x00090909,0x00333333,
 129        0x00bfbfbf,0x00989898,0x00979797,0x00858585,
 130        0x00686868,0x00fcfcfc,0x00ececec,0x000a0a0a,
 131        0x00dadada,0x006f6f6f,0x00535353,0x00626262,
 132        0x00a3a3a3,0x002e2e2e,0x00080808,0x00afafaf,
 133        0x00282828,0x00b0b0b0,0x00747474,0x00c2c2c2,
 134        0x00bdbdbd,0x00363636,0x00222222,0x00383838,
 135        0x00646464,0x001e1e1e,0x00393939,0x002c2c2c,
 136        0x00a6a6a6,0x00303030,0x00e5e5e5,0x00444444,
 137        0x00fdfdfd,0x00888888,0x009f9f9f,0x00656565,
 138        0x00878787,0x006b6b6b,0x00f4f4f4,0x00232323,
 139        0x00484848,0x00101010,0x00d1d1d1,0x00515151,
 140        0x00c0c0c0,0x00f9f9f9,0x00d2d2d2,0x00a0a0a0,
 141        0x00555555,0x00a1a1a1,0x00414141,0x00fafafa,
 142        0x00434343,0x00131313,0x00c4c4c4,0x002f2f2f,
 143        0x00a8a8a8,0x00b6b6b6,0x003c3c3c,0x002b2b2b,
 144        0x00c1c1c1,0x00ffffff,0x00c8c8c8,0x00a5a5a5,
 145        0x00202020,0x00898989,0x00000000,0x00909090,
 146        0x00474747,0x00efefef,0x00eaeaea,0x00b7b7b7,
 147        0x00151515,0x00060606,0x00cdcdcd,0x00b5b5b5,
 148        0x00121212,0x007e7e7e,0x00bbbbbb,0x00292929,
 149        0x000f0f0f,0x00b8b8b8,0x00070707,0x00040404,
 150        0x009b9b9b,0x00949494,0x00212121,0x00666666,
 151        0x00e6e6e6,0x00cecece,0x00ededed,0x00e7e7e7,
 152        0x003b3b3b,0x00fefefe,0x007f7f7f,0x00c5c5c5,
 153        0x00a4a4a4,0x00373737,0x00b1b1b1,0x004c4c4c,
 154        0x00919191,0x006e6e6e,0x008d8d8d,0x00767676,
 155        0x00030303,0x002d2d2d,0x00dedede,0x00969696,
 156        0x00262626,0x007d7d7d,0x00c6c6c6,0x005c5c5c,
 157        0x00d3d3d3,0x00f2f2f2,0x004f4f4f,0x00191919,
 158        0x003f3f3f,0x00dcdcdc,0x00797979,0x001d1d1d,
 159        0x00525252,0x00ebebeb,0x00f3f3f3,0x006d6d6d,
 160        0x005e5e5e,0x00fbfbfb,0x00696969,0x00b2b2b2,
 161        0x00f0f0f0,0x00313131,0x000c0c0c,0x00d4d4d4,
 162        0x00cfcfcf,0x008c8c8c,0x00e2e2e2,0x00757575,
 163        0x00a9a9a9,0x004a4a4a,0x00575757,0x00848484,
 164        0x00111111,0x00454545,0x001b1b1b,0x00f5f5f5,
 165        0x00e4e4e4,0x000e0e0e,0x00737373,0x00aaaaaa,
 166        0x00f1f1f1,0x00dddddd,0x00595959,0x00141414,
 167        0x006c6c6c,0x00929292,0x00545454,0x00d0d0d0,
 168        0x00787878,0x00707070,0x00e3e3e3,0x00494949,
 169        0x00808080,0x00505050,0x00a7a7a7,0x00f6f6f6,
 170        0x00777777,0x00939393,0x00868686,0x00838383,
 171        0x002a2a2a,0x00c7c7c7,0x005b5b5b,0x00e9e9e9,
 172        0x00eeeeee,0x008f8f8f,0x00010101,0x003d3d3d,
 173};
 174
 175static const u32 camellia_sp3033[256] = {
 176        0x38003838,0x41004141,0x16001616,0x76007676,
 177        0xd900d9d9,0x93009393,0x60006060,0xf200f2f2,
 178        0x72007272,0xc200c2c2,0xab00abab,0x9a009a9a,
 179        0x75007575,0x06000606,0x57005757,0xa000a0a0,
 180        0x91009191,0xf700f7f7,0xb500b5b5,0xc900c9c9,
 181        0xa200a2a2,0x8c008c8c,0xd200d2d2,0x90009090,
 182        0xf600f6f6,0x07000707,0xa700a7a7,0x27002727,
 183        0x8e008e8e,0xb200b2b2,0x49004949,0xde00dede,
 184        0x43004343,0x5c005c5c,0xd700d7d7,0xc700c7c7,
 185        0x3e003e3e,0xf500f5f5,0x8f008f8f,0x67006767,
 186        0x1f001f1f,0x18001818,0x6e006e6e,0xaf00afaf,
 187        0x2f002f2f,0xe200e2e2,0x85008585,0x0d000d0d,
 188        0x53005353,0xf000f0f0,0x9c009c9c,0x65006565,
 189        0xea00eaea,0xa300a3a3,0xae00aeae,0x9e009e9e,
 190        0xec00ecec,0x80008080,0x2d002d2d,0x6b006b6b,
 191        0xa800a8a8,0x2b002b2b,0x36003636,0xa600a6a6,
 192        0xc500c5c5,0x86008686,0x4d004d4d,0x33003333,
 193        0xfd00fdfd,0x66006666,0x58005858,0x96009696,
 194        0x3a003a3a,0x09000909,0x95009595,0x10001010,
 195        0x78007878,0xd800d8d8,0x42004242,0xcc00cccc,
 196        0xef00efef,0x26002626,0xe500e5e5,0x61006161,
 197        0x1a001a1a,0x3f003f3f,0x3b003b3b,0x82008282,
 198        0xb600b6b6,0xdb00dbdb,0xd400d4d4,0x98009898,
 199        0xe800e8e8,0x8b008b8b,0x02000202,0xeb00ebeb,
 200        0x0a000a0a,0x2c002c2c,0x1d001d1d,0xb000b0b0,
 201        0x6f006f6f,0x8d008d8d,0x88008888,0x0e000e0e,
 202        0x19001919,0x87008787,0x4e004e4e,0x0b000b0b,
 203        0xa900a9a9,0x0c000c0c,0x79007979,0x11001111,
 204        0x7f007f7f,0x22002222,0xe700e7e7,0x59005959,
 205        0xe100e1e1,0xda00dada,0x3d003d3d,0xc800c8c8,
 206        0x12001212,0x04000404,0x74007474,0x54005454,
 207        0x30003030,0x7e007e7e,0xb400b4b4,0x28002828,
 208        0x55005555,0x68006868,0x50005050,0xbe00bebe,
 209        0xd000d0d0,0xc400c4c4,0x31003131,0xcb00cbcb,
 210        0x2a002a2a,0xad00adad,0x0f000f0f,0xca00caca,
 211        0x70007070,0xff00ffff,0x32003232,0x69006969,
 212        0x08000808,0x62006262,0x00000000,0x24002424,
 213        0xd100d1d1,0xfb00fbfb,0xba00baba,0xed00eded,
 214        0x45004545,0x81008181,0x73007373,0x6d006d6d,
 215        0x84008484,0x9f009f9f,0xee00eeee,0x4a004a4a,
 216        0xc300c3c3,0x2e002e2e,0xc100c1c1,0x01000101,
 217        0xe600e6e6,0x25002525,0x48004848,0x99009999,
 218        0xb900b9b9,0xb300b3b3,0x7b007b7b,0xf900f9f9,
 219        0xce00cece,0xbf00bfbf,0xdf00dfdf,0x71007171,
 220        0x29002929,0xcd00cdcd,0x6c006c6c,0x13001313,
 221        0x64006464,0x9b009b9b,0x63006363,0x9d009d9d,
 222        0xc000c0c0,0x4b004b4b,0xb700b7b7,0xa500a5a5,
 223        0x89008989,0x5f005f5f,0xb100b1b1,0x17001717,
 224        0xf400f4f4,0xbc00bcbc,0xd300d3d3,0x46004646,
 225        0xcf00cfcf,0x37003737,0x5e005e5e,0x47004747,
 226        0x94009494,0xfa00fafa,0xfc00fcfc,0x5b005b5b,
 227        0x97009797,0xfe00fefe,0x5a005a5a,0xac00acac,
 228        0x3c003c3c,0x4c004c4c,0x03000303,0x35003535,
 229        0xf300f3f3,0x23002323,0xb800b8b8,0x5d005d5d,
 230        0x6a006a6a,0x92009292,0xd500d5d5,0x21002121,
 231        0x44004444,0x51005151,0xc600c6c6,0x7d007d7d,
 232        0x39003939,0x83008383,0xdc00dcdc,0xaa00aaaa,
 233        0x7c007c7c,0x77007777,0x56005656,0x05000505,
 234        0x1b001b1b,0xa400a4a4,0x15001515,0x34003434,
 235        0x1e001e1e,0x1c001c1c,0xf800f8f8,0x52005252,
 236        0x20002020,0x14001414,0xe900e9e9,0xbd00bdbd,
 237        0xdd00dddd,0xe400e4e4,0xa100a1a1,0xe000e0e0,
 238        0x8a008a8a,0xf100f1f1,0xd600d6d6,0x7a007a7a,
 239        0xbb00bbbb,0xe300e3e3,0x40004040,0x4f004f4f,
 240};
 241
 242static const u32 camellia_sp4404[256] = {
 243        0x70700070,0x2c2c002c,0xb3b300b3,0xc0c000c0,
 244        0xe4e400e4,0x57570057,0xeaea00ea,0xaeae00ae,
 245        0x23230023,0x6b6b006b,0x45450045,0xa5a500a5,
 246        0xeded00ed,0x4f4f004f,0x1d1d001d,0x92920092,
 247        0x86860086,0xafaf00af,0x7c7c007c,0x1f1f001f,
 248        0x3e3e003e,0xdcdc00dc,0x5e5e005e,0x0b0b000b,
 249        0xa6a600a6,0x39390039,0xd5d500d5,0x5d5d005d,
 250        0xd9d900d9,0x5a5a005a,0x51510051,0x6c6c006c,
 251        0x8b8b008b,0x9a9a009a,0xfbfb00fb,0xb0b000b0,
 252        0x74740074,0x2b2b002b,0xf0f000f0,0x84840084,
 253        0xdfdf00df,0xcbcb00cb,0x34340034,0x76760076,
 254        0x6d6d006d,0xa9a900a9,0xd1d100d1,0x04040004,
 255        0x14140014,0x3a3a003a,0xdede00de,0x11110011,
 256        0x32320032,0x9c9c009c,0x53530053,0xf2f200f2,
 257        0xfefe00fe,0xcfcf00cf,0xc3c300c3,0x7a7a007a,
 258        0x24240024,0xe8e800e8,0x60600060,0x69690069,
 259        0xaaaa00aa,0xa0a000a0,0xa1a100a1,0x62620062,
 260        0x54540054,0x1e1e001e,0xe0e000e0,0x64640064,
 261        0x10100010,0x00000000,0xa3a300a3,0x75750075,
 262        0x8a8a008a,0xe6e600e6,0x09090009,0xdddd00dd,
 263        0x87870087,0x83830083,0xcdcd00cd,0x90900090,
 264        0x73730073,0xf6f600f6,0x9d9d009d,0xbfbf00bf,
 265        0x52520052,0xd8d800d8,0xc8c800c8,0xc6c600c6,
 266        0x81810081,0x6f6f006f,0x13130013,0x63630063,
 267        0xe9e900e9,0xa7a700a7,0x9f9f009f,0xbcbc00bc,
 268        0x29290029,0xf9f900f9,0x2f2f002f,0xb4b400b4,
 269        0x78780078,0x06060006,0xe7e700e7,0x71710071,
 270        0xd4d400d4,0xabab00ab,0x88880088,0x8d8d008d,
 271        0x72720072,0xb9b900b9,0xf8f800f8,0xacac00ac,
 272        0x36360036,0x2a2a002a,0x3c3c003c,0xf1f100f1,
 273        0x40400040,0xd3d300d3,0xbbbb00bb,0x43430043,
 274        0x15150015,0xadad00ad,0x77770077,0x80800080,
 275        0x82820082,0xecec00ec,0x27270027,0xe5e500e5,
 276        0x85850085,0x35350035,0x0c0c000c,0x41410041,
 277        0xefef00ef,0x93930093,0x19190019,0x21210021,
 278        0x0e0e000e,0x4e4e004e,0x65650065,0xbdbd00bd,
 279        0xb8b800b8,0x8f8f008f,0xebeb00eb,0xcece00ce,
 280        0x30300030,0x5f5f005f,0xc5c500c5,0x1a1a001a,
 281        0xe1e100e1,0xcaca00ca,0x47470047,0x3d3d003d,
 282        0x01010001,0xd6d600d6,0x56560056,0x4d4d004d,
 283        0x0d0d000d,0x66660066,0xcccc00cc,0x2d2d002d,
 284        0x12120012,0x20200020,0xb1b100b1,0x99990099,
 285        0x4c4c004c,0xc2c200c2,0x7e7e007e,0x05050005,
 286        0xb7b700b7,0x31310031,0x17170017,0xd7d700d7,
 287        0x58580058,0x61610061,0x1b1b001b,0x1c1c001c,
 288        0x0f0f000f,0x16160016,0x18180018,0x22220022,
 289        0x44440044,0xb2b200b2,0xb5b500b5,0x91910091,
 290        0x08080008,0xa8a800a8,0xfcfc00fc,0x50500050,
 291        0xd0d000d0,0x7d7d007d,0x89890089,0x97970097,
 292        0x5b5b005b,0x95950095,0xffff00ff,0xd2d200d2,
 293        0xc4c400c4,0x48480048,0xf7f700f7,0xdbdb00db,
 294        0x03030003,0xdada00da,0x3f3f003f,0x94940094,
 295        0x5c5c005c,0x02020002,0x4a4a004a,0x33330033,
 296        0x67670067,0xf3f300f3,0x7f7f007f,0xe2e200e2,
 297        0x9b9b009b,0x26260026,0x37370037,0x3b3b003b,
 298        0x96960096,0x4b4b004b,0xbebe00be,0x2e2e002e,
 299        0x79790079,0x8c8c008c,0x6e6e006e,0x8e8e008e,
 300        0xf5f500f5,0xb6b600b6,0xfdfd00fd,0x59590059,
 301        0x98980098,0x6a6a006a,0x46460046,0xbaba00ba,
 302        0x25250025,0x42420042,0xa2a200a2,0xfafa00fa,
 303        0x07070007,0x55550055,0xeeee00ee,0x0a0a000a,
 304        0x49490049,0x68680068,0x38380038,0xa4a400a4,
 305        0x28280028,0x7b7b007b,0xc9c900c9,0xc1c100c1,
 306        0xe3e300e3,0xf4f400f4,0xc7c700c7,0x9e9e009e,
 307};
 308
 309
 310#define CAMELLIA_MIN_KEY_SIZE        16
 311#define CAMELLIA_MAX_KEY_SIZE        32
 312#define CAMELLIA_BLOCK_SIZE          16
 313#define CAMELLIA_TABLE_BYTE_LEN     272
 314
 315/*
 316 * NB: L and R below stand for 'left' and 'right' as in written numbers.
 317 * That is, in (xxxL,xxxR) pair xxxL holds most significant digits,
 318 * _not_ least significant ones!
 319 */
 320
 321
 322/* key constants */
 323
 324#define CAMELLIA_SIGMA1L (0xA09E667FL)
 325#define CAMELLIA_SIGMA1R (0x3BCC908BL)
 326#define CAMELLIA_SIGMA2L (0xB67AE858L)
 327#define CAMELLIA_SIGMA2R (0x4CAA73B2L)
 328#define CAMELLIA_SIGMA3L (0xC6EF372FL)
 329#define CAMELLIA_SIGMA3R (0xE94F82BEL)
 330#define CAMELLIA_SIGMA4L (0x54FF53A5L)
 331#define CAMELLIA_SIGMA4R (0xF1D36F1CL)
 332#define CAMELLIA_SIGMA5L (0x10E527FAL)
 333#define CAMELLIA_SIGMA5R (0xDE682D1DL)
 334#define CAMELLIA_SIGMA6L (0xB05688C2L)
 335#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
 336
 337/*
 338 *  macros
 339 */
 340#define ROLDQ(ll, lr, rl, rr, w0, w1, bits)             \
 341    do {                                                \
 342        w0 = ll;                                        \
 343        ll = (ll << bits) + (lr >> (32 - bits));        \
 344        lr = (lr << bits) + (rl >> (32 - bits));        \
 345        rl = (rl << bits) + (rr >> (32 - bits));        \
 346        rr = (rr << bits) + (w0 >> (32 - bits));        \
 347    } while(0)
 348
 349#define ROLDQo32(ll, lr, rl, rr, w0, w1, bits)          \
 350    do {                                                \
 351        w0 = ll;                                        \
 352        w1 = lr;                                        \
 353        ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \
 354        lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \
 355        rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \
 356        rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \
 357    } while(0)
 358
 359#define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1)      \
 360    do {                                                        \
 361        il = xl ^ kl;                                           \
 362        ir = xr ^ kr;                                           \
 363        t0 = il >> 16;                                          \
 364        t1 = ir >> 16;                                          \
 365        yl = camellia_sp1110[(u8)(ir     )]                     \
 366           ^ camellia_sp0222[    (t1 >> 8)]                     \
 367           ^ camellia_sp3033[(u8)(t1     )]                     \
 368           ^ camellia_sp4404[(u8)(ir >> 8)];                    \
 369        yr = camellia_sp1110[    (t0 >> 8)]                     \
 370           ^ camellia_sp0222[(u8)(t0     )]                     \
 371           ^ camellia_sp3033[(u8)(il >> 8)]                     \
 372           ^ camellia_sp4404[(u8)(il     )];                    \
 373        yl ^= yr;                                               \
 374        yr = ror32(yr, 8);                                      \
 375        yr ^= yl;                                               \
 376    } while(0)
 377
 378#define SUBKEY_L(INDEX) (subkey[(INDEX)*2])
 379#define SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1])
 380
 381static void camellia_setup_tail(u32 *subkey, u32 *subL, u32 *subR, int max)
 382{
 383        u32 dw, tl, tr;
 384        u32 kw4l, kw4r;
 385        int i;
 386
 387        /* absorb kw2 to other subkeys */
 388        /* round 2 */
 389        subL[3] ^= subL[1]; subR[3] ^= subR[1];
 390        /* round 4 */
 391        subL[5] ^= subL[1]; subR[5] ^= subR[1];
 392        /* round 6 */
 393        subL[7] ^= subL[1]; subR[7] ^= subR[1];
 394        subL[1] ^= subR[1] & ~subR[9];
 395        dw = subL[1] & subL[9],
 396                subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl2) */
 397        /* round 8 */
 398        subL[11] ^= subL[1]; subR[11] ^= subR[1];
 399        /* round 10 */
 400        subL[13] ^= subL[1]; subR[13] ^= subR[1];
 401        /* round 12 */
 402        subL[15] ^= subL[1]; subR[15] ^= subR[1];
 403        subL[1] ^= subR[1] & ~subR[17];
 404        dw = subL[1] & subL[17],
 405                subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl4) */
 406        /* round 14 */
 407        subL[19] ^= subL[1]; subR[19] ^= subR[1];
 408        /* round 16 */
 409        subL[21] ^= subL[1]; subR[21] ^= subR[1];
 410        /* round 18 */
 411        subL[23] ^= subL[1]; subR[23] ^= subR[1];
 412        if (max == 24) {
 413                /* kw3 */
 414                subL[24] ^= subL[1]; subR[24] ^= subR[1];
 415
 416        /* absorb kw4 to other subkeys */
 417                kw4l = subL[25]; kw4r = subR[25];
 418        } else {
 419                subL[1] ^= subR[1] & ~subR[25];
 420                dw = subL[1] & subL[25],
 421                        subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl6) */
 422                /* round 20 */
 423                subL[27] ^= subL[1]; subR[27] ^= subR[1];
 424                /* round 22 */
 425                subL[29] ^= subL[1]; subR[29] ^= subR[1];
 426                /* round 24 */
 427                subL[31] ^= subL[1]; subR[31] ^= subR[1];
 428                /* kw3 */
 429                subL[32] ^= subL[1]; subR[32] ^= subR[1];
 430
 431        /* absorb kw4 to other subkeys */
 432                kw4l = subL[33]; kw4r = subR[33];
 433                /* round 23 */
 434                subL[30] ^= kw4l; subR[30] ^= kw4r;
 435                /* round 21 */
 436                subL[28] ^= kw4l; subR[28] ^= kw4r;
 437                /* round 19 */
 438                subL[26] ^= kw4l; subR[26] ^= kw4r;
 439                kw4l ^= kw4r & ~subR[24];
 440                dw = kw4l & subL[24],
 441                        kw4r ^= rol32(dw, 1); /* modified for FL(kl5) */
 442        }
 443        /* round 17 */
 444        subL[22] ^= kw4l; subR[22] ^= kw4r;
 445        /* round 15 */
 446        subL[20] ^= kw4l; subR[20] ^= kw4r;
 447        /* round 13 */
 448        subL[18] ^= kw4l; subR[18] ^= kw4r;
 449        kw4l ^= kw4r & ~subR[16];
 450        dw = kw4l & subL[16],
 451                kw4r ^= rol32(dw, 1); /* modified for FL(kl3) */
 452        /* round 11 */
 453        subL[14] ^= kw4l; subR[14] ^= kw4r;
 454        /* round 9 */
 455        subL[12] ^= kw4l; subR[12] ^= kw4r;
 456        /* round 7 */
 457        subL[10] ^= kw4l; subR[10] ^= kw4r;
 458        kw4l ^= kw4r & ~subR[8];
 459        dw = kw4l & subL[8],
 460                kw4r ^= rol32(dw, 1); /* modified for FL(kl1) */
 461        /* round 5 */
 462        subL[6] ^= kw4l; subR[6] ^= kw4r;
 463        /* round 3 */
 464        subL[4] ^= kw4l; subR[4] ^= kw4r;
 465        /* round 1 */
 466        subL[2] ^= kw4l; subR[2] ^= kw4r;
 467        /* kw1 */
 468        subL[0] ^= kw4l; subR[0] ^= kw4r;
 469
 470        /* key XOR is end of F-function */
 471        SUBKEY_L(0) = subL[0] ^ subL[2];/* kw1 */
 472        SUBKEY_R(0) = subR[0] ^ subR[2];
 473        SUBKEY_L(2) = subL[3];       /* round 1 */
 474        SUBKEY_R(2) = subR[3];
 475        SUBKEY_L(3) = subL[2] ^ subL[4]; /* round 2 */
 476        SUBKEY_R(3) = subR[2] ^ subR[4];
 477        SUBKEY_L(4) = subL[3] ^ subL[5]; /* round 3 */
 478        SUBKEY_R(4) = subR[3] ^ subR[5];
 479        SUBKEY_L(5) = subL[4] ^ subL[6]; /* round 4 */
 480        SUBKEY_R(5) = subR[4] ^ subR[6];
 481        SUBKEY_L(6) = subL[5] ^ subL[7]; /* round 5 */
 482        SUBKEY_R(6) = subR[5] ^ subR[7];
 483        tl = subL[10] ^ (subR[10] & ~subR[8]);
 484        dw = tl & subL[8],  /* FL(kl1) */
 485                tr = subR[10] ^ rol32(dw, 1);
 486        SUBKEY_L(7) = subL[6] ^ tl; /* round 6 */
 487        SUBKEY_R(7) = subR[6] ^ tr;
 488        SUBKEY_L(8) = subL[8];       /* FL(kl1) */
 489        SUBKEY_R(8) = subR[8];
 490        SUBKEY_L(9) = subL[9];       /* FLinv(kl2) */
 491        SUBKEY_R(9) = subR[9];
 492        tl = subL[7] ^ (subR[7] & ~subR[9]);
 493        dw = tl & subL[9],  /* FLinv(kl2) */
 494                tr = subR[7] ^ rol32(dw, 1);
 495        SUBKEY_L(10) = tl ^ subL[11]; /* round 7 */
 496        SUBKEY_R(10) = tr ^ subR[11];
 497        SUBKEY_L(11) = subL[10] ^ subL[12]; /* round 8 */
 498        SUBKEY_R(11) = subR[10] ^ subR[12];
 499        SUBKEY_L(12) = subL[11] ^ subL[13]; /* round 9 */
 500        SUBKEY_R(12) = subR[11] ^ subR[13];
 501        SUBKEY_L(13) = subL[12] ^ subL[14]; /* round 10 */
 502        SUBKEY_R(13) = subR[12] ^ subR[14];
 503        SUBKEY_L(14) = subL[13] ^ subL[15]; /* round 11 */
 504        SUBKEY_R(14) = subR[13] ^ subR[15];
 505        tl = subL[18] ^ (subR[18] & ~subR[16]);
 506        dw = tl & subL[16], /* FL(kl3) */
 507                tr = subR[18] ^ rol32(dw, 1);
 508        SUBKEY_L(15) = subL[14] ^ tl; /* round 12 */
 509        SUBKEY_R(15) = subR[14] ^ tr;
 510        SUBKEY_L(16) = subL[16];     /* FL(kl3) */
 511        SUBKEY_R(16) = subR[16];
 512        SUBKEY_L(17) = subL[17];     /* FLinv(kl4) */
 513        SUBKEY_R(17) = subR[17];
 514        tl = subL[15] ^ (subR[15] & ~subR[17]);
 515        dw = tl & subL[17], /* FLinv(kl4) */
 516                tr = subR[15] ^ rol32(dw, 1);
 517        SUBKEY_L(18) = tl ^ subL[19]; /* round 13 */
 518        SUBKEY_R(18) = tr ^ subR[19];
 519        SUBKEY_L(19) = subL[18] ^ subL[20]; /* round 14 */
 520        SUBKEY_R(19) = subR[18] ^ subR[20];
 521        SUBKEY_L(20) = subL[19] ^ subL[21]; /* round 15 */
 522        SUBKEY_R(20) = subR[19] ^ subR[21];
 523        SUBKEY_L(21) = subL[20] ^ subL[22]; /* round 16 */
 524        SUBKEY_R(21) = subR[20] ^ subR[22];
 525        SUBKEY_L(22) = subL[21] ^ subL[23]; /* round 17 */
 526        SUBKEY_R(22) = subR[21] ^ subR[23];
 527        if (max == 24) {
 528                SUBKEY_L(23) = subL[22];     /* round 18 */
 529                SUBKEY_R(23) = subR[22];
 530                SUBKEY_L(24) = subL[24] ^ subL[23]; /* kw3 */
 531                SUBKEY_R(24) = subR[24] ^ subR[23];
 532        } else {
 533                tl = subL[26] ^ (subR[26] & ~subR[24]);
 534                dw = tl & subL[24], /* FL(kl5) */
 535                        tr = subR[26] ^ rol32(dw, 1);
 536                SUBKEY_L(23) = subL[22] ^ tl; /* round 18 */
 537                SUBKEY_R(23) = subR[22] ^ tr;
 538                SUBKEY_L(24) = subL[24];     /* FL(kl5) */
 539                SUBKEY_R(24) = subR[24];
 540                SUBKEY_L(25) = subL[25];     /* FLinv(kl6) */
 541                SUBKEY_R(25) = subR[25];
 542                tl = subL[23] ^ (subR[23] & ~subR[25]);
 543                dw = tl & subL[25], /* FLinv(kl6) */
 544                        tr = subR[23] ^ rol32(dw, 1);
 545                SUBKEY_L(26) = tl ^ subL[27]; /* round 19 */
 546                SUBKEY_R(26) = tr ^ subR[27];
 547                SUBKEY_L(27) = subL[26] ^ subL[28]; /* round 20 */
 548                SUBKEY_R(27) = subR[26] ^ subR[28];
 549                SUBKEY_L(28) = subL[27] ^ subL[29]; /* round 21 */
 550                SUBKEY_R(28) = subR[27] ^ subR[29];
 551                SUBKEY_L(29) = subL[28] ^ subL[30]; /* round 22 */
 552                SUBKEY_R(29) = subR[28] ^ subR[30];
 553                SUBKEY_L(30) = subL[29] ^ subL[31]; /* round 23 */
 554                SUBKEY_R(30) = subR[29] ^ subR[31];
 555                SUBKEY_L(31) = subL[30];     /* round 24 */
 556                SUBKEY_R(31) = subR[30];
 557                SUBKEY_L(32) = subL[32] ^ subL[31]; /* kw3 */
 558                SUBKEY_R(32) = subR[32] ^ subR[31];
 559        }
 560
 561        /* apply the inverse of the last half of P-function */
 562        i = 2;
 563        do {
 564                dw = SUBKEY_L(i + 0) ^ SUBKEY_R(i + 0); dw = rol32(dw, 8);/* round 1 */
 565                SUBKEY_R(i + 0) = SUBKEY_L(i + 0) ^ dw; SUBKEY_L(i + 0) = dw;
 566                dw = SUBKEY_L(i + 1) ^ SUBKEY_R(i + 1); dw = rol32(dw, 8);/* round 2 */
 567                SUBKEY_R(i + 1) = SUBKEY_L(i + 1) ^ dw; SUBKEY_L(i + 1) = dw;
 568                dw = SUBKEY_L(i + 2) ^ SUBKEY_R(i + 2); dw = rol32(dw, 8);/* round 3 */
 569                SUBKEY_R(i + 2) = SUBKEY_L(i + 2) ^ dw; SUBKEY_L(i + 2) = dw;
 570                dw = SUBKEY_L(i + 3) ^ SUBKEY_R(i + 3); dw = rol32(dw, 8);/* round 4 */
 571                SUBKEY_R(i + 3) = SUBKEY_L(i + 3) ^ dw; SUBKEY_L(i + 3) = dw;
 572                dw = SUBKEY_L(i + 4) ^ SUBKEY_R(i + 4); dw = rol32(dw, 8);/* round 5 */
 573                SUBKEY_R(i + 4) = SUBKEY_L(i + 4) ^ dw; SUBKEY_L(i + 4) = dw;
 574                dw = SUBKEY_L(i + 5) ^ SUBKEY_R(i + 5); dw = rol32(dw, 8);/* round 6 */
 575                SUBKEY_R(i + 5) = SUBKEY_L(i + 5) ^ dw; SUBKEY_L(i + 5) = dw;
 576                i += 8;
 577        } while (i < max);
 578}
 579
 580static void camellia_setup128(const unsigned char *key, u32 *subkey)
 581{
 582        u32 kll, klr, krl, krr;
 583        u32 il, ir, t0, t1, w0, w1;
 584        u32 subL[26];
 585        u32 subR[26];
 586
 587        /**
 588         *  k == kll || klr || krl || krr (|| is concatenation)
 589         */
 590        kll = get_unaligned_be32(key);
 591        klr = get_unaligned_be32(key + 4);
 592        krl = get_unaligned_be32(key + 8);
 593        krr = get_unaligned_be32(key + 12);
 594
 595        /* generate KL dependent subkeys */
 596        /* kw1 */
 597        subL[0] = kll; subR[0] = klr;
 598        /* kw2 */
 599        subL[1] = krl; subR[1] = krr;
 600        /* rotation left shift 15bit */
 601        ROLDQ(kll, klr, krl, krr, w0, w1, 15);
 602        /* k3 */
 603        subL[4] = kll; subR[4] = klr;
 604        /* k4 */
 605        subL[5] = krl; subR[5] = krr;
 606        /* rotation left shift 15+30bit */
 607        ROLDQ(kll, klr, krl, krr, w0, w1, 30);
 608        /* k7 */
 609        subL[10] = kll; subR[10] = klr;
 610        /* k8 */
 611        subL[11] = krl; subR[11] = krr;
 612        /* rotation left shift 15+30+15bit */
 613        ROLDQ(kll, klr, krl, krr, w0, w1, 15);
 614        /* k10 */
 615        subL[13] = krl; subR[13] = krr;
 616        /* rotation left shift 15+30+15+17 bit */
 617        ROLDQ(kll, klr, krl, krr, w0, w1, 17);
 618        /* kl3 */
 619        subL[16] = kll; subR[16] = klr;
 620        /* kl4 */
 621        subL[17] = krl; subR[17] = krr;
 622        /* rotation left shift 15+30+15+17+17 bit */
 623        ROLDQ(kll, klr, krl, krr, w0, w1, 17);
 624        /* k13 */
 625        subL[18] = kll; subR[18] = klr;
 626        /* k14 */
 627        subL[19] = krl; subR[19] = krr;
 628        /* rotation left shift 15+30+15+17+17+17 bit */
 629        ROLDQ(kll, klr, krl, krr, w0, w1, 17);
 630        /* k17 */
 631        subL[22] = kll; subR[22] = klr;
 632        /* k18 */
 633        subL[23] = krl; subR[23] = krr;
 634
 635        /* generate KA */
 636        kll = subL[0]; klr = subR[0];
 637        krl = subL[1]; krr = subR[1];
 638        CAMELLIA_F(kll, klr,
 639                   CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
 640                   w0, w1, il, ir, t0, t1);
 641        krl ^= w0; krr ^= w1;
 642        CAMELLIA_F(krl, krr,
 643                   CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
 644                   kll, klr, il, ir, t0, t1);
 645        /* current status == (kll, klr, w0, w1) */
 646        CAMELLIA_F(kll, klr,
 647                   CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
 648                   krl, krr, il, ir, t0, t1);
 649        krl ^= w0; krr ^= w1;
 650        CAMELLIA_F(krl, krr,
 651                   CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
 652                   w0, w1, il, ir, t0, t1);
 653        kll ^= w0; klr ^= w1;
 654
 655        /* generate KA dependent subkeys */
 656        /* k1, k2 */
 657        subL[2] = kll; subR[2] = klr;
 658        subL[3] = krl; subR[3] = krr;
 659        ROLDQ(kll, klr, krl, krr, w0, w1, 15);
 660        /* k5,k6 */
 661        subL[6] = kll; subR[6] = klr;
 662        subL[7] = krl; subR[7] = krr;
 663        ROLDQ(kll, klr, krl, krr, w0, w1, 15);
 664        /* kl1, kl2 */
 665        subL[8] = kll; subR[8] = klr;
 666        subL[9] = krl; subR[9] = krr;
 667        ROLDQ(kll, klr, krl, krr, w0, w1, 15);
 668        /* k9 */
 669        subL[12] = kll; subR[12] = klr;
 670        ROLDQ(kll, klr, krl, krr, w0, w1, 15);
 671        /* k11, k12 */
 672        subL[14] = kll; subR[14] = klr;
 673        subL[15] = krl; subR[15] = krr;
 674        ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
 675        /* k15, k16 */
 676        subL[20] = kll; subR[20] = klr;
 677        subL[21] = krl; subR[21] = krr;
 678        ROLDQ(kll, klr, krl, krr, w0, w1, 17);
 679        /* kw3, kw4 */
 680        subL[24] = kll; subR[24] = klr;
 681        subL[25] = krl; subR[25] = krr;
 682
 683        camellia_setup_tail(subkey, subL, subR, 24);
 684}
 685
 686static void camellia_setup256(const unsigned char *key, u32 *subkey)
 687{
 688        u32 kll, klr, krl, krr;        /* left half of key */
 689        u32 krll, krlr, krrl, krrr;    /* right half of key */
 690        u32 il, ir, t0, t1, w0, w1;    /* temporary variables */
 691        u32 subL[34];
 692        u32 subR[34];
 693
 694        /**
 695         *  key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
 696         *  (|| is concatenation)
 697         */
 698        kll = get_unaligned_be32(key);
 699        klr = get_unaligned_be32(key + 4);
 700        krl = get_unaligned_be32(key + 8);
 701        krr = get_unaligned_be32(key + 12);
 702        krll = get_unaligned_be32(key + 16);
 703        krlr = get_unaligned_be32(key + 20);
 704        krrl = get_unaligned_be32(key + 24);
 705        krrr = get_unaligned_be32(key + 28);
 706
 707        /* generate KL dependent subkeys */
 708        /* kw1 */
 709        subL[0] = kll; subR[0] = klr;
 710        /* kw2 */
 711        subL[1] = krl; subR[1] = krr;
 712        ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
 713        /* k9 */
 714        subL[12] = kll; subR[12] = klr;
 715        /* k10 */
 716        subL[13] = krl; subR[13] = krr;
 717        ROLDQ(kll, klr, krl, krr, w0, w1, 15);
 718        /* kl3 */
 719        subL[16] = kll; subR[16] = klr;
 720        /* kl4 */
 721        subL[17] = krl; subR[17] = krr;
 722        ROLDQ(kll, klr, krl, krr, w0, w1, 17);
 723        /* k17 */
 724        subL[22] = kll; subR[22] = klr;
 725        /* k18 */
 726        subL[23] = krl; subR[23] = krr;
 727        ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
 728        /* k23 */
 729        subL[30] = kll; subR[30] = klr;
 730        /* k24 */
 731        subL[31] = krl; subR[31] = krr;
 732
 733        /* generate KR dependent subkeys */
 734        ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
 735        /* k3 */
 736        subL[4] = krll; subR[4] = krlr;
 737        /* k4 */
 738        subL[5] = krrl; subR[5] = krrr;
 739        ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
 740        /* kl1 */
 741        subL[8] = krll; subR[8] = krlr;
 742        /* kl2 */
 743        subL[9] = krrl; subR[9] = krrr;
 744        ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
 745        /* k13 */
 746        subL[18] = krll; subR[18] = krlr;
 747        /* k14 */
 748        subL[19] = krrl; subR[19] = krrr;
 749        ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
 750        /* k19 */
 751        subL[26] = krll; subR[26] = krlr;
 752        /* k20 */
 753        subL[27] = krrl; subR[27] = krrr;
 754        ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
 755
 756        /* generate KA */
 757        kll = subL[0] ^ krll; klr = subR[0] ^ krlr;
 758        krl = subL[1] ^ krrl; krr = subR[1] ^ krrr;
 759        CAMELLIA_F(kll, klr,
 760                   CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
 761                   w0, w1, il, ir, t0, t1);
 762        krl ^= w0; krr ^= w1;
 763        CAMELLIA_F(krl, krr,
 764                   CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
 765                   kll, klr, il, ir, t0, t1);
 766        kll ^= krll; klr ^= krlr;
 767        CAMELLIA_F(kll, klr,
 768                   CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
 769                   krl, krr, il, ir, t0, t1);
 770        krl ^= w0 ^ krrl; krr ^= w1 ^ krrr;
 771        CAMELLIA_F(krl, krr,
 772                   CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
 773                   w0, w1, il, ir, t0, t1);
 774        kll ^= w0; klr ^= w1;
 775
 776        /* generate KB */
 777        krll ^= kll; krlr ^= klr;
 778        krrl ^= krl; krrr ^= krr;
 779        CAMELLIA_F(krll, krlr,
 780                   CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R,
 781                   w0, w1, il, ir, t0, t1);
 782        krrl ^= w0; krrr ^= w1;
 783        CAMELLIA_F(krrl, krrr,
 784                   CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R,
 785                   w0, w1, il, ir, t0, t1);
 786        krll ^= w0; krlr ^= w1;
 787
 788        /* generate KA dependent subkeys */
 789        ROLDQ(kll, klr, krl, krr, w0, w1, 15);
 790        /* k5 */
 791        subL[6] = kll; subR[6] = klr;
 792        /* k6 */
 793        subL[7] = krl; subR[7] = krr;
 794        ROLDQ(kll, klr, krl, krr, w0, w1, 30);
 795        /* k11 */
 796        subL[14] = kll; subR[14] = klr;
 797        /* k12 */
 798        subL[15] = krl; subR[15] = krr;
 799        /* rotation left shift 32bit */
 800        /* kl5 */
 801        subL[24] = klr; subR[24] = krl;
 802        /* kl6 */
 803        subL[25] = krr; subR[25] = kll;
 804        /* rotation left shift 49 from k11,k12 -> k21,k22 */
 805        ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
 806        /* k21 */
 807        subL[28] = kll; subR[28] = klr;
 808        /* k22 */
 809        subL[29] = krl; subR[29] = krr;
 810
 811        /* generate KB dependent subkeys */
 812        /* k1 */
 813        subL[2] = krll; subR[2] = krlr;
 814        /* k2 */
 815        subL[3] = krrl; subR[3] = krrr;
 816        ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
 817        /* k7 */
 818        subL[10] = krll; subR[10] = krlr;
 819        /* k8 */
 820        subL[11] = krrl; subR[11] = krrr;
 821        ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
 822        /* k15 */
 823        subL[20] = krll; subR[20] = krlr;
 824        /* k16 */
 825        subL[21] = krrl; subR[21] = krrr;
 826        ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
 827        /* kw3 */
 828        subL[32] = krll; subR[32] = krlr;
 829        /* kw4 */
 830        subL[33] = krrl; subR[33] = krrr;
 831
 832        camellia_setup_tail(subkey, subL, subR, 32);
 833}
 834
 835static void camellia_setup192(const unsigned char *key, u32 *subkey)
 836{
 837        unsigned char kk[32];
 838        u32 krll, krlr, krrl,krrr;
 839
 840        memcpy(kk, key, 24);
 841        memcpy((unsigned char *)&krll, key+16, 4);
 842        memcpy((unsigned char *)&krlr, key+20, 4);
 843        krrl = ~krll;
 844        krrr = ~krlr;
 845        memcpy(kk+24, (unsigned char *)&krrl, 4);
 846        memcpy(kk+28, (unsigned char *)&krrr, 4);
 847        camellia_setup256(kk, subkey);
 848}
 849
 850
 851/*
 852 * Encrypt/decrypt
 853 */
 854#define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \
 855    do {                                                                \
 856        t0 = kll;                                                       \
 857        t2 = krr;                                                       \
 858        t0 &= ll;                                                       \
 859        t2 |= rr;                                                       \
 860        rl ^= t2;                                                       \
 861        lr ^= rol32(t0, 1);                                             \
 862        t3 = krl;                                                       \
 863        t1 = klr;                                                       \
 864        t3 &= rl;                                                       \
 865        t1 |= lr;                                                       \
 866        ll ^= t1;                                                       \
 867        rr ^= rol32(t3, 1);                                             \
 868    } while(0)
 869
 870#define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir)                \
 871    do {                                                                \
 872        ir =  camellia_sp1110[(u8)xr];                                  \
 873        il =  camellia_sp1110[    (xl >> 24)];                          \
 874        ir ^= camellia_sp0222[    (xr >> 24)];                          \
 875        il ^= camellia_sp0222[(u8)(xl >> 16)];                          \
 876        ir ^= camellia_sp3033[(u8)(xr >> 16)];                          \
 877        il ^= camellia_sp3033[(u8)(xl >> 8)];                           \
 878        ir ^= camellia_sp4404[(u8)(xr >> 8)];                           \
 879        il ^= camellia_sp4404[(u8)xl];                                  \
 880        il ^= kl;                                                       \
 881        ir ^= il ^ kr;                                                  \
 882        yl ^= ir;                                                       \
 883        yr ^= ror32(il, 8) ^ ir;                                                \
 884    } while(0)
 885
 886/* max = 24: 128bit encrypt, max = 32: 256bit encrypt */
 887static void camellia_do_encrypt(const u32 *subkey, u32 *io, unsigned max)
 888{
 889        u32 il,ir,t0,t1;               /* temporary variables */
 890
 891        /* pre whitening but absorb kw2 */
 892        io[0] ^= SUBKEY_L(0);
 893        io[1] ^= SUBKEY_R(0);
 894
 895        /* main iteration */
 896#define ROUNDS(i) do { \
 897        CAMELLIA_ROUNDSM(io[0],io[1], \
 898                         SUBKEY_L(i + 2),SUBKEY_R(i + 2), \
 899                         io[2],io[3],il,ir); \
 900        CAMELLIA_ROUNDSM(io[2],io[3], \
 901                         SUBKEY_L(i + 3),SUBKEY_R(i + 3), \
 902                         io[0],io[1],il,ir); \
 903        CAMELLIA_ROUNDSM(io[0],io[1], \
 904                         SUBKEY_L(i + 4),SUBKEY_R(i + 4), \
 905                         io[2],io[3],il,ir); \
 906        CAMELLIA_ROUNDSM(io[2],io[3], \
 907                         SUBKEY_L(i + 5),SUBKEY_R(i + 5), \
 908                         io[0],io[1],il,ir); \
 909        CAMELLIA_ROUNDSM(io[0],io[1], \
 910                         SUBKEY_L(i + 6),SUBKEY_R(i + 6), \
 911                         io[2],io[3],il,ir); \
 912        CAMELLIA_ROUNDSM(io[2],io[3], \
 913                         SUBKEY_L(i + 7),SUBKEY_R(i + 7), \
 914                         io[0],io[1],il,ir); \
 915} while (0)
 916#define FLS(i) do { \
 917        CAMELLIA_FLS(io[0],io[1],io[2],io[3], \
 918                     SUBKEY_L(i + 0),SUBKEY_R(i + 0), \
 919                     SUBKEY_L(i + 1),SUBKEY_R(i + 1), \
 920                     t0,t1,il,ir); \
 921} while (0)
 922
 923        ROUNDS(0);
 924        FLS(8);
 925        ROUNDS(8);
 926        FLS(16);
 927        ROUNDS(16);
 928        if (max == 32) {
 929                FLS(24);
 930                ROUNDS(24);
 931        }
 932
 933#undef ROUNDS
 934#undef FLS
 935
 936        /* post whitening but kw4 */
 937        io[2] ^= SUBKEY_L(max);
 938        io[3] ^= SUBKEY_R(max);
 939        /* NB: io[0],[1] should be swapped with [2],[3] by caller! */
 940}
 941
 942static void camellia_do_decrypt(const u32 *subkey, u32 *io, unsigned i)
 943{
 944        u32 il,ir,t0,t1;               /* temporary variables */
 945
 946        /* pre whitening but absorb kw2 */
 947        io[0] ^= SUBKEY_L(i);
 948        io[1] ^= SUBKEY_R(i);
 949
 950        /* main iteration */
 951#define ROUNDS(i) do { \
 952        CAMELLIA_ROUNDSM(io[0],io[1], \
 953                         SUBKEY_L(i + 7),SUBKEY_R(i + 7), \
 954                         io[2],io[3],il,ir); \
 955        CAMELLIA_ROUNDSM(io[2],io[3], \
 956                         SUBKEY_L(i + 6),SUBKEY_R(i + 6), \
 957                         io[0],io[1],il,ir); \
 958        CAMELLIA_ROUNDSM(io[0],io[1], \
 959                         SUBKEY_L(i + 5),SUBKEY_R(i + 5), \
 960                         io[2],io[3],il,ir); \
 961        CAMELLIA_ROUNDSM(io[2],io[3], \
 962                         SUBKEY_L(i + 4),SUBKEY_R(i + 4), \
 963                         io[0],io[1],il,ir); \
 964        CAMELLIA_ROUNDSM(io[0],io[1], \
 965                         SUBKEY_L(i + 3),SUBKEY_R(i + 3), \
 966                         io[2],io[3],il,ir); \
 967        CAMELLIA_ROUNDSM(io[2],io[3], \
 968                         SUBKEY_L(i + 2),SUBKEY_R(i + 2), \
 969                         io[0],io[1],il,ir); \
 970} while (0)
 971#define FLS(i) do { \
 972        CAMELLIA_FLS(io[0],io[1],io[2],io[3], \
 973                     SUBKEY_L(i + 1),SUBKEY_R(i + 1), \
 974                     SUBKEY_L(i + 0),SUBKEY_R(i + 0), \
 975                     t0,t1,il,ir); \
 976} while (0)
 977
 978        if (i == 32) {
 979                ROUNDS(24);
 980                FLS(24);
 981        }
 982        ROUNDS(16);
 983        FLS(16);
 984        ROUNDS(8);
 985        FLS(8);
 986        ROUNDS(0);
 987
 988#undef ROUNDS
 989#undef FLS
 990
 991        /* post whitening but kw4 */
 992        io[2] ^= SUBKEY_L(0);
 993        io[3] ^= SUBKEY_R(0);
 994        /* NB: 0,1 should be swapped with 2,3 by caller! */
 995}
 996
 997
 998struct camellia_ctx {
 999        int key_length;
1000        u32 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u32)];
1001};
1002
1003static int
1004camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key,
1005                 unsigned int key_len)
1006{
1007        struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1008        const unsigned char *key = (const unsigned char *)in_key;
1009        u32 *flags = &tfm->crt_flags;
1010
1011        if (key_len != 16 && key_len != 24 && key_len != 32) {
1012                *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1013                return -EINVAL;
1014        }
1015
1016        cctx->key_length = key_len;
1017
1018        switch (key_len) {
1019        case 16:
1020                camellia_setup128(key, cctx->key_table);
1021                break;
1022        case 24:
1023                camellia_setup192(key, cctx->key_table);
1024                break;
1025        case 32:
1026                camellia_setup256(key, cctx->key_table);
1027                break;
1028        }
1029
1030        return 0;
1031}
1032
1033static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1034{
1035        const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1036        const __be32 *src = (const __be32 *)in;
1037        __be32 *dst = (__be32 *)out;
1038
1039        u32 tmp[4];
1040
1041        tmp[0] = be32_to_cpu(src[0]);
1042        tmp[1] = be32_to_cpu(src[1]);
1043        tmp[2] = be32_to_cpu(src[2]);
1044        tmp[3] = be32_to_cpu(src[3]);
1045
1046        camellia_do_encrypt(cctx->key_table, tmp,
1047                cctx->key_length == 16 ? 24 : 32 /* for key lengths of 24 and 32 */
1048        );
1049
1050        /* do_encrypt returns 0,1 swapped with 2,3 */
1051        dst[0] = cpu_to_be32(tmp[2]);
1052        dst[1] = cpu_to_be32(tmp[3]);
1053        dst[2] = cpu_to_be32(tmp[0]);
1054        dst[3] = cpu_to_be32(tmp[1]);
1055}
1056
1057static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1058{
1059        const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1060        const __be32 *src = (const __be32 *)in;
1061        __be32 *dst = (__be32 *)out;
1062
1063        u32 tmp[4];
1064
1065        tmp[0] = be32_to_cpu(src[0]);
1066        tmp[1] = be32_to_cpu(src[1]);
1067        tmp[2] = be32_to_cpu(src[2]);
1068        tmp[3] = be32_to_cpu(src[3]);
1069
1070        camellia_do_decrypt(cctx->key_table, tmp,
1071                cctx->key_length == 16 ? 24 : 32 /* for key lengths of 24 and 32 */
1072        );
1073
1074        /* do_decrypt returns 0,1 swapped with 2,3 */
1075        dst[0] = cpu_to_be32(tmp[2]);
1076        dst[1] = cpu_to_be32(tmp[3]);
1077        dst[2] = cpu_to_be32(tmp[0]);
1078        dst[3] = cpu_to_be32(tmp[1]);
1079}
1080
1081static struct crypto_alg camellia_alg = {
1082        .cra_name               =       "camellia",
1083        .cra_driver_name        =       "camellia-generic",
1084        .cra_priority           =       100,
1085        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
1086        .cra_blocksize          =       CAMELLIA_BLOCK_SIZE,
1087        .cra_ctxsize            =       sizeof(struct camellia_ctx),
1088        .cra_alignmask          =       3,
1089        .cra_module             =       THIS_MODULE,
1090        .cra_list               =       LIST_HEAD_INIT(camellia_alg.cra_list),
1091        .cra_u                  =       {
1092                .cipher = {
1093                        .cia_min_keysize        =       CAMELLIA_MIN_KEY_SIZE,
1094                        .cia_max_keysize        =       CAMELLIA_MAX_KEY_SIZE,
1095                        .cia_setkey             =       camellia_set_key,
1096                        .cia_encrypt            =       camellia_encrypt,
1097                        .cia_decrypt            =       camellia_decrypt
1098                }
1099        }
1100};
1101
1102static int __init camellia_init(void)
1103{
1104        return crypto_register_alg(&camellia_alg);
1105}
1106
1107static void __exit camellia_fini(void)
1108{
1109        crypto_unregister_alg(&camellia_alg);
1110}
1111
1112module_init(camellia_init);
1113module_exit(camellia_fini);
1114
1115MODULE_DESCRIPTION("Camellia Cipher Algorithm");
1116MODULE_LICENSE("GPL");
1117