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