exp2l: Work around a NetBSD 10.0/i386 bug.
[gnulib.git] / lib / rijndael-alg-fst.c
blobc89eb9dbf551205b96264c15171d173bd34f9e04
1 /* rijndael-alg-fst.c --- Rijndael cipher implementation.
2 * Copyright (C) 2005-2006, 2009-2024 Free Software Foundation, Inc.
4 * This file is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as
6 * published by the Free Software Foundation; either version 2.1 of the
7 * License, or (at your option) any later version.
9 * This file is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 /* Adapted for gnulib by Simon Josefsson.
21 * Based on public domain "Optimised C code" retrieved from (SHA1
22 * 7c8e4b00d06685d1dbc6724a9e0d502353de339e):
23 * https://web.archive.org/web/20060618010435/http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/~rijmen/rijndael/rijndael-fst-3.0.zip
26 #include <config.h>
28 /**
29 * rijndael-alg-fst.c
31 * @version 3.0 (December 2000)
33 * Optimised ANSI C code for the Rijndael cipher (now AES)
35 * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
36 * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
37 * @author Paulo Barreto <paulo.barreto@terra.com.br>
39 * This code is hereby placed in the public domain.
41 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
42 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
43 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
45 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
46 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
47 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
48 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
49 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
50 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
51 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54 #include "rijndael-alg-fst.h"
57 Te0[x] = S [x].[02, 01, 01, 03];
58 Te1[x] = S [x].[03, 02, 01, 01];
59 Te2[x] = S [x].[01, 03, 02, 01];
60 Te3[x] = S [x].[01, 01, 03, 02];
61 Te4[x] = S [x].[01, 01, 01, 01];
63 Td0[x] = Si[x].[0e, 09, 0d, 0b];
64 Td1[x] = Si[x].[0b, 0e, 09, 0d];
65 Td2[x] = Si[x].[0d, 0b, 0e, 09];
66 Td3[x] = Si[x].[09, 0d, 0b, 0e];
67 Td4[x] = Si[x].[01, 01, 01, 01];
70 static const uint32_t Te0[256] = {
71 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
72 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
73 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
74 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
75 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
76 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
77 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
78 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
79 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
80 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
81 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
82 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
83 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
84 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
85 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
86 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
87 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
88 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
89 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
90 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
91 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
92 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
93 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
94 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
95 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
96 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
97 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
98 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
99 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
100 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
101 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
102 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
103 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
104 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
105 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
106 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
107 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
108 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
109 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
110 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
111 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
112 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
113 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
114 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
115 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
116 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
117 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
118 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
119 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
120 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
121 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
122 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
123 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
124 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
125 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
126 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
127 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
128 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
129 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
130 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
131 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
132 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
133 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
134 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
136 static const uint32_t Te1[256] = {
137 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
138 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
139 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
140 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
141 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
142 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
143 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
144 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
145 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
146 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
147 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
148 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
149 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
150 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
151 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
152 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
153 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
154 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
155 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
156 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
157 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
158 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
159 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
160 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
161 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
162 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
163 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
164 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
165 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
166 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
167 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
168 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
169 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
170 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
171 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
172 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
173 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
174 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
175 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
176 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
177 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
178 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
179 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
180 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
181 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
182 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
183 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
184 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
185 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
186 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
187 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
188 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
189 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
190 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
191 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
192 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
193 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
194 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
195 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
196 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
197 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
198 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
199 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
200 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
202 static const uint32_t Te2[256] = {
203 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
204 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
205 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
206 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
207 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
208 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
209 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
210 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
211 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
212 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
213 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
214 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
215 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
216 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
217 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
218 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
219 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
220 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
221 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
222 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
223 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
224 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
225 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
226 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
227 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
228 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
229 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
230 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
231 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
232 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
233 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
234 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
235 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
236 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
237 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
238 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
239 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
240 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
241 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
242 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
243 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
244 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
245 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
246 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
247 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
248 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
249 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
250 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
251 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
252 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
253 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
254 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
255 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
256 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
257 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
258 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
259 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
260 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
261 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
262 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
263 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
264 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
265 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
266 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
268 static const uint32_t Te3[256] = {
269 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
270 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
271 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
272 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
273 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
274 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
275 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
276 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
277 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
278 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
279 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
280 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
281 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
282 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
283 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
284 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
285 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
286 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
287 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
288 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
289 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
290 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
291 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
292 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
293 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
294 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
295 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
296 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
297 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
298 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
299 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
300 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
301 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
302 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
303 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
304 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
305 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
306 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
307 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
308 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
309 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
310 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
311 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
312 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
313 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
314 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
315 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
316 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
317 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
318 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
319 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
320 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
321 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
322 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
323 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
324 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
325 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
326 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
327 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
328 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
329 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
330 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
331 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
332 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
334 static const uint32_t Te4[256] = {
335 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
336 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
337 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
338 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
339 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
340 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
341 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
342 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
343 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
344 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
345 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
346 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
347 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
348 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
349 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
350 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
351 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
352 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
353 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
354 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
355 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
356 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
357 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
358 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
359 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
360 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
361 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
362 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
363 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
364 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
365 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
366 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
367 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
368 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
369 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
370 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
371 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
372 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
373 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
374 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
375 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
376 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
377 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
378 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
379 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
380 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
381 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
382 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
383 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
384 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
385 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
386 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
387 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
388 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
389 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
390 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
391 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
392 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
393 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
394 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
395 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
396 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
397 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
398 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616,
400 static const uint32_t Td0[256] = {
401 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
402 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
403 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
404 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
405 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
406 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
407 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
408 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
409 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
410 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
411 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
412 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
413 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
414 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
415 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
416 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
417 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
418 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
419 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
420 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
421 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
422 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
423 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
424 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
425 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
426 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
427 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
428 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
429 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
430 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
431 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
432 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
433 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
434 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
435 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
436 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
437 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
438 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
439 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
440 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
441 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
442 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
443 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
444 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
445 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
446 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
447 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
448 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
449 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
450 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
451 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
452 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
453 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
454 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
455 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
456 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
457 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
458 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
459 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
460 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
461 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
462 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
463 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
464 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
466 static const uint32_t Td1[256] = {
467 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
468 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
469 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
470 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
471 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
472 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
473 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
474 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
475 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
476 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
477 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
478 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
479 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
480 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
481 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
482 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
483 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
484 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
485 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
486 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
487 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
488 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
489 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
490 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
491 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
492 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
493 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
494 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
495 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
496 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
497 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
498 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
499 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
500 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
501 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
502 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
503 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
504 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
505 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
506 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
507 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
508 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
509 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
510 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
511 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
512 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
513 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
514 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
515 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
516 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
517 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
518 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
519 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
520 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
521 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
522 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
523 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
524 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
525 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
526 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
527 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
528 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
529 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
530 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
532 static const uint32_t Td2[256] = {
533 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
534 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
535 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
536 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
537 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
538 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
539 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
540 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
541 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
542 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
543 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
544 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
545 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
546 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
547 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
548 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
549 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
550 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
551 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
552 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
553 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
554 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
555 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
556 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
557 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
558 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
559 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
560 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
561 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
562 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
563 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
564 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
565 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
566 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
567 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
568 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
569 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
570 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
571 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
572 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
573 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
574 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
575 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
576 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
577 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
578 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
579 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
580 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
581 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
582 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
583 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
584 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
585 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
586 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
587 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
588 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
589 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
590 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
591 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
592 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
593 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
594 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
595 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
596 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
598 static const uint32_t Td3[256] = {
599 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
600 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
601 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
602 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
603 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
604 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
605 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
606 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
607 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
608 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
609 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
610 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
611 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
612 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
613 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
614 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
615 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
616 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
617 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
618 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
619 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
620 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
621 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
622 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
623 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
624 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
625 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
626 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
627 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
628 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
629 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
630 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
631 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
632 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
633 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
634 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
635 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
636 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
637 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
638 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
639 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
640 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
641 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
642 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
643 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
644 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
645 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
646 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
647 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
648 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
649 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
650 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
651 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
652 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
653 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
654 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
655 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
656 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
657 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
658 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
659 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
660 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
661 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
662 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
664 static const uint32_t Td4[256] = {
665 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
666 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
667 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
668 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
669 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
670 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
671 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
672 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
673 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
674 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
675 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
676 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
677 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
678 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
679 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
680 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
681 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
682 0x86868686, 0x68686868, 0x98989898, 0x16161616,
683 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
684 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
685 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
686 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
687 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
688 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
689 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
690 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
691 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
692 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
693 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
694 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
695 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
696 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
697 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
698 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
699 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
700 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
701 0x96969696, 0xacacacac, 0x74747474, 0x22222222,
702 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
703 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
704 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
705 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
706 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
707 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
708 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
709 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
710 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
711 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
712 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
713 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
714 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
715 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
716 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
717 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
718 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
719 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
720 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
721 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
722 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
723 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
724 0x83838383, 0x53535353, 0x99999999, 0x61616161,
725 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
726 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
727 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
728 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d,
730 static const uint32_t rcon[] = {
731 0x01000000, 0x02000000, 0x04000000, 0x08000000,
732 0x10000000, 0x20000000, 0x40000000, 0x80000000,
733 0x1B000000, 0x36000000
734 /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
737 #define GETU32(pt) (((uint32_t)((pt)[0] & 0xFF) << 24) ^ \
738 ((uint32_t)((pt)[1] & 0xFF) << 16) ^ \
739 ((uint32_t)((pt)[2] & 0xFF) << 8) ^ \
740 ((uint32_t)((pt)[3] & 0xFF)))
741 #define PUTU32(ct, st) { \
742 (ct)[0] = (char)((st) >> 24); \
743 (ct)[1] = (char)((st) >> 16); \
744 (ct)[2] = (char)((st) >> 8); \
745 (ct)[3] = (char)(st); }
748 * Expand the cipher key into the encryption key schedule.
750 * @return the number of rounds for the given cipher key size.
753 rijndaelKeySetupEnc (uint32_t rk[ /*4*(Nr + 1) */ ],
754 const char cipherKey[], size_t keyBits)
756 size_t i = 0;
757 uint32_t temp;
759 rk[0] = GETU32 (cipherKey);
760 rk[1] = GETU32 (cipherKey + 4);
761 rk[2] = GETU32 (cipherKey + 8);
762 rk[3] = GETU32 (cipherKey + 12);
763 if (keyBits == 128)
765 for (;;)
767 temp = rk[3];
768 rk[4] = rk[0] ^
769 (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
770 (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
771 (Te4[(temp) & 0xff] & 0x0000ff00) ^
772 (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
773 rk[5] = rk[1] ^ rk[4];
774 rk[6] = rk[2] ^ rk[5];
775 rk[7] = rk[3] ^ rk[6];
776 if (++i == 10)
778 return 10;
780 rk += 4;
783 rk[4] = GETU32 (cipherKey + 16);
784 rk[5] = GETU32 (cipherKey + 20);
785 if (keyBits == 192)
787 for (;;)
789 temp = rk[5];
790 rk[6] = rk[0] ^
791 (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
792 (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
793 (Te4[(temp) & 0xff] & 0x0000ff00) ^
794 (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
795 rk[7] = rk[1] ^ rk[6];
796 rk[8] = rk[2] ^ rk[7];
797 rk[9] = rk[3] ^ rk[8];
798 if (++i == 8)
800 return 12;
802 rk[10] = rk[4] ^ rk[9];
803 rk[11] = rk[5] ^ rk[10];
804 rk += 6;
807 rk[6] = GETU32 (cipherKey + 24);
808 rk[7] = GETU32 (cipherKey + 28);
809 if (keyBits == 256)
811 for (;;)
813 temp = rk[7];
814 rk[8] = rk[0] ^
815 (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
816 (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
817 (Te4[(temp) & 0xff] & 0x0000ff00) ^
818 (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
819 rk[9] = rk[1] ^ rk[8];
820 rk[10] = rk[2] ^ rk[9];
821 rk[11] = rk[3] ^ rk[10];
822 if (++i == 7)
824 return 14;
826 temp = rk[11];
827 rk[12] = rk[4] ^
828 (Te4[(temp >> 24)] & 0xff000000) ^
829 (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
830 (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^
831 (Te4[(temp) & 0xff] & 0x000000ff);
832 rk[13] = rk[5] ^ rk[12];
833 rk[14] = rk[6] ^ rk[13];
834 rk[15] = rk[7] ^ rk[14];
836 rk += 8;
839 return 0;
843 * Expand the cipher key into the decryption key schedule.
845 * @return the number of rounds for the given cipher key size.
848 rijndaelKeySetupDec (uint32_t rk[ /*4*(Nr + 1) */ ],
849 const char cipherKey[], size_t keyBits)
851 size_t Nr, i, j;
852 uint32_t temp;
854 /* expand the cipher key: */
855 Nr = rijndaelKeySetupEnc (rk, cipherKey, keyBits);
856 /* invert the order of the round keys: */
857 for (i = 0, j = 4 * Nr; i < j; i += 4, j -= 4)
859 temp = rk[i];
860 rk[i] = rk[j];
861 rk[j] = temp;
862 temp = rk[i + 1];
863 rk[i + 1] = rk[j + 1];
864 rk[j + 1] = temp;
865 temp = rk[i + 2];
866 rk[i + 2] = rk[j + 2];
867 rk[j + 2] = temp;
868 temp = rk[i + 3];
869 rk[i + 3] = rk[j + 3];
870 rk[j + 3] = temp;
872 /* apply the inverse MixColumn transform to all round keys but the
873 first and the last: */
874 for (i = 1; i < Nr; i++)
876 rk += 4;
877 rk[0] =
878 Td0[Te4[(rk[0] >> 24)] & 0xff] ^
879 Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
880 Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^
881 Td3[Te4[(rk[0]) & 0xff] & 0xff];
882 rk[1] =
883 Td0[Te4[(rk[1] >> 24)] & 0xff] ^
884 Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
885 Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^
886 Td3[Te4[(rk[1]) & 0xff] & 0xff];
887 rk[2] =
888 Td0[Te4[(rk[2] >> 24)] & 0xff] ^
889 Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
890 Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^
891 Td3[Te4[(rk[2]) & 0xff] & 0xff];
892 rk[3] =
893 Td0[Te4[(rk[3] >> 24)] & 0xff] ^
894 Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
895 Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^
896 Td3[Te4[(rk[3]) & 0xff] & 0xff];
898 return Nr;
901 void
902 rijndaelEncrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
903 const char pt[16], char ct[16])
905 uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
906 size_t r;
909 * map byte array block to cipher state
910 * and add initial round key:
912 s0 = GETU32 (pt) ^ rk[0];
913 s1 = GETU32 (pt + 4) ^ rk[1];
914 s2 = GETU32 (pt + 8) ^ rk[2];
915 s3 = GETU32 (pt + 12) ^ rk[3];
917 * Nr - 1 full rounds:
919 r = Nr >> 1;
920 for (;;)
922 t0 =
923 Te0[(s0 >> 24)] ^
924 Te1[(s1 >> 16) & 0xff] ^
925 Te2[(s2 >> 8) & 0xff] ^ Te3[(s3) & 0xff] ^ rk[4];
926 t1 =
927 Te0[(s1 >> 24)] ^
928 Te1[(s2 >> 16) & 0xff] ^
929 Te2[(s3 >> 8) & 0xff] ^ Te3[(s0) & 0xff] ^ rk[5];
930 t2 =
931 Te0[(s2 >> 24)] ^
932 Te1[(s3 >> 16) & 0xff] ^
933 Te2[(s0 >> 8) & 0xff] ^ Te3[(s1) & 0xff] ^ rk[6];
934 t3 =
935 Te0[(s3 >> 24)] ^
936 Te1[(s0 >> 16) & 0xff] ^
937 Te2[(s1 >> 8) & 0xff] ^ Te3[(s2) & 0xff] ^ rk[7];
939 rk += 8;
940 if (--r == 0)
942 break;
945 s0 =
946 Te0[(t0 >> 24)] ^
947 Te1[(t1 >> 16) & 0xff] ^
948 Te2[(t2 >> 8) & 0xff] ^ Te3[(t3) & 0xff] ^ rk[0];
949 s1 =
950 Te0[(t1 >> 24)] ^
951 Te1[(t2 >> 16) & 0xff] ^
952 Te2[(t3 >> 8) & 0xff] ^ Te3[(t0) & 0xff] ^ rk[1];
953 s2 =
954 Te0[(t2 >> 24)] ^
955 Te1[(t3 >> 16) & 0xff] ^
956 Te2[(t0 >> 8) & 0xff] ^ Te3[(t1) & 0xff] ^ rk[2];
957 s3 =
958 Te0[(t3 >> 24)] ^
959 Te1[(t0 >> 16) & 0xff] ^
960 Te2[(t1 >> 8) & 0xff] ^ Te3[(t2) & 0xff] ^ rk[3];
963 * apply last round and
964 * map cipher state to byte array block:
966 s0 =
967 (Te4[(t0 >> 24)] & 0xff000000) ^
968 (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
969 (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
970 (Te4[(t3) & 0xff] & 0x000000ff) ^ rk[0];
971 PUTU32 (ct, s0);
972 s1 =
973 (Te4[(t1 >> 24)] & 0xff000000) ^
974 (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
975 (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
976 (Te4[(t0) & 0xff] & 0x000000ff) ^ rk[1];
977 PUTU32 (ct + 4, s1);
978 s2 =
979 (Te4[(t2 >> 24)] & 0xff000000) ^
980 (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
981 (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
982 (Te4[(t1) & 0xff] & 0x000000ff) ^ rk[2];
983 PUTU32 (ct + 8, s2);
984 s3 =
985 (Te4[(t3 >> 24)] & 0xff000000) ^
986 (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
987 (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
988 (Te4[(t2) & 0xff] & 0x000000ff) ^ rk[3];
989 PUTU32 (ct + 12, s3);
992 void
993 rijndaelDecrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
994 const char ct[16], char pt[16])
996 uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
997 size_t r;
1000 * map byte array block to cipher state
1001 * and add initial round key:
1003 s0 = GETU32 (ct) ^ rk[0];
1004 s1 = GETU32 (ct + 4) ^ rk[1];
1005 s2 = GETU32 (ct + 8) ^ rk[2];
1006 s3 = GETU32 (ct + 12) ^ rk[3];
1008 * Nr - 1 full rounds:
1010 r = Nr >> 1;
1011 for (;;)
1013 t0 =
1014 Td0[(s0 >> 24)] ^
1015 Td1[(s3 >> 16) & 0xff] ^
1016 Td2[(s2 >> 8) & 0xff] ^ Td3[(s1) & 0xff] ^ rk[4];
1017 t1 =
1018 Td0[(s1 >> 24)] ^
1019 Td1[(s0 >> 16) & 0xff] ^
1020 Td2[(s3 >> 8) & 0xff] ^ Td3[(s2) & 0xff] ^ rk[5];
1021 t2 =
1022 Td0[(s2 >> 24)] ^
1023 Td1[(s1 >> 16) & 0xff] ^
1024 Td2[(s0 >> 8) & 0xff] ^ Td3[(s3) & 0xff] ^ rk[6];
1025 t3 =
1026 Td0[(s3 >> 24)] ^
1027 Td1[(s2 >> 16) & 0xff] ^
1028 Td2[(s1 >> 8) & 0xff] ^ Td3[(s0) & 0xff] ^ rk[7];
1030 rk += 8;
1031 if (--r == 0)
1033 break;
1036 s0 =
1037 Td0[(t0 >> 24)] ^
1038 Td1[(t3 >> 16) & 0xff] ^
1039 Td2[(t2 >> 8) & 0xff] ^ Td3[(t1) & 0xff] ^ rk[0];
1040 s1 =
1041 Td0[(t1 >> 24)] ^
1042 Td1[(t0 >> 16) & 0xff] ^
1043 Td2[(t3 >> 8) & 0xff] ^ Td3[(t2) & 0xff] ^ rk[1];
1044 s2 =
1045 Td0[(t2 >> 24)] ^
1046 Td1[(t1 >> 16) & 0xff] ^
1047 Td2[(t0 >> 8) & 0xff] ^ Td3[(t3) & 0xff] ^ rk[2];
1048 s3 =
1049 Td0[(t3 >> 24)] ^
1050 Td1[(t2 >> 16) & 0xff] ^
1051 Td2[(t1 >> 8) & 0xff] ^ Td3[(t0) & 0xff] ^ rk[3];
1054 * apply last round and
1055 * map cipher state to byte array block:
1057 s0 =
1058 (Td4[(t0 >> 24)] & 0xff000000) ^
1059 (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1060 (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
1061 (Td4[(t1) & 0xff] & 0x000000ff) ^ rk[0];
1062 PUTU32 (pt, s0);
1063 s1 =
1064 (Td4[(t1 >> 24)] & 0xff000000) ^
1065 (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1066 (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
1067 (Td4[(t2) & 0xff] & 0x000000ff) ^ rk[1];
1068 PUTU32 (pt + 4, s1);
1069 s2 =
1070 (Td4[(t2 >> 24)] & 0xff000000) ^
1071 (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1072 (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
1073 (Td4[(t3) & 0xff] & 0x000000ff) ^ rk[2];
1074 PUTU32 (pt + 8, s2);
1075 s3 =
1076 (Td4[(t3 >> 24)] & 0xff000000) ^
1077 (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1078 (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
1079 (Td4[(t0) & 0xff] & 0x000000ff) ^ rk[3];
1080 PUTU32 (pt + 12, s3);