]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/camellia/camellia.c
Remove the "eay" c-file-style indicators
[thirdparty/openssl.git] / crypto / camellia / camellia.c
1 /* crypto/camellia/camellia.c */
2 /* ====================================================================
3 * Copyright 2006 NTT (Nippon Telegraph and Telephone Corporation) .
4 * ALL RIGHTS RESERVED.
5 *
6 * Intellectual Property information for Camellia:
7 * http://info.isl.ntt.co.jp/crypt/eng/info/chiteki.html
8 *
9 * News Release for Announcement of Camellia open source:
10 * http://www.ntt.co.jp/news/news06e/0604/060413a.html
11 *
12 * The Camellia Code included herein is developed by
13 * NTT (Nippon Telegraph and Telephone Corporation), and is contributed
14 * to the OpenSSL project.
15 *
16 * The Camellia Code is licensed pursuant to the OpenSSL open source
17 * license provided below.
18 */
19 /* ====================================================================
20 * Copyright (c) 2006 The OpenSSL Project. All rights reserved.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 *
26 * 1. Redistributions of source code must retain the above copyright
27 * notice, this list of conditions and the following disclaimer.
28 *
29 * 2. Redistributions in binary form must reproduce the above copyright
30 * notice, this list of conditions and the following disclaimer in
31 * the documentation and/or other materials provided with the
32 * distribution.
33 *
34 * 3. All advertising materials mentioning features or use of this
35 * software must display the following acknowledgment:
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
38 *
39 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
40 * endorse or promote products derived from this software without
41 * prior written permission. For written permission, please contact
42 * openssl-core@openssl.org.
43 *
44 * 5. Products derived from this software may not be called "OpenSSL"
45 * nor may "OpenSSL" appear in their names without prior written
46 * permission of the OpenSSL Project.
47 *
48 * 6. Redistributions of any form whatsoever must retain the following
49 * acknowledgment:
50 * "This product includes software developed by the OpenSSL Project
51 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
52 *
53 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
54 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
57 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
58 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
59 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
60 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
62 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
63 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
64 * OF THE POSSIBILITY OF SUCH DAMAGE.
65 * ====================================================================
66 */
67
68 /*
69 * Algorithm Specification
70 * http://info.isl.llia/specicrypt/eng/camellia/specifications.html
71 */
72
73 /*
74 * This release balances code size and performance. In particular key
75 * schedule setup is fully unrolled, because doing so *significantly*
76 * reduces amount of instructions per setup round and code increase is
77 * justifiable. In block functions on the other hand only inner loops
78 * are unrolled, as full unroll gives only nominal performance boost,
79 * while code size grows 4 or 7 times. Also, unlike previous versions
80 * this one "encourages" compiler to keep intermediate variables in
81 * registers, which should give better "all round" results, in other
82 * words reasonable performance even with not so modern compilers.
83 */
84
85 #include <openssl/camellia.h>
86 #include "cmll_locl.h"
87 #include <string.h>
88 #include <stdlib.h>
89
90 /* 32-bit rotations */
91 #if !defined(PEDANTIC) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
92 # if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64))
93 # define RightRotate(x, s) _lrotr(x, s)
94 # define LeftRotate(x, s) _lrotl(x, s)
95 # if _MSC_VER >= 1400
96 # define SWAP(x) _byteswap_ulong(x)
97 # else
98 # define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
99 # endif
100 # define GETU32(p) SWAP(*((u32 *)(p)))
101 # define PUTU32(p,v) (*((u32 *)(p)) = SWAP((v)))
102 # elif defined(__GNUC__) && __GNUC__>=2
103 # if defined(__i386) || defined(__x86_64)
104 # define RightRotate(x,s) ({u32 ret; asm ("rorl %1,%0":"=r"(ret):"I"(s),"0"(x):"cc"); ret; })
105 # define LeftRotate(x,s) ({u32 ret; asm ("roll %1,%0":"=r"(ret):"I"(s),"0"(x):"cc"); ret; })
106 # if defined(B_ENDIAN) /* stratus.com does it */
107 # define GETU32(p) (*(u32 *)(p))
108 # define PUTU32(p,v) (*(u32 *)(p)=(v))
109 # else
110 # define GETU32(p) ({u32 r=*(const u32 *)(p); asm("bswapl %0":"=r"(r):"0"(r)); r; })
111 # define PUTU32(p,v) ({u32 r=(v); asm("bswapl %0":"=r"(r):"0"(r)); *(u32 *)(p)=r; })
112 # endif
113 # elif defined(_ARCH_PPC) || defined(_ARCH_PPC64) || \
114 defined(__powerpc) || defined(__ppc__) || defined(__powerpc64__)
115 # define LeftRotate(x,s) ({u32 ret; asm ("rlwinm %0,%1,%2,0,31":"=r"(ret):"r"(x),"I"(s)); ret; })
116 # define RightRotate(x,s) LeftRotate(x,(32-s))
117 # elif defined(__s390x__)
118 # define LeftRotate(x,s) ({u32 ret; asm ("rll %0,%1,%2":"=r"(ret):"r"(x),"I"(s)); ret; })
119 # define RightRotate(x,s) LeftRotate(x,(32-s))
120 # define GETU32(p) (*(u32 *)(p))
121 # define PUTU32(p,v) (*(u32 *)(p)=(v))
122 # endif
123 # endif
124 #endif
125
126 #if !defined(RightRotate) && !defined(LeftRotate)
127 # define RightRotate(x, s) ( ((x) >> (s)) + ((x) << (32 - s)) )
128 # define LeftRotate(x, s) ( ((x) << (s)) + ((x) >> (32 - s)) )
129 #endif
130
131 #if !defined(GETU32) && !defined(PUTU32)
132 # define GETU32(p) (((u32)(p)[0] << 24) ^ ((u32)(p)[1] << 16) ^ ((u32)(p)[2] << 8) ^ ((u32)(p)[3]))
133 # define PUTU32(p,v) ((p)[0] = (u8)((v) >> 24), (p)[1] = (u8)((v) >> 16), (p)[2] = (u8)((v) >> 8), (p)[3] = (u8)(v))
134 #endif
135
136 /* S-box data */
137 #define SBOX1_1110 Camellia_SBOX[0]
138 #define SBOX4_4404 Camellia_SBOX[1]
139 #define SBOX2_0222 Camellia_SBOX[2]
140 #define SBOX3_3033 Camellia_SBOX[3]
141 static const u32 Camellia_SBOX[][256] = {
142 {0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00, 0xb3b3b300, 0x27272700,
143 0xc0c0c000, 0xe5e5e500, 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
144 0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100, 0x23232300, 0xefefef00,
145 0x6b6b6b00, 0x93939300, 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
146 0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00, 0x1d1d1d00, 0x65656500,
147 0x92929200, 0xbdbdbd00, 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
148 0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00, 0x3e3e3e00, 0x30303000,
149 0xdcdcdc00, 0x5f5f5f00, 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
150 0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00, 0xd5d5d500, 0x47474700,
151 0x5d5d5d00, 0x3d3d3d00, 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
152 0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00, 0x8b8b8b00, 0x0d0d0d00,
153 0x9a9a9a00, 0x66666600, 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
154 0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000, 0xf0f0f000, 0xb1b1b100,
155 0x84848400, 0x99999900, 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
156 0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500, 0x6d6d6d00, 0xb7b7b700,
157 0xa9a9a900, 0x31313100, 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
158 0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100, 0xdedede00, 0x1b1b1b00,
159 0x11111100, 0x1c1c1c00, 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
160 0x53535300, 0x18181800, 0xf2f2f200, 0x22222200, 0xfefefe00, 0x44444400,
161 0xcfcfcf00, 0xb2b2b200, 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
162 0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800, 0x60606000, 0xfcfcfc00,
163 0x69696900, 0x50505000, 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
164 0xa1a1a100, 0x89898900, 0x62626200, 0x97979700, 0x54545400, 0x5b5b5b00,
165 0x1e1e1e00, 0x95959500, 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
166 0x10101000, 0xc4c4c400, 0x00000000, 0x48484800, 0xa3a3a300, 0xf7f7f700,
167 0x75757500, 0xdbdbdb00, 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
168 0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400, 0x87878700, 0x5c5c5c00,
169 0x83838300, 0x02020200, 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
170 0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300, 0x9d9d9d00, 0x7f7f7f00,
171 0xbfbfbf00, 0xe2e2e200, 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
172 0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00, 0x81818100, 0x96969600,
173 0x6f6f6f00, 0x4b4b4b00, 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
174 0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00, 0x9f9f9f00, 0x6e6e6e00,
175 0xbcbcbc00, 0x8e8e8e00, 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
176 0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900, 0x78787800, 0x98989800,
177 0x06060600, 0x6a6a6a00, 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
178 0xd4d4d400, 0x25252500, 0xababab00, 0x42424200, 0x88888800, 0xa2a2a200,
179 0x8d8d8d00, 0xfafafa00, 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
180 0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00, 0x36363600, 0x49494900,
181 0x2a2a2a00, 0x68686800, 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
182 0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00, 0xbbbbbb00, 0xc9c9c900,
183 0x43434300, 0xc1c1c100, 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
184 0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00},
185 {0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0, 0xe4e400e4, 0x57570057,
186 0xeaea00ea, 0xaeae00ae, 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
187 0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092, 0x86860086, 0xafaf00af,
188 0x7c7c007c, 0x1f1f001f, 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
189 0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d, 0xd9d900d9, 0x5a5a005a,
190 0x51510051, 0x6c6c006c, 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
191 0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084, 0xdfdf00df, 0xcbcb00cb,
192 0x34340034, 0x76760076, 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
193 0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011, 0x32320032, 0x9c9c009c,
194 0x53530053, 0xf2f200f2, 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
195 0x24240024, 0xe8e800e8, 0x60600060, 0x69690069, 0xaaaa00aa, 0xa0a000a0,
196 0xa1a100a1, 0x62620062, 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
197 0x10100010, 0x00000000, 0xa3a300a3, 0x75750075, 0x8a8a008a, 0xe6e600e6,
198 0x09090009, 0xdddd00dd, 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
199 0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf, 0x52520052, 0xd8d800d8,
200 0xc8c800c8, 0xc6c600c6, 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
201 0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc, 0x29290029, 0xf9f900f9,
202 0x2f2f002f, 0xb4b400b4, 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
203 0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d, 0x72720072, 0xb9b900b9,
204 0xf8f800f8, 0xacac00ac, 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
205 0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043, 0x15150015, 0xadad00ad,
206 0x77770077, 0x80800080, 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
207 0x85850085, 0x35350035, 0x0c0c000c, 0x41410041, 0xefef00ef, 0x93930093,
208 0x19190019, 0x21210021, 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
209 0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce, 0x30300030, 0x5f5f005f,
210 0xc5c500c5, 0x1a1a001a, 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
211 0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d, 0x0d0d000d, 0x66660066,
212 0xcccc00cc, 0x2d2d002d, 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
213 0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005, 0xb7b700b7, 0x31310031,
214 0x17170017, 0xd7d700d7, 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
215 0x0f0f000f, 0x16160016, 0x18180018, 0x22220022, 0x44440044, 0xb2b200b2,
216 0xb5b500b5, 0x91910091, 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
217 0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097, 0x5b5b005b, 0x95950095,
218 0xffff00ff, 0xd2d200d2, 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
219 0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094, 0x5c5c005c, 0x02020002,
220 0x4a4a004a, 0x33330033, 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
221 0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b, 0x96960096, 0x4b4b004b,
222 0xbebe00be, 0x2e2e002e, 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
223 0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059, 0x98980098, 0x6a6a006a,
224 0x46460046, 0xbaba00ba, 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
225 0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a, 0x49490049, 0x68680068,
226 0x38380038, 0xa4a400a4, 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
227 0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e},
228 {0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9, 0x00676767, 0x004e4e4e,
229 0x00818181, 0x00cbcbcb, 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
230 0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282, 0x00464646, 0x00dfdfdf,
231 0x00d6d6d6, 0x00272727, 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
232 0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c, 0x003a3a3a, 0x00cacaca,
233 0x00252525, 0x007b7b7b, 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
234 0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d, 0x007c7c7c, 0x00606060,
235 0x00b9b9b9, 0x00bebebe, 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
236 0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595, 0x00ababab, 0x008e8e8e,
237 0x00bababa, 0x007a7a7a, 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
238 0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a, 0x00171717, 0x001a1a1a,
239 0x00353535, 0x00cccccc, 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
240 0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040, 0x00e1e1e1, 0x00636363,
241 0x00090909, 0x00333333, 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
242 0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a, 0x00dadada, 0x006f6f6f,
243 0x00535353, 0x00626262, 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
244 0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2, 0x00bdbdbd, 0x00363636,
245 0x00222222, 0x00383838, 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
246 0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444, 0x00fdfdfd, 0x00888888,
247 0x009f9f9f, 0x00656565, 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
248 0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151, 0x00c0c0c0, 0x00f9f9f9,
249 0x00d2d2d2, 0x00a0a0a0, 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
250 0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f, 0x00a8a8a8, 0x00b6b6b6,
251 0x003c3c3c, 0x002b2b2b, 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
252 0x00202020, 0x00898989, 0x00000000, 0x00909090, 0x00474747, 0x00efefef,
253 0x00eaeaea, 0x00b7b7b7, 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
254 0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929, 0x000f0f0f, 0x00b8b8b8,
255 0x00070707, 0x00040404, 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
256 0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7, 0x003b3b3b, 0x00fefefe,
257 0x007f7f7f, 0x00c5c5c5, 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
258 0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676, 0x00030303, 0x002d2d2d,
259 0x00dedede, 0x00969696, 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
260 0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919, 0x003f3f3f, 0x00dcdcdc,
261 0x00797979, 0x001d1d1d, 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
262 0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2, 0x00f0f0f0, 0x00313131,
263 0x000c0c0c, 0x00d4d4d4, 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
264 0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484, 0x00111111, 0x00454545,
265 0x001b1b1b, 0x00f5f5f5, 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
266 0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414, 0x006c6c6c, 0x00929292,
267 0x00545454, 0x00d0d0d0, 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
268 0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6, 0x00777777, 0x00939393,
269 0x00868686, 0x00838383, 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
270 0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d},
271 {0x38003838, 0x41004141, 0x16001616, 0x76007676, 0xd900d9d9, 0x93009393,
272 0x60006060, 0xf200f2f2, 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
273 0x75007575, 0x06000606, 0x57005757, 0xa000a0a0, 0x91009191, 0xf700f7f7,
274 0xb500b5b5, 0xc900c9c9, 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
275 0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727, 0x8e008e8e, 0xb200b2b2,
276 0x49004949, 0xde00dede, 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
277 0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767, 0x1f001f1f, 0x18001818,
278 0x6e006e6e, 0xaf00afaf, 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
279 0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565, 0xea00eaea, 0xa300a3a3,
280 0xae00aeae, 0x9e009e9e, 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
281 0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6, 0xc500c5c5, 0x86008686,
282 0x4d004d4d, 0x33003333, 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
283 0x3a003a3a, 0x09000909, 0x95009595, 0x10001010, 0x78007878, 0xd800d8d8,
284 0x42004242, 0xcc00cccc, 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
285 0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282, 0xb600b6b6, 0xdb00dbdb,
286 0xd400d4d4, 0x98009898, 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
287 0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0, 0x6f006f6f, 0x8d008d8d,
288 0x88008888, 0x0e000e0e, 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
289 0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111, 0x7f007f7f, 0x22002222,
290 0xe700e7e7, 0x59005959, 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
291 0x12001212, 0x04000404, 0x74007474, 0x54005454, 0x30003030, 0x7e007e7e,
292 0xb400b4b4, 0x28002828, 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
293 0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb, 0x2a002a2a, 0xad00adad,
294 0x0f000f0f, 0xca00caca, 0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
295 0x08000808, 0x62006262, 0x00000000, 0x24002424, 0xd100d1d1, 0xfb00fbfb,
296 0xba00baba, 0xed00eded, 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
297 0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a, 0xc300c3c3, 0x2e002e2e,
298 0xc100c1c1, 0x01000101, 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
299 0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9, 0xce00cece, 0xbf00bfbf,
300 0xdf00dfdf, 0x71007171, 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
301 0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d, 0xc000c0c0, 0x4b004b4b,
302 0xb700b7b7, 0xa500a5a5, 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
303 0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646, 0xcf00cfcf, 0x37003737,
304 0x5e005e5e, 0x47004747, 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
305 0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac, 0x3c003c3c, 0x4c004c4c,
306 0x03000303, 0x35003535, 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
307 0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121, 0x44004444, 0x51005151,
308 0xc600c6c6, 0x7d007d7d, 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
309 0x7c007c7c, 0x77007777, 0x56005656, 0x05000505, 0x1b001b1b, 0xa400a4a4,
310 0x15001515, 0x34003434, 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
311 0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd, 0xdd00dddd, 0xe400e4e4,
312 0xa100a1a1, 0xe000e0e0, 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
313 0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f}
314 };
315
316 /* Key generation constants */
317 static const u32 SIGMA[] = {
318 0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2, 0xc6ef372f, 0xe94f82be,
319 0x54ff53a5, 0xf1d36f1c, 0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd
320 };
321
322 /* The phi algorithm given in C.2.7 of the Camellia spec document. */
323 /*
324 * This version does not attempt to minimize amount of temporary
325 * variables, but instead explicitly exposes algorithm's parallelism.
326 * It is therefore most appropriate for platforms with not less than
327 * ~16 registers. For platforms with less registers [well, x86 to be
328 * specific] assembler version should be/is provided anyway...
329 */
330 #define Camellia_Feistel(_s0,_s1,_s2,_s3,_key) do {\
331 register u32 _t0,_t1,_t2,_t3;\
332 \
333 _t0 = _s0 ^ (_key)[0];\
334 _t3 = SBOX4_4404[_t0&0xff];\
335 _t1 = _s1 ^ (_key)[1];\
336 _t3 ^= SBOX3_3033[(_t0 >> 8)&0xff];\
337 _t2 = SBOX1_1110[_t1&0xff];\
338 _t3 ^= SBOX2_0222[(_t0 >> 16)&0xff];\
339 _t2 ^= SBOX4_4404[(_t1 >> 8)&0xff];\
340 _t3 ^= SBOX1_1110[(_t0 >> 24)];\
341 _t2 ^= _t3;\
342 _t3 = RightRotate(_t3,8);\
343 _t2 ^= SBOX3_3033[(_t1 >> 16)&0xff];\
344 _s3 ^= _t3;\
345 _t2 ^= SBOX2_0222[(_t1 >> 24)];\
346 _s2 ^= _t2; \
347 _s3 ^= _t2;\
348 } while(0)
349
350 /*
351 * Note that n has to be less than 32. Rotations for larger amount
352 * of bits are achieved by "rotating" order of s-elements and
353 * adjusting n accordingly, e.g. RotLeft128(s1,s2,s3,s0,n-32).
354 */
355 #define RotLeft128(_s0,_s1,_s2,_s3,_n) do {\
356 u32 _t0=_s0>>(32-_n);\
357 _s0 = (_s0<<_n) | (_s1>>(32-_n));\
358 _s1 = (_s1<<_n) | (_s2>>(32-_n));\
359 _s2 = (_s2<<_n) | (_s3>>(32-_n));\
360 _s3 = (_s3<<_n) | _t0;\
361 } while (0)
362
363 int Camellia_Ekeygen(int keyBitLength, const u8 *rawKey, KEY_TABLE_TYPE k)
364 {
365 register u32 s0, s1, s2, s3;
366
367 k[0] = s0 = GETU32(rawKey);
368 k[1] = s1 = GETU32(rawKey + 4);
369 k[2] = s2 = GETU32(rawKey + 8);
370 k[3] = s3 = GETU32(rawKey + 12);
371
372 if (keyBitLength != 128) {
373 k[8] = s0 = GETU32(rawKey + 16);
374 k[9] = s1 = GETU32(rawKey + 20);
375 if (keyBitLength == 192) {
376 k[10] = s2 = ~s0;
377 k[11] = s3 = ~s1;
378 } else {
379 k[10] = s2 = GETU32(rawKey + 24);
380 k[11] = s3 = GETU32(rawKey + 28);
381 }
382 s0 ^= k[0], s1 ^= k[1], s2 ^= k[2], s3 ^= k[3];
383 }
384
385 /* Use the Feistel routine to scramble the key material */
386 Camellia_Feistel(s0, s1, s2, s3, SIGMA + 0);
387 Camellia_Feistel(s2, s3, s0, s1, SIGMA + 2);
388
389 s0 ^= k[0], s1 ^= k[1], s2 ^= k[2], s3 ^= k[3];
390 Camellia_Feistel(s0, s1, s2, s3, SIGMA + 4);
391 Camellia_Feistel(s2, s3, s0, s1, SIGMA + 6);
392
393 /* Fill the keyTable. Requires many block rotations. */
394 if (keyBitLength == 128) {
395 k[4] = s0, k[5] = s1, k[6] = s2, k[7] = s3;
396 RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 15 */
397 k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3;
398 RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 30 */
399 k[16] = s0, k[17] = s1, k[18] = s2, k[19] = s3;
400 RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 45 */
401 k[24] = s0, k[25] = s1;
402 RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 60 */
403 k[28] = s0, k[29] = s1, k[30] = s2, k[31] = s3;
404 RotLeft128(s1, s2, s3, s0, 2); /* KA <<< 94 */
405 k[40] = s1, k[41] = s2, k[42] = s3, k[43] = s0;
406 RotLeft128(s1, s2, s3, s0, 17); /* KA <<<111 */
407 k[48] = s1, k[49] = s2, k[50] = s3, k[51] = s0;
408
409 s0 = k[0], s1 = k[1], s2 = k[2], s3 = k[3];
410 RotLeft128(s0, s1, s2, s3, 15); /* KL <<< 15 */
411 k[8] = s0, k[9] = s1, k[10] = s2, k[11] = s3;
412 RotLeft128(s0, s1, s2, s3, 30); /* KL <<< 45 */
413 k[20] = s0, k[21] = s1, k[22] = s2, k[23] = s3;
414 RotLeft128(s0, s1, s2, s3, 15); /* KL <<< 60 */
415 k[26] = s2, k[27] = s3;
416 RotLeft128(s0, s1, s2, s3, 17); /* KL <<< 77 */
417 k[32] = s0, k[33] = s1, k[34] = s2, k[35] = s3;
418 RotLeft128(s0, s1, s2, s3, 17); /* KL <<< 94 */
419 k[36] = s0, k[37] = s1, k[38] = s2, k[39] = s3;
420 RotLeft128(s0, s1, s2, s3, 17); /* KL <<<111 */
421 k[44] = s0, k[45] = s1, k[46] = s2, k[47] = s3;
422
423 return 3; /* grand rounds */
424 } else {
425 k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3;
426 s0 ^= k[8], s1 ^= k[9], s2 ^= k[10], s3 ^= k[11];
427 Camellia_Feistel(s0, s1, s2, s3, (SIGMA + 8));
428 Camellia_Feistel(s2, s3, s0, s1, (SIGMA + 10));
429
430 k[4] = s0, k[5] = s1, k[6] = s2, k[7] = s3;
431 RotLeft128(s0, s1, s2, s3, 30); /* KB <<< 30 */
432 k[20] = s0, k[21] = s1, k[22] = s2, k[23] = s3;
433 RotLeft128(s0, s1, s2, s3, 30); /* KB <<< 60 */
434 k[40] = s0, k[41] = s1, k[42] = s2, k[43] = s3;
435 RotLeft128(s1, s2, s3, s0, 19); /* KB <<<111 */
436 k[64] = s1, k[65] = s2, k[66] = s3, k[67] = s0;
437
438 s0 = k[8], s1 = k[9], s2 = k[10], s3 = k[11];
439 RotLeft128(s0, s1, s2, s3, 15); /* KR <<< 15 */
440 k[8] = s0, k[9] = s1, k[10] = s2, k[11] = s3;
441 RotLeft128(s0, s1, s2, s3, 15); /* KR <<< 30 */
442 k[16] = s0, k[17] = s1, k[18] = s2, k[19] = s3;
443 RotLeft128(s0, s1, s2, s3, 30); /* KR <<< 60 */
444 k[36] = s0, k[37] = s1, k[38] = s2, k[39] = s3;
445 RotLeft128(s1, s2, s3, s0, 2); /* KR <<< 94 */
446 k[52] = s1, k[53] = s2, k[54] = s3, k[55] = s0;
447
448 s0 = k[12], s1 = k[13], s2 = k[14], s3 = k[15];
449 RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 15 */
450 k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3;
451 RotLeft128(s0, s1, s2, s3, 30); /* KA <<< 45 */
452 k[28] = s0, k[29] = s1, k[30] = s2, k[31] = s3;
453 /* KA <<< 77 */
454 k[48] = s1, k[49] = s2, k[50] = s3, k[51] = s0;
455 RotLeft128(s1, s2, s3, s0, 17); /* KA <<< 94 */
456 k[56] = s1, k[57] = s2, k[58] = s3, k[59] = s0;
457
458 s0 = k[0], s1 = k[1], s2 = k[2], s3 = k[3];
459 RotLeft128(s1, s2, s3, s0, 13); /* KL <<< 45 */
460 k[24] = s1, k[25] = s2, k[26] = s3, k[27] = s0;
461 RotLeft128(s1, s2, s3, s0, 15); /* KL <<< 60 */
462 k[32] = s1, k[33] = s2, k[34] = s3, k[35] = s0;
463 RotLeft128(s1, s2, s3, s0, 17); /* KL <<< 77 */
464 k[44] = s1, k[45] = s2, k[46] = s3, k[47] = s0;
465 RotLeft128(s2, s3, s0, s1, 2); /* KL <<<111 */
466 k[60] = s2, k[61] = s3, k[62] = s0, k[63] = s1;
467
468 return 4; /* grand rounds */
469 }
470 /*
471 * It is possible to perform certain precalculations, which
472 * would spare few cycles in block procedure. It's not done,
473 * because it upsets the performance balance between key
474 * setup and block procedures, negatively affecting overall
475 * throughput in applications operating on short messages
476 * and volatile keys.
477 */
478 }
479
480 void Camellia_EncryptBlock_Rounds(int grandRounds, const u8 plaintext[],
481 const KEY_TABLE_TYPE keyTable,
482 u8 ciphertext[])
483 {
484 register u32 s0, s1, s2, s3;
485 const u32 *k = keyTable, *kend = keyTable + grandRounds * 16;
486
487 s0 = GETU32(plaintext) ^ k[0];
488 s1 = GETU32(plaintext + 4) ^ k[1];
489 s2 = GETU32(plaintext + 8) ^ k[2];
490 s3 = GETU32(plaintext + 12) ^ k[3];
491 k += 4;
492
493 while (1) {
494 /* Camellia makes 6 Feistel rounds */
495 Camellia_Feistel(s0, s1, s2, s3, k + 0);
496 Camellia_Feistel(s2, s3, s0, s1, k + 2);
497 Camellia_Feistel(s0, s1, s2, s3, k + 4);
498 Camellia_Feistel(s2, s3, s0, s1, k + 6);
499 Camellia_Feistel(s0, s1, s2, s3, k + 8);
500 Camellia_Feistel(s2, s3, s0, s1, k + 10);
501 k += 12;
502
503 if (k == kend)
504 break;
505
506 /*
507 * This is the same function as the diffusion function D of the
508 * accompanying documentation. See section 3.2 for properties of the
509 * FLlayer function.
510 */
511 s1 ^= LeftRotate(s0 & k[0], 1);
512 s2 ^= s3 | k[3];
513 s0 ^= s1 | k[1];
514 s3 ^= LeftRotate(s2 & k[2], 1);
515 k += 4;
516 }
517
518 s2 ^= k[0], s3 ^= k[1], s0 ^= k[2], s1 ^= k[3];
519
520 PUTU32(ciphertext, s2);
521 PUTU32(ciphertext + 4, s3);
522 PUTU32(ciphertext + 8, s0);
523 PUTU32(ciphertext + 12, s1);
524 }
525
526 void Camellia_EncryptBlock(int keyBitLength, const u8 plaintext[],
527 const KEY_TABLE_TYPE keyTable, u8 ciphertext[])
528 {
529 Camellia_EncryptBlock_Rounds(keyBitLength == 128 ? 3 : 4,
530 plaintext, keyTable, ciphertext);
531 }
532
533 void Camellia_DecryptBlock_Rounds(int grandRounds, const u8 ciphertext[],
534 const KEY_TABLE_TYPE keyTable,
535 u8 plaintext[])
536 {
537 u32 s0, s1, s2, s3;
538 const u32 *k = keyTable + grandRounds * 16, *kend = keyTable + 4;
539
540 s0 = GETU32(ciphertext) ^ k[0];
541 s1 = GETU32(ciphertext + 4) ^ k[1];
542 s2 = GETU32(ciphertext + 8) ^ k[2];
543 s3 = GETU32(ciphertext + 12) ^ k[3];
544
545 while (1) {
546 /* Camellia makes 6 Feistel rounds */
547 k -= 12;
548 Camellia_Feistel(s0, s1, s2, s3, k + 10);
549 Camellia_Feistel(s2, s3, s0, s1, k + 8);
550 Camellia_Feistel(s0, s1, s2, s3, k + 6);
551 Camellia_Feistel(s2, s3, s0, s1, k + 4);
552 Camellia_Feistel(s0, s1, s2, s3, k + 2);
553 Camellia_Feistel(s2, s3, s0, s1, k + 0);
554
555 if (k == kend)
556 break;
557
558 /*
559 * This is the same function as the diffusion function D of the
560 * accompanying documentation. See section 3.2 for properties of the
561 * FLlayer function.
562 */
563 k -= 4;
564 s1 ^= LeftRotate(s0 & k[2], 1);
565 s2 ^= s3 | k[1];
566 s0 ^= s1 | k[3];
567 s3 ^= LeftRotate(s2 & k[0], 1);
568 }
569
570 k -= 4;
571 s2 ^= k[0], s3 ^= k[1], s0 ^= k[2], s1 ^= k[3];
572
573 PUTU32(plaintext, s2);
574 PUTU32(plaintext + 4, s3);
575 PUTU32(plaintext + 8, s0);
576 PUTU32(plaintext + 12, s1);
577 }
578
579 void Camellia_DecryptBlock(int keyBitLength, const u8 plaintext[],
580 const KEY_TABLE_TYPE keyTable, u8 ciphertext[])
581 {
582 Camellia_DecryptBlock_Rounds(keyBitLength == 128 ? 3 : 4,
583 plaintext, keyTable, ciphertext);
584 }