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