Coverage Report

Created: 2024-11-21 07:03

/src/cryptopp/lea.cpp
Line
Count
Source (jump to first uncovered line)
1
// lea.cpp - written and placed in the public domain by Kim Sung Hee and Jeffrey Walton
2
//           Based on "LEA: A 128-Bit Block Cipher for Fast Encryption on Common
3
//           Processors" by Deukjo Hong, Jung-Keun Lee, Dong-Chan Kim, Daesung Kwon,
4
//           Kwon Ho Ryu, and Dong-Geon Lee.
5
//
6
//           This implementation is based on source files found in a zip file at the
7
//           Korea Internet and Security Agency (https://www.kisa.or.kr/eng/main.jsp).
8
//           The zip files was downloaded from the Korean language area of the site so we
9
//           don't have a url or english zip filename to cite. The source filename from
10
//           the zip is lea_core.c.
11
//
12
//           The LEA team appears to have applied optimizations to functions in lea_core.c.
13
//           The implementation does not exactly follow the aglorithmic description from
14
//           the LEA paper.
15
16
#include "pch.h"
17
#include "config.h"
18
19
#include "lea.h"
20
#include "misc.h"
21
#include "cpu.h"
22
23
ANONYMOUS_NAMESPACE_BEGIN
24
25
using CryptoPP::word32;
26
using CryptoPP::rotlConstant;
27
28
ANONYMOUS_NAMESPACE_END
29
30
const word32 delta[8][36] = {
31
    {0xc3efe9db, 0x87dfd3b7, 0x0fbfa76f, 0x1f7f4ede, 0x3efe9dbc, 0x7dfd3b78, 0xfbfa76f0, 0xf7f4ede1,
32
    0xefe9dbc3, 0xdfd3b787, 0xbfa76f0f, 0x7f4ede1f, 0xfe9dbc3e, 0xfd3b787d, 0xfa76f0fb, 0xf4ede1f7,
33
    0xe9dbc3ef, 0xd3b787df, 0xa76f0fbf, 0x4ede1f7f, 0x9dbc3efe, 0x3b787dfd, 0x76f0fbfa, 0xede1f7f4,
34
    0xdbc3efe9, 0xb787dfd3, 0x6f0fbfa7, 0xde1f7f4e, 0xbc3efe9d, 0x787dfd3b, 0xf0fbfa76, 0xe1f7f4eD,
35
    0xc3efe9db,    0x87dfd3b7, 0x0fbfa76f, 0x1f7f4ede},
36
    {0x44626b02, 0x88c4d604, 0x1189ac09, 0x23135812, 0x4626b024, 0x8c4d6048, 0x189ac091, 0x31358122,
37
    0x626b0244, 0xc4d60488, 0x89ac0911, 0x13581223, 0x26b02446, 0x4d60488c, 0x9ac09118, 0x35812231,
38
    0x6b024462, 0xd60488c4, 0xac091189, 0x58122313, 0xb0244626, 0x60488c4d, 0xc091189a, 0x81223135,
39
    0x0244626b, 0x0488c4d6, 0x091189ac, 0x12231358, 0x244626b0, 0x488c4d60, 0x91189ac0, 0x22313581,
40
    0x44626b02, 0x88c4d604, 0x1189ac09, 0x23135812},
41
    {0x79e27c8a, 0xf3c4f914, 0xe789f229, 0xcf13e453, 0x9e27c8a7, 0x3c4f914f, 0x789f229e, 0xf13e453c,
42
    0xe27c8a79, 0xc4f914f3, 0x89f229e7, 0x13e453cf, 0x27c8a79e, 0x4f914f3c, 0x9f229e78, 0x3e453cf1,
43
    0x7c8a79e2, 0xf914f3c4, 0xf229e789, 0xe453cf13, 0xc8a79e27, 0x914f3c4f, 0x229e789f, 0x453cf13e,
44
    0x8a79e27c, 0x14f3c4f9, 0x29e789f2, 0x53cf13e4, 0xa79e27c8, 0x4f3c4f91, 0x9e789f22, 0x3cf13e45,
45
    0x79e27c8a, 0xf3c4f914, 0xe789f229, 0xcf13e453},
46
    {0x78df30ec, 0xf1be61d8, 0xe37cc3b1, 0xc6f98763, 0x8df30ec7, 0x1be61d8f, 0x37cc3b1e, 0x6f98763c,
47
    0xdf30ec78, 0xbe61d8f1, 0x7cc3b1e3, 0xf98763c6, 0xf30ec78d, 0xe61d8f1b, 0xcc3b1e37, 0x98763c6f,
48
    0x30ec78df, 0x61d8f1be, 0xc3b1e37c, 0x8763c6f9, 0x0ec78df3, 0x1d8f1be6, 0x3b1e37cc, 0x763c6f98,
49
    0xec78df30, 0xd8f1be61, 0xb1e37cc3, 0x63c6f987, 0xc78df30e, 0x8f1be61d, 0x1e37cc3b, 0x3c6f9876,
50
    0x78df30ec,    0xf1be61d8, 0xe37cc3b1, 0xc6f98763},
51
    {0x715ea49e, 0xe2bd493c, 0xc57a9279, 0x8af524f3, 0x15ea49e7, 0x2bd493ce, 0x57a9279c, 0xaf524f38,
52
    0x5ea49e71, 0xbd493ce2, 0x7a9279c5, 0xf524f38a, 0xea49e715, 0xd493ce2b, 0xa9279c57, 0x524f38af,
53
    0xa49e715e, 0x493ce2bd, 0x9279c57a, 0x24f38af5, 0x49e715ea, 0x93ce2bd4, 0x279c57a9, 0x4f38af52,
54
    0x9e715ea4, 0x3ce2bd49, 0x79c57a92, 0xf38af524, 0xe715ea49, 0xce2bd493, 0x9c57a927, 0x38af524f,
55
    0x715ea49e,    0xe2bd493c, 0xc57a9279, 0x8af524f3},
56
    {0xc785da0a, 0x8f0bb415, 0x1e17682b, 0x3c2ed056, 0x785da0ac, 0xf0bb4158, 0xe17682b1, 0xc2ed0563,
57
    0x85da0ac7, 0x0bb4158f, 0x17682b1e, 0x2ed0563c, 0x5da0ac78, 0xbb4158f0, 0x7682b1e1, 0xed0563c2,
58
    0xda0ac785, 0xb4158f0b, 0x682b1e17, 0xd0563c2e, 0xa0ac785d, 0x4158f0bb, 0x82b1e176, 0x0563c2ed,
59
    0x0ac785da, 0x158f0bb4, 0x2b1e1768, 0x563c2ed0, 0xac785da0, 0x58f0bb41, 0xb1e17682, 0x63c2ed05,
60
    0xc785da0a, 0x8f0bb415, 0x1e17682b, 0x3c2ed056},
61
    {0xe04ef22a, 0xc09de455, 0x813bc8ab, 0x02779157, 0x04ef22ae, 0x09de455c, 0x13bc8ab8, 0x27791570,
62
    0x4ef22ae0, 0x9de455c0, 0x3bc8ab81, 0x77915702, 0xef22ae04, 0xde455c09, 0xbc8ab813, 0x79157027,
63
    0xf22ae04e, 0xe455c09d, 0xc8ab813b, 0x91570277, 0x22ae04ef, 0x455c09de, 0x8ab813bc, 0x15702779,
64
    0x2ae04ef2, 0x55c09de4, 0xab813bc8, 0x57027791, 0xae04ef22, 0x5c09de45, 0xb813bc8a, 0x70277915,
65
    0xe04ef22a,    0xc09de455, 0x813bc8ab, 0x02779157},
66
    {0xe5c40957, 0xcb8812af, 0x9710255f, 0x2e204abf, 0x5c40957e, 0xb8812afc, 0x710255f9, 0xe204abf2,
67
    0xc40957e5, 0x8812afcb, 0x10255f97, 0x204abf2e, 0x40957e5c, 0x812afcb8, 0x0255f971, 0x04abf2e2,
68
    0x0957e5c4, 0x12afcb88, 0x255f9710, 0x4abf2e20, 0x957e5c40, 0x2afcb881, 0x55f97102, 0xabf2e204,
69
    0x57e5c409, 0xafcb8812, 0x5f971025, 0xbf2e204a, 0x7e5c4095, 0xfcb8812a, 0xf9710255, 0xf2e204ab,
70
    0xe5c40957,    0xcb8812af, 0x9710255f, 0x2e204abf}
71
};
72
73
inline void SetKey128(word32 rkey[144], const word32 key[4])
74
0
{
75
0
    rkey[  0] = rotlConstant<1>( key[  0] + delta[0][ 0]);
76
0
    rkey[  6] = rotlConstant<1>(rkey[  0] + delta[1][ 1]);
77
0
    rkey[ 12] = rotlConstant<1>(rkey[  6] + delta[2][ 2]);
78
0
    rkey[ 18] = rotlConstant<1>(rkey[ 12] + delta[3][ 3]);
79
0
    rkey[ 24] = rotlConstant<1>(rkey[ 18] + delta[0][ 4]);
80
0
    rkey[ 30] = rotlConstant<1>(rkey[ 24] + delta[1][ 5]);
81
0
    rkey[ 36] = rotlConstant<1>(rkey[ 30] + delta[2][ 6]);
82
0
    rkey[ 42] = rotlConstant<1>(rkey[ 36] + delta[3][ 7]);
83
0
    rkey[ 48] = rotlConstant<1>(rkey[ 42] + delta[0][ 8]);
84
0
    rkey[ 54] = rotlConstant<1>(rkey[ 48] + delta[1][ 9]);
85
0
    rkey[ 60] = rotlConstant<1>(rkey[ 54] + delta[2][10]);
86
0
    rkey[ 66] = rotlConstant<1>(rkey[ 60] + delta[3][11]);
87
0
    rkey[ 72] = rotlConstant<1>(rkey[ 66] + delta[0][12]);
88
0
    rkey[ 78] = rotlConstant<1>(rkey[ 72] + delta[1][13]);
89
0
    rkey[ 84] = rotlConstant<1>(rkey[ 78] + delta[2][14]);
90
0
    rkey[ 90] = rotlConstant<1>(rkey[ 84] + delta[3][15]);
91
0
    rkey[ 96] = rotlConstant<1>(rkey[ 90] + delta[0][16]);
92
0
    rkey[102] = rotlConstant<1>(rkey[ 96] + delta[1][17]);
93
0
    rkey[108] = rotlConstant<1>(rkey[102] + delta[2][18]);
94
0
    rkey[114] = rotlConstant<1>(rkey[108] + delta[3][19]);
95
0
    rkey[120] = rotlConstant<1>(rkey[114] + delta[0][20]);
96
0
    rkey[126] = rotlConstant<1>(rkey[120] + delta[1][21]);
97
0
    rkey[132] = rotlConstant<1>(rkey[126] + delta[2][22]);
98
0
    rkey[138] = rotlConstant<1>(rkey[132] + delta[3][23]);
99
100
0
    rkey[  1] = rkey[  3] = rkey[  5] = rotlConstant<3>( key[  1] + delta[0][ 1]);
101
0
    rkey[  7] = rkey[  9] = rkey[ 11] = rotlConstant<3>(rkey[  1] + delta[1][ 2]);
102
0
    rkey[ 13] = rkey[ 15] = rkey[ 17] = rotlConstant<3>(rkey[  7] + delta[2][ 3]);
103
0
    rkey[ 19] = rkey[ 21] = rkey[ 23] = rotlConstant<3>(rkey[ 13] + delta[3][ 4]);
104
0
    rkey[ 25] = rkey[ 27] = rkey[ 29] = rotlConstant<3>(rkey[ 19] + delta[0][ 5]);
105
0
    rkey[ 31] = rkey[ 33] = rkey[ 35] = rotlConstant<3>(rkey[ 25] + delta[1][ 6]);
106
0
    rkey[ 37] = rkey[ 39] = rkey[ 41] = rotlConstant<3>(rkey[ 31] + delta[2][ 7]);
107
0
    rkey[ 43] = rkey[ 45] = rkey[ 47] = rotlConstant<3>(rkey[ 37] + delta[3][ 8]);
108
0
    rkey[ 49] = rkey[ 51] = rkey[ 53] = rotlConstant<3>(rkey[ 43] + delta[0][ 9]);
109
0
    rkey[ 55] = rkey[ 57] = rkey[ 59] = rotlConstant<3>(rkey[ 49] + delta[1][10]);
110
0
    rkey[ 61] = rkey[ 63] = rkey[ 65] = rotlConstant<3>(rkey[ 55] + delta[2][11]);
111
0
    rkey[ 67] = rkey[ 69] = rkey[ 71] = rotlConstant<3>(rkey[ 61] + delta[3][12]);
112
0
    rkey[ 73] = rkey[ 75] = rkey[ 77] = rotlConstant<3>(rkey[ 67] + delta[0][13]);
113
0
    rkey[ 79] = rkey[ 81] = rkey[ 83] = rotlConstant<3>(rkey[ 73] + delta[1][14]);
114
0
    rkey[ 85] = rkey[ 87] = rkey[ 89] = rotlConstant<3>(rkey[ 79] + delta[2][15]);
115
0
    rkey[ 91] = rkey[ 93] = rkey[ 95] = rotlConstant<3>(rkey[ 85] + delta[3][16]);
116
0
    rkey[ 97] = rkey[ 99] = rkey[101] = rotlConstant<3>(rkey[ 91] + delta[0][17]);
117
0
    rkey[103] = rkey[105] = rkey[107] = rotlConstant<3>(rkey[ 97] + delta[1][18]);
118
0
    rkey[109] = rkey[111] = rkey[113] = rotlConstant<3>(rkey[103] + delta[2][19]);
119
0
    rkey[115] = rkey[117] = rkey[119] = rotlConstant<3>(rkey[109] + delta[3][20]);
120
0
    rkey[121] = rkey[123] = rkey[125] = rotlConstant<3>(rkey[115] + delta[0][21]);
121
0
    rkey[127] = rkey[129] = rkey[131] = rotlConstant<3>(rkey[121] + delta[1][22]);
122
0
    rkey[133] = rkey[135] = rkey[137] = rotlConstant<3>(rkey[127] + delta[2][23]);
123
0
    rkey[139] = rkey[141] = rkey[143] = rotlConstant<3>(rkey[133] + delta[3][24]);
124
125
0
    rkey[  2] = rotlConstant<6>( key[  2] + delta[0][ 2]);
126
0
    rkey[  8] = rotlConstant<6>(rkey[  2] + delta[1][ 3]);
127
0
    rkey[ 14] = rotlConstant<6>(rkey[  8] + delta[2][ 4]);
128
0
    rkey[ 20] = rotlConstant<6>(rkey[ 14] + delta[3][ 5]);
129
0
    rkey[ 26] = rotlConstant<6>(rkey[ 20] + delta[0][ 6]);
130
0
    rkey[ 32] = rotlConstant<6>(rkey[ 26] + delta[1][ 7]);
131
0
    rkey[ 38] = rotlConstant<6>(rkey[ 32] + delta[2][ 8]);
132
0
    rkey[ 44] = rotlConstant<6>(rkey[ 38] + delta[3][ 9]);
133
0
    rkey[ 50] = rotlConstant<6>(rkey[ 44] + delta[0][10]);
134
0
    rkey[ 56] = rotlConstant<6>(rkey[ 50] + delta[1][11]);
135
0
    rkey[ 62] = rotlConstant<6>(rkey[ 56] + delta[2][12]);
136
0
    rkey[ 68] = rotlConstant<6>(rkey[ 62] + delta[3][13]);
137
0
    rkey[ 74] = rotlConstant<6>(rkey[ 68] + delta[0][14]);
138
0
    rkey[ 80] = rotlConstant<6>(rkey[ 74] + delta[1][15]);
139
0
    rkey[ 86] = rotlConstant<6>(rkey[ 80] + delta[2][16]);
140
0
    rkey[ 92] = rotlConstant<6>(rkey[ 86] + delta[3][17]);
141
0
    rkey[ 98] = rotlConstant<6>(rkey[ 92] + delta[0][18]);
142
0
    rkey[104] = rotlConstant<6>(rkey[ 98] + delta[1][19]);
143
0
    rkey[110] = rotlConstant<6>(rkey[104] + delta[2][20]);
144
0
    rkey[116] = rotlConstant<6>(rkey[110] + delta[3][21]);
145
0
    rkey[122] = rotlConstant<6>(rkey[116] + delta[0][22]);
146
0
    rkey[128] = rotlConstant<6>(rkey[122] + delta[1][23]);
147
0
    rkey[134] = rotlConstant<6>(rkey[128] + delta[2][24]);
148
0
    rkey[140] = rotlConstant<6>(rkey[134] + delta[3][25]);
149
150
0
    rkey[  4] = rotlConstant<11>( key[  3] + delta[0][ 3]);
151
0
    rkey[ 10] = rotlConstant<11>(rkey[  4] + delta[1][ 4]);
152
0
    rkey[ 16] = rotlConstant<11>(rkey[ 10] + delta[2][ 5]);
153
0
    rkey[ 22] = rotlConstant<11>(rkey[ 16] + delta[3][ 6]);
154
0
    rkey[ 28] = rotlConstant<11>(rkey[ 22] + delta[0][ 7]);
155
0
    rkey[ 34] = rotlConstant<11>(rkey[ 28] + delta[1][ 8]);
156
0
    rkey[ 40] = rotlConstant<11>(rkey[ 34] + delta[2][ 9]);
157
0
    rkey[ 46] = rotlConstant<11>(rkey[ 40] + delta[3][10]);
158
0
    rkey[ 52] = rotlConstant<11>(rkey[ 46] + delta[0][11]);
159
0
    rkey[ 58] = rotlConstant<11>(rkey[ 52] + delta[1][12]);
160
0
    rkey[ 64] = rotlConstant<11>(rkey[ 58] + delta[2][13]);
161
0
    rkey[ 70] = rotlConstant<11>(rkey[ 64] + delta[3][14]);
162
0
    rkey[ 76] = rotlConstant<11>(rkey[ 70] + delta[0][15]);
163
0
    rkey[ 82] = rotlConstant<11>(rkey[ 76] + delta[1][16]);
164
0
    rkey[ 88] = rotlConstant<11>(rkey[ 82] + delta[2][17]);
165
0
    rkey[ 94] = rotlConstant<11>(rkey[ 88] + delta[3][18]);
166
0
    rkey[100] = rotlConstant<11>(rkey[ 94] + delta[0][19]);
167
0
    rkey[106] = rotlConstant<11>(rkey[100] + delta[1][20]);
168
0
    rkey[112] = rotlConstant<11>(rkey[106] + delta[2][21]);
169
0
    rkey[118] = rotlConstant<11>(rkey[112] + delta[3][22]);
170
0
    rkey[124] = rotlConstant<11>(rkey[118] + delta[0][23]);
171
0
    rkey[130] = rotlConstant<11>(rkey[124] + delta[1][24]);
172
0
    rkey[136] = rotlConstant<11>(rkey[130] + delta[2][25]);
173
0
    rkey[142] = rotlConstant<11>(rkey[136] + delta[3][26]);
174
0
}
175
176
inline void SetKey192(word32 rkey[168], const word32 key[6])
177
1
{
178
1
    rkey[  0] = rotlConstant<1>( key[  0] + delta[0][ 0]);
179
1
    rkey[  6] = rotlConstant<1>(rkey[  0] + delta[1][ 1]);
180
1
    rkey[ 12] = rotlConstant<1>(rkey[  6] + delta[2][ 2]);
181
1
    rkey[ 18] = rotlConstant<1>(rkey[ 12] + delta[3][ 3]);
182
1
    rkey[ 24] = rotlConstant<1>(rkey[ 18] + delta[4][ 4]);
183
1
    rkey[ 30] = rotlConstant<1>(rkey[ 24] + delta[5][ 5]);
184
1
    rkey[ 36] = rotlConstant<1>(rkey[ 30] + delta[0][ 6]);
185
1
    rkey[ 42] = rotlConstant<1>(rkey[ 36] + delta[1][ 7]);
186
1
    rkey[ 48] = rotlConstant<1>(rkey[ 42] + delta[2][ 8]);
187
1
    rkey[ 54] = rotlConstant<1>(rkey[ 48] + delta[3][ 9]);
188
1
    rkey[ 60] = rotlConstant<1>(rkey[ 54] + delta[4][10]);
189
1
    rkey[ 66] = rotlConstant<1>(rkey[ 60] + delta[5][11]);
190
1
    rkey[ 72] = rotlConstant<1>(rkey[ 66] + delta[0][12]);
191
1
    rkey[ 78] = rotlConstant<1>(rkey[ 72] + delta[1][13]);
192
1
    rkey[ 84] = rotlConstant<1>(rkey[ 78] + delta[2][14]);
193
1
    rkey[ 90] = rotlConstant<1>(rkey[ 84] + delta[3][15]);
194
1
    rkey[ 96] = rotlConstant<1>(rkey[ 90] + delta[4][16]);
195
1
    rkey[102] = rotlConstant<1>(rkey[ 96] + delta[5][17]);
196
1
    rkey[108] = rotlConstant<1>(rkey[102] + delta[0][18]);
197
1
    rkey[114] = rotlConstant<1>(rkey[108] + delta[1][19]);
198
1
    rkey[120] = rotlConstant<1>(rkey[114] + delta[2][20]);
199
1
    rkey[126] = rotlConstant<1>(rkey[120] + delta[3][21]);
200
1
    rkey[132] = rotlConstant<1>(rkey[126] + delta[4][22]);
201
1
    rkey[138] = rotlConstant<1>(rkey[132] + delta[5][23]);
202
1
    rkey[144] = rotlConstant<1>(rkey[138] + delta[0][24]);
203
1
    rkey[150] = rotlConstant<1>(rkey[144] + delta[1][25]);
204
1
    rkey[156] = rotlConstant<1>(rkey[150] + delta[2][26]);
205
1
    rkey[162] = rotlConstant<1>(rkey[156] + delta[3][27]);
206
207
1
    rkey[  1] = rotlConstant<3>( key[  1] + delta[0][ 1]);
208
1
    rkey[  7] = rotlConstant<3>(rkey[  1] + delta[1][ 2]);
209
1
    rkey[ 13] = rotlConstant<3>(rkey[  7] + delta[2][ 3]);
210
1
    rkey[ 19] = rotlConstant<3>(rkey[ 13] + delta[3][ 4]);
211
1
    rkey[ 25] = rotlConstant<3>(rkey[ 19] + delta[4][ 5]);
212
1
    rkey[ 31] = rotlConstant<3>(rkey[ 25] + delta[5][ 6]);
213
1
    rkey[ 37] = rotlConstant<3>(rkey[ 31] + delta[0][ 7]);
214
1
    rkey[ 43] = rotlConstant<3>(rkey[ 37] + delta[1][ 8]);
215
1
    rkey[ 49] = rotlConstant<3>(rkey[ 43] + delta[2][ 9]);
216
1
    rkey[ 55] = rotlConstant<3>(rkey[ 49] + delta[3][10]);
217
1
    rkey[ 61] = rotlConstant<3>(rkey[ 55] + delta[4][11]);
218
1
    rkey[ 67] = rotlConstant<3>(rkey[ 61] + delta[5][12]);
219
1
    rkey[ 73] = rotlConstant<3>(rkey[ 67] + delta[0][13]);
220
1
    rkey[ 79] = rotlConstant<3>(rkey[ 73] + delta[1][14]);
221
1
    rkey[ 85] = rotlConstant<3>(rkey[ 79] + delta[2][15]);
222
1
    rkey[ 91] = rotlConstant<3>(rkey[ 85] + delta[3][16]);
223
1
    rkey[ 97] = rotlConstant<3>(rkey[ 91] + delta[4][17]);
224
1
    rkey[103] = rotlConstant<3>(rkey[ 97] + delta[5][18]);
225
1
    rkey[109] = rotlConstant<3>(rkey[103] + delta[0][19]);
226
1
    rkey[115] = rotlConstant<3>(rkey[109] + delta[1][20]);
227
1
    rkey[121] = rotlConstant<3>(rkey[115] + delta[2][21]);
228
1
    rkey[127] = rotlConstant<3>(rkey[121] + delta[3][22]);
229
1
    rkey[133] = rotlConstant<3>(rkey[127] + delta[4][23]);
230
1
    rkey[139] = rotlConstant<3>(rkey[133] + delta[5][24]);
231
1
    rkey[145] = rotlConstant<3>(rkey[139] + delta[0][25]);
232
1
    rkey[151] = rotlConstant<3>(rkey[145] + delta[1][26]);
233
1
    rkey[157] = rotlConstant<3>(rkey[151] + delta[2][27]);
234
1
    rkey[163] = rotlConstant<3>(rkey[157] + delta[3][28]);
235
236
1
    rkey[  2] = rotlConstant<6>( key[  2] + delta[0][ 2]);
237
1
    rkey[  8] = rotlConstant<6>(rkey[  2] + delta[1][ 3]);
238
1
    rkey[ 14] = rotlConstant<6>(rkey[  8] + delta[2][ 4]);
239
1
    rkey[ 20] = rotlConstant<6>(rkey[ 14] + delta[3][ 5]);
240
1
    rkey[ 26] = rotlConstant<6>(rkey[ 20] + delta[4][ 6]);
241
1
    rkey[ 32] = rotlConstant<6>(rkey[ 26] + delta[5][ 7]);
242
1
    rkey[ 38] = rotlConstant<6>(rkey[ 32] + delta[0][ 8]);
243
1
    rkey[ 44] = rotlConstant<6>(rkey[ 38] + delta[1][ 9]);
244
1
    rkey[ 50] = rotlConstant<6>(rkey[ 44] + delta[2][10]);
245
1
    rkey[ 56] = rotlConstant<6>(rkey[ 50] + delta[3][11]);
246
1
    rkey[ 62] = rotlConstant<6>(rkey[ 56] + delta[4][12]);
247
1
    rkey[ 68] = rotlConstant<6>(rkey[ 62] + delta[5][13]);
248
1
    rkey[ 74] = rotlConstant<6>(rkey[ 68] + delta[0][14]);
249
1
    rkey[ 80] = rotlConstant<6>(rkey[ 74] + delta[1][15]);
250
1
    rkey[ 86] = rotlConstant<6>(rkey[ 80] + delta[2][16]);
251
1
    rkey[ 92] = rotlConstant<6>(rkey[ 86] + delta[3][17]);
252
1
    rkey[ 98] = rotlConstant<6>(rkey[ 92] + delta[4][18]);
253
1
    rkey[104] = rotlConstant<6>(rkey[ 98] + delta[5][19]);
254
1
    rkey[110] = rotlConstant<6>(rkey[104] + delta[0][20]);
255
1
    rkey[116] = rotlConstant<6>(rkey[110] + delta[1][21]);
256
1
    rkey[122] = rotlConstant<6>(rkey[116] + delta[2][22]);
257
1
    rkey[128] = rotlConstant<6>(rkey[122] + delta[3][23]);
258
1
    rkey[134] = rotlConstant<6>(rkey[128] + delta[4][24]);
259
1
    rkey[140] = rotlConstant<6>(rkey[134] + delta[5][25]);
260
1
    rkey[146] = rotlConstant<6>(rkey[140] + delta[0][26]);
261
1
    rkey[152] = rotlConstant<6>(rkey[146] + delta[1][27]);
262
1
    rkey[158] = rotlConstant<6>(rkey[152] + delta[2][28]);
263
1
    rkey[164] = rotlConstant<6>(rkey[158] + delta[3][29]);
264
265
1
    rkey[  3] = rotlConstant<11>( key[  3] + delta[0][ 3]);
266
1
    rkey[  9] = rotlConstant<11>(rkey[  3] + delta[1][ 4]);
267
1
    rkey[ 15] = rotlConstant<11>(rkey[  9] + delta[2][ 5]);
268
1
    rkey[ 21] = rotlConstant<11>(rkey[ 15] + delta[3][ 6]);
269
1
    rkey[ 27] = rotlConstant<11>(rkey[ 21] + delta[4][ 7]);
270
1
    rkey[ 33] = rotlConstant<11>(rkey[ 27] + delta[5][ 8]);
271
1
    rkey[ 39] = rotlConstant<11>(rkey[ 33] + delta[0][ 9]);
272
1
    rkey[ 45] = rotlConstant<11>(rkey[ 39] + delta[1][10]);
273
1
    rkey[ 51] = rotlConstant<11>(rkey[ 45] + delta[2][11]);
274
1
    rkey[ 57] = rotlConstant<11>(rkey[ 51] + delta[3][12]);
275
1
    rkey[ 63] = rotlConstant<11>(rkey[ 57] + delta[4][13]);
276
1
    rkey[ 69] = rotlConstant<11>(rkey[ 63] + delta[5][14]);
277
1
    rkey[ 75] = rotlConstant<11>(rkey[ 69] + delta[0][15]);
278
1
    rkey[ 81] = rotlConstant<11>(rkey[ 75] + delta[1][16]);
279
1
    rkey[ 87] = rotlConstant<11>(rkey[ 81] + delta[2][17]);
280
1
    rkey[ 93] = rotlConstant<11>(rkey[ 87] + delta[3][18]);
281
1
    rkey[ 99] = rotlConstant<11>(rkey[ 93] + delta[4][19]);
282
1
    rkey[105] = rotlConstant<11>(rkey[ 99] + delta[5][20]);
283
1
    rkey[111] = rotlConstant<11>(rkey[105] + delta[0][21]);
284
1
    rkey[117] = rotlConstant<11>(rkey[111] + delta[1][22]);
285
1
    rkey[123] = rotlConstant<11>(rkey[117] + delta[2][23]);
286
1
    rkey[129] = rotlConstant<11>(rkey[123] + delta[3][24]);
287
1
    rkey[135] = rotlConstant<11>(rkey[129] + delta[4][25]);
288
1
    rkey[141] = rotlConstant<11>(rkey[135] + delta[5][26]);
289
1
    rkey[147] = rotlConstant<11>(rkey[141] + delta[0][27]);
290
1
    rkey[153] = rotlConstant<11>(rkey[147] + delta[1][28]);
291
1
    rkey[159] = rotlConstant<11>(rkey[153] + delta[2][29]);
292
1
    rkey[165] = rotlConstant<11>(rkey[159] + delta[3][30]);
293
294
1
    rkey[  4] = rotlConstant<13>( key[  4] + delta[0][ 4]);
295
1
    rkey[ 10] = rotlConstant<13>(rkey[  4] + delta[1][ 5]);
296
1
    rkey[ 16] = rotlConstant<13>(rkey[ 10] + delta[2][ 6]);
297
1
    rkey[ 22] = rotlConstant<13>(rkey[ 16] + delta[3][ 7]);
298
1
    rkey[ 28] = rotlConstant<13>(rkey[ 22] + delta[4][ 8]);
299
1
    rkey[ 34] = rotlConstant<13>(rkey[ 28] + delta[5][ 9]);
300
1
    rkey[ 40] = rotlConstant<13>(rkey[ 34] + delta[0][10]);
301
1
    rkey[ 46] = rotlConstant<13>(rkey[ 40] + delta[1][11]);
302
1
    rkey[ 52] = rotlConstant<13>(rkey[ 46] + delta[2][12]);
303
1
    rkey[ 58] = rotlConstant<13>(rkey[ 52] + delta[3][13]);
304
1
    rkey[ 64] = rotlConstant<13>(rkey[ 58] + delta[4][14]);
305
1
    rkey[ 70] = rotlConstant<13>(rkey[ 64] + delta[5][15]);
306
1
    rkey[ 76] = rotlConstant<13>(rkey[ 70] + delta[0][16]);
307
1
    rkey[ 82] = rotlConstant<13>(rkey[ 76] + delta[1][17]);
308
1
    rkey[ 88] = rotlConstant<13>(rkey[ 82] + delta[2][18]);
309
1
    rkey[ 94] = rotlConstant<13>(rkey[ 88] + delta[3][19]);
310
1
    rkey[100] = rotlConstant<13>(rkey[ 94] + delta[4][20]);
311
1
    rkey[106] = rotlConstant<13>(rkey[100] + delta[5][21]);
312
1
    rkey[112] = rotlConstant<13>(rkey[106] + delta[0][22]);
313
1
    rkey[118] = rotlConstant<13>(rkey[112] + delta[1][23]);
314
1
    rkey[124] = rotlConstant<13>(rkey[118] + delta[2][24]);
315
1
    rkey[130] = rotlConstant<13>(rkey[124] + delta[3][25]);
316
1
    rkey[136] = rotlConstant<13>(rkey[130] + delta[4][26]);
317
1
    rkey[142] = rotlConstant<13>(rkey[136] + delta[5][27]);
318
1
    rkey[148] = rotlConstant<13>(rkey[142] + delta[0][28]);
319
1
    rkey[154] = rotlConstant<13>(rkey[148] + delta[1][29]);
320
1
    rkey[160] = rotlConstant<13>(rkey[154] + delta[2][30]);
321
1
    rkey[166] = rotlConstant<13>(rkey[160] + delta[3][31]);
322
323
1
    rkey[  5] = rotlConstant<17>( key[  5] + delta[0][ 5]);
324
1
    rkey[ 11] = rotlConstant<17>(rkey[  5] + delta[1][ 6]);
325
1
    rkey[ 17] = rotlConstant<17>(rkey[ 11] + delta[2][ 7]);
326
1
    rkey[ 23] = rotlConstant<17>(rkey[ 17] + delta[3][ 8]);
327
1
    rkey[ 29] = rotlConstant<17>(rkey[ 23] + delta[4][ 9]);
328
1
    rkey[ 35] = rotlConstant<17>(rkey[ 29] + delta[5][10]);
329
1
    rkey[ 41] = rotlConstant<17>(rkey[ 35] + delta[0][11]);
330
1
    rkey[ 47] = rotlConstant<17>(rkey[ 41] + delta[1][12]);
331
1
    rkey[ 53] = rotlConstant<17>(rkey[ 47] + delta[2][13]);
332
1
    rkey[ 59] = rotlConstant<17>(rkey[ 53] + delta[3][14]);
333
1
    rkey[ 65] = rotlConstant<17>(rkey[ 59] + delta[4][15]);
334
1
    rkey[ 71] = rotlConstant<17>(rkey[ 65] + delta[5][16]);
335
1
    rkey[ 77] = rotlConstant<17>(rkey[ 71] + delta[0][17]);
336
1
    rkey[ 83] = rotlConstant<17>(rkey[ 77] + delta[1][18]);
337
1
    rkey[ 89] = rotlConstant<17>(rkey[ 83] + delta[2][19]);
338
1
    rkey[ 95] = rotlConstant<17>(rkey[ 89] + delta[3][20]);
339
1
    rkey[101] = rotlConstant<17>(rkey[ 95] + delta[4][21]);
340
1
    rkey[107] = rotlConstant<17>(rkey[101] + delta[5][22]);
341
1
    rkey[113] = rotlConstant<17>(rkey[107] + delta[0][23]);
342
1
    rkey[119] = rotlConstant<17>(rkey[113] + delta[1][24]);
343
1
    rkey[125] = rotlConstant<17>(rkey[119] + delta[2][25]);
344
1
    rkey[131] = rotlConstant<17>(rkey[125] + delta[3][26]);
345
1
    rkey[137] = rotlConstant<17>(rkey[131] + delta[4][27]);
346
1
    rkey[143] = rotlConstant<17>(rkey[137] + delta[5][28]);
347
1
    rkey[149] = rotlConstant<17>(rkey[143] + delta[0][29]);
348
1
    rkey[155] = rotlConstant<17>(rkey[149] + delta[1][30]);
349
1
    rkey[161] = rotlConstant<17>(rkey[155] + delta[2][31]);
350
1
    rkey[167] = rotlConstant<17>(rkey[161] + delta[3][ 0]);
351
1
}
352
353
inline void SetKey256(word32 rkey[192], const word32 key[8])
354
2
{
355
2
    rkey[  0] = rotlConstant< 1>( key[  0] + delta[0][ 0]);
356
2
    rkey[  8] = rotlConstant< 6>(rkey[  0] + delta[1][ 3]);
357
2
    rkey[ 16] = rotlConstant<13>(rkey[  8] + delta[2][ 6]);
358
2
    rkey[ 24] = rotlConstant< 1>(rkey[ 16] + delta[4][ 4]);
359
2
    rkey[ 32] = rotlConstant< 6>(rkey[ 24] + delta[5][ 7]);
360
2
    rkey[ 40] = rotlConstant<13>(rkey[ 32] + delta[6][10]);
361
2
    rkey[ 48] = rotlConstant< 1>(rkey[ 40] + delta[0][ 8]);
362
2
    rkey[ 56] = rotlConstant< 6>(rkey[ 48] + delta[1][11]);
363
2
    rkey[ 64] = rotlConstant<13>(rkey[ 56] + delta[2][14]);
364
2
    rkey[ 72] = rotlConstant< 1>(rkey[ 64] + delta[4][12]);
365
2
    rkey[ 80] = rotlConstant< 6>(rkey[ 72] + delta[5][15]);
366
2
    rkey[ 88] = rotlConstant<13>(rkey[ 80] + delta[6][18]);
367
2
    rkey[ 96] = rotlConstant< 1>(rkey[ 88] + delta[0][16]);
368
2
    rkey[104] = rotlConstant< 6>(rkey[ 96] + delta[1][19]);
369
2
    rkey[112] = rotlConstant<13>(rkey[104] + delta[2][22]);
370
2
    rkey[120] = rotlConstant< 1>(rkey[112] + delta[4][20]);
371
2
    rkey[128] = rotlConstant< 6>(rkey[120] + delta[5][23]);
372
2
    rkey[136] = rotlConstant<13>(rkey[128] + delta[6][26]);
373
2
    rkey[144] = rotlConstant< 1>(rkey[136] + delta[0][24]);
374
2
    rkey[152] = rotlConstant< 6>(rkey[144] + delta[1][27]);
375
2
    rkey[160] = rotlConstant<13>(rkey[152] + delta[2][30]);
376
2
    rkey[168] = rotlConstant< 1>(rkey[160] + delta[4][28]);
377
2
    rkey[176] = rotlConstant< 6>(rkey[168] + delta[5][31]);
378
2
    rkey[184] = rotlConstant<13>(rkey[176] + delta[6][ 2]);
379
380
2
    rkey[  1] = rotlConstant< 3>( key[  1] + delta[0][ 1]);
381
2
    rkey[  9] = rotlConstant<11>(rkey[  1] + delta[1][ 4]);
382
2
    rkey[ 17] = rotlConstant<17>(rkey[  9] + delta[2][ 7]);
383
2
    rkey[ 25] = rotlConstant< 3>(rkey[ 17] + delta[4][ 5]);
384
2
    rkey[ 33] = rotlConstant<11>(rkey[ 25] + delta[5][ 8]);
385
2
    rkey[ 41] = rotlConstant<17>(rkey[ 33] + delta[6][11]);
386
2
    rkey[ 49] = rotlConstant< 3>(rkey[ 41] + delta[0][ 9]);
387
2
    rkey[ 57] = rotlConstant<11>(rkey[ 49] + delta[1][12]);
388
2
    rkey[ 65] = rotlConstant<17>(rkey[ 57] + delta[2][15]);
389
2
    rkey[ 73] = rotlConstant< 3>(rkey[ 65] + delta[4][13]);
390
2
    rkey[ 81] = rotlConstant<11>(rkey[ 73] + delta[5][16]);
391
2
    rkey[ 89] = rotlConstant<17>(rkey[ 81] + delta[6][19]);
392
2
    rkey[ 97] = rotlConstant< 3>(rkey[ 89] + delta[0][17]);
393
2
    rkey[105] = rotlConstant<11>(rkey[ 97] + delta[1][20]);
394
2
    rkey[113] = rotlConstant<17>(rkey[105] + delta[2][23]);
395
2
    rkey[121] = rotlConstant< 3>(rkey[113] + delta[4][21]);
396
2
    rkey[129] = rotlConstant<11>(rkey[121] + delta[5][24]);
397
2
    rkey[137] = rotlConstant<17>(rkey[129] + delta[6][27]);
398
2
    rkey[145] = rotlConstant< 3>(rkey[137] + delta[0][25]);
399
2
    rkey[153] = rotlConstant<11>(rkey[145] + delta[1][28]);
400
2
    rkey[161] = rotlConstant<17>(rkey[153] + delta[2][31]);
401
2
    rkey[169] = rotlConstant< 3>(rkey[161] + delta[4][29]);
402
2
    rkey[177] = rotlConstant<11>(rkey[169] + delta[5][ 0]);
403
2
    rkey[185] = rotlConstant<17>(rkey[177] + delta[6][ 3]);
404
405
2
    rkey[  2] = rotlConstant< 6>( key[  2] + delta[0][ 2]);
406
2
    rkey[ 10] = rotlConstant<13>(rkey[  2] + delta[1][ 5]);
407
2
    rkey[ 18] = rotlConstant< 1>(rkey[ 10] + delta[3][ 3]);
408
2
    rkey[ 26] = rotlConstant< 6>(rkey[ 18] + delta[4][ 6]);
409
2
    rkey[ 34] = rotlConstant<13>(rkey[ 26] + delta[5][ 9]);
410
2
    rkey[ 42] = rotlConstant< 1>(rkey[ 34] + delta[7][ 7]);
411
2
    rkey[ 50] = rotlConstant< 6>(rkey[ 42] + delta[0][10]);
412
2
    rkey[ 58] = rotlConstant<13>(rkey[ 50] + delta[1][13]);
413
2
    rkey[ 66] = rotlConstant< 1>(rkey[ 58] + delta[3][11]);
414
2
    rkey[ 74] = rotlConstant< 6>(rkey[ 66] + delta[4][14]);
415
2
    rkey[ 82] = rotlConstant<13>(rkey[ 74] + delta[5][17]);
416
2
    rkey[ 90] = rotlConstant< 1>(rkey[ 82] + delta[7][15]);
417
2
    rkey[ 98] = rotlConstant< 6>(rkey[ 90] + delta[0][18]);
418
2
    rkey[106] = rotlConstant<13>(rkey[ 98] + delta[1][21]);
419
2
    rkey[114] = rotlConstant< 1>(rkey[106] + delta[3][19]);
420
2
    rkey[122] = rotlConstant< 6>(rkey[114] + delta[4][22]);
421
2
    rkey[130] = rotlConstant<13>(rkey[122] + delta[5][25]);
422
2
    rkey[138] = rotlConstant< 1>(rkey[130] + delta[7][23]);
423
2
    rkey[146] = rotlConstant< 6>(rkey[138] + delta[0][26]);
424
2
    rkey[154] = rotlConstant<13>(rkey[146] + delta[1][29]);
425
2
    rkey[162] = rotlConstant< 1>(rkey[154] + delta[3][27]);
426
2
    rkey[170] = rotlConstant< 6>(rkey[162] + delta[4][30]);
427
2
    rkey[178] = rotlConstant<13>(rkey[170] + delta[5][ 1]);
428
2
    rkey[186] = rotlConstant< 1>(rkey[178] + delta[7][31]);
429
430
2
    rkey[  3] = rotlConstant<11>( key[  3] + delta[0][ 3]);
431
2
    rkey[ 11] = rotlConstant<17>(rkey[  3] + delta[1][ 6]);
432
2
    rkey[ 19] = rotlConstant< 3>(rkey[ 11] + delta[3][ 4]);
433
2
    rkey[ 27] = rotlConstant<11>(rkey[ 19] + delta[4][ 7]);
434
2
    rkey[ 35] = rotlConstant<17>(rkey[ 27] + delta[5][10]);
435
2
    rkey[ 43] = rotlConstant< 3>(rkey[ 35] + delta[7][ 8]);
436
2
    rkey[ 51] = rotlConstant<11>(rkey[ 43] + delta[0][11]);
437
2
    rkey[ 59] = rotlConstant<17>(rkey[ 51] + delta[1][14]);
438
2
    rkey[ 67] = rotlConstant< 3>(rkey[ 59] + delta[3][12]);
439
2
    rkey[ 75] = rotlConstant<11>(rkey[ 67] + delta[4][15]);
440
2
    rkey[ 83] = rotlConstant<17>(rkey[ 75] + delta[5][18]);
441
2
    rkey[ 91] = rotlConstant< 3>(rkey[ 83] + delta[7][16]);
442
2
    rkey[ 99] = rotlConstant<11>(rkey[ 91] + delta[0][19]);
443
2
    rkey[107] = rotlConstant<17>(rkey[ 99] + delta[1][22]);
444
2
    rkey[115] = rotlConstant< 3>(rkey[107] + delta[3][20]);
445
2
    rkey[123] = rotlConstant<11>(rkey[115] + delta[4][23]);
446
2
    rkey[131] = rotlConstant<17>(rkey[123] + delta[5][26]);
447
2
    rkey[139] = rotlConstant< 3>(rkey[131] + delta[7][24]);
448
2
    rkey[147] = rotlConstant<11>(rkey[139] + delta[0][27]);
449
2
    rkey[155] = rotlConstant<17>(rkey[147] + delta[1][30]);
450
2
    rkey[163] = rotlConstant< 3>(rkey[155] + delta[3][28]);
451
2
    rkey[171] = rotlConstant<11>(rkey[163] + delta[4][31]);
452
2
    rkey[179] = rotlConstant<17>(rkey[171] + delta[5][ 2]);
453
2
    rkey[187] = rotlConstant< 3>(rkey[179] + delta[7][ 0]);
454
455
2
    rkey[  4] = rotlConstant<13>( key[  4] + delta[0][ 4]);
456
2
    rkey[ 12] = rotlConstant< 1>(rkey[  4] + delta[2][ 2]);
457
2
    rkey[ 20] = rotlConstant< 6>(rkey[ 12] + delta[3][ 5]);
458
2
    rkey[ 28] = rotlConstant<13>(rkey[ 20] + delta[4][ 8]);
459
2
    rkey[ 36] = rotlConstant< 1>(rkey[ 28] + delta[6][ 6]);
460
2
    rkey[ 44] = rotlConstant< 6>(rkey[ 36] + delta[7][ 9]);
461
2
    rkey[ 52] = rotlConstant<13>(rkey[ 44] + delta[0][12]);
462
2
    rkey[ 60] = rotlConstant< 1>(rkey[ 52] + delta[2][10]);
463
2
    rkey[ 68] = rotlConstant< 6>(rkey[ 60] + delta[3][13]);
464
2
    rkey[ 76] = rotlConstant<13>(rkey[ 68] + delta[4][16]);
465
2
    rkey[ 84] = rotlConstant< 1>(rkey[ 76] + delta[6][14]);
466
2
    rkey[ 92] = rotlConstant< 6>(rkey[ 84] + delta[7][17]);
467
2
    rkey[100] = rotlConstant<13>(rkey[ 92] + delta[0][20]);
468
2
    rkey[108] = rotlConstant< 1>(rkey[100] + delta[2][18]);
469
2
    rkey[116] = rotlConstant< 6>(rkey[108] + delta[3][21]);
470
2
    rkey[124] = rotlConstant<13>(rkey[116] + delta[4][24]);
471
2
    rkey[132] = rotlConstant< 1>(rkey[124] + delta[6][22]);
472
2
    rkey[140] = rotlConstant< 6>(rkey[132] + delta[7][25]);
473
2
    rkey[148] = rotlConstant<13>(rkey[140] + delta[0][28]);
474
2
    rkey[156] = rotlConstant< 1>(rkey[148] + delta[2][26]);
475
2
    rkey[164] = rotlConstant< 6>(rkey[156] + delta[3][29]);
476
2
    rkey[172] = rotlConstant<13>(rkey[164] + delta[4][ 0]);
477
2
    rkey[180] = rotlConstant< 1>(rkey[172] + delta[6][30]);
478
2
    rkey[188] = rotlConstant< 6>(rkey[180] + delta[7][ 1]);
479
480
2
    rkey[  5] = rotlConstant<17>( key[  5] + delta[0][ 5]);
481
2
    rkey[ 13] = rotlConstant< 3>(rkey[  5] + delta[2][ 3]);
482
2
    rkey[ 21] = rotlConstant<11>(rkey[ 13] + delta[3][ 6]);
483
2
    rkey[ 29] = rotlConstant<17>(rkey[ 21] + delta[4][ 9]);
484
2
    rkey[ 37] = rotlConstant< 3>(rkey[ 29] + delta[6][ 7]);
485
2
    rkey[ 45] = rotlConstant<11>(rkey[ 37] + delta[7][10]);
486
2
    rkey[ 53] = rotlConstant<17>(rkey[ 45] + delta[0][13]);
487
2
    rkey[ 61] = rotlConstant< 3>(rkey[ 53] + delta[2][11]);
488
2
    rkey[ 69] = rotlConstant<11>(rkey[ 61] + delta[3][14]);
489
2
    rkey[ 77] = rotlConstant<17>(rkey[ 69] + delta[4][17]);
490
2
    rkey[ 85] = rotlConstant< 3>(rkey[ 77] + delta[6][15]);
491
2
    rkey[ 93] = rotlConstant<11>(rkey[ 85] + delta[7][18]);
492
2
    rkey[101] = rotlConstant<17>(rkey[ 93] + delta[0][21]);
493
2
    rkey[109] = rotlConstant< 3>(rkey[101] + delta[2][19]);
494
2
    rkey[117] = rotlConstant<11>(rkey[109] + delta[3][22]);
495
2
    rkey[125] = rotlConstant<17>(rkey[117] + delta[4][25]);
496
2
    rkey[133] = rotlConstant< 3>(rkey[125] + delta[6][23]);
497
2
    rkey[141] = rotlConstant<11>(rkey[133] + delta[7][26]);
498
2
    rkey[149] = rotlConstant<17>(rkey[141] + delta[0][29]);
499
2
    rkey[157] = rotlConstant< 3>(rkey[149] + delta[2][27]);
500
2
    rkey[165] = rotlConstant<11>(rkey[157] + delta[3][30]);
501
2
    rkey[173] = rotlConstant<17>(rkey[165] + delta[4][ 1]);
502
2
    rkey[181] = rotlConstant< 3>(rkey[173] + delta[6][31]);
503
2
    rkey[189] = rotlConstant<11>(rkey[181] + delta[7][ 2]);
504
505
2
    rkey[  6] = rotlConstant< 1>( key[  6] + delta[1][ 1]);
506
2
    rkey[ 14] = rotlConstant< 6>(rkey[  6] + delta[2][ 4]);
507
2
    rkey[ 22] = rotlConstant<13>(rkey[ 14] + delta[3][ 7]);
508
2
    rkey[ 30] = rotlConstant< 1>(rkey[ 22] + delta[5][ 5]);
509
2
    rkey[ 38] = rotlConstant< 6>(rkey[ 30] + delta[6][ 8]);
510
2
    rkey[ 46] = rotlConstant<13>(rkey[ 38] + delta[7][11]);
511
2
    rkey[ 54] = rotlConstant< 1>(rkey[ 46] + delta[1][ 9]);
512
2
    rkey[ 62] = rotlConstant< 6>(rkey[ 54] + delta[2][12]);
513
2
    rkey[ 70] = rotlConstant<13>(rkey[ 62] + delta[3][15]);
514
2
    rkey[ 78] = rotlConstant< 1>(rkey[ 70] + delta[5][13]);
515
2
    rkey[ 86] = rotlConstant< 6>(rkey[ 78] + delta[6][16]);
516
2
    rkey[ 94] = rotlConstant<13>(rkey[ 86] + delta[7][19]);
517
2
    rkey[102] = rotlConstant< 1>(rkey[ 94] + delta[1][17]);
518
2
    rkey[110] = rotlConstant< 6>(rkey[102] + delta[2][20]);
519
2
    rkey[118] = rotlConstant<13>(rkey[110] + delta[3][23]);
520
2
    rkey[126] = rotlConstant< 1>(rkey[118] + delta[5][21]);
521
2
    rkey[134] = rotlConstant< 6>(rkey[126] + delta[6][24]);
522
2
    rkey[142] = rotlConstant<13>(rkey[134] + delta[7][27]);
523
2
    rkey[150] = rotlConstant< 1>(rkey[142] + delta[1][25]);
524
2
    rkey[158] = rotlConstant< 6>(rkey[150] + delta[2][28]);
525
2
    rkey[166] = rotlConstant<13>(rkey[158] + delta[3][31]);
526
2
    rkey[174] = rotlConstant< 1>(rkey[166] + delta[5][29]);
527
2
    rkey[182] = rotlConstant< 6>(rkey[174] + delta[6][ 0]);
528
2
    rkey[190] = rotlConstant<13>(rkey[182] + delta[7][ 3]);
529
530
2
    rkey[  7] = rotlConstant< 3>( key[  7] + delta[1][ 2]);
531
2
    rkey[ 15] = rotlConstant<11>(rkey[  7] + delta[2][ 5]);
532
2
    rkey[ 23] = rotlConstant<17>(rkey[ 15] + delta[3][ 8]);
533
2
    rkey[ 31] = rotlConstant< 3>(rkey[ 23] + delta[5][ 6]);
534
2
    rkey[ 39] = rotlConstant<11>(rkey[ 31] + delta[6][ 9]);
535
2
    rkey[ 47] = rotlConstant<17>(rkey[ 39] + delta[7][12]);
536
2
    rkey[ 55] = rotlConstant< 3>(rkey[ 47] + delta[1][10]);
537
2
    rkey[ 63] = rotlConstant<11>(rkey[ 55] + delta[2][13]);
538
2
    rkey[ 71] = rotlConstant<17>(rkey[ 63] + delta[3][16]);
539
2
    rkey[ 79] = rotlConstant< 3>(rkey[ 71] + delta[5][14]);
540
2
    rkey[ 87] = rotlConstant<11>(rkey[ 79] + delta[6][17]);
541
2
    rkey[ 95] = rotlConstant<17>(rkey[ 87] + delta[7][20]);
542
2
    rkey[103] = rotlConstant< 3>(rkey[ 95] + delta[1][18]);
543
2
    rkey[111] = rotlConstant<11>(rkey[103] + delta[2][21]);
544
2
    rkey[119] = rotlConstant<17>(rkey[111] + delta[3][24]);
545
2
    rkey[127] = rotlConstant< 3>(rkey[119] + delta[5][22]);
546
2
    rkey[135] = rotlConstant<11>(rkey[127] + delta[6][25]);
547
2
    rkey[143] = rotlConstant<17>(rkey[135] + delta[7][28]);
548
2
    rkey[151] = rotlConstant< 3>(rkey[143] + delta[1][26]);
549
2
    rkey[159] = rotlConstant<11>(rkey[151] + delta[2][29]);
550
2
    rkey[167] = rotlConstant<17>(rkey[159] + delta[3][ 0]);
551
2
    rkey[175] = rotlConstant< 3>(rkey[167] + delta[5][30]);
552
2
    rkey[183] = rotlConstant<11>(rkey[175] + delta[6][ 1]);
553
2
    rkey[191] = rotlConstant<17>(rkey[183] + delta[7][ 4]);
554
2
}
555
556
NAMESPACE_BEGIN(CryptoPP)
557
558
#if CRYPTOPP_LEA_ADVANCED_PROCESS_BLOCKS
559
# if defined(CRYPTOPP_SSSE3_AVAILABLE)
560
extern size_t LEA_Enc_AdvancedProcessBlocks_SSSE3(const word32* subKeys, size_t rounds,
561
    const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags);
562
563
extern size_t LEA_Dec_AdvancedProcessBlocks_SSSE3(const word32* subKeys, size_t rounds,
564
    const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags);
565
# endif
566
567
# if (CRYPTOPP_ARM_NEON_AVAILABLE)
568
extern size_t LEA_Enc_AdvancedProcessBlocks_NEON(const word32* subKeys, size_t rounds,
569
    const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags);
570
571
extern size_t LEA_Dec_AdvancedProcessBlocks_NEON(const word32* subKeys, size_t rounds,
572
    const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags);
573
# endif
574
#endif
575
576
std::string LEA::Base::AlgorithmProvider() const
577
0
{
578
0
#if (CRYPTOPP_LEA_ADVANCED_PROCESS_BLOCKS)
579
0
# if (CRYPTOPP_SSSE3_AVAILABLE)
580
0
    if (HasSSSE3())
581
0
        return "SSSE3";
582
0
# endif
583
# if (CRYPTOPP_ARM_NEON_AVAILABLE)
584
    if (HasNEON())
585
        return "NEON";
586
# endif
587
0
#endif
588
0
    return "C++";
589
0
}
590
591
void LEA::Base::UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs &params)
592
3
{
593
3
    CRYPTOPP_UNUSED(params);
594
595
3
    switch(keyLength)
596
3
    {
597
0
    case 16:  // 128-bit key
598
0
    {
599
0
        m_rkey.New(144); m_temp.New(4); m_rounds = 24;
600
0
        GetUserKey(LITTLE_ENDIAN_ORDER, m_temp.begin(), 4, userKey, 16);
601
0
        SetKey128(m_rkey, m_temp);
602
0
        break;
603
0
    }
604
1
    case 24:  // 192-bit key
605
1
    {
606
1
        m_rkey.New(168); m_temp.New(6); m_rounds = 28;
607
1
        GetUserKey(LITTLE_ENDIAN_ORDER, m_temp.begin(), 6, userKey, 24);
608
1
        SetKey192(m_rkey, m_temp);
609
1
        break;
610
0
    }
611
2
    case 32:  // 256-bit key
612
2
    {
613
2
        m_rkey.New(192); m_temp.New(8); m_rounds = 32;
614
2
        GetUserKey(LITTLE_ENDIAN_ORDER, m_temp.begin(), 8, userKey, 32);
615
2
        SetKey256(m_rkey, m_temp);
616
2
        break;
617
0
    }
618
0
    default:
619
0
        CRYPTOPP_ASSERT(0);
620
3
    }
621
3
}
622
623
void LEA::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
624
0
{
625
    // Do not cast the buffer. It will SIGBUS on some ARM and SPARC.
626
0
    GetBlock<word32, LittleEndian> iblock(inBlock);
627
0
    iblock(m_temp[0])(m_temp[1])(m_temp[2])(m_temp[3]);
628
629
0
    m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[  4]) + (m_temp[3] ^ m_rkey[  5]));
630
0
    m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[  2]) + (m_temp[2] ^ m_rkey[  3]));
631
0
    m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[  0]) + (m_temp[1] ^ m_rkey[  1]));
632
0
    m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[ 10]) + (m_temp[0] ^ m_rkey[ 11]));
633
0
    m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[  8]) + (m_temp[3] ^ m_rkey[  9]));
634
0
    m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[  6]) + (m_temp[2] ^ m_rkey[  7]));
635
0
    m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[ 16]) + (m_temp[1] ^ m_rkey[ 17]));
636
0
    m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[ 14]) + (m_temp[0] ^ m_rkey[ 15]));
637
0
    m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[ 12]) + (m_temp[3] ^ m_rkey[ 13]));
638
0
    m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[ 22]) + (m_temp[2] ^ m_rkey[ 23]));
639
0
    m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[ 20]) + (m_temp[1] ^ m_rkey[ 21]));
640
0
    m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[ 18]) + (m_temp[0] ^ m_rkey[ 19]));
641
642
0
    m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[ 28]) + (m_temp[3] ^ m_rkey[ 29]));
643
0
    m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[ 26]) + (m_temp[2] ^ m_rkey[ 27]));
644
0
    m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[ 24]) + (m_temp[1] ^ m_rkey[ 25]));
645
0
    m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[ 34]) + (m_temp[0] ^ m_rkey[ 35]));
646
0
    m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[ 32]) + (m_temp[3] ^ m_rkey[ 33]));
647
0
    m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[ 30]) + (m_temp[2] ^ m_rkey[ 31]));
648
0
    m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[ 40]) + (m_temp[1] ^ m_rkey[ 41]));
649
0
    m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[ 38]) + (m_temp[0] ^ m_rkey[ 39]));
650
0
    m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[ 36]) + (m_temp[3] ^ m_rkey[ 37]));
651
0
    m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[ 46]) + (m_temp[2] ^ m_rkey[ 47]));
652
0
    m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[ 44]) + (m_temp[1] ^ m_rkey[ 45]));
653
0
    m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[ 42]) + (m_temp[0] ^ m_rkey[ 43]));
654
655
0
    m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[ 52]) + (m_temp[3] ^ m_rkey[ 53]));
656
0
    m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[ 50]) + (m_temp[2] ^ m_rkey[ 51]));
657
0
    m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[ 48]) + (m_temp[1] ^ m_rkey[ 49]));
658
0
    m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[ 58]) + (m_temp[0] ^ m_rkey[ 59]));
659
0
    m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[ 56]) + (m_temp[3] ^ m_rkey[ 57]));
660
0
    m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[ 54]) + (m_temp[2] ^ m_rkey[ 55]));
661
0
    m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[ 64]) + (m_temp[1] ^ m_rkey[ 65]));
662
0
    m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[ 62]) + (m_temp[0] ^ m_rkey[ 63]));
663
0
    m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[ 60]) + (m_temp[3] ^ m_rkey[ 61]));
664
0
    m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[ 70]) + (m_temp[2] ^ m_rkey[ 71]));
665
0
    m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[ 68]) + (m_temp[1] ^ m_rkey[ 69]));
666
0
    m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[ 66]) + (m_temp[0] ^ m_rkey[ 67]));
667
668
0
    m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[ 76]) + (m_temp[3] ^ m_rkey[ 77]));
669
0
    m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[ 74]) + (m_temp[2] ^ m_rkey[ 75]));
670
0
    m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[ 72]) + (m_temp[1] ^ m_rkey[ 73]));
671
0
    m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[ 82]) + (m_temp[0] ^ m_rkey[ 83]));
672
0
    m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[ 80]) + (m_temp[3] ^ m_rkey[ 81]));
673
0
    m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[ 78]) + (m_temp[2] ^ m_rkey[ 79]));
674
0
    m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[ 88]) + (m_temp[1] ^ m_rkey[ 89]));
675
0
    m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[ 86]) + (m_temp[0] ^ m_rkey[ 87]));
676
0
    m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[ 84]) + (m_temp[3] ^ m_rkey[ 85]));
677
0
    m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[ 94]) + (m_temp[2] ^ m_rkey[ 95]));
678
0
    m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[ 92]) + (m_temp[1] ^ m_rkey[ 93]));
679
0
    m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[ 90]) + (m_temp[0] ^ m_rkey[ 91]));
680
681
0
    m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[100]) + (m_temp[3] ^ m_rkey[101]));
682
0
    m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[ 98]) + (m_temp[2] ^ m_rkey[ 99]));
683
0
    m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[ 96]) + (m_temp[1] ^ m_rkey[ 97]));
684
0
    m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[106]) + (m_temp[0] ^ m_rkey[107]));
685
0
    m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[104]) + (m_temp[3] ^ m_rkey[105]));
686
0
    m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[102]) + (m_temp[2] ^ m_rkey[103]));
687
0
    m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[112]) + (m_temp[1] ^ m_rkey[113]));
688
0
    m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[110]) + (m_temp[0] ^ m_rkey[111]));
689
0
    m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[108]) + (m_temp[3] ^ m_rkey[109]));
690
0
    m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[118]) + (m_temp[2] ^ m_rkey[119]));
691
0
    m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[116]) + (m_temp[1] ^ m_rkey[117]));
692
0
    m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[114]) + (m_temp[0] ^ m_rkey[115]));
693
694
0
    m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[124]) + (m_temp[3] ^ m_rkey[125]));
695
0
    m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[122]) + (m_temp[2] ^ m_rkey[123]));
696
0
    m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[120]) + (m_temp[1] ^ m_rkey[121]));
697
0
    m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[130]) + (m_temp[0] ^ m_rkey[131]));
698
0
    m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[128]) + (m_temp[3] ^ m_rkey[129]));
699
0
    m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[126]) + (m_temp[2] ^ m_rkey[127]));
700
0
    m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[136]) + (m_temp[1] ^ m_rkey[137]));
701
0
    m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[134]) + (m_temp[0] ^ m_rkey[135]));
702
0
    m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[132]) + (m_temp[3] ^ m_rkey[133]));
703
0
    m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[142]) + (m_temp[2] ^ m_rkey[143]));
704
0
    m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[140]) + (m_temp[1] ^ m_rkey[141]));
705
0
    m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[138]) + (m_temp[0] ^ m_rkey[139]));
706
707
0
    if(m_rounds > 24)
708
0
    {
709
0
        m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[148]) + (m_temp[3] ^ m_rkey[149]));
710
0
        m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[146]) + (m_temp[2] ^ m_rkey[147]));
711
0
        m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[144]) + (m_temp[1] ^ m_rkey[145]));
712
0
        m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[154]) + (m_temp[0] ^ m_rkey[155]));
713
0
        m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[152]) + (m_temp[3] ^ m_rkey[153]));
714
0
        m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[150]) + (m_temp[2] ^ m_rkey[151]));
715
0
        m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[160]) + (m_temp[1] ^ m_rkey[161]));
716
0
        m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[158]) + (m_temp[0] ^ m_rkey[159]));
717
0
        m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[156]) + (m_temp[3] ^ m_rkey[157]));
718
0
        m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[166]) + (m_temp[2] ^ m_rkey[167]));
719
0
        m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[164]) + (m_temp[1] ^ m_rkey[165]));
720
0
        m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[162]) + (m_temp[0] ^ m_rkey[163]));
721
0
    }
722
723
0
    if(m_rounds > 28)
724
0
    {
725
0
        m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[172]) + (m_temp[3] ^ m_rkey[173]));
726
0
        m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[170]) + (m_temp[2] ^ m_rkey[171]));
727
0
        m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[168]) + (m_temp[1] ^ m_rkey[169]));
728
0
        m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[178]) + (m_temp[0] ^ m_rkey[179]));
729
0
        m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[176]) + (m_temp[3] ^ m_rkey[177]));
730
0
        m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[174]) + (m_temp[2] ^ m_rkey[175]));
731
0
        m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[184]) + (m_temp[1] ^ m_rkey[185]));
732
0
        m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[182]) + (m_temp[0] ^ m_rkey[183]));
733
0
        m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[180]) + (m_temp[3] ^ m_rkey[181]));
734
0
        m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[190]) + (m_temp[2] ^ m_rkey[191]));
735
0
        m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[188]) + (m_temp[1] ^ m_rkey[189]));
736
0
        m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[186]) + (m_temp[0] ^ m_rkey[187]));
737
0
    }
738
739
0
    PutBlock<word32, LittleEndian> oblock(xorBlock, outBlock);
740
0
    oblock(m_temp[0])(m_temp[1])(m_temp[2])(m_temp[3]);
741
0
}
742
743
void LEA::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
744
0
{
745
    // Do not cast the buffer. It will SIGBUS on some ARM and SPARC.
746
0
    GetBlock<word32, LittleEndian> iblock(inBlock);
747
0
    iblock(m_temp[0])(m_temp[1])(m_temp[2])(m_temp[3]);
748
749
0
    if(m_rounds > 28)
750
0
    {
751
0
        m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[186])) ^ m_rkey[187];
752
0
        m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[188])) ^ m_rkey[189];
753
0
        m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[190])) ^ m_rkey[191];
754
0
        m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[180])) ^ m_rkey[181];
755
0
        m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[182])) ^ m_rkey[183];
756
0
        m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[184])) ^ m_rkey[185];
757
0
        m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[174])) ^ m_rkey[175];
758
0
        m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[176])) ^ m_rkey[177];
759
0
        m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[178])) ^ m_rkey[179];
760
0
        m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[168])) ^ m_rkey[169];
761
0
        m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[170])) ^ m_rkey[171];
762
0
        m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[172])) ^ m_rkey[173];
763
0
    }
764
765
0
    if(m_rounds > 24)
766
0
    {
767
0
        m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[162])) ^ m_rkey[163];
768
0
        m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[164])) ^ m_rkey[165];
769
0
        m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[166])) ^ m_rkey[167];
770
0
        m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[156])) ^ m_rkey[157];
771
0
        m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[158])) ^ m_rkey[159];
772
0
        m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[160])) ^ m_rkey[161];
773
0
        m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[150])) ^ m_rkey[151];
774
0
        m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[152])) ^ m_rkey[153];
775
0
        m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[154])) ^ m_rkey[155];
776
0
        m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[144])) ^ m_rkey[145];
777
0
        m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[146])) ^ m_rkey[147];
778
0
        m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[148])) ^ m_rkey[149];
779
0
    }
780
781
0
    m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[138])) ^ m_rkey[139];
782
0
    m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[140])) ^ m_rkey[141];
783
0
    m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[142])) ^ m_rkey[143];
784
0
    m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[132])) ^ m_rkey[133];
785
0
    m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[134])) ^ m_rkey[135];
786
0
    m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[136])) ^ m_rkey[137];
787
0
    m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[126])) ^ m_rkey[127];
788
0
    m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[128])) ^ m_rkey[129];
789
0
    m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[130])) ^ m_rkey[131];
790
0
    m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[120])) ^ m_rkey[121];
791
0
    m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[122])) ^ m_rkey[123];
792
0
    m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[124])) ^ m_rkey[125];
793
794
0
    m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[114])) ^ m_rkey[115];
795
0
    m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[116])) ^ m_rkey[117];
796
0
    m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[118])) ^ m_rkey[119];
797
0
    m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[108])) ^ m_rkey[109];
798
0
    m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[110])) ^ m_rkey[111];
799
0
    m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[112])) ^ m_rkey[113];
800
0
    m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[102])) ^ m_rkey[103];
801
0
    m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[104])) ^ m_rkey[105];
802
0
    m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[106])) ^ m_rkey[107];
803
0
    m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 96])) ^ m_rkey[ 97];
804
0
    m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 98])) ^ m_rkey[ 99];
805
0
    m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[100])) ^ m_rkey[101];
806
807
0
    m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 90])) ^ m_rkey[ 91];
808
0
    m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 92])) ^ m_rkey[ 93];
809
0
    m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 94])) ^ m_rkey[ 95];
810
0
    m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 84])) ^ m_rkey[ 85];
811
0
    m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 86])) ^ m_rkey[ 87];
812
0
    m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 88])) ^ m_rkey[ 89];
813
0
    m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 78])) ^ m_rkey[ 79];
814
0
    m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 80])) ^ m_rkey[ 81];
815
0
    m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 82])) ^ m_rkey[ 83];
816
0
    m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 72])) ^ m_rkey[ 73];
817
0
    m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 74])) ^ m_rkey[ 75];
818
0
    m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 76])) ^ m_rkey[ 77];
819
820
0
    m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 66])) ^ m_rkey[ 67];
821
0
    m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 68])) ^ m_rkey[ 69];
822
0
    m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 70])) ^ m_rkey[ 71];
823
0
    m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 60])) ^ m_rkey[ 61];
824
0
    m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 62])) ^ m_rkey[ 63];
825
0
    m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 64])) ^ m_rkey[ 65];
826
0
    m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 54])) ^ m_rkey[ 55];
827
0
    m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 56])) ^ m_rkey[ 57];
828
0
    m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 58])) ^ m_rkey[ 59];
829
0
    m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 48])) ^ m_rkey[ 49];
830
0
    m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 50])) ^ m_rkey[ 51];
831
0
    m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 52])) ^ m_rkey[ 53];
832
833
0
    m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 42])) ^ m_rkey[ 43];
834
0
    m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 44])) ^ m_rkey[ 45];
835
0
    m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 46])) ^ m_rkey[ 47];
836
0
    m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 36])) ^ m_rkey[ 37];
837
0
    m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 38])) ^ m_rkey[ 39];
838
0
    m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 40])) ^ m_rkey[ 41];
839
0
    m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 30])) ^ m_rkey[ 31];
840
0
    m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 32])) ^ m_rkey[ 33];
841
0
    m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 34])) ^ m_rkey[ 35];
842
0
    m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 24])) ^ m_rkey[ 25];
843
0
    m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 26])) ^ m_rkey[ 27];
844
0
    m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 28])) ^ m_rkey[ 29];
845
846
0
    m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 18])) ^ m_rkey[ 19];
847
0
    m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 20])) ^ m_rkey[ 21];
848
0
    m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 22])) ^ m_rkey[ 23];
849
0
    m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 12])) ^ m_rkey[ 13];
850
0
    m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 14])) ^ m_rkey[ 15];
851
0
    m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 16])) ^ m_rkey[ 17];
852
0
    m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[  6])) ^ m_rkey[  7];
853
0
    m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[  8])) ^ m_rkey[  9];
854
0
    m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 10])) ^ m_rkey[ 11];
855
0
    m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[  0])) ^ m_rkey[  1];
856
0
    m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[  2])) ^ m_rkey[  3];
857
0
    m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[  4])) ^ m_rkey[  5];
858
859
0
    PutBlock<word32, LittleEndian> oblock(xorBlock, outBlock);
860
0
    oblock(m_temp[0])(m_temp[1])(m_temp[2])(m_temp[3]);
861
0
}
862
863
#if CRYPTOPP_LEA_ADVANCED_PROCESS_BLOCKS
864
size_t LEA::Enc::AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks,
865
        byte *outBlocks, size_t length, word32 flags) const
866
4
{
867
4
#if defined(CRYPTOPP_SSSE3_AVAILABLE)
868
4
    if (HasSSSE3()) {
869
4
        return LEA_Enc_AdvancedProcessBlocks_SSSE3(m_rkey, m_rounds,
870
4
            inBlocks, xorBlocks, outBlocks, length, flags);
871
4
    }
872
0
#endif
873
#if (CRYPTOPP_ARM_NEON_AVAILABLE)
874
    if (HasNEON())
875
        return LEA_Enc_AdvancedProcessBlocks_NEON(m_rkey, (size_t)m_rounds,
876
            inBlocks, xorBlocks, outBlocks, length, flags);
877
#endif
878
0
    return BlockTransformation::AdvancedProcessBlocks(inBlocks, xorBlocks, outBlocks, length, flags);
879
4
}
880
881
size_t LEA::Dec::AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks,
882
        byte *outBlocks, size_t length, word32 flags) const
883
1
{
884
1
#if defined(CRYPTOPP_SSSE3_AVAILABLE)
885
1
    if (HasSSSE3()) {
886
1
        return LEA_Dec_AdvancedProcessBlocks_SSSE3(m_rkey, m_rounds,
887
1
            inBlocks, xorBlocks, outBlocks, length, flags);
888
1
    }
889
0
#endif
890
#if (CRYPTOPP_ARM_NEON_AVAILABLE)
891
    if (HasNEON())
892
        return LEA_Dec_AdvancedProcessBlocks_NEON(m_rkey, (size_t)m_rounds,
893
            inBlocks, xorBlocks, outBlocks, length, flags);
894
#endif
895
0
    return BlockTransformation::AdvancedProcessBlocks(inBlocks, xorBlocks, outBlocks, length, flags);
896
1
}
897
#endif  // CRYPTOPP_LEA_ADVANCED_PROCESS_BLOCKS
898
899
NAMESPACE_END