security/nss/lib/freebl/camellia.c

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/security/nss/lib/freebl/camellia.c	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,1782 @@
     1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.7 +
     1.8 +#ifdef FREEBL_NO_DEPEND
     1.9 +#include "stubs.h"
    1.10 +#endif
    1.11 +
    1.12 +#include "prinit.h"
    1.13 +#include "prerr.h"
    1.14 +#include "secerr.h"
    1.15 +
    1.16 +#include "prtypes.h"
    1.17 +#include "blapi.h"
    1.18 +#include "camellia.h"
    1.19 +#include "sha_fast.h" /* for SHA_HTONL and related configuration macros */
    1.20 +
    1.21 +
    1.22 +/* key constants */
    1.23 +
    1.24 +#define CAMELLIA_SIGMA1L (0xA09E667FL)
    1.25 +#define CAMELLIA_SIGMA1R (0x3BCC908BL)
    1.26 +#define CAMELLIA_SIGMA2L (0xB67AE858L)
    1.27 +#define CAMELLIA_SIGMA2R (0x4CAA73B2L)
    1.28 +#define CAMELLIA_SIGMA3L (0xC6EF372FL)
    1.29 +#define CAMELLIA_SIGMA3R (0xE94F82BEL)
    1.30 +#define CAMELLIA_SIGMA4L (0x54FF53A5L)
    1.31 +#define CAMELLIA_SIGMA4R (0xF1D36F1CL)
    1.32 +#define CAMELLIA_SIGMA5L (0x10E527FAL)
    1.33 +#define CAMELLIA_SIGMA5R (0xDE682D1DL)
    1.34 +#define CAMELLIA_SIGMA6L (0xB05688C2L)
    1.35 +#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
    1.36 +
    1.37 +/*
    1.38 + *  macros
    1.39 + */
    1.40 +
    1.41 +
    1.42 +#if defined(SHA_ALLOW_UNALIGNED_ACCESS)
    1.43 +
    1.44 +/* require a CPU that allows unaligned access */
    1.45 +
    1.46 +#if defined(SHA_NEED_TMP_VARIABLE)
    1.47 +#define CAMELLIA_NEED_TMP_VARIABLE 1
    1.48 +#endif
    1.49 +
    1.50 +# define GETU32(p) SHA_HTONL(*((PRUint32 *)(p)))
    1.51 +# define PUTU32(ct, st) {*((PRUint32 *)(ct)) = SHA_HTONL(st);}
    1.52 +
    1.53 +#else /* no unaligned access */
    1.54 +
    1.55 +# define GETU32(pt)					\
    1.56 +    (((PRUint32)(pt)[0] << 24)				\
    1.57 +     ^ ((PRUint32)(pt)[1] << 16)			\
    1.58 +     ^ ((PRUint32)(pt)[2] <<  8)			\
    1.59 +     ^ ((PRUint32)(pt)[3]))
    1.60 +
    1.61 +# define PUTU32(ct, st)  {				\
    1.62 +	(ct)[0] = (PRUint8)((st) >> 24);		\
    1.63 +	(ct)[1] = (PRUint8)((st) >> 16);		\
    1.64 +	(ct)[2] = (PRUint8)((st) >>  8);		\
    1.65 +	(ct)[3] = (PRUint8)(st); }
    1.66 +
    1.67 +#endif
    1.68 +
    1.69 +#define CamelliaSubkeyL(INDEX) (subkey[(INDEX)*2])
    1.70 +#define CamelliaSubkeyR(INDEX) (subkey[(INDEX)*2 + 1])
    1.71 +
    1.72 +/* rotation right shift 1byte */
    1.73 +#define CAMELLIA_RR8(x) (((x) >> 8) + ((x) << 24))
    1.74 +/* rotation left shift 1bit */
    1.75 +#define CAMELLIA_RL1(x) (((x) << 1) + ((x) >> 31))
    1.76 +/* rotation left shift 1byte */
    1.77 +#define CAMELLIA_RL8(x) (((x) << 8) + ((x) >> 24))
    1.78 +
    1.79 +#define CAMELLIA_ROLDQ(ll, lr, rl, rr, w0, w1, bits)	\
    1.80 +    do {						\
    1.81 +	w0 = ll;					\
    1.82 +	ll = (ll << bits) + (lr >> (32 - bits));	\
    1.83 +	lr = (lr << bits) + (rl >> (32 - bits));	\
    1.84 +	rl = (rl << bits) + (rr >> (32 - bits));	\
    1.85 +	rr = (rr << bits) + (w0 >> (32 - bits));	\
    1.86 +    } while(0)
    1.87 +
    1.88 +#define CAMELLIA_ROLDQo32(ll, lr, rl, rr, w0, w1, bits)	\
    1.89 +    do {						\
    1.90 +	w0 = ll;					\
    1.91 +	w1 = lr;					\
    1.92 +	ll = (lr << (bits - 32)) + (rl >> (64 - bits));	\
    1.93 +	lr = (rl << (bits - 32)) + (rr >> (64 - bits));	\
    1.94 +	rl = (rr << (bits - 32)) + (w0 >> (64 - bits));	\
    1.95 +	rr = (w0 << (bits - 32)) + (w1 >> (64 - bits));	\
    1.96 +    } while(0)
    1.97 +
    1.98 +#define CAMELLIA_SP1110(INDEX) (camellia_sp1110[(INDEX)])
    1.99 +#define CAMELLIA_SP0222(INDEX) (camellia_sp0222[(INDEX)])
   1.100 +#define CAMELLIA_SP3033(INDEX) (camellia_sp3033[(INDEX)])
   1.101 +#define CAMELLIA_SP4404(INDEX) (camellia_sp4404[(INDEX)])
   1.102 +
   1.103 +#define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1)	\
   1.104 +    do {							\
   1.105 +	il = xl ^ kl;						\
   1.106 +	ir = xr ^ kr;						\
   1.107 +	t0 = il >> 16;						\
   1.108 +	t1 = ir >> 16;						\
   1.109 +	yl = CAMELLIA_SP1110(ir & 0xff)				\
   1.110 +	    ^ CAMELLIA_SP0222((t1 >> 8) & 0xff)			\
   1.111 +	    ^ CAMELLIA_SP3033(t1 & 0xff)			\
   1.112 +	    ^ CAMELLIA_SP4404((ir >> 8) & 0xff);		\
   1.113 +	yr = CAMELLIA_SP1110((t0 >> 8) & 0xff)			\
   1.114 +	    ^ CAMELLIA_SP0222(t0 & 0xff)			\
   1.115 +	    ^ CAMELLIA_SP3033((il >> 8) & 0xff)			\
   1.116 +	    ^ CAMELLIA_SP4404(il & 0xff);			\
   1.117 +	yl ^= yr;						\
   1.118 +	yr = CAMELLIA_RR8(yr);					\
   1.119 +	yr ^= yl;						\
   1.120 +    } while(0)
   1.121 +
   1.122 +
   1.123 +/*
   1.124 + * for speed up
   1.125 + *
   1.126 + */
   1.127 +#define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \
   1.128 +    do {								\
   1.129 +	t0 = kll;							\
   1.130 +	t0 &= ll;							\
   1.131 +	lr ^= CAMELLIA_RL1(t0);						\
   1.132 +	t1 = klr;							\
   1.133 +	t1 |= lr;							\
   1.134 +	ll ^= t1;							\
   1.135 +									\
   1.136 +	t2 = krr;							\
   1.137 +	t2 |= rr;							\
   1.138 +	rl ^= t2;							\
   1.139 +	t3 = krl;							\
   1.140 +	t3 &= rl;							\
   1.141 +	rr ^= CAMELLIA_RL1(t3);						\
   1.142 +    } while(0)
   1.143 +
   1.144 +#define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir, t0, t1)	\
   1.145 +    do {								\
   1.146 +	ir = CAMELLIA_SP1110(xr & 0xff)					\
   1.147 +	    ^ CAMELLIA_SP0222((xr >> 24) & 0xff)			\
   1.148 +	    ^ CAMELLIA_SP3033((xr >> 16) & 0xff)			\
   1.149 +	    ^ CAMELLIA_SP4404((xr >> 8) & 0xff);			\
   1.150 +	il = CAMELLIA_SP1110((xl >> 24) & 0xff)				\
   1.151 +	    ^ CAMELLIA_SP0222((xl >> 16) & 0xff)			\
   1.152 +	    ^ CAMELLIA_SP3033((xl >> 8) & 0xff)				\
   1.153 +	    ^ CAMELLIA_SP4404(xl & 0xff);				\
   1.154 +	il ^= kl;							\
   1.155 +	ir ^= kr;							\
   1.156 +	ir ^= il;							\
   1.157 +	il = CAMELLIA_RR8(il);						\
   1.158 +	il ^= ir;							\
   1.159 +	yl ^= ir;							\
   1.160 +	yr ^= il;							\
   1.161 +    } while(0)
   1.162 +
   1.163 +
   1.164 +static const PRUint32 camellia_sp1110[256] = {
   1.165 +    0x70707000,0x82828200,0x2c2c2c00,0xececec00,
   1.166 +    0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500,
   1.167 +    0xe4e4e400,0x85858500,0x57575700,0x35353500,
   1.168 +    0xeaeaea00,0x0c0c0c00,0xaeaeae00,0x41414100,
   1.169 +    0x23232300,0xefefef00,0x6b6b6b00,0x93939300,
   1.170 +    0x45454500,0x19191900,0xa5a5a500,0x21212100,
   1.171 +    0xededed00,0x0e0e0e00,0x4f4f4f00,0x4e4e4e00,
   1.172 +    0x1d1d1d00,0x65656500,0x92929200,0xbdbdbd00,
   1.173 +    0x86868600,0xb8b8b800,0xafafaf00,0x8f8f8f00,
   1.174 +    0x7c7c7c00,0xebebeb00,0x1f1f1f00,0xcecece00,
   1.175 +    0x3e3e3e00,0x30303000,0xdcdcdc00,0x5f5f5f00,
   1.176 +    0x5e5e5e00,0xc5c5c500,0x0b0b0b00,0x1a1a1a00,
   1.177 +    0xa6a6a600,0xe1e1e100,0x39393900,0xcacaca00,
   1.178 +    0xd5d5d500,0x47474700,0x5d5d5d00,0x3d3d3d00,
   1.179 +    0xd9d9d900,0x01010100,0x5a5a5a00,0xd6d6d600,
   1.180 +    0x51515100,0x56565600,0x6c6c6c00,0x4d4d4d00,
   1.181 +    0x8b8b8b00,0x0d0d0d00,0x9a9a9a00,0x66666600,
   1.182 +    0xfbfbfb00,0xcccccc00,0xb0b0b000,0x2d2d2d00,
   1.183 +    0x74747400,0x12121200,0x2b2b2b00,0x20202000,
   1.184 +    0xf0f0f000,0xb1b1b100,0x84848400,0x99999900,
   1.185 +    0xdfdfdf00,0x4c4c4c00,0xcbcbcb00,0xc2c2c200,
   1.186 +    0x34343400,0x7e7e7e00,0x76767600,0x05050500,
   1.187 +    0x6d6d6d00,0xb7b7b700,0xa9a9a900,0x31313100,
   1.188 +    0xd1d1d100,0x17171700,0x04040400,0xd7d7d700,
   1.189 +    0x14141400,0x58585800,0x3a3a3a00,0x61616100,
   1.190 +    0xdedede00,0x1b1b1b00,0x11111100,0x1c1c1c00,
   1.191 +    0x32323200,0x0f0f0f00,0x9c9c9c00,0x16161600,
   1.192 +    0x53535300,0x18181800,0xf2f2f200,0x22222200,
   1.193 +    0xfefefe00,0x44444400,0xcfcfcf00,0xb2b2b200,
   1.194 +    0xc3c3c300,0xb5b5b500,0x7a7a7a00,0x91919100,
   1.195 +    0x24242400,0x08080800,0xe8e8e800,0xa8a8a800,
   1.196 +    0x60606000,0xfcfcfc00,0x69696900,0x50505000,
   1.197 +    0xaaaaaa00,0xd0d0d000,0xa0a0a000,0x7d7d7d00,
   1.198 +    0xa1a1a100,0x89898900,0x62626200,0x97979700,
   1.199 +    0x54545400,0x5b5b5b00,0x1e1e1e00,0x95959500,
   1.200 +    0xe0e0e000,0xffffff00,0x64646400,0xd2d2d200,
   1.201 +    0x10101000,0xc4c4c400,0x00000000,0x48484800,
   1.202 +    0xa3a3a300,0xf7f7f700,0x75757500,0xdbdbdb00,
   1.203 +    0x8a8a8a00,0x03030300,0xe6e6e600,0xdadada00,
   1.204 +    0x09090900,0x3f3f3f00,0xdddddd00,0x94949400,
   1.205 +    0x87878700,0x5c5c5c00,0x83838300,0x02020200,
   1.206 +    0xcdcdcd00,0x4a4a4a00,0x90909000,0x33333300,
   1.207 +    0x73737300,0x67676700,0xf6f6f600,0xf3f3f300,
   1.208 +    0x9d9d9d00,0x7f7f7f00,0xbfbfbf00,0xe2e2e200,
   1.209 +    0x52525200,0x9b9b9b00,0xd8d8d800,0x26262600,
   1.210 +    0xc8c8c800,0x37373700,0xc6c6c600,0x3b3b3b00,
   1.211 +    0x81818100,0x96969600,0x6f6f6f00,0x4b4b4b00,
   1.212 +    0x13131300,0xbebebe00,0x63636300,0x2e2e2e00,
   1.213 +    0xe9e9e900,0x79797900,0xa7a7a700,0x8c8c8c00,
   1.214 +    0x9f9f9f00,0x6e6e6e00,0xbcbcbc00,0x8e8e8e00,
   1.215 +    0x29292900,0xf5f5f500,0xf9f9f900,0xb6b6b600,
   1.216 +    0x2f2f2f00,0xfdfdfd00,0xb4b4b400,0x59595900,
   1.217 +    0x78787800,0x98989800,0x06060600,0x6a6a6a00,
   1.218 +    0xe7e7e700,0x46464600,0x71717100,0xbababa00,
   1.219 +    0xd4d4d400,0x25252500,0xababab00,0x42424200,
   1.220 +    0x88888800,0xa2a2a200,0x8d8d8d00,0xfafafa00,
   1.221 +    0x72727200,0x07070700,0xb9b9b900,0x55555500,
   1.222 +    0xf8f8f800,0xeeeeee00,0xacacac00,0x0a0a0a00,
   1.223 +    0x36363600,0x49494900,0x2a2a2a00,0x68686800,
   1.224 +    0x3c3c3c00,0x38383800,0xf1f1f100,0xa4a4a400,
   1.225 +    0x40404000,0x28282800,0xd3d3d300,0x7b7b7b00,
   1.226 +    0xbbbbbb00,0xc9c9c900,0x43434300,0xc1c1c100,
   1.227 +    0x15151500,0xe3e3e300,0xadadad00,0xf4f4f400,
   1.228 +    0x77777700,0xc7c7c700,0x80808000,0x9e9e9e00,
   1.229 +};
   1.230 +
   1.231 +static const PRUint32 camellia_sp0222[256] = {
   1.232 +    0x00e0e0e0,0x00050505,0x00585858,0x00d9d9d9,
   1.233 +    0x00676767,0x004e4e4e,0x00818181,0x00cbcbcb,
   1.234 +    0x00c9c9c9,0x000b0b0b,0x00aeaeae,0x006a6a6a,
   1.235 +    0x00d5d5d5,0x00181818,0x005d5d5d,0x00828282,
   1.236 +    0x00464646,0x00dfdfdf,0x00d6d6d6,0x00272727,
   1.237 +    0x008a8a8a,0x00323232,0x004b4b4b,0x00424242,
   1.238 +    0x00dbdbdb,0x001c1c1c,0x009e9e9e,0x009c9c9c,
   1.239 +    0x003a3a3a,0x00cacaca,0x00252525,0x007b7b7b,
   1.240 +    0x000d0d0d,0x00717171,0x005f5f5f,0x001f1f1f,
   1.241 +    0x00f8f8f8,0x00d7d7d7,0x003e3e3e,0x009d9d9d,
   1.242 +    0x007c7c7c,0x00606060,0x00b9b9b9,0x00bebebe,
   1.243 +    0x00bcbcbc,0x008b8b8b,0x00161616,0x00343434,
   1.244 +    0x004d4d4d,0x00c3c3c3,0x00727272,0x00959595,
   1.245 +    0x00ababab,0x008e8e8e,0x00bababa,0x007a7a7a,
   1.246 +    0x00b3b3b3,0x00020202,0x00b4b4b4,0x00adadad,
   1.247 +    0x00a2a2a2,0x00acacac,0x00d8d8d8,0x009a9a9a,
   1.248 +    0x00171717,0x001a1a1a,0x00353535,0x00cccccc,
   1.249 +    0x00f7f7f7,0x00999999,0x00616161,0x005a5a5a,
   1.250 +    0x00e8e8e8,0x00242424,0x00565656,0x00404040,
   1.251 +    0x00e1e1e1,0x00636363,0x00090909,0x00333333,
   1.252 +    0x00bfbfbf,0x00989898,0x00979797,0x00858585,
   1.253 +    0x00686868,0x00fcfcfc,0x00ececec,0x000a0a0a,
   1.254 +    0x00dadada,0x006f6f6f,0x00535353,0x00626262,
   1.255 +    0x00a3a3a3,0x002e2e2e,0x00080808,0x00afafaf,
   1.256 +    0x00282828,0x00b0b0b0,0x00747474,0x00c2c2c2,
   1.257 +    0x00bdbdbd,0x00363636,0x00222222,0x00383838,
   1.258 +    0x00646464,0x001e1e1e,0x00393939,0x002c2c2c,
   1.259 +    0x00a6a6a6,0x00303030,0x00e5e5e5,0x00444444,
   1.260 +    0x00fdfdfd,0x00888888,0x009f9f9f,0x00656565,
   1.261 +    0x00878787,0x006b6b6b,0x00f4f4f4,0x00232323,
   1.262 +    0x00484848,0x00101010,0x00d1d1d1,0x00515151,
   1.263 +    0x00c0c0c0,0x00f9f9f9,0x00d2d2d2,0x00a0a0a0,
   1.264 +    0x00555555,0x00a1a1a1,0x00414141,0x00fafafa,
   1.265 +    0x00434343,0x00131313,0x00c4c4c4,0x002f2f2f,
   1.266 +    0x00a8a8a8,0x00b6b6b6,0x003c3c3c,0x002b2b2b,
   1.267 +    0x00c1c1c1,0x00ffffff,0x00c8c8c8,0x00a5a5a5,
   1.268 +    0x00202020,0x00898989,0x00000000,0x00909090,
   1.269 +    0x00474747,0x00efefef,0x00eaeaea,0x00b7b7b7,
   1.270 +    0x00151515,0x00060606,0x00cdcdcd,0x00b5b5b5,
   1.271 +    0x00121212,0x007e7e7e,0x00bbbbbb,0x00292929,
   1.272 +    0x000f0f0f,0x00b8b8b8,0x00070707,0x00040404,
   1.273 +    0x009b9b9b,0x00949494,0x00212121,0x00666666,
   1.274 +    0x00e6e6e6,0x00cecece,0x00ededed,0x00e7e7e7,
   1.275 +    0x003b3b3b,0x00fefefe,0x007f7f7f,0x00c5c5c5,
   1.276 +    0x00a4a4a4,0x00373737,0x00b1b1b1,0x004c4c4c,
   1.277 +    0x00919191,0x006e6e6e,0x008d8d8d,0x00767676,
   1.278 +    0x00030303,0x002d2d2d,0x00dedede,0x00969696,
   1.279 +    0x00262626,0x007d7d7d,0x00c6c6c6,0x005c5c5c,
   1.280 +    0x00d3d3d3,0x00f2f2f2,0x004f4f4f,0x00191919,
   1.281 +    0x003f3f3f,0x00dcdcdc,0x00797979,0x001d1d1d,
   1.282 +    0x00525252,0x00ebebeb,0x00f3f3f3,0x006d6d6d,
   1.283 +    0x005e5e5e,0x00fbfbfb,0x00696969,0x00b2b2b2,
   1.284 +    0x00f0f0f0,0x00313131,0x000c0c0c,0x00d4d4d4,
   1.285 +    0x00cfcfcf,0x008c8c8c,0x00e2e2e2,0x00757575,
   1.286 +    0x00a9a9a9,0x004a4a4a,0x00575757,0x00848484,
   1.287 +    0x00111111,0x00454545,0x001b1b1b,0x00f5f5f5,
   1.288 +    0x00e4e4e4,0x000e0e0e,0x00737373,0x00aaaaaa,
   1.289 +    0x00f1f1f1,0x00dddddd,0x00595959,0x00141414,
   1.290 +    0x006c6c6c,0x00929292,0x00545454,0x00d0d0d0,
   1.291 +    0x00787878,0x00707070,0x00e3e3e3,0x00494949,
   1.292 +    0x00808080,0x00505050,0x00a7a7a7,0x00f6f6f6,
   1.293 +    0x00777777,0x00939393,0x00868686,0x00838383,
   1.294 +    0x002a2a2a,0x00c7c7c7,0x005b5b5b,0x00e9e9e9,
   1.295 +    0x00eeeeee,0x008f8f8f,0x00010101,0x003d3d3d,
   1.296 +};
   1.297 +
   1.298 +static const PRUint32 camellia_sp3033[256] = {
   1.299 +    0x38003838,0x41004141,0x16001616,0x76007676,
   1.300 +    0xd900d9d9,0x93009393,0x60006060,0xf200f2f2,
   1.301 +    0x72007272,0xc200c2c2,0xab00abab,0x9a009a9a,
   1.302 +    0x75007575,0x06000606,0x57005757,0xa000a0a0,
   1.303 +    0x91009191,0xf700f7f7,0xb500b5b5,0xc900c9c9,
   1.304 +    0xa200a2a2,0x8c008c8c,0xd200d2d2,0x90009090,
   1.305 +    0xf600f6f6,0x07000707,0xa700a7a7,0x27002727,
   1.306 +    0x8e008e8e,0xb200b2b2,0x49004949,0xde00dede,
   1.307 +    0x43004343,0x5c005c5c,0xd700d7d7,0xc700c7c7,
   1.308 +    0x3e003e3e,0xf500f5f5,0x8f008f8f,0x67006767,
   1.309 +    0x1f001f1f,0x18001818,0x6e006e6e,0xaf00afaf,
   1.310 +    0x2f002f2f,0xe200e2e2,0x85008585,0x0d000d0d,
   1.311 +    0x53005353,0xf000f0f0,0x9c009c9c,0x65006565,
   1.312 +    0xea00eaea,0xa300a3a3,0xae00aeae,0x9e009e9e,
   1.313 +    0xec00ecec,0x80008080,0x2d002d2d,0x6b006b6b,
   1.314 +    0xa800a8a8,0x2b002b2b,0x36003636,0xa600a6a6,
   1.315 +    0xc500c5c5,0x86008686,0x4d004d4d,0x33003333,
   1.316 +    0xfd00fdfd,0x66006666,0x58005858,0x96009696,
   1.317 +    0x3a003a3a,0x09000909,0x95009595,0x10001010,
   1.318 +    0x78007878,0xd800d8d8,0x42004242,0xcc00cccc,
   1.319 +    0xef00efef,0x26002626,0xe500e5e5,0x61006161,
   1.320 +    0x1a001a1a,0x3f003f3f,0x3b003b3b,0x82008282,
   1.321 +    0xb600b6b6,0xdb00dbdb,0xd400d4d4,0x98009898,
   1.322 +    0xe800e8e8,0x8b008b8b,0x02000202,0xeb00ebeb,
   1.323 +    0x0a000a0a,0x2c002c2c,0x1d001d1d,0xb000b0b0,
   1.324 +    0x6f006f6f,0x8d008d8d,0x88008888,0x0e000e0e,
   1.325 +    0x19001919,0x87008787,0x4e004e4e,0x0b000b0b,
   1.326 +    0xa900a9a9,0x0c000c0c,0x79007979,0x11001111,
   1.327 +    0x7f007f7f,0x22002222,0xe700e7e7,0x59005959,
   1.328 +    0xe100e1e1,0xda00dada,0x3d003d3d,0xc800c8c8,
   1.329 +    0x12001212,0x04000404,0x74007474,0x54005454,
   1.330 +    0x30003030,0x7e007e7e,0xb400b4b4,0x28002828,
   1.331 +    0x55005555,0x68006868,0x50005050,0xbe00bebe,
   1.332 +    0xd000d0d0,0xc400c4c4,0x31003131,0xcb00cbcb,
   1.333 +    0x2a002a2a,0xad00adad,0x0f000f0f,0xca00caca,
   1.334 +    0x70007070,0xff00ffff,0x32003232,0x69006969,
   1.335 +    0x08000808,0x62006262,0x00000000,0x24002424,
   1.336 +    0xd100d1d1,0xfb00fbfb,0xba00baba,0xed00eded,
   1.337 +    0x45004545,0x81008181,0x73007373,0x6d006d6d,
   1.338 +    0x84008484,0x9f009f9f,0xee00eeee,0x4a004a4a,
   1.339 +    0xc300c3c3,0x2e002e2e,0xc100c1c1,0x01000101,
   1.340 +    0xe600e6e6,0x25002525,0x48004848,0x99009999,
   1.341 +    0xb900b9b9,0xb300b3b3,0x7b007b7b,0xf900f9f9,
   1.342 +    0xce00cece,0xbf00bfbf,0xdf00dfdf,0x71007171,
   1.343 +    0x29002929,0xcd00cdcd,0x6c006c6c,0x13001313,
   1.344 +    0x64006464,0x9b009b9b,0x63006363,0x9d009d9d,
   1.345 +    0xc000c0c0,0x4b004b4b,0xb700b7b7,0xa500a5a5,
   1.346 +    0x89008989,0x5f005f5f,0xb100b1b1,0x17001717,
   1.347 +    0xf400f4f4,0xbc00bcbc,0xd300d3d3,0x46004646,
   1.348 +    0xcf00cfcf,0x37003737,0x5e005e5e,0x47004747,
   1.349 +    0x94009494,0xfa00fafa,0xfc00fcfc,0x5b005b5b,
   1.350 +    0x97009797,0xfe00fefe,0x5a005a5a,0xac00acac,
   1.351 +    0x3c003c3c,0x4c004c4c,0x03000303,0x35003535,
   1.352 +    0xf300f3f3,0x23002323,0xb800b8b8,0x5d005d5d,
   1.353 +    0x6a006a6a,0x92009292,0xd500d5d5,0x21002121,
   1.354 +    0x44004444,0x51005151,0xc600c6c6,0x7d007d7d,
   1.355 +    0x39003939,0x83008383,0xdc00dcdc,0xaa00aaaa,
   1.356 +    0x7c007c7c,0x77007777,0x56005656,0x05000505,
   1.357 +    0x1b001b1b,0xa400a4a4,0x15001515,0x34003434,
   1.358 +    0x1e001e1e,0x1c001c1c,0xf800f8f8,0x52005252,
   1.359 +    0x20002020,0x14001414,0xe900e9e9,0xbd00bdbd,
   1.360 +    0xdd00dddd,0xe400e4e4,0xa100a1a1,0xe000e0e0,
   1.361 +    0x8a008a8a,0xf100f1f1,0xd600d6d6,0x7a007a7a,
   1.362 +    0xbb00bbbb,0xe300e3e3,0x40004040,0x4f004f4f,
   1.363 +};
   1.364 +
   1.365 +static const PRUint32 camellia_sp4404[256] = {
   1.366 +    0x70700070,0x2c2c002c,0xb3b300b3,0xc0c000c0,
   1.367 +    0xe4e400e4,0x57570057,0xeaea00ea,0xaeae00ae,
   1.368 +    0x23230023,0x6b6b006b,0x45450045,0xa5a500a5,
   1.369 +    0xeded00ed,0x4f4f004f,0x1d1d001d,0x92920092,
   1.370 +    0x86860086,0xafaf00af,0x7c7c007c,0x1f1f001f,
   1.371 +    0x3e3e003e,0xdcdc00dc,0x5e5e005e,0x0b0b000b,
   1.372 +    0xa6a600a6,0x39390039,0xd5d500d5,0x5d5d005d,
   1.373 +    0xd9d900d9,0x5a5a005a,0x51510051,0x6c6c006c,
   1.374 +    0x8b8b008b,0x9a9a009a,0xfbfb00fb,0xb0b000b0,
   1.375 +    0x74740074,0x2b2b002b,0xf0f000f0,0x84840084,
   1.376 +    0xdfdf00df,0xcbcb00cb,0x34340034,0x76760076,
   1.377 +    0x6d6d006d,0xa9a900a9,0xd1d100d1,0x04040004,
   1.378 +    0x14140014,0x3a3a003a,0xdede00de,0x11110011,
   1.379 +    0x32320032,0x9c9c009c,0x53530053,0xf2f200f2,
   1.380 +    0xfefe00fe,0xcfcf00cf,0xc3c300c3,0x7a7a007a,
   1.381 +    0x24240024,0xe8e800e8,0x60600060,0x69690069,
   1.382 +    0xaaaa00aa,0xa0a000a0,0xa1a100a1,0x62620062,
   1.383 +    0x54540054,0x1e1e001e,0xe0e000e0,0x64640064,
   1.384 +    0x10100010,0x00000000,0xa3a300a3,0x75750075,
   1.385 +    0x8a8a008a,0xe6e600e6,0x09090009,0xdddd00dd,
   1.386 +    0x87870087,0x83830083,0xcdcd00cd,0x90900090,
   1.387 +    0x73730073,0xf6f600f6,0x9d9d009d,0xbfbf00bf,
   1.388 +    0x52520052,0xd8d800d8,0xc8c800c8,0xc6c600c6,
   1.389 +    0x81810081,0x6f6f006f,0x13130013,0x63630063,
   1.390 +    0xe9e900e9,0xa7a700a7,0x9f9f009f,0xbcbc00bc,
   1.391 +    0x29290029,0xf9f900f9,0x2f2f002f,0xb4b400b4,
   1.392 +    0x78780078,0x06060006,0xe7e700e7,0x71710071,
   1.393 +    0xd4d400d4,0xabab00ab,0x88880088,0x8d8d008d,
   1.394 +    0x72720072,0xb9b900b9,0xf8f800f8,0xacac00ac,
   1.395 +    0x36360036,0x2a2a002a,0x3c3c003c,0xf1f100f1,
   1.396 +    0x40400040,0xd3d300d3,0xbbbb00bb,0x43430043,
   1.397 +    0x15150015,0xadad00ad,0x77770077,0x80800080,
   1.398 +    0x82820082,0xecec00ec,0x27270027,0xe5e500e5,
   1.399 +    0x85850085,0x35350035,0x0c0c000c,0x41410041,
   1.400 +    0xefef00ef,0x93930093,0x19190019,0x21210021,
   1.401 +    0x0e0e000e,0x4e4e004e,0x65650065,0xbdbd00bd,
   1.402 +    0xb8b800b8,0x8f8f008f,0xebeb00eb,0xcece00ce,
   1.403 +    0x30300030,0x5f5f005f,0xc5c500c5,0x1a1a001a,
   1.404 +    0xe1e100e1,0xcaca00ca,0x47470047,0x3d3d003d,
   1.405 +    0x01010001,0xd6d600d6,0x56560056,0x4d4d004d,
   1.406 +    0x0d0d000d,0x66660066,0xcccc00cc,0x2d2d002d,
   1.407 +    0x12120012,0x20200020,0xb1b100b1,0x99990099,
   1.408 +    0x4c4c004c,0xc2c200c2,0x7e7e007e,0x05050005,
   1.409 +    0xb7b700b7,0x31310031,0x17170017,0xd7d700d7,
   1.410 +    0x58580058,0x61610061,0x1b1b001b,0x1c1c001c,
   1.411 +    0x0f0f000f,0x16160016,0x18180018,0x22220022,
   1.412 +    0x44440044,0xb2b200b2,0xb5b500b5,0x91910091,
   1.413 +    0x08080008,0xa8a800a8,0xfcfc00fc,0x50500050,
   1.414 +    0xd0d000d0,0x7d7d007d,0x89890089,0x97970097,
   1.415 +    0x5b5b005b,0x95950095,0xffff00ff,0xd2d200d2,
   1.416 +    0xc4c400c4,0x48480048,0xf7f700f7,0xdbdb00db,
   1.417 +    0x03030003,0xdada00da,0x3f3f003f,0x94940094,
   1.418 +    0x5c5c005c,0x02020002,0x4a4a004a,0x33330033,
   1.419 +    0x67670067,0xf3f300f3,0x7f7f007f,0xe2e200e2,
   1.420 +    0x9b9b009b,0x26260026,0x37370037,0x3b3b003b,
   1.421 +    0x96960096,0x4b4b004b,0xbebe00be,0x2e2e002e,
   1.422 +    0x79790079,0x8c8c008c,0x6e6e006e,0x8e8e008e,
   1.423 +    0xf5f500f5,0xb6b600b6,0xfdfd00fd,0x59590059,
   1.424 +    0x98980098,0x6a6a006a,0x46460046,0xbaba00ba,
   1.425 +    0x25250025,0x42420042,0xa2a200a2,0xfafa00fa,
   1.426 +    0x07070007,0x55550055,0xeeee00ee,0x0a0a000a,
   1.427 +    0x49490049,0x68680068,0x38380038,0xa4a400a4,
   1.428 +    0x28280028,0x7b7b007b,0xc9c900c9,0xc1c100c1,
   1.429 +    0xe3e300e3,0xf4f400f4,0xc7c700c7,0x9e9e009e,
   1.430 +};
   1.431 +
   1.432 +
   1.433 +/**
   1.434 + * Stuff related to the Camellia key schedule
   1.435 + */
   1.436 +#define subl(x) subL[(x)]
   1.437 +#define subr(x) subR[(x)]
   1.438 +
   1.439 +void camellia_setup128(const unsigned char *key, PRUint32 *subkey)
   1.440 +{
   1.441 +    PRUint32 kll, klr, krl, krr;
   1.442 +    PRUint32 il, ir, t0, t1, w0, w1;
   1.443 +    PRUint32 kw4l, kw4r, dw, tl, tr;
   1.444 +    PRUint32 subL[26];
   1.445 +    PRUint32 subR[26];
   1.446 +#if defined(CAMELLIA_NEED_TMP_VARIABLE)
   1.447 +    PRUint32 tmp;
   1.448 +#endif
   1.449 +
   1.450 +    /**
   1.451 +     *  k == kll || klr || krl || krr (|| is concatination)
   1.452 +     */
   1.453 +    kll = GETU32(key     );
   1.454 +    klr = GETU32(key +  4);
   1.455 +    krl = GETU32(key +  8);
   1.456 +    krr = GETU32(key + 12);
   1.457 +    /**
   1.458 +     * generate KL dependent subkeys
   1.459 +     */
   1.460 +    subl(0) = kll; subr(0) = klr;
   1.461 +    subl(1) = krl; subr(1) = krr;
   1.462 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
   1.463 +    subl(4) = kll; subr(4) = klr;
   1.464 +    subl(5) = krl; subr(5) = krr;
   1.465 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30);
   1.466 +    subl(10) = kll; subr(10) = klr;
   1.467 +    subl(11) = krl; subr(11) = krr;
   1.468 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
   1.469 +    subl(13) = krl; subr(13) = krr;
   1.470 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
   1.471 +    subl(16) = kll; subr(16) = klr;
   1.472 +    subl(17) = krl; subr(17) = krr;
   1.473 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
   1.474 +    subl(18) = kll; subr(18) = klr;
   1.475 +    subl(19) = krl; subr(19) = krr;
   1.476 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
   1.477 +    subl(22) = kll; subr(22) = klr;
   1.478 +    subl(23) = krl; subr(23) = krr;
   1.479 +
   1.480 +    /* generate KA */
   1.481 +    kll = subl(0); klr = subr(0);
   1.482 +    krl = subl(1); krr = subr(1);
   1.483 +    CAMELLIA_F(kll, klr,
   1.484 +	       CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
   1.485 +	       w0, w1, il, ir, t0, t1);
   1.486 +    krl ^= w0; krr ^= w1;
   1.487 +    CAMELLIA_F(krl, krr,
   1.488 +	       CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
   1.489 +	       kll, klr, il, ir, t0, t1);
   1.490 +    CAMELLIA_F(kll, klr,
   1.491 +	       CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
   1.492 +	       krl, krr, il, ir, t0, t1);
   1.493 +    krl ^= w0; krr ^= w1;
   1.494 +    CAMELLIA_F(krl, krr,
   1.495 +	       CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
   1.496 +	       w0, w1, il, ir, t0, t1);
   1.497 +    kll ^= w0; klr ^= w1;
   1.498 +
   1.499 +    /* generate KA dependent subkeys */
   1.500 +    subl(2) = kll; subr(2) = klr;
   1.501 +    subl(3) = krl; subr(3) = krr;
   1.502 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
   1.503 +    subl(6) = kll; subr(6) = klr;
   1.504 +    subl(7) = krl; subr(7) = krr;
   1.505 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
   1.506 +    subl(8) = kll; subr(8) = klr;
   1.507 +    subl(9) = krl; subr(9) = krr;
   1.508 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
   1.509 +    subl(12) = kll; subr(12) = klr;
   1.510 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
   1.511 +    subl(14) = kll; subr(14) = klr;
   1.512 +    subl(15) = krl; subr(15) = krr;
   1.513 +    CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
   1.514 +    subl(20) = kll; subr(20) = klr;
   1.515 +    subl(21) = krl; subr(21) = krr;
   1.516 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
   1.517 +    subl(24) = kll; subr(24) = klr;
   1.518 +    subl(25) = krl; subr(25) = krr;
   1.519 +
   1.520 +
   1.521 +    /* absorb kw2 to other subkeys */
   1.522 +    subl(3) ^= subl(1); subr(3) ^= subr(1);
   1.523 +    subl(5) ^= subl(1); subr(5) ^= subr(1);
   1.524 +    subl(7) ^= subl(1); subr(7) ^= subr(1);
   1.525 +    subl(1) ^= subr(1) & ~subr(9);
   1.526 +    dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw);
   1.527 +    subl(11) ^= subl(1); subr(11) ^= subr(1);
   1.528 +    subl(13) ^= subl(1); subr(13) ^= subr(1);
   1.529 +    subl(15) ^= subl(1); subr(15) ^= subr(1);
   1.530 +    subl(1) ^= subr(1) & ~subr(17);
   1.531 +    dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw);
   1.532 +    subl(19) ^= subl(1); subr(19) ^= subr(1);
   1.533 +    subl(21) ^= subl(1); subr(21) ^= subr(1);
   1.534 +    subl(23) ^= subl(1); subr(23) ^= subr(1);
   1.535 +    subl(24) ^= subl(1); subr(24) ^= subr(1);
   1.536 +
   1.537 +    /* absorb kw4 to other subkeys */
   1.538 +    kw4l = subl(25); kw4r = subr(25);
   1.539 +    subl(22) ^= kw4l; subr(22) ^= kw4r;
   1.540 +    subl(20) ^= kw4l; subr(20) ^= kw4r;
   1.541 +    subl(18) ^= kw4l; subr(18) ^= kw4r;
   1.542 +    kw4l ^= kw4r & ~subr(16);
   1.543 +    dw = kw4l & subl(16), kw4r ^= CAMELLIA_RL1(dw);
   1.544 +    subl(14) ^= kw4l; subr(14) ^= kw4r;
   1.545 +    subl(12) ^= kw4l; subr(12) ^= kw4r;
   1.546 +    subl(10) ^= kw4l; subr(10) ^= kw4r;
   1.547 +    kw4l ^= kw4r & ~subr(8);
   1.548 +    dw = kw4l & subl(8), kw4r ^= CAMELLIA_RL1(dw);
   1.549 +    subl(6) ^= kw4l; subr(6) ^= kw4r;
   1.550 +    subl(4) ^= kw4l; subr(4) ^= kw4r;
   1.551 +    subl(2) ^= kw4l; subr(2) ^= kw4r;
   1.552 +    subl(0) ^= kw4l; subr(0) ^= kw4r;
   1.553 +
   1.554 +    /* key XOR is end of F-function */
   1.555 +    CamelliaSubkeyL(0) = subl(0) ^ subl(2);
   1.556 +    CamelliaSubkeyR(0) = subr(0) ^ subr(2);
   1.557 +    CamelliaSubkeyL(2) = subl(3);
   1.558 +    CamelliaSubkeyR(2) = subr(3);
   1.559 +    CamelliaSubkeyL(3) = subl(2) ^ subl(4);
   1.560 +    CamelliaSubkeyR(3) = subr(2) ^ subr(4);
   1.561 +    CamelliaSubkeyL(4) = subl(3) ^ subl(5);
   1.562 +    CamelliaSubkeyR(4) = subr(3) ^ subr(5);
   1.563 +    CamelliaSubkeyL(5) = subl(4) ^ subl(6);
   1.564 +    CamelliaSubkeyR(5) = subr(4) ^ subr(6);
   1.565 +    CamelliaSubkeyL(6) = subl(5) ^ subl(7);
   1.566 +    CamelliaSubkeyR(6) = subr(5) ^ subr(7);
   1.567 +    tl = subl(10) ^ (subr(10) & ~subr(8));
   1.568 +    dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw);
   1.569 +    CamelliaSubkeyL(7) = subl(6) ^ tl;
   1.570 +    CamelliaSubkeyR(7) = subr(6) ^ tr;
   1.571 +    CamelliaSubkeyL(8) = subl(8);
   1.572 +    CamelliaSubkeyR(8) = subr(8);
   1.573 +    CamelliaSubkeyL(9) = subl(9);
   1.574 +    CamelliaSubkeyR(9) = subr(9);
   1.575 +    tl = subl(7) ^ (subr(7) & ~subr(9));
   1.576 +    dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw);
   1.577 +    CamelliaSubkeyL(10) = tl ^ subl(11);
   1.578 +    CamelliaSubkeyR(10) = tr ^ subr(11);
   1.579 +    CamelliaSubkeyL(11) = subl(10) ^ subl(12);
   1.580 +    CamelliaSubkeyR(11) = subr(10) ^ subr(12);
   1.581 +    CamelliaSubkeyL(12) = subl(11) ^ subl(13);
   1.582 +    CamelliaSubkeyR(12) = subr(11) ^ subr(13);
   1.583 +    CamelliaSubkeyL(13) = subl(12) ^ subl(14);
   1.584 +    CamelliaSubkeyR(13) = subr(12) ^ subr(14);
   1.585 +    CamelliaSubkeyL(14) = subl(13) ^ subl(15);
   1.586 +    CamelliaSubkeyR(14) = subr(13) ^ subr(15);
   1.587 +    tl = subl(18) ^ (subr(18) & ~subr(16));
   1.588 +    dw = tl & subl(16),	tr = subr(18) ^ CAMELLIA_RL1(dw);
   1.589 +    CamelliaSubkeyL(15) = subl(14) ^ tl;
   1.590 +    CamelliaSubkeyR(15) = subr(14) ^ tr;
   1.591 +    CamelliaSubkeyL(16) = subl(16);
   1.592 +    CamelliaSubkeyR(16) = subr(16);
   1.593 +    CamelliaSubkeyL(17) = subl(17);
   1.594 +    CamelliaSubkeyR(17) = subr(17);
   1.595 +    tl = subl(15) ^ (subr(15) & ~subr(17));
   1.596 +    dw = tl & subl(17),	tr = subr(15) ^ CAMELLIA_RL1(dw);
   1.597 +    CamelliaSubkeyL(18) = tl ^ subl(19);
   1.598 +    CamelliaSubkeyR(18) = tr ^ subr(19);
   1.599 +    CamelliaSubkeyL(19) = subl(18) ^ subl(20);
   1.600 +    CamelliaSubkeyR(19) = subr(18) ^ subr(20);
   1.601 +    CamelliaSubkeyL(20) = subl(19) ^ subl(21);
   1.602 +    CamelliaSubkeyR(20) = subr(19) ^ subr(21);
   1.603 +    CamelliaSubkeyL(21) = subl(20) ^ subl(22);
   1.604 +    CamelliaSubkeyR(21) = subr(20) ^ subr(22);
   1.605 +    CamelliaSubkeyL(22) = subl(21) ^ subl(23);
   1.606 +    CamelliaSubkeyR(22) = subr(21) ^ subr(23);
   1.607 +    CamelliaSubkeyL(23) = subl(22);
   1.608 +    CamelliaSubkeyR(23) = subr(22);
   1.609 +    CamelliaSubkeyL(24) = subl(24) ^ subl(23);
   1.610 +    CamelliaSubkeyR(24) = subr(24) ^ subr(23);
   1.611 +
   1.612 +    /* apply the inverse of the last half of P-function */
   1.613 +    dw = CamelliaSubkeyL(2) ^ CamelliaSubkeyR(2), dw = CAMELLIA_RL8(dw);
   1.614 +    CamelliaSubkeyR(2) = CamelliaSubkeyL(2) ^ dw, CamelliaSubkeyL(2) = dw;
   1.615 +    dw = CamelliaSubkeyL(3) ^ CamelliaSubkeyR(3), dw = CAMELLIA_RL8(dw);
   1.616 +    CamelliaSubkeyR(3) = CamelliaSubkeyL(3) ^ dw, CamelliaSubkeyL(3) = dw;
   1.617 +    dw = CamelliaSubkeyL(4) ^ CamelliaSubkeyR(4), dw = CAMELLIA_RL8(dw);
   1.618 +    CamelliaSubkeyR(4) = CamelliaSubkeyL(4) ^ dw, CamelliaSubkeyL(4) = dw;
   1.619 +    dw = CamelliaSubkeyL(5) ^ CamelliaSubkeyR(5), dw = CAMELLIA_RL8(dw);
   1.620 +    CamelliaSubkeyR(5) = CamelliaSubkeyL(5) ^ dw, CamelliaSubkeyL(5) = dw;
   1.621 +    dw = CamelliaSubkeyL(6) ^ CamelliaSubkeyR(6), dw = CAMELLIA_RL8(dw);
   1.622 +    CamelliaSubkeyR(6) = CamelliaSubkeyL(6) ^ dw, CamelliaSubkeyL(6) = dw;
   1.623 +    dw = CamelliaSubkeyL(7) ^ CamelliaSubkeyR(7), dw = CAMELLIA_RL8(dw);
   1.624 +    CamelliaSubkeyR(7) = CamelliaSubkeyL(7) ^ dw, CamelliaSubkeyL(7) = dw;
   1.625 +    dw = CamelliaSubkeyL(10) ^ CamelliaSubkeyR(10), dw = CAMELLIA_RL8(dw);
   1.626 +    CamelliaSubkeyR(10) = CamelliaSubkeyL(10) ^ dw, CamelliaSubkeyL(10) = dw;
   1.627 +    dw = CamelliaSubkeyL(11) ^ CamelliaSubkeyR(11), dw = CAMELLIA_RL8(dw);
   1.628 +    CamelliaSubkeyR(11) = CamelliaSubkeyL(11) ^ dw, CamelliaSubkeyL(11) = dw;
   1.629 +    dw = CamelliaSubkeyL(12) ^ CamelliaSubkeyR(12), dw = CAMELLIA_RL8(dw);
   1.630 +    CamelliaSubkeyR(12) = CamelliaSubkeyL(12) ^ dw, CamelliaSubkeyL(12) = dw;
   1.631 +    dw = CamelliaSubkeyL(13) ^ CamelliaSubkeyR(13), dw = CAMELLIA_RL8(dw);
   1.632 +    CamelliaSubkeyR(13) = CamelliaSubkeyL(13) ^ dw, CamelliaSubkeyL(13) = dw;
   1.633 +    dw = CamelliaSubkeyL(14) ^ CamelliaSubkeyR(14), dw = CAMELLIA_RL8(dw);
   1.634 +    CamelliaSubkeyR(14) = CamelliaSubkeyL(14) ^ dw, CamelliaSubkeyL(14) = dw;
   1.635 +    dw = CamelliaSubkeyL(15) ^ CamelliaSubkeyR(15), dw = CAMELLIA_RL8(dw);
   1.636 +    CamelliaSubkeyR(15) = CamelliaSubkeyL(15) ^ dw, CamelliaSubkeyL(15) = dw;
   1.637 +    dw = CamelliaSubkeyL(18) ^ CamelliaSubkeyR(18), dw = CAMELLIA_RL8(dw);
   1.638 +    CamelliaSubkeyR(18) = CamelliaSubkeyL(18) ^ dw, CamelliaSubkeyL(18) = dw;
   1.639 +    dw = CamelliaSubkeyL(19) ^ CamelliaSubkeyR(19), dw = CAMELLIA_RL8(dw);
   1.640 +    CamelliaSubkeyR(19) = CamelliaSubkeyL(19) ^ dw, CamelliaSubkeyL(19) = dw;
   1.641 +    dw = CamelliaSubkeyL(20) ^ CamelliaSubkeyR(20), dw = CAMELLIA_RL8(dw);
   1.642 +    CamelliaSubkeyR(20) = CamelliaSubkeyL(20) ^ dw, CamelliaSubkeyL(20) = dw;
   1.643 +    dw = CamelliaSubkeyL(21) ^ CamelliaSubkeyR(21), dw = CAMELLIA_RL8(dw);
   1.644 +    CamelliaSubkeyR(21) = CamelliaSubkeyL(21) ^ dw, CamelliaSubkeyL(21) = dw;
   1.645 +    dw = CamelliaSubkeyL(22) ^ CamelliaSubkeyR(22), dw = CAMELLIA_RL8(dw);
   1.646 +    CamelliaSubkeyR(22) = CamelliaSubkeyL(22) ^ dw, CamelliaSubkeyL(22) = dw;
   1.647 +    dw = CamelliaSubkeyL(23) ^ CamelliaSubkeyR(23), dw = CAMELLIA_RL8(dw);
   1.648 +    CamelliaSubkeyR(23) = CamelliaSubkeyL(23) ^ dw, CamelliaSubkeyL(23) = dw;
   1.649 +
   1.650 +    return;
   1.651 +}
   1.652 +
   1.653 +void camellia_setup256(const unsigned char *key, PRUint32 *subkey)
   1.654 +{
   1.655 +    PRUint32 kll,klr,krl,krr;           /* left half of key */
   1.656 +    PRUint32 krll,krlr,krrl,krrr;       /* right half of key */
   1.657 +    PRUint32 il, ir, t0, t1, w0, w1;    /* temporary variables */
   1.658 +    PRUint32 kw4l, kw4r, dw, tl, tr;
   1.659 +    PRUint32 subL[34];
   1.660 +    PRUint32 subR[34];
   1.661 +#if defined(CAMELLIA_NEED_TMP_VARIABLE)
   1.662 +    PRUint32 tmp;
   1.663 +#endif
   1.664 +
   1.665 +    /**
   1.666 +     *  key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
   1.667 +     *  (|| is concatination)
   1.668 +     */
   1.669 +
   1.670 +    kll  = GETU32(key     );
   1.671 +    klr  = GETU32(key +  4);
   1.672 +    krl  = GETU32(key +  8);
   1.673 +    krr  = GETU32(key + 12);
   1.674 +    krll = GETU32(key + 16);
   1.675 +    krlr = GETU32(key + 20);
   1.676 +    krrl = GETU32(key + 24);
   1.677 +    krrr = GETU32(key + 28);
   1.678 +
   1.679 +    /* generate KL dependent subkeys */
   1.680 +    subl(0) = kll; subr(0) = klr;
   1.681 +    subl(1) = krl; subr(1) = krr;
   1.682 +    CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
   1.683 +    subl(12) = kll; subr(12) = klr;
   1.684 +    subl(13) = krl; subr(13) = krr;
   1.685 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
   1.686 +    subl(16) = kll; subr(16) = klr;
   1.687 +    subl(17) = krl; subr(17) = krr;
   1.688 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
   1.689 +    subl(22) = kll; subr(22) = klr;
   1.690 +    subl(23) = krl; subr(23) = krr;
   1.691 +    CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
   1.692 +    subl(30) = kll; subr(30) = klr;
   1.693 +    subl(31) = krl; subr(31) = krr;
   1.694 +
   1.695 +    /* generate KR dependent subkeys */
   1.696 +    CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
   1.697 +    subl(4) = krll; subr(4) = krlr;
   1.698 +    subl(5) = krrl; subr(5) = krrr;
   1.699 +    CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
   1.700 +    subl(8) = krll; subr(8) = krlr;
   1.701 +    subl(9) = krrl; subr(9) = krrr;
   1.702 +    CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
   1.703 +    subl(18) = krll; subr(18) = krlr;
   1.704 +    subl(19) = krrl; subr(19) = krrr;
   1.705 +    CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
   1.706 +    subl(26) = krll; subr(26) = krlr;
   1.707 +    subl(27) = krrl; subr(27) = krrr;
   1.708 +    CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
   1.709 +
   1.710 +    /* generate KA */
   1.711 +    kll = subl(0) ^ krll; klr = subr(0) ^ krlr;
   1.712 +    krl = subl(1) ^ krrl; krr = subr(1) ^ krrr;
   1.713 +    CAMELLIA_F(kll, klr,
   1.714 +	       CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
   1.715 +	       w0, w1, il, ir, t0, t1);
   1.716 +    krl ^= w0; krr ^= w1;
   1.717 +    CAMELLIA_F(krl, krr,
   1.718 +	       CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
   1.719 +	       kll, klr, il, ir, t0, t1);
   1.720 +    kll ^= krll; klr ^= krlr;
   1.721 +    CAMELLIA_F(kll, klr,
   1.722 +	       CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
   1.723 +	       krl, krr, il, ir, t0, t1);
   1.724 +    krl ^= w0 ^ krrl; krr ^= w1 ^ krrr;
   1.725 +    CAMELLIA_F(krl, krr,
   1.726 +	       CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
   1.727 +	       w0, w1, il, ir, t0, t1);
   1.728 +    kll ^= w0; klr ^= w1;
   1.729 +
   1.730 +    /* generate KB */
   1.731 +    krll ^= kll; krlr ^= klr;
   1.732 +    krrl ^= krl; krrr ^= krr;
   1.733 +    CAMELLIA_F(krll, krlr,
   1.734 +	       CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R,
   1.735 +	       w0, w1, il, ir, t0, t1);
   1.736 +    krrl ^= w0; krrr ^= w1;
   1.737 +    CAMELLIA_F(krrl, krrr,
   1.738 +	       CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R,
   1.739 +	       w0, w1, il, ir, t0, t1);
   1.740 +    krll ^= w0; krlr ^= w1;
   1.741 +
   1.742 +    /* generate KA dependent subkeys */
   1.743 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
   1.744 +    subl(6) = kll; subr(6) = klr;
   1.745 +    subl(7) = krl; subr(7) = krr;
   1.746 +    CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30);
   1.747 +    subl(14) = kll; subr(14) = klr;
   1.748 +    subl(15) = krl; subr(15) = krr;
   1.749 +    subl(24) = klr; subr(24) = krl;
   1.750 +    subl(25) = krr; subr(25) = kll;
   1.751 +    CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
   1.752 +    subl(28) = kll; subr(28) = klr;
   1.753 +    subl(29) = krl; subr(29) = krr;
   1.754 +
   1.755 +    /* generate KB dependent subkeys */
   1.756 +    subl(2) = krll; subr(2) = krlr;
   1.757 +    subl(3) = krrl; subr(3) = krrr;
   1.758 +    CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
   1.759 +    subl(10) = krll; subr(10) = krlr;
   1.760 +    subl(11) = krrl; subr(11) = krrr;
   1.761 +    CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
   1.762 +    subl(20) = krll; subr(20) = krlr;
   1.763 +    subl(21) = krrl; subr(21) = krrr;
   1.764 +    CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
   1.765 +    subl(32) = krll; subr(32) = krlr;
   1.766 +    subl(33) = krrl; subr(33) = krrr;
   1.767 +
   1.768 +    /* absorb kw2 to other subkeys */
   1.769 +    subl(3) ^= subl(1); subr(3) ^= subr(1);
   1.770 +    subl(5) ^= subl(1); subr(5) ^= subr(1);
   1.771 +    subl(7) ^= subl(1); subr(7) ^= subr(1);
   1.772 +    subl(1) ^= subr(1) & ~subr(9);
   1.773 +    dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw);
   1.774 +    subl(11) ^= subl(1); subr(11) ^= subr(1);
   1.775 +    subl(13) ^= subl(1); subr(13) ^= subr(1);
   1.776 +    subl(15) ^= subl(1); subr(15) ^= subr(1);
   1.777 +    subl(1) ^= subr(1) & ~subr(17);
   1.778 +    dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw);
   1.779 +    subl(19) ^= subl(1); subr(19) ^= subr(1);
   1.780 +    subl(21) ^= subl(1); subr(21) ^= subr(1);
   1.781 +    subl(23) ^= subl(1); subr(23) ^= subr(1);
   1.782 +    subl(1) ^= subr(1) & ~subr(25);
   1.783 +    dw = subl(1) & subl(25), subr(1) ^= CAMELLIA_RL1(dw);
   1.784 +    subl(27) ^= subl(1); subr(27) ^= subr(1);
   1.785 +    subl(29) ^= subl(1); subr(29) ^= subr(1);
   1.786 +    subl(31) ^= subl(1); subr(31) ^= subr(1);
   1.787 +    subl(32) ^= subl(1); subr(32) ^= subr(1);
   1.788 +
   1.789 +    /* absorb kw4 to other subkeys */
   1.790 +    kw4l = subl(33); kw4r = subr(33);
   1.791 +    subl(30) ^= kw4l; subr(30) ^= kw4r;
   1.792 +    subl(28) ^= kw4l; subr(28) ^= kw4r;
   1.793 +    subl(26) ^= kw4l; subr(26) ^= kw4r;
   1.794 +    kw4l ^= kw4r & ~subr(24);
   1.795 +    dw = kw4l & subl(24), kw4r ^= CAMELLIA_RL1(dw);
   1.796 +    subl(22) ^= kw4l; subr(22) ^= kw4r;
   1.797 +    subl(20) ^= kw4l; subr(20) ^= kw4r;
   1.798 +    subl(18) ^= kw4l; subr(18) ^= kw4r;
   1.799 +    kw4l ^= kw4r & ~subr(16);
   1.800 +    dw = kw4l & subl(16), kw4r ^= CAMELLIA_RL1(dw);
   1.801 +    subl(14) ^= kw4l; subr(14) ^= kw4r;
   1.802 +    subl(12) ^= kw4l; subr(12) ^= kw4r;
   1.803 +    subl(10) ^= kw4l; subr(10) ^= kw4r;
   1.804 +    kw4l ^= kw4r & ~subr(8);
   1.805 +    dw = kw4l & subl(8), kw4r ^= CAMELLIA_RL1(dw);
   1.806 +    subl(6) ^= kw4l; subr(6) ^= kw4r;
   1.807 +    subl(4) ^= kw4l; subr(4) ^= kw4r;
   1.808 +    subl(2) ^= kw4l; subr(2) ^= kw4r;
   1.809 +    subl(0) ^= kw4l; subr(0) ^= kw4r;
   1.810 +
   1.811 +    /* key XOR is end of F-function */
   1.812 +    CamelliaSubkeyL(0) = subl(0) ^ subl(2);
   1.813 +    CamelliaSubkeyR(0) = subr(0) ^ subr(2);
   1.814 +    CamelliaSubkeyL(2) = subl(3);
   1.815 +    CamelliaSubkeyR(2) = subr(3);
   1.816 +    CamelliaSubkeyL(3) = subl(2) ^ subl(4);
   1.817 +    CamelliaSubkeyR(3) = subr(2) ^ subr(4);
   1.818 +    CamelliaSubkeyL(4) = subl(3) ^ subl(5);
   1.819 +    CamelliaSubkeyR(4) = subr(3) ^ subr(5);
   1.820 +    CamelliaSubkeyL(5) = subl(4) ^ subl(6);
   1.821 +    CamelliaSubkeyR(5) = subr(4) ^ subr(6);
   1.822 +    CamelliaSubkeyL(6) = subl(5) ^ subl(7);
   1.823 +    CamelliaSubkeyR(6) = subr(5) ^ subr(7);
   1.824 +    tl = subl(10) ^ (subr(10) & ~subr(8));
   1.825 +    dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw);
   1.826 +    CamelliaSubkeyL(7) = subl(6) ^ tl;
   1.827 +    CamelliaSubkeyR(7) = subr(6) ^ tr;
   1.828 +    CamelliaSubkeyL(8) = subl(8);
   1.829 +    CamelliaSubkeyR(8) = subr(8);
   1.830 +    CamelliaSubkeyL(9) = subl(9);
   1.831 +    CamelliaSubkeyR(9) = subr(9);
   1.832 +    tl = subl(7) ^ (subr(7) & ~subr(9));
   1.833 +    dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw);
   1.834 +    CamelliaSubkeyL(10) = tl ^ subl(11);
   1.835 +    CamelliaSubkeyR(10) = tr ^ subr(11);
   1.836 +    CamelliaSubkeyL(11) = subl(10) ^ subl(12);
   1.837 +    CamelliaSubkeyR(11) = subr(10) ^ subr(12);
   1.838 +    CamelliaSubkeyL(12) = subl(11) ^ subl(13);
   1.839 +    CamelliaSubkeyR(12) = subr(11) ^ subr(13);
   1.840 +    CamelliaSubkeyL(13) = subl(12) ^ subl(14);
   1.841 +    CamelliaSubkeyR(13) = subr(12) ^ subr(14);
   1.842 +    CamelliaSubkeyL(14) = subl(13) ^ subl(15);
   1.843 +    CamelliaSubkeyR(14) = subr(13) ^ subr(15);
   1.844 +    tl = subl(18) ^ (subr(18) & ~subr(16));
   1.845 +    dw = tl & subl(16), tr = subr(18) ^ CAMELLIA_RL1(dw);
   1.846 +    CamelliaSubkeyL(15) = subl(14) ^ tl;
   1.847 +    CamelliaSubkeyR(15) = subr(14) ^ tr;
   1.848 +    CamelliaSubkeyL(16) = subl(16);
   1.849 +    CamelliaSubkeyR(16) = subr(16);
   1.850 +    CamelliaSubkeyL(17) = subl(17);
   1.851 +    CamelliaSubkeyR(17) = subr(17);
   1.852 +    tl = subl(15) ^ (subr(15) & ~subr(17));
   1.853 +    dw = tl & subl(17), tr = subr(15) ^ CAMELLIA_RL1(dw);
   1.854 +    CamelliaSubkeyL(18) = tl ^ subl(19);
   1.855 +    CamelliaSubkeyR(18) = tr ^ subr(19);
   1.856 +    CamelliaSubkeyL(19) = subl(18) ^ subl(20);
   1.857 +    CamelliaSubkeyR(19) = subr(18) ^ subr(20);
   1.858 +    CamelliaSubkeyL(20) = subl(19) ^ subl(21);
   1.859 +    CamelliaSubkeyR(20) = subr(19) ^ subr(21);
   1.860 +    CamelliaSubkeyL(21) = subl(20) ^ subl(22);
   1.861 +    CamelliaSubkeyR(21) = subr(20) ^ subr(22);
   1.862 +    CamelliaSubkeyL(22) = subl(21) ^ subl(23);
   1.863 +    CamelliaSubkeyR(22) = subr(21) ^ subr(23);
   1.864 +    tl = subl(26) ^ (subr(26) & ~subr(24));
   1.865 +    dw = tl & subl(24), tr = subr(26) ^ CAMELLIA_RL1(dw);
   1.866 +    CamelliaSubkeyL(23) = subl(22) ^ tl;
   1.867 +    CamelliaSubkeyR(23) = subr(22) ^ tr;
   1.868 +    CamelliaSubkeyL(24) = subl(24);
   1.869 +    CamelliaSubkeyR(24) = subr(24);
   1.870 +    CamelliaSubkeyL(25) = subl(25);
   1.871 +    CamelliaSubkeyR(25) = subr(25);
   1.872 +    tl = subl(23) ^ (subr(23) &  ~subr(25));
   1.873 +    dw = tl & subl(25), tr = subr(23) ^ CAMELLIA_RL1(dw);
   1.874 +    CamelliaSubkeyL(26) = tl ^ subl(27);
   1.875 +    CamelliaSubkeyR(26) = tr ^ subr(27);
   1.876 +    CamelliaSubkeyL(27) = subl(26) ^ subl(28);
   1.877 +    CamelliaSubkeyR(27) = subr(26) ^ subr(28);
   1.878 +    CamelliaSubkeyL(28) = subl(27) ^ subl(29);
   1.879 +    CamelliaSubkeyR(28) = subr(27) ^ subr(29);
   1.880 +    CamelliaSubkeyL(29) = subl(28) ^ subl(30);
   1.881 +    CamelliaSubkeyR(29) = subr(28) ^ subr(30);
   1.882 +    CamelliaSubkeyL(30) = subl(29) ^ subl(31);
   1.883 +    CamelliaSubkeyR(30) = subr(29) ^ subr(31);
   1.884 +    CamelliaSubkeyL(31) = subl(30);
   1.885 +    CamelliaSubkeyR(31) = subr(30);
   1.886 +    CamelliaSubkeyL(32) = subl(32) ^ subl(31);
   1.887 +    CamelliaSubkeyR(32) = subr(32) ^ subr(31);
   1.888 +
   1.889 +    /* apply the inverse of the last half of P-function */
   1.890 +    dw = CamelliaSubkeyL(2) ^ CamelliaSubkeyR(2), dw = CAMELLIA_RL8(dw);
   1.891 +    CamelliaSubkeyR(2) = CamelliaSubkeyL(2) ^ dw, CamelliaSubkeyL(2) = dw;
   1.892 +    dw = CamelliaSubkeyL(3) ^ CamelliaSubkeyR(3), dw = CAMELLIA_RL8(dw);
   1.893 +    CamelliaSubkeyR(3) = CamelliaSubkeyL(3) ^ dw, CamelliaSubkeyL(3) = dw;
   1.894 +    dw = CamelliaSubkeyL(4) ^ CamelliaSubkeyR(4), dw = CAMELLIA_RL8(dw);
   1.895 +    CamelliaSubkeyR(4) = CamelliaSubkeyL(4) ^ dw, CamelliaSubkeyL(4) = dw;
   1.896 +    dw = CamelliaSubkeyL(5) ^ CamelliaSubkeyR(5), dw = CAMELLIA_RL8(dw);
   1.897 +    CamelliaSubkeyR(5) = CamelliaSubkeyL(5) ^ dw, CamelliaSubkeyL(5) = dw;
   1.898 +    dw = CamelliaSubkeyL(6) ^ CamelliaSubkeyR(6), dw = CAMELLIA_RL8(dw);
   1.899 +    CamelliaSubkeyR(6) = CamelliaSubkeyL(6) ^ dw, CamelliaSubkeyL(6) = dw;
   1.900 +    dw = CamelliaSubkeyL(7) ^ CamelliaSubkeyR(7), dw = CAMELLIA_RL8(dw);
   1.901 +    CamelliaSubkeyR(7) = CamelliaSubkeyL(7) ^ dw, CamelliaSubkeyL(7) = dw;
   1.902 +    dw = CamelliaSubkeyL(10) ^ CamelliaSubkeyR(10), dw = CAMELLIA_RL8(dw);
   1.903 +    CamelliaSubkeyR(10) = CamelliaSubkeyL(10) ^ dw, CamelliaSubkeyL(10) = dw;
   1.904 +    dw = CamelliaSubkeyL(11) ^ CamelliaSubkeyR(11), dw = CAMELLIA_RL8(dw);
   1.905 +    CamelliaSubkeyR(11) = CamelliaSubkeyL(11) ^ dw, CamelliaSubkeyL(11) = dw;
   1.906 +    dw = CamelliaSubkeyL(12) ^ CamelliaSubkeyR(12), dw = CAMELLIA_RL8(dw);
   1.907 +    CamelliaSubkeyR(12) = CamelliaSubkeyL(12) ^ dw, CamelliaSubkeyL(12) = dw;
   1.908 +    dw = CamelliaSubkeyL(13) ^ CamelliaSubkeyR(13), dw = CAMELLIA_RL8(dw);
   1.909 +    CamelliaSubkeyR(13) = CamelliaSubkeyL(13) ^ dw, CamelliaSubkeyL(13) = dw;
   1.910 +    dw = CamelliaSubkeyL(14) ^ CamelliaSubkeyR(14), dw = CAMELLIA_RL8(dw);
   1.911 +    CamelliaSubkeyR(14) = CamelliaSubkeyL(14) ^ dw, CamelliaSubkeyL(14) = dw;
   1.912 +    dw = CamelliaSubkeyL(15) ^ CamelliaSubkeyR(15), dw = CAMELLIA_RL8(dw);
   1.913 +    CamelliaSubkeyR(15) = CamelliaSubkeyL(15) ^ dw, CamelliaSubkeyL(15) = dw;
   1.914 +    dw = CamelliaSubkeyL(18) ^ CamelliaSubkeyR(18), dw = CAMELLIA_RL8(dw);
   1.915 +    CamelliaSubkeyR(18) = CamelliaSubkeyL(18) ^ dw, CamelliaSubkeyL(18) = dw;
   1.916 +    dw = CamelliaSubkeyL(19) ^ CamelliaSubkeyR(19), dw = CAMELLIA_RL8(dw);
   1.917 +    CamelliaSubkeyR(19) = CamelliaSubkeyL(19) ^ dw, CamelliaSubkeyL(19) = dw;
   1.918 +    dw = CamelliaSubkeyL(20) ^ CamelliaSubkeyR(20), dw = CAMELLIA_RL8(dw);
   1.919 +    CamelliaSubkeyR(20) = CamelliaSubkeyL(20) ^ dw, CamelliaSubkeyL(20) = dw;
   1.920 +    dw = CamelliaSubkeyL(21) ^ CamelliaSubkeyR(21), dw = CAMELLIA_RL8(dw);
   1.921 +    CamelliaSubkeyR(21) = CamelliaSubkeyL(21) ^ dw, CamelliaSubkeyL(21) = dw;
   1.922 +    dw = CamelliaSubkeyL(22) ^ CamelliaSubkeyR(22), dw = CAMELLIA_RL8(dw);
   1.923 +    CamelliaSubkeyR(22) = CamelliaSubkeyL(22) ^ dw, CamelliaSubkeyL(22) = dw;
   1.924 +    dw = CamelliaSubkeyL(23) ^ CamelliaSubkeyR(23), dw = CAMELLIA_RL8(dw);
   1.925 +    CamelliaSubkeyR(23) = CamelliaSubkeyL(23) ^ dw, CamelliaSubkeyL(23) = dw;
   1.926 +    dw = CamelliaSubkeyL(26) ^ CamelliaSubkeyR(26), dw = CAMELLIA_RL8(dw);
   1.927 +    CamelliaSubkeyR(26) = CamelliaSubkeyL(26) ^ dw, CamelliaSubkeyL(26) = dw;
   1.928 +    dw = CamelliaSubkeyL(27) ^ CamelliaSubkeyR(27), dw = CAMELLIA_RL8(dw);
   1.929 +    CamelliaSubkeyR(27) = CamelliaSubkeyL(27) ^ dw, CamelliaSubkeyL(27) = dw;
   1.930 +    dw = CamelliaSubkeyL(28) ^ CamelliaSubkeyR(28), dw = CAMELLIA_RL8(dw);
   1.931 +    CamelliaSubkeyR(28) = CamelliaSubkeyL(28) ^ dw, CamelliaSubkeyL(28) = dw;
   1.932 +    dw = CamelliaSubkeyL(29) ^ CamelliaSubkeyR(29), dw = CAMELLIA_RL8(dw);
   1.933 +    CamelliaSubkeyR(29) = CamelliaSubkeyL(29) ^ dw, CamelliaSubkeyL(29) = dw;
   1.934 +    dw = CamelliaSubkeyL(30) ^ CamelliaSubkeyR(30), dw = CAMELLIA_RL8(dw);
   1.935 +    CamelliaSubkeyR(30) = CamelliaSubkeyL(30) ^ dw, CamelliaSubkeyL(30) = dw;
   1.936 +    dw = CamelliaSubkeyL(31) ^ CamelliaSubkeyR(31), dw = CAMELLIA_RL8(dw);
   1.937 +    CamelliaSubkeyR(31) = CamelliaSubkeyL(31) ^ dw,CamelliaSubkeyL(31) = dw;
   1.938 +    
   1.939 +    return;
   1.940 +}
   1.941 +
   1.942 +void camellia_setup192(const unsigned char *key, PRUint32 *subkey)
   1.943 +{
   1.944 +    unsigned char kk[32];
   1.945 +    PRUint32 krll, krlr, krrl,krrr;
   1.946 +
   1.947 +    memcpy(kk, key, 24);
   1.948 +    memcpy((unsigned char *)&krll, key+16,4);
   1.949 +    memcpy((unsigned char *)&krlr, key+20,4);
   1.950 +    krrl = ~krll;
   1.951 +    krrr = ~krlr;
   1.952 +    memcpy(kk+24, (unsigned char *)&krrl, 4);
   1.953 +    memcpy(kk+28, (unsigned char *)&krrr, 4);
   1.954 +    camellia_setup256(kk, subkey);
   1.955 +    return;
   1.956 +}
   1.957 +
   1.958 +
   1.959 +/**
   1.960 + * Stuff related to camellia encryption/decryption
   1.961 + *
   1.962 + */
   1.963 +SECStatus
   1.964 +camellia_encrypt128(const PRUint32 *subkey,
   1.965 +		    unsigned char *output,
   1.966 +		    const unsigned char *input)
   1.967 +{
   1.968 +    PRUint32 il, ir, t0, t1;
   1.969 +    PRUint32 io[4];
   1.970 +#if defined(CAMELLIA_NEED_TMP_VARIABLE)
   1.971 +    PRUint32 tmp;
   1.972 +#endif
   1.973 +
   1.974 +    io[0] = GETU32(input);
   1.975 +    io[1] = GETU32(input+4);
   1.976 +    io[2] = GETU32(input+8);
   1.977 +    io[3] = GETU32(input+12);
   1.978 +
   1.979 +    /* pre whitening but absorb kw2*/
   1.980 +    io[0] ^= CamelliaSubkeyL(0);
   1.981 +    io[1] ^= CamelliaSubkeyR(0);
   1.982 +    /* main iteration */
   1.983 +
   1.984 +    CAMELLIA_ROUNDSM(io[0],io[1],
   1.985 +		     CamelliaSubkeyL(2),CamelliaSubkeyR(2),
   1.986 +		     io[2],io[3],il,ir,t0,t1);
   1.987 +    CAMELLIA_ROUNDSM(io[2],io[3],
   1.988 +		     CamelliaSubkeyL(3),CamelliaSubkeyR(3),
   1.989 +		     io[0],io[1],il,ir,t0,t1);
   1.990 +    CAMELLIA_ROUNDSM(io[0],io[1],
   1.991 +		     CamelliaSubkeyL(4),CamelliaSubkeyR(4),
   1.992 +		     io[2],io[3],il,ir,t0,t1);
   1.993 +    CAMELLIA_ROUNDSM(io[2],io[3],
   1.994 +		     CamelliaSubkeyL(5),CamelliaSubkeyR(5),
   1.995 +		     io[0],io[1],il,ir,t0,t1);
   1.996 +    CAMELLIA_ROUNDSM(io[0],io[1],
   1.997 +		     CamelliaSubkeyL(6),CamelliaSubkeyR(6),
   1.998 +		     io[2],io[3],il,ir,t0,t1);
   1.999 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1000 +		     CamelliaSubkeyL(7),CamelliaSubkeyR(7),
  1.1001 +		     io[0],io[1],il,ir,t0,t1);
  1.1002 +
  1.1003 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1004 +		 CamelliaSubkeyL(8),CamelliaSubkeyR(8),
  1.1005 +		 CamelliaSubkeyL(9),CamelliaSubkeyR(9),
  1.1006 +		 t0,t1,il,ir);
  1.1007 +
  1.1008 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1009 +		     CamelliaSubkeyL(10),CamelliaSubkeyR(10),
  1.1010 +		     io[2],io[3],il,ir,t0,t1);
  1.1011 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1012 +		     CamelliaSubkeyL(11),CamelliaSubkeyR(11),
  1.1013 +		     io[0],io[1],il,ir,t0,t1);
  1.1014 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1015 +		     CamelliaSubkeyL(12),CamelliaSubkeyR(12),
  1.1016 +		     io[2],io[3],il,ir,t0,t1);
  1.1017 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1018 +		     CamelliaSubkeyL(13),CamelliaSubkeyR(13),
  1.1019 +		     io[0],io[1],il,ir,t0,t1);
  1.1020 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1021 +		     CamelliaSubkeyL(14),CamelliaSubkeyR(14),
  1.1022 +		     io[2],io[3],il,ir,t0,t1);
  1.1023 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1024 +		     CamelliaSubkeyL(15),CamelliaSubkeyR(15),
  1.1025 +		     io[0],io[1],il,ir,t0,t1);
  1.1026 +
  1.1027 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1028 +		 CamelliaSubkeyL(16),CamelliaSubkeyR(16),
  1.1029 +		 CamelliaSubkeyL(17),CamelliaSubkeyR(17),
  1.1030 +		 t0,t1,il,ir);
  1.1031 +
  1.1032 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1033 +		     CamelliaSubkeyL(18),CamelliaSubkeyR(18),
  1.1034 +		     io[2],io[3],il,ir,t0,t1);
  1.1035 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1036 +		     CamelliaSubkeyL(19),CamelliaSubkeyR(19),
  1.1037 +		     io[0],io[1],il,ir,t0,t1);
  1.1038 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1039 +		     CamelliaSubkeyL(20),CamelliaSubkeyR(20),
  1.1040 +		     io[2],io[3],il,ir,t0,t1);
  1.1041 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1042 +		     CamelliaSubkeyL(21),CamelliaSubkeyR(21),
  1.1043 +		     io[0],io[1],il,ir,t0,t1);
  1.1044 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1045 +		     CamelliaSubkeyL(22),CamelliaSubkeyR(22),
  1.1046 +		     io[2],io[3],il,ir,t0,t1);
  1.1047 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1048 +		     CamelliaSubkeyL(23),CamelliaSubkeyR(23),
  1.1049 +		     io[0],io[1],il,ir,t0,t1);
  1.1050 +
  1.1051 +    /* post whitening but kw4 */
  1.1052 +    io[2] ^= CamelliaSubkeyL(24);
  1.1053 +    io[3] ^= CamelliaSubkeyR(24);
  1.1054 +
  1.1055 +    t0 = io[0];
  1.1056 +    t1 = io[1];
  1.1057 +    io[0] = io[2];
  1.1058 +    io[1] = io[3];
  1.1059 +    io[2] = t0;
  1.1060 +    io[3] = t1;
  1.1061 +
  1.1062 +    PUTU32(output, io[0]);
  1.1063 +    PUTU32(output+4, io[1]);
  1.1064 +    PUTU32(output+8, io[2]);
  1.1065 +    PUTU32(output+12, io[3]);
  1.1066 +
  1.1067 +    return SECSuccess;
  1.1068 +}
  1.1069 +
  1.1070 +SECStatus
  1.1071 +camellia_decrypt128(const PRUint32 *subkey,
  1.1072 +		    unsigned char *output,
  1.1073 +		    const unsigned char *input)
  1.1074 +{
  1.1075 +    PRUint32 il,ir,t0,t1;               /* temporary valiables */
  1.1076 +    PRUint32 io[4];
  1.1077 +#if defined(CAMELLIA_NEED_TMP_VARIABLE)
  1.1078 +    PRUint32 tmp;
  1.1079 +#endif
  1.1080 +
  1.1081 +    io[0] = GETU32(input);
  1.1082 +    io[1] = GETU32(input+4);
  1.1083 +    io[2] = GETU32(input+8);
  1.1084 +    io[3] = GETU32(input+12);
  1.1085 +
  1.1086 +    /* pre whitening but absorb kw2*/
  1.1087 +    io[0] ^= CamelliaSubkeyL(24);
  1.1088 +    io[1] ^= CamelliaSubkeyR(24);
  1.1089 +
  1.1090 +    /* main iteration */
  1.1091 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1092 +		     CamelliaSubkeyL(23),CamelliaSubkeyR(23),
  1.1093 +		     io[2],io[3],il,ir,t0,t1);
  1.1094 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1095 +		     CamelliaSubkeyL(22),CamelliaSubkeyR(22),
  1.1096 +		     io[0],io[1],il,ir,t0,t1);
  1.1097 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1098 +		     CamelliaSubkeyL(21),CamelliaSubkeyR(21),
  1.1099 +		     io[2],io[3],il,ir,t0,t1);
  1.1100 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1101 +		     CamelliaSubkeyL(20),CamelliaSubkeyR(20),
  1.1102 +		     io[0],io[1],il,ir,t0,t1);
  1.1103 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1104 +		     CamelliaSubkeyL(19),CamelliaSubkeyR(19),
  1.1105 +		     io[2],io[3],il,ir,t0,t1);
  1.1106 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1107 +		     CamelliaSubkeyL(18),CamelliaSubkeyR(18),
  1.1108 +		     io[0],io[1],il,ir,t0,t1);
  1.1109 +
  1.1110 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1111 +		 CamelliaSubkeyL(17),CamelliaSubkeyR(17),
  1.1112 +		 CamelliaSubkeyL(16),CamelliaSubkeyR(16),
  1.1113 +		 t0,t1,il,ir);
  1.1114 +
  1.1115 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1116 +		     CamelliaSubkeyL(15),CamelliaSubkeyR(15),
  1.1117 +		     io[2],io[3],il,ir,t0,t1);
  1.1118 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1119 +		     CamelliaSubkeyL(14),CamelliaSubkeyR(14),
  1.1120 +		     io[0],io[1],il,ir,t0,t1);
  1.1121 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1122 +		     CamelliaSubkeyL(13),CamelliaSubkeyR(13),
  1.1123 +		     io[2],io[3],il,ir,t0,t1);
  1.1124 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1125 +		     CamelliaSubkeyL(12),CamelliaSubkeyR(12),
  1.1126 +		     io[0],io[1],il,ir,t0,t1);
  1.1127 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1128 +		     CamelliaSubkeyL(11),CamelliaSubkeyR(11),
  1.1129 +		     io[2],io[3],il,ir,t0,t1);
  1.1130 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1131 +		     CamelliaSubkeyL(10),CamelliaSubkeyR(10),
  1.1132 +		     io[0],io[1],il,ir,t0,t1);
  1.1133 +
  1.1134 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1135 +		 CamelliaSubkeyL(9),CamelliaSubkeyR(9),
  1.1136 +		 CamelliaSubkeyL(8),CamelliaSubkeyR(8),
  1.1137 +		 t0,t1,il,ir);
  1.1138 +
  1.1139 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1140 +		     CamelliaSubkeyL(7),CamelliaSubkeyR(7),
  1.1141 +		     io[2],io[3],il,ir,t0,t1);
  1.1142 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1143 +		     CamelliaSubkeyL(6),CamelliaSubkeyR(6),
  1.1144 +		     io[0],io[1],il,ir,t0,t1);
  1.1145 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1146 +		     CamelliaSubkeyL(5),CamelliaSubkeyR(5),
  1.1147 +		     io[2],io[3],il,ir,t0,t1);
  1.1148 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1149 +		     CamelliaSubkeyL(4),CamelliaSubkeyR(4),
  1.1150 +		     io[0],io[1],il,ir,t0,t1);
  1.1151 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1152 +		     CamelliaSubkeyL(3),CamelliaSubkeyR(3),
  1.1153 +		     io[2],io[3],il,ir,t0,t1);
  1.1154 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1155 +		     CamelliaSubkeyL(2),CamelliaSubkeyR(2),
  1.1156 +		     io[0],io[1],il,ir,t0,t1);
  1.1157 +
  1.1158 +    /* post whitening but kw4 */
  1.1159 +    io[2] ^= CamelliaSubkeyL(0);
  1.1160 +    io[3] ^= CamelliaSubkeyR(0);
  1.1161 +
  1.1162 +    t0 = io[0];
  1.1163 +    t1 = io[1];
  1.1164 +    io[0] = io[2];
  1.1165 +    io[1] = io[3];
  1.1166 +    io[2] = t0;
  1.1167 +    io[3] = t1;
  1.1168 +
  1.1169 +    PUTU32(output, io[0]);
  1.1170 +    PUTU32(output+4, io[1]);
  1.1171 +    PUTU32(output+8, io[2]);
  1.1172 +    PUTU32(output+12, io[3]);
  1.1173 +
  1.1174 +    return SECSuccess;
  1.1175 +}
  1.1176 +
  1.1177 +/**
  1.1178 + * stuff for 192 and 256bit encryption/decryption
  1.1179 + */
  1.1180 +SECStatus
  1.1181 +camellia_encrypt256(const PRUint32 *subkey,
  1.1182 +		    unsigned char *output,
  1.1183 +		    const unsigned char *input)
  1.1184 +{
  1.1185 +    PRUint32 il,ir,t0,t1;           /* temporary valiables */
  1.1186 +    PRUint32 io[4];
  1.1187 +#if defined(CAMELLIA_NEED_TMP_VARIABLE)
  1.1188 +    PRUint32 tmp;
  1.1189 +#endif
  1.1190 +
  1.1191 +    io[0] = GETU32(input);
  1.1192 +    io[1] = GETU32(input+4);
  1.1193 +    io[2] = GETU32(input+8);
  1.1194 +    io[3] = GETU32(input+12);
  1.1195 +
  1.1196 +    /* pre whitening but absorb kw2*/
  1.1197 +    io[0] ^= CamelliaSubkeyL(0);
  1.1198 +    io[1] ^= CamelliaSubkeyR(0);
  1.1199 +
  1.1200 +    /* main iteration */
  1.1201 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1202 +		     CamelliaSubkeyL(2),CamelliaSubkeyR(2),
  1.1203 +		     io[2],io[3],il,ir,t0,t1);
  1.1204 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1205 +		     CamelliaSubkeyL(3),CamelliaSubkeyR(3),
  1.1206 +		     io[0],io[1],il,ir,t0,t1);
  1.1207 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1208 +		     CamelliaSubkeyL(4),CamelliaSubkeyR(4),
  1.1209 +		     io[2],io[3],il,ir,t0,t1);
  1.1210 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1211 +		     CamelliaSubkeyL(5),CamelliaSubkeyR(5),
  1.1212 +		     io[0],io[1],il,ir,t0,t1);
  1.1213 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1214 +		     CamelliaSubkeyL(6),CamelliaSubkeyR(6),
  1.1215 +		     io[2],io[3],il,ir,t0,t1);
  1.1216 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1217 +		     CamelliaSubkeyL(7),CamelliaSubkeyR(7),
  1.1218 +		     io[0],io[1],il,ir,t0,t1);
  1.1219 +
  1.1220 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1221 +		 CamelliaSubkeyL(8),CamelliaSubkeyR(8),
  1.1222 +		 CamelliaSubkeyL(9),CamelliaSubkeyR(9),
  1.1223 +		 t0,t1,il,ir);
  1.1224 +
  1.1225 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1226 +		     CamelliaSubkeyL(10),CamelliaSubkeyR(10),
  1.1227 +		     io[2],io[3],il,ir,t0,t1);
  1.1228 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1229 +		     CamelliaSubkeyL(11),CamelliaSubkeyR(11),
  1.1230 +		     io[0],io[1],il,ir,t0,t1);
  1.1231 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1232 +		     CamelliaSubkeyL(12),CamelliaSubkeyR(12),
  1.1233 +		     io[2],io[3],il,ir,t0,t1);
  1.1234 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1235 +		     CamelliaSubkeyL(13),CamelliaSubkeyR(13),
  1.1236 +		     io[0],io[1],il,ir,t0,t1);
  1.1237 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1238 +		     CamelliaSubkeyL(14),CamelliaSubkeyR(14),
  1.1239 +		     io[2],io[3],il,ir,t0,t1);
  1.1240 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1241 +		     CamelliaSubkeyL(15),CamelliaSubkeyR(15),
  1.1242 +		     io[0],io[1],il,ir,t0,t1);
  1.1243 +
  1.1244 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1245 +		 CamelliaSubkeyL(16),CamelliaSubkeyR(16),
  1.1246 +		 CamelliaSubkeyL(17),CamelliaSubkeyR(17),
  1.1247 +		 t0,t1,il,ir);
  1.1248 +
  1.1249 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1250 +		     CamelliaSubkeyL(18),CamelliaSubkeyR(18),
  1.1251 +		     io[2],io[3],il,ir,t0,t1);
  1.1252 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1253 +		     CamelliaSubkeyL(19),CamelliaSubkeyR(19),
  1.1254 +		     io[0],io[1],il,ir,t0,t1);
  1.1255 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1256 +		     CamelliaSubkeyL(20),CamelliaSubkeyR(20),
  1.1257 +		     io[2],io[3],il,ir,t0,t1);
  1.1258 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1259 +		     CamelliaSubkeyL(21),CamelliaSubkeyR(21),
  1.1260 +		     io[0],io[1],il,ir,t0,t1);
  1.1261 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1262 +		     CamelliaSubkeyL(22),CamelliaSubkeyR(22),
  1.1263 +		     io[2],io[3],il,ir,t0,t1);
  1.1264 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1265 +		     CamelliaSubkeyL(23),CamelliaSubkeyR(23),
  1.1266 +		     io[0],io[1],il,ir,t0,t1);
  1.1267 +
  1.1268 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1269 +		 CamelliaSubkeyL(24),CamelliaSubkeyR(24),
  1.1270 +		 CamelliaSubkeyL(25),CamelliaSubkeyR(25),
  1.1271 +		 t0,t1,il,ir);
  1.1272 +
  1.1273 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1274 +		     CamelliaSubkeyL(26),CamelliaSubkeyR(26),
  1.1275 +		     io[2],io[3],il,ir,t0,t1);
  1.1276 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1277 +		     CamelliaSubkeyL(27),CamelliaSubkeyR(27),
  1.1278 +		     io[0],io[1],il,ir,t0,t1);
  1.1279 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1280 +		     CamelliaSubkeyL(28),CamelliaSubkeyR(28),
  1.1281 +		     io[2],io[3],il,ir,t0,t1);
  1.1282 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1283 +		     CamelliaSubkeyL(29),CamelliaSubkeyR(29),
  1.1284 +		     io[0],io[1],il,ir,t0,t1);
  1.1285 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1286 +		     CamelliaSubkeyL(30),CamelliaSubkeyR(30),
  1.1287 +		     io[2],io[3],il,ir,t0,t1);
  1.1288 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1289 +		     CamelliaSubkeyL(31),CamelliaSubkeyR(31),
  1.1290 +		     io[0],io[1],il,ir,t0,t1);
  1.1291 +
  1.1292 +    /* post whitening but kw4 */
  1.1293 +    io[2] ^= CamelliaSubkeyL(32);
  1.1294 +    io[3] ^= CamelliaSubkeyR(32);
  1.1295 +
  1.1296 +    t0 = io[0];
  1.1297 +    t1 = io[1];
  1.1298 +    io[0] = io[2];
  1.1299 +    io[1] = io[3];
  1.1300 +    io[2] = t0;
  1.1301 +    io[3] = t1;
  1.1302 +
  1.1303 +    PUTU32(output, io[0]);
  1.1304 +    PUTU32(output+4, io[1]);
  1.1305 +    PUTU32(output+8, io[2]);
  1.1306 +    PUTU32(output+12, io[3]);
  1.1307 +
  1.1308 +    return SECSuccess;
  1.1309 +}
  1.1310 +
  1.1311 +SECStatus
  1.1312 +camellia_decrypt256(const PRUint32 *subkey,
  1.1313 +		    unsigned char *output,
  1.1314 +		    const unsigned char *input)
  1.1315 +{
  1.1316 +    PRUint32 il,ir,t0,t1;           /* temporary valiables */
  1.1317 +    PRUint32 io[4];
  1.1318 +#if defined(CAMELLIA_NEED_TMP_VARIABLE)
  1.1319 +    PRUint32 tmp;
  1.1320 +#endif
  1.1321 +
  1.1322 +    io[0] = GETU32(input);
  1.1323 +    io[1] = GETU32(input+4);
  1.1324 +    io[2] = GETU32(input+8);
  1.1325 +    io[3] = GETU32(input+12);
  1.1326 +
  1.1327 +    /* pre whitening but absorb kw2*/
  1.1328 +    io[0] ^= CamelliaSubkeyL(32);
  1.1329 +    io[1] ^= CamelliaSubkeyR(32);
  1.1330 +	
  1.1331 +    /* main iteration */
  1.1332 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1333 +		     CamelliaSubkeyL(31),CamelliaSubkeyR(31),
  1.1334 +		     io[2],io[3],il,ir,t0,t1);
  1.1335 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1336 +		     CamelliaSubkeyL(30),CamelliaSubkeyR(30),
  1.1337 +		     io[0],io[1],il,ir,t0,t1);
  1.1338 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1339 +		     CamelliaSubkeyL(29),CamelliaSubkeyR(29),
  1.1340 +		     io[2],io[3],il,ir,t0,t1);
  1.1341 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1342 +		     CamelliaSubkeyL(28),CamelliaSubkeyR(28),
  1.1343 +		     io[0],io[1],il,ir,t0,t1);
  1.1344 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1345 +		     CamelliaSubkeyL(27),CamelliaSubkeyR(27),
  1.1346 +		     io[2],io[3],il,ir,t0,t1);
  1.1347 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1348 +		     CamelliaSubkeyL(26),CamelliaSubkeyR(26),
  1.1349 +		     io[0],io[1],il,ir,t0,t1);
  1.1350 +
  1.1351 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1352 +		 CamelliaSubkeyL(25),CamelliaSubkeyR(25),
  1.1353 +		 CamelliaSubkeyL(24),CamelliaSubkeyR(24),
  1.1354 +		 t0,t1,il,ir);
  1.1355 +
  1.1356 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1357 +		     CamelliaSubkeyL(23),CamelliaSubkeyR(23),
  1.1358 +		     io[2],io[3],il,ir,t0,t1);
  1.1359 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1360 +		     CamelliaSubkeyL(22),CamelliaSubkeyR(22),
  1.1361 +		     io[0],io[1],il,ir,t0,t1);
  1.1362 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1363 +		     CamelliaSubkeyL(21),CamelliaSubkeyR(21),
  1.1364 +		     io[2],io[3],il,ir,t0,t1);
  1.1365 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1366 +		     CamelliaSubkeyL(20),CamelliaSubkeyR(20),
  1.1367 +		     io[0],io[1],il,ir,t0,t1);
  1.1368 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1369 +		     CamelliaSubkeyL(19),CamelliaSubkeyR(19),
  1.1370 +		     io[2],io[3],il,ir,t0,t1);
  1.1371 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1372 +		     CamelliaSubkeyL(18),CamelliaSubkeyR(18),
  1.1373 +		     io[0],io[1],il,ir,t0,t1);
  1.1374 +
  1.1375 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1376 +		 CamelliaSubkeyL(17),CamelliaSubkeyR(17),
  1.1377 +		 CamelliaSubkeyL(16),CamelliaSubkeyR(16),
  1.1378 +		 t0,t1,il,ir);
  1.1379 +
  1.1380 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1381 +		     CamelliaSubkeyL(15),CamelliaSubkeyR(15),
  1.1382 +		     io[2],io[3],il,ir,t0,t1);
  1.1383 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1384 +		     CamelliaSubkeyL(14),CamelliaSubkeyR(14),
  1.1385 +		     io[0],io[1],il,ir,t0,t1);
  1.1386 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1387 +		     CamelliaSubkeyL(13),CamelliaSubkeyR(13),
  1.1388 +		     io[2],io[3],il,ir,t0,t1);
  1.1389 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1390 +		     CamelliaSubkeyL(12),CamelliaSubkeyR(12),
  1.1391 +		     io[0],io[1],il,ir,t0,t1);
  1.1392 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1393 +		     CamelliaSubkeyL(11),CamelliaSubkeyR(11),
  1.1394 +		     io[2],io[3],il,ir,t0,t1);
  1.1395 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1396 +		     CamelliaSubkeyL(10),CamelliaSubkeyR(10),
  1.1397 +		     io[0],io[1],il,ir,t0,t1);
  1.1398 +
  1.1399 +    CAMELLIA_FLS(io[0],io[1],io[2],io[3],
  1.1400 +		 CamelliaSubkeyL(9),CamelliaSubkeyR(9),
  1.1401 +		 CamelliaSubkeyL(8),CamelliaSubkeyR(8),
  1.1402 +		 t0,t1,il,ir);
  1.1403 +
  1.1404 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1405 +		     CamelliaSubkeyL(7),CamelliaSubkeyR(7),
  1.1406 +		     io[2],io[3],il,ir,t0,t1);
  1.1407 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1408 +		     CamelliaSubkeyL(6),CamelliaSubkeyR(6),
  1.1409 +		     io[0],io[1],il,ir,t0,t1);
  1.1410 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1411 +		     CamelliaSubkeyL(5),CamelliaSubkeyR(5),
  1.1412 +		     io[2],io[3],il,ir,t0,t1);
  1.1413 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1414 +		     CamelliaSubkeyL(4),CamelliaSubkeyR(4),
  1.1415 +		     io[0],io[1],il,ir,t0,t1);
  1.1416 +    CAMELLIA_ROUNDSM(io[0],io[1],
  1.1417 +		     CamelliaSubkeyL(3),CamelliaSubkeyR(3),
  1.1418 +		     io[2],io[3],il,ir,t0,t1);
  1.1419 +    CAMELLIA_ROUNDSM(io[2],io[3],
  1.1420 +		     CamelliaSubkeyL(2),CamelliaSubkeyR(2),
  1.1421 +		     io[0],io[1],il,ir,t0,t1);
  1.1422 +
  1.1423 +    /* post whitening but kw4 */
  1.1424 +    io[2] ^= CamelliaSubkeyL(0);
  1.1425 +    io[3] ^= CamelliaSubkeyR(0);
  1.1426 +
  1.1427 +    t0 = io[0];
  1.1428 +    t1 = io[1];
  1.1429 +    io[0] = io[2];
  1.1430 +    io[1] = io[3];
  1.1431 +    io[2] = t0;
  1.1432 +    io[3] = t1;
  1.1433 +
  1.1434 +    PUTU32(output, io[0]);
  1.1435 +    PUTU32(output+4, io[1]);
  1.1436 +    PUTU32(output+8, io[2]);
  1.1437 +    PUTU32(output+12, io[3]);
  1.1438 +
  1.1439 +    return SECSuccess;
  1.1440 +}
  1.1441 +
  1.1442 +
  1.1443 +/**************************************************************************
  1.1444 + *
  1.1445 + * Stuff related to the Camellia key schedule
  1.1446 + *
  1.1447 + *************************************************************************/
  1.1448 +
  1.1449 +SECStatus 
  1.1450 +camellia_key_expansion(CamelliaContext *cx, 
  1.1451 +                       const unsigned char *key, 
  1.1452 +                       const unsigned int keysize)
  1.1453 +{
  1.1454 +    cx->keysize = keysize;
  1.1455 +
  1.1456 +    switch(keysize) {
  1.1457 +    case 16:
  1.1458 +	camellia_setup128(key, cx->expandedKey);
  1.1459 +	break;
  1.1460 +    case 24:
  1.1461 +	camellia_setup192(key, cx->expandedKey);
  1.1462 +	break;
  1.1463 +    case 32:
  1.1464 +	camellia_setup256(key, cx->expandedKey);
  1.1465 +	break;
  1.1466 +    default:
  1.1467 +	break;
  1.1468 +    }
  1.1469 +    return SECSuccess;
  1.1470 +}
  1.1471 +
  1.1472 +
  1.1473 +/**************************************************************************
  1.1474 + *
  1.1475 + *  Camellia modes of operation (ECB and CBC)
  1.1476 + *
  1.1477 + *************************************************************************/
  1.1478 +
  1.1479 +SECStatus 
  1.1480 +camellia_encryptECB(CamelliaContext *cx, unsigned char *output,
  1.1481 +                    unsigned int *outputLen, unsigned int maxOutputLen,
  1.1482 +                    const unsigned char *input, unsigned int inputLen)
  1.1483 +{
  1.1484 +    CamelliaBlockFunc *encryptor;
  1.1485 +
  1.1486 +    encryptor = (cx->keysize == 16)
  1.1487 +	? &camellia_encrypt128
  1.1488 +	: &camellia_encrypt256;
  1.1489 +
  1.1490 +    while (inputLen > 0) {
  1.1491 +	(*encryptor)(cx->expandedKey, output, input);
  1.1492 +    
  1.1493 +	output += CAMELLIA_BLOCK_SIZE;
  1.1494 +	input += CAMELLIA_BLOCK_SIZE;
  1.1495 +	inputLen -= CAMELLIA_BLOCK_SIZE;
  1.1496 +    }
  1.1497 +    return SECSuccess;
  1.1498 +}
  1.1499 +
  1.1500 +SECStatus 
  1.1501 +camellia_encryptCBC(CamelliaContext *cx, unsigned char *output,
  1.1502 +                    unsigned int *outputLen, unsigned int maxOutputLen,
  1.1503 +                    const unsigned char *input, unsigned int inputLen)
  1.1504 +{
  1.1505 +    unsigned int j;
  1.1506 +    unsigned char *lastblock;
  1.1507 +    unsigned char inblock[CAMELLIA_BLOCK_SIZE];
  1.1508 +    CamelliaBlockFunc *encryptor;
  1.1509 +
  1.1510 +    if (!inputLen)
  1.1511 +	return SECSuccess;
  1.1512 +    lastblock = cx->iv;
  1.1513 +
  1.1514 +    encryptor = (cx->keysize == 16)
  1.1515 +	? &camellia_encrypt128
  1.1516 +	: &camellia_encrypt256;
  1.1517 +
  1.1518 +    while (inputLen > 0) {
  1.1519 +	/* XOR with the last block (IV if first block) */
  1.1520 +	for (j=0; j<CAMELLIA_BLOCK_SIZE; ++j)
  1.1521 +	    inblock[j] = input[j] ^ lastblock[j];
  1.1522 +	/* encrypt */
  1.1523 +	(*encryptor)(cx->expandedKey, output, inblock);
  1.1524 +
  1.1525 +	/* move to the next block */
  1.1526 +	lastblock = output;
  1.1527 +	output += CAMELLIA_BLOCK_SIZE;
  1.1528 +	input += CAMELLIA_BLOCK_SIZE;
  1.1529 +	inputLen -= CAMELLIA_BLOCK_SIZE;
  1.1530 +    }
  1.1531 +    memcpy(cx->iv, lastblock, CAMELLIA_BLOCK_SIZE);
  1.1532 +    return SECSuccess;
  1.1533 +}
  1.1534 +
  1.1535 +SECStatus 
  1.1536 +camellia_decryptECB(CamelliaContext *cx, unsigned char *output,
  1.1537 +                    unsigned int *outputLen, unsigned int maxOutputLen,
  1.1538 +                    const unsigned char *input, unsigned int inputLen)
  1.1539 +{
  1.1540 +    CamelliaBlockFunc *decryptor;
  1.1541 +
  1.1542 +    decryptor = (cx->keysize == 16)
  1.1543 +	? &camellia_decrypt128
  1.1544 +	: &camellia_decrypt256;
  1.1545 +
  1.1546 +
  1.1547 +    while (inputLen > 0) {
  1.1548 +
  1.1549 +	(*decryptor)(cx->expandedKey, output, input);
  1.1550 +
  1.1551 +	output += CAMELLIA_BLOCK_SIZE;
  1.1552 +	input += CAMELLIA_BLOCK_SIZE;
  1.1553 +	inputLen -= CAMELLIA_BLOCK_SIZE;
  1.1554 +    }
  1.1555 +    return SECSuccess;
  1.1556 +}
  1.1557 +
  1.1558 +SECStatus 
  1.1559 +camellia_decryptCBC(CamelliaContext *cx, unsigned char *output,
  1.1560 +                    unsigned int *outputLen, unsigned int maxOutputLen,
  1.1561 +                    const unsigned char *input, unsigned int inputLen)
  1.1562 +{
  1.1563 +    const unsigned char *in;
  1.1564 +    unsigned char *out;
  1.1565 +    unsigned int j;
  1.1566 +    unsigned char newIV[CAMELLIA_BLOCK_SIZE];
  1.1567 +    CamelliaBlockFunc *decryptor;
  1.1568 +
  1.1569 +
  1.1570 +
  1.1571 +    if (!inputLen) 
  1.1572 +	return SECSuccess;
  1.1573 +
  1.1574 +    PORT_Assert(output - input >= 0 || input - output >= (int)inputLen );
  1.1575 +
  1.1576 +    in  = input  + (inputLen - CAMELLIA_BLOCK_SIZE);
  1.1577 +    memcpy(newIV, in, CAMELLIA_BLOCK_SIZE);
  1.1578 +    out = output + (inputLen - CAMELLIA_BLOCK_SIZE);
  1.1579 +
  1.1580 +    decryptor = (cx->keysize == 16)
  1.1581 +	? &camellia_decrypt128
  1.1582 +	: &camellia_decrypt256;
  1.1583 +
  1.1584 +    while (inputLen > CAMELLIA_BLOCK_SIZE) {
  1.1585 +	(*decryptor)(cx->expandedKey, out, in);
  1.1586 +
  1.1587 +	for (j=0; j<CAMELLIA_BLOCK_SIZE; ++j)
  1.1588 +	    out[j] ^= in[(int)(j - CAMELLIA_BLOCK_SIZE)];
  1.1589 +
  1.1590 +	out -= CAMELLIA_BLOCK_SIZE;
  1.1591 +	in -= CAMELLIA_BLOCK_SIZE;
  1.1592 +	inputLen -= CAMELLIA_BLOCK_SIZE;
  1.1593 +    }
  1.1594 +    if (in == input) {
  1.1595 +	(*decryptor)(cx->expandedKey, out, in);
  1.1596 +
  1.1597 +	for (j=0; j<CAMELLIA_BLOCK_SIZE; ++j)
  1.1598 +	    out[j] ^= cx->iv[j];
  1.1599 +    }
  1.1600 +    memcpy(cx->iv, newIV, CAMELLIA_BLOCK_SIZE);
  1.1601 +    return SECSuccess;
  1.1602 +}
  1.1603 +
  1.1604 +/**************************************************************************
  1.1605 + *
  1.1606 + * BLAPI Interface functions
  1.1607 + *
  1.1608 + *************************************************************************/
  1.1609 +
  1.1610 +CamelliaContext *
  1.1611 +Camellia_AllocateContext(void)
  1.1612 +{
  1.1613 +    return PORT_ZNew(CamelliaContext);
  1.1614 +}
  1.1615 +
  1.1616 +SECStatus   
  1.1617 +Camellia_InitContext(CamelliaContext *cx, const unsigned char *key,
  1.1618 +		     unsigned int keysize, 
  1.1619 +		     const unsigned char *iv, int mode, unsigned int encrypt,
  1.1620 +		     unsigned int unused)
  1.1621 +{
  1.1622 +    if (key == NULL ||
  1.1623 +	(keysize != 16 && keysize != 24 && keysize != 32)) {
  1.1624 +	PORT_SetError(SEC_ERROR_INVALID_ARGS);
  1.1625 +	return SECFailure;
  1.1626 +    }
  1.1627 +    if (mode != NSS_CAMELLIA && mode != NSS_CAMELLIA_CBC) {
  1.1628 +	PORT_SetError(SEC_ERROR_INVALID_ARGS);
  1.1629 +	return SECFailure;
  1.1630 +    }
  1.1631 +    if (mode == NSS_CAMELLIA_CBC && iv == NULL) {
  1.1632 +	PORT_SetError(SEC_ERROR_INVALID_ARGS);
  1.1633 +	return SECFailure;
  1.1634 +    }
  1.1635 +    if (!cx) {
  1.1636 +	PORT_SetError(SEC_ERROR_INVALID_ARGS);
  1.1637 +    	return SECFailure;
  1.1638 +    }
  1.1639 +    if (mode == NSS_CAMELLIA_CBC) {
  1.1640 +	memcpy(cx->iv, iv, CAMELLIA_BLOCK_SIZE);
  1.1641 +	cx->worker = (encrypt) ? &camellia_encryptCBC : &camellia_decryptCBC;
  1.1642 +    } else {
  1.1643 +	cx->worker = (encrypt) ? &camellia_encryptECB : &camellia_decryptECB;
  1.1644 +    }
  1.1645 +
  1.1646 +    /* Generate expanded key */
  1.1647 +    if (camellia_key_expansion(cx, key, keysize) != SECSuccess)
  1.1648 +	goto cleanup;
  1.1649 +
  1.1650 +    return SECSuccess;
  1.1651 +cleanup:
  1.1652 +    return SECFailure;
  1.1653 +}
  1.1654 +
  1.1655 +/*
  1.1656 + * Camellia_CreateContext
  1.1657 + * create a new context for Camellia operations
  1.1658 + */
  1.1659 +
  1.1660 +
  1.1661 +CamelliaContext *
  1.1662 +Camellia_CreateContext(const unsigned char *key, const unsigned char *iv, 
  1.1663 +                       int mode, int encrypt,
  1.1664 +                       unsigned int keysize)
  1.1665 +{
  1.1666 +    CamelliaContext *cx;
  1.1667 +
  1.1668 +    if (key == NULL ||
  1.1669 +	(keysize != 16 && keysize != 24 && keysize != 32)) {
  1.1670 +	PORT_SetError(SEC_ERROR_INVALID_ARGS);
  1.1671 +	return NULL;
  1.1672 +    }
  1.1673 +    if (mode != NSS_CAMELLIA && mode != NSS_CAMELLIA_CBC) {
  1.1674 +	PORT_SetError(SEC_ERROR_INVALID_ARGS);
  1.1675 +	return NULL;
  1.1676 +    }
  1.1677 +    if (mode == NSS_CAMELLIA_CBC && iv == NULL) {
  1.1678 +	PORT_SetError(SEC_ERROR_INVALID_ARGS);
  1.1679 +	return NULL;
  1.1680 +    }
  1.1681 +    cx = PORT_ZNew(CamelliaContext);
  1.1682 +    if (!cx) {
  1.1683 +	PORT_SetError(SEC_ERROR_NO_MEMORY);
  1.1684 +	return NULL;
  1.1685 +    }
  1.1686 +
  1.1687 +    /* copy in the iv, if neccessary */
  1.1688 +    if (mode == NSS_CAMELLIA_CBC) {
  1.1689 +	memcpy(cx->iv, iv, CAMELLIA_BLOCK_SIZE);
  1.1690 +	cx->worker = (encrypt) ? &camellia_encryptCBC : &camellia_decryptCBC;
  1.1691 +    } else {
  1.1692 +	cx->worker = (encrypt) ? &camellia_encryptECB : &camellia_decryptECB;
  1.1693 +    }
  1.1694 +    /* copy keysize */
  1.1695 +    cx->keysize = keysize;
  1.1696 +
  1.1697 +    /* Generate expanded key */
  1.1698 +    if (camellia_key_expansion(cx, key, keysize) != SECSuccess)
  1.1699 +	goto cleanup;
  1.1700 +
  1.1701 +    return cx;
  1.1702 +  cleanup:
  1.1703 +    PORT_ZFree(cx, sizeof *cx);
  1.1704 +    return NULL;
  1.1705 +}
  1.1706 +
  1.1707 +/*
  1.1708 + * Camellia_DestroyContext
  1.1709 + * 
  1.1710 + * Zero an Camellia cipher context.  If freeit is true, also free the pointer
  1.1711 + * to the context.
  1.1712 + */
  1.1713 +void 
  1.1714 +Camellia_DestroyContext(CamelliaContext *cx, PRBool freeit)
  1.1715 +{
  1.1716 +    if (cx)
  1.1717 +	memset(cx, 0, sizeof *cx);
  1.1718 +    if (freeit)
  1.1719 +	PORT_Free(cx);
  1.1720 +}
  1.1721 +
  1.1722 +/*
  1.1723 + * Camellia_Encrypt
  1.1724 + *
  1.1725 + * Encrypt an arbitrary-length buffer.  The output buffer must already be
  1.1726 + * allocated to at least inputLen.
  1.1727 + */
  1.1728 +SECStatus 
  1.1729 +Camellia_Encrypt(CamelliaContext *cx, unsigned char *output,
  1.1730 +                 unsigned int *outputLen, unsigned int maxOutputLen,
  1.1731 +                 const unsigned char *input, unsigned int inputLen)
  1.1732 +{
  1.1733 +
  1.1734 +    /* Check args */
  1.1735 +    if (cx == NULL || output == NULL || input == NULL ||
  1.1736 +	outputLen == NULL) {
  1.1737 +	PORT_SetError(SEC_ERROR_INVALID_ARGS);
  1.1738 +	return SECFailure;
  1.1739 +    }
  1.1740 +
  1.1741 +    if (inputLen % CAMELLIA_BLOCK_SIZE != 0) {
  1.1742 +	PORT_SetError(SEC_ERROR_INPUT_LEN);
  1.1743 +	return SECFailure;
  1.1744 +    }
  1.1745 +    if (maxOutputLen < inputLen) {
  1.1746 +	PORT_SetError(SEC_ERROR_OUTPUT_LEN);
  1.1747 +	return SECFailure;
  1.1748 +    }
  1.1749 +    *outputLen = inputLen;
  1.1750 +
  1.1751 +    return (*cx->worker)(cx, output, outputLen, maxOutputLen,	
  1.1752 +			 input, inputLen);
  1.1753 +}
  1.1754 +
  1.1755 +/*
  1.1756 + * Camellia_Decrypt
  1.1757 + *
  1.1758 + * Decrypt and arbitrary-length buffer.  The output buffer must already be
  1.1759 + * allocated to at least inputLen.
  1.1760 + */
  1.1761 +SECStatus 
  1.1762 +Camellia_Decrypt(CamelliaContext *cx, unsigned char *output,
  1.1763 +                 unsigned int *outputLen, unsigned int maxOutputLen,
  1.1764 +                 const unsigned char *input, unsigned int inputLen)
  1.1765 +{
  1.1766 +
  1.1767 +    /* Check args */
  1.1768 +    if (cx == NULL || output == NULL || input == NULL
  1.1769 +	|| outputLen == NULL) {
  1.1770 +	PORT_SetError(SEC_ERROR_INVALID_ARGS);
  1.1771 +	return SECFailure;
  1.1772 +    }
  1.1773 +    if (inputLen % CAMELLIA_BLOCK_SIZE != 0) {
  1.1774 +	PORT_SetError(SEC_ERROR_INPUT_LEN);
  1.1775 +	return SECFailure;
  1.1776 +    }
  1.1777 +    if (maxOutputLen < inputLen) {
  1.1778 +	PORT_SetError(SEC_ERROR_OUTPUT_LEN);
  1.1779 +	return SECFailure;
  1.1780 +    }
  1.1781 +    *outputLen = inputLen;
  1.1782 +
  1.1783 +    return (*cx->worker)(cx, output, outputLen, maxOutputLen,	
  1.1784 +			 input, inputLen);
  1.1785 +}

mercurial