Coverage Report

Created: 2026-11-06 06:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/open5gs/lib/crypt/ogs-aes.c
Line
Count
Source
1
/*
2
 * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
10
/*
11
 * Copyright (C) 2019-2020 by Sukchan Lee <acetcom@gmail.com>
12
 *
13
 * This file is part of Open5GS.
14
 *
15
 * Licensed under the Apache License, Version 2.0 (the "License");
16
 * you may not use this file except in compliance with the License.
17
 * You may obtain a copy of the License at
18
 *
19
 *   http://www.apache.org/licenses/LICENSE-2.0
20
 *
21
 * Unless required by applicable law or agreed to in writing, software
22
 * distributed under the License is distributed on an "AS IS" BASIS,
23
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
 * See the License for the specific language governing permissions and
25
 * limitations under the License.
26
 */
27
28
#include "ogs-crypt.h"
29
30
#define FULL_UNROLL
31
32
static const uint32_t Te0[256] =
33
{
34
  0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
35
  0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
36
  0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
37
  0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
38
  0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
39
  0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
40
  0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
41
  0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
42
  0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
43
  0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
44
  0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
45
  0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
46
  0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
47
  0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
48
  0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
49
  0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
50
  0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
51
  0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
52
  0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
53
  0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
54
  0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
55
  0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
56
  0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
57
  0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
58
  0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
59
  0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
60
  0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
61
  0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
62
  0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
63
  0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
64
  0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
65
  0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
66
  0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
67
  0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
68
  0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
69
  0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
70
  0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
71
  0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
72
  0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
73
  0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
74
  0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
75
  0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
76
  0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
77
  0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
78
  0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
79
  0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
80
  0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
81
  0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
82
  0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
83
  0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
84
  0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
85
  0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
86
  0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
87
  0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
88
  0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
89
  0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
90
  0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
91
  0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
92
  0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
93
  0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
94
  0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
95
  0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
96
  0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
97
  0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
98
};
99
100
static const uint32_t Te1[256] =
101
{
102
  0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
103
  0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
104
  0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
105
  0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
106
  0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
107
  0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
108
  0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
109
  0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
110
  0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
111
  0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
112
  0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
113
  0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
114
  0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
115
  0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
116
  0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
117
  0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
118
  0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
119
  0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
120
  0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
121
  0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
122
  0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
123
  0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
124
  0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
125
  0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
126
  0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
127
  0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
128
  0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
129
  0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
130
  0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
131
  0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
132
  0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
133
  0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
134
  0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
135
  0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
136
  0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
137
  0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
138
  0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
139
  0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
140
  0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
141
  0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
142
  0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
143
  0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
144
  0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
145
  0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
146
  0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
147
  0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
148
  0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
149
  0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
150
  0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
151
  0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
152
  0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
153
  0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
154
  0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
155
  0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
156
  0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
157
  0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
158
  0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
159
  0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
160
  0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
161
  0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
162
  0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
163
  0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
164
  0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
165
  0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
166
};
167
168
static const uint32_t Te2[256] =
169
{
170
  0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
171
  0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
172
  0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
173
  0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
174
  0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
175
  0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
176
  0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
177
  0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
178
  0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
179
  0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
180
  0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
181
  0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
182
  0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
183
  0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
184
  0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
185
  0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
186
  0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
187
  0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
188
  0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
189
  0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
190
  0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
191
  0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
192
  0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
193
  0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
194
  0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
195
  0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
196
  0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
197
  0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
198
  0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
199
  0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
200
  0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
201
  0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
202
  0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
203
  0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
204
  0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
205
  0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
206
  0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
207
  0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
208
  0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
209
  0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
210
  0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
211
  0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
212
  0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
213
  0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
214
  0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
215
  0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
216
  0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
217
  0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
218
  0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
219
  0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
220
  0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
221
  0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
222
  0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
223
  0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
224
  0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
225
  0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
226
  0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
227
  0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
228
  0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
229
  0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
230
  0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
231
  0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
232
  0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
233
  0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
234
};
235
236
static const uint32_t Te3[256] =
237
{
238
  0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
239
  0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
240
  0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
241
  0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
242
  0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
243
  0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
244
  0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
245
  0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
246
  0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
247
  0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
248
  0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
249
  0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
250
  0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
251
  0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
252
  0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
253
  0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
254
  0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
255
  0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
256
  0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
257
  0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
258
  0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
259
  0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
260
  0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
261
  0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
262
  0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
263
  0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
264
  0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
265
  0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
266
  0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
267
  0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
268
  0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
269
  0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
270
  0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
271
  0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
272
  0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
273
  0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
274
  0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
275
  0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
276
  0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
277
  0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
278
  0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
279
  0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
280
  0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
281
  0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
282
  0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
283
  0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
284
  0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
285
  0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
286
  0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
287
  0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
288
  0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
289
  0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
290
  0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
291
  0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
292
  0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
293
  0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
294
  0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
295
  0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
296
  0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
297
  0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
298
  0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
299
  0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
300
  0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
301
  0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
302
};
303
304
static const uint32_t Te4[256] =
305
{
306
  0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
307
  0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
308
  0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
309
  0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
310
  0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
311
  0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
312
  0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
313
  0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
314
  0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
315
  0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
316
  0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
317
  0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
318
  0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
319
  0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
320
  0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
321
  0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
322
  0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
323
  0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
324
  0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
325
  0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
326
  0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
327
  0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
328
  0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
329
  0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
330
  0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
331
  0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
332
  0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
333
  0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
334
  0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
335
  0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
336
  0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
337
  0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
338
  0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
339
  0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
340
  0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
341
  0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
342
  0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
343
  0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
344
  0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
345
  0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
346
  0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
347
  0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
348
  0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
349
  0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
350
  0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
351
  0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
352
  0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
353
  0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
354
  0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
355
  0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
356
  0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
357
  0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
358
  0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
359
  0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
360
  0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
361
  0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
362
  0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
363
  0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
364
  0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
365
  0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
366
  0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
367
  0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
368
  0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
369
  0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
370
};
371
372
static const uint32_t Td0[256] =
373
{
374
  0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
375
  0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
376
  0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
377
  0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
378
  0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
379
  0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
380
  0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
381
  0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
382
  0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
383
  0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
384
  0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
385
  0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
386
  0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
387
  0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
388
  0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
389
  0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
390
  0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
391
  0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
392
  0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
393
  0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
394
  0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
395
  0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
396
  0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
397
  0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
398
  0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
399
  0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
400
  0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
401
  0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
402
  0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
403
  0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
404
  0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
405
  0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
406
  0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
407
  0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
408
  0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
409
  0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
410
  0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
411
  0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
412
  0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
413
  0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
414
  0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
415
  0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
416
  0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
417
  0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
418
  0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
419
  0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
420
  0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
421
  0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
422
  0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
423
  0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
424
  0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
425
  0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
426
  0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
427
  0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
428
  0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
429
  0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
430
  0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
431
  0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
432
  0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
433
  0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
434
  0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
435
  0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
436
  0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
437
  0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
438
};
439
440
static const uint32_t Td1[256] =
441
{
442
  0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
443
  0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
444
  0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
445
  0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
446
  0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
447
  0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
448
  0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
449
  0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
450
  0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
451
  0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
452
  0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
453
  0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
454
  0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
455
  0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
456
  0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
457
  0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
458
  0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
459
  0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
460
  0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
461
  0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
462
  0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
463
  0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
464
  0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
465
  0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
466
  0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
467
  0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
468
  0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
469
  0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
470
  0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
471
  0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
472
  0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
473
  0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
474
  0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
475
  0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
476
  0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
477
  0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
478
  0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
479
  0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
480
  0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
481
  0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
482
  0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
483
  0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
484
  0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
485
  0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
486
  0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
487
  0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
488
  0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
489
  0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
490
  0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
491
  0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
492
  0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
493
  0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
494
  0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
495
  0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
496
  0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
497
  0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
498
  0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
499
  0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
500
  0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
501
  0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
502
  0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
503
  0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
504
  0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
505
  0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
506
};
507
508
static const uint32_t Td2[256] =
509
{
510
  0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
511
  0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
512
  0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
513
  0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
514
  0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
515
  0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
516
  0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
517
  0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
518
  0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
519
  0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
520
  0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
521
  0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
522
  0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
523
  0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
524
  0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
525
  0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
526
  0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
527
  0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
528
  0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
529
  0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
530
  0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
531
  0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
532
  0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
533
  0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
534
  0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
535
  0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
536
  0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
537
  0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
538
  0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
539
  0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
540
  0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
541
  0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
542
  0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
543
  0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
544
  0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
545
  0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
546
  0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
547
  0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
548
  0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
549
  0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
550
  0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
551
  0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
552
  0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
553
  0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
554
  0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
555
  0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
556
  0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
557
  0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
558
  0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
559
  0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
560
  0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
561
  0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
562
  0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
563
  0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
564
  0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
565
  0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
566
  0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
567
  0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
568
  0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
569
  0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
570
  0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
571
  0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
572
  0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
573
  0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
574
};
575
576
static const uint32_t Td3[256] =
577
{
578
  0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
579
  0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
580
  0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
581
  0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
582
  0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
583
  0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
584
  0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
585
  0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
586
  0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
587
  0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
588
  0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
589
  0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
590
  0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
591
  0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
592
  0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
593
  0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
594
  0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
595
  0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
596
  0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
597
  0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
598
  0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
599
  0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
600
  0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
601
  0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
602
  0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
603
  0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
604
  0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
605
  0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
606
  0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
607
  0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
608
  0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
609
  0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
610
  0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
611
  0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
612
  0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
613
  0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
614
  0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
615
  0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
616
  0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
617
  0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
618
  0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
619
  0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
620
  0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
621
  0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
622
  0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
623
  0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
624
  0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
625
  0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
626
  0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
627
  0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
628
  0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
629
  0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
630
  0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
631
  0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
632
  0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
633
  0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
634
  0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
635
  0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
636
  0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
637
  0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
638
  0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
639
  0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
640
  0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
641
  0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
642
};
643
644
static const uint32_t Td4[256] =
645
{
646
  0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
647
  0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
648
  0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
649
  0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
650
  0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
651
  0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
652
  0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
653
  0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
654
  0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
655
  0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
656
  0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
657
  0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
658
  0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
659
  0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
660
  0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
661
  0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
662
  0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
663
  0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
664
  0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
665
  0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
666
  0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
667
  0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
668
  0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
669
  0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
670
  0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
671
  0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
672
  0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
673
  0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
674
  0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
675
  0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
676
  0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
677
  0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
678
  0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
679
  0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
680
  0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
681
  0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
682
  0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
683
  0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
684
  0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
685
  0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
686
  0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
687
  0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
688
  0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
689
  0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
690
  0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
691
  0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
692
  0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
693
  0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
694
  0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
695
  0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
696
  0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
697
  0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
698
  0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
699
  0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
700
  0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
701
  0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
702
  0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
703
  0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
704
  0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
705
  0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
706
  0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
707
  0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
708
  0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
709
  0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
710
};
711
712
static const uint32_t rcon[] =
713
{
714
  0x01000000, 0x02000000, 0x04000000, 0x08000000,
715
  0x10000000, 0x20000000, 0x40000000, 0x80000000,
716
  0x1B000000, 0x36000000,
717
  /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
718
};
719
720
0
#define GETU32(plaintext) (((uint32_t)(plaintext)[0] << 24) ^ \
721
0
                    ((uint32_t)(plaintext)[1] << 16) ^ \
722
0
                    ((uint32_t)(plaintext)[2] <<  8) ^ \
723
0
                    ((uint32_t)(plaintext)[3]))
724
725
0
#define PUTU32(ciphertext, st) { (ciphertext)[0] = (uint8_t)((st) >> 24); \
726
0
                         (ciphertext)[1] = (uint8_t)((st) >> 16); \
727
0
                         (ciphertext)[2] = (uint8_t)((st) >>  8); \
728
0
                         (ciphertext)[3] = (uint8_t)(st); }
729
730
/**
731
 * Expand the cipher key into the encryption key schedule.
732
 *
733
 * @return the number of rounds for the given cipher key size.
734
 */
735
int ogs_aes_setup_enc(uint32_t *rk, const uint8_t *key, int keybits)
736
0
{
737
0
  int i = 0;
738
0
  uint32_t temp;
739
740
0
  rk[0] = GETU32(key     );
741
0
  rk[1] = GETU32(key +  4);
742
0
  rk[2] = GETU32(key +  8);
743
0
  rk[3] = GETU32(key + 12);
744
0
  if (keybits == 128)
745
0
  {
746
0
    for (;;)
747
0
    {
748
0
      temp  = rk[3];
749
0
      rk[4] = rk[0] ^
750
0
        (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
751
0
        (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
752
0
        (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
753
0
        (Te4[(temp >> 24)       ] & 0x000000ff) ^
754
0
        rcon[i];
755
0
      rk[5] = rk[1] ^ rk[4];
756
0
      rk[6] = rk[2] ^ rk[5];
757
0
      rk[7] = rk[3] ^ rk[6];
758
0
      if (++i == 10)
759
0
        return 10;
760
0
      rk += 4;
761
0
    }
762
0
  }
763
0
  rk[4] = GETU32(key + 16);
764
0
  rk[5] = GETU32(key + 20);
765
0
  if (keybits == 192)
766
0
  {
767
0
    for (;;)
768
0
    {
769
0
      temp = rk[ 5];
770
0
      rk[ 6] = rk[ 0] ^
771
0
        (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
772
0
        (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
773
0
        (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
774
0
        (Te4[(temp >> 24)       ] & 0x000000ff) ^
775
0
        rcon[i];
776
0
      rk[ 7] = rk[ 1] ^ rk[ 6];
777
0
      rk[ 8] = rk[ 2] ^ rk[ 7];
778
0
      rk[ 9] = rk[ 3] ^ rk[ 8];
779
0
      if (++i == 8)
780
0
        return 12;
781
0
      rk[10] = rk[ 4] ^ rk[ 9];
782
0
      rk[11] = rk[ 5] ^ rk[10];
783
0
      rk += 6;
784
0
    }
785
0
  }
786
0
  rk[6] = GETU32(key + 24);
787
0
  rk[7] = GETU32(key + 28);
788
0
  if (keybits == 256)
789
0
  {
790
0
    for (;;)
791
0
    {
792
0
      temp = rk[ 7];
793
0
      rk[ 8] = rk[ 0] ^
794
0
        (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
795
0
        (Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
796
0
        (Te4[(temp      ) & 0xff] & 0x0000ff00) ^
797
0
        (Te4[(temp >> 24)       ] & 0x000000ff) ^
798
0
        rcon[i];
799
0
      rk[ 9] = rk[ 1] ^ rk[ 8];
800
0
      rk[10] = rk[ 2] ^ rk[ 9];
801
0
      rk[11] = rk[ 3] ^ rk[10];
802
0
      if (++i == 7)
803
0
        return 14;
804
0
      temp = rk[11];
805
0
      rk[12] = rk[ 4] ^
806
0
        (Te4[(temp >> 24)       ] & 0xff000000) ^
807
0
        (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
808
0
        (Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
809
0
        (Te4[(temp      ) & 0xff] & 0x000000ff);
810
0
      rk[13] = rk[ 5] ^ rk[12];
811
0
      rk[14] = rk[ 6] ^ rk[13];
812
0
      rk[15] = rk[ 7] ^ rk[14];
813
0
      rk += 8;
814
0
    }
815
0
  }
816
0
  return 0;
817
0
}
818
819
/**
820
 * Expand the cipher key into the decryption key schedule.
821
 *
822
 * @return the number of rounds for the given cipher key size.
823
 */
824
int ogs_aes_setup_dec(uint32_t *rk, const uint8_t *key, int keybits)
825
0
{
826
0
  int nrounds, i, j;
827
0
  uint32_t temp;
828
829
  /* expand the cipher key: */
830
0
  nrounds = ogs_aes_setup_enc(rk, key, keybits);
831
  /* invert the order of the round keys: */
832
0
  for (i = 0, j = 4*nrounds; i < j; i += 4, j -= 4)
833
0
  {
834
0
    temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
835
0
    temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
836
0
    temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
837
0
    temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
838
0
  }
839
  /* apply the inverse MixColumn transform to all round keys but the first and the last: */
840
0
  for (i = 1; i < nrounds; i++)
841
0
  {
842
0
    rk += 4;
843
0
    rk[0] =
844
0
      Td0[Te4[(rk[0] >> 24)       ] & 0xff] ^
845
0
      Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
846
0
      Td2[Te4[(rk[0] >>  8) & 0xff] & 0xff] ^
847
0
      Td3[Te4[(rk[0]      ) & 0xff] & 0xff];
848
0
    rk[1] =
849
0
      Td0[Te4[(rk[1] >> 24)       ] & 0xff] ^
850
0
      Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
851
0
      Td2[Te4[(rk[1] >>  8) & 0xff] & 0xff] ^
852
0
      Td3[Te4[(rk[1]      ) & 0xff] & 0xff];
853
0
    rk[2] =
854
0
      Td0[Te4[(rk[2] >> 24)       ] & 0xff] ^
855
0
      Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
856
0
      Td2[Te4[(rk[2] >>  8) & 0xff] & 0xff] ^
857
0
      Td3[Te4[(rk[2]      ) & 0xff] & 0xff];
858
0
    rk[3] =
859
0
      Td0[Te4[(rk[3] >> 24)       ] & 0xff] ^
860
0
      Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
861
0
      Td2[Te4[(rk[3] >>  8) & 0xff] & 0xff] ^
862
0
      Td3[Te4[(rk[3]      ) & 0xff] & 0xff];
863
0
  }
864
0
  return nrounds;
865
0
}
866
867
void ogs_aes_encrypt(const uint32_t *rk, int nrounds, const uint8_t plaintext[16],
868
  uint8_t ciphertext[16])
869
0
{
870
0
  uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
871
  #ifndef FULL_UNROLL
872
    int r;
873
  #endif /* ?FULL_UNROLL */
874
  /*
875
   * map byte array block to cipher state
876
   * and add initial round key:
877
  */
878
0
  s0 = GETU32(plaintext     ) ^ rk[0];
879
0
  s1 = GETU32(plaintext +  4) ^ rk[1];
880
0
  s2 = GETU32(plaintext +  8) ^ rk[2];
881
0
  s3 = GETU32(plaintext + 12) ^ rk[3];
882
0
  #ifdef FULL_UNROLL
883
    /* round 1: */
884
0
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
885
0
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
886
0
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
887
0
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
888
    /* round 2: */
889
0
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
890
0
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
891
0
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
892
0
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
893
    /* round 3: */
894
0
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
895
0
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
896
0
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
897
0
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
898
    /* round 4: */
899
0
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
900
0
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
901
0
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
902
0
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
903
    /* round 5: */
904
0
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
905
0
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
906
0
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
907
0
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
908
    /* round 6: */
909
0
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
910
0
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
911
0
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
912
0
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
913
    /* round 7: */
914
0
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
915
0
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
916
0
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
917
0
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
918
    /* round 8: */
919
0
    s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
920
0
    s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
921
0
    s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
922
0
    s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
923
    /* round 9: */
924
0
    t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
925
0
    t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
926
0
    t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
927
0
    t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
928
0
    if (nrounds > 10)
929
0
    {
930
      /* round 10: */
931
0
      s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
932
0
      s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
933
0
      s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
934
0
      s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
935
      /* round 11: */
936
0
      t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
937
0
      t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
938
0
      t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
939
0
      t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
940
0
      if (nrounds > 12)
941
0
      {
942
        /* round 12: */
943
0
        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
944
0
        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
945
0
        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
946
0
        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
947
        /* round 13: */
948
0
        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
949
0
        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
950
0
        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
951
0
        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
952
0
      }
953
0
    }
954
0
    rk += nrounds << 2;
955
  #else  /* !FULL_UNROLL */
956
    /*
957
    * nrounds - 1 full rounds:
958
    */
959
    r = nrounds >> 1;
960
    for (;;)
961
    {
962
      t0 =
963
        Te0[(s0 >> 24)       ] ^
964
        Te1[(s1 >> 16) & 0xff] ^
965
        Te2[(s2 >>  8) & 0xff] ^
966
        Te3[(s3      ) & 0xff] ^
967
        rk[4];
968
      t1 =
969
        Te0[(s1 >> 24)       ] ^
970
        Te1[(s2 >> 16) & 0xff] ^
971
        Te2[(s3 >>  8) & 0xff] ^
972
        Te3[(s0      ) & 0xff] ^
973
        rk[5];
974
      t2 =
975
        Te0[(s2 >> 24)       ] ^
976
        Te1[(s3 >> 16) & 0xff] ^
977
        Te2[(s0 >>  8) & 0xff] ^
978
        Te3[(s1      ) & 0xff] ^
979
        rk[6];
980
      t3 =
981
        Te0[(s3 >> 24)       ] ^
982
        Te1[(s0 >> 16) & 0xff] ^
983
        Te2[(s1 >>  8) & 0xff] ^
984
        Te3[(s2      ) & 0xff] ^
985
        rk[7];
986
        rk += 8;
987
        if (--r == 0)
988
            break;
989
      s0 =
990
        Te0[(t0 >> 24)       ] ^
991
        Te1[(t1 >> 16) & 0xff] ^
992
        Te2[(t2 >>  8) & 0xff] ^
993
        Te3[(t3      ) & 0xff] ^
994
        rk[0];
995
      s1 =
996
        Te0[(t1 >> 24)       ] ^
997
        Te1[(t2 >> 16) & 0xff] ^
998
        Te2[(t3 >>  8) & 0xff] ^
999
        Te3[(t0      ) & 0xff] ^
1000
        rk[1];
1001
      s2 =
1002
        Te0[(t2 >> 24)       ] ^
1003
        Te1[(t3 >> 16) & 0xff] ^
1004
        Te2[(t0 >>  8) & 0xff] ^
1005
        Te3[(t1      ) & 0xff] ^
1006
        rk[2];
1007
      s3 =
1008
        Te0[(t3 >> 24)       ] ^
1009
        Te1[(t0 >> 16) & 0xff] ^
1010
        Te2[(t1 >>  8) & 0xff] ^
1011
        Te3[(t2      ) & 0xff] ^
1012
        rk[3];
1013
     }
1014
 #endif /* ?FULL_UNROLL */
1015
  /*
1016
  * apply last round and
1017
  * map cipher state to byte array block:
1018
  */
1019
0
  s0 =
1020
0
    (Te4[(t0 >> 24)       ] & 0xff000000) ^
1021
0
    (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1022
0
    (Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1023
0
    (Te4[(t3      ) & 0xff] & 0x000000ff) ^
1024
0
    rk[0];
1025
0
  PUTU32(ciphertext     , s0);
1026
0
  s1 =
1027
0
    (Te4[(t1 >> 24)       ] & 0xff000000) ^
1028
0
    (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1029
0
    (Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1030
0
    (Te4[(t0      ) & 0xff] & 0x000000ff) ^
1031
0
    rk[1];
1032
0
  PUTU32(ciphertext +  4, s1);
1033
0
  s2 =
1034
0
    (Te4[(t2 >> 24)       ] & 0xff000000) ^
1035
0
    (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1036
0
    (Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1037
0
    (Te4[(t1      ) & 0xff] & 0x000000ff) ^
1038
0
    rk[2];
1039
0
  PUTU32(ciphertext +  8, s2);
1040
0
  s3 =
1041
0
    (Te4[(t3 >> 24)       ] & 0xff000000) ^
1042
0
    (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1043
0
    (Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1044
0
    (Te4[(t2      ) & 0xff] & 0x000000ff) ^
1045
0
    rk[3];
1046
0
  PUTU32(ciphertext + 12, s3);
1047
0
}
1048
1049
void ogs_aes_decrypt(const uint32_t *rk, int nrounds, const uint8_t ciphertext[16],
1050
  uint8_t plaintext[16])
1051
0
{
1052
0
  uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
1053
  #ifndef FULL_UNROLL
1054
    int r;
1055
  #endif /* ?FULL_UNROLL */
1056
1057
  /*
1058
  * map byte array block to cipher state
1059
  * and add initial round key:
1060
  */
1061
0
    s0 = GETU32(ciphertext     ) ^ rk[0];
1062
0
    s1 = GETU32(ciphertext +  4) ^ rk[1];
1063
0
    s2 = GETU32(ciphertext +  8) ^ rk[2];
1064
0
    s3 = GETU32(ciphertext + 12) ^ rk[3];
1065
0
  #ifdef FULL_UNROLL
1066
    /* round 1: */
1067
0
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
1068
0
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
1069
0
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
1070
0
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
1071
    /* round 2: */
1072
0
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
1073
0
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
1074
0
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
1075
0
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
1076
    /* round 3: */
1077
0
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
1078
0
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
1079
0
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
1080
0
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
1081
    /* round 4: */
1082
0
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
1083
0
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
1084
0
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
1085
0
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
1086
    /* round 5: */
1087
0
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
1088
0
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
1089
0
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
1090
0
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
1091
    /* round 6: */
1092
0
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
1093
0
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
1094
0
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
1095
0
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
1096
    /* round 7: */
1097
0
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
1098
0
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
1099
0
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
1100
0
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
1101
    /* round 8: */
1102
0
    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
1103
0
    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
1104
0
    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
1105
0
    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
1106
    /* round 9: */
1107
0
    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
1108
0
    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
1109
0
    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
1110
0
    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
1111
0
    if (nrounds > 10)
1112
0
    {
1113
      /* round 10: */
1114
0
      s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
1115
0
      s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
1116
0
      s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
1117
0
      s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
1118
      /* round 11: */
1119
0
      t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
1120
0
      t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
1121
0
      t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
1122
0
      t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
1123
0
      if (nrounds > 12)
1124
0
      {
1125
        /* round 12: */
1126
0
        s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
1127
0
        s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
1128
0
        s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
1129
0
        s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
1130
        /* round 13: */
1131
0
        t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
1132
0
        t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
1133
0
        t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
1134
0
        t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
1135
0
      }
1136
0
    }
1137
0
    rk += nrounds << 2;
1138
  #else  /* !FULL_UNROLL */
1139
    /*
1140
    * nrounds - 1 full rounds:
1141
    */
1142
    r = nrounds >> 1;
1143
    for (;;)
1144
    {
1145
      t0 =
1146
        Td0[(s0 >> 24)       ] ^
1147
        Td1[(s3 >> 16) & 0xff] ^
1148
        Td2[(s2 >>  8) & 0xff] ^
1149
        Td3[(s1      ) & 0xff] ^
1150
        rk[4];
1151
      t1 =
1152
        Td0[(s1 >> 24)       ] ^
1153
        Td1[(s0 >> 16) & 0xff] ^
1154
        Td2[(s3 >>  8) & 0xff] ^
1155
        Td3[(s2      ) & 0xff] ^
1156
        rk[5];
1157
      t2 =
1158
        Td0[(s2 >> 24)       ] ^
1159
        Td1[(s1 >> 16) & 0xff] ^
1160
        Td2[(s0 >>  8) & 0xff] ^
1161
        Td3[(s3      ) & 0xff] ^
1162
        rk[6];
1163
      t3 =
1164
        Td0[(s3 >> 24)       ] ^
1165
        Td1[(s2 >> 16) & 0xff] ^
1166
        Td2[(s1 >>  8) & 0xff] ^
1167
        Td3[(s0      ) & 0xff] ^
1168
        rk[7];
1169
      rk += 8;
1170
      if (--r == 0)
1171
          break;
1172
      s0 =
1173
        Td0[(t0 >> 24)       ] ^
1174
        Td1[(t3 >> 16) & 0xff] ^
1175
        Td2[(t2 >>  8) & 0xff] ^
1176
        Td3[(t1      ) & 0xff] ^
1177
        rk[0];
1178
      s1 =
1179
        Td0[(t1 >> 24)       ] ^
1180
        Td1[(t0 >> 16) & 0xff] ^
1181
        Td2[(t3 >>  8) & 0xff] ^
1182
        Td3[(t2      ) & 0xff] ^
1183
        rk[1];
1184
      s2 =
1185
        Td0[(t2 >> 24)       ] ^
1186
        Td1[(t1 >> 16) & 0xff] ^
1187
        Td2[(t0 >>  8) & 0xff] ^
1188
        Td3[(t3      ) & 0xff] ^
1189
        rk[2];
1190
      s3 =
1191
        Td0[(t3 >> 24)       ] ^
1192
        Td1[(t2 >> 16) & 0xff] ^
1193
        Td2[(t1 >>  8) & 0xff] ^
1194
        Td3[(t0      ) & 0xff] ^
1195
        rk[3];
1196
    }
1197
  #endif /* ?FULL_UNROLL */
1198
  /*
1199
  * apply last round and
1200
  * map cipher state to byte array block:
1201
  */
1202
0
  s0 =
1203
0
    (Td4[(t0 >> 24)       ] & 0xff000000) ^
1204
0
    (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1205
0
    (Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
1206
0
    (Td4[(t1      ) & 0xff] & 0x000000ff) ^
1207
0
    rk[0];
1208
0
  PUTU32(plaintext     , s0);
1209
0
  s1 =
1210
0
    (Td4[(t1 >> 24)       ] & 0xff000000) ^
1211
0
    (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1212
0
    (Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
1213
0
    (Td4[(t2      ) & 0xff] & 0x000000ff) ^
1214
0
    rk[1];
1215
0
  PUTU32(plaintext +  4, s1);
1216
0
  s2 =
1217
0
    (Td4[(t2 >> 24)       ] & 0xff000000) ^
1218
0
    (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1219
0
    (Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
1220
0
    (Td4[(t3      ) & 0xff] & 0x000000ff) ^
1221
0
    rk[2];
1222
0
  PUTU32(plaintext +  8, s2);
1223
0
  s3 =
1224
0
    (Td4[(t3 >> 24)       ] & 0xff000000) ^
1225
0
    (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1226
0
    (Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
1227
0
    (Td4[(t0      ) & 0xff] & 0x000000ff) ^
1228
0
    rk[3];
1229
0
  PUTU32(plaintext + 12, s3);
1230
0
}
1231
1232
int ogs_aes_cbc_encrypt(const uint8_t *key, const uint32_t keybits,
1233
        uint8_t *ivec, const uint8_t *in, const uint32_t inlen,
1234
        uint8_t *out, uint32_t *outlen)
1235
0
{
1236
0
    uint32_t n;
1237
0
    uint32_t len = inlen;
1238
0
    const uint8_t *iv = ivec;
1239
1240
0
    uint32_t rk[OGS_AES_RKLENGTH(OGS_AES_MAX_KEY_BITS)];
1241
0
    int nrounds;
1242
1243
0
    ogs_assert(key);
1244
0
    ogs_assert(keybits >= 128);
1245
0
    ogs_assert(ivec);
1246
0
    ogs_assert(in);
1247
0
    ogs_assert(inlen);
1248
0
    ogs_assert(out);
1249
0
    ogs_assert(outlen);
1250
1251
0
    if (*outlen < ((inlen - 1) / OGS_AES_BLOCK_SIZE + 1) * OGS_AES_BLOCK_SIZE)
1252
0
    {
1253
0
        return OGS_ERROR;
1254
0
    }
1255
1256
0
    *outlen = ((inlen - 1) / OGS_AES_BLOCK_SIZE + 1) * OGS_AES_BLOCK_SIZE;
1257
1258
    /* Clang scan-build SA: Result of operation is garbage: The function ogs_aes_encrypt() is reporting that the
1259
     * array parameter rk has garbage/uninitialized values. The garbage values are because the SA is taking a path
1260
     * through ogs_aes_setup_enc() that doesn't match a valid keybits value and therefore the function is not
1261
     * populating rk. Fix the issue by initializing rk to 0 here. */
1262
0
    memset(rk, 0, sizeof(rk));
1263
1264
0
    nrounds = ogs_aes_setup_enc(rk, key, keybits);
1265
1266
0
    while (len >= OGS_AES_BLOCK_SIZE)
1267
0
    {
1268
0
        for(n=0; n < OGS_AES_BLOCK_SIZE; ++n)
1269
0
            out[n] = in[n] ^ iv[n];
1270
0
        ogs_aes_encrypt(rk, nrounds, out, out);
1271
0
        iv = out;
1272
0
        len -= OGS_AES_BLOCK_SIZE;
1273
0
        in += OGS_AES_BLOCK_SIZE;
1274
0
        out += OGS_AES_BLOCK_SIZE;
1275
0
    }
1276
1277
0
    if (len)
1278
0
    {
1279
0
        for(n=0; n < len; ++n)
1280
0
            out[n] = in[n] ^ iv[n];
1281
0
        for(n=len; n < OGS_AES_BLOCK_SIZE; ++n)
1282
0
            out[n] = iv[n];
1283
0
        ogs_aes_encrypt(rk, nrounds, out, out);
1284
0
        iv = out;
1285
0
    }
1286
1287
0
    memcpy(ivec, iv, OGS_AES_BLOCK_SIZE);
1288
1289
0
    return OGS_OK;
1290
0
}
1291
1292
int ogs_aes_cbc_decrypt(const uint8_t *key, const uint32_t keybits,
1293
        uint8_t *ivec, const uint8_t *in, const uint32_t inlen,
1294
        uint8_t *out, uint32_t *outlen)
1295
0
{
1296
0
    uint32_t n;
1297
0
    uint32_t len = inlen;
1298
0
    uint8_t tmp[OGS_AES_BLOCK_SIZE];
1299
0
    const uint8_t *iv = ivec;
1300
1301
0
    uint32_t rk[OGS_AES_RKLENGTH(OGS_AES_MAX_KEY_BITS)];
1302
0
    int nrounds;
1303
1304
0
    ogs_assert(key);
1305
0
    ogs_assert(keybits >= 128);
1306
0
    ogs_assert(ivec);
1307
0
    ogs_assert(in);
1308
0
    ogs_assert(inlen);
1309
0
    ogs_assert(out);
1310
0
    ogs_assert(outlen);
1311
1312
0
    if (inlen % OGS_AES_BLOCK_SIZE != 0)
1313
0
    {
1314
0
        return OGS_ERROR;
1315
0
    }
1316
1317
0
    *outlen = inlen;
1318
1319
    /* Clang scan-build SA: Result of operation is garbage: The function ogs_aes_decrypt() is reporting that the
1320
     * array parameter rk has garbage/uninitialized values. The garbage values are because the SA is taking a path
1321
     * through ogs_aes_setup_enc() (from ogs_aes_setup_dec()) that doesn't match a valid keybits value and
1322
     * therefore the function is not populating rk. Fix the issue by initializing rk to 0 here. */
1323
0
    memset(rk, 0, sizeof(rk));
1324
1325
0
    nrounds = ogs_aes_setup_dec(rk, key, keybits);
1326
1327
0
    if (in != out)
1328
0
    {
1329
0
        while (len >= OGS_AES_BLOCK_SIZE)
1330
0
        {
1331
0
            ogs_aes_decrypt(rk, nrounds, in, out);
1332
0
            for(n=0; n < OGS_AES_BLOCK_SIZE; ++n)
1333
0
                out[n] ^= iv[n];
1334
0
            iv = in;
1335
0
            len -= OGS_AES_BLOCK_SIZE;
1336
0
            in  += OGS_AES_BLOCK_SIZE;
1337
0
            out += OGS_AES_BLOCK_SIZE;
1338
0
        }
1339
1340
0
        if (len)
1341
0
        {
1342
0
            ogs_aes_decrypt(rk, nrounds, in, tmp);
1343
0
            for(n=0; n < len; ++n)
1344
0
                out[n] = tmp[n] ^ iv[n];
1345
0
            iv = in;
1346
0
        }
1347
1348
0
        memcpy(ivec, iv, OGS_AES_BLOCK_SIZE);
1349
0
    }
1350
0
    else
1351
0
    {
1352
0
        while (len >= OGS_AES_BLOCK_SIZE)
1353
0
        {
1354
0
            memcpy(tmp, in, OGS_AES_BLOCK_SIZE);
1355
1356
0
            ogs_aes_decrypt(rk, nrounds, in, out);
1357
0
            for(n=0; n < OGS_AES_BLOCK_SIZE; ++n)
1358
0
                out[n] ^= ivec[n];
1359
0
            memcpy(ivec, tmp, OGS_AES_BLOCK_SIZE);
1360
0
            len -= OGS_AES_BLOCK_SIZE;
1361
0
            in += OGS_AES_BLOCK_SIZE;
1362
0
            out += OGS_AES_BLOCK_SIZE;
1363
0
        }
1364
1365
0
        if (len)
1366
0
        {
1367
0
            memcpy(tmp, in, OGS_AES_BLOCK_SIZE);
1368
0
            ogs_aes_decrypt(rk, nrounds, tmp, out);
1369
0
            for(n=0; n < len; ++n)
1370
0
                out[n] ^= ivec[n];
1371
0
            for(n=len; n < OGS_AES_BLOCK_SIZE; ++n)
1372
0
                out[n] = tmp[n];
1373
1374
0
            memcpy(ivec, tmp, OGS_AES_BLOCK_SIZE);
1375
0
        }
1376
0
    }
1377
1378
0
    return OGS_OK;
1379
0
}
1380
1381
static void ctr128_inc(uint8_t *counter)
1382
0
{
1383
0
    uint32_t n = 16, c = 1;
1384
1385
0
    do {
1386
0
        --n;
1387
0
        c += counter[n];
1388
0
        counter[n] = (uint8_t)c;
1389
0
        c >>= 8;
1390
0
    } while (n);
1391
0
}
1392
1393
static void ctr128_inc_aligned(uint8_t *counter)
1394
0
{
1395
0
    size_t *data, c, d, n;
1396
0
    const union {
1397
0
        long one;
1398
0
        char little;
1399
0
    } is_endian = {
1400
0
        1
1401
0
    };
1402
1403
0
    if (is_endian.little || ((size_t)counter % sizeof(size_t)) != 0) {
1404
0
        ctr128_inc(counter);
1405
0
        return;
1406
0
    }
1407
1408
0
    data = (size_t *)counter;
1409
0
    c = 1;
1410
0
    n = 16 / sizeof(size_t);
1411
0
    do {
1412
0
        --n;
1413
0
        d = data[n] += c;
1414
        /* did addition carry? */
1415
0
        c = ((d - c) & ~d) >> (sizeof(size_t) * 8 - 1);
1416
0
    } while (n);
1417
0
}
1418
1419
int ogs_aes_ctr128_encrypt(const uint8_t *key,
1420
        uint8_t *ivec, const uint8_t *in, const uint32_t inlen,
1421
        uint8_t *out)
1422
0
{
1423
0
    uint8_t ecount_buf[16];
1424
0
    uint32_t len = inlen;
1425
1426
0
    uint32_t rk[OGS_AES_RKLENGTH(OGS_AES_MAX_KEY_BITS)];
1427
0
    int nrounds;
1428
1429
0
    uint32_t n = 0;
1430
0
    size_t l = 0;
1431
1432
0
    ogs_assert(key);
1433
0
    ogs_assert(ivec);
1434
0
    ogs_assert(in);
1435
0
    ogs_assert(len);
1436
0
    ogs_assert(out);
1437
1438
0
    memset(ecount_buf, 0, 16);
1439
0
    nrounds = ogs_aes_setup_enc(rk, key, 128);
1440
1441
0
    while (n && len) 
1442
0
    {
1443
0
        *(out++) = *(in++) ^ ecount_buf[n];
1444
0
        --len;
1445
0
        n = (n + 1) % 16;
1446
0
    }
1447
1448
0
    while (len >= 16) 
1449
0
    {
1450
0
        ogs_aes_encrypt(rk, nrounds, ivec, ecount_buf);
1451
0
        ctr128_inc_aligned(ivec);
1452
0
        for (n = 0; n < 16; n += sizeof(size_t))
1453
0
            *(size_t *)(out + n) =
1454
0
                *(size_t *)(in + n) ^ *(size_t *)(ecount_buf + n);
1455
0
        len -= 16;
1456
0
        out += 16;
1457
0
        in += 16;
1458
0
        n = 0;
1459
0
    }
1460
0
    if (len) 
1461
0
    {
1462
0
        ogs_aes_encrypt(rk, nrounds, ivec, ecount_buf);
1463
0
        ctr128_inc_aligned(ivec);
1464
0
        while (len--) 
1465
0
        {
1466
0
            out[n] = in[n] ^ ecount_buf[n];
1467
0
            ++n;
1468
0
        }
1469
0
    }
1470
0
    return OGS_OK;
1471
1472
    /* low-performance for understanding the aes-ctr128 */
1473
0
    while (l < len) 
1474
0
    {
1475
0
        if (n == 0) 
1476
0
        {
1477
0
            ogs_aes_encrypt(rk, nrounds, ivec, ecount_buf);
1478
0
            ctr128_inc(ivec);
1479
0
        }
1480
0
        out[l] = in[l] ^ ecount_buf[n];
1481
0
        ++l;
1482
0
        n = (n + 1) % 16;
1483
0
    }
1484
1485
0
    return OGS_OK;
1486
0
}
1487