Loading...
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) 2006
4 * NTT (Nippon Telegraph and Telephone Corporation).
5 */
6
7/*
8 * Algorithm Specification
9 * https://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
10 */
11
12/*
13 *
14 * NOTE --- NOTE --- NOTE --- NOTE
15 * This implementation assumes that all memory addresses passed
16 * as parameters are four-byte aligned.
17 *
18 */
19
20#include <linux/crypto.h>
21#include <linux/errno.h>
22#include <linux/init.h>
23#include <linux/kernel.h>
24#include <linux/module.h>
25#include <linux/bitops.h>
26#include <asm/unaligned.h>
27
28static const u32 camellia_sp1110[256] = {
29 0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00,
30 0xb3b3b300, 0x27272700, 0xc0c0c000, 0xe5e5e500,
31 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
32 0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100,
33 0x23232300, 0xefefef00, 0x6b6b6b00, 0x93939300,
34 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
35 0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00,
36 0x1d1d1d00, 0x65656500, 0x92929200, 0xbdbdbd00,
37 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
38 0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00,
39 0x3e3e3e00, 0x30303000, 0xdcdcdc00, 0x5f5f5f00,
40 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
41 0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00,
42 0xd5d5d500, 0x47474700, 0x5d5d5d00, 0x3d3d3d00,
43 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
44 0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00,
45 0x8b8b8b00, 0x0d0d0d00, 0x9a9a9a00, 0x66666600,
46 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
47 0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000,
48 0xf0f0f000, 0xb1b1b100, 0x84848400, 0x99999900,
49 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
50 0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500,
51 0x6d6d6d00, 0xb7b7b700, 0xa9a9a900, 0x31313100,
52 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
53 0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100,
54 0xdedede00, 0x1b1b1b00, 0x11111100, 0x1c1c1c00,
55 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
56 0x53535300, 0x18181800, 0xf2f2f200, 0x22222200,
57 0xfefefe00, 0x44444400, 0xcfcfcf00, 0xb2b2b200,
58 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
59 0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800,
60 0x60606000, 0xfcfcfc00, 0x69696900, 0x50505000,
61 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
62 0xa1a1a100, 0x89898900, 0x62626200, 0x97979700,
63 0x54545400, 0x5b5b5b00, 0x1e1e1e00, 0x95959500,
64 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
65 0x10101000, 0xc4c4c400, 0x00000000, 0x48484800,
66 0xa3a3a300, 0xf7f7f700, 0x75757500, 0xdbdbdb00,
67 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
68 0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400,
69 0x87878700, 0x5c5c5c00, 0x83838300, 0x02020200,
70 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
71 0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300,
72 0x9d9d9d00, 0x7f7f7f00, 0xbfbfbf00, 0xe2e2e200,
73 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
74 0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00,
75 0x81818100, 0x96969600, 0x6f6f6f00, 0x4b4b4b00,
76 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
77 0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00,
78 0x9f9f9f00, 0x6e6e6e00, 0xbcbcbc00, 0x8e8e8e00,
79 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
80 0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900,
81 0x78787800, 0x98989800, 0x06060600, 0x6a6a6a00,
82 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
83 0xd4d4d400, 0x25252500, 0xababab00, 0x42424200,
84 0x88888800, 0xa2a2a200, 0x8d8d8d00, 0xfafafa00,
85 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
86 0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00,
87 0x36363600, 0x49494900, 0x2a2a2a00, 0x68686800,
88 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
89 0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00,
90 0xbbbbbb00, 0xc9c9c900, 0x43434300, 0xc1c1c100,
91 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
92 0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00,
93};
94
95static const u32 camellia_sp0222[256] = {
96 0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9,
97 0x00676767, 0x004e4e4e, 0x00818181, 0x00cbcbcb,
98 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
99 0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282,
100 0x00464646, 0x00dfdfdf, 0x00d6d6d6, 0x00272727,
101 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
102 0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c,
103 0x003a3a3a, 0x00cacaca, 0x00252525, 0x007b7b7b,
104 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
105 0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d,
106 0x007c7c7c, 0x00606060, 0x00b9b9b9, 0x00bebebe,
107 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
108 0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595,
109 0x00ababab, 0x008e8e8e, 0x00bababa, 0x007a7a7a,
110 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
111 0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a,
112 0x00171717, 0x001a1a1a, 0x00353535, 0x00cccccc,
113 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
114 0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040,
115 0x00e1e1e1, 0x00636363, 0x00090909, 0x00333333,
116 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
117 0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a,
118 0x00dadada, 0x006f6f6f, 0x00535353, 0x00626262,
119 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
120 0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2,
121 0x00bdbdbd, 0x00363636, 0x00222222, 0x00383838,
122 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
123 0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444,
124 0x00fdfdfd, 0x00888888, 0x009f9f9f, 0x00656565,
125 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
126 0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151,
127 0x00c0c0c0, 0x00f9f9f9, 0x00d2d2d2, 0x00a0a0a0,
128 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
129 0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f,
130 0x00a8a8a8, 0x00b6b6b6, 0x003c3c3c, 0x002b2b2b,
131 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
132 0x00202020, 0x00898989, 0x00000000, 0x00909090,
133 0x00474747, 0x00efefef, 0x00eaeaea, 0x00b7b7b7,
134 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
135 0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929,
136 0x000f0f0f, 0x00b8b8b8, 0x00070707, 0x00040404,
137 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
138 0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7,
139 0x003b3b3b, 0x00fefefe, 0x007f7f7f, 0x00c5c5c5,
140 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
141 0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676,
142 0x00030303, 0x002d2d2d, 0x00dedede, 0x00969696,
143 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
144 0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919,
145 0x003f3f3f, 0x00dcdcdc, 0x00797979, 0x001d1d1d,
146 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
147 0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2,
148 0x00f0f0f0, 0x00313131, 0x000c0c0c, 0x00d4d4d4,
149 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
150 0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484,
151 0x00111111, 0x00454545, 0x001b1b1b, 0x00f5f5f5,
152 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
153 0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414,
154 0x006c6c6c, 0x00929292, 0x00545454, 0x00d0d0d0,
155 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
156 0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6,
157 0x00777777, 0x00939393, 0x00868686, 0x00838383,
158 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
159 0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d,
160};
161
162static const u32 camellia_sp3033[256] = {
163 0x38003838, 0x41004141, 0x16001616, 0x76007676,
164 0xd900d9d9, 0x93009393, 0x60006060, 0xf200f2f2,
165 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
166 0x75007575, 0x06000606, 0x57005757, 0xa000a0a0,
167 0x91009191, 0xf700f7f7, 0xb500b5b5, 0xc900c9c9,
168 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
169 0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727,
170 0x8e008e8e, 0xb200b2b2, 0x49004949, 0xde00dede,
171 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
172 0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767,
173 0x1f001f1f, 0x18001818, 0x6e006e6e, 0xaf00afaf,
174 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
175 0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565,
176 0xea00eaea, 0xa300a3a3, 0xae00aeae, 0x9e009e9e,
177 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
178 0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6,
179 0xc500c5c5, 0x86008686, 0x4d004d4d, 0x33003333,
180 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
181 0x3a003a3a, 0x09000909, 0x95009595, 0x10001010,
182 0x78007878, 0xd800d8d8, 0x42004242, 0xcc00cccc,
183 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
184 0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282,
185 0xb600b6b6, 0xdb00dbdb, 0xd400d4d4, 0x98009898,
186 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
187 0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0,
188 0x6f006f6f, 0x8d008d8d, 0x88008888, 0x0e000e0e,
189 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
190 0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111,
191 0x7f007f7f, 0x22002222, 0xe700e7e7, 0x59005959,
192 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
193 0x12001212, 0x04000404, 0x74007474, 0x54005454,
194 0x30003030, 0x7e007e7e, 0xb400b4b4, 0x28002828,
195 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
196 0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb,
197 0x2a002a2a, 0xad00adad, 0x0f000f0f, 0xca00caca,
198 0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
199 0x08000808, 0x62006262, 0x00000000, 0x24002424,
200 0xd100d1d1, 0xfb00fbfb, 0xba00baba, 0xed00eded,
201 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
202 0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a,
203 0xc300c3c3, 0x2e002e2e, 0xc100c1c1, 0x01000101,
204 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
205 0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9,
206 0xce00cece, 0xbf00bfbf, 0xdf00dfdf, 0x71007171,
207 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
208 0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d,
209 0xc000c0c0, 0x4b004b4b, 0xb700b7b7, 0xa500a5a5,
210 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
211 0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646,
212 0xcf00cfcf, 0x37003737, 0x5e005e5e, 0x47004747,
213 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
214 0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac,
215 0x3c003c3c, 0x4c004c4c, 0x03000303, 0x35003535,
216 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
217 0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121,
218 0x44004444, 0x51005151, 0xc600c6c6, 0x7d007d7d,
219 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
220 0x7c007c7c, 0x77007777, 0x56005656, 0x05000505,
221 0x1b001b1b, 0xa400a4a4, 0x15001515, 0x34003434,
222 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
223 0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd,
224 0xdd00dddd, 0xe400e4e4, 0xa100a1a1, 0xe000e0e0,
225 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
226 0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f,
227};
228
229static const u32 camellia_sp4404[256] = {
230 0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0,
231 0xe4e400e4, 0x57570057, 0xeaea00ea, 0xaeae00ae,
232 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
233 0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092,
234 0x86860086, 0xafaf00af, 0x7c7c007c, 0x1f1f001f,
235 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
236 0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d,
237 0xd9d900d9, 0x5a5a005a, 0x51510051, 0x6c6c006c,
238 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
239 0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084,
240 0xdfdf00df, 0xcbcb00cb, 0x34340034, 0x76760076,
241 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
242 0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011,
243 0x32320032, 0x9c9c009c, 0x53530053, 0xf2f200f2,
244 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
245 0x24240024, 0xe8e800e8, 0x60600060, 0x69690069,
246 0xaaaa00aa, 0xa0a000a0, 0xa1a100a1, 0x62620062,
247 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
248 0x10100010, 0x00000000, 0xa3a300a3, 0x75750075,
249 0x8a8a008a, 0xe6e600e6, 0x09090009, 0xdddd00dd,
250 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
251 0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf,
252 0x52520052, 0xd8d800d8, 0xc8c800c8, 0xc6c600c6,
253 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
254 0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc,
255 0x29290029, 0xf9f900f9, 0x2f2f002f, 0xb4b400b4,
256 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
257 0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d,
258 0x72720072, 0xb9b900b9, 0xf8f800f8, 0xacac00ac,
259 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
260 0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043,
261 0x15150015, 0xadad00ad, 0x77770077, 0x80800080,
262 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
263 0x85850085, 0x35350035, 0x0c0c000c, 0x41410041,
264 0xefef00ef, 0x93930093, 0x19190019, 0x21210021,
265 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
266 0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce,
267 0x30300030, 0x5f5f005f, 0xc5c500c5, 0x1a1a001a,
268 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
269 0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d,
270 0x0d0d000d, 0x66660066, 0xcccc00cc, 0x2d2d002d,
271 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
272 0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005,
273 0xb7b700b7, 0x31310031, 0x17170017, 0xd7d700d7,
274 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
275 0x0f0f000f, 0x16160016, 0x18180018, 0x22220022,
276 0x44440044, 0xb2b200b2, 0xb5b500b5, 0x91910091,
277 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
278 0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097,
279 0x5b5b005b, 0x95950095, 0xffff00ff, 0xd2d200d2,
280 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
281 0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094,
282 0x5c5c005c, 0x02020002, 0x4a4a004a, 0x33330033,
283 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
284 0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b,
285 0x96960096, 0x4b4b004b, 0xbebe00be, 0x2e2e002e,
286 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
287 0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059,
288 0x98980098, 0x6a6a006a, 0x46460046, 0xbaba00ba,
289 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
290 0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a,
291 0x49490049, 0x68680068, 0x38380038, 0xa4a400a4,
292 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
293 0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e,
294};
295
296
297#define CAMELLIA_MIN_KEY_SIZE 16
298#define CAMELLIA_MAX_KEY_SIZE 32
299#define CAMELLIA_BLOCK_SIZE 16
300#define CAMELLIA_TABLE_BYTE_LEN 272
301
302/*
303 * NB: L and R below stand for 'left' and 'right' as in written numbers.
304 * That is, in (xxxL,xxxR) pair xxxL holds most significant digits,
305 * _not_ least significant ones!
306 */
307
308
309/* key constants */
310
311#define CAMELLIA_SIGMA1L (0xA09E667FL)
312#define CAMELLIA_SIGMA1R (0x3BCC908BL)
313#define CAMELLIA_SIGMA2L (0xB67AE858L)
314#define CAMELLIA_SIGMA2R (0x4CAA73B2L)
315#define CAMELLIA_SIGMA3L (0xC6EF372FL)
316#define CAMELLIA_SIGMA3R (0xE94F82BEL)
317#define CAMELLIA_SIGMA4L (0x54FF53A5L)
318#define CAMELLIA_SIGMA4R (0xF1D36F1CL)
319#define CAMELLIA_SIGMA5L (0x10E527FAL)
320#define CAMELLIA_SIGMA5R (0xDE682D1DL)
321#define CAMELLIA_SIGMA6L (0xB05688C2L)
322#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
323
324/*
325 * macros
326 */
327#define ROLDQ(ll, lr, rl, rr, w0, w1, bits) ({ \
328 w0 = ll; \
329 ll = (ll << bits) + (lr >> (32 - bits)); \
330 lr = (lr << bits) + (rl >> (32 - bits)); \
331 rl = (rl << bits) + (rr >> (32 - bits)); \
332 rr = (rr << bits) + (w0 >> (32 - bits)); \
333})
334
335#define ROLDQo32(ll, lr, rl, rr, w0, w1, bits) ({ \
336 w0 = ll; \
337 w1 = lr; \
338 ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \
339 lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \
340 rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \
341 rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \
342})
343
344#define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) ({ \
345 il = xl ^ kl; \
346 ir = xr ^ kr; \
347 t0 = il >> 16; \
348 t1 = ir >> 16; \
349 yl = camellia_sp1110[(u8)(ir)] \
350 ^ camellia_sp0222[(u8)(t1 >> 8)] \
351 ^ camellia_sp3033[(u8)(t1)] \
352 ^ camellia_sp4404[(u8)(ir >> 8)]; \
353 yr = camellia_sp1110[(u8)(t0 >> 8)] \
354 ^ camellia_sp0222[(u8)(t0)] \
355 ^ camellia_sp3033[(u8)(il >> 8)] \
356 ^ camellia_sp4404[(u8)(il)]; \
357 yl ^= yr; \
358 yr = ror32(yr, 8); \
359 yr ^= yl; \
360})
361
362#define SUBKEY_L(INDEX) (subkey[(INDEX)*2])
363#define SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1])
364
365static void camellia_setup_tail(u32 *subkey, u32 *subL, u32 *subR, int max)
366{
367 u32 dw, tl, tr;
368 u32 kw4l, kw4r;
369
370 /* absorb kw2 to other subkeys */
371 /* round 2 */
372 subL[3] ^= subL[1]; subR[3] ^= subR[1];
373 /* round 4 */
374 subL[5] ^= subL[1]; subR[5] ^= subR[1];
375 /* round 6 */
376 subL[7] ^= subL[1]; subR[7] ^= subR[1];
377 subL[1] ^= subR[1] & ~subR[9];
378 dw = subL[1] & subL[9];
379 subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl2) */
380 /* round 8 */
381 subL[11] ^= subL[1]; subR[11] ^= subR[1];
382 /* round 10 */
383 subL[13] ^= subL[1]; subR[13] ^= subR[1];
384 /* round 12 */
385 subL[15] ^= subL[1]; subR[15] ^= subR[1];
386 subL[1] ^= subR[1] & ~subR[17];
387 dw = subL[1] & subL[17];
388 subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl4) */
389 /* round 14 */
390 subL[19] ^= subL[1]; subR[19] ^= subR[1];
391 /* round 16 */
392 subL[21] ^= subL[1]; subR[21] ^= subR[1];
393 /* round 18 */
394 subL[23] ^= subL[1]; subR[23] ^= subR[1];
395 if (max == 24) {
396 /* kw3 */
397 subL[24] ^= subL[1]; subR[24] ^= subR[1];
398
399 /* absorb kw4 to other subkeys */
400 kw4l = subL[25]; kw4r = subR[25];
401 } else {
402 subL[1] ^= subR[1] & ~subR[25];
403 dw = subL[1] & subL[25];
404 subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl6) */
405 /* round 20 */
406 subL[27] ^= subL[1]; subR[27] ^= subR[1];
407 /* round 22 */
408 subL[29] ^= subL[1]; subR[29] ^= subR[1];
409 /* round 24 */
410 subL[31] ^= subL[1]; subR[31] ^= subR[1];
411 /* kw3 */
412 subL[32] ^= subL[1]; subR[32] ^= subR[1];
413
414 /* absorb kw4 to other subkeys */
415 kw4l = subL[33]; kw4r = subR[33];
416 /* round 23 */
417 subL[30] ^= kw4l; subR[30] ^= kw4r;
418 /* round 21 */
419 subL[28] ^= kw4l; subR[28] ^= kw4r;
420 /* round 19 */
421 subL[26] ^= kw4l; subR[26] ^= kw4r;
422 kw4l ^= kw4r & ~subR[24];
423 dw = kw4l & subL[24];
424 kw4r ^= rol32(dw, 1); /* modified for FL(kl5) */
425 }
426 /* round 17 */
427 subL[22] ^= kw4l; subR[22] ^= kw4r;
428 /* round 15 */
429 subL[20] ^= kw4l; subR[20] ^= kw4r;
430 /* round 13 */
431 subL[18] ^= kw4l; subR[18] ^= kw4r;
432 kw4l ^= kw4r & ~subR[16];
433 dw = kw4l & subL[16];
434 kw4r ^= rol32(dw, 1); /* modified for FL(kl3) */
435 /* round 11 */
436 subL[14] ^= kw4l; subR[14] ^= kw4r;
437 /* round 9 */
438 subL[12] ^= kw4l; subR[12] ^= kw4r;
439 /* round 7 */
440 subL[10] ^= kw4l; subR[10] ^= kw4r;
441 kw4l ^= kw4r & ~subR[8];
442 dw = kw4l & subL[8];
443 kw4r ^= rol32(dw, 1); /* modified for FL(kl1) */
444 /* round 5 */
445 subL[6] ^= kw4l; subR[6] ^= kw4r;
446 /* round 3 */
447 subL[4] ^= kw4l; subR[4] ^= kw4r;
448 /* round 1 */
449 subL[2] ^= kw4l; subR[2] ^= kw4r;
450 /* kw1 */
451 subL[0] ^= kw4l; subR[0] ^= kw4r;
452
453 /* key XOR is end of F-function */
454 SUBKEY_L(0) = subL[0] ^ subL[2];/* kw1 */
455 SUBKEY_R(0) = subR[0] ^ subR[2];
456 SUBKEY_L(2) = subL[3]; /* round 1 */
457 SUBKEY_R(2) = subR[3];
458 SUBKEY_L(3) = subL[2] ^ subL[4]; /* round 2 */
459 SUBKEY_R(3) = subR[2] ^ subR[4];
460 SUBKEY_L(4) = subL[3] ^ subL[5]; /* round 3 */
461 SUBKEY_R(4) = subR[3] ^ subR[5];
462 SUBKEY_L(5) = subL[4] ^ subL[6]; /* round 4 */
463 SUBKEY_R(5) = subR[4] ^ subR[6];
464 SUBKEY_L(6) = subL[5] ^ subL[7]; /* round 5 */
465 SUBKEY_R(6) = subR[5] ^ subR[7];
466 tl = subL[10] ^ (subR[10] & ~subR[8]);
467 dw = tl & subL[8]; /* FL(kl1) */
468 tr = subR[10] ^ rol32(dw, 1);
469 SUBKEY_L(7) = subL[6] ^ tl; /* round 6 */
470 SUBKEY_R(7) = subR[6] ^ tr;
471 SUBKEY_L(8) = subL[8]; /* FL(kl1) */
472 SUBKEY_R(8) = subR[8];
473 SUBKEY_L(9) = subL[9]; /* FLinv(kl2) */
474 SUBKEY_R(9) = subR[9];
475 tl = subL[7] ^ (subR[7] & ~subR[9]);
476 dw = tl & subL[9]; /* FLinv(kl2) */
477 tr = subR[7] ^ rol32(dw, 1);
478 SUBKEY_L(10) = tl ^ subL[11]; /* round 7 */
479 SUBKEY_R(10) = tr ^ subR[11];
480 SUBKEY_L(11) = subL[10] ^ subL[12]; /* round 8 */
481 SUBKEY_R(11) = subR[10] ^ subR[12];
482 SUBKEY_L(12) = subL[11] ^ subL[13]; /* round 9 */
483 SUBKEY_R(12) = subR[11] ^ subR[13];
484 SUBKEY_L(13) = subL[12] ^ subL[14]; /* round 10 */
485 SUBKEY_R(13) = subR[12] ^ subR[14];
486 SUBKEY_L(14) = subL[13] ^ subL[15]; /* round 11 */
487 SUBKEY_R(14) = subR[13] ^ subR[15];
488 tl = subL[18] ^ (subR[18] & ~subR[16]);
489 dw = tl & subL[16]; /* FL(kl3) */
490 tr = subR[18] ^ rol32(dw, 1);
491 SUBKEY_L(15) = subL[14] ^ tl; /* round 12 */
492 SUBKEY_R(15) = subR[14] ^ tr;
493 SUBKEY_L(16) = subL[16]; /* FL(kl3) */
494 SUBKEY_R(16) = subR[16];
495 SUBKEY_L(17) = subL[17]; /* FLinv(kl4) */
496 SUBKEY_R(17) = subR[17];
497 tl = subL[15] ^ (subR[15] & ~subR[17]);
498 dw = tl & subL[17]; /* FLinv(kl4) */
499 tr = subR[15] ^ rol32(dw, 1);
500 SUBKEY_L(18) = tl ^ subL[19]; /* round 13 */
501 SUBKEY_R(18) = tr ^ subR[19];
502 SUBKEY_L(19) = subL[18] ^ subL[20]; /* round 14 */
503 SUBKEY_R(19) = subR[18] ^ subR[20];
504 SUBKEY_L(20) = subL[19] ^ subL[21]; /* round 15 */
505 SUBKEY_R(20) = subR[19] ^ subR[21];
506 SUBKEY_L(21) = subL[20] ^ subL[22]; /* round 16 */
507 SUBKEY_R(21) = subR[20] ^ subR[22];
508 SUBKEY_L(22) = subL[21] ^ subL[23]; /* round 17 */
509 SUBKEY_R(22) = subR[21] ^ subR[23];
510 if (max == 24) {
511 SUBKEY_L(23) = subL[22]; /* round 18 */
512 SUBKEY_R(23) = subR[22];
513 SUBKEY_L(24) = subL[24] ^ subL[23]; /* kw3 */
514 SUBKEY_R(24) = subR[24] ^ subR[23];
515 } else {
516 tl = subL[26] ^ (subR[26] & ~subR[24]);
517 dw = tl & subL[24]; /* FL(kl5) */
518 tr = subR[26] ^ rol32(dw, 1);
519 SUBKEY_L(23) = subL[22] ^ tl; /* round 18 */
520 SUBKEY_R(23) = subR[22] ^ tr;
521 SUBKEY_L(24) = subL[24]; /* FL(kl5) */
522 SUBKEY_R(24) = subR[24];
523 SUBKEY_L(25) = subL[25]; /* FLinv(kl6) */
524 SUBKEY_R(25) = subR[25];
525 tl = subL[23] ^ (subR[23] & ~subR[25]);
526 dw = tl & subL[25]; /* FLinv(kl6) */
527 tr = subR[23] ^ rol32(dw, 1);
528 SUBKEY_L(26) = tl ^ subL[27]; /* round 19 */
529 SUBKEY_R(26) = tr ^ subR[27];
530 SUBKEY_L(27) = subL[26] ^ subL[28]; /* round 20 */
531 SUBKEY_R(27) = subR[26] ^ subR[28];
532 SUBKEY_L(28) = subL[27] ^ subL[29]; /* round 21 */
533 SUBKEY_R(28) = subR[27] ^ subR[29];
534 SUBKEY_L(29) = subL[28] ^ subL[30]; /* round 22 */
535 SUBKEY_R(29) = subR[28] ^ subR[30];
536 SUBKEY_L(30) = subL[29] ^ subL[31]; /* round 23 */
537 SUBKEY_R(30) = subR[29] ^ subR[31];
538 SUBKEY_L(31) = subL[30]; /* round 24 */
539 SUBKEY_R(31) = subR[30];
540 SUBKEY_L(32) = subL[32] ^ subL[31]; /* kw3 */
541 SUBKEY_R(32) = subR[32] ^ subR[31];
542 }
543}
544
545static void camellia_setup128(const unsigned char *key, u32 *subkey)
546{
547 u32 kll, klr, krl, krr;
548 u32 il, ir, t0, t1, w0, w1;
549 u32 subL[26];
550 u32 subR[26];
551
552 /**
553 * k == kll || klr || krl || krr (|| is concatenation)
554 */
555 kll = get_unaligned_be32(key);
556 klr = get_unaligned_be32(key + 4);
557 krl = get_unaligned_be32(key + 8);
558 krr = get_unaligned_be32(key + 12);
559
560 /* generate KL dependent subkeys */
561 /* kw1 */
562 subL[0] = kll; subR[0] = klr;
563 /* kw2 */
564 subL[1] = krl; subR[1] = krr;
565 /* rotation left shift 15bit */
566 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
567 /* k3 */
568 subL[4] = kll; subR[4] = klr;
569 /* k4 */
570 subL[5] = krl; subR[5] = krr;
571 /* rotation left shift 15+30bit */
572 ROLDQ(kll, klr, krl, krr, w0, w1, 30);
573 /* k7 */
574 subL[10] = kll; subR[10] = klr;
575 /* k8 */
576 subL[11] = krl; subR[11] = krr;
577 /* rotation left shift 15+30+15bit */
578 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
579 /* k10 */
580 subL[13] = krl; subR[13] = krr;
581 /* rotation left shift 15+30+15+17 bit */
582 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
583 /* kl3 */
584 subL[16] = kll; subR[16] = klr;
585 /* kl4 */
586 subL[17] = krl; subR[17] = krr;
587 /* rotation left shift 15+30+15+17+17 bit */
588 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
589 /* k13 */
590 subL[18] = kll; subR[18] = klr;
591 /* k14 */
592 subL[19] = krl; subR[19] = krr;
593 /* rotation left shift 15+30+15+17+17+17 bit */
594 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
595 /* k17 */
596 subL[22] = kll; subR[22] = klr;
597 /* k18 */
598 subL[23] = krl; subR[23] = krr;
599
600 /* generate KA */
601 kll = subL[0]; klr = subR[0];
602 krl = subL[1]; krr = subR[1];
603 CAMELLIA_F(kll, klr,
604 CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
605 w0, w1, il, ir, t0, t1);
606 krl ^= w0; krr ^= w1;
607 CAMELLIA_F(krl, krr,
608 CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
609 kll, klr, il, ir, t0, t1);
610 /* current status == (kll, klr, w0, w1) */
611 CAMELLIA_F(kll, klr,
612 CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
613 krl, krr, il, ir, t0, t1);
614 krl ^= w0; krr ^= w1;
615 CAMELLIA_F(krl, krr,
616 CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
617 w0, w1, il, ir, t0, t1);
618 kll ^= w0; klr ^= w1;
619
620 /* generate KA dependent subkeys */
621 /* k1, k2 */
622 subL[2] = kll; subR[2] = klr;
623 subL[3] = krl; subR[3] = krr;
624 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
625 /* k5,k6 */
626 subL[6] = kll; subR[6] = klr;
627 subL[7] = krl; subR[7] = krr;
628 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
629 /* kl1, kl2 */
630 subL[8] = kll; subR[8] = klr;
631 subL[9] = krl; subR[9] = krr;
632 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
633 /* k9 */
634 subL[12] = kll; subR[12] = klr;
635 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
636 /* k11, k12 */
637 subL[14] = kll; subR[14] = klr;
638 subL[15] = krl; subR[15] = krr;
639 ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
640 /* k15, k16 */
641 subL[20] = kll; subR[20] = klr;
642 subL[21] = krl; subR[21] = krr;
643 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
644 /* kw3, kw4 */
645 subL[24] = kll; subR[24] = klr;
646 subL[25] = krl; subR[25] = krr;
647
648 camellia_setup_tail(subkey, subL, subR, 24);
649}
650
651static void camellia_setup256(const unsigned char *key, u32 *subkey)
652{
653 u32 kll, klr, krl, krr; /* left half of key */
654 u32 krll, krlr, krrl, krrr; /* right half of key */
655 u32 il, ir, t0, t1, w0, w1; /* temporary variables */
656 u32 subL[34];
657 u32 subR[34];
658
659 /**
660 * key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
661 * (|| is concatenation)
662 */
663 kll = get_unaligned_be32(key);
664 klr = get_unaligned_be32(key + 4);
665 krl = get_unaligned_be32(key + 8);
666 krr = get_unaligned_be32(key + 12);
667 krll = get_unaligned_be32(key + 16);
668 krlr = get_unaligned_be32(key + 20);
669 krrl = get_unaligned_be32(key + 24);
670 krrr = get_unaligned_be32(key + 28);
671
672 /* generate KL dependent subkeys */
673 /* kw1 */
674 subL[0] = kll; subR[0] = klr;
675 /* kw2 */
676 subL[1] = krl; subR[1] = krr;
677 ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
678 /* k9 */
679 subL[12] = kll; subR[12] = klr;
680 /* k10 */
681 subL[13] = krl; subR[13] = krr;
682 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
683 /* kl3 */
684 subL[16] = kll; subR[16] = klr;
685 /* kl4 */
686 subL[17] = krl; subR[17] = krr;
687 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
688 /* k17 */
689 subL[22] = kll; subR[22] = klr;
690 /* k18 */
691 subL[23] = krl; subR[23] = krr;
692 ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
693 /* k23 */
694 subL[30] = kll; subR[30] = klr;
695 /* k24 */
696 subL[31] = krl; subR[31] = krr;
697
698 /* generate KR dependent subkeys */
699 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
700 /* k3 */
701 subL[4] = krll; subR[4] = krlr;
702 /* k4 */
703 subL[5] = krrl; subR[5] = krrr;
704 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
705 /* kl1 */
706 subL[8] = krll; subR[8] = krlr;
707 /* kl2 */
708 subL[9] = krrl; subR[9] = krrr;
709 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
710 /* k13 */
711 subL[18] = krll; subR[18] = krlr;
712 /* k14 */
713 subL[19] = krrl; subR[19] = krrr;
714 ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
715 /* k19 */
716 subL[26] = krll; subR[26] = krlr;
717 /* k20 */
718 subL[27] = krrl; subR[27] = krrr;
719 ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
720
721 /* generate KA */
722 kll = subL[0] ^ krll; klr = subR[0] ^ krlr;
723 krl = subL[1] ^ krrl; krr = subR[1] ^ krrr;
724 CAMELLIA_F(kll, klr,
725 CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
726 w0, w1, il, ir, t0, t1);
727 krl ^= w0; krr ^= w1;
728 CAMELLIA_F(krl, krr,
729 CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
730 kll, klr, il, ir, t0, t1);
731 kll ^= krll; klr ^= krlr;
732 CAMELLIA_F(kll, klr,
733 CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
734 krl, krr, il, ir, t0, t1);
735 krl ^= w0 ^ krrl; krr ^= w1 ^ krrr;
736 CAMELLIA_F(krl, krr,
737 CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
738 w0, w1, il, ir, t0, t1);
739 kll ^= w0; klr ^= w1;
740
741 /* generate KB */
742 krll ^= kll; krlr ^= klr;
743 krrl ^= krl; krrr ^= krr;
744 CAMELLIA_F(krll, krlr,
745 CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R,
746 w0, w1, il, ir, t0, t1);
747 krrl ^= w0; krrr ^= w1;
748 CAMELLIA_F(krrl, krrr,
749 CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R,
750 w0, w1, il, ir, t0, t1);
751 krll ^= w0; krlr ^= w1;
752
753 /* generate KA dependent subkeys */
754 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
755 /* k5 */
756 subL[6] = kll; subR[6] = klr;
757 /* k6 */
758 subL[7] = krl; subR[7] = krr;
759 ROLDQ(kll, klr, krl, krr, w0, w1, 30);
760 /* k11 */
761 subL[14] = kll; subR[14] = klr;
762 /* k12 */
763 subL[15] = krl; subR[15] = krr;
764 /* rotation left shift 32bit */
765 /* kl5 */
766 subL[24] = klr; subR[24] = krl;
767 /* kl6 */
768 subL[25] = krr; subR[25] = kll;
769 /* rotation left shift 49 from k11,k12 -> k21,k22 */
770 ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
771 /* k21 */
772 subL[28] = kll; subR[28] = klr;
773 /* k22 */
774 subL[29] = krl; subR[29] = krr;
775
776 /* generate KB dependent subkeys */
777 /* k1 */
778 subL[2] = krll; subR[2] = krlr;
779 /* k2 */
780 subL[3] = krrl; subR[3] = krrr;
781 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
782 /* k7 */
783 subL[10] = krll; subR[10] = krlr;
784 /* k8 */
785 subL[11] = krrl; subR[11] = krrr;
786 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
787 /* k15 */
788 subL[20] = krll; subR[20] = krlr;
789 /* k16 */
790 subL[21] = krrl; subR[21] = krrr;
791 ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
792 /* kw3 */
793 subL[32] = krll; subR[32] = krlr;
794 /* kw4 */
795 subL[33] = krrl; subR[33] = krrr;
796
797 camellia_setup_tail(subkey, subL, subR, 32);
798}
799
800static void camellia_setup192(const unsigned char *key, u32 *subkey)
801{
802 unsigned char kk[32];
803 u32 krll, krlr, krrl, krrr;
804
805 memcpy(kk, key, 24);
806 memcpy((unsigned char *)&krll, key+16, 4);
807 memcpy((unsigned char *)&krlr, key+20, 4);
808 krrl = ~krll;
809 krrr = ~krlr;
810 memcpy(kk+24, (unsigned char *)&krrl, 4);
811 memcpy(kk+28, (unsigned char *)&krrr, 4);
812 camellia_setup256(kk, subkey);
813}
814
815
816/*
817 * Encrypt/decrypt
818 */
819#define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) ({ \
820 t0 = kll; \
821 t2 = krr; \
822 t0 &= ll; \
823 t2 |= rr; \
824 rl ^= t2; \
825 lr ^= rol32(t0, 1); \
826 t3 = krl; \
827 t1 = klr; \
828 t3 &= rl; \
829 t1 |= lr; \
830 ll ^= t1; \
831 rr ^= rol32(t3, 1); \
832})
833
834#define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir) ({ \
835 yl ^= kl; \
836 yr ^= kr; \
837 ir = camellia_sp1110[(u8)xr]; \
838 il = camellia_sp1110[(u8)(xl >> 24)]; \
839 ir ^= camellia_sp0222[(u8)(xr >> 24)]; \
840 il ^= camellia_sp0222[(u8)(xl >> 16)]; \
841 ir ^= camellia_sp3033[(u8)(xr >> 16)]; \
842 il ^= camellia_sp3033[(u8)(xl >> 8)]; \
843 ir ^= camellia_sp4404[(u8)(xr >> 8)]; \
844 il ^= camellia_sp4404[(u8)xl]; \
845 ir ^= il; \
846 yl ^= ir; \
847 yr ^= ror32(il, 8) ^ ir; \
848})
849
850/* max = 24: 128bit encrypt, max = 32: 256bit encrypt */
851static void camellia_do_encrypt(const u32 *subkey, u32 *io, unsigned max)
852{
853 u32 il, ir, t0, t1; /* temporary variables */
854
855 /* pre whitening but absorb kw2 */
856 io[0] ^= SUBKEY_L(0);
857 io[1] ^= SUBKEY_R(0);
858
859 /* main iteration */
860#define ROUNDS(i) ({ \
861 CAMELLIA_ROUNDSM(io[0], io[1], \
862 SUBKEY_L(i + 2), SUBKEY_R(i + 2), \
863 io[2], io[3], il, ir); \
864 CAMELLIA_ROUNDSM(io[2], io[3], \
865 SUBKEY_L(i + 3), SUBKEY_R(i + 3), \
866 io[0], io[1], il, ir); \
867 CAMELLIA_ROUNDSM(io[0], io[1], \
868 SUBKEY_L(i + 4), SUBKEY_R(i + 4), \
869 io[2], io[3], il, ir); \
870 CAMELLIA_ROUNDSM(io[2], io[3], \
871 SUBKEY_L(i + 5), SUBKEY_R(i + 5), \
872 io[0], io[1], il, ir); \
873 CAMELLIA_ROUNDSM(io[0], io[1], \
874 SUBKEY_L(i + 6), SUBKEY_R(i + 6), \
875 io[2], io[3], il, ir); \
876 CAMELLIA_ROUNDSM(io[2], io[3], \
877 SUBKEY_L(i + 7), SUBKEY_R(i + 7), \
878 io[0], io[1], il, ir); \
879})
880#define FLS(i) ({ \
881 CAMELLIA_FLS(io[0], io[1], io[2], io[3], \
882 SUBKEY_L(i + 0), SUBKEY_R(i + 0), \
883 SUBKEY_L(i + 1), SUBKEY_R(i + 1), \
884 t0, t1, il, ir); \
885})
886
887 ROUNDS(0);
888 FLS(8);
889 ROUNDS(8);
890 FLS(16);
891 ROUNDS(16);
892 if (max == 32) {
893 FLS(24);
894 ROUNDS(24);
895 }
896
897#undef ROUNDS
898#undef FLS
899
900 /* post whitening but kw4 */
901 io[2] ^= SUBKEY_L(max);
902 io[3] ^= SUBKEY_R(max);
903 /* NB: io[0],[1] should be swapped with [2],[3] by caller! */
904}
905
906static void camellia_do_decrypt(const u32 *subkey, u32 *io, unsigned i)
907{
908 u32 il, ir, t0, t1; /* temporary variables */
909
910 /* pre whitening but absorb kw2 */
911 io[0] ^= SUBKEY_L(i);
912 io[1] ^= SUBKEY_R(i);
913
914 /* main iteration */
915#define ROUNDS(i) ({ \
916 CAMELLIA_ROUNDSM(io[0], io[1], \
917 SUBKEY_L(i + 7), SUBKEY_R(i + 7), \
918 io[2], io[3], il, ir); \
919 CAMELLIA_ROUNDSM(io[2], io[3], \
920 SUBKEY_L(i + 6), SUBKEY_R(i + 6), \
921 io[0], io[1], il, ir); \
922 CAMELLIA_ROUNDSM(io[0], io[1], \
923 SUBKEY_L(i + 5), SUBKEY_R(i + 5), \
924 io[2], io[3], il, ir); \
925 CAMELLIA_ROUNDSM(io[2], io[3], \
926 SUBKEY_L(i + 4), SUBKEY_R(i + 4), \
927 io[0], io[1], il, ir); \
928 CAMELLIA_ROUNDSM(io[0], io[1], \
929 SUBKEY_L(i + 3), SUBKEY_R(i + 3), \
930 io[2], io[3], il, ir); \
931 CAMELLIA_ROUNDSM(io[2], io[3], \
932 SUBKEY_L(i + 2), SUBKEY_R(i + 2), \
933 io[0], io[1], il, ir); \
934})
935#define FLS(i) ({ \
936 CAMELLIA_FLS(io[0], io[1], io[2], io[3], \
937 SUBKEY_L(i + 1), SUBKEY_R(i + 1), \
938 SUBKEY_L(i + 0), SUBKEY_R(i + 0), \
939 t0, t1, il, ir); \
940})
941
942 if (i == 32) {
943 ROUNDS(24);
944 FLS(24);
945 }
946 ROUNDS(16);
947 FLS(16);
948 ROUNDS(8);
949 FLS(8);
950 ROUNDS(0);
951
952#undef ROUNDS
953#undef FLS
954
955 /* post whitening but kw4 */
956 io[2] ^= SUBKEY_L(0);
957 io[3] ^= SUBKEY_R(0);
958 /* NB: 0,1 should be swapped with 2,3 by caller! */
959}
960
961
962struct camellia_ctx {
963 int key_length;
964 u32 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u32)];
965};
966
967static int
968camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key,
969 unsigned int key_len)
970{
971 struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
972 const unsigned char *key = (const unsigned char *)in_key;
973
974 if (key_len != 16 && key_len != 24 && key_len != 32)
975 return -EINVAL;
976
977 cctx->key_length = key_len;
978
979 switch (key_len) {
980 case 16:
981 camellia_setup128(key, cctx->key_table);
982 break;
983 case 24:
984 camellia_setup192(key, cctx->key_table);
985 break;
986 case 32:
987 camellia_setup256(key, cctx->key_table);
988 break;
989 }
990
991 return 0;
992}
993
994static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
995{
996 const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
997 const __be32 *src = (const __be32 *)in;
998 __be32 *dst = (__be32 *)out;
999 unsigned int max;
1000
1001 u32 tmp[4];
1002
1003 tmp[0] = be32_to_cpu(src[0]);
1004 tmp[1] = be32_to_cpu(src[1]);
1005 tmp[2] = be32_to_cpu(src[2]);
1006 tmp[3] = be32_to_cpu(src[3]);
1007
1008 if (cctx->key_length == 16)
1009 max = 24;
1010 else
1011 max = 32; /* for key lengths of 24 and 32 */
1012
1013 camellia_do_encrypt(cctx->key_table, tmp, max);
1014
1015 /* do_encrypt returns 0,1 swapped with 2,3 */
1016 dst[0] = cpu_to_be32(tmp[2]);
1017 dst[1] = cpu_to_be32(tmp[3]);
1018 dst[2] = cpu_to_be32(tmp[0]);
1019 dst[3] = cpu_to_be32(tmp[1]);
1020}
1021
1022static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1023{
1024 const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1025 const __be32 *src = (const __be32 *)in;
1026 __be32 *dst = (__be32 *)out;
1027 unsigned int max;
1028
1029 u32 tmp[4];
1030
1031 tmp[0] = be32_to_cpu(src[0]);
1032 tmp[1] = be32_to_cpu(src[1]);
1033 tmp[2] = be32_to_cpu(src[2]);
1034 tmp[3] = be32_to_cpu(src[3]);
1035
1036 if (cctx->key_length == 16)
1037 max = 24;
1038 else
1039 max = 32; /* for key lengths of 24 and 32 */
1040
1041 camellia_do_decrypt(cctx->key_table, tmp, max);
1042
1043 /* do_decrypt returns 0,1 swapped with 2,3 */
1044 dst[0] = cpu_to_be32(tmp[2]);
1045 dst[1] = cpu_to_be32(tmp[3]);
1046 dst[2] = cpu_to_be32(tmp[0]);
1047 dst[3] = cpu_to_be32(tmp[1]);
1048}
1049
1050static struct crypto_alg camellia_alg = {
1051 .cra_name = "camellia",
1052 .cra_driver_name = "camellia-generic",
1053 .cra_priority = 100,
1054 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
1055 .cra_blocksize = CAMELLIA_BLOCK_SIZE,
1056 .cra_ctxsize = sizeof(struct camellia_ctx),
1057 .cra_alignmask = 3,
1058 .cra_module = THIS_MODULE,
1059 .cra_u = {
1060 .cipher = {
1061 .cia_min_keysize = CAMELLIA_MIN_KEY_SIZE,
1062 .cia_max_keysize = CAMELLIA_MAX_KEY_SIZE,
1063 .cia_setkey = camellia_set_key,
1064 .cia_encrypt = camellia_encrypt,
1065 .cia_decrypt = camellia_decrypt
1066 }
1067 }
1068};
1069
1070static int __init camellia_init(void)
1071{
1072 return crypto_register_alg(&camellia_alg);
1073}
1074
1075static void __exit camellia_fini(void)
1076{
1077 crypto_unregister_alg(&camellia_alg);
1078}
1079
1080subsys_initcall(camellia_init);
1081module_exit(camellia_fini);
1082
1083MODULE_DESCRIPTION("Camellia Cipher Algorithm");
1084MODULE_LICENSE("GPL");
1085MODULE_ALIAS_CRYPTO("camellia");
1086MODULE_ALIAS_CRYPTO("camellia-generic");
1/*
2 * Copyright (C) 2006
3 * NTT (Nippon Telegraph and Telephone Corporation).
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19/*
20 * Algorithm Specification
21 * http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
22 */
23
24/*
25 *
26 * NOTE --- NOTE --- NOTE --- NOTE
27 * This implementation assumes that all memory addresses passed
28 * as parameters are four-byte aligned.
29 *
30 */
31
32#include <linux/crypto.h>
33#include <linux/errno.h>
34#include <linux/init.h>
35#include <linux/kernel.h>
36#include <linux/module.h>
37#include <linux/bitops.h>
38#include <asm/unaligned.h>
39
40static const u32 camellia_sp1110[256] = {
41 0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00,
42 0xb3b3b300, 0x27272700, 0xc0c0c000, 0xe5e5e500,
43 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
44 0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100,
45 0x23232300, 0xefefef00, 0x6b6b6b00, 0x93939300,
46 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
47 0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00,
48 0x1d1d1d00, 0x65656500, 0x92929200, 0xbdbdbd00,
49 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
50 0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00,
51 0x3e3e3e00, 0x30303000, 0xdcdcdc00, 0x5f5f5f00,
52 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
53 0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00,
54 0xd5d5d500, 0x47474700, 0x5d5d5d00, 0x3d3d3d00,
55 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
56 0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00,
57 0x8b8b8b00, 0x0d0d0d00, 0x9a9a9a00, 0x66666600,
58 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
59 0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000,
60 0xf0f0f000, 0xb1b1b100, 0x84848400, 0x99999900,
61 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
62 0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500,
63 0x6d6d6d00, 0xb7b7b700, 0xa9a9a900, 0x31313100,
64 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
65 0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100,
66 0xdedede00, 0x1b1b1b00, 0x11111100, 0x1c1c1c00,
67 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
68 0x53535300, 0x18181800, 0xf2f2f200, 0x22222200,
69 0xfefefe00, 0x44444400, 0xcfcfcf00, 0xb2b2b200,
70 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
71 0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800,
72 0x60606000, 0xfcfcfc00, 0x69696900, 0x50505000,
73 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
74 0xa1a1a100, 0x89898900, 0x62626200, 0x97979700,
75 0x54545400, 0x5b5b5b00, 0x1e1e1e00, 0x95959500,
76 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
77 0x10101000, 0xc4c4c400, 0x00000000, 0x48484800,
78 0xa3a3a300, 0xf7f7f700, 0x75757500, 0xdbdbdb00,
79 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
80 0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400,
81 0x87878700, 0x5c5c5c00, 0x83838300, 0x02020200,
82 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
83 0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300,
84 0x9d9d9d00, 0x7f7f7f00, 0xbfbfbf00, 0xe2e2e200,
85 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
86 0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00,
87 0x81818100, 0x96969600, 0x6f6f6f00, 0x4b4b4b00,
88 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
89 0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00,
90 0x9f9f9f00, 0x6e6e6e00, 0xbcbcbc00, 0x8e8e8e00,
91 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
92 0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900,
93 0x78787800, 0x98989800, 0x06060600, 0x6a6a6a00,
94 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
95 0xd4d4d400, 0x25252500, 0xababab00, 0x42424200,
96 0x88888800, 0xa2a2a200, 0x8d8d8d00, 0xfafafa00,
97 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
98 0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00,
99 0x36363600, 0x49494900, 0x2a2a2a00, 0x68686800,
100 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
101 0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00,
102 0xbbbbbb00, 0xc9c9c900, 0x43434300, 0xc1c1c100,
103 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
104 0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00,
105};
106
107static const u32 camellia_sp0222[256] = {
108 0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9,
109 0x00676767, 0x004e4e4e, 0x00818181, 0x00cbcbcb,
110 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
111 0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282,
112 0x00464646, 0x00dfdfdf, 0x00d6d6d6, 0x00272727,
113 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
114 0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c,
115 0x003a3a3a, 0x00cacaca, 0x00252525, 0x007b7b7b,
116 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
117 0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d,
118 0x007c7c7c, 0x00606060, 0x00b9b9b9, 0x00bebebe,
119 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
120 0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595,
121 0x00ababab, 0x008e8e8e, 0x00bababa, 0x007a7a7a,
122 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
123 0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a,
124 0x00171717, 0x001a1a1a, 0x00353535, 0x00cccccc,
125 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
126 0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040,
127 0x00e1e1e1, 0x00636363, 0x00090909, 0x00333333,
128 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
129 0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a,
130 0x00dadada, 0x006f6f6f, 0x00535353, 0x00626262,
131 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
132 0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2,
133 0x00bdbdbd, 0x00363636, 0x00222222, 0x00383838,
134 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
135 0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444,
136 0x00fdfdfd, 0x00888888, 0x009f9f9f, 0x00656565,
137 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
138 0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151,
139 0x00c0c0c0, 0x00f9f9f9, 0x00d2d2d2, 0x00a0a0a0,
140 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
141 0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f,
142 0x00a8a8a8, 0x00b6b6b6, 0x003c3c3c, 0x002b2b2b,
143 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
144 0x00202020, 0x00898989, 0x00000000, 0x00909090,
145 0x00474747, 0x00efefef, 0x00eaeaea, 0x00b7b7b7,
146 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
147 0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929,
148 0x000f0f0f, 0x00b8b8b8, 0x00070707, 0x00040404,
149 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
150 0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7,
151 0x003b3b3b, 0x00fefefe, 0x007f7f7f, 0x00c5c5c5,
152 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
153 0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676,
154 0x00030303, 0x002d2d2d, 0x00dedede, 0x00969696,
155 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
156 0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919,
157 0x003f3f3f, 0x00dcdcdc, 0x00797979, 0x001d1d1d,
158 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
159 0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2,
160 0x00f0f0f0, 0x00313131, 0x000c0c0c, 0x00d4d4d4,
161 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
162 0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484,
163 0x00111111, 0x00454545, 0x001b1b1b, 0x00f5f5f5,
164 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
165 0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414,
166 0x006c6c6c, 0x00929292, 0x00545454, 0x00d0d0d0,
167 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
168 0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6,
169 0x00777777, 0x00939393, 0x00868686, 0x00838383,
170 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
171 0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d,
172};
173
174static const u32 camellia_sp3033[256] = {
175 0x38003838, 0x41004141, 0x16001616, 0x76007676,
176 0xd900d9d9, 0x93009393, 0x60006060, 0xf200f2f2,
177 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
178 0x75007575, 0x06000606, 0x57005757, 0xa000a0a0,
179 0x91009191, 0xf700f7f7, 0xb500b5b5, 0xc900c9c9,
180 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
181 0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727,
182 0x8e008e8e, 0xb200b2b2, 0x49004949, 0xde00dede,
183 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
184 0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767,
185 0x1f001f1f, 0x18001818, 0x6e006e6e, 0xaf00afaf,
186 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
187 0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565,
188 0xea00eaea, 0xa300a3a3, 0xae00aeae, 0x9e009e9e,
189 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
190 0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6,
191 0xc500c5c5, 0x86008686, 0x4d004d4d, 0x33003333,
192 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
193 0x3a003a3a, 0x09000909, 0x95009595, 0x10001010,
194 0x78007878, 0xd800d8d8, 0x42004242, 0xcc00cccc,
195 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
196 0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282,
197 0xb600b6b6, 0xdb00dbdb, 0xd400d4d4, 0x98009898,
198 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
199 0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0,
200 0x6f006f6f, 0x8d008d8d, 0x88008888, 0x0e000e0e,
201 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
202 0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111,
203 0x7f007f7f, 0x22002222, 0xe700e7e7, 0x59005959,
204 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
205 0x12001212, 0x04000404, 0x74007474, 0x54005454,
206 0x30003030, 0x7e007e7e, 0xb400b4b4, 0x28002828,
207 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
208 0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb,
209 0x2a002a2a, 0xad00adad, 0x0f000f0f, 0xca00caca,
210 0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
211 0x08000808, 0x62006262, 0x00000000, 0x24002424,
212 0xd100d1d1, 0xfb00fbfb, 0xba00baba, 0xed00eded,
213 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
214 0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a,
215 0xc300c3c3, 0x2e002e2e, 0xc100c1c1, 0x01000101,
216 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
217 0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9,
218 0xce00cece, 0xbf00bfbf, 0xdf00dfdf, 0x71007171,
219 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
220 0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d,
221 0xc000c0c0, 0x4b004b4b, 0xb700b7b7, 0xa500a5a5,
222 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
223 0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646,
224 0xcf00cfcf, 0x37003737, 0x5e005e5e, 0x47004747,
225 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
226 0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac,
227 0x3c003c3c, 0x4c004c4c, 0x03000303, 0x35003535,
228 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
229 0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121,
230 0x44004444, 0x51005151, 0xc600c6c6, 0x7d007d7d,
231 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
232 0x7c007c7c, 0x77007777, 0x56005656, 0x05000505,
233 0x1b001b1b, 0xa400a4a4, 0x15001515, 0x34003434,
234 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
235 0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd,
236 0xdd00dddd, 0xe400e4e4, 0xa100a1a1, 0xe000e0e0,
237 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
238 0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f,
239};
240
241static const u32 camellia_sp4404[256] = {
242 0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0,
243 0xe4e400e4, 0x57570057, 0xeaea00ea, 0xaeae00ae,
244 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
245 0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092,
246 0x86860086, 0xafaf00af, 0x7c7c007c, 0x1f1f001f,
247 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
248 0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d,
249 0xd9d900d9, 0x5a5a005a, 0x51510051, 0x6c6c006c,
250 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
251 0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084,
252 0xdfdf00df, 0xcbcb00cb, 0x34340034, 0x76760076,
253 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
254 0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011,
255 0x32320032, 0x9c9c009c, 0x53530053, 0xf2f200f2,
256 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
257 0x24240024, 0xe8e800e8, 0x60600060, 0x69690069,
258 0xaaaa00aa, 0xa0a000a0, 0xa1a100a1, 0x62620062,
259 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
260 0x10100010, 0x00000000, 0xa3a300a3, 0x75750075,
261 0x8a8a008a, 0xe6e600e6, 0x09090009, 0xdddd00dd,
262 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
263 0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf,
264 0x52520052, 0xd8d800d8, 0xc8c800c8, 0xc6c600c6,
265 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
266 0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc,
267 0x29290029, 0xf9f900f9, 0x2f2f002f, 0xb4b400b4,
268 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
269 0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d,
270 0x72720072, 0xb9b900b9, 0xf8f800f8, 0xacac00ac,
271 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
272 0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043,
273 0x15150015, 0xadad00ad, 0x77770077, 0x80800080,
274 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
275 0x85850085, 0x35350035, 0x0c0c000c, 0x41410041,
276 0xefef00ef, 0x93930093, 0x19190019, 0x21210021,
277 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
278 0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce,
279 0x30300030, 0x5f5f005f, 0xc5c500c5, 0x1a1a001a,
280 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
281 0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d,
282 0x0d0d000d, 0x66660066, 0xcccc00cc, 0x2d2d002d,
283 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
284 0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005,
285 0xb7b700b7, 0x31310031, 0x17170017, 0xd7d700d7,
286 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
287 0x0f0f000f, 0x16160016, 0x18180018, 0x22220022,
288 0x44440044, 0xb2b200b2, 0xb5b500b5, 0x91910091,
289 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
290 0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097,
291 0x5b5b005b, 0x95950095, 0xffff00ff, 0xd2d200d2,
292 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
293 0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094,
294 0x5c5c005c, 0x02020002, 0x4a4a004a, 0x33330033,
295 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
296 0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b,
297 0x96960096, 0x4b4b004b, 0xbebe00be, 0x2e2e002e,
298 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
299 0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059,
300 0x98980098, 0x6a6a006a, 0x46460046, 0xbaba00ba,
301 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
302 0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a,
303 0x49490049, 0x68680068, 0x38380038, 0xa4a400a4,
304 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
305 0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e,
306};
307
308
309#define CAMELLIA_MIN_KEY_SIZE 16
310#define CAMELLIA_MAX_KEY_SIZE 32
311#define CAMELLIA_BLOCK_SIZE 16
312#define CAMELLIA_TABLE_BYTE_LEN 272
313
314/*
315 * NB: L and R below stand for 'left' and 'right' as in written numbers.
316 * That is, in (xxxL,xxxR) pair xxxL holds most significant digits,
317 * _not_ least significant ones!
318 */
319
320
321/* key constants */
322
323#define CAMELLIA_SIGMA1L (0xA09E667FL)
324#define CAMELLIA_SIGMA1R (0x3BCC908BL)
325#define CAMELLIA_SIGMA2L (0xB67AE858L)
326#define CAMELLIA_SIGMA2R (0x4CAA73B2L)
327#define CAMELLIA_SIGMA3L (0xC6EF372FL)
328#define CAMELLIA_SIGMA3R (0xE94F82BEL)
329#define CAMELLIA_SIGMA4L (0x54FF53A5L)
330#define CAMELLIA_SIGMA4R (0xF1D36F1CL)
331#define CAMELLIA_SIGMA5L (0x10E527FAL)
332#define CAMELLIA_SIGMA5R (0xDE682D1DL)
333#define CAMELLIA_SIGMA6L (0xB05688C2L)
334#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
335
336/*
337 * macros
338 */
339#define ROLDQ(ll, lr, rl, rr, w0, w1, bits) ({ \
340 w0 = ll; \
341 ll = (ll << bits) + (lr >> (32 - bits)); \
342 lr = (lr << bits) + (rl >> (32 - bits)); \
343 rl = (rl << bits) + (rr >> (32 - bits)); \
344 rr = (rr << bits) + (w0 >> (32 - bits)); \
345})
346
347#define ROLDQo32(ll, lr, rl, rr, w0, w1, bits) ({ \
348 w0 = ll; \
349 w1 = lr; \
350 ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \
351 lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \
352 rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \
353 rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \
354})
355
356#define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) ({ \
357 il = xl ^ kl; \
358 ir = xr ^ kr; \
359 t0 = il >> 16; \
360 t1 = ir >> 16; \
361 yl = camellia_sp1110[(u8)(ir)] \
362 ^ camellia_sp0222[(u8)(t1 >> 8)] \
363 ^ camellia_sp3033[(u8)(t1)] \
364 ^ camellia_sp4404[(u8)(ir >> 8)]; \
365 yr = camellia_sp1110[(u8)(t0 >> 8)] \
366 ^ camellia_sp0222[(u8)(t0)] \
367 ^ camellia_sp3033[(u8)(il >> 8)] \
368 ^ camellia_sp4404[(u8)(il)]; \
369 yl ^= yr; \
370 yr = ror32(yr, 8); \
371 yr ^= yl; \
372})
373
374#define SUBKEY_L(INDEX) (subkey[(INDEX)*2])
375#define SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1])
376
377static void camellia_setup_tail(u32 *subkey, u32 *subL, u32 *subR, int max)
378{
379 u32 dw, tl, tr;
380 u32 kw4l, kw4r;
381
382 /* absorb kw2 to other subkeys */
383 /* round 2 */
384 subL[3] ^= subL[1]; subR[3] ^= subR[1];
385 /* round 4 */
386 subL[5] ^= subL[1]; subR[5] ^= subR[1];
387 /* round 6 */
388 subL[7] ^= subL[1]; subR[7] ^= subR[1];
389 subL[1] ^= subR[1] & ~subR[9];
390 dw = subL[1] & subL[9];
391 subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl2) */
392 /* round 8 */
393 subL[11] ^= subL[1]; subR[11] ^= subR[1];
394 /* round 10 */
395 subL[13] ^= subL[1]; subR[13] ^= subR[1];
396 /* round 12 */
397 subL[15] ^= subL[1]; subR[15] ^= subR[1];
398 subL[1] ^= subR[1] & ~subR[17];
399 dw = subL[1] & subL[17];
400 subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl4) */
401 /* round 14 */
402 subL[19] ^= subL[1]; subR[19] ^= subR[1];
403 /* round 16 */
404 subL[21] ^= subL[1]; subR[21] ^= subR[1];
405 /* round 18 */
406 subL[23] ^= subL[1]; subR[23] ^= subR[1];
407 if (max == 24) {
408 /* kw3 */
409 subL[24] ^= subL[1]; subR[24] ^= subR[1];
410
411 /* absorb kw4 to other subkeys */
412 kw4l = subL[25]; kw4r = subR[25];
413 } else {
414 subL[1] ^= subR[1] & ~subR[25];
415 dw = subL[1] & subL[25];
416 subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl6) */
417 /* round 20 */
418 subL[27] ^= subL[1]; subR[27] ^= subR[1];
419 /* round 22 */
420 subL[29] ^= subL[1]; subR[29] ^= subR[1];
421 /* round 24 */
422 subL[31] ^= subL[1]; subR[31] ^= subR[1];
423 /* kw3 */
424 subL[32] ^= subL[1]; subR[32] ^= subR[1];
425
426 /* absorb kw4 to other subkeys */
427 kw4l = subL[33]; kw4r = subR[33];
428 /* round 23 */
429 subL[30] ^= kw4l; subR[30] ^= kw4r;
430 /* round 21 */
431 subL[28] ^= kw4l; subR[28] ^= kw4r;
432 /* round 19 */
433 subL[26] ^= kw4l; subR[26] ^= kw4r;
434 kw4l ^= kw4r & ~subR[24];
435 dw = kw4l & subL[24];
436 kw4r ^= rol32(dw, 1); /* modified for FL(kl5) */
437 }
438 /* round 17 */
439 subL[22] ^= kw4l; subR[22] ^= kw4r;
440 /* round 15 */
441 subL[20] ^= kw4l; subR[20] ^= kw4r;
442 /* round 13 */
443 subL[18] ^= kw4l; subR[18] ^= kw4r;
444 kw4l ^= kw4r & ~subR[16];
445 dw = kw4l & subL[16];
446 kw4r ^= rol32(dw, 1); /* modified for FL(kl3) */
447 /* round 11 */
448 subL[14] ^= kw4l; subR[14] ^= kw4r;
449 /* round 9 */
450 subL[12] ^= kw4l; subR[12] ^= kw4r;
451 /* round 7 */
452 subL[10] ^= kw4l; subR[10] ^= kw4r;
453 kw4l ^= kw4r & ~subR[8];
454 dw = kw4l & subL[8];
455 kw4r ^= rol32(dw, 1); /* modified for FL(kl1) */
456 /* round 5 */
457 subL[6] ^= kw4l; subR[6] ^= kw4r;
458 /* round 3 */
459 subL[4] ^= kw4l; subR[4] ^= kw4r;
460 /* round 1 */
461 subL[2] ^= kw4l; subR[2] ^= kw4r;
462 /* kw1 */
463 subL[0] ^= kw4l; subR[0] ^= kw4r;
464
465 /* key XOR is end of F-function */
466 SUBKEY_L(0) = subL[0] ^ subL[2];/* kw1 */
467 SUBKEY_R(0) = subR[0] ^ subR[2];
468 SUBKEY_L(2) = subL[3]; /* round 1 */
469 SUBKEY_R(2) = subR[3];
470 SUBKEY_L(3) = subL[2] ^ subL[4]; /* round 2 */
471 SUBKEY_R(3) = subR[2] ^ subR[4];
472 SUBKEY_L(4) = subL[3] ^ subL[5]; /* round 3 */
473 SUBKEY_R(4) = subR[3] ^ subR[5];
474 SUBKEY_L(5) = subL[4] ^ subL[6]; /* round 4 */
475 SUBKEY_R(5) = subR[4] ^ subR[6];
476 SUBKEY_L(6) = subL[5] ^ subL[7]; /* round 5 */
477 SUBKEY_R(6) = subR[5] ^ subR[7];
478 tl = subL[10] ^ (subR[10] & ~subR[8]);
479 dw = tl & subL[8]; /* FL(kl1) */
480 tr = subR[10] ^ rol32(dw, 1);
481 SUBKEY_L(7) = subL[6] ^ tl; /* round 6 */
482 SUBKEY_R(7) = subR[6] ^ tr;
483 SUBKEY_L(8) = subL[8]; /* FL(kl1) */
484 SUBKEY_R(8) = subR[8];
485 SUBKEY_L(9) = subL[9]; /* FLinv(kl2) */
486 SUBKEY_R(9) = subR[9];
487 tl = subL[7] ^ (subR[7] & ~subR[9]);
488 dw = tl & subL[9]; /* FLinv(kl2) */
489 tr = subR[7] ^ rol32(dw, 1);
490 SUBKEY_L(10) = tl ^ subL[11]; /* round 7 */
491 SUBKEY_R(10) = tr ^ subR[11];
492 SUBKEY_L(11) = subL[10] ^ subL[12]; /* round 8 */
493 SUBKEY_R(11) = subR[10] ^ subR[12];
494 SUBKEY_L(12) = subL[11] ^ subL[13]; /* round 9 */
495 SUBKEY_R(12) = subR[11] ^ subR[13];
496 SUBKEY_L(13) = subL[12] ^ subL[14]; /* round 10 */
497 SUBKEY_R(13) = subR[12] ^ subR[14];
498 SUBKEY_L(14) = subL[13] ^ subL[15]; /* round 11 */
499 SUBKEY_R(14) = subR[13] ^ subR[15];
500 tl = subL[18] ^ (subR[18] & ~subR[16]);
501 dw = tl & subL[16]; /* FL(kl3) */
502 tr = subR[18] ^ rol32(dw, 1);
503 SUBKEY_L(15) = subL[14] ^ tl; /* round 12 */
504 SUBKEY_R(15) = subR[14] ^ tr;
505 SUBKEY_L(16) = subL[16]; /* FL(kl3) */
506 SUBKEY_R(16) = subR[16];
507 SUBKEY_L(17) = subL[17]; /* FLinv(kl4) */
508 SUBKEY_R(17) = subR[17];
509 tl = subL[15] ^ (subR[15] & ~subR[17]);
510 dw = tl & subL[17]; /* FLinv(kl4) */
511 tr = subR[15] ^ rol32(dw, 1);
512 SUBKEY_L(18) = tl ^ subL[19]; /* round 13 */
513 SUBKEY_R(18) = tr ^ subR[19];
514 SUBKEY_L(19) = subL[18] ^ subL[20]; /* round 14 */
515 SUBKEY_R(19) = subR[18] ^ subR[20];
516 SUBKEY_L(20) = subL[19] ^ subL[21]; /* round 15 */
517 SUBKEY_R(20) = subR[19] ^ subR[21];
518 SUBKEY_L(21) = subL[20] ^ subL[22]; /* round 16 */
519 SUBKEY_R(21) = subR[20] ^ subR[22];
520 SUBKEY_L(22) = subL[21] ^ subL[23]; /* round 17 */
521 SUBKEY_R(22) = subR[21] ^ subR[23];
522 if (max == 24) {
523 SUBKEY_L(23) = subL[22]; /* round 18 */
524 SUBKEY_R(23) = subR[22];
525 SUBKEY_L(24) = subL[24] ^ subL[23]; /* kw3 */
526 SUBKEY_R(24) = subR[24] ^ subR[23];
527 } else {
528 tl = subL[26] ^ (subR[26] & ~subR[24]);
529 dw = tl & subL[24]; /* FL(kl5) */
530 tr = subR[26] ^ rol32(dw, 1);
531 SUBKEY_L(23) = subL[22] ^ tl; /* round 18 */
532 SUBKEY_R(23) = subR[22] ^ tr;
533 SUBKEY_L(24) = subL[24]; /* FL(kl5) */
534 SUBKEY_R(24) = subR[24];
535 SUBKEY_L(25) = subL[25]; /* FLinv(kl6) */
536 SUBKEY_R(25) = subR[25];
537 tl = subL[23] ^ (subR[23] & ~subR[25]);
538 dw = tl & subL[25]; /* FLinv(kl6) */
539 tr = subR[23] ^ rol32(dw, 1);
540 SUBKEY_L(26) = tl ^ subL[27]; /* round 19 */
541 SUBKEY_R(26) = tr ^ subR[27];
542 SUBKEY_L(27) = subL[26] ^ subL[28]; /* round 20 */
543 SUBKEY_R(27) = subR[26] ^ subR[28];
544 SUBKEY_L(28) = subL[27] ^ subL[29]; /* round 21 */
545 SUBKEY_R(28) = subR[27] ^ subR[29];
546 SUBKEY_L(29) = subL[28] ^ subL[30]; /* round 22 */
547 SUBKEY_R(29) = subR[28] ^ subR[30];
548 SUBKEY_L(30) = subL[29] ^ subL[31]; /* round 23 */
549 SUBKEY_R(30) = subR[29] ^ subR[31];
550 SUBKEY_L(31) = subL[30]; /* round 24 */
551 SUBKEY_R(31) = subR[30];
552 SUBKEY_L(32) = subL[32] ^ subL[31]; /* kw3 */
553 SUBKEY_R(32) = subR[32] ^ subR[31];
554 }
555}
556
557static void camellia_setup128(const unsigned char *key, u32 *subkey)
558{
559 u32 kll, klr, krl, krr;
560 u32 il, ir, t0, t1, w0, w1;
561 u32 subL[26];
562 u32 subR[26];
563
564 /**
565 * k == kll || klr || krl || krr (|| is concatenation)
566 */
567 kll = get_unaligned_be32(key);
568 klr = get_unaligned_be32(key + 4);
569 krl = get_unaligned_be32(key + 8);
570 krr = get_unaligned_be32(key + 12);
571
572 /* generate KL dependent subkeys */
573 /* kw1 */
574 subL[0] = kll; subR[0] = klr;
575 /* kw2 */
576 subL[1] = krl; subR[1] = krr;
577 /* rotation left shift 15bit */
578 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
579 /* k3 */
580 subL[4] = kll; subR[4] = klr;
581 /* k4 */
582 subL[5] = krl; subR[5] = krr;
583 /* rotation left shift 15+30bit */
584 ROLDQ(kll, klr, krl, krr, w0, w1, 30);
585 /* k7 */
586 subL[10] = kll; subR[10] = klr;
587 /* k8 */
588 subL[11] = krl; subR[11] = krr;
589 /* rotation left shift 15+30+15bit */
590 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
591 /* k10 */
592 subL[13] = krl; subR[13] = krr;
593 /* rotation left shift 15+30+15+17 bit */
594 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
595 /* kl3 */
596 subL[16] = kll; subR[16] = klr;
597 /* kl4 */
598 subL[17] = krl; subR[17] = krr;
599 /* rotation left shift 15+30+15+17+17 bit */
600 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
601 /* k13 */
602 subL[18] = kll; subR[18] = klr;
603 /* k14 */
604 subL[19] = krl; subR[19] = krr;
605 /* rotation left shift 15+30+15+17+17+17 bit */
606 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
607 /* k17 */
608 subL[22] = kll; subR[22] = klr;
609 /* k18 */
610 subL[23] = krl; subR[23] = krr;
611
612 /* generate KA */
613 kll = subL[0]; klr = subR[0];
614 krl = subL[1]; krr = subR[1];
615 CAMELLIA_F(kll, klr,
616 CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
617 w0, w1, il, ir, t0, t1);
618 krl ^= w0; krr ^= w1;
619 CAMELLIA_F(krl, krr,
620 CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
621 kll, klr, il, ir, t0, t1);
622 /* current status == (kll, klr, w0, w1) */
623 CAMELLIA_F(kll, klr,
624 CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
625 krl, krr, il, ir, t0, t1);
626 krl ^= w0; krr ^= w1;
627 CAMELLIA_F(krl, krr,
628 CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
629 w0, w1, il, ir, t0, t1);
630 kll ^= w0; klr ^= w1;
631
632 /* generate KA dependent subkeys */
633 /* k1, k2 */
634 subL[2] = kll; subR[2] = klr;
635 subL[3] = krl; subR[3] = krr;
636 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
637 /* k5,k6 */
638 subL[6] = kll; subR[6] = klr;
639 subL[7] = krl; subR[7] = krr;
640 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
641 /* kl1, kl2 */
642 subL[8] = kll; subR[8] = klr;
643 subL[9] = krl; subR[9] = krr;
644 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
645 /* k9 */
646 subL[12] = kll; subR[12] = klr;
647 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
648 /* k11, k12 */
649 subL[14] = kll; subR[14] = klr;
650 subL[15] = krl; subR[15] = krr;
651 ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
652 /* k15, k16 */
653 subL[20] = kll; subR[20] = klr;
654 subL[21] = krl; subR[21] = krr;
655 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
656 /* kw3, kw4 */
657 subL[24] = kll; subR[24] = klr;
658 subL[25] = krl; subR[25] = krr;
659
660 camellia_setup_tail(subkey, subL, subR, 24);
661}
662
663static void camellia_setup256(const unsigned char *key, u32 *subkey)
664{
665 u32 kll, klr, krl, krr; /* left half of key */
666 u32 krll, krlr, krrl, krrr; /* right half of key */
667 u32 il, ir, t0, t1, w0, w1; /* temporary variables */
668 u32 subL[34];
669 u32 subR[34];
670
671 /**
672 * key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
673 * (|| is concatenation)
674 */
675 kll = get_unaligned_be32(key);
676 klr = get_unaligned_be32(key + 4);
677 krl = get_unaligned_be32(key + 8);
678 krr = get_unaligned_be32(key + 12);
679 krll = get_unaligned_be32(key + 16);
680 krlr = get_unaligned_be32(key + 20);
681 krrl = get_unaligned_be32(key + 24);
682 krrr = get_unaligned_be32(key + 28);
683
684 /* generate KL dependent subkeys */
685 /* kw1 */
686 subL[0] = kll; subR[0] = klr;
687 /* kw2 */
688 subL[1] = krl; subR[1] = krr;
689 ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
690 /* k9 */
691 subL[12] = kll; subR[12] = klr;
692 /* k10 */
693 subL[13] = krl; subR[13] = krr;
694 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
695 /* kl3 */
696 subL[16] = kll; subR[16] = klr;
697 /* kl4 */
698 subL[17] = krl; subR[17] = krr;
699 ROLDQ(kll, klr, krl, krr, w0, w1, 17);
700 /* k17 */
701 subL[22] = kll; subR[22] = klr;
702 /* k18 */
703 subL[23] = krl; subR[23] = krr;
704 ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
705 /* k23 */
706 subL[30] = kll; subR[30] = klr;
707 /* k24 */
708 subL[31] = krl; subR[31] = krr;
709
710 /* generate KR dependent subkeys */
711 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
712 /* k3 */
713 subL[4] = krll; subR[4] = krlr;
714 /* k4 */
715 subL[5] = krrl; subR[5] = krrr;
716 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
717 /* kl1 */
718 subL[8] = krll; subR[8] = krlr;
719 /* kl2 */
720 subL[9] = krrl; subR[9] = krrr;
721 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
722 /* k13 */
723 subL[18] = krll; subR[18] = krlr;
724 /* k14 */
725 subL[19] = krrl; subR[19] = krrr;
726 ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
727 /* k19 */
728 subL[26] = krll; subR[26] = krlr;
729 /* k20 */
730 subL[27] = krrl; subR[27] = krrr;
731 ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
732
733 /* generate KA */
734 kll = subL[0] ^ krll; klr = subR[0] ^ krlr;
735 krl = subL[1] ^ krrl; krr = subR[1] ^ krrr;
736 CAMELLIA_F(kll, klr,
737 CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
738 w0, w1, il, ir, t0, t1);
739 krl ^= w0; krr ^= w1;
740 CAMELLIA_F(krl, krr,
741 CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
742 kll, klr, il, ir, t0, t1);
743 kll ^= krll; klr ^= krlr;
744 CAMELLIA_F(kll, klr,
745 CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
746 krl, krr, il, ir, t0, t1);
747 krl ^= w0 ^ krrl; krr ^= w1 ^ krrr;
748 CAMELLIA_F(krl, krr,
749 CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
750 w0, w1, il, ir, t0, t1);
751 kll ^= w0; klr ^= w1;
752
753 /* generate KB */
754 krll ^= kll; krlr ^= klr;
755 krrl ^= krl; krrr ^= krr;
756 CAMELLIA_F(krll, krlr,
757 CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R,
758 w0, w1, il, ir, t0, t1);
759 krrl ^= w0; krrr ^= w1;
760 CAMELLIA_F(krrl, krrr,
761 CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R,
762 w0, w1, il, ir, t0, t1);
763 krll ^= w0; krlr ^= w1;
764
765 /* generate KA dependent subkeys */
766 ROLDQ(kll, klr, krl, krr, w0, w1, 15);
767 /* k5 */
768 subL[6] = kll; subR[6] = klr;
769 /* k6 */
770 subL[7] = krl; subR[7] = krr;
771 ROLDQ(kll, klr, krl, krr, w0, w1, 30);
772 /* k11 */
773 subL[14] = kll; subR[14] = klr;
774 /* k12 */
775 subL[15] = krl; subR[15] = krr;
776 /* rotation left shift 32bit */
777 /* kl5 */
778 subL[24] = klr; subR[24] = krl;
779 /* kl6 */
780 subL[25] = krr; subR[25] = kll;
781 /* rotation left shift 49 from k11,k12 -> k21,k22 */
782 ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
783 /* k21 */
784 subL[28] = kll; subR[28] = klr;
785 /* k22 */
786 subL[29] = krl; subR[29] = krr;
787
788 /* generate KB dependent subkeys */
789 /* k1 */
790 subL[2] = krll; subR[2] = krlr;
791 /* k2 */
792 subL[3] = krrl; subR[3] = krrr;
793 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
794 /* k7 */
795 subL[10] = krll; subR[10] = krlr;
796 /* k8 */
797 subL[11] = krrl; subR[11] = krrr;
798 ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
799 /* k15 */
800 subL[20] = krll; subR[20] = krlr;
801 /* k16 */
802 subL[21] = krrl; subR[21] = krrr;
803 ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
804 /* kw3 */
805 subL[32] = krll; subR[32] = krlr;
806 /* kw4 */
807 subL[33] = krrl; subR[33] = krrr;
808
809 camellia_setup_tail(subkey, subL, subR, 32);
810}
811
812static void camellia_setup192(const unsigned char *key, u32 *subkey)
813{
814 unsigned char kk[32];
815 u32 krll, krlr, krrl, krrr;
816
817 memcpy(kk, key, 24);
818 memcpy((unsigned char *)&krll, key+16, 4);
819 memcpy((unsigned char *)&krlr, key+20, 4);
820 krrl = ~krll;
821 krrr = ~krlr;
822 memcpy(kk+24, (unsigned char *)&krrl, 4);
823 memcpy(kk+28, (unsigned char *)&krrr, 4);
824 camellia_setup256(kk, subkey);
825}
826
827
828/*
829 * Encrypt/decrypt
830 */
831#define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) ({ \
832 t0 = kll; \
833 t2 = krr; \
834 t0 &= ll; \
835 t2 |= rr; \
836 rl ^= t2; \
837 lr ^= rol32(t0, 1); \
838 t3 = krl; \
839 t1 = klr; \
840 t3 &= rl; \
841 t1 |= lr; \
842 ll ^= t1; \
843 rr ^= rol32(t3, 1); \
844})
845
846#define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir) ({ \
847 yl ^= kl; \
848 yr ^= kr; \
849 ir = camellia_sp1110[(u8)xr]; \
850 il = camellia_sp1110[(u8)(xl >> 24)]; \
851 ir ^= camellia_sp0222[(u8)(xr >> 24)]; \
852 il ^= camellia_sp0222[(u8)(xl >> 16)]; \
853 ir ^= camellia_sp3033[(u8)(xr >> 16)]; \
854 il ^= camellia_sp3033[(u8)(xl >> 8)]; \
855 ir ^= camellia_sp4404[(u8)(xr >> 8)]; \
856 il ^= camellia_sp4404[(u8)xl]; \
857 ir ^= il; \
858 yl ^= ir; \
859 yr ^= ror32(il, 8) ^ ir; \
860})
861
862/* max = 24: 128bit encrypt, max = 32: 256bit encrypt */
863static void camellia_do_encrypt(const u32 *subkey, u32 *io, unsigned max)
864{
865 u32 il, ir, t0, t1; /* temporary variables */
866
867 /* pre whitening but absorb kw2 */
868 io[0] ^= SUBKEY_L(0);
869 io[1] ^= SUBKEY_R(0);
870
871 /* main iteration */
872#define ROUNDS(i) ({ \
873 CAMELLIA_ROUNDSM(io[0], io[1], \
874 SUBKEY_L(i + 2), SUBKEY_R(i + 2), \
875 io[2], io[3], il, ir); \
876 CAMELLIA_ROUNDSM(io[2], io[3], \
877 SUBKEY_L(i + 3), SUBKEY_R(i + 3), \
878 io[0], io[1], il, ir); \
879 CAMELLIA_ROUNDSM(io[0], io[1], \
880 SUBKEY_L(i + 4), SUBKEY_R(i + 4), \
881 io[2], io[3], il, ir); \
882 CAMELLIA_ROUNDSM(io[2], io[3], \
883 SUBKEY_L(i + 5), SUBKEY_R(i + 5), \
884 io[0], io[1], il, ir); \
885 CAMELLIA_ROUNDSM(io[0], io[1], \
886 SUBKEY_L(i + 6), SUBKEY_R(i + 6), \
887 io[2], io[3], il, ir); \
888 CAMELLIA_ROUNDSM(io[2], io[3], \
889 SUBKEY_L(i + 7), SUBKEY_R(i + 7), \
890 io[0], io[1], il, ir); \
891})
892#define FLS(i) ({ \
893 CAMELLIA_FLS(io[0], io[1], io[2], io[3], \
894 SUBKEY_L(i + 0), SUBKEY_R(i + 0), \
895 SUBKEY_L(i + 1), SUBKEY_R(i + 1), \
896 t0, t1, il, ir); \
897})
898
899 ROUNDS(0);
900 FLS(8);
901 ROUNDS(8);
902 FLS(16);
903 ROUNDS(16);
904 if (max == 32) {
905 FLS(24);
906 ROUNDS(24);
907 }
908
909#undef ROUNDS
910#undef FLS
911
912 /* post whitening but kw4 */
913 io[2] ^= SUBKEY_L(max);
914 io[3] ^= SUBKEY_R(max);
915 /* NB: io[0],[1] should be swapped with [2],[3] by caller! */
916}
917
918static void camellia_do_decrypt(const u32 *subkey, u32 *io, unsigned i)
919{
920 u32 il, ir, t0, t1; /* temporary variables */
921
922 /* pre whitening but absorb kw2 */
923 io[0] ^= SUBKEY_L(i);
924 io[1] ^= SUBKEY_R(i);
925
926 /* main iteration */
927#define ROUNDS(i) ({ \
928 CAMELLIA_ROUNDSM(io[0], io[1], \
929 SUBKEY_L(i + 7), SUBKEY_R(i + 7), \
930 io[2], io[3], il, ir); \
931 CAMELLIA_ROUNDSM(io[2], io[3], \
932 SUBKEY_L(i + 6), SUBKEY_R(i + 6), \
933 io[0], io[1], il, ir); \
934 CAMELLIA_ROUNDSM(io[0], io[1], \
935 SUBKEY_L(i + 5), SUBKEY_R(i + 5), \
936 io[2], io[3], il, ir); \
937 CAMELLIA_ROUNDSM(io[2], io[3], \
938 SUBKEY_L(i + 4), SUBKEY_R(i + 4), \
939 io[0], io[1], il, ir); \
940 CAMELLIA_ROUNDSM(io[0], io[1], \
941 SUBKEY_L(i + 3), SUBKEY_R(i + 3), \
942 io[2], io[3], il, ir); \
943 CAMELLIA_ROUNDSM(io[2], io[3], \
944 SUBKEY_L(i + 2), SUBKEY_R(i + 2), \
945 io[0], io[1], il, ir); \
946})
947#define FLS(i) ({ \
948 CAMELLIA_FLS(io[0], io[1], io[2], io[3], \
949 SUBKEY_L(i + 1), SUBKEY_R(i + 1), \
950 SUBKEY_L(i + 0), SUBKEY_R(i + 0), \
951 t0, t1, il, ir); \
952})
953
954 if (i == 32) {
955 ROUNDS(24);
956 FLS(24);
957 }
958 ROUNDS(16);
959 FLS(16);
960 ROUNDS(8);
961 FLS(8);
962 ROUNDS(0);
963
964#undef ROUNDS
965#undef FLS
966
967 /* post whitening but kw4 */
968 io[2] ^= SUBKEY_L(0);
969 io[3] ^= SUBKEY_R(0);
970 /* NB: 0,1 should be swapped with 2,3 by caller! */
971}
972
973
974struct camellia_ctx {
975 int key_length;
976 u32 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u32)];
977};
978
979static int
980camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key,
981 unsigned int key_len)
982{
983 struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
984 const unsigned char *key = (const unsigned char *)in_key;
985 u32 *flags = &tfm->crt_flags;
986
987 if (key_len != 16 && key_len != 24 && key_len != 32) {
988 *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
989 return -EINVAL;
990 }
991
992 cctx->key_length = key_len;
993
994 switch (key_len) {
995 case 16:
996 camellia_setup128(key, cctx->key_table);
997 break;
998 case 24:
999 camellia_setup192(key, cctx->key_table);
1000 break;
1001 case 32:
1002 camellia_setup256(key, cctx->key_table);
1003 break;
1004 }
1005
1006 return 0;
1007}
1008
1009static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1010{
1011 const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1012 const __be32 *src = (const __be32 *)in;
1013 __be32 *dst = (__be32 *)out;
1014 unsigned int max;
1015
1016 u32 tmp[4];
1017
1018 tmp[0] = be32_to_cpu(src[0]);
1019 tmp[1] = be32_to_cpu(src[1]);
1020 tmp[2] = be32_to_cpu(src[2]);
1021 tmp[3] = be32_to_cpu(src[3]);
1022
1023 if (cctx->key_length == 16)
1024 max = 24;
1025 else
1026 max = 32; /* for key lengths of 24 and 32 */
1027
1028 camellia_do_encrypt(cctx->key_table, tmp, max);
1029
1030 /* do_encrypt returns 0,1 swapped with 2,3 */
1031 dst[0] = cpu_to_be32(tmp[2]);
1032 dst[1] = cpu_to_be32(tmp[3]);
1033 dst[2] = cpu_to_be32(tmp[0]);
1034 dst[3] = cpu_to_be32(tmp[1]);
1035}
1036
1037static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1038{
1039 const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1040 const __be32 *src = (const __be32 *)in;
1041 __be32 *dst = (__be32 *)out;
1042 unsigned int max;
1043
1044 u32 tmp[4];
1045
1046 tmp[0] = be32_to_cpu(src[0]);
1047 tmp[1] = be32_to_cpu(src[1]);
1048 tmp[2] = be32_to_cpu(src[2]);
1049 tmp[3] = be32_to_cpu(src[3]);
1050
1051 if (cctx->key_length == 16)
1052 max = 24;
1053 else
1054 max = 32; /* for key lengths of 24 and 32 */
1055
1056 camellia_do_decrypt(cctx->key_table, tmp, max);
1057
1058 /* do_decrypt returns 0,1 swapped with 2,3 */
1059 dst[0] = cpu_to_be32(tmp[2]);
1060 dst[1] = cpu_to_be32(tmp[3]);
1061 dst[2] = cpu_to_be32(tmp[0]);
1062 dst[3] = cpu_to_be32(tmp[1]);
1063}
1064
1065static struct crypto_alg camellia_alg = {
1066 .cra_name = "camellia",
1067 .cra_driver_name = "camellia-generic",
1068 .cra_priority = 100,
1069 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
1070 .cra_blocksize = CAMELLIA_BLOCK_SIZE,
1071 .cra_ctxsize = sizeof(struct camellia_ctx),
1072 .cra_alignmask = 3,
1073 .cra_module = THIS_MODULE,
1074 .cra_u = {
1075 .cipher = {
1076 .cia_min_keysize = CAMELLIA_MIN_KEY_SIZE,
1077 .cia_max_keysize = CAMELLIA_MAX_KEY_SIZE,
1078 .cia_setkey = camellia_set_key,
1079 .cia_encrypt = camellia_encrypt,
1080 .cia_decrypt = camellia_decrypt
1081 }
1082 }
1083};
1084
1085static int __init camellia_init(void)
1086{
1087 return crypto_register_alg(&camellia_alg);
1088}
1089
1090static void __exit camellia_fini(void)
1091{
1092 crypto_unregister_alg(&camellia_alg);
1093}
1094
1095module_init(camellia_init);
1096module_exit(camellia_fini);
1097
1098MODULE_DESCRIPTION("Camellia Cipher Algorithm");
1099MODULE_LICENSE("GPL");
1100MODULE_ALIAS_CRYPTO("camellia");
1101MODULE_ALIAS_CRYPTO("camellia-generic");