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