cyassl re-port with cellular comms, PSK test

Dependencies:   VodafoneUSBModem_bleedingedge2 mbed-rtos mbed-src

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers camellia.c Source File

camellia.c

00001 /* camellia.c ver 1.2.0
00002  *
00003  * Copyright (c) 2006,2007
00004  * NTT (Nippon Telegraph and Telephone Corporation) . All rights reserved.
00005  *
00006  * Redistribution and use in source and binary forms, with or without
00007  * modification, are permitted provided that the following conditions
00008  * are met:
00009  * 1. Redistributions of source code must retain the above copyright
00010  *   notice, this list of conditions and the following disclaimer as
00011  *   the first lines of this file unmodified.
00012  * 2. Redistributions in binary form must reproduce the above copyright
00013  *   notice, this list of conditions and the following disclaimer in the
00014  *   documentation and/or other materials provided with the distribution.
00015  *
00016  * THIS SOFTWARE IS PROVIDED BY NTT ``AS IS'' AND ANY EXPRESS OR
00017  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00018  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00019  * IN NO EVENT SHALL NTT BE LIABLE FOR ANY DIRECT, INDIRECT,
00020  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00021  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00022  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00023  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00024  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00025  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00026  */
00027 
00028 /* camellia.c
00029  *
00030  * Copyright (C) 2006-2013 Sawtooth Consulting Ltd.
00031  *
00032  * This file is part of CyaSSL.
00033  *
00034  * CyaSSL is free software; you can redistribute it and/or modify
00035  * it under the terms of the GNU General Public License as published by
00036  * the Free Software Foundation; either version 2 of the License, or
00037  * (at your option) any later version.
00038  *
00039  * CyaSSL is distributed in the hope that it will be useful,
00040  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00041  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00042  * GNU General Public License for more details.
00043  *
00044  * You should have received a copy of the GNU General Public License
00045  * along with this program; if not, write to the Free Software
00046  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
00047  */
00048 
00049 /*
00050  * Algorithm Specification 
00051  *  http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
00052  */
00053 
00054 
00055 #ifdef HAVE_CONFIG_H
00056     #include <config.h>
00057 #endif
00058 
00059 #ifdef HAVE_CAMELLIA
00060 
00061 #include <cyassl/ctaocrypt/camellia.h>
00062 #include <cyassl/ctaocrypt/error.h>
00063 #include <cyassl/ctaocrypt/logging.h>
00064 #ifdef NO_INLINE
00065     #include <cyassl/ctaocrypt/misc.h>
00066 #else
00067     #include <ctaocrypt/src/misc.c>
00068 #endif
00069 
00070 
00071 /* u32 must be 32bit word */
00072 typedef unsigned int u32;
00073 typedef unsigned char u8;
00074 
00075 /* key constants */
00076 
00077 #define CAMELLIA_SIGMA1L ((u32)0xA09E667FL)
00078 #define CAMELLIA_SIGMA1R ((u32)0x3BCC908BL)
00079 #define CAMELLIA_SIGMA2L ((u32)0xB67AE858L)
00080 #define CAMELLIA_SIGMA2R ((u32)0x4CAA73B2L)
00081 #define CAMELLIA_SIGMA3L ((u32)0xC6EF372FL)
00082 #define CAMELLIA_SIGMA3R ((u32)0xE94F82BEL)
00083 #define CAMELLIA_SIGMA4L ((u32)0x54FF53A5L)
00084 #define CAMELLIA_SIGMA4R ((u32)0xF1D36F1CL)
00085 #define CAMELLIA_SIGMA5L ((u32)0x10E527FAL)
00086 #define CAMELLIA_SIGMA5R ((u32)0xDE682D1DL)
00087 #define CAMELLIA_SIGMA6L ((u32)0xB05688C2L)
00088 #define CAMELLIA_SIGMA6R ((u32)0xB3E6C1FDL)
00089 
00090 /*
00091  *  macros
00092  */
00093 
00094 
00095 #if defined(_MSC_VER)
00096 
00097 # define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
00098 # define GETU32(p) SWAP(*((u32 *)(p)))
00099 # define PUTU32(ct, st) {*((u32 *)(ct)) = SWAP((st));}
00100 
00101 #else /* not MS-VC */
00102 
00103 # define GETU32(pt)                \
00104     (((u32)(pt)[0] << 24)            \
00105      ^ ((u32)(pt)[1] << 16)            \
00106      ^ ((u32)(pt)[2] <<  8)            \
00107      ^ ((u32)(pt)[3]))
00108 
00109 # define PUTU32(ct, st)  {            \
00110     (ct)[0] = (u8)((st) >> 24);        \
00111     (ct)[1] = (u8)((st) >> 16);        \
00112     (ct)[2] = (u8)((st) >>  8);        \
00113     (ct)[3] = (u8)(st); }
00114 
00115 #endif
00116 
00117 #define CamelliaSubkeyL(INDEX) (subkey[(INDEX)*2])
00118 #define CamelliaSubkeyR(INDEX) (subkey[(INDEX)*2 + 1])
00119 
00120 /* rotation right shift 1byte */
00121 #define CAMELLIA_RR8(x) (((x) >> 8) + ((x) << 24))
00122 /* rotation left shift 1bit */
00123 #define CAMELLIA_RL1(x) (((x) << 1) + ((x) >> 31))
00124 /* rotation left shift 1byte */
00125 #define CAMELLIA_RL8(x) (((x) << 8) + ((x) >> 24))
00126 
00127 #define CAMELLIA_ROLDQ(ll, lr, rl, rr, w0, w1, bits)    \
00128     do {                        \
00129     w0 = ll;                    \
00130     ll = (ll << bits) + (lr >> (32 - bits));    \
00131     lr = (lr << bits) + (rl >> (32 - bits));    \
00132     rl = (rl << bits) + (rr >> (32 - bits));    \
00133     rr = (rr << bits) + (w0 >> (32 - bits));    \
00134     } while(0)
00135 
00136 #define CAMELLIA_ROLDQo32(ll, lr, rl, rr, w0, w1, bits)    \
00137     do {                        \
00138     w0 = ll;                    \
00139     w1 = lr;                    \
00140     ll = (lr << (bits - 32)) + (rl >> (64 - bits));    \
00141     lr = (rl << (bits - 32)) + (rr >> (64 - bits));    \
00142     rl = (rr << (bits - 32)) + (w0 >> (64 - bits));    \
00143     rr = (w0 << (bits - 32)) + (w1 >> (64 - bits));    \
00144     } while(0)
00145 
00146 #define CAMELLIA_SP1110(INDEX) (camellia_sp1110[(INDEX)])
00147 #define CAMELLIA_SP0222(INDEX) (camellia_sp0222[(INDEX)])
00148 #define CAMELLIA_SP3033(INDEX) (camellia_sp3033[(INDEX)])
00149 #define CAMELLIA_SP4404(INDEX) (camellia_sp4404[(INDEX)])
00150 
00151 #define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1)    \
00152     do {                            \
00153     il = xl ^ kl;                        \
00154     ir = xr ^ kr;                        \
00155     t0 = il >> 16;                        \
00156     t1 = ir >> 16;                        \
00157     yl = CAMELLIA_SP1110(ir & 0xff)                \
00158         ^ CAMELLIA_SP0222((t1 >> 8) & 0xff)            \
00159         ^ CAMELLIA_SP3033(t1 & 0xff)            \
00160         ^ CAMELLIA_SP4404((ir >> 8) & 0xff);        \
00161     yr = CAMELLIA_SP1110((t0 >> 8) & 0xff)            \
00162         ^ CAMELLIA_SP0222(t0 & 0xff)            \
00163         ^ CAMELLIA_SP3033((il >> 8) & 0xff)            \
00164         ^ CAMELLIA_SP4404(il & 0xff);            \
00165     yl ^= yr;                        \
00166     yr = CAMELLIA_RR8(yr);                    \
00167     yr ^= yl;                        \
00168     } while(0)
00169 
00170 
00171 /*
00172  * for speed up
00173  *
00174  */
00175 #define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \
00176     do {                                \
00177     t0 = kll;                            \
00178     t0 &= ll;                            \
00179     lr ^= CAMELLIA_RL1(t0);                        \
00180     t1 = klr;                            \
00181     t1 |= lr;                            \
00182     ll ^= t1;                            \
00183                                     \
00184     t2 = krr;                            \
00185     t2 |= rr;                            \
00186     rl ^= t2;                            \
00187     t3 = krl;                            \
00188     t3 &= rl;                            \
00189     rr ^= CAMELLIA_RL1(t3);                        \
00190     } while(0)
00191 
00192 #define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir, t0, t1)    \
00193     do {                                \
00194     ir = CAMELLIA_SP1110(xr & 0xff)                    \
00195         ^ CAMELLIA_SP0222((xr >> 24) & 0xff)            \
00196         ^ CAMELLIA_SP3033((xr >> 16) & 0xff)            \
00197         ^ CAMELLIA_SP4404((xr >> 8) & 0xff);            \
00198     il = CAMELLIA_SP1110((xl >> 24) & 0xff)                \
00199         ^ CAMELLIA_SP0222((xl >> 16) & 0xff)            \
00200         ^ CAMELLIA_SP3033((xl >> 8) & 0xff)                \
00201         ^ CAMELLIA_SP4404(xl & 0xff);                \
00202     il ^= kl;                            \
00203     ir ^= kr;                            \
00204     ir ^= il;                            \
00205     il = CAMELLIA_RR8(il);                        \
00206     il ^= ir;                            \
00207     yl ^= ir;                            \
00208     yr ^= il;                            \
00209     } while(0)
00210 
00211 
00212 static const u32 camellia_sp1110[256] = {
00213     0x70707000,0x82828200,0x2c2c2c00,0xececec00,
00214     0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500,
00215     0xe4e4e400,0x85858500,0x57575700,0x35353500,
00216     0xeaeaea00,0x0c0c0c00,0xaeaeae00,0x41414100,
00217     0x23232300,0xefefef00,0x6b6b6b00,0x93939300,
00218     0x45454500,0x19191900,0xa5a5a500,0x21212100,
00219     0xededed00,0x0e0e0e00,0x4f4f4f00,0x4e4e4e00,
00220     0x1d1d1d00,0x65656500,0x92929200,0xbdbdbd00,
00221     0x86868600,0xb8b8b800,0xafafaf00,0x8f8f8f00,
00222     0x7c7c7c00,0xebebeb00,0x1f1f1f00,0xcecece00,
00223     0x3e3e3e00,0x30303000,0xdcdcdc00,0x5f5f5f00,
00224     0x5e5e5e00,0xc5c5c500,0x0b0b0b00,0x1a1a1a00,
00225     0xa6a6a600,0xe1e1e100,0x39393900,0xcacaca00,
00226     0xd5d5d500,0x47474700,0x5d5d5d00,0x3d3d3d00,
00227     0xd9d9d900,0x01010100,0x5a5a5a00,0xd6d6d600,
00228     0x51515100,0x56565600,0x6c6c6c00,0x4d4d4d00,
00229     0x8b8b8b00,0x0d0d0d00,0x9a9a9a00,0x66666600,
00230     0xfbfbfb00,0xcccccc00,0xb0b0b000,0x2d2d2d00,
00231     0x74747400,0x12121200,0x2b2b2b00,0x20202000,
00232     0xf0f0f000,0xb1b1b100,0x84848400,0x99999900,
00233     0xdfdfdf00,0x4c4c4c00,0xcbcbcb00,0xc2c2c200,
00234     0x34343400,0x7e7e7e00,0x76767600,0x05050500,
00235     0x6d6d6d00,0xb7b7b700,0xa9a9a900,0x31313100,
00236     0xd1d1d100,0x17171700,0x04040400,0xd7d7d700,
00237     0x14141400,0x58585800,0x3a3a3a00,0x61616100,
00238     0xdedede00,0x1b1b1b00,0x11111100,0x1c1c1c00,
00239     0x32323200,0x0f0f0f00,0x9c9c9c00,0x16161600,
00240     0x53535300,0x18181800,0xf2f2f200,0x22222200,
00241     0xfefefe00,0x44444400,0xcfcfcf00,0xb2b2b200,
00242     0xc3c3c300,0xb5b5b500,0x7a7a7a00,0x91919100,
00243     0x24242400,0x08080800,0xe8e8e800,0xa8a8a800,
00244     0x60606000,0xfcfcfc00,0x69696900,0x50505000,
00245     0xaaaaaa00,0xd0d0d000,0xa0a0a000,0x7d7d7d00,
00246     0xa1a1a100,0x89898900,0x62626200,0x97979700,
00247     0x54545400,0x5b5b5b00,0x1e1e1e00,0x95959500,
00248     0xe0e0e000,0xffffff00,0x64646400,0xd2d2d200,
00249     0x10101000,0xc4c4c400,0x00000000,0x48484800,
00250     0xa3a3a300,0xf7f7f700,0x75757500,0xdbdbdb00,
00251     0x8a8a8a00,0x03030300,0xe6e6e600,0xdadada00,
00252     0x09090900,0x3f3f3f00,0xdddddd00,0x94949400,
00253     0x87878700,0x5c5c5c00,0x83838300,0x02020200,
00254     0xcdcdcd00,0x4a4a4a00,0x90909000,0x33333300,
00255     0x73737300,0x67676700,0xf6f6f600,0xf3f3f300,
00256     0x9d9d9d00,0x7f7f7f00,0xbfbfbf00,0xe2e2e200,
00257     0x52525200,0x9b9b9b00,0xd8d8d800,0x26262600,
00258     0xc8c8c800,0x37373700,0xc6c6c600,0x3b3b3b00,
00259     0x81818100,0x96969600,0x6f6f6f00,0x4b4b4b00,
00260     0x13131300,0xbebebe00,0x63636300,0x2e2e2e00,
00261     0xe9e9e900,0x79797900,0xa7a7a700,0x8c8c8c00,
00262     0x9f9f9f00,0x6e6e6e00,0xbcbcbc00,0x8e8e8e00,
00263     0x29292900,0xf5f5f500,0xf9f9f900,0xb6b6b600,
00264     0x2f2f2f00,0xfdfdfd00,0xb4b4b400,0x59595900,
00265     0x78787800,0x98989800,0x06060600,0x6a6a6a00,
00266     0xe7e7e700,0x46464600,0x71717100,0xbababa00,
00267     0xd4d4d400,0x25252500,0xababab00,0x42424200,
00268     0x88888800,0xa2a2a200,0x8d8d8d00,0xfafafa00,
00269     0x72727200,0x07070700,0xb9b9b900,0x55555500,
00270     0xf8f8f800,0xeeeeee00,0xacacac00,0x0a0a0a00,
00271     0x36363600,0x49494900,0x2a2a2a00,0x68686800,
00272     0x3c3c3c00,0x38383800,0xf1f1f100,0xa4a4a400,
00273     0x40404000,0x28282800,0xd3d3d300,0x7b7b7b00,
00274     0xbbbbbb00,0xc9c9c900,0x43434300,0xc1c1c100,
00275     0x15151500,0xe3e3e300,0xadadad00,0xf4f4f400,
00276     0x77777700,0xc7c7c700,0x80808000,0x9e9e9e00,
00277 };
00278 
00279 static const u32 camellia_sp0222[256] = {
00280     0x00e0e0e0,0x00050505,0x00585858,0x00d9d9d9,
00281     0x00676767,0x004e4e4e,0x00818181,0x00cbcbcb,
00282     0x00c9c9c9,0x000b0b0b,0x00aeaeae,0x006a6a6a,
00283     0x00d5d5d5,0x00181818,0x005d5d5d,0x00828282,
00284     0x00464646,0x00dfdfdf,0x00d6d6d6,0x00272727,
00285     0x008a8a8a,0x00323232,0x004b4b4b,0x00424242,
00286     0x00dbdbdb,0x001c1c1c,0x009e9e9e,0x009c9c9c,
00287     0x003a3a3a,0x00cacaca,0x00252525,0x007b7b7b,
00288     0x000d0d0d,0x00717171,0x005f5f5f,0x001f1f1f,
00289     0x00f8f8f8,0x00d7d7d7,0x003e3e3e,0x009d9d9d,
00290     0x007c7c7c,0x00606060,0x00b9b9b9,0x00bebebe,
00291     0x00bcbcbc,0x008b8b8b,0x00161616,0x00343434,
00292     0x004d4d4d,0x00c3c3c3,0x00727272,0x00959595,
00293     0x00ababab,0x008e8e8e,0x00bababa,0x007a7a7a,
00294     0x00b3b3b3,0x00020202,0x00b4b4b4,0x00adadad,
00295     0x00a2a2a2,0x00acacac,0x00d8d8d8,0x009a9a9a,
00296     0x00171717,0x001a1a1a,0x00353535,0x00cccccc,
00297     0x00f7f7f7,0x00999999,0x00616161,0x005a5a5a,
00298     0x00e8e8e8,0x00242424,0x00565656,0x00404040,
00299     0x00e1e1e1,0x00636363,0x00090909,0x00333333,
00300     0x00bfbfbf,0x00989898,0x00979797,0x00858585,
00301     0x00686868,0x00fcfcfc,0x00ececec,0x000a0a0a,
00302     0x00dadada,0x006f6f6f,0x00535353,0x00626262,
00303     0x00a3a3a3,0x002e2e2e,0x00080808,0x00afafaf,
00304     0x00282828,0x00b0b0b0,0x00747474,0x00c2c2c2,
00305     0x00bdbdbd,0x00363636,0x00222222,0x00383838,
00306     0x00646464,0x001e1e1e,0x00393939,0x002c2c2c,
00307     0x00a6a6a6,0x00303030,0x00e5e5e5,0x00444444,
00308     0x00fdfdfd,0x00888888,0x009f9f9f,0x00656565,
00309     0x00878787,0x006b6b6b,0x00f4f4f4,0x00232323,
00310     0x00484848,0x00101010,0x00d1d1d1,0x00515151,
00311     0x00c0c0c0,0x00f9f9f9,0x00d2d2d2,0x00a0a0a0,
00312     0x00555555,0x00a1a1a1,0x00414141,0x00fafafa,
00313     0x00434343,0x00131313,0x00c4c4c4,0x002f2f2f,
00314     0x00a8a8a8,0x00b6b6b6,0x003c3c3c,0x002b2b2b,
00315     0x00c1c1c1,0x00ffffff,0x00c8c8c8,0x00a5a5a5,
00316     0x00202020,0x00898989,0x00000000,0x00909090,
00317     0x00474747,0x00efefef,0x00eaeaea,0x00b7b7b7,
00318     0x00151515,0x00060606,0x00cdcdcd,0x00b5b5b5,
00319     0x00121212,0x007e7e7e,0x00bbbbbb,0x00292929,
00320     0x000f0f0f,0x00b8b8b8,0x00070707,0x00040404,
00321     0x009b9b9b,0x00949494,0x00212121,0x00666666,
00322     0x00e6e6e6,0x00cecece,0x00ededed,0x00e7e7e7,
00323     0x003b3b3b,0x00fefefe,0x007f7f7f,0x00c5c5c5,
00324     0x00a4a4a4,0x00373737,0x00b1b1b1,0x004c4c4c,
00325     0x00919191,0x006e6e6e,0x008d8d8d,0x00767676,
00326     0x00030303,0x002d2d2d,0x00dedede,0x00969696,
00327     0x00262626,0x007d7d7d,0x00c6c6c6,0x005c5c5c,
00328     0x00d3d3d3,0x00f2f2f2,0x004f4f4f,0x00191919,
00329     0x003f3f3f,0x00dcdcdc,0x00797979,0x001d1d1d,
00330     0x00525252,0x00ebebeb,0x00f3f3f3,0x006d6d6d,
00331     0x005e5e5e,0x00fbfbfb,0x00696969,0x00b2b2b2,
00332     0x00f0f0f0,0x00313131,0x000c0c0c,0x00d4d4d4,
00333     0x00cfcfcf,0x008c8c8c,0x00e2e2e2,0x00757575,
00334     0x00a9a9a9,0x004a4a4a,0x00575757,0x00848484,
00335     0x00111111,0x00454545,0x001b1b1b,0x00f5f5f5,
00336     0x00e4e4e4,0x000e0e0e,0x00737373,0x00aaaaaa,
00337     0x00f1f1f1,0x00dddddd,0x00595959,0x00141414,
00338     0x006c6c6c,0x00929292,0x00545454,0x00d0d0d0,
00339     0x00787878,0x00707070,0x00e3e3e3,0x00494949,
00340     0x00808080,0x00505050,0x00a7a7a7,0x00f6f6f6,
00341     0x00777777,0x00939393,0x00868686,0x00838383,
00342     0x002a2a2a,0x00c7c7c7,0x005b5b5b,0x00e9e9e9,
00343     0x00eeeeee,0x008f8f8f,0x00010101,0x003d3d3d,
00344 };
00345 
00346 static const u32 camellia_sp3033[256] = {
00347     0x38003838,0x41004141,0x16001616,0x76007676,
00348     0xd900d9d9,0x93009393,0x60006060,0xf200f2f2,
00349     0x72007272,0xc200c2c2,0xab00abab,0x9a009a9a,
00350     0x75007575,0x06000606,0x57005757,0xa000a0a0,
00351     0x91009191,0xf700f7f7,0xb500b5b5,0xc900c9c9,
00352     0xa200a2a2,0x8c008c8c,0xd200d2d2,0x90009090,
00353     0xf600f6f6,0x07000707,0xa700a7a7,0x27002727,
00354     0x8e008e8e,0xb200b2b2,0x49004949,0xde00dede,
00355     0x43004343,0x5c005c5c,0xd700d7d7,0xc700c7c7,
00356     0x3e003e3e,0xf500f5f5,0x8f008f8f,0x67006767,
00357     0x1f001f1f,0x18001818,0x6e006e6e,0xaf00afaf,
00358     0x2f002f2f,0xe200e2e2,0x85008585,0x0d000d0d,
00359     0x53005353,0xf000f0f0,0x9c009c9c,0x65006565,
00360     0xea00eaea,0xa300a3a3,0xae00aeae,0x9e009e9e,
00361     0xec00ecec,0x80008080,0x2d002d2d,0x6b006b6b,
00362     0xa800a8a8,0x2b002b2b,0x36003636,0xa600a6a6,
00363     0xc500c5c5,0x86008686,0x4d004d4d,0x33003333,
00364     0xfd00fdfd,0x66006666,0x58005858,0x96009696,
00365     0x3a003a3a,0x09000909,0x95009595,0x10001010,
00366     0x78007878,0xd800d8d8,0x42004242,0xcc00cccc,
00367     0xef00efef,0x26002626,0xe500e5e5,0x61006161,
00368     0x1a001a1a,0x3f003f3f,0x3b003b3b,0x82008282,
00369     0xb600b6b6,0xdb00dbdb,0xd400d4d4,0x98009898,
00370     0xe800e8e8,0x8b008b8b,0x02000202,0xeb00ebeb,
00371     0x0a000a0a,0x2c002c2c,0x1d001d1d,0xb000b0b0,
00372     0x6f006f6f,0x8d008d8d,0x88008888,0x0e000e0e,
00373     0x19001919,0x87008787,0x4e004e4e,0x0b000b0b,
00374     0xa900a9a9,0x0c000c0c,0x79007979,0x11001111,
00375     0x7f007f7f,0x22002222,0xe700e7e7,0x59005959,
00376     0xe100e1e1,0xda00dada,0x3d003d3d,0xc800c8c8,
00377     0x12001212,0x04000404,0x74007474,0x54005454,
00378     0x30003030,0x7e007e7e,0xb400b4b4,0x28002828,
00379     0x55005555,0x68006868,0x50005050,0xbe00bebe,
00380     0xd000d0d0,0xc400c4c4,0x31003131,0xcb00cbcb,
00381     0x2a002a2a,0xad00adad,0x0f000f0f,0xca00caca,
00382     0x70007070,0xff00ffff,0x32003232,0x69006969,
00383     0x08000808,0x62006262,0x00000000,0x24002424,
00384     0xd100d1d1,0xfb00fbfb,0xba00baba,0xed00eded,
00385     0x45004545,0x81008181,0x73007373,0x6d006d6d,
00386     0x84008484,0x9f009f9f,0xee00eeee,0x4a004a4a,
00387     0xc300c3c3,0x2e002e2e,0xc100c1c1,0x01000101,
00388     0xe600e6e6,0x25002525,0x48004848,0x99009999,
00389     0xb900b9b9,0xb300b3b3,0x7b007b7b,0xf900f9f9,
00390     0xce00cece,0xbf00bfbf,0xdf00dfdf,0x71007171,
00391     0x29002929,0xcd00cdcd,0x6c006c6c,0x13001313,
00392     0x64006464,0x9b009b9b,0x63006363,0x9d009d9d,
00393     0xc000c0c0,0x4b004b4b,0xb700b7b7,0xa500a5a5,
00394     0x89008989,0x5f005f5f,0xb100b1b1,0x17001717,
00395     0xf400f4f4,0xbc00bcbc,0xd300d3d3,0x46004646,
00396     0xcf00cfcf,0x37003737,0x5e005e5e,0x47004747,
00397     0x94009494,0xfa00fafa,0xfc00fcfc,0x5b005b5b,
00398     0x97009797,0xfe00fefe,0x5a005a5a,0xac00acac,
00399     0x3c003c3c,0x4c004c4c,0x03000303,0x35003535,
00400     0xf300f3f3,0x23002323,0xb800b8b8,0x5d005d5d,
00401     0x6a006a6a,0x92009292,0xd500d5d5,0x21002121,
00402     0x44004444,0x51005151,0xc600c6c6,0x7d007d7d,
00403     0x39003939,0x83008383,0xdc00dcdc,0xaa00aaaa,
00404     0x7c007c7c,0x77007777,0x56005656,0x05000505,
00405     0x1b001b1b,0xa400a4a4,0x15001515,0x34003434,
00406     0x1e001e1e,0x1c001c1c,0xf800f8f8,0x52005252,
00407     0x20002020,0x14001414,0xe900e9e9,0xbd00bdbd,
00408     0xdd00dddd,0xe400e4e4,0xa100a1a1,0xe000e0e0,
00409     0x8a008a8a,0xf100f1f1,0xd600d6d6,0x7a007a7a,
00410     0xbb00bbbb,0xe300e3e3,0x40004040,0x4f004f4f,
00411 };
00412 
00413 static const u32 camellia_sp4404[256] = {
00414     0x70700070,0x2c2c002c,0xb3b300b3,0xc0c000c0,
00415     0xe4e400e4,0x57570057,0xeaea00ea,0xaeae00ae,
00416     0x23230023,0x6b6b006b,0x45450045,0xa5a500a5,
00417     0xeded00ed,0x4f4f004f,0x1d1d001d,0x92920092,
00418     0x86860086,0xafaf00af,0x7c7c007c,0x1f1f001f,
00419     0x3e3e003e,0xdcdc00dc,0x5e5e005e,0x0b0b000b,
00420     0xa6a600a6,0x39390039,0xd5d500d5,0x5d5d005d,
00421     0xd9d900d9,0x5a5a005a,0x51510051,0x6c6c006c,
00422     0x8b8b008b,0x9a9a009a,0xfbfb00fb,0xb0b000b0,
00423     0x74740074,0x2b2b002b,0xf0f000f0,0x84840084,
00424     0xdfdf00df,0xcbcb00cb,0x34340034,0x76760076,
00425     0x6d6d006d,0xa9a900a9,0xd1d100d1,0x04040004,
00426     0x14140014,0x3a3a003a,0xdede00de,0x11110011,
00427     0x32320032,0x9c9c009c,0x53530053,0xf2f200f2,
00428     0xfefe00fe,0xcfcf00cf,0xc3c300c3,0x7a7a007a,
00429     0x24240024,0xe8e800e8,0x60600060,0x69690069,
00430     0xaaaa00aa,0xa0a000a0,0xa1a100a1,0x62620062,
00431     0x54540054,0x1e1e001e,0xe0e000e0,0x64640064,
00432     0x10100010,0x00000000,0xa3a300a3,0x75750075,
00433     0x8a8a008a,0xe6e600e6,0x09090009,0xdddd00dd,
00434     0x87870087,0x83830083,0xcdcd00cd,0x90900090,
00435     0x73730073,0xf6f600f6,0x9d9d009d,0xbfbf00bf,
00436     0x52520052,0xd8d800d8,0xc8c800c8,0xc6c600c6,
00437     0x81810081,0x6f6f006f,0x13130013,0x63630063,
00438     0xe9e900e9,0xa7a700a7,0x9f9f009f,0xbcbc00bc,
00439     0x29290029,0xf9f900f9,0x2f2f002f,0xb4b400b4,
00440     0x78780078,0x06060006,0xe7e700e7,0x71710071,
00441     0xd4d400d4,0xabab00ab,0x88880088,0x8d8d008d,
00442     0x72720072,0xb9b900b9,0xf8f800f8,0xacac00ac,
00443     0x36360036,0x2a2a002a,0x3c3c003c,0xf1f100f1,
00444     0x40400040,0xd3d300d3,0xbbbb00bb,0x43430043,
00445     0x15150015,0xadad00ad,0x77770077,0x80800080,
00446     0x82820082,0xecec00ec,0x27270027,0xe5e500e5,
00447     0x85850085,0x35350035,0x0c0c000c,0x41410041,
00448     0xefef00ef,0x93930093,0x19190019,0x21210021,
00449     0x0e0e000e,0x4e4e004e,0x65650065,0xbdbd00bd,
00450     0xb8b800b8,0x8f8f008f,0xebeb00eb,0xcece00ce,
00451     0x30300030,0x5f5f005f,0xc5c500c5,0x1a1a001a,
00452     0xe1e100e1,0xcaca00ca,0x47470047,0x3d3d003d,
00453     0x01010001,0xd6d600d6,0x56560056,0x4d4d004d,
00454     0x0d0d000d,0x66660066,0xcccc00cc,0x2d2d002d,
00455     0x12120012,0x20200020,0xb1b100b1,0x99990099,
00456     0x4c4c004c,0xc2c200c2,0x7e7e007e,0x05050005,
00457     0xb7b700b7,0x31310031,0x17170017,0xd7d700d7,
00458     0x58580058,0x61610061,0x1b1b001b,0x1c1c001c,
00459     0x0f0f000f,0x16160016,0x18180018,0x22220022,
00460     0x44440044,0xb2b200b2,0xb5b500b5,0x91910091,
00461     0x08080008,0xa8a800a8,0xfcfc00fc,0x50500050,
00462     0xd0d000d0,0x7d7d007d,0x89890089,0x97970097,
00463     0x5b5b005b,0x95950095,0xffff00ff,0xd2d200d2,
00464     0xc4c400c4,0x48480048,0xf7f700f7,0xdbdb00db,
00465     0x03030003,0xdada00da,0x3f3f003f,0x94940094,
00466     0x5c5c005c,0x02020002,0x4a4a004a,0x33330033,
00467     0x67670067,0xf3f300f3,0x7f7f007f,0xe2e200e2,
00468     0x9b9b009b,0x26260026,0x37370037,0x3b3b003b,
00469     0x96960096,0x4b4b004b,0xbebe00be,0x2e2e002e,
00470     0x79790079,0x8c8c008c,0x6e6e006e,0x8e8e008e,
00471     0xf5f500f5,0xb6b600b6,0xfdfd00fd,0x59590059,
00472     0x98980098,0x6a6a006a,0x46460046,0xbaba00ba,
00473     0x25250025,0x42420042,0xa2a200a2,0xfafa00fa,
00474     0x07070007,0x55550055,0xeeee00ee,0x0a0a000a,
00475     0x49490049,0x68680068,0x38380038,0xa4a400a4,
00476     0x28280028,0x7b7b007b,0xc9c900c9,0xc1c100c1,
00477     0xe3e300e3,0xf4f400f4,0xc7c700c7,0x9e9e009e,
00478 };
00479 
00480 
00481 /**
00482  * Stuff related to the Camellia key schedule
00483  */
00484 #define subl(x) subL[(x)]
00485 #define subr(x) subR[(x)]
00486 
00487 static void camellia_setup128(const unsigned char *key, u32 *subkey)
00488 {
00489     u32 kll, klr, krl, krr;
00490     u32 il, ir, t0, t1, w0, w1;
00491     u32 kw4l, kw4r, dw, tl, tr;
00492     u32 subL[26];
00493     u32 subR[26];
00494 
00495     /**
00496      *  k == kll || klr || krl || krr (|| is concatination)
00497      */
00498     kll = GETU32(key     );
00499     klr = GETU32(key +  4);
00500     krl = GETU32(key +  8);
00501     krr = GETU32(key + 12);
00502     /**
00503      * generate KL dependent subkeys
00504      */
00505     subl(0) = kll; subr(0) = klr;
00506     subl(1) = krl; subr(1) = krr;
00507     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
00508     subl(4) = kll; subr(4) = klr;
00509     subl(5) = krl; subr(5) = krr;
00510     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30);
00511     subl(10) = kll; subr(10) = klr;
00512     subl(11) = krl; subr(11) = krr;
00513     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
00514     subl(13) = krl; subr(13) = krr;
00515     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
00516     subl(16) = kll; subr(16) = klr;
00517     subl(17) = krl; subr(17) = krr;
00518     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
00519     subl(18) = kll; subr(18) = klr;
00520     subl(19) = krl; subr(19) = krr;
00521     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
00522     subl(22) = kll; subr(22) = klr;
00523     subl(23) = krl; subr(23) = krr;
00524 
00525     /* generate KA */
00526     kll = subl(0); klr = subr(0);
00527     krl = subl(1); krr = subr(1);
00528     CAMELLIA_F(kll, klr,
00529            CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
00530            w0, w1, il, ir, t0, t1);
00531     krl ^= w0; krr ^= w1;
00532     CAMELLIA_F(krl, krr,
00533            CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
00534            kll, klr, il, ir, t0, t1);
00535     CAMELLIA_F(kll, klr,
00536            CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
00537            krl, krr, il, ir, t0, t1);
00538     krl ^= w0; krr ^= w1;
00539     CAMELLIA_F(krl, krr,
00540            CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
00541            w0, w1, il, ir, t0, t1);
00542     kll ^= w0; klr ^= w1;
00543 
00544     /* generate KA dependent subkeys */
00545     subl(2) = kll; subr(2) = klr;
00546     subl(3) = krl; subr(3) = krr;
00547     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
00548     subl(6) = kll; subr(6) = klr;
00549     subl(7) = krl; subr(7) = krr;
00550     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
00551     subl(8) = kll; subr(8) = klr;
00552     subl(9) = krl; subr(9) = krr;
00553     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
00554     subl(12) = kll; subr(12) = klr;
00555     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
00556     subl(14) = kll; subr(14) = klr;
00557     subl(15) = krl; subr(15) = krr;
00558     CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
00559     subl(20) = kll; subr(20) = klr;
00560     subl(21) = krl; subr(21) = krr;
00561     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
00562     subl(24) = kll; subr(24) = klr;
00563     subl(25) = krl; subr(25) = krr;
00564 
00565 
00566     /* absorb kw2 to other subkeys */
00567     subl(3) ^= subl(1); subr(3) ^= subr(1);
00568     subl(5) ^= subl(1); subr(5) ^= subr(1);
00569     subl(7) ^= subl(1); subr(7) ^= subr(1);
00570     subl(1) ^= subr(1) & ~subr(9);
00571     dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw);
00572     subl(11) ^= subl(1); subr(11) ^= subr(1);
00573     subl(13) ^= subl(1); subr(13) ^= subr(1);
00574     subl(15) ^= subl(1); subr(15) ^= subr(1);
00575     subl(1) ^= subr(1) & ~subr(17);
00576     dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw);
00577     subl(19) ^= subl(1); subr(19) ^= subr(1);
00578     subl(21) ^= subl(1); subr(21) ^= subr(1);
00579     subl(23) ^= subl(1); subr(23) ^= subr(1);
00580     subl(24) ^= subl(1); subr(24) ^= subr(1);
00581 
00582     /* absorb kw4 to other subkeys */
00583     kw4l = subl(25); kw4r = subr(25);
00584     subl(22) ^= kw4l; subr(22) ^= kw4r;
00585     subl(20) ^= kw4l; subr(20) ^= kw4r;
00586     subl(18) ^= kw4l; subr(18) ^= kw4r;
00587     kw4l ^= kw4r & ~subr(16);
00588     dw = kw4l & subl(16), kw4r ^= CAMELLIA_RL1(dw);
00589     subl(14) ^= kw4l; subr(14) ^= kw4r;
00590     subl(12) ^= kw4l; subr(12) ^= kw4r;
00591     subl(10) ^= kw4l; subr(10) ^= kw4r;
00592     kw4l ^= kw4r & ~subr(8);
00593     dw = kw4l & subl(8), kw4r ^= CAMELLIA_RL1(dw);
00594     subl(6) ^= kw4l; subr(6) ^= kw4r;
00595     subl(4) ^= kw4l; subr(4) ^= kw4r;
00596     subl(2) ^= kw4l; subr(2) ^= kw4r;
00597     subl(0) ^= kw4l; subr(0) ^= kw4r;
00598 
00599     /* key XOR is end of F-function */
00600     CamelliaSubkeyL(0) = subl(0) ^ subl(2);
00601     CamelliaSubkeyR(0) = subr(0) ^ subr(2);
00602     CamelliaSubkeyL(2) = subl(3);
00603     CamelliaSubkeyR(2) = subr(3);
00604     CamelliaSubkeyL(3) = subl(2) ^ subl(4);
00605     CamelliaSubkeyR(3) = subr(2) ^ subr(4);
00606     CamelliaSubkeyL(4) = subl(3) ^ subl(5);
00607     CamelliaSubkeyR(4) = subr(3) ^ subr(5);
00608     CamelliaSubkeyL(5) = subl(4) ^ subl(6);
00609     CamelliaSubkeyR(5) = subr(4) ^ subr(6);
00610     CamelliaSubkeyL(6) = subl(5) ^ subl(7);
00611     CamelliaSubkeyR(6) = subr(5) ^ subr(7);
00612     tl = subl(10) ^ (subr(10) & ~subr(8));
00613     dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw);
00614     CamelliaSubkeyL(7) = subl(6) ^ tl;
00615     CamelliaSubkeyR(7) = subr(6) ^ tr;
00616     CamelliaSubkeyL(8) = subl(8);
00617     CamelliaSubkeyR(8) = subr(8);
00618     CamelliaSubkeyL(9) = subl(9);
00619     CamelliaSubkeyR(9) = subr(9);
00620     tl = subl(7) ^ (subr(7) & ~subr(9));
00621     dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw);
00622     CamelliaSubkeyL(10) = tl ^ subl(11);
00623     CamelliaSubkeyR(10) = tr ^ subr(11);
00624     CamelliaSubkeyL(11) = subl(10) ^ subl(12);
00625     CamelliaSubkeyR(11) = subr(10) ^ subr(12);
00626     CamelliaSubkeyL(12) = subl(11) ^ subl(13);
00627     CamelliaSubkeyR(12) = subr(11) ^ subr(13);
00628     CamelliaSubkeyL(13) = subl(12) ^ subl(14);
00629     CamelliaSubkeyR(13) = subr(12) ^ subr(14);
00630     CamelliaSubkeyL(14) = subl(13) ^ subl(15);
00631     CamelliaSubkeyR(14) = subr(13) ^ subr(15);
00632     tl = subl(18) ^ (subr(18) & ~subr(16));
00633     dw = tl & subl(16),    tr = subr(18) ^ CAMELLIA_RL1(dw);
00634     CamelliaSubkeyL(15) = subl(14) ^ tl;
00635     CamelliaSubkeyR(15) = subr(14) ^ tr;
00636     CamelliaSubkeyL(16) = subl(16);
00637     CamelliaSubkeyR(16) = subr(16);
00638     CamelliaSubkeyL(17) = subl(17);
00639     CamelliaSubkeyR(17) = subr(17);
00640     tl = subl(15) ^ (subr(15) & ~subr(17));
00641     dw = tl & subl(17),    tr = subr(15) ^ CAMELLIA_RL1(dw);
00642     CamelliaSubkeyL(18) = tl ^ subl(19);
00643     CamelliaSubkeyR(18) = tr ^ subr(19);
00644     CamelliaSubkeyL(19) = subl(18) ^ subl(20);
00645     CamelliaSubkeyR(19) = subr(18) ^ subr(20);
00646     CamelliaSubkeyL(20) = subl(19) ^ subl(21);
00647     CamelliaSubkeyR(20) = subr(19) ^ subr(21);
00648     CamelliaSubkeyL(21) = subl(20) ^ subl(22);
00649     CamelliaSubkeyR(21) = subr(20) ^ subr(22);
00650     CamelliaSubkeyL(22) = subl(21) ^ subl(23);
00651     CamelliaSubkeyR(22) = subr(21) ^ subr(23);
00652     CamelliaSubkeyL(23) = subl(22);
00653     CamelliaSubkeyR(23) = subr(22);
00654     CamelliaSubkeyL(24) = subl(24) ^ subl(23);
00655     CamelliaSubkeyR(24) = subr(24) ^ subr(23);
00656 
00657     /* apply the inverse of the last half of P-function */
00658     dw = CamelliaSubkeyL(2) ^ CamelliaSubkeyR(2), dw = CAMELLIA_RL8(dw);
00659     CamelliaSubkeyR(2) = CamelliaSubkeyL(2) ^ dw, CamelliaSubkeyL(2) = dw;
00660     dw = CamelliaSubkeyL(3) ^ CamelliaSubkeyR(3), dw = CAMELLIA_RL8(dw);
00661     CamelliaSubkeyR(3) = CamelliaSubkeyL(3) ^ dw, CamelliaSubkeyL(3) = dw;
00662     dw = CamelliaSubkeyL(4) ^ CamelliaSubkeyR(4), dw = CAMELLIA_RL8(dw);
00663     CamelliaSubkeyR(4) = CamelliaSubkeyL(4) ^ dw, CamelliaSubkeyL(4) = dw;
00664     dw = CamelliaSubkeyL(5) ^ CamelliaSubkeyR(5), dw = CAMELLIA_RL8(dw);
00665     CamelliaSubkeyR(5) = CamelliaSubkeyL(5) ^ dw, CamelliaSubkeyL(5) = dw;
00666     dw = CamelliaSubkeyL(6) ^ CamelliaSubkeyR(6), dw = CAMELLIA_RL8(dw);
00667     CamelliaSubkeyR(6) = CamelliaSubkeyL(6) ^ dw, CamelliaSubkeyL(6) = dw;
00668     dw = CamelliaSubkeyL(7) ^ CamelliaSubkeyR(7), dw = CAMELLIA_RL8(dw);
00669     CamelliaSubkeyR(7) = CamelliaSubkeyL(7) ^ dw, CamelliaSubkeyL(7) = dw;
00670     dw = CamelliaSubkeyL(10) ^ CamelliaSubkeyR(10), dw = CAMELLIA_RL8(dw);
00671     CamelliaSubkeyR(10) = CamelliaSubkeyL(10) ^ dw, CamelliaSubkeyL(10) = dw;
00672     dw = CamelliaSubkeyL(11) ^ CamelliaSubkeyR(11), dw = CAMELLIA_RL8(dw);
00673     CamelliaSubkeyR(11) = CamelliaSubkeyL(11) ^ dw, CamelliaSubkeyL(11) = dw;
00674     dw = CamelliaSubkeyL(12) ^ CamelliaSubkeyR(12), dw = CAMELLIA_RL8(dw);
00675     CamelliaSubkeyR(12) = CamelliaSubkeyL(12) ^ dw, CamelliaSubkeyL(12) = dw;
00676     dw = CamelliaSubkeyL(13) ^ CamelliaSubkeyR(13), dw = CAMELLIA_RL8(dw);
00677     CamelliaSubkeyR(13) = CamelliaSubkeyL(13) ^ dw, CamelliaSubkeyL(13) = dw;
00678     dw = CamelliaSubkeyL(14) ^ CamelliaSubkeyR(14), dw = CAMELLIA_RL8(dw);
00679     CamelliaSubkeyR(14) = CamelliaSubkeyL(14) ^ dw, CamelliaSubkeyL(14) = dw;
00680     dw = CamelliaSubkeyL(15) ^ CamelliaSubkeyR(15), dw = CAMELLIA_RL8(dw);
00681     CamelliaSubkeyR(15) = CamelliaSubkeyL(15) ^ dw, CamelliaSubkeyL(15) = dw;
00682     dw = CamelliaSubkeyL(18) ^ CamelliaSubkeyR(18), dw = CAMELLIA_RL8(dw);
00683     CamelliaSubkeyR(18) = CamelliaSubkeyL(18) ^ dw, CamelliaSubkeyL(18) = dw;
00684     dw = CamelliaSubkeyL(19) ^ CamelliaSubkeyR(19), dw = CAMELLIA_RL8(dw);
00685     CamelliaSubkeyR(19) = CamelliaSubkeyL(19) ^ dw, CamelliaSubkeyL(19) = dw;
00686     dw = CamelliaSubkeyL(20) ^ CamelliaSubkeyR(20), dw = CAMELLIA_RL8(dw);
00687     CamelliaSubkeyR(20) = CamelliaSubkeyL(20) ^ dw, CamelliaSubkeyL(20) = dw;
00688     dw = CamelliaSubkeyL(21) ^ CamelliaSubkeyR(21), dw = CAMELLIA_RL8(dw);
00689     CamelliaSubkeyR(21) = CamelliaSubkeyL(21) ^ dw, CamelliaSubkeyL(21) = dw;
00690     dw = CamelliaSubkeyL(22) ^ CamelliaSubkeyR(22), dw = CAMELLIA_RL8(dw);
00691     CamelliaSubkeyR(22) = CamelliaSubkeyL(22) ^ dw, CamelliaSubkeyL(22) = dw;
00692     dw = CamelliaSubkeyL(23) ^ CamelliaSubkeyR(23), dw = CAMELLIA_RL8(dw);
00693     CamelliaSubkeyR(23) = CamelliaSubkeyL(23) ^ dw, CamelliaSubkeyL(23) = dw;
00694 
00695     return;
00696 }
00697 
00698 static void camellia_setup256(const unsigned char *key, u32 *subkey)
00699 {
00700     u32 kll,klr,krl,krr;           /* left half of key */
00701     u32 krll,krlr,krrl,krrr;       /* right half of key */
00702     u32 il, ir, t0, t1, w0, w1;    /* temporary variables */
00703     u32 kw4l, kw4r, dw, tl, tr;
00704     u32 subL[34];
00705     u32 subR[34];
00706 
00707     /**
00708      *  key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
00709      *  (|| is concatination)
00710      */
00711 
00712     kll  = GETU32(key     );
00713     klr  = GETU32(key +  4);
00714     krl  = GETU32(key +  8);
00715     krr  = GETU32(key + 12);
00716     krll = GETU32(key + 16);
00717     krlr = GETU32(key + 20);
00718     krrl = GETU32(key + 24);
00719     krrr = GETU32(key + 28);
00720 
00721     /* generate KL dependent subkeys */
00722     subl(0) = kll; subr(0) = klr;
00723     subl(1) = krl; subr(1) = krr;
00724     CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
00725     subl(12) = kll; subr(12) = klr;
00726     subl(13) = krl; subr(13) = krr;
00727     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
00728     subl(16) = kll; subr(16) = klr;
00729     subl(17) = krl; subr(17) = krr;
00730     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
00731     subl(22) = kll; subr(22) = klr;
00732     subl(23) = krl; subr(23) = krr;
00733     CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
00734     subl(30) = kll; subr(30) = klr;
00735     subl(31) = krl; subr(31) = krr;
00736 
00737     /* generate KR dependent subkeys */
00738     CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
00739     subl(4) = krll; subr(4) = krlr;
00740     subl(5) = krrl; subr(5) = krrr;
00741     CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
00742     subl(8) = krll; subr(8) = krlr;
00743     subl(9) = krrl; subr(9) = krrr;
00744     CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
00745     subl(18) = krll; subr(18) = krlr;
00746     subl(19) = krrl; subr(19) = krrr;
00747     CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
00748     subl(26) = krll; subr(26) = krlr;
00749     subl(27) = krrl; subr(27) = krrr;
00750     CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
00751 
00752     /* generate KA */
00753     kll = subl(0) ^ krll; klr = subr(0) ^ krlr;
00754     krl = subl(1) ^ krrl; krr = subr(1) ^ krrr;
00755     CAMELLIA_F(kll, klr,
00756            CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
00757            w0, w1, il, ir, t0, t1);
00758     krl ^= w0; krr ^= w1;
00759     CAMELLIA_F(krl, krr,
00760            CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
00761            kll, klr, il, ir, t0, t1);
00762     kll ^= krll; klr ^= krlr;
00763     CAMELLIA_F(kll, klr,
00764            CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
00765            krl, krr, il, ir, t0, t1);
00766     krl ^= w0 ^ krrl; krr ^= w1 ^ krrr;
00767     CAMELLIA_F(krl, krr,
00768            CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
00769            w0, w1, il, ir, t0, t1);
00770     kll ^= w0; klr ^= w1;
00771 
00772     /* generate KB */
00773     krll ^= kll; krlr ^= klr;
00774     krrl ^= krl; krrr ^= krr;
00775     CAMELLIA_F(krll, krlr,
00776            CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R,
00777            w0, w1, il, ir, t0, t1);
00778     krrl ^= w0; krrr ^= w1;
00779     CAMELLIA_F(krrl, krrr,
00780            CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R,
00781            w0, w1, il, ir, t0, t1);
00782     krll ^= w0; krlr ^= w1;
00783 
00784     /* generate KA dependent subkeys */
00785     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
00786     subl(6) = kll; subr(6) = klr;
00787     subl(7) = krl; subr(7) = krr;
00788     CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30);
00789     subl(14) = kll; subr(14) = klr;
00790     subl(15) = krl; subr(15) = krr;
00791     subl(24) = klr; subr(24) = krl;
00792     subl(25) = krr; subr(25) = kll;
00793     CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
00794     subl(28) = kll; subr(28) = klr;
00795     subl(29) = krl; subr(29) = krr;
00796 
00797     /* generate KB dependent subkeys */
00798     subl(2) = krll; subr(2) = krlr;
00799     subl(3) = krrl; subr(3) = krrr;
00800     CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
00801     subl(10) = krll; subr(10) = krlr;
00802     subl(11) = krrl; subr(11) = krrr;
00803     CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
00804     subl(20) = krll; subr(20) = krlr;
00805     subl(21) = krrl; subr(21) = krrr;
00806     CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
00807     subl(32) = krll; subr(32) = krlr;
00808     subl(33) = krrl; subr(33) = krrr;
00809 
00810     /* absorb kw2 to other subkeys */
00811     subl(3) ^= subl(1); subr(3) ^= subr(1);
00812     subl(5) ^= subl(1); subr(5) ^= subr(1);
00813     subl(7) ^= subl(1); subr(7) ^= subr(1);
00814     subl(1) ^= subr(1) & ~subr(9);
00815     dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw);
00816     subl(11) ^= subl(1); subr(11) ^= subr(1);
00817     subl(13) ^= subl(1); subr(13) ^= subr(1);
00818     subl(15) ^= subl(1); subr(15) ^= subr(1);
00819     subl(1) ^= subr(1) & ~subr(17);
00820     dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw);
00821     subl(19) ^= subl(1); subr(19) ^= subr(1);
00822     subl(21) ^= subl(1); subr(21) ^= subr(1);
00823     subl(23) ^= subl(1); subr(23) ^= subr(1);
00824     subl(1) ^= subr(1) & ~subr(25);
00825     dw = subl(1) & subl(25), subr(1) ^= CAMELLIA_RL1(dw);
00826     subl(27) ^= subl(1); subr(27) ^= subr(1);
00827     subl(29) ^= subl(1); subr(29) ^= subr(1);
00828     subl(31) ^= subl(1); subr(31) ^= subr(1);
00829     subl(32) ^= subl(1); subr(32) ^= subr(1);
00830 
00831     /* absorb kw4 to other subkeys */
00832     kw4l = subl(33); kw4r = subr(33);
00833     subl(30) ^= kw4l; subr(30) ^= kw4r;
00834     subl(28) ^= kw4l; subr(28) ^= kw4r;
00835     subl(26) ^= kw4l; subr(26) ^= kw4r;
00836     kw4l ^= kw4r & ~subr(24);
00837     dw = kw4l & subl(24), kw4r ^= CAMELLIA_RL1(dw);
00838     subl(22) ^= kw4l; subr(22) ^= kw4r;
00839     subl(20) ^= kw4l; subr(20) ^= kw4r;
00840     subl(18) ^= kw4l; subr(18) ^= kw4r;
00841     kw4l ^= kw4r & ~subr(16);
00842     dw = kw4l & subl(16), kw4r ^= CAMELLIA_RL1(dw);
00843     subl(14) ^= kw4l; subr(14) ^= kw4r;
00844     subl(12) ^= kw4l; subr(12) ^= kw4r;
00845     subl(10) ^= kw4l; subr(10) ^= kw4r;
00846     kw4l ^= kw4r & ~subr(8);
00847     dw = kw4l & subl(8), kw4r ^= CAMELLIA_RL1(dw);
00848     subl(6) ^= kw4l; subr(6) ^= kw4r;
00849     subl(4) ^= kw4l; subr(4) ^= kw4r;
00850     subl(2) ^= kw4l; subr(2) ^= kw4r;
00851     subl(0) ^= kw4l; subr(0) ^= kw4r;
00852 
00853     /* key XOR is end of F-function */
00854     CamelliaSubkeyL(0) = subl(0) ^ subl(2);
00855     CamelliaSubkeyR(0) = subr(0) ^ subr(2);
00856     CamelliaSubkeyL(2) = subl(3);
00857     CamelliaSubkeyR(2) = subr(3);
00858     CamelliaSubkeyL(3) = subl(2) ^ subl(4);
00859     CamelliaSubkeyR(3) = subr(2) ^ subr(4);
00860     CamelliaSubkeyL(4) = subl(3) ^ subl(5);
00861     CamelliaSubkeyR(4) = subr(3) ^ subr(5);
00862     CamelliaSubkeyL(5) = subl(4) ^ subl(6);
00863     CamelliaSubkeyR(5) = subr(4) ^ subr(6);
00864     CamelliaSubkeyL(6) = subl(5) ^ subl(7);
00865     CamelliaSubkeyR(6) = subr(5) ^ subr(7);
00866     tl = subl(10) ^ (subr(10) & ~subr(8));
00867     dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw);
00868     CamelliaSubkeyL(7) = subl(6) ^ tl;
00869     CamelliaSubkeyR(7) = subr(6) ^ tr;
00870     CamelliaSubkeyL(8) = subl(8);
00871     CamelliaSubkeyR(8) = subr(8);
00872     CamelliaSubkeyL(9) = subl(9);
00873     CamelliaSubkeyR(9) = subr(9);
00874     tl = subl(7) ^ (subr(7) & ~subr(9));
00875     dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw);
00876     CamelliaSubkeyL(10) = tl ^ subl(11);
00877     CamelliaSubkeyR(10) = tr ^ subr(11);
00878     CamelliaSubkeyL(11) = subl(10) ^ subl(12);
00879     CamelliaSubkeyR(11) = subr(10) ^ subr(12);
00880     CamelliaSubkeyL(12) = subl(11) ^ subl(13);
00881     CamelliaSubkeyR(12) = subr(11) ^ subr(13);
00882     CamelliaSubkeyL(13) = subl(12) ^ subl(14);
00883     CamelliaSubkeyR(13) = subr(12) ^ subr(14);
00884     CamelliaSubkeyL(14) = subl(13) ^ subl(15);
00885     CamelliaSubkeyR(14) = subr(13) ^ subr(15);
00886     tl = subl(18) ^ (subr(18) & ~subr(16));
00887     dw = tl & subl(16), tr = subr(18) ^ CAMELLIA_RL1(dw);
00888     CamelliaSubkeyL(15) = subl(14) ^ tl;
00889     CamelliaSubkeyR(15) = subr(14) ^ tr;
00890     CamelliaSubkeyL(16) = subl(16);
00891     CamelliaSubkeyR(16) = subr(16);
00892     CamelliaSubkeyL(17) = subl(17);
00893     CamelliaSubkeyR(17) = subr(17);
00894     tl = subl(15) ^ (subr(15) & ~subr(17));
00895     dw = tl & subl(17), tr = subr(15) ^ CAMELLIA_RL1(dw);
00896     CamelliaSubkeyL(18) = tl ^ subl(19);
00897     CamelliaSubkeyR(18) = tr ^ subr(19);
00898     CamelliaSubkeyL(19) = subl(18) ^ subl(20);
00899     CamelliaSubkeyR(19) = subr(18) ^ subr(20);
00900     CamelliaSubkeyL(20) = subl(19) ^ subl(21);
00901     CamelliaSubkeyR(20) = subr(19) ^ subr(21);
00902     CamelliaSubkeyL(21) = subl(20) ^ subl(22);
00903     CamelliaSubkeyR(21) = subr(20) ^ subr(22);
00904     CamelliaSubkeyL(22) = subl(21) ^ subl(23);
00905     CamelliaSubkeyR(22) = subr(21) ^ subr(23);
00906     tl = subl(26) ^ (subr(26) & ~subr(24));
00907     dw = tl & subl(24), tr = subr(26) ^ CAMELLIA_RL1(dw);
00908     CamelliaSubkeyL(23) = subl(22) ^ tl;
00909     CamelliaSubkeyR(23) = subr(22) ^ tr;
00910     CamelliaSubkeyL(24) = subl(24);
00911     CamelliaSubkeyR(24) = subr(24);
00912     CamelliaSubkeyL(25) = subl(25);
00913     CamelliaSubkeyR(25) = subr(25);
00914     tl = subl(23) ^ (subr(23) &  ~subr(25));
00915     dw = tl & subl(25), tr = subr(23) ^ CAMELLIA_RL1(dw);
00916     CamelliaSubkeyL(26) = tl ^ subl(27);
00917     CamelliaSubkeyR(26) = tr ^ subr(27);
00918     CamelliaSubkeyL(27) = subl(26) ^ subl(28);
00919     CamelliaSubkeyR(27) = subr(26) ^ subr(28);
00920     CamelliaSubkeyL(28) = subl(27) ^ subl(29);
00921     CamelliaSubkeyR(28) = subr(27) ^ subr(29);
00922     CamelliaSubkeyL(29) = subl(28) ^ subl(30);
00923     CamelliaSubkeyR(29) = subr(28) ^ subr(30);
00924     CamelliaSubkeyL(30) = subl(29) ^ subl(31);
00925     CamelliaSubkeyR(30) = subr(29) ^ subr(31);
00926     CamelliaSubkeyL(31) = subl(30);
00927     CamelliaSubkeyR(31) = subr(30);
00928     CamelliaSubkeyL(32) = subl(32) ^ subl(31);
00929     CamelliaSubkeyR(32) = subr(32) ^ subr(31);
00930 
00931     /* apply the inverse of the last half of P-function */
00932     dw = CamelliaSubkeyL(2) ^ CamelliaSubkeyR(2), dw = CAMELLIA_RL8(dw);
00933     CamelliaSubkeyR(2) = CamelliaSubkeyL(2) ^ dw, CamelliaSubkeyL(2) = dw;
00934     dw = CamelliaSubkeyL(3) ^ CamelliaSubkeyR(3), dw = CAMELLIA_RL8(dw);
00935     CamelliaSubkeyR(3) = CamelliaSubkeyL(3) ^ dw, CamelliaSubkeyL(3) = dw;
00936     dw = CamelliaSubkeyL(4) ^ CamelliaSubkeyR(4), dw = CAMELLIA_RL8(dw);
00937     CamelliaSubkeyR(4) = CamelliaSubkeyL(4) ^ dw, CamelliaSubkeyL(4) = dw;
00938     dw = CamelliaSubkeyL(5) ^ CamelliaSubkeyR(5), dw = CAMELLIA_RL8(dw);
00939     CamelliaSubkeyR(5) = CamelliaSubkeyL(5) ^ dw, CamelliaSubkeyL(5) = dw;
00940     dw = CamelliaSubkeyL(6) ^ CamelliaSubkeyR(6), dw = CAMELLIA_RL8(dw);
00941     CamelliaSubkeyR(6) = CamelliaSubkeyL(6) ^ dw, CamelliaSubkeyL(6) = dw;
00942     dw = CamelliaSubkeyL(7) ^ CamelliaSubkeyR(7), dw = CAMELLIA_RL8(dw);
00943     CamelliaSubkeyR(7) = CamelliaSubkeyL(7) ^ dw, CamelliaSubkeyL(7) = dw;
00944     dw = CamelliaSubkeyL(10) ^ CamelliaSubkeyR(10), dw = CAMELLIA_RL8(dw);
00945     CamelliaSubkeyR(10) = CamelliaSubkeyL(10) ^ dw, CamelliaSubkeyL(10) = dw;
00946     dw = CamelliaSubkeyL(11) ^ CamelliaSubkeyR(11), dw = CAMELLIA_RL8(dw);
00947     CamelliaSubkeyR(11) = CamelliaSubkeyL(11) ^ dw, CamelliaSubkeyL(11) = dw;
00948     dw = CamelliaSubkeyL(12) ^ CamelliaSubkeyR(12), dw = CAMELLIA_RL8(dw);
00949     CamelliaSubkeyR(12) = CamelliaSubkeyL(12) ^ dw, CamelliaSubkeyL(12) = dw;
00950     dw = CamelliaSubkeyL(13) ^ CamelliaSubkeyR(13), dw = CAMELLIA_RL8(dw);
00951     CamelliaSubkeyR(13) = CamelliaSubkeyL(13) ^ dw, CamelliaSubkeyL(13) = dw;
00952     dw = CamelliaSubkeyL(14) ^ CamelliaSubkeyR(14), dw = CAMELLIA_RL8(dw);
00953     CamelliaSubkeyR(14) = CamelliaSubkeyL(14) ^ dw, CamelliaSubkeyL(14) = dw;
00954     dw = CamelliaSubkeyL(15) ^ CamelliaSubkeyR(15), dw = CAMELLIA_RL8(dw);
00955     CamelliaSubkeyR(15) = CamelliaSubkeyL(15) ^ dw, CamelliaSubkeyL(15) = dw;
00956     dw = CamelliaSubkeyL(18) ^ CamelliaSubkeyR(18), dw = CAMELLIA_RL8(dw);
00957     CamelliaSubkeyR(18) = CamelliaSubkeyL(18) ^ dw, CamelliaSubkeyL(18) = dw;
00958     dw = CamelliaSubkeyL(19) ^ CamelliaSubkeyR(19), dw = CAMELLIA_RL8(dw);
00959     CamelliaSubkeyR(19) = CamelliaSubkeyL(19) ^ dw, CamelliaSubkeyL(19) = dw;
00960     dw = CamelliaSubkeyL(20) ^ CamelliaSubkeyR(20), dw = CAMELLIA_RL8(dw);
00961     CamelliaSubkeyR(20) = CamelliaSubkeyL(20) ^ dw, CamelliaSubkeyL(20) = dw;
00962     dw = CamelliaSubkeyL(21) ^ CamelliaSubkeyR(21), dw = CAMELLIA_RL8(dw);
00963     CamelliaSubkeyR(21) = CamelliaSubkeyL(21) ^ dw, CamelliaSubkeyL(21) = dw;
00964     dw = CamelliaSubkeyL(22) ^ CamelliaSubkeyR(22), dw = CAMELLIA_RL8(dw);
00965     CamelliaSubkeyR(22) = CamelliaSubkeyL(22) ^ dw, CamelliaSubkeyL(22) = dw;
00966     dw = CamelliaSubkeyL(23) ^ CamelliaSubkeyR(23), dw = CAMELLIA_RL8(dw);
00967     CamelliaSubkeyR(23) = CamelliaSubkeyL(23) ^ dw, CamelliaSubkeyL(23) = dw;
00968     dw = CamelliaSubkeyL(26) ^ CamelliaSubkeyR(26), dw = CAMELLIA_RL8(dw);
00969     CamelliaSubkeyR(26) = CamelliaSubkeyL(26) ^ dw, CamelliaSubkeyL(26) = dw;
00970     dw = CamelliaSubkeyL(27) ^ CamelliaSubkeyR(27), dw = CAMELLIA_RL8(dw);
00971     CamelliaSubkeyR(27) = CamelliaSubkeyL(27) ^ dw, CamelliaSubkeyL(27) = dw;
00972     dw = CamelliaSubkeyL(28) ^ CamelliaSubkeyR(28), dw = CAMELLIA_RL8(dw);
00973     CamelliaSubkeyR(28) = CamelliaSubkeyL(28) ^ dw, CamelliaSubkeyL(28) = dw;
00974     dw = CamelliaSubkeyL(29) ^ CamelliaSubkeyR(29), dw = CAMELLIA_RL8(dw);
00975     CamelliaSubkeyR(29) = CamelliaSubkeyL(29) ^ dw, CamelliaSubkeyL(29) = dw;
00976     dw = CamelliaSubkeyL(30) ^ CamelliaSubkeyR(30), dw = CAMELLIA_RL8(dw);
00977     CamelliaSubkeyR(30) = CamelliaSubkeyL(30) ^ dw, CamelliaSubkeyL(30) = dw;
00978     dw = CamelliaSubkeyL(31) ^ CamelliaSubkeyR(31), dw = CAMELLIA_RL8(dw);
00979     CamelliaSubkeyR(31) = CamelliaSubkeyL(31) ^ dw,CamelliaSubkeyL(31) = dw;
00980     
00981     return;
00982 }
00983 
00984 static void camellia_setup192(const unsigned char *key, u32 *subkey)
00985 {
00986     unsigned char kk[32];
00987     u32 krll, krlr, krrl,krrr;
00988 
00989     memcpy(kk, key, 24);
00990     memcpy((unsigned char *)&krll, key+16,4);
00991     memcpy((unsigned char *)&krlr, key+20,4);
00992     krrl = ~krll;
00993     krrr = ~krlr;
00994     memcpy(kk+24, (unsigned char *)&krrl, 4);
00995     memcpy(kk+28, (unsigned char *)&krrr, 4);
00996     camellia_setup256(kk, subkey);
00997     return;
00998 }
00999 
01000 
01001 /**
01002  * Stuff related to camellia encryption/decryption
01003  *
01004  * "io" must be 4byte aligned and big-endian data.
01005  */
01006 static void camellia_encrypt128(const u32 *subkey, u32 *io)
01007 {
01008     u32 il, ir, t0, t1;
01009 
01010     /* pre whitening but absorb kw2*/
01011     io[0] ^= CamelliaSubkeyL(0);
01012     io[1] ^= CamelliaSubkeyR(0);
01013     /* main iteration */
01014 
01015     CAMELLIA_ROUNDSM(io[0],io[1],
01016              CamelliaSubkeyL(2),CamelliaSubkeyR(2),
01017              io[2],io[3],il,ir,t0,t1);
01018     CAMELLIA_ROUNDSM(io[2],io[3],
01019              CamelliaSubkeyL(3),CamelliaSubkeyR(3),
01020              io[0],io[1],il,ir,t0,t1);
01021     CAMELLIA_ROUNDSM(io[0],io[1],
01022              CamelliaSubkeyL(4),CamelliaSubkeyR(4),
01023              io[2],io[3],il,ir,t0,t1);
01024     CAMELLIA_ROUNDSM(io[2],io[3],
01025              CamelliaSubkeyL(5),CamelliaSubkeyR(5),
01026              io[0],io[1],il,ir,t0,t1);
01027     CAMELLIA_ROUNDSM(io[0],io[1],
01028              CamelliaSubkeyL(6),CamelliaSubkeyR(6),
01029              io[2],io[3],il,ir,t0,t1);
01030     CAMELLIA_ROUNDSM(io[2],io[3],
01031              CamelliaSubkeyL(7),CamelliaSubkeyR(7),
01032              io[0],io[1],il,ir,t0,t1);
01033 
01034     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01035          CamelliaSubkeyL(8),CamelliaSubkeyR(8),
01036          CamelliaSubkeyL(9),CamelliaSubkeyR(9),
01037          t0,t1,il,ir);
01038 
01039     CAMELLIA_ROUNDSM(io[0],io[1],
01040              CamelliaSubkeyL(10),CamelliaSubkeyR(10),
01041              io[2],io[3],il,ir,t0,t1);
01042     CAMELLIA_ROUNDSM(io[2],io[3],
01043              CamelliaSubkeyL(11),CamelliaSubkeyR(11),
01044              io[0],io[1],il,ir,t0,t1);
01045     CAMELLIA_ROUNDSM(io[0],io[1],
01046              CamelliaSubkeyL(12),CamelliaSubkeyR(12),
01047              io[2],io[3],il,ir,t0,t1);
01048     CAMELLIA_ROUNDSM(io[2],io[3],
01049              CamelliaSubkeyL(13),CamelliaSubkeyR(13),
01050              io[0],io[1],il,ir,t0,t1);
01051     CAMELLIA_ROUNDSM(io[0],io[1],
01052              CamelliaSubkeyL(14),CamelliaSubkeyR(14),
01053              io[2],io[3],il,ir,t0,t1);
01054     CAMELLIA_ROUNDSM(io[2],io[3],
01055              CamelliaSubkeyL(15),CamelliaSubkeyR(15),
01056              io[0],io[1],il,ir,t0,t1);
01057 
01058     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01059          CamelliaSubkeyL(16),CamelliaSubkeyR(16),
01060          CamelliaSubkeyL(17),CamelliaSubkeyR(17),
01061          t0,t1,il,ir);
01062 
01063     CAMELLIA_ROUNDSM(io[0],io[1],
01064              CamelliaSubkeyL(18),CamelliaSubkeyR(18),
01065              io[2],io[3],il,ir,t0,t1);
01066     CAMELLIA_ROUNDSM(io[2],io[3],
01067              CamelliaSubkeyL(19),CamelliaSubkeyR(19),
01068              io[0],io[1],il,ir,t0,t1);
01069     CAMELLIA_ROUNDSM(io[0],io[1],
01070              CamelliaSubkeyL(20),CamelliaSubkeyR(20),
01071              io[2],io[3],il,ir,t0,t1);
01072     CAMELLIA_ROUNDSM(io[2],io[3],
01073              CamelliaSubkeyL(21),CamelliaSubkeyR(21),
01074              io[0],io[1],il,ir,t0,t1);
01075     CAMELLIA_ROUNDSM(io[0],io[1],
01076              CamelliaSubkeyL(22),CamelliaSubkeyR(22),
01077              io[2],io[3],il,ir,t0,t1);
01078     CAMELLIA_ROUNDSM(io[2],io[3],
01079              CamelliaSubkeyL(23),CamelliaSubkeyR(23),
01080              io[0],io[1],il,ir,t0,t1);
01081 
01082     /* post whitening but kw4 */
01083     io[2] ^= CamelliaSubkeyL(24);
01084     io[3] ^= CamelliaSubkeyR(24);
01085 
01086     t0 = io[0];
01087     t1 = io[1];
01088     io[0] = io[2];
01089     io[1] = io[3];
01090     io[2] = t0;
01091     io[3] = t1;
01092     
01093     return;
01094 }
01095 
01096 static void camellia_decrypt128(const u32 *subkey, u32 *io)
01097 {
01098     u32 il,ir,t0,t1;               /* temporary valiables */
01099     
01100     /* pre whitening but absorb kw2*/
01101     io[0] ^= CamelliaSubkeyL(24);
01102     io[1] ^= CamelliaSubkeyR(24);
01103 
01104     /* main iteration */
01105     CAMELLIA_ROUNDSM(io[0],io[1],
01106              CamelliaSubkeyL(23),CamelliaSubkeyR(23),
01107              io[2],io[3],il,ir,t0,t1);
01108     CAMELLIA_ROUNDSM(io[2],io[3],
01109              CamelliaSubkeyL(22),CamelliaSubkeyR(22),
01110              io[0],io[1],il,ir,t0,t1);
01111     CAMELLIA_ROUNDSM(io[0],io[1],
01112              CamelliaSubkeyL(21),CamelliaSubkeyR(21),
01113              io[2],io[3],il,ir,t0,t1);
01114     CAMELLIA_ROUNDSM(io[2],io[3],
01115              CamelliaSubkeyL(20),CamelliaSubkeyR(20),
01116              io[0],io[1],il,ir,t0,t1);
01117     CAMELLIA_ROUNDSM(io[0],io[1],
01118              CamelliaSubkeyL(19),CamelliaSubkeyR(19),
01119              io[2],io[3],il,ir,t0,t1);
01120     CAMELLIA_ROUNDSM(io[2],io[3],
01121              CamelliaSubkeyL(18),CamelliaSubkeyR(18),
01122              io[0],io[1],il,ir,t0,t1);
01123 
01124     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01125          CamelliaSubkeyL(17),CamelliaSubkeyR(17),
01126          CamelliaSubkeyL(16),CamelliaSubkeyR(16),
01127          t0,t1,il,ir);
01128 
01129     CAMELLIA_ROUNDSM(io[0],io[1],
01130              CamelliaSubkeyL(15),CamelliaSubkeyR(15),
01131              io[2],io[3],il,ir,t0,t1);
01132     CAMELLIA_ROUNDSM(io[2],io[3],
01133              CamelliaSubkeyL(14),CamelliaSubkeyR(14),
01134              io[0],io[1],il,ir,t0,t1);
01135     CAMELLIA_ROUNDSM(io[0],io[1],
01136              CamelliaSubkeyL(13),CamelliaSubkeyR(13),
01137              io[2],io[3],il,ir,t0,t1);
01138     CAMELLIA_ROUNDSM(io[2],io[3],
01139              CamelliaSubkeyL(12),CamelliaSubkeyR(12),
01140              io[0],io[1],il,ir,t0,t1);
01141     CAMELLIA_ROUNDSM(io[0],io[1],
01142              CamelliaSubkeyL(11),CamelliaSubkeyR(11),
01143              io[2],io[3],il,ir,t0,t1);
01144     CAMELLIA_ROUNDSM(io[2],io[3],
01145              CamelliaSubkeyL(10),CamelliaSubkeyR(10),
01146              io[0],io[1],il,ir,t0,t1);
01147 
01148     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01149          CamelliaSubkeyL(9),CamelliaSubkeyR(9),
01150          CamelliaSubkeyL(8),CamelliaSubkeyR(8),
01151          t0,t1,il,ir);
01152 
01153     CAMELLIA_ROUNDSM(io[0],io[1],
01154              CamelliaSubkeyL(7),CamelliaSubkeyR(7),
01155              io[2],io[3],il,ir,t0,t1);
01156     CAMELLIA_ROUNDSM(io[2],io[3],
01157              CamelliaSubkeyL(6),CamelliaSubkeyR(6),
01158              io[0],io[1],il,ir,t0,t1);
01159     CAMELLIA_ROUNDSM(io[0],io[1],
01160              CamelliaSubkeyL(5),CamelliaSubkeyR(5),
01161              io[2],io[3],il,ir,t0,t1);
01162     CAMELLIA_ROUNDSM(io[2],io[3],
01163              CamelliaSubkeyL(4),CamelliaSubkeyR(4),
01164              io[0],io[1],il,ir,t0,t1);
01165     CAMELLIA_ROUNDSM(io[0],io[1],
01166              CamelliaSubkeyL(3),CamelliaSubkeyR(3),
01167              io[2],io[3],il,ir,t0,t1);
01168     CAMELLIA_ROUNDSM(io[2],io[3],
01169              CamelliaSubkeyL(2),CamelliaSubkeyR(2),
01170              io[0],io[1],il,ir,t0,t1);
01171 
01172     /* post whitening but kw4 */
01173     io[2] ^= CamelliaSubkeyL(0);
01174     io[3] ^= CamelliaSubkeyR(0);
01175 
01176     t0 = io[0];
01177     t1 = io[1];
01178     io[0] = io[2];
01179     io[1] = io[3];
01180     io[2] = t0;
01181     io[3] = t1;
01182 
01183     return;
01184 }
01185 
01186 /**
01187  * stuff for 192 and 256bit encryption/decryption
01188  */
01189 static void camellia_encrypt256(const u32 *subkey, u32 *io)
01190 {
01191     u32 il,ir,t0,t1;           /* temporary valiables */
01192 
01193     /* pre whitening but absorb kw2*/
01194     io[0] ^= CamelliaSubkeyL(0);
01195     io[1] ^= CamelliaSubkeyR(0);
01196 
01197     /* main iteration */
01198     CAMELLIA_ROUNDSM(io[0],io[1],
01199              CamelliaSubkeyL(2),CamelliaSubkeyR(2),
01200              io[2],io[3],il,ir,t0,t1);
01201     CAMELLIA_ROUNDSM(io[2],io[3],
01202              CamelliaSubkeyL(3),CamelliaSubkeyR(3),
01203              io[0],io[1],il,ir,t0,t1);
01204     CAMELLIA_ROUNDSM(io[0],io[1],
01205              CamelliaSubkeyL(4),CamelliaSubkeyR(4),
01206              io[2],io[3],il,ir,t0,t1);
01207     CAMELLIA_ROUNDSM(io[2],io[3],
01208              CamelliaSubkeyL(5),CamelliaSubkeyR(5),
01209              io[0],io[1],il,ir,t0,t1);
01210     CAMELLIA_ROUNDSM(io[0],io[1],
01211              CamelliaSubkeyL(6),CamelliaSubkeyR(6),
01212              io[2],io[3],il,ir,t0,t1);
01213     CAMELLIA_ROUNDSM(io[2],io[3],
01214              CamelliaSubkeyL(7),CamelliaSubkeyR(7),
01215              io[0],io[1],il,ir,t0,t1);
01216 
01217     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01218          CamelliaSubkeyL(8),CamelliaSubkeyR(8),
01219          CamelliaSubkeyL(9),CamelliaSubkeyR(9),
01220          t0,t1,il,ir);
01221 
01222     CAMELLIA_ROUNDSM(io[0],io[1],
01223              CamelliaSubkeyL(10),CamelliaSubkeyR(10),
01224              io[2],io[3],il,ir,t0,t1);
01225     CAMELLIA_ROUNDSM(io[2],io[3],
01226              CamelliaSubkeyL(11),CamelliaSubkeyR(11),
01227              io[0],io[1],il,ir,t0,t1);
01228     CAMELLIA_ROUNDSM(io[0],io[1],
01229              CamelliaSubkeyL(12),CamelliaSubkeyR(12),
01230              io[2],io[3],il,ir,t0,t1);
01231     CAMELLIA_ROUNDSM(io[2],io[3],
01232              CamelliaSubkeyL(13),CamelliaSubkeyR(13),
01233              io[0],io[1],il,ir,t0,t1);
01234     CAMELLIA_ROUNDSM(io[0],io[1],
01235              CamelliaSubkeyL(14),CamelliaSubkeyR(14),
01236              io[2],io[3],il,ir,t0,t1);
01237     CAMELLIA_ROUNDSM(io[2],io[3],
01238              CamelliaSubkeyL(15),CamelliaSubkeyR(15),
01239              io[0],io[1],il,ir,t0,t1);
01240 
01241     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01242          CamelliaSubkeyL(16),CamelliaSubkeyR(16),
01243          CamelliaSubkeyL(17),CamelliaSubkeyR(17),
01244          t0,t1,il,ir);
01245 
01246     CAMELLIA_ROUNDSM(io[0],io[1],
01247              CamelliaSubkeyL(18),CamelliaSubkeyR(18),
01248              io[2],io[3],il,ir,t0,t1);
01249     CAMELLIA_ROUNDSM(io[2],io[3],
01250              CamelliaSubkeyL(19),CamelliaSubkeyR(19),
01251              io[0],io[1],il,ir,t0,t1);
01252     CAMELLIA_ROUNDSM(io[0],io[1],
01253              CamelliaSubkeyL(20),CamelliaSubkeyR(20),
01254              io[2],io[3],il,ir,t0,t1);
01255     CAMELLIA_ROUNDSM(io[2],io[3],
01256              CamelliaSubkeyL(21),CamelliaSubkeyR(21),
01257              io[0],io[1],il,ir,t0,t1);
01258     CAMELLIA_ROUNDSM(io[0],io[1],
01259              CamelliaSubkeyL(22),CamelliaSubkeyR(22),
01260              io[2],io[3],il,ir,t0,t1);
01261     CAMELLIA_ROUNDSM(io[2],io[3],
01262              CamelliaSubkeyL(23),CamelliaSubkeyR(23),
01263              io[0],io[1],il,ir,t0,t1);
01264 
01265     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01266          CamelliaSubkeyL(24),CamelliaSubkeyR(24),
01267          CamelliaSubkeyL(25),CamelliaSubkeyR(25),
01268          t0,t1,il,ir);
01269 
01270     CAMELLIA_ROUNDSM(io[0],io[1],
01271              CamelliaSubkeyL(26),CamelliaSubkeyR(26),
01272              io[2],io[3],il,ir,t0,t1);
01273     CAMELLIA_ROUNDSM(io[2],io[3],
01274              CamelliaSubkeyL(27),CamelliaSubkeyR(27),
01275              io[0],io[1],il,ir,t0,t1);
01276     CAMELLIA_ROUNDSM(io[0],io[1],
01277              CamelliaSubkeyL(28),CamelliaSubkeyR(28),
01278              io[2],io[3],il,ir,t0,t1);
01279     CAMELLIA_ROUNDSM(io[2],io[3],
01280              CamelliaSubkeyL(29),CamelliaSubkeyR(29),
01281              io[0],io[1],il,ir,t0,t1);
01282     CAMELLIA_ROUNDSM(io[0],io[1],
01283              CamelliaSubkeyL(30),CamelliaSubkeyR(30),
01284              io[2],io[3],il,ir,t0,t1);
01285     CAMELLIA_ROUNDSM(io[2],io[3],
01286              CamelliaSubkeyL(31),CamelliaSubkeyR(31),
01287              io[0],io[1],il,ir,t0,t1);
01288 
01289     /* post whitening but kw4 */
01290     io[2] ^= CamelliaSubkeyL(32);
01291     io[3] ^= CamelliaSubkeyR(32);
01292 
01293     t0 = io[0];
01294     t1 = io[1];
01295     io[0] = io[2];
01296     io[1] = io[3];
01297     io[2] = t0;
01298     io[3] = t1;
01299 
01300     return;
01301 }
01302 
01303 static void camellia_decrypt256(const u32 *subkey, u32 *io)
01304 {
01305     u32 il,ir,t0,t1;           /* temporary valiables */
01306 
01307     /* pre whitening but absorb kw2*/
01308     io[0] ^= CamelliaSubkeyL(32);
01309     io[1] ^= CamelliaSubkeyR(32);
01310     
01311     /* main iteration */
01312     CAMELLIA_ROUNDSM(io[0],io[1],
01313              CamelliaSubkeyL(31),CamelliaSubkeyR(31),
01314              io[2],io[3],il,ir,t0,t1);
01315     CAMELLIA_ROUNDSM(io[2],io[3],
01316              CamelliaSubkeyL(30),CamelliaSubkeyR(30),
01317              io[0],io[1],il,ir,t0,t1);
01318     CAMELLIA_ROUNDSM(io[0],io[1],
01319              CamelliaSubkeyL(29),CamelliaSubkeyR(29),
01320              io[2],io[3],il,ir,t0,t1);
01321     CAMELLIA_ROUNDSM(io[2],io[3],
01322              CamelliaSubkeyL(28),CamelliaSubkeyR(28),
01323              io[0],io[1],il,ir,t0,t1);
01324     CAMELLIA_ROUNDSM(io[0],io[1],
01325              CamelliaSubkeyL(27),CamelliaSubkeyR(27),
01326              io[2],io[3],il,ir,t0,t1);
01327     CAMELLIA_ROUNDSM(io[2],io[3],
01328              CamelliaSubkeyL(26),CamelliaSubkeyR(26),
01329              io[0],io[1],il,ir,t0,t1);
01330 
01331     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01332          CamelliaSubkeyL(25),CamelliaSubkeyR(25),
01333          CamelliaSubkeyL(24),CamelliaSubkeyR(24),
01334          t0,t1,il,ir);
01335 
01336     CAMELLIA_ROUNDSM(io[0],io[1],
01337              CamelliaSubkeyL(23),CamelliaSubkeyR(23),
01338              io[2],io[3],il,ir,t0,t1);
01339     CAMELLIA_ROUNDSM(io[2],io[3],
01340              CamelliaSubkeyL(22),CamelliaSubkeyR(22),
01341              io[0],io[1],il,ir,t0,t1);
01342     CAMELLIA_ROUNDSM(io[0],io[1],
01343              CamelliaSubkeyL(21),CamelliaSubkeyR(21),
01344              io[2],io[3],il,ir,t0,t1);
01345     CAMELLIA_ROUNDSM(io[2],io[3],
01346              CamelliaSubkeyL(20),CamelliaSubkeyR(20),
01347              io[0],io[1],il,ir,t0,t1);
01348     CAMELLIA_ROUNDSM(io[0],io[1],
01349              CamelliaSubkeyL(19),CamelliaSubkeyR(19),
01350              io[2],io[3],il,ir,t0,t1);
01351     CAMELLIA_ROUNDSM(io[2],io[3],
01352              CamelliaSubkeyL(18),CamelliaSubkeyR(18),
01353              io[0],io[1],il,ir,t0,t1);
01354 
01355     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01356          CamelliaSubkeyL(17),CamelliaSubkeyR(17),
01357          CamelliaSubkeyL(16),CamelliaSubkeyR(16),
01358          t0,t1,il,ir);
01359 
01360     CAMELLIA_ROUNDSM(io[0],io[1],
01361              CamelliaSubkeyL(15),CamelliaSubkeyR(15),
01362              io[2],io[3],il,ir,t0,t1);
01363     CAMELLIA_ROUNDSM(io[2],io[3],
01364              CamelliaSubkeyL(14),CamelliaSubkeyR(14),
01365              io[0],io[1],il,ir,t0,t1);
01366     CAMELLIA_ROUNDSM(io[0],io[1],
01367              CamelliaSubkeyL(13),CamelliaSubkeyR(13),
01368              io[2],io[3],il,ir,t0,t1);
01369     CAMELLIA_ROUNDSM(io[2],io[3],
01370              CamelliaSubkeyL(12),CamelliaSubkeyR(12),
01371              io[0],io[1],il,ir,t0,t1);
01372     CAMELLIA_ROUNDSM(io[0],io[1],
01373              CamelliaSubkeyL(11),CamelliaSubkeyR(11),
01374              io[2],io[3],il,ir,t0,t1);
01375     CAMELLIA_ROUNDSM(io[2],io[3],
01376              CamelliaSubkeyL(10),CamelliaSubkeyR(10),
01377              io[0],io[1],il,ir,t0,t1);
01378 
01379     CAMELLIA_FLS(io[0],io[1],io[2],io[3],
01380          CamelliaSubkeyL(9),CamelliaSubkeyR(9),
01381          CamelliaSubkeyL(8),CamelliaSubkeyR(8),
01382          t0,t1,il,ir);
01383 
01384     CAMELLIA_ROUNDSM(io[0],io[1],
01385              CamelliaSubkeyL(7),CamelliaSubkeyR(7),
01386              io[2],io[3],il,ir,t0,t1);
01387     CAMELLIA_ROUNDSM(io[2],io[3],
01388              CamelliaSubkeyL(6),CamelliaSubkeyR(6),
01389              io[0],io[1],il,ir,t0,t1);
01390     CAMELLIA_ROUNDSM(io[0],io[1],
01391              CamelliaSubkeyL(5),CamelliaSubkeyR(5),
01392              io[2],io[3],il,ir,t0,t1);
01393     CAMELLIA_ROUNDSM(io[2],io[3],
01394              CamelliaSubkeyL(4),CamelliaSubkeyR(4),
01395              io[0],io[1],il,ir,t0,t1);
01396     CAMELLIA_ROUNDSM(io[0],io[1],
01397              CamelliaSubkeyL(3),CamelliaSubkeyR(3),
01398              io[2],io[3],il,ir,t0,t1);
01399     CAMELLIA_ROUNDSM(io[2],io[3],
01400              CamelliaSubkeyL(2),CamelliaSubkeyR(2),
01401              io[0],io[1],il,ir,t0,t1);
01402 
01403     /* post whitening but kw4 */
01404     io[2] ^= CamelliaSubkeyL(0);
01405     io[3] ^= CamelliaSubkeyR(0);
01406 
01407     t0 = io[0];
01408     t1 = io[1];
01409     io[0] = io[2];
01410     io[1] = io[3];
01411     io[2] = t0;
01412     io[3] = t1;
01413 
01414     return;
01415 }
01416 
01417 /***
01418  *
01419  * API for compatibility
01420  */
01421 
01422 static void Camellia_EncryptBlock(const int keyBitLength, 
01423                const unsigned char *plaintext, 
01424                const KEY_TABLE_TYPE keyTable, 
01425                unsigned char *ciphertext)
01426 {
01427     u32 tmp[4];
01428 
01429     tmp[0] = GETU32(plaintext);
01430     tmp[1] = GETU32(plaintext + 4);
01431     tmp[2] = GETU32(plaintext + 8);
01432     tmp[3] = GETU32(plaintext + 12);
01433 
01434     switch (keyBitLength) {
01435     case 128:
01436     camellia_encrypt128(keyTable, tmp);
01437     break;
01438     case 192:
01439     /* fall through */
01440     case 256:
01441     camellia_encrypt256(keyTable, tmp);
01442     break;
01443     default:
01444     break;
01445     }
01446 
01447     PUTU32(ciphertext, tmp[0]);
01448     PUTU32(ciphertext + 4, tmp[1]);
01449     PUTU32(ciphertext + 8, tmp[2]);
01450     PUTU32(ciphertext + 12, tmp[3]);
01451 }
01452 
01453 static void Camellia_DecryptBlock(const int keyBitLength, 
01454                const unsigned char *ciphertext, 
01455                const KEY_TABLE_TYPE keyTable, 
01456                unsigned char *plaintext)
01457 {
01458     u32 tmp[4];
01459 
01460     tmp[0] = GETU32(ciphertext);
01461     tmp[1] = GETU32(ciphertext + 4);
01462     tmp[2] = GETU32(ciphertext + 8);
01463     tmp[3] = GETU32(ciphertext + 12);
01464 
01465     switch (keyBitLength) {
01466     case 128:
01467     camellia_decrypt128(keyTable, tmp);
01468     break;
01469     case 192:
01470     /* fall through */
01471     case 256:
01472     camellia_decrypt256(keyTable, tmp);
01473     break;
01474     default:
01475     break;
01476     }
01477     PUTU32(plaintext, tmp[0]);
01478     PUTU32(plaintext + 4, tmp[1]);
01479     PUTU32(plaintext + 8, tmp[2]);
01480     PUTU32(plaintext + 12, tmp[3]);
01481 }
01482 
01483 
01484 
01485 /* CTaoCrypt wrappers to the Camellia code */
01486 
01487 int CamelliaSetKey(Camellia* cam, const byte* key, word32 len, const byte* iv)
01488 {
01489     if (cam == NULL) return BAD_FUNC_ARG;
01490 
01491     XMEMSET(cam->key, 0, sizeof(KEY_TABLE_TYPE));
01492     switch (len) {
01493         case 16:
01494             camellia_setup128(key, cam->key);
01495             break;
01496         case 24:
01497             camellia_setup192(key, cam->key);
01498             break;
01499         case 32:
01500             camellia_setup256(key, cam->key);
01501             break;
01502         default:
01503             return BAD_FUNC_ARG;
01504     }
01505     cam->keySz = len * 8;
01506 
01507     return CamelliaSetIV(cam, iv);
01508 }
01509 
01510 
01511 int CamelliaSetIV(Camellia* cam, const byte* iv)
01512 {
01513     if (cam == NULL)
01514         return BAD_FUNC_ARG;
01515 
01516     if (iv)
01517         XMEMCPY(cam->reg, iv, CAMELLIA_BLOCK_SIZE);
01518 
01519     return 0;
01520 }
01521 
01522 
01523 void CamelliaEncryptDirect(Camellia* cam, byte* out, const byte* in)
01524 {
01525     Camellia_EncryptBlock(cam->keySz, in, cam->key, out);
01526 }
01527 
01528 
01529 void CamelliaDecryptDirect(Camellia* cam, byte* out, const byte* in)
01530 {
01531     Camellia_DecryptBlock(cam->keySz, in, cam->key, out);
01532 }
01533 
01534 
01535 void CamelliaCbcEncrypt(Camellia* cam, byte* out, const byte* in, word32 sz)
01536 {
01537     word32 blocks = sz / CAMELLIA_BLOCK_SIZE;
01538 
01539     while (blocks--) {
01540         xorbuf((byte*)cam->reg, in, CAMELLIA_BLOCK_SIZE);
01541         Camellia_EncryptBlock(cam->keySz, (byte*)cam->reg,
01542                                                      cam->key, (byte*)cam->reg);
01543         XMEMCPY(out, cam->reg, CAMELLIA_BLOCK_SIZE);
01544 
01545         out += CAMELLIA_BLOCK_SIZE;
01546         in  += CAMELLIA_BLOCK_SIZE; 
01547     }
01548 }
01549 
01550 
01551 void CamelliaCbcDecrypt(Camellia* cam, byte* out, const byte* in, word32 sz)
01552 {
01553     word32 blocks = sz / CAMELLIA_BLOCK_SIZE;
01554 
01555     while (blocks--) {
01556         XMEMCPY(cam->tmp, in, CAMELLIA_BLOCK_SIZE);
01557         Camellia_DecryptBlock(cam->keySz, (byte*)cam->tmp, cam->key, out);
01558         xorbuf(out, (byte*)cam->reg, CAMELLIA_BLOCK_SIZE);
01559         XMEMCPY(cam->reg, cam->tmp, CAMELLIA_BLOCK_SIZE);
01560 
01561         out += CAMELLIA_BLOCK_SIZE;
01562         in  += CAMELLIA_BLOCK_SIZE; 
01563     }
01564 }
01565 
01566 
01567 #endif /* HAVE_CAMELLIA */
01568