root/source4/heimdal/lib/hcrypto/camellia-ntt.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. camellia_setup128
  2. camellia_setup256
  3. camellia_setup192
  4. camellia_encrypt128
  5. camellia_decrypt128
  6. camellia_encrypt256
  7. camellia_decrypt256
  8. Camellia_Ekeygen
  9. Camellia_EncryptBlock
  10. Camellia_DecryptBlock

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

/* [<][>][^][v][top][bottom][index][help] */