Coverage Report

Created: 2025-07-01 06:51

/src/openvswitch/lib/aes128.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2009, 2012 Nicira, Inc.
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at:
7
 *
8
 *     http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
17
/*
18
 * Based on rijndael.txt by Philip J. Erdelsky, downloaded from
19
 * http://www.efgh.com/software/rijndael.htm on September 24, 2009.  The
20
 * license information there is: "Public domain; no restrictions on use."
21
 * The Apache license above applies only to Nicira's modifications to the
22
 * original code.
23
 */
24
25
#include <config.h>
26
27
#include "aes128.h"
28
29
#include "util.h"
30
31
static const uint32_t Te0[256] = {
32
    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
33
    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
34
    0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
35
    0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
36
    0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
37
    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
38
    0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
39
    0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
40
    0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
41
    0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
42
    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
43
    0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
44
    0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
45
    0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
46
    0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
47
    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
48
    0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
49
    0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
50
    0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
51
    0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
52
    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
53
    0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
54
    0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
55
    0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
56
    0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
57
    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
58
    0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
59
    0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
60
    0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
61
    0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
62
    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
63
    0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
64
    0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
65
    0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
66
    0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
67
    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
68
    0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
69
    0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
70
    0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
71
    0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
72
    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
73
    0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
74
    0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
75
    0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
76
    0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
77
    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
78
    0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
79
    0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
80
    0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
81
    0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
82
    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
83
    0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
84
    0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
85
    0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
86
    0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
87
    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
88
    0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
89
    0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
90
    0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
91
    0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
92
    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
93
    0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
94
    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
95
    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
96
};
97
98
static const uint32_t Te1[256] = {
99
    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
100
    0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
101
    0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
102
    0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
103
    0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
104
    0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
105
    0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
106
    0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
107
    0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
108
    0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
109
    0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
110
    0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
111
    0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
112
    0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
113
    0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
114
    0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
115
    0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
116
    0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
117
    0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
118
    0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
119
    0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
120
    0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
121
    0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
122
    0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
123
    0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
124
    0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
125
    0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
126
    0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
127
    0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
128
    0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
129
    0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
130
    0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
131
    0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
132
    0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
133
    0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
134
    0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
135
    0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
136
    0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
137
    0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
138
    0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
139
    0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
140
    0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
141
    0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
142
    0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
143
    0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
144
    0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
145
    0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
146
    0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
147
    0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
148
    0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
149
    0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
150
    0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
151
    0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
152
    0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
153
    0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
154
    0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
155
    0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
156
    0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
157
    0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
158
    0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
159
    0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
160
    0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
161
    0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
162
    0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
163
};
164
165
static const uint32_t Te2[256] = {
166
    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
167
    0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
168
    0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
169
    0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
170
    0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
171
    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
172
    0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
173
    0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
174
    0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
175
    0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
176
    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
177
    0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
178
    0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
179
    0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
180
    0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
181
    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
182
    0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
183
    0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
184
    0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
185
    0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
186
    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
187
    0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
188
    0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
189
    0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
190
    0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
191
    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
192
    0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
193
    0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
194
    0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
195
    0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
196
    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
197
    0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
198
    0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
199
    0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
200
    0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
201
    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
202
    0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
203
    0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
204
    0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
205
    0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
206
    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
207
    0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
208
    0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
209
    0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
210
    0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
211
    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
212
    0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
213
    0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
214
    0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
215
    0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
216
    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
217
    0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
218
    0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
219
    0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
220
    0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
221
    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
222
    0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
223
    0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
224
    0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
225
    0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
226
    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
227
    0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
228
    0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
229
    0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
230
};
231
232
static const uint32_t Te3[256] = {
233
    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
234
    0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
235
    0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
236
    0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
237
    0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
238
    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
239
    0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
240
    0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
241
    0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
242
    0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
243
    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
244
    0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
245
    0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
246
    0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
247
    0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
248
    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
249
    0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
250
    0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
251
    0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
252
    0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
253
    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
254
    0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
255
    0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
256
    0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
257
    0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
258
    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
259
    0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
260
    0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
261
    0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
262
    0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
263
    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
264
    0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
265
    0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
266
    0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
267
    0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
268
    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
269
    0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
270
    0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
271
    0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
272
    0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
273
    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
274
    0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
275
    0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
276
    0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
277
    0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
278
    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
279
    0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
280
    0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
281
    0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
282
    0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
283
    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
284
    0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
285
    0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
286
    0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
287
    0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
288
    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
289
    0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
290
    0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
291
    0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
292
    0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
293
    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
294
    0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
295
    0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
296
    0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
297
};
298
299
static const uint32_t Te4[256] = {
300
    0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
301
    0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
302
    0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
303
    0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
304
    0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
305
    0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
306
    0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
307
    0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
308
    0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
309
    0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
310
    0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
311
    0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
312
    0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
313
    0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
314
    0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
315
    0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
316
    0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
317
    0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
318
    0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
319
    0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
320
    0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
321
    0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
322
    0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
323
    0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
324
    0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
325
    0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
326
    0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
327
    0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
328
    0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
329
    0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
330
    0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
331
    0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
332
    0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
333
    0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
334
    0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
335
    0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
336
    0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
337
    0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
338
    0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
339
    0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
340
    0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
341
    0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
342
    0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
343
    0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
344
    0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
345
    0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
346
    0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
347
    0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
348
    0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
349
    0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
350
    0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
351
    0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
352
    0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
353
    0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
354
    0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
355
    0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
356
    0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
357
    0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
358
    0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
359
    0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
360
    0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
361
    0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
362
    0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
363
    0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
364
};
365
366
static const uint32_t rcon[] = {
367
    0x01000000, 0x02000000, 0x04000000, 0x08000000,
368
    0x10000000, 0x20000000, 0x40000000, 0x80000000,
369
    0x1B000000, 0x36000000,
370
};
371
372
static uint32_t
373
get_u32(const uint8_t *p)
374
0
{
375
0
    uint32_t p0 = p[0];
376
0
    uint32_t p1 = p[1];
377
0
    uint32_t p2 = p[2];
378
0
    uint32_t p3 = p[3];
379
0
    return (p0 << 24) | (p1 << 16) | (p2 << 8) | p3;
380
0
}
381
382
static void
383
put_u32(uint8_t *p, uint32_t x)
384
0
{
385
0
    p[0] = x >> 24;
386
0
    p[1] = x >> 16;
387
0
    p[2] = x >> 8;
388
0
    p[3] = x;
389
0
}
390
391
/* Expands 128-bit 'key' into the encryption key 'schedule'. */
392
void
393
aes128_schedule(struct aes128 *aes, const uint8_t key[16])
394
0
{
395
0
    uint32_t *rk = aes->rk;
396
0
    int i;
397
398
0
    rk[0] = get_u32(key);
399
0
    rk[1] = get_u32(key + 4);
400
0
    rk[2] = get_u32(key + 8);
401
0
    rk[3] = get_u32(key + 12);
402
0
    for (i = 0; i < 10; i++, rk += 4) {
403
0
        uint32_t temp = rk[3];
404
0
        rk[4] = (rk[0]
405
0
                 ^ (Te4[(temp >> 16) & 0xff] & 0xff000000)
406
0
                 ^ (Te4[(temp >>  8) & 0xff] & 0x00ff0000)
407
0
                 ^ (Te4[(temp      ) & 0xff] & 0x0000ff00)
408
0
                 ^ (Te4[(temp >> 24)       ] & 0x000000ff)
409
0
                 ^ rcon[i]);
410
0
        rk[5] = rk[1] ^ rk[4];
411
0
        rk[6] = rk[2] ^ rk[5];
412
0
        rk[7] = rk[3] ^ rk[6];
413
0
    }
414
0
    ovs_assert(rk == &aes->rk[40]);
415
0
}
416
417
void
418
aes128_encrypt(const struct aes128 *aes, const void *input_, void *output_)
419
0
{
420
0
    const uint8_t *input = input_;
421
0
    uint8_t *output = output_;
422
0
    const uint32_t *rk = aes->rk;
423
0
    uint32_t s0, s1, s2, s3;
424
0
    uint32_t t0, t1, t2, t3;
425
0
    int r;
426
427
    /* Map byte array block to cipher state and add initial round key. */
428
0
    s0 = get_u32(input     ) ^ rk[0];
429
0
    s1 = get_u32(input +  4) ^ rk[1];
430
0
    s2 = get_u32(input +  8) ^ rk[2];
431
0
    s3 = get_u32(input + 12) ^ rk[3];
432
433
    /* 10 full rounds. */
434
0
    r = 10 / 2;
435
0
    for (;;) {
436
0
        t0 = (Te0[(s0 >> 24)       ]
437
0
              ^ Te1[(s1 >> 16) & 0xff]
438
0
              ^ Te2[(s2 >>  8) & 0xff]
439
0
              ^ Te3[(s3      ) & 0xff]
440
0
              ^ rk[4]);
441
0
        t1 = (Te0[(s1 >> 24)       ]
442
0
              ^ Te1[(s2 >> 16) & 0xff]
443
0
              ^ Te2[(s3 >>  8) & 0xff]
444
0
              ^ Te3[(s0      ) & 0xff]
445
0
              ^ rk[5]);
446
0
        t2 = (Te0[(s2 >> 24)       ]
447
0
              ^ Te1[(s3 >> 16) & 0xff]
448
0
              ^ Te2[(s0 >>  8) & 0xff]
449
0
              ^ Te3[(s1      ) & 0xff]
450
0
              ^ rk[6]);
451
0
        t3 = (Te0[(s3 >> 24)       ]
452
0
              ^ Te1[(s0 >> 16) & 0xff]
453
0
              ^ Te2[(s1 >>  8) & 0xff]
454
0
              ^ Te3[(s2      ) & 0xff]
455
0
              ^ rk[7]);
456
457
0
        rk += 8;
458
0
        if (--r == 0) {
459
0
            break;
460
0
        }
461
462
0
        s0 = (Te0[(t0 >> 24)       ]
463
0
              ^ Te1[(t1 >> 16) & 0xff]
464
0
              ^ Te2[(t2 >>  8) & 0xff]
465
0
              ^ Te3[(t3      ) & 0xff]
466
0
              ^ rk[0]);
467
0
        s1 = (Te0[(t1 >> 24)       ]
468
0
              ^ Te1[(t2 >> 16) & 0xff]
469
0
              ^ Te2[(t3 >>  8) & 0xff]
470
0
              ^ Te3[(t0      ) & 0xff]
471
0
              ^ rk[1]);
472
0
        s2 = (Te0[(t2 >> 24)       ]
473
0
              ^ Te1[(t3 >> 16) & 0xff]
474
0
              ^ Te2[(t0 >>  8) & 0xff]
475
0
              ^ Te3[(t1      ) & 0xff]
476
0
              ^ rk[2]);
477
0
        s3 = (Te0[(t3 >> 24)       ]
478
0
              ^ Te1[(t0 >> 16) & 0xff]
479
0
              ^ Te2[(t1 >>  8) & 0xff]
480
0
              ^ Te3[(t2      ) & 0xff]
481
0
              ^ rk[3]);
482
0
    }
483
484
    /* Apply last round and map cipher state to byte array block. */
485
0
    s0 = ((Te4[(t0 >> 24)       ] & 0xff000000)
486
0
          ^ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000)
487
0
          ^ (Te4[(t2 >>  8) & 0xff] & 0x0000ff00)
488
0
          ^ (Te4[(t3      ) & 0xff] & 0x000000ff)
489
0
          ^ rk[0]);
490
0
    put_u32(output     , s0);
491
0
    s1 = ((Te4[(t1 >> 24)       ] & 0xff000000)
492
0
          ^ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000)
493
0
          ^ (Te4[(t3 >>  8) & 0xff] & 0x0000ff00)
494
0
          ^ (Te4[(t0      ) & 0xff] & 0x000000ff)
495
0
          ^ rk[1]);
496
0
    put_u32(output +  4, s1);
497
0
    s2 = ((Te4[(t2 >> 24)       ] & 0xff000000)
498
0
          ^ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000)
499
0
          ^ (Te4[(t0 >>  8) & 0xff] & 0x0000ff00)
500
0
          ^ (Te4[(t1      ) & 0xff] & 0x000000ff)
501
0
          ^ rk[2]);
502
0
    put_u32(output +  8, s2);
503
0
    s3 = ((Te4[(t3 >> 24)       ] & 0xff000000)
504
0
          ^ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000)
505
0
          ^ (Te4[(t1 >>  8) & 0xff] & 0x0000ff00)
506
0
          ^ (Te4[(t2      ) & 0xff] & 0x000000ff)
507
0
          ^ rk[3]);
508
0
    put_u32(output + 12, s3);
509
0
}