Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[linux-2.6-microblaze.git] / include / crypto / aria.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Cryptographic API.
4  *
5  * ARIA Cipher Algorithm.
6  *
7  * Documentation of ARIA can be found in RFC 5794.
8  * Copyright (c) 2022 Taehee Yoo <ap420073@gmail.com>
9  * Copyright (c) 2022 Taehee Yoo <ap420073@gmail.com>
10  *
11  * Information for ARIA
12  *     http://210.104.33.10/ARIA/index-e.html (English)
13  *     http://seed.kisa.or.kr/ (Korean)
14  *
15  * Public domain version is distributed above.
16  */
17
18 #ifndef _CRYPTO_ARIA_H
19 #define _CRYPTO_ARIA_H
20
21 #include <crypto/algapi.h>
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/types.h>
25 #include <linux/errno.h>
26 #include <asm/byteorder.h>
27
28 #define ARIA_MIN_KEY_SIZE       16
29 #define ARIA_MAX_KEY_SIZE       32
30 #define ARIA_BLOCK_SIZE         16
31 #define ARIA_MAX_RD_KEYS        17
32 #define ARIA_RD_KEY_WORDS       (ARIA_BLOCK_SIZE / sizeof(u32))
33
34 struct aria_ctx {
35         u32 enc_key[ARIA_MAX_RD_KEYS][ARIA_RD_KEY_WORDS];
36         u32 dec_key[ARIA_MAX_RD_KEYS][ARIA_RD_KEY_WORDS];
37         int rounds;
38         int key_length;
39 };
40
41 static const u32 s1[256] = {
42         0x00636363, 0x007c7c7c, 0x00777777, 0x007b7b7b,
43         0x00f2f2f2, 0x006b6b6b, 0x006f6f6f, 0x00c5c5c5,
44         0x00303030, 0x00010101, 0x00676767, 0x002b2b2b,
45         0x00fefefe, 0x00d7d7d7, 0x00ababab, 0x00767676,
46         0x00cacaca, 0x00828282, 0x00c9c9c9, 0x007d7d7d,
47         0x00fafafa, 0x00595959, 0x00474747, 0x00f0f0f0,
48         0x00adadad, 0x00d4d4d4, 0x00a2a2a2, 0x00afafaf,
49         0x009c9c9c, 0x00a4a4a4, 0x00727272, 0x00c0c0c0,
50         0x00b7b7b7, 0x00fdfdfd, 0x00939393, 0x00262626,
51         0x00363636, 0x003f3f3f, 0x00f7f7f7, 0x00cccccc,
52         0x00343434, 0x00a5a5a5, 0x00e5e5e5, 0x00f1f1f1,
53         0x00717171, 0x00d8d8d8, 0x00313131, 0x00151515,
54         0x00040404, 0x00c7c7c7, 0x00232323, 0x00c3c3c3,
55         0x00181818, 0x00969696, 0x00050505, 0x009a9a9a,
56         0x00070707, 0x00121212, 0x00808080, 0x00e2e2e2,
57         0x00ebebeb, 0x00272727, 0x00b2b2b2, 0x00757575,
58         0x00090909, 0x00838383, 0x002c2c2c, 0x001a1a1a,
59         0x001b1b1b, 0x006e6e6e, 0x005a5a5a, 0x00a0a0a0,
60         0x00525252, 0x003b3b3b, 0x00d6d6d6, 0x00b3b3b3,
61         0x00292929, 0x00e3e3e3, 0x002f2f2f, 0x00848484,
62         0x00535353, 0x00d1d1d1, 0x00000000, 0x00ededed,
63         0x00202020, 0x00fcfcfc, 0x00b1b1b1, 0x005b5b5b,
64         0x006a6a6a, 0x00cbcbcb, 0x00bebebe, 0x00393939,
65         0x004a4a4a, 0x004c4c4c, 0x00585858, 0x00cfcfcf,
66         0x00d0d0d0, 0x00efefef, 0x00aaaaaa, 0x00fbfbfb,
67         0x00434343, 0x004d4d4d, 0x00333333, 0x00858585,
68         0x00454545, 0x00f9f9f9, 0x00020202, 0x007f7f7f,
69         0x00505050, 0x003c3c3c, 0x009f9f9f, 0x00a8a8a8,
70         0x00515151, 0x00a3a3a3, 0x00404040, 0x008f8f8f,
71         0x00929292, 0x009d9d9d, 0x00383838, 0x00f5f5f5,
72         0x00bcbcbc, 0x00b6b6b6, 0x00dadada, 0x00212121,
73         0x00101010, 0x00ffffff, 0x00f3f3f3, 0x00d2d2d2,
74         0x00cdcdcd, 0x000c0c0c, 0x00131313, 0x00ececec,
75         0x005f5f5f, 0x00979797, 0x00444444, 0x00171717,
76         0x00c4c4c4, 0x00a7a7a7, 0x007e7e7e, 0x003d3d3d,
77         0x00646464, 0x005d5d5d, 0x00191919, 0x00737373,
78         0x00606060, 0x00818181, 0x004f4f4f, 0x00dcdcdc,
79         0x00222222, 0x002a2a2a, 0x00909090, 0x00888888,
80         0x00464646, 0x00eeeeee, 0x00b8b8b8, 0x00141414,
81         0x00dedede, 0x005e5e5e, 0x000b0b0b, 0x00dbdbdb,
82         0x00e0e0e0, 0x00323232, 0x003a3a3a, 0x000a0a0a,
83         0x00494949, 0x00060606, 0x00242424, 0x005c5c5c,
84         0x00c2c2c2, 0x00d3d3d3, 0x00acacac, 0x00626262,
85         0x00919191, 0x00959595, 0x00e4e4e4, 0x00797979,
86         0x00e7e7e7, 0x00c8c8c8, 0x00373737, 0x006d6d6d,
87         0x008d8d8d, 0x00d5d5d5, 0x004e4e4e, 0x00a9a9a9,
88         0x006c6c6c, 0x00565656, 0x00f4f4f4, 0x00eaeaea,
89         0x00656565, 0x007a7a7a, 0x00aeaeae, 0x00080808,
90         0x00bababa, 0x00787878, 0x00252525, 0x002e2e2e,
91         0x001c1c1c, 0x00a6a6a6, 0x00b4b4b4, 0x00c6c6c6,
92         0x00e8e8e8, 0x00dddddd, 0x00747474, 0x001f1f1f,
93         0x004b4b4b, 0x00bdbdbd, 0x008b8b8b, 0x008a8a8a,
94         0x00707070, 0x003e3e3e, 0x00b5b5b5, 0x00666666,
95         0x00484848, 0x00030303, 0x00f6f6f6, 0x000e0e0e,
96         0x00616161, 0x00353535, 0x00575757, 0x00b9b9b9,
97         0x00868686, 0x00c1c1c1, 0x001d1d1d, 0x009e9e9e,
98         0x00e1e1e1, 0x00f8f8f8, 0x00989898, 0x00111111,
99         0x00696969, 0x00d9d9d9, 0x008e8e8e, 0x00949494,
100         0x009b9b9b, 0x001e1e1e, 0x00878787, 0x00e9e9e9,
101         0x00cecece, 0x00555555, 0x00282828, 0x00dfdfdf,
102         0x008c8c8c, 0x00a1a1a1, 0x00898989, 0x000d0d0d,
103         0x00bfbfbf, 0x00e6e6e6, 0x00424242, 0x00686868,
104         0x00414141, 0x00999999, 0x002d2d2d, 0x000f0f0f,
105         0x00b0b0b0, 0x00545454, 0x00bbbbbb, 0x00161616
106 };
107
108 static const u32 s2[256] = {
109         0xe200e2e2, 0x4e004e4e, 0x54005454, 0xfc00fcfc,
110         0x94009494, 0xc200c2c2, 0x4a004a4a, 0xcc00cccc,
111         0x62006262, 0x0d000d0d, 0x6a006a6a, 0x46004646,
112         0x3c003c3c, 0x4d004d4d, 0x8b008b8b, 0xd100d1d1,
113         0x5e005e5e, 0xfa00fafa, 0x64006464, 0xcb00cbcb,
114         0xb400b4b4, 0x97009797, 0xbe00bebe, 0x2b002b2b,
115         0xbc00bcbc, 0x77007777, 0x2e002e2e, 0x03000303,
116         0xd300d3d3, 0x19001919, 0x59005959, 0xc100c1c1,
117         0x1d001d1d, 0x06000606, 0x41004141, 0x6b006b6b,
118         0x55005555, 0xf000f0f0, 0x99009999, 0x69006969,
119         0xea00eaea, 0x9c009c9c, 0x18001818, 0xae00aeae,
120         0x63006363, 0xdf00dfdf, 0xe700e7e7, 0xbb00bbbb,
121         0x00000000, 0x73007373, 0x66006666, 0xfb00fbfb,
122         0x96009696, 0x4c004c4c, 0x85008585, 0xe400e4e4,
123         0x3a003a3a, 0x09000909, 0x45004545, 0xaa00aaaa,
124         0x0f000f0f, 0xee00eeee, 0x10001010, 0xeb00ebeb,
125         0x2d002d2d, 0x7f007f7f, 0xf400f4f4, 0x29002929,
126         0xac00acac, 0xcf00cfcf, 0xad00adad, 0x91009191,
127         0x8d008d8d, 0x78007878, 0xc800c8c8, 0x95009595,
128         0xf900f9f9, 0x2f002f2f, 0xce00cece, 0xcd00cdcd,
129         0x08000808, 0x7a007a7a, 0x88008888, 0x38003838,
130         0x5c005c5c, 0x83008383, 0x2a002a2a, 0x28002828,
131         0x47004747, 0xdb00dbdb, 0xb800b8b8, 0xc700c7c7,
132         0x93009393, 0xa400a4a4, 0x12001212, 0x53005353,
133         0xff00ffff, 0x87008787, 0x0e000e0e, 0x31003131,
134         0x36003636, 0x21002121, 0x58005858, 0x48004848,
135         0x01000101, 0x8e008e8e, 0x37003737, 0x74007474,
136         0x32003232, 0xca00caca, 0xe900e9e9, 0xb100b1b1,
137         0xb700b7b7, 0xab00abab, 0x0c000c0c, 0xd700d7d7,
138         0xc400c4c4, 0x56005656, 0x42004242, 0x26002626,
139         0x07000707, 0x98009898, 0x60006060, 0xd900d9d9,
140         0xb600b6b6, 0xb900b9b9, 0x11001111, 0x40004040,
141         0xec00ecec, 0x20002020, 0x8c008c8c, 0xbd00bdbd,
142         0xa000a0a0, 0xc900c9c9, 0x84008484, 0x04000404,
143         0x49004949, 0x23002323, 0xf100f1f1, 0x4f004f4f,
144         0x50005050, 0x1f001f1f, 0x13001313, 0xdc00dcdc,
145         0xd800d8d8, 0xc000c0c0, 0x9e009e9e, 0x57005757,
146         0xe300e3e3, 0xc300c3c3, 0x7b007b7b, 0x65006565,
147         0x3b003b3b, 0x02000202, 0x8f008f8f, 0x3e003e3e,
148         0xe800e8e8, 0x25002525, 0x92009292, 0xe500e5e5,
149         0x15001515, 0xdd00dddd, 0xfd00fdfd, 0x17001717,
150         0xa900a9a9, 0xbf00bfbf, 0xd400d4d4, 0x9a009a9a,
151         0x7e007e7e, 0xc500c5c5, 0x39003939, 0x67006767,
152         0xfe00fefe, 0x76007676, 0x9d009d9d, 0x43004343,
153         0xa700a7a7, 0xe100e1e1, 0xd000d0d0, 0xf500f5f5,
154         0x68006868, 0xf200f2f2, 0x1b001b1b, 0x34003434,
155         0x70007070, 0x05000505, 0xa300a3a3, 0x8a008a8a,
156         0xd500d5d5, 0x79007979, 0x86008686, 0xa800a8a8,
157         0x30003030, 0xc600c6c6, 0x51005151, 0x4b004b4b,
158         0x1e001e1e, 0xa600a6a6, 0x27002727, 0xf600f6f6,
159         0x35003535, 0xd200d2d2, 0x6e006e6e, 0x24002424,
160         0x16001616, 0x82008282, 0x5f005f5f, 0xda00dada,
161         0xe600e6e6, 0x75007575, 0xa200a2a2, 0xef00efef,
162         0x2c002c2c, 0xb200b2b2, 0x1c001c1c, 0x9f009f9f,
163         0x5d005d5d, 0x6f006f6f, 0x80008080, 0x0a000a0a,
164         0x72007272, 0x44004444, 0x9b009b9b, 0x6c006c6c,
165         0x90009090, 0x0b000b0b, 0x5b005b5b, 0x33003333,
166         0x7d007d7d, 0x5a005a5a, 0x52005252, 0xf300f3f3,
167         0x61006161, 0xa100a1a1, 0xf700f7f7, 0xb000b0b0,
168         0xd600d6d6, 0x3f003f3f, 0x7c007c7c, 0x6d006d6d,
169         0xed00eded, 0x14001414, 0xe000e0e0, 0xa500a5a5,
170         0x3d003d3d, 0x22002222, 0xb300b3b3, 0xf800f8f8,
171         0x89008989, 0xde00dede, 0x71007171, 0x1a001a1a,
172         0xaf00afaf, 0xba00baba, 0xb500b5b5, 0x81008181
173 };
174
175 static const u32 x1[256] = {
176         0x52520052, 0x09090009, 0x6a6a006a, 0xd5d500d5,
177         0x30300030, 0x36360036, 0xa5a500a5, 0x38380038,
178         0xbfbf00bf, 0x40400040, 0xa3a300a3, 0x9e9e009e,
179         0x81810081, 0xf3f300f3, 0xd7d700d7, 0xfbfb00fb,
180         0x7c7c007c, 0xe3e300e3, 0x39390039, 0x82820082,
181         0x9b9b009b, 0x2f2f002f, 0xffff00ff, 0x87870087,
182         0x34340034, 0x8e8e008e, 0x43430043, 0x44440044,
183         0xc4c400c4, 0xdede00de, 0xe9e900e9, 0xcbcb00cb,
184         0x54540054, 0x7b7b007b, 0x94940094, 0x32320032,
185         0xa6a600a6, 0xc2c200c2, 0x23230023, 0x3d3d003d,
186         0xeeee00ee, 0x4c4c004c, 0x95950095, 0x0b0b000b,
187         0x42420042, 0xfafa00fa, 0xc3c300c3, 0x4e4e004e,
188         0x08080008, 0x2e2e002e, 0xa1a100a1, 0x66660066,
189         0x28280028, 0xd9d900d9, 0x24240024, 0xb2b200b2,
190         0x76760076, 0x5b5b005b, 0xa2a200a2, 0x49490049,
191         0x6d6d006d, 0x8b8b008b, 0xd1d100d1, 0x25250025,
192         0x72720072, 0xf8f800f8, 0xf6f600f6, 0x64640064,
193         0x86860086, 0x68680068, 0x98980098, 0x16160016,
194         0xd4d400d4, 0xa4a400a4, 0x5c5c005c, 0xcccc00cc,
195         0x5d5d005d, 0x65650065, 0xb6b600b6, 0x92920092,
196         0x6c6c006c, 0x70700070, 0x48480048, 0x50500050,
197         0xfdfd00fd, 0xeded00ed, 0xb9b900b9, 0xdada00da,
198         0x5e5e005e, 0x15150015, 0x46460046, 0x57570057,
199         0xa7a700a7, 0x8d8d008d, 0x9d9d009d, 0x84840084,
200         0x90900090, 0xd8d800d8, 0xabab00ab, 0x00000000,
201         0x8c8c008c, 0xbcbc00bc, 0xd3d300d3, 0x0a0a000a,
202         0xf7f700f7, 0xe4e400e4, 0x58580058, 0x05050005,
203         0xb8b800b8, 0xb3b300b3, 0x45450045, 0x06060006,
204         0xd0d000d0, 0x2c2c002c, 0x1e1e001e, 0x8f8f008f,
205         0xcaca00ca, 0x3f3f003f, 0x0f0f000f, 0x02020002,
206         0xc1c100c1, 0xafaf00af, 0xbdbd00bd, 0x03030003,
207         0x01010001, 0x13130013, 0x8a8a008a, 0x6b6b006b,
208         0x3a3a003a, 0x91910091, 0x11110011, 0x41410041,
209         0x4f4f004f, 0x67670067, 0xdcdc00dc, 0xeaea00ea,
210         0x97970097, 0xf2f200f2, 0xcfcf00cf, 0xcece00ce,
211         0xf0f000f0, 0xb4b400b4, 0xe6e600e6, 0x73730073,
212         0x96960096, 0xacac00ac, 0x74740074, 0x22220022,
213         0xe7e700e7, 0xadad00ad, 0x35350035, 0x85850085,
214         0xe2e200e2, 0xf9f900f9, 0x37370037, 0xe8e800e8,
215         0x1c1c001c, 0x75750075, 0xdfdf00df, 0x6e6e006e,
216         0x47470047, 0xf1f100f1, 0x1a1a001a, 0x71710071,
217         0x1d1d001d, 0x29290029, 0xc5c500c5, 0x89890089,
218         0x6f6f006f, 0xb7b700b7, 0x62620062, 0x0e0e000e,
219         0xaaaa00aa, 0x18180018, 0xbebe00be, 0x1b1b001b,
220         0xfcfc00fc, 0x56560056, 0x3e3e003e, 0x4b4b004b,
221         0xc6c600c6, 0xd2d200d2, 0x79790079, 0x20200020,
222         0x9a9a009a, 0xdbdb00db, 0xc0c000c0, 0xfefe00fe,
223         0x78780078, 0xcdcd00cd, 0x5a5a005a, 0xf4f400f4,
224         0x1f1f001f, 0xdddd00dd, 0xa8a800a8, 0x33330033,
225         0x88880088, 0x07070007, 0xc7c700c7, 0x31310031,
226         0xb1b100b1, 0x12120012, 0x10100010, 0x59590059,
227         0x27270027, 0x80800080, 0xecec00ec, 0x5f5f005f,
228         0x60600060, 0x51510051, 0x7f7f007f, 0xa9a900a9,
229         0x19190019, 0xb5b500b5, 0x4a4a004a, 0x0d0d000d,
230         0x2d2d002d, 0xe5e500e5, 0x7a7a007a, 0x9f9f009f,
231         0x93930093, 0xc9c900c9, 0x9c9c009c, 0xefef00ef,
232         0xa0a000a0, 0xe0e000e0, 0x3b3b003b, 0x4d4d004d,
233         0xaeae00ae, 0x2a2a002a, 0xf5f500f5, 0xb0b000b0,
234         0xc8c800c8, 0xebeb00eb, 0xbbbb00bb, 0x3c3c003c,
235         0x83830083, 0x53530053, 0x99990099, 0x61610061,
236         0x17170017, 0x2b2b002b, 0x04040004, 0x7e7e007e,
237         0xbaba00ba, 0x77770077, 0xd6d600d6, 0x26260026,
238         0xe1e100e1, 0x69690069, 0x14140014, 0x63630063,
239         0x55550055, 0x21210021, 0x0c0c000c, 0x7d7d007d
240 };
241
242 static const u32 x2[256] = {
243         0x30303000, 0x68686800, 0x99999900, 0x1b1b1b00,
244         0x87878700, 0xb9b9b900, 0x21212100, 0x78787800,
245         0x50505000, 0x39393900, 0xdbdbdb00, 0xe1e1e100,
246         0x72727200, 0x09090900, 0x62626200, 0x3c3c3c00,
247         0x3e3e3e00, 0x7e7e7e00, 0x5e5e5e00, 0x8e8e8e00,
248         0xf1f1f100, 0xa0a0a000, 0xcccccc00, 0xa3a3a300,
249         0x2a2a2a00, 0x1d1d1d00, 0xfbfbfb00, 0xb6b6b600,
250         0xd6d6d600, 0x20202000, 0xc4c4c400, 0x8d8d8d00,
251         0x81818100, 0x65656500, 0xf5f5f500, 0x89898900,
252         0xcbcbcb00, 0x9d9d9d00, 0x77777700, 0xc6c6c600,
253         0x57575700, 0x43434300, 0x56565600, 0x17171700,
254         0xd4d4d400, 0x40404000, 0x1a1a1a00, 0x4d4d4d00,
255         0xc0c0c000, 0x63636300, 0x6c6c6c00, 0xe3e3e300,
256         0xb7b7b700, 0xc8c8c800, 0x64646400, 0x6a6a6a00,
257         0x53535300, 0xaaaaaa00, 0x38383800, 0x98989800,
258         0x0c0c0c00, 0xf4f4f400, 0x9b9b9b00, 0xededed00,
259         0x7f7f7f00, 0x22222200, 0x76767600, 0xafafaf00,
260         0xdddddd00, 0x3a3a3a00, 0x0b0b0b00, 0x58585800,
261         0x67676700, 0x88888800, 0x06060600, 0xc3c3c300,
262         0x35353500, 0x0d0d0d00, 0x01010100, 0x8b8b8b00,
263         0x8c8c8c00, 0xc2c2c200, 0xe6e6e600, 0x5f5f5f00,
264         0x02020200, 0x24242400, 0x75757500, 0x93939300,
265         0x66666600, 0x1e1e1e00, 0xe5e5e500, 0xe2e2e200,
266         0x54545400, 0xd8d8d800, 0x10101000, 0xcecece00,
267         0x7a7a7a00, 0xe8e8e800, 0x08080800, 0x2c2c2c00,
268         0x12121200, 0x97979700, 0x32323200, 0xababab00,
269         0xb4b4b400, 0x27272700, 0x0a0a0a00, 0x23232300,
270         0xdfdfdf00, 0xefefef00, 0xcacaca00, 0xd9d9d900,
271         0xb8b8b800, 0xfafafa00, 0xdcdcdc00, 0x31313100,
272         0x6b6b6b00, 0xd1d1d100, 0xadadad00, 0x19191900,
273         0x49494900, 0xbdbdbd00, 0x51515100, 0x96969600,
274         0xeeeeee00, 0xe4e4e400, 0xa8a8a800, 0x41414100,
275         0xdadada00, 0xffffff00, 0xcdcdcd00, 0x55555500,
276         0x86868600, 0x36363600, 0xbebebe00, 0x61616100,
277         0x52525200, 0xf8f8f800, 0xbbbbbb00, 0x0e0e0e00,
278         0x82828200, 0x48484800, 0x69696900, 0x9a9a9a00,
279         0xe0e0e000, 0x47474700, 0x9e9e9e00, 0x5c5c5c00,
280         0x04040400, 0x4b4b4b00, 0x34343400, 0x15151500,
281         0x79797900, 0x26262600, 0xa7a7a700, 0xdedede00,
282         0x29292900, 0xaeaeae00, 0x92929200, 0xd7d7d700,
283         0x84848400, 0xe9e9e900, 0xd2d2d200, 0xbababa00,
284         0x5d5d5d00, 0xf3f3f300, 0xc5c5c500, 0xb0b0b000,
285         0xbfbfbf00, 0xa4a4a400, 0x3b3b3b00, 0x71717100,
286         0x44444400, 0x46464600, 0x2b2b2b00, 0xfcfcfc00,
287         0xebebeb00, 0x6f6f6f00, 0xd5d5d500, 0xf6f6f600,
288         0x14141400, 0xfefefe00, 0x7c7c7c00, 0x70707000,
289         0x5a5a5a00, 0x7d7d7d00, 0xfdfdfd00, 0x2f2f2f00,
290         0x18181800, 0x83838300, 0x16161600, 0xa5a5a500,
291         0x91919100, 0x1f1f1f00, 0x05050500, 0x95959500,
292         0x74747400, 0xa9a9a900, 0xc1c1c100, 0x5b5b5b00,
293         0x4a4a4a00, 0x85858500, 0x6d6d6d00, 0x13131300,
294         0x07070700, 0x4f4f4f00, 0x4e4e4e00, 0x45454500,
295         0xb2b2b200, 0x0f0f0f00, 0xc9c9c900, 0x1c1c1c00,
296         0xa6a6a600, 0xbcbcbc00, 0xececec00, 0x73737300,
297         0x90909000, 0x7b7b7b00, 0xcfcfcf00, 0x59595900,
298         0x8f8f8f00, 0xa1a1a100, 0xf9f9f900, 0x2d2d2d00,
299         0xf2f2f200, 0xb1b1b100, 0x00000000, 0x94949400,
300         0x37373700, 0x9f9f9f00, 0xd0d0d000, 0x2e2e2e00,
301         0x9c9c9c00, 0x6e6e6e00, 0x28282800, 0x3f3f3f00,
302         0x80808000, 0xf0f0f000, 0x3d3d3d00, 0xd3d3d300,
303         0x25252500, 0x8a8a8a00, 0xb5b5b500, 0xe7e7e700,
304         0x42424200, 0xb3b3b300, 0xc7c7c700, 0xeaeaea00,
305         0xf7f7f700, 0x4c4c4c00, 0x11111100, 0x33333300,
306         0x03030300, 0xa2a2a200, 0xacacac00, 0x60606000
307 };
308
309 static inline u32 rotl32(u32 v, u32 r)
310 {
311         return ((v << r) | (v >> (32 - r)));
312 }
313
314 static inline u32 rotr32(u32 v, u32 r)
315 {
316         return ((v >> r) | (v << (32 - r)));
317 }
318
319 static inline u32 bswap32(u32 v)
320 {
321         return ((v << 24) ^
322                 (v >> 24) ^
323                 ((v & 0x0000ff00) << 8) ^
324                 ((v & 0x00ff0000) >> 8));
325 }
326
327 static inline u8 get_u8(u32 x, u32 y)
328 {
329         return (x >> ((3 - y) * 8));
330 }
331
332 static inline u32 make_u32(u8 v0, u8 v1, u8 v2, u8 v3)
333 {
334         return ((u32)v0 << 24) | ((u32)v1 << 16) | ((u32)v2 <<  8) | ((u32)v3);
335 }
336
337 static inline u32 aria_m(u32 t0)
338 {
339         return rotr32(t0, 8) ^ rotr32(t0 ^ rotr32(t0, 8), 16);
340 }
341
342 /* S-Box Layer 1 + M */
343 static inline void aria_sbox_layer1_with_pre_diff(u32 *t0, u32 *t1, u32 *t2,
344                                                   u32 *t3)
345 {
346         *t0 = s1[get_u8(*t0, 0)] ^
347               s2[get_u8(*t0, 1)] ^
348               x1[get_u8(*t0, 2)] ^
349               x2[get_u8(*t0, 3)];
350         *t1 = s1[get_u8(*t1, 0)] ^
351               s2[get_u8(*t1, 1)] ^
352               x1[get_u8(*t1, 2)] ^
353               x2[get_u8(*t1, 3)];
354         *t2 = s1[get_u8(*t2, 0)] ^
355               s2[get_u8(*t2, 1)] ^
356               x1[get_u8(*t2, 2)] ^
357               x2[get_u8(*t2, 3)];
358         *t3 = s1[get_u8(*t3, 0)] ^
359               s2[get_u8(*t3, 1)] ^
360               x1[get_u8(*t3, 2)] ^
361               x2[get_u8(*t3, 3)];
362 }
363
364 /* S-Box Layer 2 + M */
365 static inline void aria_sbox_layer2_with_pre_diff(u32 *t0, u32 *t1, u32 *t2,
366                                                   u32 *t3)
367 {
368         *t0 = x1[get_u8(*t0, 0)] ^
369               x2[get_u8(*t0, 1)] ^
370               s1[get_u8(*t0, 2)] ^
371               s2[get_u8(*t0, 3)];
372         *t1 = x1[get_u8(*t1, 0)] ^
373               x2[get_u8(*t1, 1)] ^
374               s1[get_u8(*t1, 2)] ^
375               s2[get_u8(*t1, 3)];
376         *t2 = x1[get_u8(*t2, 0)] ^
377               x2[get_u8(*t2, 1)] ^
378               s1[get_u8(*t2, 2)] ^
379               s2[get_u8(*t2, 3)];
380         *t3 = x1[get_u8(*t3, 0)] ^
381               x2[get_u8(*t3, 1)] ^
382               s1[get_u8(*t3, 2)] ^
383               s2[get_u8(*t3, 3)];
384 }
385
386 /* Word-level diffusion */
387 static inline void aria_diff_word(u32 *t0, u32 *t1, u32 *t2, u32 *t3)
388 {
389         *t1 ^= *t2;
390         *t2 ^= *t3;
391         *t0 ^= *t1;
392
393         *t3 ^= *t1;
394         *t2 ^= *t0;
395         *t1 ^= *t2;
396 }
397
398 /* Byte-level diffusion */
399 static inline void aria_diff_byte(u32 *t1, u32 *t2, u32 *t3)
400 {
401         *t1 = ((*t1 << 8) & 0xff00ff00) ^ ((*t1 >> 8) & 0x00ff00ff);
402         *t2 = rotr32(*t2, 16);
403         *t3 = bswap32(*t3);
404 }
405
406 /* Key XOR Layer */
407 static inline void aria_add_round_key(u32 *rk, u32 *t0, u32 *t1, u32 *t2,
408                                       u32 *t3)
409 {
410         *t0 ^= rk[0];
411         *t1 ^= rk[1];
412         *t2 ^= rk[2];
413         *t3 ^= rk[3];
414 }
415 /* Odd round Substitution & Diffusion */
416 static inline void aria_subst_diff_odd(u32 *t0, u32 *t1, u32 *t2, u32 *t3)
417 {
418         aria_sbox_layer1_with_pre_diff(t0, t1, t2, t3);
419         aria_diff_word(t0, t1, t2, t3);
420         aria_diff_byte(t1, t2, t3);
421         aria_diff_word(t0, t1, t2, t3);
422 }
423
424 /* Even round Substitution & Diffusion */
425 static inline void aria_subst_diff_even(u32 *t0, u32 *t1, u32 *t2, u32 *t3)
426 {
427         aria_sbox_layer2_with_pre_diff(t0, t1, t2, t3);
428         aria_diff_word(t0, t1, t2, t3);
429         aria_diff_byte(t3, t0, t1);
430         aria_diff_word(t0, t1, t2, t3);
431 }
432
433 /* Q, R Macro expanded ARIA GSRK */
434 static inline void aria_gsrk(u32 *rk, u32 *x, u32 *y, u32 n)
435 {
436         int q = 4 - (n / 32);
437         int r = n % 32;
438
439         rk[0] = (x[0]) ^
440                 ((y[q % 4]) >> r) ^
441                 ((y[(q + 3) % 4]) << (32 - r));
442         rk[1] = (x[1]) ^
443                 ((y[(q + 1) % 4]) >> r) ^
444                 ((y[q % 4]) << (32 - r));
445         rk[2] = (x[2]) ^
446                 ((y[(q + 2) % 4]) >> r) ^
447                 ((y[(q + 1) % 4]) << (32 - r));
448         rk[3] = (x[3]) ^
449                 ((y[(q + 3) % 4]) >> r) ^
450                 ((y[(q + 2) % 4]) << (32 - r));
451 }
452
453 void aria_encrypt(void *ctx, u8 *out, const u8 *in);
454 void aria_decrypt(void *ctx, u8 *out, const u8 *in);
455 int aria_set_key(struct crypto_tfm *tfm, const u8 *in_key,
456                  unsigned int key_len);
457
458 #endif