~ubuntu-branches/ubuntu/trusty/sflphone/trusty

« back to all changes in this revision

Viewing changes to daemon/libs/pjproject-2.1.0/third_party/srtp/crypto/cipher/aes.c

  • Committer: Package Import Robot
  • Author(s): Mark Purcell
  • Date: 2014-01-28 18:23:36 UTC
  • mfrom: (4.3.4 sid)
  • Revision ID: package-import@ubuntu.com-20140128182336-jrsv0k9u6cawc068
Tags: 1.3.0-1
* New upstream release 
  - Fixes "New Upstream Release" (Closes: #735846)
  - Fixes "Ringtone does not stop" (Closes: #727164)
  - Fixes "[sflphone-kde] crash on startup" (Closes: #718178)
  - Fixes "sflphone GUI crashes when call is hung up" (Closes: #736583)
* Build-Depends: ensure GnuTLS 2.6
  - libucommon-dev (>= 6.0.7-1.1), libccrtp-dev (>= 2.0.6-3)
  - Fixes "FTBFS Build-Depends libgnutls{26,28}-dev" (Closes: #722040)
* Fix "boost 1.49 is going away" unversioned Build-Depends: (Closes: #736746)
* Add Build-Depends: libsndfile-dev, nepomuk-core-dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * aes.c
 
3
 *
 
4
 * An implemnetation of the AES block cipher.
 
5
 *
 
6
 * David A. McGrew
 
7
 * Cisco Systems, Inc.
 
8
 */
 
9
 
 
10
/*
 
11
 *      
 
12
 * Copyright (c) 2001-2006, Cisco Systems, Inc.
 
13
 * All rights reserved.
 
14
 * 
 
15
 * Redistribution and use in source and binary forms, with or without
 
16
 * modification, are permitted provided that the following conditions
 
17
 * are met:
 
18
 * 
 
19
 *   Redistributions of source code must retain the above copyright
 
20
 *   notice, this list of conditions and the following disclaimer.
 
21
 * 
 
22
 *   Redistributions in binary form must reproduce the above
 
23
 *   copyright notice, this list of conditions and the following
 
24
 *   disclaimer in the documentation and/or other materials provided
 
25
 *   with the distribution.
 
26
 * 
 
27
 *   Neither the name of the Cisco Systems, Inc. nor the names of its
 
28
 *   contributors may be used to endorse or promote products derived
 
29
 *   from this software without specific prior written permission.
 
30
 * 
 
31
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
32
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 
33
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 
34
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 
35
 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 
36
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 
37
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 
38
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
39
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 
40
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
41
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 
42
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 
43
 *
 
44
 */
 
45
 
 
46
 
 
47
#include "aes.h"
 
48
#include "err.h"
 
49
 
 
50
/* 
 
51
 * we use the tables T0, T1, T2, T3, and T4 to compute AES, and 
 
52
 * the tables U0, U1, U2, and U4 to compute its inverse
 
53
 *
 
54
 * different tables are used on little-endian (Intel, VMS) and
 
55
 * big-endian processors (everything else)
 
56
 *
 
57
 * these tables are computed using the program tables/aes_tables; use
 
58
 * this program to generate different tables for porting or
 
59
 * optimization on a different platform
 
60
 */
 
61
 
 
62
#ifndef WORDS_BIGENDIAN
 
63
 
 
64
static uint32_t T0[256] = {
 
65
  0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 
 
66
  0xdf2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, 
 
67
  0x50303060, 0x3010102, 0xa96767ce, 0x7d2b2b56, 
 
68
  0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec, 
 
69
  0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, 
 
70
  0x15fafaef, 0xeb5959b2, 0xc947478e, 0xbf0f0fb, 
 
71
  0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 
 
72
  0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b, 
 
73
  0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c, 
 
74
  0x5a36366c, 0x413f3f7e, 0x2f7f7f5, 0x4fcccc83, 
 
75
  0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x8f1f1f9, 
 
76
  0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a, 
 
77
  0xc040408, 0x52c7c795, 0x65232346, 0x5ec3c39d, 
 
78
  0x28181830, 0xa1969637, 0xf05050a, 0xb59a9a2f, 
 
79
  0x907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, 
 
80
  0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, 
 
81
  0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 
 
82
  0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b, 
 
83
  0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, 
 
84
  0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, 
 
85
  0xf55353a6, 0x68d1d1b9, 0x0, 0x2cededc1, 
 
86
  0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, 
 
87
  0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, 
 
88
  0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85, 
 
89
  0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, 
 
90
  0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, 
 
91
  0xcf45458a, 0x10f9f9e9, 0x6020204, 0x817f7ffe, 
 
92
  0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b, 
 
93
  0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05, 
 
94
  0xad92923f, 0xbc9d9d21, 0x48383870, 0x4f5f5f1, 
 
95
  0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, 
 
96
  0x30101020, 0x1affffe5, 0xef3f3fd, 0x6dd2d2bf, 
 
97
  0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3, 
 
98
  0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e, 
 
99
  0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, 
 
100
  0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, 
 
101
  0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 
 
102
  0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b, 
 
103
  0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, 
 
104
  0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, 
 
105
  0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 
 
106
  0xdb494992, 0xa06060c, 0x6c242448, 0xe45c5cb8, 
 
107
  0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, 
 
108
  0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2, 
 
109
  0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, 
 
110
  0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, 
 
111
  0xb46c6cd8, 0xfa5656ac, 0x7f4f4f3, 0x25eaeacf, 
 
112
  0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810, 
 
113
  0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c, 
 
114
  0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, 
 
115
  0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, 
 
116
  0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, 
 
117
  0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, 
 
118
  0xd8484890, 0x5030306, 0x1f6f6f7, 0x120e0e1c, 
 
119
  0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, 
 
120
  0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, 
 
121
  0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, 
 
122
  0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433, 
 
123
  0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, 
 
124
  0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, 
 
125
  0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 
 
126
  0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0, 
 
127
  0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e, 
 
128
  0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c, 
 
129
};
 
130
 
 
131
static uint32_t T1[256] = {
 
132
  0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, 
 
133
  0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154, 
 
134
  0x30306050, 0x1010203, 0x6767cea9, 0x2b2b567d, 
 
135
  0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a, 
 
136
  0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87, 
 
137
  0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b, 
 
138
  0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, 
 
139
  0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b, 
 
140
  0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a, 
 
141
  0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f, 
 
142
  0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908, 
 
143
  0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f, 
 
144
  0x404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e, 
 
145
  0x18183028, 0x969637a1, 0x5050a0f, 0x9a9a2fb5, 
 
146
  0x7070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d, 
 
147
  0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f, 
 
148
  0x909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e, 
 
149
  0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb, 
 
150
  0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce, 
 
151
  0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397, 
 
152
  0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c, 
 
153
  0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed, 
 
154
  0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b, 
 
155
  0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a, 
 
156
  0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16, 
 
157
  0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194, 
 
158
  0x45458acf, 0xf9f9e910, 0x2020406, 0x7f7ffe81, 
 
159
  0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3, 
 
160
  0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a, 
 
161
  0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104, 
 
162
  0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263, 
 
163
  0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d, 
 
164
  0xcdcd814c, 0xc0c1814, 0x13132635, 0xececc32f, 
 
165
  0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39, 
 
166
  0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47, 
 
167
  0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695, 
 
168
  0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f, 
 
169
  0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83, 
 
170
  0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c, 
 
171
  0xdedea779, 0x5e5ebce2, 0xb0b161d, 0xdbdbad76, 
 
172
  0xe0e0db3b, 0x32326456, 0x3a3a744e, 0xa0a141e, 
 
173
  0x494992db, 0x6060c0a, 0x2424486c, 0x5c5cb8e4, 
 
174
  0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6, 
 
175
  0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b, 
 
176
  0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7, 
 
177
  0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0, 
 
178
  0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25, 
 
179
  0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x8081018, 
 
180
  0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72, 
 
181
  0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751, 
 
182
  0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21, 
 
183
  0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85, 
 
184
  0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa, 
 
185
  0x484890d8, 0x3030605, 0xf6f6f701, 0xe0e1c12, 
 
186
  0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0, 
 
187
  0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9, 
 
188
  0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233, 
 
189
  0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7, 
 
190
  0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920, 
 
191
  0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a, 
 
192
  0x8c8c038f, 0xa1a159f8, 0x89890980, 0xd0d1a17, 
 
193
  0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8, 
 
194
  0x414182c3, 0x999929b0, 0x2d2d5a77, 0xf0f1e11, 
 
195
  0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a, 
 
196
};
 
197
 
 
198
static uint32_t T2[256] = {
 
199
  0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, 
 
200
  0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5, 
 
201
  0x30605030, 0x1020301, 0x67cea967, 0x2b567d2b, 
 
202
  0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76, 
 
203
  0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d, 
 
204
  0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0, 
 
205
  0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, 
 
206
  0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0, 
 
207
  0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26, 
 
208
  0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc, 
 
209
  0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1, 
 
210
  0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15, 
 
211
  0x4080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3, 
 
212
  0x18302818, 0x9637a196, 0x50a0f05, 0x9a2fb59a, 
 
213
  0x70e0907, 0x12243612, 0x801b9b80, 0xe2df3de2, 
 
214
  0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75, 
 
215
  0x9121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a, 
 
216
  0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0, 
 
217
  0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3, 
 
218
  0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784, 
 
219
  0x53a6f553, 0xd1b968d1, 0x0, 0xedc12ced, 
 
220
  0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b, 
 
221
  0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39, 
 
222
  0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf, 
 
223
  0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb, 
 
224
  0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485, 
 
225
  0x458acf45, 0xf9e910f9, 0x2040602, 0x7ffe817f, 
 
226
  0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8, 
 
227
  0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f, 
 
228
  0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5, 
 
229
  0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321, 
 
230
  0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2, 
 
231
  0xcd814ccd, 0xc18140c, 0x13263513, 0xecc32fec, 
 
232
  0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917, 
 
233
  0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d, 
 
234
  0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573, 
 
235
  0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc, 
 
236
  0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388, 
 
237
  0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14, 
 
238
  0xdea779de, 0x5ebce25e, 0xb161d0b, 0xdbad76db, 
 
239
  0xe0db3be0, 0x32645632, 0x3a744e3a, 0xa141e0a, 
 
240
  0x4992db49, 0x60c0a06, 0x24486c24, 0x5cb8e45c, 
 
241
  0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662, 
 
242
  0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79, 
 
243
  0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d, 
 
244
  0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9, 
 
245
  0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea, 
 
246
  0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x8101808, 
 
247
  0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e, 
 
248
  0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6, 
 
249
  0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f, 
 
250
  0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a, 
 
251
  0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66, 
 
252
  0x4890d848, 0x3060503, 0xf6f701f6, 0xe1c120e, 
 
253
  0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9, 
 
254
  0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e, 
 
255
  0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311, 
 
256
  0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794, 
 
257
  0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9, 
 
258
  0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf, 
 
259
  0x8c038f8c, 0xa159f8a1, 0x89098089, 0xd1a170d, 
 
260
  0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868, 
 
261
  0x4182c341, 0x9929b099, 0x2d5a772d, 0xf1e110f, 
 
262
  0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16, 
 
263
};
 
264
 
 
265
static uint32_t T3[256] = {
 
266
  0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, 
 
267
  0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5, 
 
268
  0x60503030, 0x2030101, 0xcea96767, 0x567d2b2b, 
 
269
  0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676, 
 
270
  0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d, 
 
271
  0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0, 
 
272
  0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, 
 
273
  0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0, 
 
274
  0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626, 
 
275
  0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc, 
 
276
  0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1, 
 
277
  0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515, 
 
278
  0x80c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3, 
 
279
  0x30281818, 0x37a19696, 0xa0f0505, 0x2fb59a9a, 
 
280
  0xe090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2, 
 
281
  0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575, 
 
282
  0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a, 
 
283
  0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0, 
 
284
  0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3, 
 
285
  0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484, 
 
286
  0xa6f55353, 0xb968d1d1, 0x0, 0xc12ceded, 
 
287
  0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b, 
 
288
  0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939, 
 
289
  0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf, 
 
290
  0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb, 
 
291
  0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585, 
 
292
  0x8acf4545, 0xe910f9f9, 0x4060202, 0xfe817f7f, 
 
293
  0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8, 
 
294
  0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x58a8f8f, 
 
295
  0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5, 
 
296
  0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121, 
 
297
  0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2, 
 
298
  0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec, 
 
299
  0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717, 
 
300
  0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d, 
 
301
  0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373, 
 
302
  0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc, 
 
303
  0x44662222, 0x547e2a2a, 0x3bab9090, 0xb838888, 
 
304
  0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414, 
 
305
  0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb, 
 
306
  0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, 
 
307
  0x92db4949, 0xc0a0606, 0x486c2424, 0xb8e45c5c, 
 
308
  0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262, 
 
309
  0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979, 
 
310
  0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d, 
 
311
  0x18c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9, 
 
312
  0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea, 
 
313
  0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808, 
 
314
  0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e, 
 
315
  0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6, 
 
316
  0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f, 
 
317
  0x96dd4b4b, 0x61dcbdbd, 0xd868b8b, 0xf858a8a, 
 
318
  0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666, 
 
319
  0x90d84848, 0x6050303, 0xf701f6f6, 0x1c120e0e, 
 
320
  0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9, 
 
321
  0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e, 
 
322
  0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111, 
 
323
  0xd2bb6969, 0xa970d9d9, 0x7898e8e, 0x33a79494, 
 
324
  0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9, 
 
325
  0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf, 
 
326
  0x38f8c8c, 0x59f8a1a1, 0x9808989, 0x1a170d0d, 
 
327
  0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868, 
 
328
  0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f, 
 
329
  0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616, 
 
330
};
 
331
 
 
332
static uint32_t U0[256] = {
 
333
  0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 
 
334
  0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b, 
 
335
  0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5, 
 
336
  0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5, 
 
337
  0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d, 
 
338
  0x2752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b, 
 
339
  0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295, 
 
340
  0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e, 
 
341
  0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927, 
 
342
  0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d, 
 
343
  0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362, 
 
344
  0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9, 
 
345
  0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52, 
 
346
  0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566, 
 
347
  0x728ebb2, 0x3c2b52f, 0x9a7bc586, 0xa50837d3, 
 
348
  0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed, 
 
349
  0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e, 
 
350
  0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4, 
 
351
  0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4, 
 
352
  0x39ec830b, 0xaaef6040, 0x69f715e, 0x51106ebd, 
 
353
  0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, 
 
354
  0xb58d5491, 0x55dc471, 0x6fd40604, 0xff155060, 
 
355
  0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967, 
 
356
  0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879, 
 
357
  0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x0, 
 
358
  0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c, 
 
359
  0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36, 
 
360
  0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624, 
 
361
  0xb1670a0c, 0xfe75793, 0xd296eeb4, 0x9e919b1b, 
 
362
  0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c, 
 
363
  0xaba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12, 
 
364
  0xb0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14, 
 
365
  0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3, 
 
366
  0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b, 
 
367
  0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8, 
 
368
  0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684, 
 
369
  0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, 
 
370
  0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177, 
 
371
  0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947, 
 
372
  0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322, 
 
373
  0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, 
 
374
  0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f, 
 
375
  0xe49d3a2c, 0xd927850, 0x9bcc5f6a, 0x62467e54, 
 
376
  0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382, 
 
377
  0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf, 
 
378
  0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb, 
 
379
  0x97826cd, 0xf418596e, 0x1b79aec, 0xa89a4f83, 
 
380
  0x656e95e6, 0x7ee6ffaa, 0x8cfbc21, 0xe6e815ef, 
 
381
  0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029, 
 
382
  0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235, 
 
383
  0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733, 
 
384
  0x4a9804f1, 0xf7daec41, 0xe50cd7f, 0x2ff69117, 
 
385
  0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4, 
 
386
  0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546, 
 
387
  0x4ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb, 
 
388
  0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d, 
 
389
  0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb, 
 
390
  0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a, 
 
391
  0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773, 
 
392
  0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478, 
 
393
  0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, 
 
394
  0x72c31d16, 0xc25e2bc, 0x8b493c28, 0x41950dff, 
 
395
  0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664, 
 
396
  0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0, 
 
397
};
 
398
 
 
399
static uint32_t U1[256] = {
 
400
  0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96, 
 
401
  0x6bab3bcb, 0x459d1ff1, 0x58faacab, 0x3e34b93, 
 
402
  0xfa302055, 0x6d76adf6, 0x76cc8891, 0x4c02f525, 
 
403
  0xd7e54ffc, 0xcb2ac5d7, 0x44352680, 0xa362b58f, 
 
404
  0x5ab1de49, 0x1bba2567, 0xeea4598, 0xc0fe5de1, 
 
405
  0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6, 
 
406
  0x5f8f03e7, 0x9c921595, 0x7a6dbfeb, 0x595295da, 
 
407
  0x83bed42d, 0x217458d3, 0x69e04929, 0xc8c98e44, 
 
408
  0x89c2756a, 0x798ef478, 0x3e58996b, 0x71b927dd, 
 
409
  0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4, 
 
410
  0x4adf6318, 0x311ae582, 0x33519760, 0x7f536245, 
 
411
  0x7764b1e0, 0xae6bbb84, 0xa081fe1c, 0x2b08f994, 
 
412
  0x68487058, 0xfd458f19, 0x6cde9487, 0xf87b52b7, 
 
413
  0xd373ab23, 0x24b72e2, 0x8f1fe357, 0xab55662a, 
 
414
  0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x837d3a5, 
 
415
  0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c, 
 
416
  0x1ccf8a2b, 0xb479a792, 0xf207f3f0, 0xe2694ea1, 
 
417
  0xf4da65cd, 0xbe0506d5, 0x6234d11f, 0xfea6c48a, 
 
418
  0x532e349d, 0x55f3a2a0, 0xe18a0532, 0xebf6a475, 
 
419
  0xec830b39, 0xef6040aa, 0x9f715e06, 0x106ebd51, 
 
420
  0x8a213ef9, 0x6dd963d, 0x53eddae, 0xbde64d46, 
 
421
  0x8d5491b5, 0x5dc47105, 0xd406046f, 0x155060ff, 
 
422
  0xfb981924, 0xe9bdd697, 0x434089cc, 0x9ed96777, 
 
423
  0x42e8b0bd, 0x8b890788, 0x5b19e738, 0xeec879db, 
 
424
  0xa7ca147, 0xf427ce9, 0x1e84f8c9, 0x0, 
 
425
  0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e, 
 
426
  0xff0efdfb, 0x38850f56, 0xd5ae3d1e, 0x392d3627, 
 
427
  0xd90f0a64, 0xa65c6821, 0x545b9bd1, 0x2e36243a, 
 
428
  0x670a0cb1, 0xe757930f, 0x96eeb4d2, 0x919b1b9e, 
 
429
  0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16, 
 
430
  0xba93e20a, 0x2aa0c0e5, 0xe0223c43, 0x171b121d, 
 
431
  0xd090e0b, 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8, 
 
432
  0x19f15785, 0x775af4c, 0xdd99eebb, 0x607fa3fd, 
 
433
  0x2601f79f, 0xf5725cbc, 0x3b6644c5, 0x7efb5b34, 
 
434
  0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863, 
 
435
  0xdc31d7ca, 0x85634210, 0x22971340, 0x11c68420, 
 
436
  0x244a857d, 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d, 
 
437
  0x2f9e1d4b, 0x30b2dcf3, 0x52860dec, 0xe3c177d0, 
 
438
  0x16b32b6c, 0xb970a999, 0x489411fa, 0x64e94722, 
 
439
  0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8, 0x903322ef, 
 
440
  0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0xbd49836, 
 
441
  0x81f5a6cf, 0xde7aa528, 0x8eb7da26, 0xbfad3fa4, 
 
442
  0x9d3a2ce4, 0x9278500d, 0xcc5f6a9b, 0x467e5462, 
 
443
  0x138df6c2, 0xb8d890e8, 0xf7392e5e, 0xafc382f5, 
 
444
  0x805d9fbe, 0x93d0697c, 0x2dd56fa9, 0x1225cfb3, 
 
445
  0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b, 
 
446
  0x7826cd09, 0x18596ef4, 0xb79aec01, 0x9a4f83a8, 
 
447
  0x6e95e665, 0xe6ffaa7e, 0xcfbc2108, 0xe815efe6, 
 
448
  0x9be7bad9, 0x366f4ace, 0x99fead4, 0x7cb029d6, 
 
449
  0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0, 
 
450
  0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315, 
 
451
  0x9804f14a, 0xdaec41f7, 0x50cd7f0e, 0xf691172f, 
 
452
  0xd64d768d, 0xb0ef434d, 0x4daacc54, 0x496e4df, 
 
453
  0xb5d19ee3, 0x886a4c1b, 0x1f2cc1b8, 0x5165467f, 
 
454
  0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e, 
 
455
  0x1d67b35a, 0xd2db9252, 0x5610e933, 0x47d66d13, 
 
456
  0x61d79a8c, 0xca1377a, 0x14f8598e, 0x3c13eb89, 
 
457
  0x27a9ceee, 0xc961b735, 0xe51ce1ed, 0xb1477a3c, 
 
458
  0xdfd29c59, 0x73f2553f, 0xce141879, 0x37c773bf, 
 
459
  0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886, 
 
460
  0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f, 
 
461
  0xc31d1672, 0x25e2bc0c, 0x493c288b, 0x950dff41, 
 
462
  0x1a83971, 0xb30c08de, 0xe4b4d89c, 0xc1566490, 
 
463
  0x84cb7b61, 0xb632d570, 0x5c6c4874, 0x57b8d042, 
 
464
};
 
465
 
 
466
static uint32_t U2[256] = {
 
467
  0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e, 
 
468
  0xab3bcb6b, 0x9d1ff145, 0xfaacab58, 0xe34b9303, 
 
469
  0x302055fa, 0x76adf66d, 0xcc889176, 0x2f5254c, 
 
470
  0xe54ffcd7, 0x2ac5d7cb, 0x35268044, 0x62b58fa3, 
 
471
  0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0, 
 
472
  0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9, 
 
473
  0x8f03e75f, 0x9215959c, 0x6dbfeb7a, 0x5295da59, 
 
474
  0xbed42d83, 0x7458d321, 0xe0492969, 0xc98e44c8, 
 
475
  0xc2756a89, 0x8ef47879, 0x58996b3e, 0xb927dd71, 
 
476
  0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a, 
 
477
  0xdf63184a, 0x1ae58231, 0x51976033, 0x5362457f, 
 
478
  0x64b1e077, 0x6bbb84ae, 0x81fe1ca0, 0x8f9942b, 
 
479
  0x48705868, 0x458f19fd, 0xde94876c, 0x7b52b7f8, 
 
480
  0x73ab23d3, 0x4b72e202, 0x1fe3578f, 0x55662aab, 
 
481
  0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508, 
 
482
  0x2830f287, 0xbf23b2a5, 0x302ba6a, 0x16ed5c82, 
 
483
  0xcf8a2b1c, 0x79a792b4, 0x7f3f0f2, 0x694ea1e2, 
 
484
  0xda65cdf4, 0x506d5be, 0x34d11f62, 0xa6c48afe, 
 
485
  0x2e349d53, 0xf3a2a055, 0x8a0532e1, 0xf6a475eb, 
 
486
  0x830b39ec, 0x6040aaef, 0x715e069f, 0x6ebd5110, 
 
487
  0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd, 
 
488
  0x5491b58d, 0xc471055d, 0x6046fd4, 0x5060ff15, 
 
489
  0x981924fb, 0xbdd697e9, 0x4089cc43, 0xd967779e, 
 
490
  0xe8b0bd42, 0x8907888b, 0x19e7385b, 0xc879dbee, 
 
491
  0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x0, 
 
492
  0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72, 
 
493
  0xefdfbff, 0x850f5638, 0xae3d1ed5, 0x2d362739, 
 
494
  0xf0a64d9, 0x5c6821a6, 0x5b9bd154, 0x36243a2e, 
 
495
  0xa0cb167, 0x57930fe7, 0xeeb4d296, 0x9b1b9e91, 
 
496
  0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a, 
 
497
  0x93e20aba, 0xa0c0e52a, 0x223c43e0, 0x1b121d17, 
 
498
  0x90e0b0d, 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9, 
 
499
  0xf1578519, 0x75af4c07, 0x99eebbdd, 0x7fa3fd60, 
 
500
  0x1f79f26, 0x725cbcf5, 0x6644c53b, 0xfb5b347e, 
 
501
  0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1, 
 
502
  0x31d7cadc, 0x63421085, 0x97134022, 0xc6842011, 
 
503
  0x4a857d24, 0xbbd2f83d, 0xf9ae1132, 0x29c76da1, 
 
504
  0x9e1d4b2f, 0xb2dcf330, 0x860dec52, 0xc177d0e3, 
 
505
  0xb32b6c16, 0x70a999b9, 0x9411fa48, 0xe9472264, 
 
506
  0xfca8c48c, 0xf0a01a3f, 0x7d56d82c, 0x3322ef90, 
 
507
  0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b, 
 
508
  0xf5a6cf81, 0x7aa528de, 0xb7da268e, 0xad3fa4bf, 
 
509
  0x3a2ce49d, 0x78500d92, 0x5f6a9bcc, 0x7e546246, 
 
510
  0x8df6c213, 0xd890e8b8, 0x392e5ef7, 0xc382f5af, 
 
511
  0x5d9fbe80, 0xd0697c93, 0xd56fa92d, 0x25cfb312, 
 
512
  0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb, 
 
513
  0x26cd0978, 0x596ef418, 0x9aec01b7, 0x4f83a89a, 
 
514
  0x95e6656e, 0xffaa7ee6, 0xbc2108cf, 0x15efe6e8, 
 
515
  0xe7bad99b, 0x6f4ace36, 0x9fead409, 0xb029d67c, 
 
516
  0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066, 
 
517
  0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8, 
 
518
  0x4f14a98, 0xec41f7da, 0xcd7f0e50, 0x91172ff6, 
 
519
  0x4d768dd6, 0xef434db0, 0xaacc544d, 0x96e4df04, 
 
520
  0xd19ee3b5, 0x6a4c1b88, 0x2cc1b81f, 0x65467f51, 
 
521
  0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0xbfb2e41, 
 
522
  0x67b35a1d, 0xdb9252d2, 0x10e93356, 0xd66d1347, 
 
523
  0xd79a8c61, 0xa1377a0c, 0xf8598e14, 0x13eb893c, 
 
524
  0xa9ceee27, 0x61b735c9, 0x1ce1ede5, 0x477a3cb1, 
 
525
  0xd29c59df, 0xf2553f73, 0x141879ce, 0xc773bf37, 
 
526
  0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db, 
 
527
  0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40, 
 
528
  0x1d1672c3, 0xe2bc0c25, 0x3c288b49, 0xdff4195, 
 
529
  0xa8397101, 0xc08deb3, 0xb4d89ce4, 0x566490c1, 
 
530
  0xcb7b6184, 0x32d570b6, 0x6c48745c, 0xb8d04257, 
 
531
};
 
532
 
 
533
static uint32_t U3[256] = {
 
534
  0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27, 
 
535
  0x3bcb6bab, 0x1ff1459d, 0xacab58fa, 0x4b9303e3, 
 
536
  0x2055fa30, 0xadf66d76, 0x889176cc, 0xf5254c02, 
 
537
  0x4ffcd7e5, 0xc5d7cb2a, 0x26804435, 0xb58fa362, 
 
538
  0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe, 
 
539
  0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3, 
 
540
  0x3e75f8f, 0x15959c92, 0xbfeb7a6d, 0x95da5952, 
 
541
  0xd42d83be, 0x58d32174, 0x492969e0, 0x8e44c8c9, 
 
542
  0x756a89c2, 0xf478798e, 0x996b3e58, 0x27dd71b9, 
 
543
  0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace, 
 
544
  0x63184adf, 0xe582311a, 0x97603351, 0x62457f53, 
 
545
  0xb1e07764, 0xbb84ae6b, 0xfe1ca081, 0xf9942b08, 
 
546
  0x70586848, 0x8f19fd45, 0x94876cde, 0x52b7f87b, 
 
547
  0xab23d373, 0x72e2024b, 0xe3578f1f, 0x662aab55, 
 
548
  0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837, 
 
549
  0x30f28728, 0x23b2a5bf, 0x2ba6a03, 0xed5c8216, 
 
550
  0x8a2b1ccf, 0xa792b479, 0xf3f0f207, 0x4ea1e269, 
 
551
  0x65cdf4da, 0x6d5be05, 0xd11f6234, 0xc48afea6, 
 
552
  0x349d532e, 0xa2a055f3, 0x532e18a, 0xa475ebf6, 
 
553
  0xb39ec83, 0x40aaef60, 0x5e069f71, 0xbd51106e, 
 
554
  0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6, 
 
555
  0x91b58d54, 0x71055dc4, 0x46fd406, 0x60ff1550, 
 
556
  0x1924fb98, 0xd697e9bd, 0x89cc4340, 0x67779ed9, 
 
557
  0xb0bd42e8, 0x7888b89, 0xe7385b19, 0x79dbeec8, 
 
558
  0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x0, 
 
559
  0x9838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a, 
 
560
  0xfdfbff0e, 0xf563885, 0x3d1ed5ae, 0x3627392d, 
 
561
  0xa64d90f, 0x6821a65c, 0x9bd1545b, 0x243a2e36, 
 
562
  0xcb1670a, 0x930fe757, 0xb4d296ee, 0x1b9e919b, 
 
563
  0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12, 
 
564
  0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b, 
 
565
  0xe0b0d09, 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e, 
 
566
  0x578519f1, 0xaf4c0775, 0xeebbdd99, 0xa3fd607f, 
 
567
  0xf79f2601, 0x5cbcf572, 0x44c53b66, 0x5b347efb, 
 
568
  0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4, 
 
569
  0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6, 
 
570
  0x857d244a, 0xd2f83dbb, 0xae1132f9, 0xc76da129, 
 
571
  0x1d4b2f9e, 0xdcf330b2, 0xdec5286, 0x77d0e3c1, 
 
572
  0x2b6c16b3, 0xa999b970, 0x11fa4894, 0x472264e9, 
 
573
  0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033, 
 
574
  0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4, 
 
575
  0xa6cf81f5, 0xa528de7a, 0xda268eb7, 0x3fa4bfad, 
 
576
  0x2ce49d3a, 0x500d9278, 0x6a9bcc5f, 0x5462467e, 
 
577
  0xf6c2138d, 0x90e8b8d8, 0x2e5ef739, 0x82f5afc3, 
 
578
  0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225, 
 
579
  0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b, 
 
580
  0xcd097826, 0x6ef41859, 0xec01b79a, 0x83a89a4f, 
 
581
  0xe6656e95, 0xaa7ee6ff, 0x2108cfbc, 0xefe6e815, 
 
582
  0xbad99be7, 0x4ace366f, 0xead4099f, 0x29d67cb0, 
 
583
  0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2, 
 
584
  0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7, 
 
585
  0xf14a9804, 0x41f7daec, 0x7f0e50cd, 0x172ff691, 
 
586
  0x768dd64d, 0x434db0ef, 0xcc544daa, 0xe4df0496, 
 
587
  0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c, 0x467f5165, 
 
588
  0x9d04ea5e, 0x15d358c, 0xfa737487, 0xfb2e410b, 
 
589
  0xb35a1d67, 0x9252d2db, 0xe9335610, 0x6d1347d6, 
 
590
  0x9a8c61d7, 0x377a0ca1, 0x598e14f8, 0xeb893c13, 
 
591
  0xceee27a9, 0xb735c961, 0xe1ede51c, 0x7a3cb147, 
 
592
  0x9c59dfd2, 0x553f73f2, 0x1879ce14, 0x73bf37c7, 
 
593
  0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44, 
 
594
  0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3, 
 
595
  0x1672c31d, 0xbc0c25e2, 0x288b493c, 0xff41950d, 
 
596
  0x397101a8, 0x8deb30c, 0xd89ce4b4, 0x6490c156, 
 
597
  0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8, 
 
598
};
 
599
 
 
600
#else /* assume big endian */
 
601
 
 
602
static uint32_t T0[256] = {
 
603
  0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 
 
604
  0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 
 
605
  0x60303050, 0x2010103, 0xce6767a9, 0x562b2b7d, 
 
606
  0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 
 
607
  0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 
 
608
  0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 
 
609
  0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 
 
610
  0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 
 
611
  0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 
 
612
  0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 
 
613
  0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 
 
614
  0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 
 
615
  0x804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 
 
616
  0x30181828, 0x379696a1, 0xa05050f, 0x2f9a9ab5, 
 
617
  0xe070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 
 
618
  0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 
 
619
  0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 
 
620
  0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 
 
621
  0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 
 
622
  0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 
 
623
  0xa65353f5, 0xb9d1d168, 0x0, 0xc1eded2c, 
 
624
  0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 
 
625
  0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 
 
626
  0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 
 
627
  0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 
 
628
  0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 
 
629
  0x8a4545cf, 0xe9f9f910, 0x4020206, 0xfe7f7f81, 
 
630
  0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 
 
631
  0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x58f8f8a, 
 
632
  0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 
 
633
  0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 
 
634
  0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 
 
635
  0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 
 
636
  0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 
 
637
  0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 
 
638
  0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 
 
639
  0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 
 
640
  0x44222266, 0x542a2a7e, 0x3b9090ab, 0xb888883, 
 
641
  0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 
 
642
  0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 
 
643
  0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 
 
644
  0x924949db, 0xc06060a, 0x4824246c, 0xb85c5ce4, 
 
645
  0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 
 
646
  0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 
 
647
  0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 
 
648
  0x18d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 
 
649
  0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 
 
650
  0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 
 
651
  0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 
 
652
  0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 
 
653
  0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 
 
654
  0x964b4bdd, 0x61bdbddc, 0xd8b8b86, 0xf8a8a85, 
 
655
  0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 
 
656
  0x904848d8, 0x6030305, 0xf7f6f601, 0x1c0e0e12, 
 
657
  0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 
 
658
  0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 
 
659
  0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 
 
660
  0xd26969bb, 0xa9d9d970, 0x78e8e89, 0x339494a7, 
 
661
  0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 
 
662
  0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 
 
663
  0x38c8c8f, 0x59a1a1f8, 0x9898980, 0x1a0d0d17, 
 
664
  0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 
 
665
  0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 
 
666
  0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, 
 
667
};
 
668
 
 
669
static uint32_t T1[256] = {
 
670
  0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 
 
671
  0xdfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 
 
672
  0x50603030, 0x3020101, 0xa9ce6767, 0x7d562b2b, 
 
673
  0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 
 
674
  0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 
 
675
  0x15effafa, 0xebb25959, 0xc98e4747, 0xbfbf0f0, 
 
676
  0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 
 
677
  0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 
 
678
  0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 
 
679
  0x5a6c3636, 0x417e3f3f, 0x2f5f7f7, 0x4f83cccc, 
 
680
  0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x8f9f1f1, 
 
681
  0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 
 
682
  0xc080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 
 
683
  0x28301818, 0xa1379696, 0xf0a0505, 0xb52f9a9a, 
 
684
  0x90e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 
 
685
  0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 
 
686
  0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 
 
687
  0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 
 
688
  0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 
 
689
  0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 
 
690
  0xf5a65353, 0x68b9d1d1, 0x0, 0x2cc1eded, 
 
691
  0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 
 
692
  0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 
 
693
  0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 
 
694
  0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 
 
695
  0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 
 
696
  0xcf8a4545, 0x10e9f9f9, 0x6040202, 0x81fe7f7f, 
 
697
  0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 
 
698
  0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 
 
699
  0xad3f9292, 0xbc219d9d, 0x48703838, 0x4f1f5f5, 
 
700
  0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 
 
701
  0x30201010, 0x1ae5ffff, 0xefdf3f3, 0x6dbfd2d2, 
 
702
  0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 
 
703
  0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 
 
704
  0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 
 
705
  0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 
 
706
  0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 
 
707
  0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 
 
708
  0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 
 
709
  0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 
 
710
  0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 
 
711
  0xdb924949, 0xa0c0606, 0x6c482424, 0xe4b85c5c, 
 
712
  0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 
 
713
  0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 
 
714
  0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 
 
715
  0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 
 
716
  0xb4d86c6c, 0xfaac5656, 0x7f3f4f4, 0x25cfeaea, 
 
717
  0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 
 
718
  0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 
 
719
  0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 
 
720
  0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 
 
721
  0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 
 
722
  0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 
 
723
  0xd8904848, 0x5060303, 0x1f7f6f6, 0x121c0e0e, 
 
724
  0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 
 
725
  0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 
 
726
  0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 
 
727
  0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 
 
728
  0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 
 
729
  0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 
 
730
  0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 
 
731
  0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 
 
732
  0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 
 
733
  0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, 
 
734
};
 
735
 
 
736
static uint32_t T2[256] = {
 
737
  0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 
 
738
  0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 
 
739
  0x30506030, 0x1030201, 0x67a9ce67, 0x2b7d562b, 
 
740
  0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 
 
741
  0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 
 
742
  0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 
 
743
  0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 
 
744
  0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 
 
745
  0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 
 
746
  0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 
 
747
  0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 
 
748
  0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 
 
749
  0x40c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 
 
750
  0x18283018, 0x96a13796, 0x50f0a05, 0x9ab52f9a, 
 
751
  0x7090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 
 
752
  0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 
 
753
  0x91b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 
 
754
  0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 
 
755
  0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 
 
756
  0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 
 
757
  0x53f5a653, 0xd168b9d1, 0x0, 0xed2cc1ed, 
 
758
  0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 
 
759
  0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 
 
760
  0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 
 
761
  0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 
 
762
  0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 
 
763
  0x45cf8a45, 0xf910e9f9, 0x2060402, 0x7f81fe7f, 
 
764
  0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 
 
765
  0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 
 
766
  0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 
 
767
  0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 
 
768
  0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 
 
769
  0xcd4c81cd, 0xc14180c, 0x13352613, 0xec2fc3ec, 
 
770
  0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 
 
771
  0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 
 
772
  0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 
 
773
  0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 
 
774
  0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 
 
775
  0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 
 
776
  0xde79a7de, 0x5ee2bc5e, 0xb1d160b, 0xdb76addb, 
 
777
  0xe03bdbe0, 0x32566432, 0x3a4e743a, 0xa1e140a, 
 
778
  0x49db9249, 0x60a0c06, 0x246c4824, 0x5ce4b85c, 
 
779
  0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 
 
780
  0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 
 
781
  0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 
 
782
  0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 
 
783
  0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 
 
784
  0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x8181008, 
 
785
  0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 
 
786
  0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 
 
787
  0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 
 
788
  0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 
 
789
  0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 
 
790
  0x48d89048, 0x3050603, 0xf601f7f6, 0xe121c0e, 
 
791
  0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 
 
792
  0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 
 
793
  0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 
 
794
  0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 
 
795
  0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 
 
796
  0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 
 
797
  0x8c8f038c, 0xa1f859a1, 0x89800989, 0xd171a0d, 
 
798
  0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 
 
799
  0x41c38241, 0x99b02999, 0x2d775a2d, 0xf111e0f, 
 
800
  0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, 
 
801
};
 
802
 
 
803
static uint32_t T3[256] = {
 
804
  0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 
 
805
  0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 
 
806
  0x30305060, 0x1010302, 0x6767a9ce, 0x2b2b7d56, 
 
807
  0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 
 
808
  0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 
 
809
  0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 
 
810
  0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 
 
811
  0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 
 
812
  0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 
 
813
  0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 
 
814
  0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 
 
815
  0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 
 
816
  0x4040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 
 
817
  0x18182830, 0x9696a137, 0x5050f0a, 0x9a9ab52f, 
 
818
  0x707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 
 
819
  0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 
 
820
  0x9091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 
 
821
  0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 
 
822
  0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 
 
823
  0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 
 
824
  0x5353f5a6, 0xd1d168b9, 0x0, 0xeded2cc1, 
 
825
  0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 
 
826
  0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 
 
827
  0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 
 
828
  0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 
 
829
  0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 
 
830
  0x4545cf8a, 0xf9f910e9, 0x2020604, 0x7f7f81fe, 
 
831
  0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 
 
832
  0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 
 
833
  0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 
 
834
  0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 
 
835
  0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 
 
836
  0xcdcd4c81, 0xc0c1418, 0x13133526, 0xecec2fc3, 
 
837
  0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 
 
838
  0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 
 
839
  0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 
 
840
  0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 
 
841
  0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 
 
842
  0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 
 
843
  0xdede79a7, 0x5e5ee2bc, 0xb0b1d16, 0xdbdb76ad, 
 
844
  0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0xa0a1e14, 
 
845
  0x4949db92, 0x6060a0c, 0x24246c48, 0x5c5ce4b8, 
 
846
  0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 
 
847
  0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 
 
848
  0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 
 
849
  0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 
 
850
  0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 
 
851
  0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x8081810, 
 
852
  0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 
 
853
  0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 
 
854
  0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 
 
855
  0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 
 
856
  0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 
 
857
  0x4848d890, 0x3030506, 0xf6f601f7, 0xe0e121c, 
 
858
  0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 
 
859
  0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 
 
860
  0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 
 
861
  0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 
 
862
  0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 
 
863
  0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 
 
864
  0x8c8c8f03, 0xa1a1f859, 0x89898009, 0xd0d171a, 
 
865
  0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 
 
866
  0x4141c382, 0x9999b029, 0x2d2d775a, 0xf0f111e, 
 
867
  0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, 
 
868
};
 
869
 
 
870
static uint32_t U0[256] = {
 
871
  0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 
 
872
  0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 
 
873
  0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 
 
874
  0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 
 
875
  0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 
 
876
  0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 
 
877
  0x38f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 
 
878
  0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 
 
879
  0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 
 
880
  0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 
 
881
  0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 
 
882
  0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 
 
883
  0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 
 
884
  0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 
 
885
  0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 
 
886
  0x302887f2, 0x23bfa5b2, 0x2036aba, 0xed16825c, 
 
887
  0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 
 
888
  0x65daf4cd, 0x605bed5, 0xd134621f, 0xc4a6fe8a, 
 
889
  0x342e539d, 0xa2f355a0, 0x58ae132, 0xa4f6eb75, 
 
890
  0xb83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 
 
891
  0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 
 
892
  0x91548db5, 0x71c45d05, 0x406d46f, 0x605015ff, 
 
893
  0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 
 
894
  0xb0e842bd, 0x7898b88, 0xe7195b38, 0x79c8eedb, 
 
895
  0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x0, 
 
896
  0x9808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 
 
897
  0xfd0efffb, 0xf853856, 0x3daed51e, 0x362d3927, 
 
898
  0xa0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 
 
899
  0xc0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 
 
900
  0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 
 
901
  0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 
 
902
  0xe090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 
 
903
  0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 
 
904
  0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 
 
905
  0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 
 
906
  0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 
 
907
  0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 
 
908
  0x1d9e2f4b, 0xdcb230f3, 0xd8652ec, 0x77c1e3d0, 
 
909
  0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 
 
910
  0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 
 
911
  0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 
 
912
  0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 
 
913
  0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 
 
914
  0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 
 
915
  0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 
 
916
  0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 
 
917
  0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 
 
918
  0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 
 
919
  0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 
 
920
  0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 
 
921
  0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 
 
922
  0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 
 
923
  0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 
 
924
  0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 
 
925
  0x9d5eea04, 0x18c355d, 0xfa877473, 0xfb0b412e, 
 
926
  0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 
 
927
  0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 
 
928
  0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 
 
929
  0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 
 
930
  0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 
 
931
  0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 
 
932
  0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 
 
933
  0x39a80171, 0x80cb3de, 0xd8b4e49c, 0x6456c190, 
 
934
  0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
 
935
};
 
936
 
 
937
static uint32_t U1[256] = {
 
938
  0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 
 
939
  0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 
 
940
  0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 
 
941
  0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 
 
942
  0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 
 
943
  0x2c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 
 
944
  0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 
 
945
  0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 
 
946
  0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 
 
947
  0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 
 
948
  0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 
 
949
  0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 
 
950
  0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 
 
951
  0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 
 
952
  0x7b2eb28, 0x32fb5c2, 0x9a86c57b, 0xa5d33708, 
 
953
  0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 
 
954
  0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 
 
955
  0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 
 
956
  0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 
 
957
  0x390b83ec, 0xaa4060ef, 0x65e719f, 0x51bd6e10, 
 
958
  0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 
 
959
  0xb591548d, 0x571c45d, 0x6f0406d4, 0xff605015, 
 
960
  0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 
 
961
  0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 
 
962
  0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x0, 
 
963
  0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 
 
964
  0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 
 
965
  0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 
 
966
  0xb10c0a67, 0xf9357e7, 0xd2b4ee96, 0x9e1b9b91, 
 
967
  0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 
 
968
  0xae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 
 
969
  0xb0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 
 
970
  0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 
 
971
  0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 
 
972
  0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 
 
973
  0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 
 
974
  0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 
 
975
  0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 
 
976
  0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 
 
977
  0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 
 
978
  0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 
 
979
  0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 
 
980
  0xe42c3a9d, 0xd507892, 0x9b6a5fcc, 0x62547e46, 
 
981
  0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 
 
982
  0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 
 
983
  0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 
 
984
  0x9cd2678, 0xf46e5918, 0x1ec9ab7, 0xa8834f9a, 
 
985
  0x65e6956e, 0x7eaaffe6, 0x821bccf, 0xe6ef15e8, 
 
986
  0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 
 
987
  0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 
 
988
  0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 
 
989
  0x4af10498, 0xf741ecda, 0xe7fcd50, 0x2f1791f6, 
 
990
  0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 
 
991
  0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 
 
992
  0x49d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 
 
993
  0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 
 
994
  0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 
 
995
  0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 
 
996
  0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 
 
997
  0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 
 
998
  0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 
 
999
  0x72161dc3, 0xcbce225, 0x8b283c49, 0x41ff0d95, 
 
1000
  0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 
 
1001
  0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857
 
1002
};
 
1003
 
 
1004
static uint32_t U2[256] = {
 
1005
  0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 
 
1006
  0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x3934be3, 
 
1007
  0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 
 
1008
  0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 
 
1009
  0x5a49deb1, 0x1b6725ba, 0xe9845ea, 0xc0e15dfe, 
 
1010
  0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 
 
1011
  0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 
 
1012
  0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 
 
1013
  0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 
 
1014
  0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 
 
1015
  0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 
 
1016
  0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 
 
1017
  0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 
 
1018
  0xd323ab73, 0x2e2724b, 0x8f57e31f, 0xab2a6655, 
 
1019
  0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x8a5d337, 
 
1020
  0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 
 
1021
  0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 
 
1022
  0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 
 
1023
  0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 
 
1024
  0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 
 
1025
  0x8af93e21, 0x63d96dd, 0x5aedd3e, 0xbd464de6, 
 
1026
  0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 
 
1027
  0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 
 
1028
  0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 
 
1029
  0xa47a17c, 0xfe97c42, 0x1ec9f884, 0x0, 
 
1030
  0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 
 
1031
  0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 
 
1032
  0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 
 
1033
  0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 
 
1034
  0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 
 
1035
  0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 
 
1036
  0xd0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 
 
1037
  0x198557f1, 0x74caf75, 0xddbbee99, 0x60fda37f, 
 
1038
  0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 
 
1039
  0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 
 
1040
  0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 
 
1041
  0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 
 
1042
  0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 
 
1043
  0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 
 
1044
  0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 
 
1045
  0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0xb3698d4, 
 
1046
  0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 
 
1047
  0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 
 
1048
  0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 
 
1049
  0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 
 
1050
  0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 
 
1051
  0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 
 
1052
  0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 
 
1053
  0x9bd9bae7, 0x36ce4a6f, 0x9d4ea9f, 0x7cd629b0, 
 
1054
  0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 
 
1055
  0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 
 
1056
  0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 
 
1057
  0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x4dfe496, 
 
1058
  0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 
 
1059
  0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 
 
1060
  0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 
 
1061
  0x618c9ad7, 0xc7a37a1, 0x148e59f8, 0x3c89eb13, 
 
1062
  0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 
 
1063
  0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 
 
1064
  0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 
 
1065
  0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 
 
1066
  0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 
 
1067
  0x17139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 
 
1068
  0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8 
 
1069
};
 
1070
 
 
1071
static uint32_t U3[256] = {
 
1072
  0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 
 
1073
  0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 
 
1074
  0x30fa5520, 0x766df6ad, 0xcc769188, 0x24c25f5, 
 
1075
  0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 
 
1076
  0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 
 
1077
  0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 
 
1078
  0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 
 
1079
  0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 
 
1080
  0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 
 
1081
  0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 
 
1082
  0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 
 
1083
  0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x82b94f9, 
 
1084
  0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 
 
1085
  0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 
 
1086
  0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 
 
1087
  0x2887f230, 0xbfa5b223, 0x36aba02, 0x16825ced, 
 
1088
  0xcf1c2b8a, 0x79b492a7, 0x7f2f0f3, 0x69e2a14e, 
 
1089
  0xdaf4cd65, 0x5bed506, 0x34621fd1, 0xa6fe8ac4, 
 
1090
  0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 
 
1091
  0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 
 
1092
  0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 
 
1093
  0x548db591, 0xc45d0571, 0x6d46f04, 0x5015ff60, 
 
1094
  0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 
 
1095
  0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 
 
1096
  0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x0, 
 
1097
  0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 
 
1098
  0xefffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 
 
1099
  0xfd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 
 
1100
  0xa67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 
 
1101
  0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 
 
1102
  0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 
 
1103
  0x90d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 
 
1104
  0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 
 
1105
  0x1269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 
 
1106
  0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 
 
1107
  0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 
 
1108
  0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 
 
1109
  0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 
 
1110
  0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 
 
1111
  0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 
 
1112
  0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 
 
1113
  0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 
 
1114
  0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 
 
1115
  0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 
 
1116
  0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 
 
1117
  0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 
 
1118
  0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 
 
1119
  0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 
 
1120
  0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 
 
1121
  0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 
 
1122
  0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 
 
1123
  0x4984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 
 
1124
  0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 
 
1125
  0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 
 
1126
  0x5eea049d, 0x8c355d01, 0x877473fa, 0xb412efb, 
 
1127
  0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 
 
1128
  0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 
 
1129
  0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 
 
1130
  0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 
 
1131
  0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 
 
1132
  0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 
 
1133
  0x1dc37216, 0xe2250cbc, 0x3c498b28, 0xd9541ff, 
 
1134
  0xa8017139, 0xcb3de08, 0xb4e49cd8, 0x56c19064, 
 
1135
  0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0 
 
1136
};
 
1137
 
 
1138
#endif
 
1139
 
 
1140
/* 
 
1141
 * the following tables (aes_sbox, aes_inv_sbox, T4, U4) are
 
1142
 * endian-neutral 
 
1143
 */
 
1144
 
 
1145
static uint8_t
 
1146
aes_sbox[256] = {
 
1147
  0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 
 
1148
  0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 
 
1149
  0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 
 
1150
  0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 
 
1151
  0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 
 
1152
  0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 
 
1153
  0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 
 
1154
  0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 
 
1155
  0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 
 
1156
  0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 
 
1157
  0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 
 
1158
  0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 
 
1159
  0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 
 
1160
  0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 
 
1161
  0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 
 
1162
  0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 
 
1163
  0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 
 
1164
  0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 
 
1165
  0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 
 
1166
  0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 
 
1167
  0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 
 
1168
  0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 
 
1169
  0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 
 
1170
  0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 
 
1171
  0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 
 
1172
  0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 
 
1173
  0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 
 
1174
  0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 
 
1175
  0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 
 
1176
  0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 
 
1177
  0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 
 
1178
  0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 
 
1179
};
 
1180
 
 
1181
#ifndef CPU_RISC
 
1182
static uint8_t
 
1183
aes_inv_sbox[256] = {
 
1184
  0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 
 
1185
  0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
 
1186
  0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
 
1187
  0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
 
1188
  0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 
 
1189
  0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
 
1190
  0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
 
1191
  0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
 
1192
  0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 
 
1193
  0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
 
1194
  0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 
 
1195
  0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
 
1196
  0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 
 
1197
  0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
 
1198
  0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 
 
1199
  0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
 
1200
  0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 
 
1201
  0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
 
1202
  0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 
 
1203
  0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
 
1204
  0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 
 
1205
  0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
 
1206
  0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 
 
1207
  0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
 
1208
  0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 
 
1209
  0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
 
1210
  0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 
 
1211
  0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
 
1212
  0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 
 
1213
  0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
 
1214
  0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 
 
1215
  0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
 
1216
};
 
1217
#endif /* ! CPU_RISC */
 
1218
 
 
1219
#ifdef CPU_RISC
 
1220
static uint32_t
 
1221
T4[256] = { 
 
1222
  0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
 
1223
  0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, 
 
1224
  0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, 
 
1225
  0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, 
 
1226
  0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, 
 
1227
  0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
 
1228
  0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
 
1229
  0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
 
1230
  0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
 
1231
  0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
 
1232
  0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
 
1233
  0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
 
1234
  0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
 
1235
  0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
 
1236
  0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
 
1237
  0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
 
1238
  0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, 
 
1239
  0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
 
1240
  0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
 
1241
  0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
 
1242
  0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
 
1243
  0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
 
1244
  0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
 
1245
  0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
 
1246
  0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
 
1247
  0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
 
1248
  0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
 
1249
  0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
 
1250
  0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
 
1251
  0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
 
1252
  0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
 
1253
  0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
 
1254
  0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
 
1255
  0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
 
1256
  0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
 
1257
  0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
 
1258
  0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
 
1259
  0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
 
1260
  0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, 
 
1261
  0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, 
 
1262
  0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
 
1263
  0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
 
1264
  0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, 
 
1265
  0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
 
1266
  0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
 
1267
  0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, 
 
1268
  0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
 
1269
  0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, 
 
1270
  0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
 
1271
  0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
 
1272
  0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
 
1273
  0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
 
1274
  0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
 
1275
  0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
 
1276
  0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
 
1277
  0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
 
1278
  0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, 
 
1279
  0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
 
1280
  0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
 
1281
  0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
 
1282
  0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
 
1283
  0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
 
1284
  0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
 
1285
  0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616
 
1286
};
 
1287
 
 
1288
static uint32_t U4[256] = {
 
1289
  0x52525252, 0x9090909, 0x6a6a6a6a, 0xd5d5d5d5, 
 
1290
  0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, 
 
1291
  0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, 
 
1292
  0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, 
 
1293
  0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, 
 
1294
  0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, 
 
1295
  0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, 
 
1296
  0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, 
 
1297
  0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, 
 
1298
  0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, 
 
1299
  0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0xb0b0b0b, 
 
1300
  0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, 
 
1301
  0x8080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, 
 
1302
  0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, 
 
1303
  0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, 
 
1304
  0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, 
 
1305
  0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, 
 
1306
  0x86868686, 0x68686868, 0x98989898, 0x16161616, 
 
1307
  0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, 
 
1308
  0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, 
 
1309
  0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, 
 
1310
  0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, 
 
1311
  0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, 
 
1312
  0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, 
 
1313
  0x90909090, 0xd8d8d8d8, 0xabababab, 0x0, 
 
1314
  0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0xa0a0a0a, 
 
1315
  0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x5050505, 
 
1316
  0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x6060606, 
 
1317
  0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, 
 
1318
  0xcacacaca, 0x3f3f3f3f, 0xf0f0f0f, 0x2020202, 
 
1319
  0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x3030303, 
 
1320
  0x1010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, 
 
1321
  0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, 
 
1322
  0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, 
 
1323
  0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, 
 
1324
  0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, 
 
1325
  0x96969696, 0xacacacac, 0x74747474, 0x22222222, 
 
1326
  0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, 
 
1327
  0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, 
 
1328
  0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, 
 
1329
  0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, 
 
1330
  0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, 
 
1331
  0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0xe0e0e0e, 
 
1332
  0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, 
 
1333
  0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, 
 
1334
  0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, 
 
1335
  0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, 
 
1336
  0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, 
 
1337
  0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, 
 
1338
  0x88888888, 0x7070707, 0xc7c7c7c7, 0x31313131, 
 
1339
  0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, 
 
1340
  0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, 
 
1341
  0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, 
 
1342
  0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0xd0d0d0d, 
 
1343
  0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, 
 
1344
  0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, 
 
1345
  0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, 
 
1346
  0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, 
 
1347
  0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, 
 
1348
  0x83838383, 0x53535353, 0x99999999, 0x61616161, 
 
1349
  0x17171717, 0x2b2b2b2b, 0x4040404, 0x7e7e7e7e, 
 
1350
  0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, 
 
1351
  0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, 
 
1352
  0x55555555, 0x21212121, 0xc0c0c0c, 0x7d7d7d7d
 
1353
};
 
1354
#endif /* CPU_RISC */
 
1355
 
 
1356
 
 
1357
/* aes internals */
 
1358
 
 
1359
extern debug_module_t mod_aes_icm;
 
1360
 
 
1361
void
 
1362
aes_expand_encryption_key(const v128_t *key, 
 
1363
                          aes_expanded_key_t expanded_key) {
 
1364
  int i;
 
1365
  gf2_8 rc;
 
1366
 
 
1367
  /* initialize round constant */
 
1368
  rc = 1;
 
1369
 
 
1370
  expanded_key[0].v32[0] = key->v32[0];
 
1371
  expanded_key[0].v32[1] = key->v32[1];
 
1372
  expanded_key[0].v32[2] = key->v32[2];
 
1373
  expanded_key[0].v32[3] = key->v32[3];
 
1374
 
 
1375
#if 0
 
1376
  debug_print(mod_aes_icm, 
 
1377
              "expanded key[0]:  %s", v128_hex_string(&expanded_key[0])); 
 
1378
#endif
 
1379
 
 
1380
  /* loop over round keys */
 
1381
  for (i=1; i < 11; i++) {
 
1382
 
 
1383
    /* munge first word of round key */
 
1384
    expanded_key[i].v8[0] = aes_sbox[expanded_key[i-1].v8[13]] ^ rc;
 
1385
    expanded_key[i].v8[1] = aes_sbox[expanded_key[i-1].v8[14]];
 
1386
    expanded_key[i].v8[2] = aes_sbox[expanded_key[i-1].v8[15]];
 
1387
    expanded_key[i].v8[3] = aes_sbox[expanded_key[i-1].v8[12]];
 
1388
 
 
1389
    expanded_key[i].v32[0] ^=  expanded_key[i-1].v32[0];
 
1390
 
 
1391
    /* set remaining 32 bit words to the exor of the one previous with
 
1392
     * the one four words previous */
 
1393
 
 
1394
    expanded_key[i].v32[1] =
 
1395
      expanded_key[i].v32[0] ^ expanded_key[i-1].v32[1];
 
1396
 
 
1397
    expanded_key[i].v32[2] =
 
1398
      expanded_key[i].v32[1] ^ expanded_key[i-1].v32[2];
 
1399
 
 
1400
    expanded_key[i].v32[3] =
 
1401
      expanded_key[i].v32[2] ^ expanded_key[i-1].v32[3];
 
1402
 
 
1403
#if 0
 
1404
        debug_print2(mod_aes_icm, 
 
1405
                                "expanded key[%d]:  %s", i,v128_hex_string(&expanded_key[i])); 
 
1406
#endif
 
1407
 
 
1408
    /* modify round constant */
 
1409
    rc = gf2_8_shift(rc);
 
1410
 
 
1411
  }
 
1412
}
 
1413
 
 
1414
void
 
1415
aes_expand_decryption_key(const v128_t *key, 
 
1416
                          aes_expanded_key_t expanded_key) {
 
1417
  int i;
 
1418
 
 
1419
  aes_expand_encryption_key(key, expanded_key);
 
1420
 
 
1421
  /* invert the order of the round keys */
 
1422
  for (i=0; i < 5; i++) {
 
1423
    v128_t tmp;
 
1424
    v128_copy(&tmp, &expanded_key[10-i]);
 
1425
    v128_copy(&expanded_key[10-i], &expanded_key[i]);
 
1426
    v128_copy(&expanded_key[i], &tmp);
 
1427
  }
 
1428
 
 
1429
  /* 
 
1430
   * apply the inverse mixColumn transform to the round keys (except
 
1431
   * for the first and the last)  
 
1432
   *
 
1433
   * mixColumn is implemented by using the tables U0, U1, U2, U3,
 
1434
   * followed by the T4 table (which cancels out the use of the sbox
 
1435
   * in the U-tables)
 
1436
   */
 
1437
  for (i=1; i < 10; i++) {
 
1438
#ifdef CPU_RISC
 
1439
    uint32_t tmp;
 
1440
 
 
1441
    tmp = expanded_key[i].v32[0];
 
1442
    expanded_key[i].v32[0] = 
 
1443
      U0[T4[(tmp >> 24)       ] & 0xff] ^ 
 
1444
      U1[T4[(tmp >> 16) & 0xff] & 0xff] ^ 
 
1445
      U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^ 
 
1446
      U3[T4[(tmp)       & 0xff] & 0xff];
 
1447
 
 
1448
    tmp = expanded_key[i].v32[1];
 
1449
    expanded_key[i].v32[1] = 
 
1450
      U0[T4[(tmp >> 24)       ] & 0xff] ^ 
 
1451
      U1[T4[(tmp >> 16) & 0xff] & 0xff] ^ 
 
1452
      U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^ 
 
1453
      U3[T4[(tmp)       & 0xff] & 0xff];
 
1454
 
 
1455
    tmp = expanded_key[i].v32[2];
 
1456
    expanded_key[i].v32[2] = 
 
1457
      U0[T4[(tmp >> 24)       ] & 0xff] ^ 
 
1458
      U1[T4[(tmp >> 16) & 0xff] & 0xff] ^ 
 
1459
      U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^ 
 
1460
      U3[T4[(tmp)       & 0xff] & 0xff];
 
1461
 
 
1462
    tmp = expanded_key[i].v32[3];
 
1463
    expanded_key[i].v32[3] = 
 
1464
      U0[T4[(tmp >> 24)       ] & 0xff] ^ 
 
1465
      U1[T4[(tmp >> 16) & 0xff] & 0xff] ^ 
 
1466
      U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^ 
 
1467
      U3[T4[(tmp)       & 0xff] & 0xff];
 
1468
#else /* assume CPU_CISC */
 
1469
 
 
1470
    uint32_t c0, c1, c2, c3;
 
1471
 
 
1472
    c0 = U0[aes_sbox[expanded_key[i].v8[0]]] 
 
1473
       ^ U1[aes_sbox[expanded_key[i].v8[1]]] 
 
1474
       ^ U2[aes_sbox[expanded_key[i].v8[2]]] 
 
1475
       ^ U3[aes_sbox[expanded_key[i].v8[3]]];
 
1476
 
 
1477
    c1 = U0[aes_sbox[expanded_key[i].v8[4]]] 
 
1478
       ^ U1[aes_sbox[expanded_key[i].v8[5]]] 
 
1479
       ^ U2[aes_sbox[expanded_key[i].v8[6]]] 
 
1480
       ^ U3[aes_sbox[expanded_key[i].v8[7]]];
 
1481
 
 
1482
    c2 = U0[aes_sbox[expanded_key[i].v8[8]]] 
 
1483
       ^ U1[aes_sbox[expanded_key[i].v8[9]]] 
 
1484
       ^ U2[aes_sbox[expanded_key[i].v8[10]]] 
 
1485
       ^ U3[aes_sbox[expanded_key[i].v8[11]]];
 
1486
 
 
1487
    c3 = U0[aes_sbox[expanded_key[i].v8[12]]] 
 
1488
       ^ U1[aes_sbox[expanded_key[i].v8[13]]] 
 
1489
       ^ U2[aes_sbox[expanded_key[i].v8[14]]] 
 
1490
       ^ U3[aes_sbox[expanded_key[i].v8[15]]];
 
1491
 
 
1492
    expanded_key[i].v32[0] = c0;
 
1493
    expanded_key[i].v32[1] = c1;
 
1494
    expanded_key[i].v32[2] = c2;
 
1495
    expanded_key[i].v32[3] = c3;
 
1496
 
 
1497
#endif     
 
1498
  }
 
1499
}
 
1500
 
 
1501
#ifdef CPU_CISC
 
1502
 
 
1503
 
 
1504
static inline void
 
1505
aes_round(v128_t *state, const v128_t *round_key) {
 
1506
  uint32_t column0, column1, column2, column3;
 
1507
 
 
1508
  /* compute the columns of the output square in terms of the octets
 
1509
     of state, using the tables T0, T1, T2, T3 */
 
1510
 
 
1511
  column0 = T0[state->v8[0]] ^ T1[state->v8[5]]
 
1512
    ^ T2[state->v8[10]] ^ T3[state->v8[15]];
 
1513
 
 
1514
  column1 = T0[state->v8[4]] ^ T1[state->v8[9]]
 
1515
    ^ T2[state->v8[14]] ^ T3[state->v8[3]];
 
1516
 
 
1517
  column2 = T0[state->v8[8]] ^ T1[state->v8[13]]
 
1518
    ^ T2[state->v8[2]] ^ T3[state->v8[7]];
 
1519
 
 
1520
  column3 = T0[state->v8[12]] ^ T1[state->v8[1]]
 
1521
    ^ T2[state->v8[6]] ^ T3[state->v8[11]];
 
1522
 
 
1523
  state->v32[0] = column0 ^ round_key->v32[0];
 
1524
  state->v32[1] = column1 ^ round_key->v32[1];
 
1525
  state->v32[2] = column2 ^ round_key->v32[2];
 
1526
  state->v32[3] = column3 ^ round_key->v32[3];
 
1527
 
 
1528
}
 
1529
 
 
1530
 
 
1531
static inline void
 
1532
aes_inv_round(v128_t *state, const v128_t *round_key) {
 
1533
  uint32_t column0, column1, column2, column3;
 
1534
 
 
1535
  /* compute the columns of the output square in terms of the octets
 
1536
     of state, using the tables U0, U1, U2, U3 */
 
1537
 
 
1538
  column0 = U0[state->v8[0]] ^ U1[state->v8[13]]
 
1539
    ^ U2[state->v8[10]] ^ U3[state->v8[7]];
 
1540
 
 
1541
  column1 = U0[state->v8[4]] ^ U1[state->v8[1]]
 
1542
    ^ U2[state->v8[14]] ^ U3[state->v8[11]];
 
1543
 
 
1544
  column2 = U0[state->v8[8]] ^ U1[state->v8[5]]
 
1545
    ^ U2[state->v8[2]] ^ U3[state->v8[15]];
 
1546
 
 
1547
  column3 = U0[state->v8[12]] ^ U1[state->v8[9]]
 
1548
    ^ U2[state->v8[6]] ^ U3[state->v8[3]];
 
1549
 
 
1550
  state->v32[0] = column0 ^ round_key->v32[0];
 
1551
  state->v32[1] = column1 ^ round_key->v32[1];
 
1552
  state->v32[2] = column2 ^ round_key->v32[2];
 
1553
  state->v32[3] = column3 ^ round_key->v32[3];
 
1554
 
 
1555
}
 
1556
 
 
1557
static inline void
 
1558
aes_final_round(v128_t *state, const v128_t *round_key) {
 
1559
  uint8_t tmp;
 
1560
 
 
1561
  /* byte substitutions and row shifts */
 
1562
  /* first row - no shift */
 
1563
  state->v8[0] = aes_sbox[state->v8[0]];
 
1564
  state->v8[4] = aes_sbox[state->v8[4]];
 
1565
  state->v8[8] = aes_sbox[state->v8[8]];
 
1566
  state->v8[12] = aes_sbox[state->v8[12]];
 
1567
 
 
1568
  /* second row - shift one left */
 
1569
  tmp = aes_sbox[state->v8[1]];
 
1570
  state->v8[1] = aes_sbox[state->v8[5]];
 
1571
  state->v8[5] = aes_sbox[state->v8[9]];
 
1572
  state->v8[9] = aes_sbox[state->v8[13]];
 
1573
  state->v8[13] = tmp;
 
1574
 
 
1575
  /* third row - shift two left */
 
1576
  tmp = aes_sbox[state->v8[10]];
 
1577
  state->v8[10] = aes_sbox[state->v8[2]];
 
1578
  state->v8[2] = tmp;
 
1579
  tmp = aes_sbox[state->v8[14]];
 
1580
  state->v8[14] = aes_sbox[state->v8[6]];
 
1581
  state->v8[6] = tmp; 
 
1582
 
 
1583
  /* fourth row - shift three left */
 
1584
  tmp = aes_sbox[state->v8[15]];
 
1585
  state->v8[15] = aes_sbox[state->v8[11]];
 
1586
  state->v8[11] = aes_sbox[state->v8[7]];
 
1587
  state->v8[7] = aes_sbox[state->v8[3]];
 
1588
  state->v8[3] = tmp;
 
1589
 
 
1590
  v128_xor_eq(state, round_key);
 
1591
}
 
1592
 
 
1593
static inline void
 
1594
aes_inv_final_round(v128_t *state, const v128_t *round_key) {
 
1595
  uint8_t tmp;
 
1596
 
 
1597
  /* byte substitutions and row shifts */
 
1598
  /* first row - no shift */
 
1599
  state->v8[0] = aes_inv_sbox[state->v8[0]];
 
1600
  state->v8[4] = aes_inv_sbox[state->v8[4]];
 
1601
  state->v8[8] = aes_inv_sbox[state->v8[8]];
 
1602
  state->v8[12] = aes_inv_sbox[state->v8[12]];
 
1603
 
 
1604
  /* second row - shift one right */
 
1605
  tmp = aes_inv_sbox[state->v8[13]];
 
1606
  state->v8[13] = aes_inv_sbox[state->v8[9]];
 
1607
  state->v8[9] = aes_inv_sbox[state->v8[5]];
 
1608
  state->v8[5] = aes_inv_sbox[state->v8[1]];
 
1609
  state->v8[1] = tmp;
 
1610
 
 
1611
  /* third row - shift two right */
 
1612
  tmp = aes_inv_sbox[state->v8[2]];
 
1613
  state->v8[2] = aes_inv_sbox[state->v8[10]];
 
1614
  state->v8[10] = tmp;
 
1615
  tmp = aes_inv_sbox[state->v8[6]];
 
1616
  state->v8[6] = aes_inv_sbox[state->v8[14]];
 
1617
  state->v8[14] = tmp; 
 
1618
 
 
1619
  /* fourth row - shift three right */
 
1620
  tmp = aes_inv_sbox[state->v8[3]];
 
1621
  state->v8[3] = aes_inv_sbox[state->v8[7]];
 
1622
  state->v8[7] = aes_inv_sbox[state->v8[11]];
 
1623
  state->v8[11] = aes_inv_sbox[state->v8[15]];
 
1624
  state->v8[15] = tmp;
 
1625
 
 
1626
  v128_xor_eq(state, round_key);
 
1627
}
 
1628
 
 
1629
 
 
1630
#elif CPU_RISC
 
1631
 
 
1632
static inline void
 
1633
aes_round(v128_t *state, const v128_t *round_key) {
 
1634
  uint32_t column0, column1, column2, column3;
 
1635
 
 
1636
  /* compute the columns of the output square in terms of the octets
 
1637
     of state, using the tables T0, T1, T2, T3 */
 
1638
#ifdef WORDS_BIGENDIAN
 
1639
  column0 = T0[state->v32[0] >> 24] ^ T1[(state->v32[1] >> 16) & 0xff]
 
1640
    ^ T2[(state->v32[2] >> 8) & 0xff] ^ T3[state->v32[3] & 0xff];
 
1641
 
 
1642
  column1 = T0[state->v32[1] >> 24] ^ T1[(state->v32[2] >> 16) & 0xff]
 
1643
    ^ T2[(state->v32[3] >> 8) & 0xff] ^ T3[state->v32[0] & 0xff];
 
1644
 
 
1645
  column2 = T0[state->v32[2] >> 24] ^ T1[(state->v32[3] >> 16) & 0xff]
 
1646
    ^ T2[(state->v32[0] >> 8) & 0xff] ^ T3[state->v32[1] & 0xff];
 
1647
 
 
1648
  column3 = T0[state->v32[3] >> 24] ^ T1[(state->v32[0] >> 16) & 0xff]
 
1649
    ^ T2[(state->v32[1] >> 8) & 0xff] ^ T3[state->v32[2] & 0xff];
 
1650
#else
 
1651
  column0 = T0[state->v32[0] & 0xff] ^ T1[(state->v32[1] >> 8) & 0xff]
 
1652
        ^ T2[(state->v32[2] >> 16) & 0xff] ^ T3[state->v32[3] >> 24];
 
1653
 
 
1654
  column1 = T0[state->v32[1] & 0xff] ^ T1[(state->v32[2] >> 8) & 0xff]
 
1655
        ^ T2[(state->v32[3] >> 16) & 0xff] ^ T3[state->v32[0] >> 24];
 
1656
 
 
1657
  column2 = T0[state->v32[2] & 0xff] ^ T1[(state->v32[3] >> 8) & 0xff]
 
1658
        ^ T2[(state->v32[0] >> 16) & 0xff] ^ T3[state->v32[1] >> 24];
 
1659
 
 
1660
  column3 = T0[state->v32[3] & 0xff] ^ T1[(state->v32[0] >> 8) & 0xff]
 
1661
        ^ T2[(state->v32[1] >> 16) & 0xff] ^ T3[state->v32[2] >> 24];
 
1662
#endif /* WORDS_BIGENDIAN */
 
1663
 
 
1664
  state->v32[0] = column0 ^ round_key->v32[0];
 
1665
  state->v32[1] = column1 ^ round_key->v32[1];
 
1666
  state->v32[2] = column2 ^ round_key->v32[2];
 
1667
  state->v32[3] = column3 ^ round_key->v32[3];
 
1668
 
 
1669
}
 
1670
 
 
1671
static inline void
 
1672
aes_inv_round(v128_t *state, const v128_t *round_key) {
 
1673
  uint32_t column0, column1, column2, column3;
 
1674
 
 
1675
  /* compute the columns of the output square in terms of the octets
 
1676
     of state, using the tables U0, U1, U2, U3 */
 
1677
 
 
1678
#ifdef WORDS_BIGENDIAN
 
1679
  /* FIX!  WRong indexes */
 
1680
  column0 = U0[state->v32[0] >> 24] ^ U1[(state->v32[3] >> 16) & 0xff]
 
1681
    ^ U2[(state->v32[2] >> 8) & 0xff] ^ U3[state->v32[1] & 0xff];
 
1682
 
 
1683
  column1 = U0[state->v32[1] >> 24] ^ U1[(state->v32[0] >> 16) & 0xff]
 
1684
    ^ U2[(state->v32[3] >> 8) & 0xff] ^ U3[state->v32[2] & 0xff];
 
1685
 
 
1686
  column2 = U0[state->v32[2] >> 24] ^ U1[(state->v32[1] >> 16) & 0xff]
 
1687
    ^ U2[(state->v32[0] >> 8) & 0xff] ^ U3[state->v32[3] & 0xff];
 
1688
 
 
1689
  column3 = U0[state->v32[3] >> 24] ^ U1[(state->v32[2] >> 16) & 0xff]
 
1690
    ^ U2[(state->v32[1] >> 8) & 0xff] ^ U3[state->v32[0] & 0xff];
 
1691
#else
 
1692
  column0 = U0[state->v32[0] & 0xff] ^ U1[(state->v32[1] >> 8) & 0xff]
 
1693
        ^ U2[(state->v32[2] >> 16) & 0xff] ^ U3[state->v32[3] >> 24];
 
1694
 
 
1695
  column1 = U0[state->v32[1] & 0xff] ^ U1[(state->v32[2] >> 8) & 0xff]
 
1696
        ^ U2[(state->v32[3] >> 16) & 0xff] ^ U3[state->v32[0] >> 24];
 
1697
 
 
1698
  column2 = U0[state->v32[2] & 0xff] ^ U1[(state->v32[3] >> 8) & 0xff]
 
1699
        ^ U2[(state->v32[0] >> 16) & 0xff] ^ U3[state->v32[1] >> 24];
 
1700
 
 
1701
  column3 = U0[state->v32[3] & 0xff] ^ U1[(state->v32[0] >> 8) & 0xff]
 
1702
        ^ U2[(state->v32[1] >> 16) & 0xff] ^ U3[state->v32[2] >> 24];
 
1703
#endif /* WORDS_BIGENDIAN */
 
1704
 
 
1705
  state->v32[0] = column0 ^ round_key->v32[0];
 
1706
  state->v32[1] = column1 ^ round_key->v32[1];
 
1707
  state->v32[2] = column2 ^ round_key->v32[2];
 
1708
  state->v32[3] = column3 ^ round_key->v32[3];
 
1709
 
 
1710
}
 
1711
 
 
1712
static inline void
 
1713
aes_final_round(v128_t *state, const v128_t *round_key) {
 
1714
  uint32_t tmp0, tmp1, tmp2, tmp3;
 
1715
 
 
1716
  tmp0 = (T4[(state->v32[0] >> 24)]        & 0xff000000) 
 
1717
       ^ (T4[(state->v32[1] >> 16) & 0xff] & 0x00ff0000) 
 
1718
       ^ (T4[(state->v32[2] >>  8) & 0xff] & 0x0000ff00) 
 
1719
       ^ (T4[(state->v32[3]      ) & 0xff] & 0x000000ff) 
 
1720
       ^ round_key->v32[0];
 
1721
 
 
1722
  tmp1 = (T4[(state->v32[1] >> 24)]        & 0xff000000)
 
1723
       ^ (T4[(state->v32[2] >> 16) & 0xff] & 0x00ff0000)
 
1724
       ^ (T4[(state->v32[3] >>  8) & 0xff] & 0x0000ff00)
 
1725
       ^ (T4[(state->v32[0]      ) & 0xff] & 0x000000ff)
 
1726
       ^ round_key->v32[1];
 
1727
 
 
1728
  tmp2 = (T4[(state->v32[2] >> 24)]        & 0xff000000)
 
1729
       ^ (T4[(state->v32[3] >> 16) & 0xff] & 0x00ff0000)
 
1730
       ^ (T4[(state->v32[0] >>  8) & 0xff] & 0x0000ff00)
 
1731
       ^ (T4[(state->v32[1]      ) & 0xff] & 0x000000ff)
 
1732
       ^ round_key->v32[2];
 
1733
 
 
1734
  tmp3 = (T4[(state->v32[3] >> 24)]        & 0xff000000)
 
1735
       ^ (T4[(state->v32[0] >> 16) & 0xff] & 0x00ff0000)
 
1736
       ^ (T4[(state->v32[1] >>  8) & 0xff] & 0x0000ff00)
 
1737
       ^ (T4[(state->v32[2]      ) & 0xff] & 0x000000ff)
 
1738
       ^ round_key->v32[3];
 
1739
 
 
1740
  state->v32[0] = tmp0;
 
1741
  state->v32[1] = tmp1;
 
1742
  state->v32[2] = tmp2;
 
1743
  state->v32[3] = tmp3;
 
1744
 
 
1745
}
 
1746
 
 
1747
static inline void
 
1748
aes_inv_final_round(v128_t *state, const v128_t *round_key) {
 
1749
  uint32_t tmp0, tmp1, tmp2, tmp3;
 
1750
 
 
1751
  tmp0 = (U4[(state->v32[0] >> 24)]        & 0xff000000) 
 
1752
       ^ (U4[(state->v32[3] >> 16) & 0xff] & 0x00ff0000) 
 
1753
       ^ (U4[(state->v32[2] >>  8) & 0xff] & 0x0000ff00) 
 
1754
       ^ (U4[(state->v32[1]      ) & 0xff] & 0x000000ff) 
 
1755
       ^ round_key->v32[0];
 
1756
 
 
1757
  tmp1 = (U4[(state->v32[1] >> 24)]        & 0xff000000)
 
1758
       ^ (U4[(state->v32[0] >> 16) & 0xff] & 0x00ff0000)
 
1759
       ^ (U4[(state->v32[3] >>  8) & 0xff] & 0x0000ff00)
 
1760
       ^ (U4[(state->v32[2]      ) & 0xff] & 0x000000ff)
 
1761
       ^ round_key->v32[1];
 
1762
 
 
1763
  tmp2 = (U4[(state->v32[2] >> 24)]        & 0xff000000)
 
1764
       ^ (U4[(state->v32[1] >> 16) & 0xff] & 0x00ff0000)
 
1765
       ^ (U4[(state->v32[0] >>  8) & 0xff] & 0x0000ff00)
 
1766
       ^ (U4[(state->v32[3]      ) & 0xff] & 0x000000ff)
 
1767
       ^ round_key->v32[2];
 
1768
 
 
1769
  tmp3 = (U4[(state->v32[3] >> 24)]        & 0xff000000)
 
1770
       ^ (U4[(state->v32[2] >> 16) & 0xff] & 0x00ff0000)
 
1771
       ^ (U4[(state->v32[1] >>  8) & 0xff] & 0x0000ff00)
 
1772
       ^ (U4[(state->v32[0]      ) & 0xff] & 0x000000ff)
 
1773
       ^ round_key->v32[3];
 
1774
 
 
1775
  state->v32[0] = tmp0;
 
1776
  state->v32[1] = tmp1;
 
1777
  state->v32[2] = tmp2;
 
1778
  state->v32[3] = tmp3;
 
1779
 
 
1780
}
 
1781
 
 
1782
#elif CPU_16  /* assume 16-bit word size on processor */
 
1783
 
 
1784
static inline void
 
1785
aes_round(v128_t *state, const v128_t *round_key) {
 
1786
  uint32_t column0, column1, column2, column3;
 
1787
  uint16_t c
 
1788
  /* compute the columns of the output square in terms of the octets
 
1789
     of state, using the tables T0, T1, T2, T3 */
 
1790
 
 
1791
  column0 = T0[state->v8[0]] ^ T1[state->v8[5]]
 
1792
    ^ T2[state->v8[10]] ^ T3[state->v8[15]];
 
1793
 
 
1794
  column1 = T0[state->v8[4]] ^ T1[state->v8[9]]
 
1795
    ^ T2[state->v8[14]] ^ T3[state->v8[3]];
 
1796
 
 
1797
  column2 = T0[state->v8[8]] ^ T1[state->v8[13]]
 
1798
    ^ T2[state->v8[2]] ^ T3[state->v8[7]];
 
1799
 
 
1800
  column3 = T0[state->v8[12]] ^ T1[state->v8[1]]
 
1801
    ^ T2[state->v8[6]] ^ T3[state->v8[11]];
 
1802
 
 
1803
  state->v32[0] = column0 ^ round_key->v32[0];
 
1804
  state->v32[1] = column1 ^ round_key->v32[1];
 
1805
  state->v32[2] = column2 ^ round_key->v32[2];
 
1806
  state->v32[3] = column3 ^ round_key->v32[3];
 
1807
 
 
1808
}
 
1809
 
 
1810
 
 
1811
static inline void
 
1812
aes_inv_round(v128_t *state, const v128_t *round_key) {
 
1813
  uint32_t column0, column1, column2, column3;
 
1814
 
 
1815
  /* compute the columns of the output square in terms of the octets
 
1816
     of state, using the tables U0, U1, U2, U3 */
 
1817
 
 
1818
  column0 = U0[state->v8[0]] ^ U1[state->v8[5]]
 
1819
    ^ U2[state->v8[10]] ^ U3[state->v8[15]];
 
1820
 
 
1821
  column1 = U0[state->v8[4]] ^ U1[state->v8[9]]
 
1822
    ^ U2[state->v8[14]] ^ U3[state->v8[3]];
 
1823
 
 
1824
  column2 = U0[state->v8[8]] ^ U1[state->v8[13]]
 
1825
    ^ U2[state->v8[2]] ^ U3[state->v8[7]];
 
1826
 
 
1827
  column3 = U0[state->v8[12]] ^ U1[state->v8[1]]
 
1828
    ^ U2[state->v8[6]] ^ U3[state->v8[11]];
 
1829
 
 
1830
  state->v32[0] = column0 ^ round_key->v32[0];
 
1831
  state->v32[1] = column1 ^ round_key->v32[1];
 
1832
  state->v32[2] = column2 ^ round_key->v32[2];
 
1833
  state->v32[3] = column3 ^ round_key->v32[3];
 
1834
 
 
1835
}
 
1836
 
 
1837
static inline void
 
1838
aes_final_round(v128_t *state, const v128_t *round_key) {
 
1839
  uint8_t tmp;
 
1840
 
 
1841
  /* byte substitutions and row shifts */
 
1842
  /* first row - no shift */
 
1843
  state->v8[0] = aes_sbox[state->v8[0]];
 
1844
  state->v8[4] = aes_sbox[state->v8[4]];
 
1845
  state->v8[8] = aes_sbox[state->v8[8]];
 
1846
  state->v8[12] = aes_sbox[state->v8[12]];
 
1847
 
 
1848
  /* second row - shift one left */
 
1849
  tmp = aes_sbox[state->v8[1]];
 
1850
  state->v8[1] = aes_sbox[state->v8[5]];
 
1851
  state->v8[5] = aes_sbox[state->v8[9]];
 
1852
  state->v8[9] = aes_sbox[state->v8[13]];
 
1853
  state->v8[13] = tmp;
 
1854
 
 
1855
  /* third row - shift two left */
 
1856
  tmp = aes_sbox[state->v8[10]];
 
1857
  state->v8[10] = aes_sbox[state->v8[2]];
 
1858
  state->v8[2] = tmp;
 
1859
  tmp = aes_sbox[state->v8[14]];
 
1860
  state->v8[14] = aes_sbox[state->v8[6]];
 
1861
  state->v8[6] = tmp; 
 
1862
 
 
1863
  /* fourth row - shift three left */
 
1864
  tmp = aes_sbox[state->v8[15]];
 
1865
  state->v8[15] = aes_sbox[state->v8[11]];
 
1866
  state->v8[11] = aes_sbox[state->v8[7]];
 
1867
  state->v8[7] = aes_sbox[state->v8[3]];
 
1868
  state->v8[3] = tmp;
 
1869
 
 
1870
  v128_xor_eq(state, round_key);
 
1871
}
 
1872
 
 
1873
static inline void
 
1874
aes_inv_final_round(v128_t *state, const v128_t *round_key) {
 
1875
  uint8_t tmp;
 
1876
 
 
1877
  /* byte substitutions and row shifts */
 
1878
  /* first row - no shift */
 
1879
  state->v8[0] = aes_inv_sbox[state->v8[0]];
 
1880
  state->v8[4] = aes_inv_sbox[state->v8[4]];
 
1881
  state->v8[8] = aes_inv_sbox[state->v8[8]];
 
1882
  state->v8[12] = aes_inv_sbox[state->v8[12]];
 
1883
 
 
1884
  /* second row - shift one left */
 
1885
  tmp = aes_inv_sbox[state->v8[1]];
 
1886
  state->v8[1] = aes_inv_sbox[state->v8[5]];
 
1887
  state->v8[5] = aes_inv_sbox[state->v8[9]];
 
1888
  state->v8[9] = aes_inv_sbox[state->v8[13]];
 
1889
  state->v8[13] = tmp;
 
1890
 
 
1891
  /* third row - shift two left */
 
1892
  tmp = aes_inv_sbox[state->v8[10]];
 
1893
  state->v8[10] = aes_inv_sbox[state->v8[2]];
 
1894
  state->v8[2] = tmp;
 
1895
  tmp = aes_inv_sbox[state->v8[14]];
 
1896
  state->v8[14] = aes_inv_sbox[state->v8[6]];
 
1897
  state->v8[6] = tmp; 
 
1898
 
 
1899
  /* fourth row - shift three left */
 
1900
  tmp = aes_inv_sbox[state->v8[15]];
 
1901
  state->v8[15] = aes_inv_sbox[state->v8[11]];
 
1902
  state->v8[11] = aes_inv_sbox[state->v8[7]];
 
1903
  state->v8[7] = aes_inv_sbox[state->v8[3]];
 
1904
  state->v8[3] = tmp;
 
1905
 
 
1906
  v128_xor_eq(state, round_key);
 
1907
}
 
1908
 
 
1909
#endif  /* CPU type */
 
1910
 
 
1911
 
 
1912
void
 
1913
aes_encrypt(v128_t *plaintext, const aes_expanded_key_t exp_key) {
 
1914
 
 
1915
  /* add in the subkey */
 
1916
  v128_xor_eq(plaintext, exp_key + 0);
 
1917
 
 
1918
  /* now do nine rounds */
 
1919
  aes_round(plaintext, exp_key + 1);
 
1920
  aes_round(plaintext, exp_key + 2);
 
1921
  aes_round(plaintext, exp_key + 3);
 
1922
  aes_round(plaintext, exp_key + 4);
 
1923
  aes_round(plaintext, exp_key + 5);
 
1924
  aes_round(plaintext, exp_key + 6);
 
1925
  aes_round(plaintext, exp_key + 7);
 
1926
  aes_round(plaintext, exp_key + 8);  
 
1927
  aes_round(plaintext, exp_key + 9);
 
1928
  /* the last round is different */
 
1929
 
 
1930
 aes_final_round(plaintext, exp_key + 10);  
 
1931
}
 
1932
 
 
1933
void
 
1934
aes_decrypt(v128_t *plaintext, const aes_expanded_key_t exp_key) {
 
1935
 
 
1936
  /* add in the subkey */
 
1937
  v128_xor_eq(plaintext, exp_key + 0);
 
1938
 
 
1939
  /* now do nine rounds */
 
1940
  aes_inv_round(plaintext, exp_key + 1);
 
1941
  aes_inv_round(plaintext, exp_key + 2);
 
1942
  aes_inv_round(plaintext, exp_key + 3);
 
1943
  aes_inv_round(plaintext, exp_key + 4);
 
1944
  aes_inv_round(plaintext, exp_key + 5);
 
1945
  aes_inv_round(plaintext, exp_key + 6);
 
1946
  aes_inv_round(plaintext, exp_key + 7);
 
1947
  aes_inv_round(plaintext, exp_key + 8);  
 
1948
  aes_inv_round(plaintext, exp_key + 9);
 
1949
  /* the last round is different */
 
1950
  aes_inv_final_round(plaintext, exp_key + 10);  
 
1951
}