11ccea77eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2617ae7c7SJussi Kivilinna /*
3617ae7c7SJussi Kivilinna * Copyright (C) 2006
4617ae7c7SJussi Kivilinna * NTT (Nippon Telegraph and Telephone Corporation).
5617ae7c7SJussi Kivilinna */
6617ae7c7SJussi Kivilinna
7617ae7c7SJussi Kivilinna /*
8617ae7c7SJussi Kivilinna * Algorithm Specification
99332a9e7SAlexander A. Klimov * https://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
10617ae7c7SJussi Kivilinna */
11617ae7c7SJussi Kivilinna
12*14386d47SHerbert Xu #include <crypto/algapi.h>
13617ae7c7SJussi Kivilinna #include <linux/errno.h>
14617ae7c7SJussi Kivilinna #include <linux/init.h>
15617ae7c7SJussi Kivilinna #include <linux/kernel.h>
16617ae7c7SJussi Kivilinna #include <linux/module.h>
17617ae7c7SJussi Kivilinna #include <linux/bitops.h>
18617ae7c7SJussi Kivilinna #include <asm/unaligned.h>
19617ae7c7SJussi Kivilinna
20617ae7c7SJussi Kivilinna static const u32 camellia_sp1110[256] = {
21617ae7c7SJussi Kivilinna 0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00,
22617ae7c7SJussi Kivilinna 0xb3b3b300, 0x27272700, 0xc0c0c000, 0xe5e5e500,
23617ae7c7SJussi Kivilinna 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
24617ae7c7SJussi Kivilinna 0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100,
25617ae7c7SJussi Kivilinna 0x23232300, 0xefefef00, 0x6b6b6b00, 0x93939300,
26617ae7c7SJussi Kivilinna 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
27617ae7c7SJussi Kivilinna 0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00,
28617ae7c7SJussi Kivilinna 0x1d1d1d00, 0x65656500, 0x92929200, 0xbdbdbd00,
29617ae7c7SJussi Kivilinna 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
30617ae7c7SJussi Kivilinna 0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00,
31617ae7c7SJussi Kivilinna 0x3e3e3e00, 0x30303000, 0xdcdcdc00, 0x5f5f5f00,
32617ae7c7SJussi Kivilinna 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
33617ae7c7SJussi Kivilinna 0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00,
34617ae7c7SJussi Kivilinna 0xd5d5d500, 0x47474700, 0x5d5d5d00, 0x3d3d3d00,
35617ae7c7SJussi Kivilinna 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
36617ae7c7SJussi Kivilinna 0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00,
37617ae7c7SJussi Kivilinna 0x8b8b8b00, 0x0d0d0d00, 0x9a9a9a00, 0x66666600,
38617ae7c7SJussi Kivilinna 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
39617ae7c7SJussi Kivilinna 0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000,
40617ae7c7SJussi Kivilinna 0xf0f0f000, 0xb1b1b100, 0x84848400, 0x99999900,
41617ae7c7SJussi Kivilinna 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
42617ae7c7SJussi Kivilinna 0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500,
43617ae7c7SJussi Kivilinna 0x6d6d6d00, 0xb7b7b700, 0xa9a9a900, 0x31313100,
44617ae7c7SJussi Kivilinna 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
45617ae7c7SJussi Kivilinna 0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100,
46617ae7c7SJussi Kivilinna 0xdedede00, 0x1b1b1b00, 0x11111100, 0x1c1c1c00,
47617ae7c7SJussi Kivilinna 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
48617ae7c7SJussi Kivilinna 0x53535300, 0x18181800, 0xf2f2f200, 0x22222200,
49617ae7c7SJussi Kivilinna 0xfefefe00, 0x44444400, 0xcfcfcf00, 0xb2b2b200,
50617ae7c7SJussi Kivilinna 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
51617ae7c7SJussi Kivilinna 0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800,
52617ae7c7SJussi Kivilinna 0x60606000, 0xfcfcfc00, 0x69696900, 0x50505000,
53617ae7c7SJussi Kivilinna 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
54617ae7c7SJussi Kivilinna 0xa1a1a100, 0x89898900, 0x62626200, 0x97979700,
55617ae7c7SJussi Kivilinna 0x54545400, 0x5b5b5b00, 0x1e1e1e00, 0x95959500,
56617ae7c7SJussi Kivilinna 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
57617ae7c7SJussi Kivilinna 0x10101000, 0xc4c4c400, 0x00000000, 0x48484800,
58617ae7c7SJussi Kivilinna 0xa3a3a300, 0xf7f7f700, 0x75757500, 0xdbdbdb00,
59617ae7c7SJussi Kivilinna 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
60617ae7c7SJussi Kivilinna 0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400,
61617ae7c7SJussi Kivilinna 0x87878700, 0x5c5c5c00, 0x83838300, 0x02020200,
62617ae7c7SJussi Kivilinna 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
63617ae7c7SJussi Kivilinna 0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300,
64617ae7c7SJussi Kivilinna 0x9d9d9d00, 0x7f7f7f00, 0xbfbfbf00, 0xe2e2e200,
65617ae7c7SJussi Kivilinna 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
66617ae7c7SJussi Kivilinna 0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00,
67617ae7c7SJussi Kivilinna 0x81818100, 0x96969600, 0x6f6f6f00, 0x4b4b4b00,
68617ae7c7SJussi Kivilinna 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
69617ae7c7SJussi Kivilinna 0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00,
70617ae7c7SJussi Kivilinna 0x9f9f9f00, 0x6e6e6e00, 0xbcbcbc00, 0x8e8e8e00,
71617ae7c7SJussi Kivilinna 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
72617ae7c7SJussi Kivilinna 0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900,
73617ae7c7SJussi Kivilinna 0x78787800, 0x98989800, 0x06060600, 0x6a6a6a00,
74617ae7c7SJussi Kivilinna 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
75617ae7c7SJussi Kivilinna 0xd4d4d400, 0x25252500, 0xababab00, 0x42424200,
76617ae7c7SJussi Kivilinna 0x88888800, 0xa2a2a200, 0x8d8d8d00, 0xfafafa00,
77617ae7c7SJussi Kivilinna 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
78617ae7c7SJussi Kivilinna 0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00,
79617ae7c7SJussi Kivilinna 0x36363600, 0x49494900, 0x2a2a2a00, 0x68686800,
80617ae7c7SJussi Kivilinna 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
81617ae7c7SJussi Kivilinna 0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00,
82617ae7c7SJussi Kivilinna 0xbbbbbb00, 0xc9c9c900, 0x43434300, 0xc1c1c100,
83617ae7c7SJussi Kivilinna 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
84617ae7c7SJussi Kivilinna 0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00,
85617ae7c7SJussi Kivilinna };
86617ae7c7SJussi Kivilinna
87617ae7c7SJussi Kivilinna static const u32 camellia_sp0222[256] = {
88617ae7c7SJussi Kivilinna 0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9,
89617ae7c7SJussi Kivilinna 0x00676767, 0x004e4e4e, 0x00818181, 0x00cbcbcb,
90617ae7c7SJussi Kivilinna 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
91617ae7c7SJussi Kivilinna 0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282,
92617ae7c7SJussi Kivilinna 0x00464646, 0x00dfdfdf, 0x00d6d6d6, 0x00272727,
93617ae7c7SJussi Kivilinna 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
94617ae7c7SJussi Kivilinna 0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c,
95617ae7c7SJussi Kivilinna 0x003a3a3a, 0x00cacaca, 0x00252525, 0x007b7b7b,
96617ae7c7SJussi Kivilinna 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
97617ae7c7SJussi Kivilinna 0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d,
98617ae7c7SJussi Kivilinna 0x007c7c7c, 0x00606060, 0x00b9b9b9, 0x00bebebe,
99617ae7c7SJussi Kivilinna 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
100617ae7c7SJussi Kivilinna 0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595,
101617ae7c7SJussi Kivilinna 0x00ababab, 0x008e8e8e, 0x00bababa, 0x007a7a7a,
102617ae7c7SJussi Kivilinna 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
103617ae7c7SJussi Kivilinna 0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a,
104617ae7c7SJussi Kivilinna 0x00171717, 0x001a1a1a, 0x00353535, 0x00cccccc,
105617ae7c7SJussi Kivilinna 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
106617ae7c7SJussi Kivilinna 0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040,
107617ae7c7SJussi Kivilinna 0x00e1e1e1, 0x00636363, 0x00090909, 0x00333333,
108617ae7c7SJussi Kivilinna 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
109617ae7c7SJussi Kivilinna 0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a,
110617ae7c7SJussi Kivilinna 0x00dadada, 0x006f6f6f, 0x00535353, 0x00626262,
111617ae7c7SJussi Kivilinna 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
112617ae7c7SJussi Kivilinna 0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2,
113617ae7c7SJussi Kivilinna 0x00bdbdbd, 0x00363636, 0x00222222, 0x00383838,
114617ae7c7SJussi Kivilinna 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
115617ae7c7SJussi Kivilinna 0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444,
116617ae7c7SJussi Kivilinna 0x00fdfdfd, 0x00888888, 0x009f9f9f, 0x00656565,
117617ae7c7SJussi Kivilinna 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
118617ae7c7SJussi Kivilinna 0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151,
119617ae7c7SJussi Kivilinna 0x00c0c0c0, 0x00f9f9f9, 0x00d2d2d2, 0x00a0a0a0,
120617ae7c7SJussi Kivilinna 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
121617ae7c7SJussi Kivilinna 0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f,
122617ae7c7SJussi Kivilinna 0x00a8a8a8, 0x00b6b6b6, 0x003c3c3c, 0x002b2b2b,
123617ae7c7SJussi Kivilinna 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
124617ae7c7SJussi Kivilinna 0x00202020, 0x00898989, 0x00000000, 0x00909090,
125617ae7c7SJussi Kivilinna 0x00474747, 0x00efefef, 0x00eaeaea, 0x00b7b7b7,
126617ae7c7SJussi Kivilinna 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
127617ae7c7SJussi Kivilinna 0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929,
128617ae7c7SJussi Kivilinna 0x000f0f0f, 0x00b8b8b8, 0x00070707, 0x00040404,
129617ae7c7SJussi Kivilinna 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
130617ae7c7SJussi Kivilinna 0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7,
131617ae7c7SJussi Kivilinna 0x003b3b3b, 0x00fefefe, 0x007f7f7f, 0x00c5c5c5,
132617ae7c7SJussi Kivilinna 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
133617ae7c7SJussi Kivilinna 0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676,
134617ae7c7SJussi Kivilinna 0x00030303, 0x002d2d2d, 0x00dedede, 0x00969696,
135617ae7c7SJussi Kivilinna 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
136617ae7c7SJussi Kivilinna 0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919,
137617ae7c7SJussi Kivilinna 0x003f3f3f, 0x00dcdcdc, 0x00797979, 0x001d1d1d,
138617ae7c7SJussi Kivilinna 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
139617ae7c7SJussi Kivilinna 0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2,
140617ae7c7SJussi Kivilinna 0x00f0f0f0, 0x00313131, 0x000c0c0c, 0x00d4d4d4,
141617ae7c7SJussi Kivilinna 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
142617ae7c7SJussi Kivilinna 0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484,
143617ae7c7SJussi Kivilinna 0x00111111, 0x00454545, 0x001b1b1b, 0x00f5f5f5,
144617ae7c7SJussi Kivilinna 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
145617ae7c7SJussi Kivilinna 0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414,
146617ae7c7SJussi Kivilinna 0x006c6c6c, 0x00929292, 0x00545454, 0x00d0d0d0,
147617ae7c7SJussi Kivilinna 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
148617ae7c7SJussi Kivilinna 0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6,
149617ae7c7SJussi Kivilinna 0x00777777, 0x00939393, 0x00868686, 0x00838383,
150617ae7c7SJussi Kivilinna 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
151617ae7c7SJussi Kivilinna 0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d,
152617ae7c7SJussi Kivilinna };
153617ae7c7SJussi Kivilinna
154617ae7c7SJussi Kivilinna static const u32 camellia_sp3033[256] = {
155617ae7c7SJussi Kivilinna 0x38003838, 0x41004141, 0x16001616, 0x76007676,
156617ae7c7SJussi Kivilinna 0xd900d9d9, 0x93009393, 0x60006060, 0xf200f2f2,
157617ae7c7SJussi Kivilinna 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
158617ae7c7SJussi Kivilinna 0x75007575, 0x06000606, 0x57005757, 0xa000a0a0,
159617ae7c7SJussi Kivilinna 0x91009191, 0xf700f7f7, 0xb500b5b5, 0xc900c9c9,
160617ae7c7SJussi Kivilinna 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
161617ae7c7SJussi Kivilinna 0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727,
162617ae7c7SJussi Kivilinna 0x8e008e8e, 0xb200b2b2, 0x49004949, 0xde00dede,
163617ae7c7SJussi Kivilinna 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
164617ae7c7SJussi Kivilinna 0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767,
165617ae7c7SJussi Kivilinna 0x1f001f1f, 0x18001818, 0x6e006e6e, 0xaf00afaf,
166617ae7c7SJussi Kivilinna 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
167617ae7c7SJussi Kivilinna 0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565,
168617ae7c7SJussi Kivilinna 0xea00eaea, 0xa300a3a3, 0xae00aeae, 0x9e009e9e,
169617ae7c7SJussi Kivilinna 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
170617ae7c7SJussi Kivilinna 0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6,
171617ae7c7SJussi Kivilinna 0xc500c5c5, 0x86008686, 0x4d004d4d, 0x33003333,
172617ae7c7SJussi Kivilinna 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
173617ae7c7SJussi Kivilinna 0x3a003a3a, 0x09000909, 0x95009595, 0x10001010,
174617ae7c7SJussi Kivilinna 0x78007878, 0xd800d8d8, 0x42004242, 0xcc00cccc,
175617ae7c7SJussi Kivilinna 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
176617ae7c7SJussi Kivilinna 0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282,
177617ae7c7SJussi Kivilinna 0xb600b6b6, 0xdb00dbdb, 0xd400d4d4, 0x98009898,
178617ae7c7SJussi Kivilinna 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
179617ae7c7SJussi Kivilinna 0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0,
180617ae7c7SJussi Kivilinna 0x6f006f6f, 0x8d008d8d, 0x88008888, 0x0e000e0e,
181617ae7c7SJussi Kivilinna 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
182617ae7c7SJussi Kivilinna 0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111,
183617ae7c7SJussi Kivilinna 0x7f007f7f, 0x22002222, 0xe700e7e7, 0x59005959,
184617ae7c7SJussi Kivilinna 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
185617ae7c7SJussi Kivilinna 0x12001212, 0x04000404, 0x74007474, 0x54005454,
186617ae7c7SJussi Kivilinna 0x30003030, 0x7e007e7e, 0xb400b4b4, 0x28002828,
187617ae7c7SJussi Kivilinna 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
188617ae7c7SJussi Kivilinna 0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb,
189617ae7c7SJussi Kivilinna 0x2a002a2a, 0xad00adad, 0x0f000f0f, 0xca00caca,
190617ae7c7SJussi Kivilinna 0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
191617ae7c7SJussi Kivilinna 0x08000808, 0x62006262, 0x00000000, 0x24002424,
192617ae7c7SJussi Kivilinna 0xd100d1d1, 0xfb00fbfb, 0xba00baba, 0xed00eded,
193617ae7c7SJussi Kivilinna 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
194617ae7c7SJussi Kivilinna 0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a,
195617ae7c7SJussi Kivilinna 0xc300c3c3, 0x2e002e2e, 0xc100c1c1, 0x01000101,
196617ae7c7SJussi Kivilinna 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
197617ae7c7SJussi Kivilinna 0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9,
198617ae7c7SJussi Kivilinna 0xce00cece, 0xbf00bfbf, 0xdf00dfdf, 0x71007171,
199617ae7c7SJussi Kivilinna 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
200617ae7c7SJussi Kivilinna 0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d,
201617ae7c7SJussi Kivilinna 0xc000c0c0, 0x4b004b4b, 0xb700b7b7, 0xa500a5a5,
202617ae7c7SJussi Kivilinna 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
203617ae7c7SJussi Kivilinna 0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646,
204617ae7c7SJussi Kivilinna 0xcf00cfcf, 0x37003737, 0x5e005e5e, 0x47004747,
205617ae7c7SJussi Kivilinna 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
206617ae7c7SJussi Kivilinna 0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac,
207617ae7c7SJussi Kivilinna 0x3c003c3c, 0x4c004c4c, 0x03000303, 0x35003535,
208617ae7c7SJussi Kivilinna 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
209617ae7c7SJussi Kivilinna 0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121,
210617ae7c7SJussi Kivilinna 0x44004444, 0x51005151, 0xc600c6c6, 0x7d007d7d,
211617ae7c7SJussi Kivilinna 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
212617ae7c7SJussi Kivilinna 0x7c007c7c, 0x77007777, 0x56005656, 0x05000505,
213617ae7c7SJussi Kivilinna 0x1b001b1b, 0xa400a4a4, 0x15001515, 0x34003434,
214617ae7c7SJussi Kivilinna 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
215617ae7c7SJussi Kivilinna 0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd,
216617ae7c7SJussi Kivilinna 0xdd00dddd, 0xe400e4e4, 0xa100a1a1, 0xe000e0e0,
217617ae7c7SJussi Kivilinna 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
218617ae7c7SJussi Kivilinna 0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f,
219617ae7c7SJussi Kivilinna };
220617ae7c7SJussi Kivilinna
221617ae7c7SJussi Kivilinna static const u32 camellia_sp4404[256] = {
222617ae7c7SJussi Kivilinna 0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0,
223617ae7c7SJussi Kivilinna 0xe4e400e4, 0x57570057, 0xeaea00ea, 0xaeae00ae,
224617ae7c7SJussi Kivilinna 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
225617ae7c7SJussi Kivilinna 0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092,
226617ae7c7SJussi Kivilinna 0x86860086, 0xafaf00af, 0x7c7c007c, 0x1f1f001f,
227617ae7c7SJussi Kivilinna 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
228617ae7c7SJussi Kivilinna 0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d,
229617ae7c7SJussi Kivilinna 0xd9d900d9, 0x5a5a005a, 0x51510051, 0x6c6c006c,
230617ae7c7SJussi Kivilinna 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
231617ae7c7SJussi Kivilinna 0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084,
232617ae7c7SJussi Kivilinna 0xdfdf00df, 0xcbcb00cb, 0x34340034, 0x76760076,
233617ae7c7SJussi Kivilinna 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
234617ae7c7SJussi Kivilinna 0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011,
235617ae7c7SJussi Kivilinna 0x32320032, 0x9c9c009c, 0x53530053, 0xf2f200f2,
236617ae7c7SJussi Kivilinna 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
237617ae7c7SJussi Kivilinna 0x24240024, 0xe8e800e8, 0x60600060, 0x69690069,
238617ae7c7SJussi Kivilinna 0xaaaa00aa, 0xa0a000a0, 0xa1a100a1, 0x62620062,
239617ae7c7SJussi Kivilinna 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
240617ae7c7SJussi Kivilinna 0x10100010, 0x00000000, 0xa3a300a3, 0x75750075,
241617ae7c7SJussi Kivilinna 0x8a8a008a, 0xe6e600e6, 0x09090009, 0xdddd00dd,
242617ae7c7SJussi Kivilinna 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
243617ae7c7SJussi Kivilinna 0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf,
244617ae7c7SJussi Kivilinna 0x52520052, 0xd8d800d8, 0xc8c800c8, 0xc6c600c6,
245617ae7c7SJussi Kivilinna 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
246617ae7c7SJussi Kivilinna 0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc,
247617ae7c7SJussi Kivilinna 0x29290029, 0xf9f900f9, 0x2f2f002f, 0xb4b400b4,
248617ae7c7SJussi Kivilinna 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
249617ae7c7SJussi Kivilinna 0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d,
250617ae7c7SJussi Kivilinna 0x72720072, 0xb9b900b9, 0xf8f800f8, 0xacac00ac,
251617ae7c7SJussi Kivilinna 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
252617ae7c7SJussi Kivilinna 0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043,
253617ae7c7SJussi Kivilinna 0x15150015, 0xadad00ad, 0x77770077, 0x80800080,
254617ae7c7SJussi Kivilinna 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
255617ae7c7SJussi Kivilinna 0x85850085, 0x35350035, 0x0c0c000c, 0x41410041,
256617ae7c7SJussi Kivilinna 0xefef00ef, 0x93930093, 0x19190019, 0x21210021,
257617ae7c7SJussi Kivilinna 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
258617ae7c7SJussi Kivilinna 0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce,
259617ae7c7SJussi Kivilinna 0x30300030, 0x5f5f005f, 0xc5c500c5, 0x1a1a001a,
260617ae7c7SJussi Kivilinna 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
261617ae7c7SJussi Kivilinna 0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d,
262617ae7c7SJussi Kivilinna 0x0d0d000d, 0x66660066, 0xcccc00cc, 0x2d2d002d,
263617ae7c7SJussi Kivilinna 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
264617ae7c7SJussi Kivilinna 0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005,
265617ae7c7SJussi Kivilinna 0xb7b700b7, 0x31310031, 0x17170017, 0xd7d700d7,
266617ae7c7SJussi Kivilinna 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
267617ae7c7SJussi Kivilinna 0x0f0f000f, 0x16160016, 0x18180018, 0x22220022,
268617ae7c7SJussi Kivilinna 0x44440044, 0xb2b200b2, 0xb5b500b5, 0x91910091,
269617ae7c7SJussi Kivilinna 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
270617ae7c7SJussi Kivilinna 0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097,
271617ae7c7SJussi Kivilinna 0x5b5b005b, 0x95950095, 0xffff00ff, 0xd2d200d2,
272617ae7c7SJussi Kivilinna 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
273617ae7c7SJussi Kivilinna 0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094,
274617ae7c7SJussi Kivilinna 0x5c5c005c, 0x02020002, 0x4a4a004a, 0x33330033,
275617ae7c7SJussi Kivilinna 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
276617ae7c7SJussi Kivilinna 0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b,
277617ae7c7SJussi Kivilinna 0x96960096, 0x4b4b004b, 0xbebe00be, 0x2e2e002e,
278617ae7c7SJussi Kivilinna 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
279617ae7c7SJussi Kivilinna 0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059,
280617ae7c7SJussi Kivilinna 0x98980098, 0x6a6a006a, 0x46460046, 0xbaba00ba,
281617ae7c7SJussi Kivilinna 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
282617ae7c7SJussi Kivilinna 0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a,
283617ae7c7SJussi Kivilinna 0x49490049, 0x68680068, 0x38380038, 0xa4a400a4,
284617ae7c7SJussi Kivilinna 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
285617ae7c7SJussi Kivilinna 0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e,
286617ae7c7SJussi Kivilinna };
287617ae7c7SJussi Kivilinna
288617ae7c7SJussi Kivilinna
289617ae7c7SJussi Kivilinna #define CAMELLIA_MIN_KEY_SIZE 16
290617ae7c7SJussi Kivilinna #define CAMELLIA_MAX_KEY_SIZE 32
291617ae7c7SJussi Kivilinna #define CAMELLIA_BLOCK_SIZE 16
292617ae7c7SJussi Kivilinna #define CAMELLIA_TABLE_BYTE_LEN 272
293617ae7c7SJussi Kivilinna
294617ae7c7SJussi Kivilinna /*
295617ae7c7SJussi Kivilinna * NB: L and R below stand for 'left' and 'right' as in written numbers.
296617ae7c7SJussi Kivilinna * That is, in (xxxL,xxxR) pair xxxL holds most significant digits,
297617ae7c7SJussi Kivilinna * _not_ least significant ones!
298617ae7c7SJussi Kivilinna */
299617ae7c7SJussi Kivilinna
300617ae7c7SJussi Kivilinna
301617ae7c7SJussi Kivilinna /* key constants */
302617ae7c7SJussi Kivilinna
303617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA1L (0xA09E667FL)
304617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA1R (0x3BCC908BL)
305617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA2L (0xB67AE858L)
306617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA2R (0x4CAA73B2L)
307617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA3L (0xC6EF372FL)
308617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA3R (0xE94F82BEL)
309617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA4L (0x54FF53A5L)
310617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA4R (0xF1D36F1CL)
311617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA5L (0x10E527FAL)
312617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA5R (0xDE682D1DL)
313617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA6L (0xB05688C2L)
314617ae7c7SJussi Kivilinna #define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
315617ae7c7SJussi Kivilinna
316617ae7c7SJussi Kivilinna /*
317617ae7c7SJussi Kivilinna * macros
318617ae7c7SJussi Kivilinna */
319617ae7c7SJussi Kivilinna #define ROLDQ(ll, lr, rl, rr, w0, w1, bits) ({ \
320617ae7c7SJussi Kivilinna w0 = ll; \
321617ae7c7SJussi Kivilinna ll = (ll << bits) + (lr >> (32 - bits)); \
322617ae7c7SJussi Kivilinna lr = (lr << bits) + (rl >> (32 - bits)); \
323617ae7c7SJussi Kivilinna rl = (rl << bits) + (rr >> (32 - bits)); \
324617ae7c7SJussi Kivilinna rr = (rr << bits) + (w0 >> (32 - bits)); \
325617ae7c7SJussi Kivilinna })
326617ae7c7SJussi Kivilinna
327617ae7c7SJussi Kivilinna #define ROLDQo32(ll, lr, rl, rr, w0, w1, bits) ({ \
328617ae7c7SJussi Kivilinna w0 = ll; \
329617ae7c7SJussi Kivilinna w1 = lr; \
330617ae7c7SJussi Kivilinna ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \
331617ae7c7SJussi Kivilinna lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \
332617ae7c7SJussi Kivilinna rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \
333617ae7c7SJussi Kivilinna rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \
334617ae7c7SJussi Kivilinna })
335617ae7c7SJussi Kivilinna
336617ae7c7SJussi Kivilinna #define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) ({ \
337617ae7c7SJussi Kivilinna il = xl ^ kl; \
338617ae7c7SJussi Kivilinna ir = xr ^ kr; \
339617ae7c7SJussi Kivilinna t0 = il >> 16; \
340617ae7c7SJussi Kivilinna t1 = ir >> 16; \
341617ae7c7SJussi Kivilinna yl = camellia_sp1110[(u8)(ir)] \
342617ae7c7SJussi Kivilinna ^ camellia_sp0222[(u8)(t1 >> 8)] \
343617ae7c7SJussi Kivilinna ^ camellia_sp3033[(u8)(t1)] \
344617ae7c7SJussi Kivilinna ^ camellia_sp4404[(u8)(ir >> 8)]; \
345617ae7c7SJussi Kivilinna yr = camellia_sp1110[(u8)(t0 >> 8)] \
346617ae7c7SJussi Kivilinna ^ camellia_sp0222[(u8)(t0)] \
347617ae7c7SJussi Kivilinna ^ camellia_sp3033[(u8)(il >> 8)] \
348617ae7c7SJussi Kivilinna ^ camellia_sp4404[(u8)(il)]; \
349617ae7c7SJussi Kivilinna yl ^= yr; \
350617ae7c7SJussi Kivilinna yr = ror32(yr, 8); \
351617ae7c7SJussi Kivilinna yr ^= yl; \
352617ae7c7SJussi Kivilinna })
353617ae7c7SJussi Kivilinna
354617ae7c7SJussi Kivilinna #define SUBKEY_L(INDEX) (subkey[(INDEX)*2])
355617ae7c7SJussi Kivilinna #define SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1])
356617ae7c7SJussi Kivilinna
camellia_setup_tail(u32 * subkey,u32 * subL,u32 * subR,int max)357617ae7c7SJussi Kivilinna static void camellia_setup_tail(u32 *subkey, u32 *subL, u32 *subR, int max)
358617ae7c7SJussi Kivilinna {
359617ae7c7SJussi Kivilinna u32 dw, tl, tr;
360617ae7c7SJussi Kivilinna u32 kw4l, kw4r;
361617ae7c7SJussi Kivilinna
362617ae7c7SJussi Kivilinna /* absorb kw2 to other subkeys */
363617ae7c7SJussi Kivilinna /* round 2 */
364617ae7c7SJussi Kivilinna subL[3] ^= subL[1]; subR[3] ^= subR[1];
365617ae7c7SJussi Kivilinna /* round 4 */
366617ae7c7SJussi Kivilinna subL[5] ^= subL[1]; subR[5] ^= subR[1];
367617ae7c7SJussi Kivilinna /* round 6 */
368617ae7c7SJussi Kivilinna subL[7] ^= subL[1]; subR[7] ^= subR[1];
369617ae7c7SJussi Kivilinna subL[1] ^= subR[1] & ~subR[9];
370452ec049SJulia Lawall dw = subL[1] & subL[9];
371617ae7c7SJussi Kivilinna subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl2) */
372617ae7c7SJussi Kivilinna /* round 8 */
373617ae7c7SJussi Kivilinna subL[11] ^= subL[1]; subR[11] ^= subR[1];
374617ae7c7SJussi Kivilinna /* round 10 */
375617ae7c7SJussi Kivilinna subL[13] ^= subL[1]; subR[13] ^= subR[1];
376617ae7c7SJussi Kivilinna /* round 12 */
377617ae7c7SJussi Kivilinna subL[15] ^= subL[1]; subR[15] ^= subR[1];
378617ae7c7SJussi Kivilinna subL[1] ^= subR[1] & ~subR[17];
379452ec049SJulia Lawall dw = subL[1] & subL[17];
380617ae7c7SJussi Kivilinna subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl4) */
381617ae7c7SJussi Kivilinna /* round 14 */
382617ae7c7SJussi Kivilinna subL[19] ^= subL[1]; subR[19] ^= subR[1];
383617ae7c7SJussi Kivilinna /* round 16 */
384617ae7c7SJussi Kivilinna subL[21] ^= subL[1]; subR[21] ^= subR[1];
385617ae7c7SJussi Kivilinna /* round 18 */
386617ae7c7SJussi Kivilinna subL[23] ^= subL[1]; subR[23] ^= subR[1];
387617ae7c7SJussi Kivilinna if (max == 24) {
388617ae7c7SJussi Kivilinna /* kw3 */
389617ae7c7SJussi Kivilinna subL[24] ^= subL[1]; subR[24] ^= subR[1];
390617ae7c7SJussi Kivilinna
391617ae7c7SJussi Kivilinna /* absorb kw4 to other subkeys */
392617ae7c7SJussi Kivilinna kw4l = subL[25]; kw4r = subR[25];
393617ae7c7SJussi Kivilinna } else {
394617ae7c7SJussi Kivilinna subL[1] ^= subR[1] & ~subR[25];
395452ec049SJulia Lawall dw = subL[1] & subL[25];
396617ae7c7SJussi Kivilinna subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl6) */
397617ae7c7SJussi Kivilinna /* round 20 */
398617ae7c7SJussi Kivilinna subL[27] ^= subL[1]; subR[27] ^= subR[1];
399617ae7c7SJussi Kivilinna /* round 22 */
400617ae7c7SJussi Kivilinna subL[29] ^= subL[1]; subR[29] ^= subR[1];
401617ae7c7SJussi Kivilinna /* round 24 */
402617ae7c7SJussi Kivilinna subL[31] ^= subL[1]; subR[31] ^= subR[1];
403617ae7c7SJussi Kivilinna /* kw3 */
404617ae7c7SJussi Kivilinna subL[32] ^= subL[1]; subR[32] ^= subR[1];
405617ae7c7SJussi Kivilinna
406617ae7c7SJussi Kivilinna /* absorb kw4 to other subkeys */
407617ae7c7SJussi Kivilinna kw4l = subL[33]; kw4r = subR[33];
408617ae7c7SJussi Kivilinna /* round 23 */
409617ae7c7SJussi Kivilinna subL[30] ^= kw4l; subR[30] ^= kw4r;
410617ae7c7SJussi Kivilinna /* round 21 */
411617ae7c7SJussi Kivilinna subL[28] ^= kw4l; subR[28] ^= kw4r;
412617ae7c7SJussi Kivilinna /* round 19 */
413617ae7c7SJussi Kivilinna subL[26] ^= kw4l; subR[26] ^= kw4r;
414617ae7c7SJussi Kivilinna kw4l ^= kw4r & ~subR[24];
415452ec049SJulia Lawall dw = kw4l & subL[24];
416617ae7c7SJussi Kivilinna kw4r ^= rol32(dw, 1); /* modified for FL(kl5) */
417617ae7c7SJussi Kivilinna }
418617ae7c7SJussi Kivilinna /* round 17 */
419617ae7c7SJussi Kivilinna subL[22] ^= kw4l; subR[22] ^= kw4r;
420617ae7c7SJussi Kivilinna /* round 15 */
421617ae7c7SJussi Kivilinna subL[20] ^= kw4l; subR[20] ^= kw4r;
422617ae7c7SJussi Kivilinna /* round 13 */
423617ae7c7SJussi Kivilinna subL[18] ^= kw4l; subR[18] ^= kw4r;
424617ae7c7SJussi Kivilinna kw4l ^= kw4r & ~subR[16];
425452ec049SJulia Lawall dw = kw4l & subL[16];
426617ae7c7SJussi Kivilinna kw4r ^= rol32(dw, 1); /* modified for FL(kl3) */
427617ae7c7SJussi Kivilinna /* round 11 */
428617ae7c7SJussi Kivilinna subL[14] ^= kw4l; subR[14] ^= kw4r;
429617ae7c7SJussi Kivilinna /* round 9 */
430617ae7c7SJussi Kivilinna subL[12] ^= kw4l; subR[12] ^= kw4r;
431617ae7c7SJussi Kivilinna /* round 7 */
432617ae7c7SJussi Kivilinna subL[10] ^= kw4l; subR[10] ^= kw4r;
433617ae7c7SJussi Kivilinna kw4l ^= kw4r & ~subR[8];
434452ec049SJulia Lawall dw = kw4l & subL[8];
435617ae7c7SJussi Kivilinna kw4r ^= rol32(dw, 1); /* modified for FL(kl1) */
436617ae7c7SJussi Kivilinna /* round 5 */
437617ae7c7SJussi Kivilinna subL[6] ^= kw4l; subR[6] ^= kw4r;
438617ae7c7SJussi Kivilinna /* round 3 */
439617ae7c7SJussi Kivilinna subL[4] ^= kw4l; subR[4] ^= kw4r;
440617ae7c7SJussi Kivilinna /* round 1 */
441617ae7c7SJussi Kivilinna subL[2] ^= kw4l; subR[2] ^= kw4r;
442617ae7c7SJussi Kivilinna /* kw1 */
443617ae7c7SJussi Kivilinna subL[0] ^= kw4l; subR[0] ^= kw4r;
444617ae7c7SJussi Kivilinna
445617ae7c7SJussi Kivilinna /* key XOR is end of F-function */
446617ae7c7SJussi Kivilinna SUBKEY_L(0) = subL[0] ^ subL[2];/* kw1 */
447617ae7c7SJussi Kivilinna SUBKEY_R(0) = subR[0] ^ subR[2];
448617ae7c7SJussi Kivilinna SUBKEY_L(2) = subL[3]; /* round 1 */
449617ae7c7SJussi Kivilinna SUBKEY_R(2) = subR[3];
450617ae7c7SJussi Kivilinna SUBKEY_L(3) = subL[2] ^ subL[4]; /* round 2 */
451617ae7c7SJussi Kivilinna SUBKEY_R(3) = subR[2] ^ subR[4];
452617ae7c7SJussi Kivilinna SUBKEY_L(4) = subL[3] ^ subL[5]; /* round 3 */
453617ae7c7SJussi Kivilinna SUBKEY_R(4) = subR[3] ^ subR[5];
454617ae7c7SJussi Kivilinna SUBKEY_L(5) = subL[4] ^ subL[6]; /* round 4 */
455617ae7c7SJussi Kivilinna SUBKEY_R(5) = subR[4] ^ subR[6];
456617ae7c7SJussi Kivilinna SUBKEY_L(6) = subL[5] ^ subL[7]; /* round 5 */
457617ae7c7SJussi Kivilinna SUBKEY_R(6) = subR[5] ^ subR[7];
458617ae7c7SJussi Kivilinna tl = subL[10] ^ (subR[10] & ~subR[8]);
459452ec049SJulia Lawall dw = tl & subL[8]; /* FL(kl1) */
460617ae7c7SJussi Kivilinna tr = subR[10] ^ rol32(dw, 1);
461617ae7c7SJussi Kivilinna SUBKEY_L(7) = subL[6] ^ tl; /* round 6 */
462617ae7c7SJussi Kivilinna SUBKEY_R(7) = subR[6] ^ tr;
463617ae7c7SJussi Kivilinna SUBKEY_L(8) = subL[8]; /* FL(kl1) */
464617ae7c7SJussi Kivilinna SUBKEY_R(8) = subR[8];
465617ae7c7SJussi Kivilinna SUBKEY_L(9) = subL[9]; /* FLinv(kl2) */
466617ae7c7SJussi Kivilinna SUBKEY_R(9) = subR[9];
467617ae7c7SJussi Kivilinna tl = subL[7] ^ (subR[7] & ~subR[9]);
468452ec049SJulia Lawall dw = tl & subL[9]; /* FLinv(kl2) */
469617ae7c7SJussi Kivilinna tr = subR[7] ^ rol32(dw, 1);
470617ae7c7SJussi Kivilinna SUBKEY_L(10) = tl ^ subL[11]; /* round 7 */
471617ae7c7SJussi Kivilinna SUBKEY_R(10) = tr ^ subR[11];
472617ae7c7SJussi Kivilinna SUBKEY_L(11) = subL[10] ^ subL[12]; /* round 8 */
473617ae7c7SJussi Kivilinna SUBKEY_R(11) = subR[10] ^ subR[12];
474617ae7c7SJussi Kivilinna SUBKEY_L(12) = subL[11] ^ subL[13]; /* round 9 */
475617ae7c7SJussi Kivilinna SUBKEY_R(12) = subR[11] ^ subR[13];
476617ae7c7SJussi Kivilinna SUBKEY_L(13) = subL[12] ^ subL[14]; /* round 10 */
477617ae7c7SJussi Kivilinna SUBKEY_R(13) = subR[12] ^ subR[14];
478617ae7c7SJussi Kivilinna SUBKEY_L(14) = subL[13] ^ subL[15]; /* round 11 */
479617ae7c7SJussi Kivilinna SUBKEY_R(14) = subR[13] ^ subR[15];
480617ae7c7SJussi Kivilinna tl = subL[18] ^ (subR[18] & ~subR[16]);
481452ec049SJulia Lawall dw = tl & subL[16]; /* FL(kl3) */
482617ae7c7SJussi Kivilinna tr = subR[18] ^ rol32(dw, 1);
483617ae7c7SJussi Kivilinna SUBKEY_L(15) = subL[14] ^ tl; /* round 12 */
484617ae7c7SJussi Kivilinna SUBKEY_R(15) = subR[14] ^ tr;
485617ae7c7SJussi Kivilinna SUBKEY_L(16) = subL[16]; /* FL(kl3) */
486617ae7c7SJussi Kivilinna SUBKEY_R(16) = subR[16];
487617ae7c7SJussi Kivilinna SUBKEY_L(17) = subL[17]; /* FLinv(kl4) */
488617ae7c7SJussi Kivilinna SUBKEY_R(17) = subR[17];
489617ae7c7SJussi Kivilinna tl = subL[15] ^ (subR[15] & ~subR[17]);
490452ec049SJulia Lawall dw = tl & subL[17]; /* FLinv(kl4) */
491617ae7c7SJussi Kivilinna tr = subR[15] ^ rol32(dw, 1);
492617ae7c7SJussi Kivilinna SUBKEY_L(18) = tl ^ subL[19]; /* round 13 */
493617ae7c7SJussi Kivilinna SUBKEY_R(18) = tr ^ subR[19];
494617ae7c7SJussi Kivilinna SUBKEY_L(19) = subL[18] ^ subL[20]; /* round 14 */
495617ae7c7SJussi Kivilinna SUBKEY_R(19) = subR[18] ^ subR[20];
496617ae7c7SJussi Kivilinna SUBKEY_L(20) = subL[19] ^ subL[21]; /* round 15 */
497617ae7c7SJussi Kivilinna SUBKEY_R(20) = subR[19] ^ subR[21];
498617ae7c7SJussi Kivilinna SUBKEY_L(21) = subL[20] ^ subL[22]; /* round 16 */
499617ae7c7SJussi Kivilinna SUBKEY_R(21) = subR[20] ^ subR[22];
500617ae7c7SJussi Kivilinna SUBKEY_L(22) = subL[21] ^ subL[23]; /* round 17 */
501617ae7c7SJussi Kivilinna SUBKEY_R(22) = subR[21] ^ subR[23];
502617ae7c7SJussi Kivilinna if (max == 24) {
503617ae7c7SJussi Kivilinna SUBKEY_L(23) = subL[22]; /* round 18 */
504617ae7c7SJussi Kivilinna SUBKEY_R(23) = subR[22];
505617ae7c7SJussi Kivilinna SUBKEY_L(24) = subL[24] ^ subL[23]; /* kw3 */
506617ae7c7SJussi Kivilinna SUBKEY_R(24) = subR[24] ^ subR[23];
507617ae7c7SJussi Kivilinna } else {
508617ae7c7SJussi Kivilinna tl = subL[26] ^ (subR[26] & ~subR[24]);
509452ec049SJulia Lawall dw = tl & subL[24]; /* FL(kl5) */
510617ae7c7SJussi Kivilinna tr = subR[26] ^ rol32(dw, 1);
511617ae7c7SJussi Kivilinna SUBKEY_L(23) = subL[22] ^ tl; /* round 18 */
512617ae7c7SJussi Kivilinna SUBKEY_R(23) = subR[22] ^ tr;
513617ae7c7SJussi Kivilinna SUBKEY_L(24) = subL[24]; /* FL(kl5) */
514617ae7c7SJussi Kivilinna SUBKEY_R(24) = subR[24];
515617ae7c7SJussi Kivilinna SUBKEY_L(25) = subL[25]; /* FLinv(kl6) */
516617ae7c7SJussi Kivilinna SUBKEY_R(25) = subR[25];
517617ae7c7SJussi Kivilinna tl = subL[23] ^ (subR[23] & ~subR[25]);
518452ec049SJulia Lawall dw = tl & subL[25]; /* FLinv(kl6) */
519617ae7c7SJussi Kivilinna tr = subR[23] ^ rol32(dw, 1);
520617ae7c7SJussi Kivilinna SUBKEY_L(26) = tl ^ subL[27]; /* round 19 */
521617ae7c7SJussi Kivilinna SUBKEY_R(26) = tr ^ subR[27];
522617ae7c7SJussi Kivilinna SUBKEY_L(27) = subL[26] ^ subL[28]; /* round 20 */
523617ae7c7SJussi Kivilinna SUBKEY_R(27) = subR[26] ^ subR[28];
524617ae7c7SJussi Kivilinna SUBKEY_L(28) = subL[27] ^ subL[29]; /* round 21 */
525617ae7c7SJussi Kivilinna SUBKEY_R(28) = subR[27] ^ subR[29];
526617ae7c7SJussi Kivilinna SUBKEY_L(29) = subL[28] ^ subL[30]; /* round 22 */
527617ae7c7SJussi Kivilinna SUBKEY_R(29) = subR[28] ^ subR[30];
528617ae7c7SJussi Kivilinna SUBKEY_L(30) = subL[29] ^ subL[31]; /* round 23 */
529617ae7c7SJussi Kivilinna SUBKEY_R(30) = subR[29] ^ subR[31];
530617ae7c7SJussi Kivilinna SUBKEY_L(31) = subL[30]; /* round 24 */
531617ae7c7SJussi Kivilinna SUBKEY_R(31) = subR[30];
532617ae7c7SJussi Kivilinna SUBKEY_L(32) = subL[32] ^ subL[31]; /* kw3 */
533617ae7c7SJussi Kivilinna SUBKEY_R(32) = subR[32] ^ subR[31];
534617ae7c7SJussi Kivilinna }
535617ae7c7SJussi Kivilinna }
536617ae7c7SJussi Kivilinna
camellia_setup128(const unsigned char * key,u32 * subkey)537617ae7c7SJussi Kivilinna static void camellia_setup128(const unsigned char *key, u32 *subkey)
538617ae7c7SJussi Kivilinna {
539617ae7c7SJussi Kivilinna u32 kll, klr, krl, krr;
540617ae7c7SJussi Kivilinna u32 il, ir, t0, t1, w0, w1;
541617ae7c7SJussi Kivilinna u32 subL[26];
542617ae7c7SJussi Kivilinna u32 subR[26];
543617ae7c7SJussi Kivilinna
544617ae7c7SJussi Kivilinna /**
545617ae7c7SJussi Kivilinna * k == kll || klr || krl || krr (|| is concatenation)
546617ae7c7SJussi Kivilinna */
547617ae7c7SJussi Kivilinna kll = get_unaligned_be32(key);
548617ae7c7SJussi Kivilinna klr = get_unaligned_be32(key + 4);
549617ae7c7SJussi Kivilinna krl = get_unaligned_be32(key + 8);
550617ae7c7SJussi Kivilinna krr = get_unaligned_be32(key + 12);
551617ae7c7SJussi Kivilinna
552617ae7c7SJussi Kivilinna /* generate KL dependent subkeys */
553617ae7c7SJussi Kivilinna /* kw1 */
554617ae7c7SJussi Kivilinna subL[0] = kll; subR[0] = klr;
555617ae7c7SJussi Kivilinna /* kw2 */
556617ae7c7SJussi Kivilinna subL[1] = krl; subR[1] = krr;
557617ae7c7SJussi Kivilinna /* rotation left shift 15bit */
558617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 15);
559617ae7c7SJussi Kivilinna /* k3 */
560617ae7c7SJussi Kivilinna subL[4] = kll; subR[4] = klr;
561617ae7c7SJussi Kivilinna /* k4 */
562617ae7c7SJussi Kivilinna subL[5] = krl; subR[5] = krr;
563617ae7c7SJussi Kivilinna /* rotation left shift 15+30bit */
564617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 30);
565617ae7c7SJussi Kivilinna /* k7 */
566617ae7c7SJussi Kivilinna subL[10] = kll; subR[10] = klr;
567617ae7c7SJussi Kivilinna /* k8 */
568617ae7c7SJussi Kivilinna subL[11] = krl; subR[11] = krr;
569617ae7c7SJussi Kivilinna /* rotation left shift 15+30+15bit */
570617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 15);
571617ae7c7SJussi Kivilinna /* k10 */
572617ae7c7SJussi Kivilinna subL[13] = krl; subR[13] = krr;
573617ae7c7SJussi Kivilinna /* rotation left shift 15+30+15+17 bit */
574617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 17);
575617ae7c7SJussi Kivilinna /* kl3 */
576617ae7c7SJussi Kivilinna subL[16] = kll; subR[16] = klr;
577617ae7c7SJussi Kivilinna /* kl4 */
578617ae7c7SJussi Kivilinna subL[17] = krl; subR[17] = krr;
579617ae7c7SJussi Kivilinna /* rotation left shift 15+30+15+17+17 bit */
580617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 17);
581617ae7c7SJussi Kivilinna /* k13 */
582617ae7c7SJussi Kivilinna subL[18] = kll; subR[18] = klr;
583617ae7c7SJussi Kivilinna /* k14 */
584617ae7c7SJussi Kivilinna subL[19] = krl; subR[19] = krr;
585617ae7c7SJussi Kivilinna /* rotation left shift 15+30+15+17+17+17 bit */
586617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 17);
587617ae7c7SJussi Kivilinna /* k17 */
588617ae7c7SJussi Kivilinna subL[22] = kll; subR[22] = klr;
589617ae7c7SJussi Kivilinna /* k18 */
590617ae7c7SJussi Kivilinna subL[23] = krl; subR[23] = krr;
591617ae7c7SJussi Kivilinna
592617ae7c7SJussi Kivilinna /* generate KA */
593617ae7c7SJussi Kivilinna kll = subL[0]; klr = subR[0];
594617ae7c7SJussi Kivilinna krl = subL[1]; krr = subR[1];
595617ae7c7SJussi Kivilinna CAMELLIA_F(kll, klr,
596617ae7c7SJussi Kivilinna CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
597617ae7c7SJussi Kivilinna w0, w1, il, ir, t0, t1);
598617ae7c7SJussi Kivilinna krl ^= w0; krr ^= w1;
599617ae7c7SJussi Kivilinna CAMELLIA_F(krl, krr,
600617ae7c7SJussi Kivilinna CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
601617ae7c7SJussi Kivilinna kll, klr, il, ir, t0, t1);
602617ae7c7SJussi Kivilinna /* current status == (kll, klr, w0, w1) */
603617ae7c7SJussi Kivilinna CAMELLIA_F(kll, klr,
604617ae7c7SJussi Kivilinna CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
605617ae7c7SJussi Kivilinna krl, krr, il, ir, t0, t1);
606617ae7c7SJussi Kivilinna krl ^= w0; krr ^= w1;
607617ae7c7SJussi Kivilinna CAMELLIA_F(krl, krr,
608617ae7c7SJussi Kivilinna CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
609617ae7c7SJussi Kivilinna w0, w1, il, ir, t0, t1);
610617ae7c7SJussi Kivilinna kll ^= w0; klr ^= w1;
611617ae7c7SJussi Kivilinna
612617ae7c7SJussi Kivilinna /* generate KA dependent subkeys */
613617ae7c7SJussi Kivilinna /* k1, k2 */
614617ae7c7SJussi Kivilinna subL[2] = kll; subR[2] = klr;
615617ae7c7SJussi Kivilinna subL[3] = krl; subR[3] = krr;
616617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 15);
617617ae7c7SJussi Kivilinna /* k5,k6 */
618617ae7c7SJussi Kivilinna subL[6] = kll; subR[6] = klr;
619617ae7c7SJussi Kivilinna subL[7] = krl; subR[7] = krr;
620617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 15);
621617ae7c7SJussi Kivilinna /* kl1, kl2 */
622617ae7c7SJussi Kivilinna subL[8] = kll; subR[8] = klr;
623617ae7c7SJussi Kivilinna subL[9] = krl; subR[9] = krr;
624617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 15);
625617ae7c7SJussi Kivilinna /* k9 */
626617ae7c7SJussi Kivilinna subL[12] = kll; subR[12] = klr;
627617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 15);
628617ae7c7SJussi Kivilinna /* k11, k12 */
629617ae7c7SJussi Kivilinna subL[14] = kll; subR[14] = klr;
630617ae7c7SJussi Kivilinna subL[15] = krl; subR[15] = krr;
631617ae7c7SJussi Kivilinna ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
632617ae7c7SJussi Kivilinna /* k15, k16 */
633617ae7c7SJussi Kivilinna subL[20] = kll; subR[20] = klr;
634617ae7c7SJussi Kivilinna subL[21] = krl; subR[21] = krr;
635617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 17);
636617ae7c7SJussi Kivilinna /* kw3, kw4 */
637617ae7c7SJussi Kivilinna subL[24] = kll; subR[24] = klr;
638617ae7c7SJussi Kivilinna subL[25] = krl; subR[25] = krr;
639617ae7c7SJussi Kivilinna
640617ae7c7SJussi Kivilinna camellia_setup_tail(subkey, subL, subR, 24);
641617ae7c7SJussi Kivilinna }
642617ae7c7SJussi Kivilinna
camellia_setup256(const unsigned char * key,u32 * subkey)643617ae7c7SJussi Kivilinna static void camellia_setup256(const unsigned char *key, u32 *subkey)
644617ae7c7SJussi Kivilinna {
645617ae7c7SJussi Kivilinna u32 kll, klr, krl, krr; /* left half of key */
646617ae7c7SJussi Kivilinna u32 krll, krlr, krrl, krrr; /* right half of key */
647617ae7c7SJussi Kivilinna u32 il, ir, t0, t1, w0, w1; /* temporary variables */
648617ae7c7SJussi Kivilinna u32 subL[34];
649617ae7c7SJussi Kivilinna u32 subR[34];
650617ae7c7SJussi Kivilinna
651617ae7c7SJussi Kivilinna /**
652617ae7c7SJussi Kivilinna * key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
653617ae7c7SJussi Kivilinna * (|| is concatenation)
654617ae7c7SJussi Kivilinna */
655617ae7c7SJussi Kivilinna kll = get_unaligned_be32(key);
656617ae7c7SJussi Kivilinna klr = get_unaligned_be32(key + 4);
657617ae7c7SJussi Kivilinna krl = get_unaligned_be32(key + 8);
658617ae7c7SJussi Kivilinna krr = get_unaligned_be32(key + 12);
659617ae7c7SJussi Kivilinna krll = get_unaligned_be32(key + 16);
660617ae7c7SJussi Kivilinna krlr = get_unaligned_be32(key + 20);
661617ae7c7SJussi Kivilinna krrl = get_unaligned_be32(key + 24);
662617ae7c7SJussi Kivilinna krrr = get_unaligned_be32(key + 28);
663617ae7c7SJussi Kivilinna
664617ae7c7SJussi Kivilinna /* generate KL dependent subkeys */
665617ae7c7SJussi Kivilinna /* kw1 */
666617ae7c7SJussi Kivilinna subL[0] = kll; subR[0] = klr;
667617ae7c7SJussi Kivilinna /* kw2 */
668617ae7c7SJussi Kivilinna subL[1] = krl; subR[1] = krr;
669617ae7c7SJussi Kivilinna ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
670617ae7c7SJussi Kivilinna /* k9 */
671617ae7c7SJussi Kivilinna subL[12] = kll; subR[12] = klr;
672617ae7c7SJussi Kivilinna /* k10 */
673617ae7c7SJussi Kivilinna subL[13] = krl; subR[13] = krr;
674617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 15);
675617ae7c7SJussi Kivilinna /* kl3 */
676617ae7c7SJussi Kivilinna subL[16] = kll; subR[16] = klr;
677617ae7c7SJussi Kivilinna /* kl4 */
678617ae7c7SJussi Kivilinna subL[17] = krl; subR[17] = krr;
679617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 17);
680617ae7c7SJussi Kivilinna /* k17 */
681617ae7c7SJussi Kivilinna subL[22] = kll; subR[22] = klr;
682617ae7c7SJussi Kivilinna /* k18 */
683617ae7c7SJussi Kivilinna subL[23] = krl; subR[23] = krr;
684617ae7c7SJussi Kivilinna ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
685617ae7c7SJussi Kivilinna /* k23 */
686617ae7c7SJussi Kivilinna subL[30] = kll; subR[30] = klr;
687617ae7c7SJussi Kivilinna /* k24 */
688617ae7c7SJussi Kivilinna subL[31] = krl; subR[31] = krr;
689617ae7c7SJussi Kivilinna
690617ae7c7SJussi Kivilinna /* generate KR dependent subkeys */
691617ae7c7SJussi Kivilinna ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
692617ae7c7SJussi Kivilinna /* k3 */
693617ae7c7SJussi Kivilinna subL[4] = krll; subR[4] = krlr;
694617ae7c7SJussi Kivilinna /* k4 */
695617ae7c7SJussi Kivilinna subL[5] = krrl; subR[5] = krrr;
696617ae7c7SJussi Kivilinna ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
697617ae7c7SJussi Kivilinna /* kl1 */
698617ae7c7SJussi Kivilinna subL[8] = krll; subR[8] = krlr;
699617ae7c7SJussi Kivilinna /* kl2 */
700617ae7c7SJussi Kivilinna subL[9] = krrl; subR[9] = krrr;
701617ae7c7SJussi Kivilinna ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
702617ae7c7SJussi Kivilinna /* k13 */
703617ae7c7SJussi Kivilinna subL[18] = krll; subR[18] = krlr;
704617ae7c7SJussi Kivilinna /* k14 */
705617ae7c7SJussi Kivilinna subL[19] = krrl; subR[19] = krrr;
706617ae7c7SJussi Kivilinna ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
707617ae7c7SJussi Kivilinna /* k19 */
708617ae7c7SJussi Kivilinna subL[26] = krll; subR[26] = krlr;
709617ae7c7SJussi Kivilinna /* k20 */
710617ae7c7SJussi Kivilinna subL[27] = krrl; subR[27] = krrr;
711617ae7c7SJussi Kivilinna ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
712617ae7c7SJussi Kivilinna
713617ae7c7SJussi Kivilinna /* generate KA */
714617ae7c7SJussi Kivilinna kll = subL[0] ^ krll; klr = subR[0] ^ krlr;
715617ae7c7SJussi Kivilinna krl = subL[1] ^ krrl; krr = subR[1] ^ krrr;
716617ae7c7SJussi Kivilinna CAMELLIA_F(kll, klr,
717617ae7c7SJussi Kivilinna CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
718617ae7c7SJussi Kivilinna w0, w1, il, ir, t0, t1);
719617ae7c7SJussi Kivilinna krl ^= w0; krr ^= w1;
720617ae7c7SJussi Kivilinna CAMELLIA_F(krl, krr,
721617ae7c7SJussi Kivilinna CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
722617ae7c7SJussi Kivilinna kll, klr, il, ir, t0, t1);
723617ae7c7SJussi Kivilinna kll ^= krll; klr ^= krlr;
724617ae7c7SJussi Kivilinna CAMELLIA_F(kll, klr,
725617ae7c7SJussi Kivilinna CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
726617ae7c7SJussi Kivilinna krl, krr, il, ir, t0, t1);
727617ae7c7SJussi Kivilinna krl ^= w0 ^ krrl; krr ^= w1 ^ krrr;
728617ae7c7SJussi Kivilinna CAMELLIA_F(krl, krr,
729617ae7c7SJussi Kivilinna CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
730617ae7c7SJussi Kivilinna w0, w1, il, ir, t0, t1);
731617ae7c7SJussi Kivilinna kll ^= w0; klr ^= w1;
732617ae7c7SJussi Kivilinna
733617ae7c7SJussi Kivilinna /* generate KB */
734617ae7c7SJussi Kivilinna krll ^= kll; krlr ^= klr;
735617ae7c7SJussi Kivilinna krrl ^= krl; krrr ^= krr;
736617ae7c7SJussi Kivilinna CAMELLIA_F(krll, krlr,
737617ae7c7SJussi Kivilinna CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R,
738617ae7c7SJussi Kivilinna w0, w1, il, ir, t0, t1);
739617ae7c7SJussi Kivilinna krrl ^= w0; krrr ^= w1;
740617ae7c7SJussi Kivilinna CAMELLIA_F(krrl, krrr,
741617ae7c7SJussi Kivilinna CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R,
742617ae7c7SJussi Kivilinna w0, w1, il, ir, t0, t1);
743617ae7c7SJussi Kivilinna krll ^= w0; krlr ^= w1;
744617ae7c7SJussi Kivilinna
745617ae7c7SJussi Kivilinna /* generate KA dependent subkeys */
746617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 15);
747617ae7c7SJussi Kivilinna /* k5 */
748617ae7c7SJussi Kivilinna subL[6] = kll; subR[6] = klr;
749617ae7c7SJussi Kivilinna /* k6 */
750617ae7c7SJussi Kivilinna subL[7] = krl; subR[7] = krr;
751617ae7c7SJussi Kivilinna ROLDQ(kll, klr, krl, krr, w0, w1, 30);
752617ae7c7SJussi Kivilinna /* k11 */
753617ae7c7SJussi Kivilinna subL[14] = kll; subR[14] = klr;
754617ae7c7SJussi Kivilinna /* k12 */
755617ae7c7SJussi Kivilinna subL[15] = krl; subR[15] = krr;
756617ae7c7SJussi Kivilinna /* rotation left shift 32bit */
757617ae7c7SJussi Kivilinna /* kl5 */
758617ae7c7SJussi Kivilinna subL[24] = klr; subR[24] = krl;
759617ae7c7SJussi Kivilinna /* kl6 */
760617ae7c7SJussi Kivilinna subL[25] = krr; subR[25] = kll;
761617ae7c7SJussi Kivilinna /* rotation left shift 49 from k11,k12 -> k21,k22 */
762617ae7c7SJussi Kivilinna ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
763617ae7c7SJussi Kivilinna /* k21 */
764617ae7c7SJussi Kivilinna subL[28] = kll; subR[28] = klr;
765617ae7c7SJussi Kivilinna /* k22 */
766617ae7c7SJussi Kivilinna subL[29] = krl; subR[29] = krr;
767617ae7c7SJussi Kivilinna
768617ae7c7SJussi Kivilinna /* generate KB dependent subkeys */
769617ae7c7SJussi Kivilinna /* k1 */
770617ae7c7SJussi Kivilinna subL[2] = krll; subR[2] = krlr;
771617ae7c7SJussi Kivilinna /* k2 */
772617ae7c7SJussi Kivilinna subL[3] = krrl; subR[3] = krrr;
773617ae7c7SJussi Kivilinna ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
774617ae7c7SJussi Kivilinna /* k7 */
775617ae7c7SJussi Kivilinna subL[10] = krll; subR[10] = krlr;
776617ae7c7SJussi Kivilinna /* k8 */
777617ae7c7SJussi Kivilinna subL[11] = krrl; subR[11] = krrr;
778617ae7c7SJussi Kivilinna ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
779617ae7c7SJussi Kivilinna /* k15 */
780617ae7c7SJussi Kivilinna subL[20] = krll; subR[20] = krlr;
781617ae7c7SJussi Kivilinna /* k16 */
782617ae7c7SJussi Kivilinna subL[21] = krrl; subR[21] = krrr;
783617ae7c7SJussi Kivilinna ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
784617ae7c7SJussi Kivilinna /* kw3 */
785617ae7c7SJussi Kivilinna subL[32] = krll; subR[32] = krlr;
786617ae7c7SJussi Kivilinna /* kw4 */
787617ae7c7SJussi Kivilinna subL[33] = krrl; subR[33] = krrr;
788617ae7c7SJussi Kivilinna
789617ae7c7SJussi Kivilinna camellia_setup_tail(subkey, subL, subR, 32);
790617ae7c7SJussi Kivilinna }
791617ae7c7SJussi Kivilinna
camellia_setup192(const unsigned char * key,u32 * subkey)792617ae7c7SJussi Kivilinna static void camellia_setup192(const unsigned char *key, u32 *subkey)
793617ae7c7SJussi Kivilinna {
794617ae7c7SJussi Kivilinna unsigned char kk[32];
795617ae7c7SJussi Kivilinna u32 krll, krlr, krrl, krrr;
796617ae7c7SJussi Kivilinna
797617ae7c7SJussi Kivilinna memcpy(kk, key, 24);
798617ae7c7SJussi Kivilinna memcpy((unsigned char *)&krll, key+16, 4);
799617ae7c7SJussi Kivilinna memcpy((unsigned char *)&krlr, key+20, 4);
800617ae7c7SJussi Kivilinna krrl = ~krll;
801617ae7c7SJussi Kivilinna krrr = ~krlr;
802617ae7c7SJussi Kivilinna memcpy(kk+24, (unsigned char *)&krrl, 4);
803617ae7c7SJussi Kivilinna memcpy(kk+28, (unsigned char *)&krrr, 4);
804617ae7c7SJussi Kivilinna camellia_setup256(kk, subkey);
805617ae7c7SJussi Kivilinna }
806617ae7c7SJussi Kivilinna
807617ae7c7SJussi Kivilinna
808617ae7c7SJussi Kivilinna /*
809617ae7c7SJussi Kivilinna * Encrypt/decrypt
810617ae7c7SJussi Kivilinna */
811617ae7c7SJussi Kivilinna #define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) ({ \
812617ae7c7SJussi Kivilinna t0 = kll; \
813617ae7c7SJussi Kivilinna t2 = krr; \
814617ae7c7SJussi Kivilinna t0 &= ll; \
815617ae7c7SJussi Kivilinna t2 |= rr; \
816617ae7c7SJussi Kivilinna rl ^= t2; \
817617ae7c7SJussi Kivilinna lr ^= rol32(t0, 1); \
818617ae7c7SJussi Kivilinna t3 = krl; \
819617ae7c7SJussi Kivilinna t1 = klr; \
820617ae7c7SJussi Kivilinna t3 &= rl; \
821617ae7c7SJussi Kivilinna t1 |= lr; \
822617ae7c7SJussi Kivilinna ll ^= t1; \
823617ae7c7SJussi Kivilinna rr ^= rol32(t3, 1); \
824617ae7c7SJussi Kivilinna })
825617ae7c7SJussi Kivilinna
826617ae7c7SJussi Kivilinna #define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir) ({ \
827617ae7c7SJussi Kivilinna yl ^= kl; \
828617ae7c7SJussi Kivilinna yr ^= kr; \
829617ae7c7SJussi Kivilinna ir = camellia_sp1110[(u8)xr]; \
830617ae7c7SJussi Kivilinna il = camellia_sp1110[(u8)(xl >> 24)]; \
831617ae7c7SJussi Kivilinna ir ^= camellia_sp0222[(u8)(xr >> 24)]; \
832617ae7c7SJussi Kivilinna il ^= camellia_sp0222[(u8)(xl >> 16)]; \
833617ae7c7SJussi Kivilinna ir ^= camellia_sp3033[(u8)(xr >> 16)]; \
834617ae7c7SJussi Kivilinna il ^= camellia_sp3033[(u8)(xl >> 8)]; \
835617ae7c7SJussi Kivilinna ir ^= camellia_sp4404[(u8)(xr >> 8)]; \
836617ae7c7SJussi Kivilinna il ^= camellia_sp4404[(u8)xl]; \
837617ae7c7SJussi Kivilinna ir ^= il; \
838617ae7c7SJussi Kivilinna yl ^= ir; \
839617ae7c7SJussi Kivilinna yr ^= ror32(il, 8) ^ ir; \
840617ae7c7SJussi Kivilinna })
841617ae7c7SJussi Kivilinna
842617ae7c7SJussi Kivilinna /* max = 24: 128bit encrypt, max = 32: 256bit encrypt */
camellia_do_encrypt(const u32 * subkey,u32 * io,unsigned max)843617ae7c7SJussi Kivilinna static void camellia_do_encrypt(const u32 *subkey, u32 *io, unsigned max)
844617ae7c7SJussi Kivilinna {
845617ae7c7SJussi Kivilinna u32 il, ir, t0, t1; /* temporary variables */
846617ae7c7SJussi Kivilinna
847617ae7c7SJussi Kivilinna /* pre whitening but absorb kw2 */
848617ae7c7SJussi Kivilinna io[0] ^= SUBKEY_L(0);
849617ae7c7SJussi Kivilinna io[1] ^= SUBKEY_R(0);
850617ae7c7SJussi Kivilinna
851617ae7c7SJussi Kivilinna /* main iteration */
852617ae7c7SJussi Kivilinna #define ROUNDS(i) ({ \
853617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[0], io[1], \
854617ae7c7SJussi Kivilinna SUBKEY_L(i + 2), SUBKEY_R(i + 2), \
855617ae7c7SJussi Kivilinna io[2], io[3], il, ir); \
856617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[2], io[3], \
857617ae7c7SJussi Kivilinna SUBKEY_L(i + 3), SUBKEY_R(i + 3), \
858617ae7c7SJussi Kivilinna io[0], io[1], il, ir); \
859617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[0], io[1], \
860617ae7c7SJussi Kivilinna SUBKEY_L(i + 4), SUBKEY_R(i + 4), \
861617ae7c7SJussi Kivilinna io[2], io[3], il, ir); \
862617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[2], io[3], \
863617ae7c7SJussi Kivilinna SUBKEY_L(i + 5), SUBKEY_R(i + 5), \
864617ae7c7SJussi Kivilinna io[0], io[1], il, ir); \
865617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[0], io[1], \
866617ae7c7SJussi Kivilinna SUBKEY_L(i + 6), SUBKEY_R(i + 6), \
867617ae7c7SJussi Kivilinna io[2], io[3], il, ir); \
868617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[2], io[3], \
869617ae7c7SJussi Kivilinna SUBKEY_L(i + 7), SUBKEY_R(i + 7), \
870617ae7c7SJussi Kivilinna io[0], io[1], il, ir); \
871617ae7c7SJussi Kivilinna })
872617ae7c7SJussi Kivilinna #define FLS(i) ({ \
873617ae7c7SJussi Kivilinna CAMELLIA_FLS(io[0], io[1], io[2], io[3], \
874617ae7c7SJussi Kivilinna SUBKEY_L(i + 0), SUBKEY_R(i + 0), \
875617ae7c7SJussi Kivilinna SUBKEY_L(i + 1), SUBKEY_R(i + 1), \
876617ae7c7SJussi Kivilinna t0, t1, il, ir); \
877617ae7c7SJussi Kivilinna })
878617ae7c7SJussi Kivilinna
879617ae7c7SJussi Kivilinna ROUNDS(0);
880617ae7c7SJussi Kivilinna FLS(8);
881617ae7c7SJussi Kivilinna ROUNDS(8);
882617ae7c7SJussi Kivilinna FLS(16);
883617ae7c7SJussi Kivilinna ROUNDS(16);
884617ae7c7SJussi Kivilinna if (max == 32) {
885617ae7c7SJussi Kivilinna FLS(24);
886617ae7c7SJussi Kivilinna ROUNDS(24);
887617ae7c7SJussi Kivilinna }
888617ae7c7SJussi Kivilinna
889617ae7c7SJussi Kivilinna #undef ROUNDS
890617ae7c7SJussi Kivilinna #undef FLS
891617ae7c7SJussi Kivilinna
892617ae7c7SJussi Kivilinna /* post whitening but kw4 */
893617ae7c7SJussi Kivilinna io[2] ^= SUBKEY_L(max);
894617ae7c7SJussi Kivilinna io[3] ^= SUBKEY_R(max);
895617ae7c7SJussi Kivilinna /* NB: io[0],[1] should be swapped with [2],[3] by caller! */
896617ae7c7SJussi Kivilinna }
897617ae7c7SJussi Kivilinna
camellia_do_decrypt(const u32 * subkey,u32 * io,unsigned i)898617ae7c7SJussi Kivilinna static void camellia_do_decrypt(const u32 *subkey, u32 *io, unsigned i)
899617ae7c7SJussi Kivilinna {
900617ae7c7SJussi Kivilinna u32 il, ir, t0, t1; /* temporary variables */
901617ae7c7SJussi Kivilinna
902617ae7c7SJussi Kivilinna /* pre whitening but absorb kw2 */
903617ae7c7SJussi Kivilinna io[0] ^= SUBKEY_L(i);
904617ae7c7SJussi Kivilinna io[1] ^= SUBKEY_R(i);
905617ae7c7SJussi Kivilinna
906617ae7c7SJussi Kivilinna /* main iteration */
907617ae7c7SJussi Kivilinna #define ROUNDS(i) ({ \
908617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[0], io[1], \
909617ae7c7SJussi Kivilinna SUBKEY_L(i + 7), SUBKEY_R(i + 7), \
910617ae7c7SJussi Kivilinna io[2], io[3], il, ir); \
911617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[2], io[3], \
912617ae7c7SJussi Kivilinna SUBKEY_L(i + 6), SUBKEY_R(i + 6), \
913617ae7c7SJussi Kivilinna io[0], io[1], il, ir); \
914617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[0], io[1], \
915617ae7c7SJussi Kivilinna SUBKEY_L(i + 5), SUBKEY_R(i + 5), \
916617ae7c7SJussi Kivilinna io[2], io[3], il, ir); \
917617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[2], io[3], \
918617ae7c7SJussi Kivilinna SUBKEY_L(i + 4), SUBKEY_R(i + 4), \
919617ae7c7SJussi Kivilinna io[0], io[1], il, ir); \
920617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[0], io[1], \
921617ae7c7SJussi Kivilinna SUBKEY_L(i + 3), SUBKEY_R(i + 3), \
922617ae7c7SJussi Kivilinna io[2], io[3], il, ir); \
923617ae7c7SJussi Kivilinna CAMELLIA_ROUNDSM(io[2], io[3], \
924617ae7c7SJussi Kivilinna SUBKEY_L(i + 2), SUBKEY_R(i + 2), \
925617ae7c7SJussi Kivilinna io[0], io[1], il, ir); \
926617ae7c7SJussi Kivilinna })
927617ae7c7SJussi Kivilinna #define FLS(i) ({ \
928617ae7c7SJussi Kivilinna CAMELLIA_FLS(io[0], io[1], io[2], io[3], \
929617ae7c7SJussi Kivilinna SUBKEY_L(i + 1), SUBKEY_R(i + 1), \
930617ae7c7SJussi Kivilinna SUBKEY_L(i + 0), SUBKEY_R(i + 0), \
931617ae7c7SJussi Kivilinna t0, t1, il, ir); \
932617ae7c7SJussi Kivilinna })
933617ae7c7SJussi Kivilinna
934617ae7c7SJussi Kivilinna if (i == 32) {
935617ae7c7SJussi Kivilinna ROUNDS(24);
936617ae7c7SJussi Kivilinna FLS(24);
937617ae7c7SJussi Kivilinna }
938617ae7c7SJussi Kivilinna ROUNDS(16);
939617ae7c7SJussi Kivilinna FLS(16);
940617ae7c7SJussi Kivilinna ROUNDS(8);
941617ae7c7SJussi Kivilinna FLS(8);
942617ae7c7SJussi Kivilinna ROUNDS(0);
943617ae7c7SJussi Kivilinna
944617ae7c7SJussi Kivilinna #undef ROUNDS
945617ae7c7SJussi Kivilinna #undef FLS
946617ae7c7SJussi Kivilinna
947617ae7c7SJussi Kivilinna /* post whitening but kw4 */
948617ae7c7SJussi Kivilinna io[2] ^= SUBKEY_L(0);
949617ae7c7SJussi Kivilinna io[3] ^= SUBKEY_R(0);
950617ae7c7SJussi Kivilinna /* NB: 0,1 should be swapped with 2,3 by caller! */
951617ae7c7SJussi Kivilinna }
952617ae7c7SJussi Kivilinna
953617ae7c7SJussi Kivilinna
954617ae7c7SJussi Kivilinna struct camellia_ctx {
955617ae7c7SJussi Kivilinna int key_length;
956617ae7c7SJussi Kivilinna u32 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u32)];
957617ae7c7SJussi Kivilinna };
958617ae7c7SJussi Kivilinna
959617ae7c7SJussi Kivilinna static int
camellia_set_key(struct crypto_tfm * tfm,const u8 * in_key,unsigned int key_len)960617ae7c7SJussi Kivilinna camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key,
961617ae7c7SJussi Kivilinna unsigned int key_len)
962617ae7c7SJussi Kivilinna {
963617ae7c7SJussi Kivilinna struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
964617ae7c7SJussi Kivilinna const unsigned char *key = (const unsigned char *)in_key;
965617ae7c7SJussi Kivilinna
966674f368aSEric Biggers if (key_len != 16 && key_len != 24 && key_len != 32)
967617ae7c7SJussi Kivilinna return -EINVAL;
968617ae7c7SJussi Kivilinna
969617ae7c7SJussi Kivilinna cctx->key_length = key_len;
970617ae7c7SJussi Kivilinna
971617ae7c7SJussi Kivilinna switch (key_len) {
972617ae7c7SJussi Kivilinna case 16:
973617ae7c7SJussi Kivilinna camellia_setup128(key, cctx->key_table);
974617ae7c7SJussi Kivilinna break;
975617ae7c7SJussi Kivilinna case 24:
976617ae7c7SJussi Kivilinna camellia_setup192(key, cctx->key_table);
977617ae7c7SJussi Kivilinna break;
978617ae7c7SJussi Kivilinna case 32:
979617ae7c7SJussi Kivilinna camellia_setup256(key, cctx->key_table);
980617ae7c7SJussi Kivilinna break;
981617ae7c7SJussi Kivilinna }
982617ae7c7SJussi Kivilinna
983617ae7c7SJussi Kivilinna return 0;
984617ae7c7SJussi Kivilinna }
985617ae7c7SJussi Kivilinna
camellia_encrypt(struct crypto_tfm * tfm,u8 * out,const u8 * in)986617ae7c7SJussi Kivilinna static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
987617ae7c7SJussi Kivilinna {
988617ae7c7SJussi Kivilinna const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
989617ae7c7SJussi Kivilinna unsigned int max;
990617ae7c7SJussi Kivilinna
991617ae7c7SJussi Kivilinna u32 tmp[4];
992617ae7c7SJussi Kivilinna
99383385415SArd Biesheuvel tmp[0] = get_unaligned_be32(in);
99483385415SArd Biesheuvel tmp[1] = get_unaligned_be32(in + 4);
99583385415SArd Biesheuvel tmp[2] = get_unaligned_be32(in + 8);
99683385415SArd Biesheuvel tmp[3] = get_unaligned_be32(in + 12);
997617ae7c7SJussi Kivilinna
998617ae7c7SJussi Kivilinna if (cctx->key_length == 16)
999617ae7c7SJussi Kivilinna max = 24;
1000617ae7c7SJussi Kivilinna else
1001617ae7c7SJussi Kivilinna max = 32; /* for key lengths of 24 and 32 */
1002617ae7c7SJussi Kivilinna
1003617ae7c7SJussi Kivilinna camellia_do_encrypt(cctx->key_table, tmp, max);
1004617ae7c7SJussi Kivilinna
1005617ae7c7SJussi Kivilinna /* do_encrypt returns 0,1 swapped with 2,3 */
100683385415SArd Biesheuvel put_unaligned_be32(tmp[2], out);
100783385415SArd Biesheuvel put_unaligned_be32(tmp[3], out + 4);
100883385415SArd Biesheuvel put_unaligned_be32(tmp[0], out + 8);
100983385415SArd Biesheuvel put_unaligned_be32(tmp[1], out + 12);
1010617ae7c7SJussi Kivilinna }
1011617ae7c7SJussi Kivilinna
camellia_decrypt(struct crypto_tfm * tfm,u8 * out,const u8 * in)1012617ae7c7SJussi Kivilinna static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1013617ae7c7SJussi Kivilinna {
1014617ae7c7SJussi Kivilinna const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1015617ae7c7SJussi Kivilinna unsigned int max;
1016617ae7c7SJussi Kivilinna
1017617ae7c7SJussi Kivilinna u32 tmp[4];
1018617ae7c7SJussi Kivilinna
101983385415SArd Biesheuvel tmp[0] = get_unaligned_be32(in);
102083385415SArd Biesheuvel tmp[1] = get_unaligned_be32(in + 4);
102183385415SArd Biesheuvel tmp[2] = get_unaligned_be32(in + 8);
102283385415SArd Biesheuvel tmp[3] = get_unaligned_be32(in + 12);
1023617ae7c7SJussi Kivilinna
1024617ae7c7SJussi Kivilinna if (cctx->key_length == 16)
1025617ae7c7SJussi Kivilinna max = 24;
1026617ae7c7SJussi Kivilinna else
1027617ae7c7SJussi Kivilinna max = 32; /* for key lengths of 24 and 32 */
1028617ae7c7SJussi Kivilinna
1029617ae7c7SJussi Kivilinna camellia_do_decrypt(cctx->key_table, tmp, max);
1030617ae7c7SJussi Kivilinna
1031617ae7c7SJussi Kivilinna /* do_decrypt returns 0,1 swapped with 2,3 */
103283385415SArd Biesheuvel put_unaligned_be32(tmp[2], out);
103383385415SArd Biesheuvel put_unaligned_be32(tmp[3], out + 4);
103483385415SArd Biesheuvel put_unaligned_be32(tmp[0], out + 8);
103583385415SArd Biesheuvel put_unaligned_be32(tmp[1], out + 12);
1036617ae7c7SJussi Kivilinna }
1037617ae7c7SJussi Kivilinna
1038617ae7c7SJussi Kivilinna static struct crypto_alg camellia_alg = {
1039617ae7c7SJussi Kivilinna .cra_name = "camellia",
1040617ae7c7SJussi Kivilinna .cra_driver_name = "camellia-generic",
1041617ae7c7SJussi Kivilinna .cra_priority = 100,
1042617ae7c7SJussi Kivilinna .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
1043617ae7c7SJussi Kivilinna .cra_blocksize = CAMELLIA_BLOCK_SIZE,
1044617ae7c7SJussi Kivilinna .cra_ctxsize = sizeof(struct camellia_ctx),
1045617ae7c7SJussi Kivilinna .cra_module = THIS_MODULE,
1046617ae7c7SJussi Kivilinna .cra_u = {
1047617ae7c7SJussi Kivilinna .cipher = {
1048617ae7c7SJussi Kivilinna .cia_min_keysize = CAMELLIA_MIN_KEY_SIZE,
1049617ae7c7SJussi Kivilinna .cia_max_keysize = CAMELLIA_MAX_KEY_SIZE,
1050617ae7c7SJussi Kivilinna .cia_setkey = camellia_set_key,
1051617ae7c7SJussi Kivilinna .cia_encrypt = camellia_encrypt,
1052617ae7c7SJussi Kivilinna .cia_decrypt = camellia_decrypt
1053617ae7c7SJussi Kivilinna }
1054617ae7c7SJussi Kivilinna }
1055617ae7c7SJussi Kivilinna };
1056617ae7c7SJussi Kivilinna
camellia_init(void)1057617ae7c7SJussi Kivilinna static int __init camellia_init(void)
1058617ae7c7SJussi Kivilinna {
1059617ae7c7SJussi Kivilinna return crypto_register_alg(&camellia_alg);
1060617ae7c7SJussi Kivilinna }
1061617ae7c7SJussi Kivilinna
camellia_fini(void)1062617ae7c7SJussi Kivilinna static void __exit camellia_fini(void)
1063617ae7c7SJussi Kivilinna {
1064617ae7c7SJussi Kivilinna crypto_unregister_alg(&camellia_alg);
1065617ae7c7SJussi Kivilinna }
1066617ae7c7SJussi Kivilinna
1067c4741b23SEric Biggers subsys_initcall(camellia_init);
1068617ae7c7SJussi Kivilinna module_exit(camellia_fini);
1069617ae7c7SJussi Kivilinna
1070617ae7c7SJussi Kivilinna MODULE_DESCRIPTION("Camellia Cipher Algorithm");
1071617ae7c7SJussi Kivilinna MODULE_LICENSE("GPL");
10725d26a105SKees Cook MODULE_ALIAS_CRYPTO("camellia");
10733e14dcf7SMathias Krause MODULE_ALIAS_CRYPTO("camellia-generic");
1074