datapath: Use ether_addr_copy
[sliver-openvswitch.git] / lib / aes128.c
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 {
375     uint32_t p0 = p[0];
376     uint32_t p1 = p[1];
377     uint32_t p2 = p[2];
378     uint32_t p3 = p[3];
379     return (p0 << 24) | (p1 << 16) | (p2 << 8) | p3;
380 }
381
382 static void
383 put_u32(uint8_t *p, uint32_t x)
384 {
385     p[0] = x >> 24;
386     p[1] = x >> 16;
387     p[2] = x >> 8;
388     p[3] = x;
389 }
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 {
395     uint32_t *rk = aes->rk;
396     int i;
397
398     rk[0] = get_u32(key);
399     rk[1] = get_u32(key + 4);
400     rk[2] = get_u32(key + 8);
401     rk[3] = get_u32(key + 12);
402     for (i = 0; i < 10; i++, rk += 4) {
403         uint32_t temp = rk[3];
404         rk[4] = (rk[0]
405                  ^ (Te4[(temp >> 16) & 0xff] & 0xff000000)
406                  ^ (Te4[(temp >>  8) & 0xff] & 0x00ff0000)
407                  ^ (Te4[(temp      ) & 0xff] & 0x0000ff00)
408                  ^ (Te4[(temp >> 24)       ] & 0x000000ff)
409                  ^ rcon[i]);
410         rk[5] = rk[1] ^ rk[4];
411         rk[6] = rk[2] ^ rk[5];
412         rk[7] = rk[3] ^ rk[6];
413     }
414     ovs_assert(rk == &aes->rk[40]);
415 }
416
417 void
418 aes128_encrypt(const struct aes128 *aes, const void *input_, void *output_)
419 {
420     const uint8_t *input = input_;
421     uint8_t *output = output_;
422     const uint32_t *rk = aes->rk;
423     uint32_t s0, s1, s2, s3;
424     uint32_t t0, t1, t2, t3;
425     int r;
426
427     /* Map byte array block to cipher state and add initial round key. */
428     s0 = get_u32(input     ) ^ rk[0];
429     s1 = get_u32(input +  4) ^ rk[1];
430     s2 = get_u32(input +  8) ^ rk[2];
431     s3 = get_u32(input + 12) ^ rk[3];
432
433     /* 10 full rounds. */
434     r = 10 / 2;
435     for (;;) {
436         t0 = (Te0[(s0 >> 24)       ]
437               ^ Te1[(s1 >> 16) & 0xff]
438               ^ Te2[(s2 >>  8) & 0xff]
439               ^ Te3[(s3      ) & 0xff]
440               ^ rk[4]);
441         t1 = (Te0[(s1 >> 24)       ]
442               ^ Te1[(s2 >> 16) & 0xff]
443               ^ Te2[(s3 >>  8) & 0xff]
444               ^ Te3[(s0      ) & 0xff]
445               ^ rk[5]);
446         t2 = (Te0[(s2 >> 24)       ]
447               ^ Te1[(s3 >> 16) & 0xff]
448               ^ Te2[(s0 >>  8) & 0xff]
449               ^ Te3[(s1      ) & 0xff]
450               ^ rk[6]);
451         t3 = (Te0[(s3 >> 24)       ]
452               ^ Te1[(s0 >> 16) & 0xff]
453               ^ Te2[(s1 >>  8) & 0xff]
454               ^ Te3[(s2      ) & 0xff]
455               ^ rk[7]);
456
457         rk += 8;
458         if (--r == 0) {
459             break;
460         }
461
462         s0 = (Te0[(t0 >> 24)       ]
463               ^ Te1[(t1 >> 16) & 0xff]
464               ^ Te2[(t2 >>  8) & 0xff]
465               ^ Te3[(t3      ) & 0xff]
466               ^ rk[0]);
467         s1 = (Te0[(t1 >> 24)       ]
468               ^ Te1[(t2 >> 16) & 0xff]
469               ^ Te2[(t3 >>  8) & 0xff]
470               ^ Te3[(t0      ) & 0xff]
471               ^ rk[1]);
472         s2 = (Te0[(t2 >> 24)       ]
473               ^ Te1[(t3 >> 16) & 0xff]
474               ^ Te2[(t0 >>  8) & 0xff]
475               ^ Te3[(t1      ) & 0xff]
476               ^ rk[2]);
477         s3 = (Te0[(t3 >> 24)       ]
478               ^ Te1[(t0 >> 16) & 0xff]
479               ^ Te2[(t1 >>  8) & 0xff]
480               ^ Te3[(t2      ) & 0xff]
481               ^ rk[3]);
482     }
483
484     /* Apply last round and map cipher state to byte array block. */
485     s0 = ((Te4[(t0 >> 24)       ] & 0xff000000)
486           ^ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000)
487           ^ (Te4[(t2 >>  8) & 0xff] & 0x0000ff00)
488           ^ (Te4[(t3      ) & 0xff] & 0x000000ff)
489           ^ rk[0]);
490     put_u32(output     , s0);
491     s1 = ((Te4[(t1 >> 24)       ] & 0xff000000)
492           ^ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000)
493           ^ (Te4[(t3 >>  8) & 0xff] & 0x0000ff00)
494           ^ (Te4[(t0      ) & 0xff] & 0x000000ff)
495           ^ rk[1]);
496     put_u32(output +  4, s1);
497     s2 = ((Te4[(t2 >> 24)       ] & 0xff000000)
498           ^ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000)
499           ^ (Te4[(t0 >>  8) & 0xff] & 0x0000ff00)
500           ^ (Te4[(t1      ) & 0xff] & 0x000000ff)
501           ^ rk[2]);
502     put_u32(output +  8, s2);
503     s3 = ((Te4[(t3 >> 24)       ] & 0xff000000)
504           ^ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000)
505           ^ (Te4[(t1 >>  8) & 0xff] & 0x0000ff00)
506           ^ (Te4[(t2      ) & 0xff] & 0x000000ff)
507           ^ rk[3]);
508     put_u32(output + 12, s3);
509 }