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