Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/crypto/aria.h
26282 views
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 <[email protected]>
9
* Copyright (c) 2022 Taehee Yoo <[email protected]>
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
459
460