Coverage Report

Created: 2025-12-10 06:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl/crypto/aria/aria.c
Line
Count
Source
1
/*
2
 * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved.
3
 * Copyright (c) 2017, Oracle and/or its affiliates.  All rights reserved.
4
 *
5
 * Licensed under the Apache License 2.0 (the "License").  You may not use
6
 * this file except in compliance with the License.  You can obtain a copy
7
 * in the file LICENSE in the source distribution or at
8
 * https://www.openssl.org/source/license.html
9
 */
10
11
/*
12
 * Copyright (C) 2017 National Security Research Institute. All Rights Reserved.
13
 *
14
 * Information for ARIA
15
 *     http://210.104.33.10/ARIA/index-e.html (English)
16
 *     http://seed.kisa.or.kr/ (Korean)
17
 *
18
 * Public domain version is distributed above.
19
 */
20
21
#include <openssl/e_os2.h>
22
#include "crypto/aria.h"
23
24
#include <assert.h>
25
#include <string.h>
26
27
#ifndef OPENSSL_SMALL_FOOTPRINT
28
29
/* Begin macro */
30
31
/* rotation */
32
#define rotl32(v, r) (((uint32_t)(v) << (r)) | ((uint32_t)(v) >> (32 - r)))
33
0
#define rotr32(v, r) (((uint32_t)(v) >> (r)) | ((uint32_t)(v) << (32 - r)))
34
35
#define bswap32(v) \
36
0
    (((v) << 24) ^ ((v) >> 24) ^ (((v) & 0x0000ff00) << 8) ^ (((v) & 0x00ff0000) >> 8))
37
38
0
#define GET_U8_BE(X, Y) ((uint8_t)((X) >> ((3 - Y) * 8)))
39
0
#define GET_U32_BE(X, Y) ( \
40
0
    ((uint32_t)((const uint8_t *)(X))[Y * 4] << 24) ^ ((uint32_t)((const uint8_t *)(X))[Y * 4 + 1] << 16) ^ ((uint32_t)((const uint8_t *)(X))[Y * 4 + 2] << 8) ^ ((uint32_t)((const uint8_t *)(X))[Y * 4 + 3]))
41
42
#define PUT_U32_BE(DEST, IDX, VAL)                            \
43
0
    do {                                                      \
44
0
        ((uint8_t *)(DEST))[IDX * 4] = GET_U8_BE(VAL, 0);     \
45
0
        ((uint8_t *)(DEST))[IDX * 4 + 1] = GET_U8_BE(VAL, 1); \
46
0
        ((uint8_t *)(DEST))[IDX * 4 + 2] = GET_U8_BE(VAL, 2); \
47
0
        ((uint8_t *)(DEST))[IDX * 4 + 3] = GET_U8_BE(VAL, 3); \
48
0
    } while (0)
49
50
0
#define MAKE_U32(V0, V1, V2, V3) ( \
51
0
    ((uint32_t)((uint8_t)(V0)) << 24) | ((uint32_t)((uint8_t)(V1)) << 16) | ((uint32_t)((uint8_t)(V2)) << 8) | ((uint32_t)((uint8_t)(V3))))
52
53
/* End Macro*/
54
55
/* Key Constant
56
 * 128bit : 0, 1,    2
57
 * 192bit : 1, 2,    3(0)
58
 * 256bit : 2, 3(0), 4(1)
59
 */
60
static const uint32_t Key_RC[5][4] = {
61
    { 0x517cc1b7, 0x27220a94, 0xfe13abe8, 0xfa9a6ee0 },
62
    { 0x6db14acc, 0x9e21c820, 0xff28b1d5, 0xef5de2b0 },
63
    { 0xdb92371d, 0x2126e970, 0x03249775, 0x04e8c90e },
64
    { 0x517cc1b7, 0x27220a94, 0xfe13abe8, 0xfa9a6ee0 },
65
    { 0x6db14acc, 0x9e21c820, 0xff28b1d5, 0xef5de2b0 }
66
};
67
68
/* 32bit expanded s-box */
69
static const uint32_t S1[256] = {
70
    0x00636363, 0x007c7c7c, 0x00777777, 0x007b7b7b,
71
    0x00f2f2f2, 0x006b6b6b, 0x006f6f6f, 0x00c5c5c5,
72
    0x00303030, 0x00010101, 0x00676767, 0x002b2b2b,
73
    0x00fefefe, 0x00d7d7d7, 0x00ababab, 0x00767676,
74
    0x00cacaca, 0x00828282, 0x00c9c9c9, 0x007d7d7d,
75
    0x00fafafa, 0x00595959, 0x00474747, 0x00f0f0f0,
76
    0x00adadad, 0x00d4d4d4, 0x00a2a2a2, 0x00afafaf,
77
    0x009c9c9c, 0x00a4a4a4, 0x00727272, 0x00c0c0c0,
78
    0x00b7b7b7, 0x00fdfdfd, 0x00939393, 0x00262626,
79
    0x00363636, 0x003f3f3f, 0x00f7f7f7, 0x00cccccc,
80
    0x00343434, 0x00a5a5a5, 0x00e5e5e5, 0x00f1f1f1,
81
    0x00717171, 0x00d8d8d8, 0x00313131, 0x00151515,
82
    0x00040404, 0x00c7c7c7, 0x00232323, 0x00c3c3c3,
83
    0x00181818, 0x00969696, 0x00050505, 0x009a9a9a,
84
    0x00070707, 0x00121212, 0x00808080, 0x00e2e2e2,
85
    0x00ebebeb, 0x00272727, 0x00b2b2b2, 0x00757575,
86
    0x00090909, 0x00838383, 0x002c2c2c, 0x001a1a1a,
87
    0x001b1b1b, 0x006e6e6e, 0x005a5a5a, 0x00a0a0a0,
88
    0x00525252, 0x003b3b3b, 0x00d6d6d6, 0x00b3b3b3,
89
    0x00292929, 0x00e3e3e3, 0x002f2f2f, 0x00848484,
90
    0x00535353, 0x00d1d1d1, 0x00000000, 0x00ededed,
91
    0x00202020, 0x00fcfcfc, 0x00b1b1b1, 0x005b5b5b,
92
    0x006a6a6a, 0x00cbcbcb, 0x00bebebe, 0x00393939,
93
    0x004a4a4a, 0x004c4c4c, 0x00585858, 0x00cfcfcf,
94
    0x00d0d0d0, 0x00efefef, 0x00aaaaaa, 0x00fbfbfb,
95
    0x00434343, 0x004d4d4d, 0x00333333, 0x00858585,
96
    0x00454545, 0x00f9f9f9, 0x00020202, 0x007f7f7f,
97
    0x00505050, 0x003c3c3c, 0x009f9f9f, 0x00a8a8a8,
98
    0x00515151, 0x00a3a3a3, 0x00404040, 0x008f8f8f,
99
    0x00929292, 0x009d9d9d, 0x00383838, 0x00f5f5f5,
100
    0x00bcbcbc, 0x00b6b6b6, 0x00dadada, 0x00212121,
101
    0x00101010, 0x00ffffff, 0x00f3f3f3, 0x00d2d2d2,
102
    0x00cdcdcd, 0x000c0c0c, 0x00131313, 0x00ececec,
103
    0x005f5f5f, 0x00979797, 0x00444444, 0x00171717,
104
    0x00c4c4c4, 0x00a7a7a7, 0x007e7e7e, 0x003d3d3d,
105
    0x00646464, 0x005d5d5d, 0x00191919, 0x00737373,
106
    0x00606060, 0x00818181, 0x004f4f4f, 0x00dcdcdc,
107
    0x00222222, 0x002a2a2a, 0x00909090, 0x00888888,
108
    0x00464646, 0x00eeeeee, 0x00b8b8b8, 0x00141414,
109
    0x00dedede, 0x005e5e5e, 0x000b0b0b, 0x00dbdbdb,
110
    0x00e0e0e0, 0x00323232, 0x003a3a3a, 0x000a0a0a,
111
    0x00494949, 0x00060606, 0x00242424, 0x005c5c5c,
112
    0x00c2c2c2, 0x00d3d3d3, 0x00acacac, 0x00626262,
113
    0x00919191, 0x00959595, 0x00e4e4e4, 0x00797979,
114
    0x00e7e7e7, 0x00c8c8c8, 0x00373737, 0x006d6d6d,
115
    0x008d8d8d, 0x00d5d5d5, 0x004e4e4e, 0x00a9a9a9,
116
    0x006c6c6c, 0x00565656, 0x00f4f4f4, 0x00eaeaea,
117
    0x00656565, 0x007a7a7a, 0x00aeaeae, 0x00080808,
118
    0x00bababa, 0x00787878, 0x00252525, 0x002e2e2e,
119
    0x001c1c1c, 0x00a6a6a6, 0x00b4b4b4, 0x00c6c6c6,
120
    0x00e8e8e8, 0x00dddddd, 0x00747474, 0x001f1f1f,
121
    0x004b4b4b, 0x00bdbdbd, 0x008b8b8b, 0x008a8a8a,
122
    0x00707070, 0x003e3e3e, 0x00b5b5b5, 0x00666666,
123
    0x00484848, 0x00030303, 0x00f6f6f6, 0x000e0e0e,
124
    0x00616161, 0x00353535, 0x00575757, 0x00b9b9b9,
125
    0x00868686, 0x00c1c1c1, 0x001d1d1d, 0x009e9e9e,
126
    0x00e1e1e1, 0x00f8f8f8, 0x00989898, 0x00111111,
127
    0x00696969, 0x00d9d9d9, 0x008e8e8e, 0x00949494,
128
    0x009b9b9b, 0x001e1e1e, 0x00878787, 0x00e9e9e9,
129
    0x00cecece, 0x00555555, 0x00282828, 0x00dfdfdf,
130
    0x008c8c8c, 0x00a1a1a1, 0x00898989, 0x000d0d0d,
131
    0x00bfbfbf, 0x00e6e6e6, 0x00424242, 0x00686868,
132
    0x00414141, 0x00999999, 0x002d2d2d, 0x000f0f0f,
133
    0x00b0b0b0, 0x00545454, 0x00bbbbbb, 0x00161616
134
};
135
136
static const uint32_t S2[256] = {
137
    0xe200e2e2, 0x4e004e4e, 0x54005454, 0xfc00fcfc,
138
    0x94009494, 0xc200c2c2, 0x4a004a4a, 0xcc00cccc,
139
    0x62006262, 0x0d000d0d, 0x6a006a6a, 0x46004646,
140
    0x3c003c3c, 0x4d004d4d, 0x8b008b8b, 0xd100d1d1,
141
    0x5e005e5e, 0xfa00fafa, 0x64006464, 0xcb00cbcb,
142
    0xb400b4b4, 0x97009797, 0xbe00bebe, 0x2b002b2b,
143
    0xbc00bcbc, 0x77007777, 0x2e002e2e, 0x03000303,
144
    0xd300d3d3, 0x19001919, 0x59005959, 0xc100c1c1,
145
    0x1d001d1d, 0x06000606, 0x41004141, 0x6b006b6b,
146
    0x55005555, 0xf000f0f0, 0x99009999, 0x69006969,
147
    0xea00eaea, 0x9c009c9c, 0x18001818, 0xae00aeae,
148
    0x63006363, 0xdf00dfdf, 0xe700e7e7, 0xbb00bbbb,
149
    0x00000000, 0x73007373, 0x66006666, 0xfb00fbfb,
150
    0x96009696, 0x4c004c4c, 0x85008585, 0xe400e4e4,
151
    0x3a003a3a, 0x09000909, 0x45004545, 0xaa00aaaa,
152
    0x0f000f0f, 0xee00eeee, 0x10001010, 0xeb00ebeb,
153
    0x2d002d2d, 0x7f007f7f, 0xf400f4f4, 0x29002929,
154
    0xac00acac, 0xcf00cfcf, 0xad00adad, 0x91009191,
155
    0x8d008d8d, 0x78007878, 0xc800c8c8, 0x95009595,
156
    0xf900f9f9, 0x2f002f2f, 0xce00cece, 0xcd00cdcd,
157
    0x08000808, 0x7a007a7a, 0x88008888, 0x38003838,
158
    0x5c005c5c, 0x83008383, 0x2a002a2a, 0x28002828,
159
    0x47004747, 0xdb00dbdb, 0xb800b8b8, 0xc700c7c7,
160
    0x93009393, 0xa400a4a4, 0x12001212, 0x53005353,
161
    0xff00ffff, 0x87008787, 0x0e000e0e, 0x31003131,
162
    0x36003636, 0x21002121, 0x58005858, 0x48004848,
163
    0x01000101, 0x8e008e8e, 0x37003737, 0x74007474,
164
    0x32003232, 0xca00caca, 0xe900e9e9, 0xb100b1b1,
165
    0xb700b7b7, 0xab00abab, 0x0c000c0c, 0xd700d7d7,
166
    0xc400c4c4, 0x56005656, 0x42004242, 0x26002626,
167
    0x07000707, 0x98009898, 0x60006060, 0xd900d9d9,
168
    0xb600b6b6, 0xb900b9b9, 0x11001111, 0x40004040,
169
    0xec00ecec, 0x20002020, 0x8c008c8c, 0xbd00bdbd,
170
    0xa000a0a0, 0xc900c9c9, 0x84008484, 0x04000404,
171
    0x49004949, 0x23002323, 0xf100f1f1, 0x4f004f4f,
172
    0x50005050, 0x1f001f1f, 0x13001313, 0xdc00dcdc,
173
    0xd800d8d8, 0xc000c0c0, 0x9e009e9e, 0x57005757,
174
    0xe300e3e3, 0xc300c3c3, 0x7b007b7b, 0x65006565,
175
    0x3b003b3b, 0x02000202, 0x8f008f8f, 0x3e003e3e,
176
    0xe800e8e8, 0x25002525, 0x92009292, 0xe500e5e5,
177
    0x15001515, 0xdd00dddd, 0xfd00fdfd, 0x17001717,
178
    0xa900a9a9, 0xbf00bfbf, 0xd400d4d4, 0x9a009a9a,
179
    0x7e007e7e, 0xc500c5c5, 0x39003939, 0x67006767,
180
    0xfe00fefe, 0x76007676, 0x9d009d9d, 0x43004343,
181
    0xa700a7a7, 0xe100e1e1, 0xd000d0d0, 0xf500f5f5,
182
    0x68006868, 0xf200f2f2, 0x1b001b1b, 0x34003434,
183
    0x70007070, 0x05000505, 0xa300a3a3, 0x8a008a8a,
184
    0xd500d5d5, 0x79007979, 0x86008686, 0xa800a8a8,
185
    0x30003030, 0xc600c6c6, 0x51005151, 0x4b004b4b,
186
    0x1e001e1e, 0xa600a6a6, 0x27002727, 0xf600f6f6,
187
    0x35003535, 0xd200d2d2, 0x6e006e6e, 0x24002424,
188
    0x16001616, 0x82008282, 0x5f005f5f, 0xda00dada,
189
    0xe600e6e6, 0x75007575, 0xa200a2a2, 0xef00efef,
190
    0x2c002c2c, 0xb200b2b2, 0x1c001c1c, 0x9f009f9f,
191
    0x5d005d5d, 0x6f006f6f, 0x80008080, 0x0a000a0a,
192
    0x72007272, 0x44004444, 0x9b009b9b, 0x6c006c6c,
193
    0x90009090, 0x0b000b0b, 0x5b005b5b, 0x33003333,
194
    0x7d007d7d, 0x5a005a5a, 0x52005252, 0xf300f3f3,
195
    0x61006161, 0xa100a1a1, 0xf700f7f7, 0xb000b0b0,
196
    0xd600d6d6, 0x3f003f3f, 0x7c007c7c, 0x6d006d6d,
197
    0xed00eded, 0x14001414, 0xe000e0e0, 0xa500a5a5,
198
    0x3d003d3d, 0x22002222, 0xb300b3b3, 0xf800f8f8,
199
    0x89008989, 0xde00dede, 0x71007171, 0x1a001a1a,
200
    0xaf00afaf, 0xba00baba, 0xb500b5b5, 0x81008181
201
};
202
203
static const uint32_t X1[256] = {
204
    0x52520052, 0x09090009, 0x6a6a006a, 0xd5d500d5,
205
    0x30300030, 0x36360036, 0xa5a500a5, 0x38380038,
206
    0xbfbf00bf, 0x40400040, 0xa3a300a3, 0x9e9e009e,
207
    0x81810081, 0xf3f300f3, 0xd7d700d7, 0xfbfb00fb,
208
    0x7c7c007c, 0xe3e300e3, 0x39390039, 0x82820082,
209
    0x9b9b009b, 0x2f2f002f, 0xffff00ff, 0x87870087,
210
    0x34340034, 0x8e8e008e, 0x43430043, 0x44440044,
211
    0xc4c400c4, 0xdede00de, 0xe9e900e9, 0xcbcb00cb,
212
    0x54540054, 0x7b7b007b, 0x94940094, 0x32320032,
213
    0xa6a600a6, 0xc2c200c2, 0x23230023, 0x3d3d003d,
214
    0xeeee00ee, 0x4c4c004c, 0x95950095, 0x0b0b000b,
215
    0x42420042, 0xfafa00fa, 0xc3c300c3, 0x4e4e004e,
216
    0x08080008, 0x2e2e002e, 0xa1a100a1, 0x66660066,
217
    0x28280028, 0xd9d900d9, 0x24240024, 0xb2b200b2,
218
    0x76760076, 0x5b5b005b, 0xa2a200a2, 0x49490049,
219
    0x6d6d006d, 0x8b8b008b, 0xd1d100d1, 0x25250025,
220
    0x72720072, 0xf8f800f8, 0xf6f600f6, 0x64640064,
221
    0x86860086, 0x68680068, 0x98980098, 0x16160016,
222
    0xd4d400d4, 0xa4a400a4, 0x5c5c005c, 0xcccc00cc,
223
    0x5d5d005d, 0x65650065, 0xb6b600b6, 0x92920092,
224
    0x6c6c006c, 0x70700070, 0x48480048, 0x50500050,
225
    0xfdfd00fd, 0xeded00ed, 0xb9b900b9, 0xdada00da,
226
    0x5e5e005e, 0x15150015, 0x46460046, 0x57570057,
227
    0xa7a700a7, 0x8d8d008d, 0x9d9d009d, 0x84840084,
228
    0x90900090, 0xd8d800d8, 0xabab00ab, 0x00000000,
229
    0x8c8c008c, 0xbcbc00bc, 0xd3d300d3, 0x0a0a000a,
230
    0xf7f700f7, 0xe4e400e4, 0x58580058, 0x05050005,
231
    0xb8b800b8, 0xb3b300b3, 0x45450045, 0x06060006,
232
    0xd0d000d0, 0x2c2c002c, 0x1e1e001e, 0x8f8f008f,
233
    0xcaca00ca, 0x3f3f003f, 0x0f0f000f, 0x02020002,
234
    0xc1c100c1, 0xafaf00af, 0xbdbd00bd, 0x03030003,
235
    0x01010001, 0x13130013, 0x8a8a008a, 0x6b6b006b,
236
    0x3a3a003a, 0x91910091, 0x11110011, 0x41410041,
237
    0x4f4f004f, 0x67670067, 0xdcdc00dc, 0xeaea00ea,
238
    0x97970097, 0xf2f200f2, 0xcfcf00cf, 0xcece00ce,
239
    0xf0f000f0, 0xb4b400b4, 0xe6e600e6, 0x73730073,
240
    0x96960096, 0xacac00ac, 0x74740074, 0x22220022,
241
    0xe7e700e7, 0xadad00ad, 0x35350035, 0x85850085,
242
    0xe2e200e2, 0xf9f900f9, 0x37370037, 0xe8e800e8,
243
    0x1c1c001c, 0x75750075, 0xdfdf00df, 0x6e6e006e,
244
    0x47470047, 0xf1f100f1, 0x1a1a001a, 0x71710071,
245
    0x1d1d001d, 0x29290029, 0xc5c500c5, 0x89890089,
246
    0x6f6f006f, 0xb7b700b7, 0x62620062, 0x0e0e000e,
247
    0xaaaa00aa, 0x18180018, 0xbebe00be, 0x1b1b001b,
248
    0xfcfc00fc, 0x56560056, 0x3e3e003e, 0x4b4b004b,
249
    0xc6c600c6, 0xd2d200d2, 0x79790079, 0x20200020,
250
    0x9a9a009a, 0xdbdb00db, 0xc0c000c0, 0xfefe00fe,
251
    0x78780078, 0xcdcd00cd, 0x5a5a005a, 0xf4f400f4,
252
    0x1f1f001f, 0xdddd00dd, 0xa8a800a8, 0x33330033,
253
    0x88880088, 0x07070007, 0xc7c700c7, 0x31310031,
254
    0xb1b100b1, 0x12120012, 0x10100010, 0x59590059,
255
    0x27270027, 0x80800080, 0xecec00ec, 0x5f5f005f,
256
    0x60600060, 0x51510051, 0x7f7f007f, 0xa9a900a9,
257
    0x19190019, 0xb5b500b5, 0x4a4a004a, 0x0d0d000d,
258
    0x2d2d002d, 0xe5e500e5, 0x7a7a007a, 0x9f9f009f,
259
    0x93930093, 0xc9c900c9, 0x9c9c009c, 0xefef00ef,
260
    0xa0a000a0, 0xe0e000e0, 0x3b3b003b, 0x4d4d004d,
261
    0xaeae00ae, 0x2a2a002a, 0xf5f500f5, 0xb0b000b0,
262
    0xc8c800c8, 0xebeb00eb, 0xbbbb00bb, 0x3c3c003c,
263
    0x83830083, 0x53530053, 0x99990099, 0x61610061,
264
    0x17170017, 0x2b2b002b, 0x04040004, 0x7e7e007e,
265
    0xbaba00ba, 0x77770077, 0xd6d600d6, 0x26260026,
266
    0xe1e100e1, 0x69690069, 0x14140014, 0x63630063,
267
    0x55550055, 0x21210021, 0x0c0c000c, 0x7d7d007d
268
};
269
270
static const uint32_t X2[256] = {
271
    0x30303000, 0x68686800, 0x99999900, 0x1b1b1b00,
272
    0x87878700, 0xb9b9b900, 0x21212100, 0x78787800,
273
    0x50505000, 0x39393900, 0xdbdbdb00, 0xe1e1e100,
274
    0x72727200, 0x09090900, 0x62626200, 0x3c3c3c00,
275
    0x3e3e3e00, 0x7e7e7e00, 0x5e5e5e00, 0x8e8e8e00,
276
    0xf1f1f100, 0xa0a0a000, 0xcccccc00, 0xa3a3a300,
277
    0x2a2a2a00, 0x1d1d1d00, 0xfbfbfb00, 0xb6b6b600,
278
    0xd6d6d600, 0x20202000, 0xc4c4c400, 0x8d8d8d00,
279
    0x81818100, 0x65656500, 0xf5f5f500, 0x89898900,
280
    0xcbcbcb00, 0x9d9d9d00, 0x77777700, 0xc6c6c600,
281
    0x57575700, 0x43434300, 0x56565600, 0x17171700,
282
    0xd4d4d400, 0x40404000, 0x1a1a1a00, 0x4d4d4d00,
283
    0xc0c0c000, 0x63636300, 0x6c6c6c00, 0xe3e3e300,
284
    0xb7b7b700, 0xc8c8c800, 0x64646400, 0x6a6a6a00,
285
    0x53535300, 0xaaaaaa00, 0x38383800, 0x98989800,
286
    0x0c0c0c00, 0xf4f4f400, 0x9b9b9b00, 0xededed00,
287
    0x7f7f7f00, 0x22222200, 0x76767600, 0xafafaf00,
288
    0xdddddd00, 0x3a3a3a00, 0x0b0b0b00, 0x58585800,
289
    0x67676700, 0x88888800, 0x06060600, 0xc3c3c300,
290
    0x35353500, 0x0d0d0d00, 0x01010100, 0x8b8b8b00,
291
    0x8c8c8c00, 0xc2c2c200, 0xe6e6e600, 0x5f5f5f00,
292
    0x02020200, 0x24242400, 0x75757500, 0x93939300,
293
    0x66666600, 0x1e1e1e00, 0xe5e5e500, 0xe2e2e200,
294
    0x54545400, 0xd8d8d800, 0x10101000, 0xcecece00,
295
    0x7a7a7a00, 0xe8e8e800, 0x08080800, 0x2c2c2c00,
296
    0x12121200, 0x97979700, 0x32323200, 0xababab00,
297
    0xb4b4b400, 0x27272700, 0x0a0a0a00, 0x23232300,
298
    0xdfdfdf00, 0xefefef00, 0xcacaca00, 0xd9d9d900,
299
    0xb8b8b800, 0xfafafa00, 0xdcdcdc00, 0x31313100,
300
    0x6b6b6b00, 0xd1d1d100, 0xadadad00, 0x19191900,
301
    0x49494900, 0xbdbdbd00, 0x51515100, 0x96969600,
302
    0xeeeeee00, 0xe4e4e400, 0xa8a8a800, 0x41414100,
303
    0xdadada00, 0xffffff00, 0xcdcdcd00, 0x55555500,
304
    0x86868600, 0x36363600, 0xbebebe00, 0x61616100,
305
    0x52525200, 0xf8f8f800, 0xbbbbbb00, 0x0e0e0e00,
306
    0x82828200, 0x48484800, 0x69696900, 0x9a9a9a00,
307
    0xe0e0e000, 0x47474700, 0x9e9e9e00, 0x5c5c5c00,
308
    0x04040400, 0x4b4b4b00, 0x34343400, 0x15151500,
309
    0x79797900, 0x26262600, 0xa7a7a700, 0xdedede00,
310
    0x29292900, 0xaeaeae00, 0x92929200, 0xd7d7d700,
311
    0x84848400, 0xe9e9e900, 0xd2d2d200, 0xbababa00,
312
    0x5d5d5d00, 0xf3f3f300, 0xc5c5c500, 0xb0b0b000,
313
    0xbfbfbf00, 0xa4a4a400, 0x3b3b3b00, 0x71717100,
314
    0x44444400, 0x46464600, 0x2b2b2b00, 0xfcfcfc00,
315
    0xebebeb00, 0x6f6f6f00, 0xd5d5d500, 0xf6f6f600,
316
    0x14141400, 0xfefefe00, 0x7c7c7c00, 0x70707000,
317
    0x5a5a5a00, 0x7d7d7d00, 0xfdfdfd00, 0x2f2f2f00,
318
    0x18181800, 0x83838300, 0x16161600, 0xa5a5a500,
319
    0x91919100, 0x1f1f1f00, 0x05050500, 0x95959500,
320
    0x74747400, 0xa9a9a900, 0xc1c1c100, 0x5b5b5b00,
321
    0x4a4a4a00, 0x85858500, 0x6d6d6d00, 0x13131300,
322
    0x07070700, 0x4f4f4f00, 0x4e4e4e00, 0x45454500,
323
    0xb2b2b200, 0x0f0f0f00, 0xc9c9c900, 0x1c1c1c00,
324
    0xa6a6a600, 0xbcbcbc00, 0xececec00, 0x73737300,
325
    0x90909000, 0x7b7b7b00, 0xcfcfcf00, 0x59595900,
326
    0x8f8f8f00, 0xa1a1a100, 0xf9f9f900, 0x2d2d2d00,
327
    0xf2f2f200, 0xb1b1b100, 0x00000000, 0x94949400,
328
    0x37373700, 0x9f9f9f00, 0xd0d0d000, 0x2e2e2e00,
329
    0x9c9c9c00, 0x6e6e6e00, 0x28282800, 0x3f3f3f00,
330
    0x80808000, 0xf0f0f000, 0x3d3d3d00, 0xd3d3d300,
331
    0x25252500, 0x8a8a8a00, 0xb5b5b500, 0xe7e7e700,
332
    0x42424200, 0xb3b3b300, 0xc7c7c700, 0xeaeaea00,
333
    0xf7f7f700, 0x4c4c4c00, 0x11111100, 0x33333300,
334
    0x03030300, 0xa2a2a200, 0xacacac00, 0x60606000
335
};
336
337
/* Key XOR Layer */
338
#define ARIA_ADD_ROUND_KEY(RK, T0, T1, T2, T3) \
339
0
    do {                                       \
340
0
        (T0) ^= (RK)->u[0];                    \
341
0
        (T1) ^= (RK)->u[1];                    \
342
0
        (T2) ^= (RK)->u[2];                    \
343
0
        (T3) ^= (RK)->u[3];                    \
344
0
    } while (0)
345
346
/* S-Box Layer 1 + M */
347
#define ARIA_SBOX_LAYER1_WITH_PRE_DIFF(T0, T1, T2, T3)                                                    \
348
0
    do {                                                                                                  \
349
0
        (T0) = S1[GET_U8_BE(T0, 0)] ^ S2[GET_U8_BE(T0, 1)] ^ X1[GET_U8_BE(T0, 2)] ^ X2[GET_U8_BE(T0, 3)]; \
350
0
        (T1) = S1[GET_U8_BE(T1, 0)] ^ S2[GET_U8_BE(T1, 1)] ^ X1[GET_U8_BE(T1, 2)] ^ X2[GET_U8_BE(T1, 3)]; \
351
0
        (T2) = S1[GET_U8_BE(T2, 0)] ^ S2[GET_U8_BE(T2, 1)] ^ X1[GET_U8_BE(T2, 2)] ^ X2[GET_U8_BE(T2, 3)]; \
352
0
        (T3) = S1[GET_U8_BE(T3, 0)] ^ S2[GET_U8_BE(T3, 1)] ^ X1[GET_U8_BE(T3, 2)] ^ X2[GET_U8_BE(T3, 3)]; \
353
0
    } while (0)
354
355
/* S-Box Layer 2 + M */
356
#define ARIA_SBOX_LAYER2_WITH_PRE_DIFF(T0, T1, T2, T3)                                                    \
357
0
    do {                                                                                                  \
358
0
        (T0) = X1[GET_U8_BE(T0, 0)] ^ X2[GET_U8_BE(T0, 1)] ^ S1[GET_U8_BE(T0, 2)] ^ S2[GET_U8_BE(T0, 3)]; \
359
0
        (T1) = X1[GET_U8_BE(T1, 0)] ^ X2[GET_U8_BE(T1, 1)] ^ S1[GET_U8_BE(T1, 2)] ^ S2[GET_U8_BE(T1, 3)]; \
360
0
        (T2) = X1[GET_U8_BE(T2, 0)] ^ X2[GET_U8_BE(T2, 1)] ^ S1[GET_U8_BE(T2, 2)] ^ S2[GET_U8_BE(T2, 3)]; \
361
0
        (T3) = X1[GET_U8_BE(T3, 0)] ^ X2[GET_U8_BE(T3, 1)] ^ S1[GET_U8_BE(T3, 2)] ^ S2[GET_U8_BE(T3, 3)]; \
362
0
    } while (0)
363
364
/* Word-level diffusion */
365
#define ARIA_DIFF_WORD(T0, T1, T2, T3) \
366
0
    do {                               \
367
0
        (T1) ^= (T2);                  \
368
0
        (T2) ^= (T3);                  \
369
0
        (T0) ^= (T1);                  \
370
0
                                       \
371
0
        (T3) ^= (T1);                  \
372
0
        (T2) ^= (T0);                  \
373
0
        (T1) ^= (T2);                  \
374
0
    } while (0)
375
376
/* Byte-level diffusion */
377
#define ARIA_DIFF_BYTE(T0, T1, T2, T3)                                  \
378
0
    do {                                                                \
379
0
        (T1) = (((T1) << 8) & 0xff00ff00) ^ (((T1) >> 8) & 0x00ff00ff); \
380
0
        (T2) = rotr32(T2, 16);                                          \
381
0
        (T3) = bswap32(T3);                                             \
382
0
    } while (0)
383
384
/* Odd round Substitution & Diffusion */
385
#define ARIA_SUBST_DIFF_ODD(T0, T1, T2, T3)             \
386
0
    do {                                                \
387
0
        ARIA_SBOX_LAYER1_WITH_PRE_DIFF(T0, T1, T2, T3); \
388
0
        ARIA_DIFF_WORD(T0, T1, T2, T3);                 \
389
0
        ARIA_DIFF_BYTE(T0, T1, T2, T3);                 \
390
0
        ARIA_DIFF_WORD(T0, T1, T2, T3);                 \
391
0
    } while (0)
392
393
/* Even round Substitution & Diffusion */
394
#define ARIA_SUBST_DIFF_EVEN(T0, T1, T2, T3)            \
395
0
    do {                                                \
396
0
        ARIA_SBOX_LAYER2_WITH_PRE_DIFF(T0, T1, T2, T3); \
397
0
        ARIA_DIFF_WORD(T0, T1, T2, T3);                 \
398
0
        ARIA_DIFF_BYTE(T2, T3, T0, T1);                 \
399
0
        ARIA_DIFF_WORD(T0, T1, T2, T3);                 \
400
0
    } while (0)
401
402
/* Q, R Macro expanded ARIA GSRK */
403
#define _ARIA_GSRK(RK, X, Y, Q, R)                                                                    \
404
0
    do {                                                                                              \
405
0
        (RK)->u[0] = ((X)[0]) ^ (((Y)[((Q)) % 4]) >> (R)) ^ (((Y)[((Q) + 3) % 4]) << (32 - (R)));     \
406
0
        (RK)->u[1] = ((X)[1]) ^ (((Y)[((Q) + 1) % 4]) >> (R)) ^ (((Y)[((Q)) % 4]) << (32 - (R)));     \
407
0
        (RK)->u[2] = ((X)[2]) ^ (((Y)[((Q) + 2) % 4]) >> (R)) ^ (((Y)[((Q) + 1) % 4]) << (32 - (R))); \
408
0
        (RK)->u[3] = ((X)[3]) ^ (((Y)[((Q) + 3) % 4]) >> (R)) ^ (((Y)[((Q) + 2) % 4]) << (32 - (R))); \
409
0
    } while (0)
410
411
0
#define ARIA_GSRK(RK, X, Y, N) _ARIA_GSRK(RK, X, Y, 4 - ((N) / 32), (N) % 32)
412
413
#define ARIA_DEC_DIFF_BYTE(X, Y, TMP, TMP2)        \
414
0
    do {                                           \
415
0
        (TMP) = (X);                               \
416
0
        (TMP2) = rotr32((TMP), 8);                 \
417
0
        (Y) = (TMP2) ^ rotr32((TMP) ^ (TMP2), 16); \
418
0
    } while (0)
419
420
void ossl_aria_encrypt(const unsigned char *in, unsigned char *out,
421
    const ARIA_KEY *key)
422
0
{
423
0
    register uint32_t reg0, reg1, reg2, reg3;
424
0
    int Nr;
425
0
    const ARIA_u128 *rk;
426
427
0
    if (in == NULL || out == NULL || key == NULL) {
428
0
        return;
429
0
    }
430
431
0
    rk = key->rd_key;
432
0
    Nr = key->rounds;
433
434
0
    if (Nr != 12 && Nr != 14 && Nr != 16) {
435
0
        return;
436
0
    }
437
438
0
    reg0 = GET_U32_BE(in, 0);
439
0
    reg1 = GET_U32_BE(in, 1);
440
0
    reg2 = GET_U32_BE(in, 2);
441
0
    reg3 = GET_U32_BE(in, 3);
442
443
0
    ARIA_ADD_ROUND_KEY(rk, reg0, reg1, reg2, reg3);
444
0
    rk++;
445
446
0
    ARIA_SUBST_DIFF_ODD(reg0, reg1, reg2, reg3);
447
0
    ARIA_ADD_ROUND_KEY(rk, reg0, reg1, reg2, reg3);
448
0
    rk++;
449
450
0
    while ((Nr -= 2) > 0) {
451
0
        ARIA_SUBST_DIFF_EVEN(reg0, reg1, reg2, reg3);
452
0
        ARIA_ADD_ROUND_KEY(rk, reg0, reg1, reg2, reg3);
453
0
        rk++;
454
455
0
        ARIA_SUBST_DIFF_ODD(reg0, reg1, reg2, reg3);
456
0
        ARIA_ADD_ROUND_KEY(rk, reg0, reg1, reg2, reg3);
457
0
        rk++;
458
0
    }
459
460
0
    reg0 = rk->u[0] ^ MAKE_U32((uint8_t)(X1[GET_U8_BE(reg0, 0)]), (uint8_t)(X2[GET_U8_BE(reg0, 1)] >> 8), (uint8_t)(S1[GET_U8_BE(reg0, 2)]), (uint8_t)(S2[GET_U8_BE(reg0, 3)]));
461
0
    reg1 = rk->u[1] ^ MAKE_U32((uint8_t)(X1[GET_U8_BE(reg1, 0)]), (uint8_t)(X2[GET_U8_BE(reg1, 1)] >> 8), (uint8_t)(S1[GET_U8_BE(reg1, 2)]), (uint8_t)(S2[GET_U8_BE(reg1, 3)]));
462
0
    reg2 = rk->u[2] ^ MAKE_U32((uint8_t)(X1[GET_U8_BE(reg2, 0)]), (uint8_t)(X2[GET_U8_BE(reg2, 1)] >> 8), (uint8_t)(S1[GET_U8_BE(reg2, 2)]), (uint8_t)(S2[GET_U8_BE(reg2, 3)]));
463
0
    reg3 = rk->u[3] ^ MAKE_U32((uint8_t)(X1[GET_U8_BE(reg3, 0)]), (uint8_t)(X2[GET_U8_BE(reg3, 1)] >> 8), (uint8_t)(S1[GET_U8_BE(reg3, 2)]), (uint8_t)(S2[GET_U8_BE(reg3, 3)]));
464
465
0
    PUT_U32_BE(out, 0, reg0);
466
0
    PUT_U32_BE(out, 1, reg1);
467
0
    PUT_U32_BE(out, 2, reg2);
468
0
    PUT_U32_BE(out, 3, reg3);
469
0
}
470
471
int ossl_aria_set_encrypt_key(const unsigned char *userKey, const int bits,
472
    ARIA_KEY *key)
473
0
{
474
0
    register uint32_t reg0, reg1, reg2, reg3;
475
0
    uint32_t w0[4], w1[4], w2[4], w3[4];
476
0
    const uint32_t *ck;
477
478
0
    ARIA_u128 *rk;
479
0
    int Nr = (bits + 256) / 32;
480
481
0
    if (userKey == NULL || key == NULL) {
482
0
        return -1;
483
0
    }
484
0
    if (bits != 128 && bits != 192 && bits != 256) {
485
0
        return -2;
486
0
    }
487
488
0
    rk = key->rd_key;
489
0
    key->rounds = Nr;
490
0
    ck = &Key_RC[(bits - 128) / 64][0];
491
492
0
    w0[0] = GET_U32_BE(userKey, 0);
493
0
    w0[1] = GET_U32_BE(userKey, 1);
494
0
    w0[2] = GET_U32_BE(userKey, 2);
495
0
    w0[3] = GET_U32_BE(userKey, 3);
496
497
0
    reg0 = w0[0] ^ ck[0];
498
0
    reg1 = w0[1] ^ ck[1];
499
0
    reg2 = w0[2] ^ ck[2];
500
0
    reg3 = w0[3] ^ ck[3];
501
502
0
    ARIA_SUBST_DIFF_ODD(reg0, reg1, reg2, reg3);
503
504
0
    if (bits > 128) {
505
0
        w1[0] = GET_U32_BE(userKey, 4);
506
0
        w1[1] = GET_U32_BE(userKey, 5);
507
0
        if (bits > 192) {
508
0
            w1[2] = GET_U32_BE(userKey, 6);
509
0
            w1[3] = GET_U32_BE(userKey, 7);
510
0
        } else {
511
0
            w1[2] = w1[3] = 0;
512
0
        }
513
0
    } else {
514
0
        w1[0] = w1[1] = w1[2] = w1[3] = 0;
515
0
    }
516
517
0
    w1[0] ^= reg0;
518
0
    w1[1] ^= reg1;
519
0
    w1[2] ^= reg2;
520
0
    w1[3] ^= reg3;
521
522
0
    reg0 = w1[0];
523
0
    reg1 = w1[1];
524
0
    reg2 = w1[2];
525
0
    reg3 = w1[3];
526
527
0
    reg0 ^= ck[4];
528
0
    reg1 ^= ck[5];
529
0
    reg2 ^= ck[6];
530
0
    reg3 ^= ck[7];
531
532
0
    ARIA_SUBST_DIFF_EVEN(reg0, reg1, reg2, reg3);
533
534
0
    reg0 ^= w0[0];
535
0
    reg1 ^= w0[1];
536
0
    reg2 ^= w0[2];
537
0
    reg3 ^= w0[3];
538
539
0
    w2[0] = reg0;
540
0
    w2[1] = reg1;
541
0
    w2[2] = reg2;
542
0
    w2[3] = reg3;
543
544
0
    reg0 ^= ck[8];
545
0
    reg1 ^= ck[9];
546
0
    reg2 ^= ck[10];
547
0
    reg3 ^= ck[11];
548
549
0
    ARIA_SUBST_DIFF_ODD(reg0, reg1, reg2, reg3);
550
551
0
    w3[0] = reg0 ^ w1[0];
552
0
    w3[1] = reg1 ^ w1[1];
553
0
    w3[2] = reg2 ^ w1[2];
554
0
    w3[3] = reg3 ^ w1[3];
555
556
0
    ARIA_GSRK(rk, w0, w1, 19);
557
0
    rk++;
558
0
    ARIA_GSRK(rk, w1, w2, 19);
559
0
    rk++;
560
0
    ARIA_GSRK(rk, w2, w3, 19);
561
0
    rk++;
562
0
    ARIA_GSRK(rk, w3, w0, 19);
563
564
0
    rk++;
565
0
    ARIA_GSRK(rk, w0, w1, 31);
566
0
    rk++;
567
0
    ARIA_GSRK(rk, w1, w2, 31);
568
0
    rk++;
569
0
    ARIA_GSRK(rk, w2, w3, 31);
570
0
    rk++;
571
0
    ARIA_GSRK(rk, w3, w0, 31);
572
573
0
    rk++;
574
0
    ARIA_GSRK(rk, w0, w1, 67);
575
0
    rk++;
576
0
    ARIA_GSRK(rk, w1, w2, 67);
577
0
    rk++;
578
0
    ARIA_GSRK(rk, w2, w3, 67);
579
0
    rk++;
580
0
    ARIA_GSRK(rk, w3, w0, 67);
581
582
0
    rk++;
583
0
    ARIA_GSRK(rk, w0, w1, 97);
584
0
    if (bits > 128) {
585
0
        rk++;
586
0
        ARIA_GSRK(rk, w1, w2, 97);
587
0
        rk++;
588
0
        ARIA_GSRK(rk, w2, w3, 97);
589
0
    }
590
0
    if (bits > 192) {
591
0
        rk++;
592
0
        ARIA_GSRK(rk, w3, w0, 97);
593
594
0
        rk++;
595
0
        ARIA_GSRK(rk, w0, w1, 109);
596
0
    }
597
598
0
    return 0;
599
0
}
600
601
int ossl_aria_set_decrypt_key(const unsigned char *userKey, const int bits,
602
    ARIA_KEY *key)
603
0
{
604
0
    ARIA_u128 *rk_head;
605
0
    ARIA_u128 *rk_tail;
606
0
    register uint32_t w1, w2;
607
0
    register uint32_t reg0, reg1, reg2, reg3;
608
0
    uint32_t s0, s1, s2, s3;
609
610
0
    const int r = ossl_aria_set_encrypt_key(userKey, bits, key);
611
612
0
    if (r != 0) {
613
0
        return r;
614
0
    }
615
616
0
    rk_head = key->rd_key;
617
0
    rk_tail = rk_head + key->rounds;
618
619
0
    reg0 = rk_head->u[0];
620
0
    reg1 = rk_head->u[1];
621
0
    reg2 = rk_head->u[2];
622
0
    reg3 = rk_head->u[3];
623
624
0
    memcpy(rk_head, rk_tail, ARIA_BLOCK_SIZE);
625
626
0
    rk_tail->u[0] = reg0;
627
0
    rk_tail->u[1] = reg1;
628
0
    rk_tail->u[2] = reg2;
629
0
    rk_tail->u[3] = reg3;
630
631
0
    rk_head++;
632
0
    rk_tail--;
633
634
0
    for (; rk_head < rk_tail; rk_head++, rk_tail--) {
635
0
        ARIA_DEC_DIFF_BYTE(rk_head->u[0], reg0, w1, w2);
636
0
        ARIA_DEC_DIFF_BYTE(rk_head->u[1], reg1, w1, w2);
637
0
        ARIA_DEC_DIFF_BYTE(rk_head->u[2], reg2, w1, w2);
638
0
        ARIA_DEC_DIFF_BYTE(rk_head->u[3], reg3, w1, w2);
639
640
0
        ARIA_DIFF_WORD(reg0, reg1, reg2, reg3);
641
0
        ARIA_DIFF_BYTE(reg0, reg1, reg2, reg3);
642
0
        ARIA_DIFF_WORD(reg0, reg1, reg2, reg3);
643
644
0
        s0 = reg0;
645
0
        s1 = reg1;
646
0
        s2 = reg2;
647
0
        s3 = reg3;
648
649
0
        ARIA_DEC_DIFF_BYTE(rk_tail->u[0], reg0, w1, w2);
650
0
        ARIA_DEC_DIFF_BYTE(rk_tail->u[1], reg1, w1, w2);
651
0
        ARIA_DEC_DIFF_BYTE(rk_tail->u[2], reg2, w1, w2);
652
0
        ARIA_DEC_DIFF_BYTE(rk_tail->u[3], reg3, w1, w2);
653
654
0
        ARIA_DIFF_WORD(reg0, reg1, reg2, reg3);
655
0
        ARIA_DIFF_BYTE(reg0, reg1, reg2, reg3);
656
0
        ARIA_DIFF_WORD(reg0, reg1, reg2, reg3);
657
658
0
        rk_head->u[0] = reg0;
659
0
        rk_head->u[1] = reg1;
660
0
        rk_head->u[2] = reg2;
661
0
        rk_head->u[3] = reg3;
662
663
0
        rk_tail->u[0] = s0;
664
0
        rk_tail->u[1] = s1;
665
0
        rk_tail->u[2] = s2;
666
0
        rk_tail->u[3] = s3;
667
0
    }
668
0
    ARIA_DEC_DIFF_BYTE(rk_head->u[0], reg0, w1, w2);
669
0
    ARIA_DEC_DIFF_BYTE(rk_head->u[1], reg1, w1, w2);
670
0
    ARIA_DEC_DIFF_BYTE(rk_head->u[2], reg2, w1, w2);
671
0
    ARIA_DEC_DIFF_BYTE(rk_head->u[3], reg3, w1, w2);
672
673
0
    ARIA_DIFF_WORD(reg0, reg1, reg2, reg3);
674
0
    ARIA_DIFF_BYTE(reg0, reg1, reg2, reg3);
675
0
    ARIA_DIFF_WORD(reg0, reg1, reg2, reg3);
676
677
0
    rk_tail->u[0] = reg0;
678
0
    rk_tail->u[1] = reg1;
679
0
    rk_tail->u[2] = reg2;
680
0
    rk_tail->u[3] = reg3;
681
682
0
    return 0;
683
0
}
684
685
#else
686
687
static const unsigned char sb1[256] = {
688
    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
689
    0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
690
    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
691
    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
692
    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
693
    0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
694
    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
695
    0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
696
    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
697
    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
698
    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
699
    0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
700
    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
701
    0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
702
    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
703
    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
704
    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
705
    0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
706
    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
707
    0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
708
    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
709
    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
710
    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
711
    0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
712
    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
713
    0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
714
    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
715
    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
716
    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
717
    0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
718
    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
719
    0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
720
};
721
722
static const unsigned char sb2[256] = {
723
    0xe2, 0x4e, 0x54, 0xfc, 0x94, 0xc2, 0x4a, 0xcc,
724
    0x62, 0x0d, 0x6a, 0x46, 0x3c, 0x4d, 0x8b, 0xd1,
725
    0x5e, 0xfa, 0x64, 0xcb, 0xb4, 0x97, 0xbe, 0x2b,
726
    0xbc, 0x77, 0x2e, 0x03, 0xd3, 0x19, 0x59, 0xc1,
727
    0x1d, 0x06, 0x41, 0x6b, 0x55, 0xf0, 0x99, 0x69,
728
    0xea, 0x9c, 0x18, 0xae, 0x63, 0xdf, 0xe7, 0xbb,
729
    0x00, 0x73, 0x66, 0xfb, 0x96, 0x4c, 0x85, 0xe4,
730
    0x3a, 0x09, 0x45, 0xaa, 0x0f, 0xee, 0x10, 0xeb,
731
    0x2d, 0x7f, 0xf4, 0x29, 0xac, 0xcf, 0xad, 0x91,
732
    0x8d, 0x78, 0xc8, 0x95, 0xf9, 0x2f, 0xce, 0xcd,
733
    0x08, 0x7a, 0x88, 0x38, 0x5c, 0x83, 0x2a, 0x28,
734
    0x47, 0xdb, 0xb8, 0xc7, 0x93, 0xa4, 0x12, 0x53,
735
    0xff, 0x87, 0x0e, 0x31, 0x36, 0x21, 0x58, 0x48,
736
    0x01, 0x8e, 0x37, 0x74, 0x32, 0xca, 0xe9, 0xb1,
737
    0xb7, 0xab, 0x0c, 0xd7, 0xc4, 0x56, 0x42, 0x26,
738
    0x07, 0x98, 0x60, 0xd9, 0xb6, 0xb9, 0x11, 0x40,
739
    0xec, 0x20, 0x8c, 0xbd, 0xa0, 0xc9, 0x84, 0x04,
740
    0x49, 0x23, 0xf1, 0x4f, 0x50, 0x1f, 0x13, 0xdc,
741
    0xd8, 0xc0, 0x9e, 0x57, 0xe3, 0xc3, 0x7b, 0x65,
742
    0x3b, 0x02, 0x8f, 0x3e, 0xe8, 0x25, 0x92, 0xe5,
743
    0x15, 0xdd, 0xfd, 0x17, 0xa9, 0xbf, 0xd4, 0x9a,
744
    0x7e, 0xc5, 0x39, 0x67, 0xfe, 0x76, 0x9d, 0x43,
745
    0xa7, 0xe1, 0xd0, 0xf5, 0x68, 0xf2, 0x1b, 0x34,
746
    0x70, 0x05, 0xa3, 0x8a, 0xd5, 0x79, 0x86, 0xa8,
747
    0x30, 0xc6, 0x51, 0x4b, 0x1e, 0xa6, 0x27, 0xf6,
748
    0x35, 0xd2, 0x6e, 0x24, 0x16, 0x82, 0x5f, 0xda,
749
    0xe6, 0x75, 0xa2, 0xef, 0x2c, 0xb2, 0x1c, 0x9f,
750
    0x5d, 0x6f, 0x80, 0x0a, 0x72, 0x44, 0x9b, 0x6c,
751
    0x90, 0x0b, 0x5b, 0x33, 0x7d, 0x5a, 0x52, 0xf3,
752
    0x61, 0xa1, 0xf7, 0xb0, 0xd6, 0x3f, 0x7c, 0x6d,
753
    0xed, 0x14, 0xe0, 0xa5, 0x3d, 0x22, 0xb3, 0xf8,
754
    0x89, 0xde, 0x71, 0x1a, 0xaf, 0xba, 0xb5, 0x81
755
};
756
757
static const unsigned char sb3[256] = {
758
    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
759
    0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
760
    0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
761
    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
762
    0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
763
    0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
764
    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
765
    0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
766
    0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
767
    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
768
    0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
769
    0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
770
    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
771
    0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
772
    0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
773
    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
774
    0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
775
    0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
776
    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
777
    0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
778
    0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
779
    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
780
    0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
781
    0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
782
    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
783
    0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
784
    0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
785
    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
786
    0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
787
    0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
788
    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
789
    0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
790
};
791
792
static const unsigned char sb4[256] = {
793
    0x30, 0x68, 0x99, 0x1b, 0x87, 0xb9, 0x21, 0x78,
794
    0x50, 0x39, 0xdb, 0xe1, 0x72, 0x09, 0x62, 0x3c,
795
    0x3e, 0x7e, 0x5e, 0x8e, 0xf1, 0xa0, 0xcc, 0xa3,
796
    0x2a, 0x1d, 0xfb, 0xb6, 0xd6, 0x20, 0xc4, 0x8d,
797
    0x81, 0x65, 0xf5, 0x89, 0xcb, 0x9d, 0x77, 0xc6,
798
    0x57, 0x43, 0x56, 0x17, 0xd4, 0x40, 0x1a, 0x4d,
799
    0xc0, 0x63, 0x6c, 0xe3, 0xb7, 0xc8, 0x64, 0x6a,
800
    0x53, 0xaa, 0x38, 0x98, 0x0c, 0xf4, 0x9b, 0xed,
801
    0x7f, 0x22, 0x76, 0xaf, 0xdd, 0x3a, 0x0b, 0x58,
802
    0x67, 0x88, 0x06, 0xc3, 0x35, 0x0d, 0x01, 0x8b,
803
    0x8c, 0xc2, 0xe6, 0x5f, 0x02, 0x24, 0x75, 0x93,
804
    0x66, 0x1e, 0xe5, 0xe2, 0x54, 0xd8, 0x10, 0xce,
805
    0x7a, 0xe8, 0x08, 0x2c, 0x12, 0x97, 0x32, 0xab,
806
    0xb4, 0x27, 0x0a, 0x23, 0xdf, 0xef, 0xca, 0xd9,
807
    0xb8, 0xfa, 0xdc, 0x31, 0x6b, 0xd1, 0xad, 0x19,
808
    0x49, 0xbd, 0x51, 0x96, 0xee, 0xe4, 0xa8, 0x41,
809
    0xda, 0xff, 0xcd, 0x55, 0x86, 0x36, 0xbe, 0x61,
810
    0x52, 0xf8, 0xbb, 0x0e, 0x82, 0x48, 0x69, 0x9a,
811
    0xe0, 0x47, 0x9e, 0x5c, 0x04, 0x4b, 0x34, 0x15,
812
    0x79, 0x26, 0xa7, 0xde, 0x29, 0xae, 0x92, 0xd7,
813
    0x84, 0xe9, 0xd2, 0xba, 0x5d, 0xf3, 0xc5, 0xb0,
814
    0xbf, 0xa4, 0x3b, 0x71, 0x44, 0x46, 0x2b, 0xfc,
815
    0xeb, 0x6f, 0xd5, 0xf6, 0x14, 0xfe, 0x7c, 0x70,
816
    0x5a, 0x7d, 0xfd, 0x2f, 0x18, 0x83, 0x16, 0xa5,
817
    0x91, 0x1f, 0x05, 0x95, 0x74, 0xa9, 0xc1, 0x5b,
818
    0x4a, 0x85, 0x6d, 0x13, 0x07, 0x4f, 0x4e, 0x45,
819
    0xb2, 0x0f, 0xc9, 0x1c, 0xa6, 0xbc, 0xec, 0x73,
820
    0x90, 0x7b, 0xcf, 0x59, 0x8f, 0xa1, 0xf9, 0x2d,
821
    0xf2, 0xb1, 0x00, 0x94, 0x37, 0x9f, 0xd0, 0x2e,
822
    0x9c, 0x6e, 0x28, 0x3f, 0x80, 0xf0, 0x3d, 0xd3,
823
    0x25, 0x8a, 0xb5, 0xe7, 0x42, 0xb3, 0xc7, 0xea,
824
    0xf7, 0x4c, 0x11, 0x33, 0x03, 0xa2, 0xac, 0x60
825
};
826
827
static const ARIA_u128 c1 = { { 0x51, 0x7c, 0xc1, 0xb7, 0x27, 0x22, 0x0a, 0x94,
828
    0xfe, 0x13, 0xab, 0xe8, 0xfa, 0x9a, 0x6e, 0xe0 } };
829
830
static const ARIA_u128 c2 = { { 0x6d, 0xb1, 0x4a, 0xcc, 0x9e, 0x21, 0xc8, 0x20,
831
    0xff, 0x28, 0xb1, 0xd5, 0xef, 0x5d, 0xe2, 0xb0 } };
832
833
static const ARIA_u128 c3 = { { 0xdb, 0x92, 0x37, 0x1d, 0x21, 0x26, 0xe9, 0x70,
834
    0x03, 0x24, 0x97, 0x75, 0x04, 0xe8, 0xc9, 0x0e } };
835
836
/*
837
 * Exclusive or two 128 bit values into the result.
838
 * It is safe for the result to be the same as the either input.
839
 */
840
static void xor128(ARIA_c128 o, const ARIA_c128 x, const ARIA_u128 *y)
841
{
842
    int i;
843
844
    for (i = 0; i < ARIA_BLOCK_SIZE; i++)
845
        o[i] = x[i] ^ y->c[i];
846
}
847
848
/*
849
 * Generalised circular rotate right and exclusive or function.
850
 * It is safe for the output to overlap either input.
851
 */
852
static ossl_inline void rotnr(unsigned int n, ARIA_u128 *o,
853
    const ARIA_u128 *xor, const ARIA_u128 *z)
854
{
855
    const unsigned int bytes = n / 8, bits = n % 8;
856
    unsigned int i;
857
    ARIA_u128 t;
858
859
    for (i = 0; i < ARIA_BLOCK_SIZE; i++)
860
        t.c[(i + bytes) % ARIA_BLOCK_SIZE] = z->c[i];
861
    for (i = 0; i < ARIA_BLOCK_SIZE; i++)
862
        o->c[i] = ((t.c[i] >> bits) | (t.c[i ? i - 1 : ARIA_BLOCK_SIZE - 1] << (8 - bits))) ^ xor->c[i];
863
}
864
865
/*
866
 * Circular rotate 19 bits right and xor.
867
 * It is safe for the output to overlap either input.
868
 */
869
static void rot19r(ARIA_u128 *o, const ARIA_u128 *xor, const ARIA_u128 *z)
870
{
871
    rotnr(19, o, xor, z);
872
}
873
874
/*
875
 * Circular rotate 31 bits right and xor.
876
 * It is safe for the output to overlap either input.
877
 */
878
static void rot31r(ARIA_u128 *o, const ARIA_u128 *xor, const ARIA_u128 *z)
879
{
880
    rotnr(31, o, xor, z);
881
}
882
883
/*
884
 * Circular rotate 61 bits left and xor.
885
 * It is safe for the output to overlap either input.
886
 */
887
static void rot61l(ARIA_u128 *o, const ARIA_u128 *xor, const ARIA_u128 *z)
888
{
889
    rotnr(8 * ARIA_BLOCK_SIZE - 61, o, xor, z);
890
}
891
892
/*
893
 * Circular rotate 31 bits left and xor.
894
 * It is safe for the output to overlap either input.
895
 */
896
static void rot31l(ARIA_u128 *o, const ARIA_u128 *xor, const ARIA_u128 *z)
897
{
898
    rotnr(8 * ARIA_BLOCK_SIZE - 31, o, xor, z);
899
}
900
901
/*
902
 * Circular rotate 19 bits left and xor.
903
 * It is safe for the output to overlap either input.
904
 */
905
static void rot19l(ARIA_u128 *o, const ARIA_u128 *xor, const ARIA_u128 *z)
906
{
907
    rotnr(8 * ARIA_BLOCK_SIZE - 19, o, xor, z);
908
}
909
910
/*
911
 * First substitution and xor layer, used for odd steps.
912
 * It is safe for the input and output to be the same.
913
 */
914
static void sl1(ARIA_u128 *o, const ARIA_u128 *x, const ARIA_u128 *y)
915
{
916
    unsigned int i;
917
    for (i = 0; i < ARIA_BLOCK_SIZE; i += 4) {
918
        o->c[i] = sb1[x->c[i] ^ y->c[i]];
919
        o->c[i + 1] = sb2[x->c[i + 1] ^ y->c[i + 1]];
920
        o->c[i + 2] = sb3[x->c[i + 2] ^ y->c[i + 2]];
921
        o->c[i + 3] = sb4[x->c[i + 3] ^ y->c[i + 3]];
922
    }
923
}
924
925
/*
926
 * Second substitution and xor layer, used for even steps.
927
 * It is safe for the input and output to be the same.
928
 */
929
static void sl2(ARIA_c128 o, const ARIA_u128 *x, const ARIA_u128 *y)
930
{
931
    unsigned int i;
932
    for (i = 0; i < ARIA_BLOCK_SIZE; i += 4) {
933
        o[i] = sb3[x->c[i] ^ y->c[i]];
934
        o[i + 1] = sb4[x->c[i + 1] ^ y->c[i + 1]];
935
        o[i + 2] = sb1[x->c[i + 2] ^ y->c[i + 2]];
936
        o[i + 3] = sb2[x->c[i + 3] ^ y->c[i + 3]];
937
    }
938
}
939
940
/*
941
 * Diffusion layer step
942
 * It is NOT safe for the input and output to overlap.
943
 */
944
static void a(ARIA_u128 *y, const ARIA_u128 *x)
945
{
946
    y->c[0] = x->c[3] ^ x->c[4] ^ x->c[6] ^ x->c[8] ^ x->c[9] ^ x->c[13] ^ x->c[14];
947
    y->c[1] = x->c[2] ^ x->c[5] ^ x->c[7] ^ x->c[8] ^ x->c[9] ^ x->c[12] ^ x->c[15];
948
    y->c[2] = x->c[1] ^ x->c[4] ^ x->c[6] ^ x->c[10] ^ x->c[11] ^ x->c[12] ^ x->c[15];
949
    y->c[3] = x->c[0] ^ x->c[5] ^ x->c[7] ^ x->c[10] ^ x->c[11] ^ x->c[13] ^ x->c[14];
950
    y->c[4] = x->c[0] ^ x->c[2] ^ x->c[5] ^ x->c[8] ^ x->c[11] ^ x->c[14] ^ x->c[15];
951
    y->c[5] = x->c[1] ^ x->c[3] ^ x->c[4] ^ x->c[9] ^ x->c[10] ^ x->c[14] ^ x->c[15];
952
    y->c[6] = x->c[0] ^ x->c[2] ^ x->c[7] ^ x->c[9] ^ x->c[10] ^ x->c[12] ^ x->c[13];
953
    y->c[7] = x->c[1] ^ x->c[3] ^ x->c[6] ^ x->c[8] ^ x->c[11] ^ x->c[12] ^ x->c[13];
954
    y->c[8] = x->c[0] ^ x->c[1] ^ x->c[4] ^ x->c[7] ^ x->c[10] ^ x->c[13] ^ x->c[15];
955
    y->c[9] = x->c[0] ^ x->c[1] ^ x->c[5] ^ x->c[6] ^ x->c[11] ^ x->c[12] ^ x->c[14];
956
    y->c[10] = x->c[2] ^ x->c[3] ^ x->c[5] ^ x->c[6] ^ x->c[8] ^ x->c[13] ^ x->c[15];
957
    y->c[11] = x->c[2] ^ x->c[3] ^ x->c[4] ^ x->c[7] ^ x->c[9] ^ x->c[12] ^ x->c[14];
958
    y->c[12] = x->c[1] ^ x->c[2] ^ x->c[6] ^ x->c[7] ^ x->c[9] ^ x->c[11] ^ x->c[12];
959
    y->c[13] = x->c[0] ^ x->c[3] ^ x->c[6] ^ x->c[7] ^ x->c[8] ^ x->c[10] ^ x->c[13];
960
    y->c[14] = x->c[0] ^ x->c[3] ^ x->c[4] ^ x->c[5] ^ x->c[9] ^ x->c[11] ^ x->c[14];
961
    y->c[15] = x->c[1] ^ x->c[2] ^ x->c[4] ^ x->c[5] ^ x->c[8] ^ x->c[10] ^ x->c[15];
962
}
963
964
/*
965
 * Odd round function
966
 * Apply the first substitution layer and then a diffusion step.
967
 * It is safe for the input and output to overlap.
968
 */
969
static ossl_inline void FO(ARIA_u128 *o, const ARIA_u128 *d,
970
    const ARIA_u128 *rk)
971
{
972
    ARIA_u128 y;
973
974
    sl1(&y, d, rk);
975
    a(o, &y);
976
}
977
978
/*
979
 * Even round function
980
 * Apply the second substitution layer and then a diffusion step.
981
 * It is safe for the input and output to overlap.
982
 */
983
static ossl_inline void FE(ARIA_u128 *o, const ARIA_u128 *d,
984
    const ARIA_u128 *rk)
985
{
986
    ARIA_u128 y;
987
988
    sl2(y.c, d, rk);
989
    a(o, &y);
990
}
991
992
/*
993
 * Encrypt or decrypt a single block
994
 * in and out can overlap
995
 */
996
static void do_encrypt(unsigned char *o, const unsigned char *pin,
997
    unsigned int rounds, const ARIA_u128 *keys)
998
{
999
    ARIA_u128 p;
1000
    unsigned int i;
1001
1002
    memcpy(&p, pin, sizeof(p));
1003
    for (i = 0; i < rounds - 2; i += 2) {
1004
        FO(&p, &p, &keys[i]);
1005
        FE(&p, &p, &keys[i + 1]);
1006
    }
1007
    FO(&p, &p, &keys[rounds - 2]);
1008
    sl2(o, &p, &keys[rounds - 1]);
1009
    xor128(o, o, &keys[rounds]);
1010
}
1011
1012
/*
1013
 * Encrypt a single block
1014
 * in and out can overlap
1015
 */
1016
void ossl_aria_encrypt(const unsigned char *in, unsigned char *out,
1017
    const ARIA_KEY *key)
1018
{
1019
    assert(in != NULL && out != NULL && key != NULL);
1020
    do_encrypt(out, in, key->rounds, key->rd_key);
1021
}
1022
1023
/*
1024
 * Expand the cipher key into the encryption key schedule.
1025
 * We short circuit execution of the last two
1026
 * or four rotations based on the key size.
1027
 */
1028
int ossl_aria_set_encrypt_key(const unsigned char *userKey, const int bits,
1029
    ARIA_KEY *key)
1030
{
1031
    const ARIA_u128 *ck1, *ck2, *ck3;
1032
    ARIA_u128 kr, w0, w1, w2, w3;
1033
1034
    if (!userKey || !key)
1035
        return -1;
1036
    memcpy(w0.c, userKey, sizeof(w0));
1037
    switch (bits) {
1038
    default:
1039
        return -2;
1040
    case 128:
1041
        key->rounds = 12;
1042
        ck1 = &c1;
1043
        ck2 = &c2;
1044
        ck3 = &c3;
1045
        memset(kr.c, 0, sizeof(kr));
1046
        break;
1047
1048
    case 192:
1049
        key->rounds = 14;
1050
        ck1 = &c2;
1051
        ck2 = &c3;
1052
        ck3 = &c1;
1053
        memcpy(kr.c, userKey + ARIA_BLOCK_SIZE, sizeof(kr) / 2);
1054
        memset(kr.c + ARIA_BLOCK_SIZE / 2, 0, sizeof(kr) / 2);
1055
        break;
1056
1057
    case 256:
1058
        key->rounds = 16;
1059
        ck1 = &c3;
1060
        ck2 = &c1;
1061
        ck3 = &c2;
1062
        memcpy(kr.c, userKey + ARIA_BLOCK_SIZE, sizeof(kr));
1063
        break;
1064
    }
1065
1066
    FO(&w3, &w0, ck1);
1067
    xor128(w1.c, w3.c, &kr);
1068
    FE(&w3, &w1, ck2);
1069
    xor128(w2.c, w3.c, &w0);
1070
    FO(&kr, &w2, ck3);
1071
    xor128(w3.c, kr.c, &w1);
1072
1073
    rot19r(&key->rd_key[0], &w0, &w1);
1074
    rot19r(&key->rd_key[1], &w1, &w2);
1075
    rot19r(&key->rd_key[2], &w2, &w3);
1076
    rot19r(&key->rd_key[3], &w3, &w0);
1077
1078
    rot31r(&key->rd_key[4], &w0, &w1);
1079
    rot31r(&key->rd_key[5], &w1, &w2);
1080
    rot31r(&key->rd_key[6], &w2, &w3);
1081
    rot31r(&key->rd_key[7], &w3, &w0);
1082
1083
    rot61l(&key->rd_key[8], &w0, &w1);
1084
    rot61l(&key->rd_key[9], &w1, &w2);
1085
    rot61l(&key->rd_key[10], &w2, &w3);
1086
    rot61l(&key->rd_key[11], &w3, &w0);
1087
1088
    rot31l(&key->rd_key[12], &w0, &w1);
1089
    if (key->rounds > 12) {
1090
        rot31l(&key->rd_key[13], &w1, &w2);
1091
        rot31l(&key->rd_key[14], &w2, &w3);
1092
1093
        if (key->rounds > 14) {
1094
            rot31l(&key->rd_key[15], &w3, &w0);
1095
            rot19l(&key->rd_key[16], &w0, &w1);
1096
        }
1097
    }
1098
    return 0;
1099
}
1100
1101
/*
1102
 * Expand the cipher key into the decryption key schedule.
1103
 */
1104
int ossl_aria_set_decrypt_key(const unsigned char *userKey, const int bits,
1105
    ARIA_KEY *key)
1106
{
1107
    ARIA_KEY ek;
1108
    const int r = ossl_aria_set_encrypt_key(userKey, bits, &ek);
1109
    unsigned int i, rounds = ek.rounds;
1110
1111
    if (r == 0) {
1112
        key->rounds = rounds;
1113
        memcpy(&key->rd_key[0], &ek.rd_key[rounds], sizeof(key->rd_key[0]));
1114
        for (i = 1; i < rounds; i++)
1115
            a(&key->rd_key[i], &ek.rd_key[rounds - i]);
1116
        memcpy(&key->rd_key[rounds], &ek.rd_key[0], sizeof(key->rd_key[rounds]));
1117
    }
1118
    return r;
1119
}
1120
1121
#endif