~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/crypto/camellia_generic.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
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 
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 
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 
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 */
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 
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
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 
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 
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 
1057 static int __init camellia_init(void)
1058 {
1059         return crypto_register_alg(&camellia_alg);
1060 }
1061 
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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php