1/**
2 * Author......: See docs/credits.txt
3 * License.....: MIT
4 */
5
6#include "inc_vendor.h"
7#include "inc_types.h"
8#include "inc_platform.h"
9#include "inc_common.h"
10#include "inc_cipher_aes.h"
11
12CONSTANT_VK u32a te0[256] =
13{
14  0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
15  0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
16  0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
17  0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
18  0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
19  0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
20  0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
21  0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
22  0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
23  0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
24  0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
25  0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
26  0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
27  0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
28  0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
29  0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
30  0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
31  0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
32  0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
33  0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
34  0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
35  0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
36  0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
37  0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
38  0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
39  0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
40  0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
41  0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
42  0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
43  0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
44  0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
45  0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
46  0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
47  0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
48  0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
49  0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
50  0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
51  0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
52  0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
53  0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
54  0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
55  0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
56  0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
57  0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
58  0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
59  0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
60  0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
61  0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
62  0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
63  0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
64  0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
65  0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
66  0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
67  0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
68  0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
69  0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
70  0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
71  0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
72  0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
73  0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
74  0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
75  0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
76  0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
77  0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
78};
79
80CONSTANT_VK u32a te1[256] =
81{
82  0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
83  0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
84  0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
85  0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
86  0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
87  0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
88  0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
89  0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
90  0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
91  0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
92  0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
93  0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
94  0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
95  0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
96  0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
97  0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
98  0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
99  0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
100  0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
101  0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
102  0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
103  0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
104  0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
105  0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
106  0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
107  0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
108  0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
109  0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
110  0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
111  0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
112  0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
113  0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
114  0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
115  0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
116  0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
117  0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
118  0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
119  0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
120  0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
121  0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
122  0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
123  0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
124  0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
125  0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
126  0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
127  0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
128  0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
129  0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
130  0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
131  0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
132  0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
133  0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
134  0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
135  0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
136  0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
137  0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
138  0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
139  0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
140  0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
141  0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
142  0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
143  0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
144  0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
145  0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
146};
147
148CONSTANT_VK u32a te2[256] =
149{
150  0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
151  0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
152  0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
153  0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
154  0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
155  0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
156  0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
157  0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
158  0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
159  0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
160  0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
161  0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
162  0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
163  0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
164  0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
165  0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
166  0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
167  0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
168  0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
169  0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
170  0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
171  0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
172  0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
173  0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
174  0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
175  0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
176  0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
177  0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
178  0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
179  0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
180  0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
181  0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
182  0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
183  0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
184  0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
185  0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
186  0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
187  0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
188  0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
189  0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
190  0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
191  0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
192  0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
193  0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
194  0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
195  0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
196  0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
197  0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
198  0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
199  0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
200  0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
201  0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
202  0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
203  0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
204  0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
205  0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
206  0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
207  0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
208  0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
209  0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
210  0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
211  0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
212  0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
213  0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
214};
215
216CONSTANT_VK u32a te3[256] =
217{
218  0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
219  0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
220  0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
221  0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
222  0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
223  0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
224  0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
225  0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
226  0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
227  0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
228  0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
229  0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
230  0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
231  0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
232  0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
233  0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
234  0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
235  0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
236  0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
237  0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
238  0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
239  0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
240  0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
241  0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
242  0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
243  0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
244  0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
245  0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
246  0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
247  0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
248  0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
249  0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
250  0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
251  0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
252  0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
253  0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
254  0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
255  0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
256  0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
257  0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
258  0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
259  0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
260  0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
261  0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
262  0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
263  0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
264  0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
265  0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
266  0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
267  0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
268  0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
269  0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
270  0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
271  0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
272  0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
273  0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
274  0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
275  0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
276  0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
277  0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
278  0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
279  0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
280  0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
281  0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
282};
283
284CONSTANT_VK u32a te4[256] =
285{
286  0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
287  0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
288  0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
289  0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
290  0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
291  0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
292  0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
293  0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
294  0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
295  0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
296  0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
297  0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
298  0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
299  0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
300  0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
301  0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
302  0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
303  0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
304  0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
305  0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
306  0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
307  0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
308  0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
309  0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
310  0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
311  0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
312  0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
313  0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
314  0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
315  0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
316  0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
317  0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
318  0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
319  0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
320  0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
321  0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
322  0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
323  0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
324  0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
325  0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
326  0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
327  0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
328  0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
329  0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
330  0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
331  0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
332  0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
333  0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
334  0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
335  0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
336  0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
337  0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
338  0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
339  0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
340  0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
341  0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
342  0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
343  0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
344  0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
345  0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
346  0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
347  0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
348  0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
349  0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616,
350};
351
352CONSTANT_VK u32a td0[256] =
353{
354  0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
355  0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
356  0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
357  0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
358  0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
359  0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
360  0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
361  0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
362  0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
363  0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
364  0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
365  0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
366  0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
367  0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
368  0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
369  0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
370  0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
371  0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
372  0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
373  0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
374  0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
375  0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
376  0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
377  0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
378  0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
379  0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
380  0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
381  0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
382  0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
383  0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
384  0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
385  0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
386  0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
387  0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
388  0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
389  0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
390  0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
391  0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
392  0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
393  0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
394  0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
395  0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
396  0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
397  0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
398  0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
399  0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
400  0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
401  0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
402  0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
403  0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
404  0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
405  0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
406  0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
407  0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
408  0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
409  0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
410  0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
411  0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
412  0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
413  0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
414  0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
415  0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
416  0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
417  0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
418};
419
420CONSTANT_VK u32a td1[256] =
421{
422  0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
423  0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
424  0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
425  0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
426  0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
427  0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
428  0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
429  0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
430  0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
431  0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
432  0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
433  0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
434  0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
435  0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
436  0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
437  0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
438  0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
439  0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
440  0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
441  0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
442  0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
443  0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
444  0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
445  0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
446  0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
447  0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
448  0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
449  0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
450  0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
451  0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
452  0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
453  0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
454  0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
455  0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
456  0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
457  0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
458  0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
459  0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
460  0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
461  0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
462  0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
463  0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
464  0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
465  0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
466  0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
467  0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
468  0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
469  0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
470  0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
471  0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
472  0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
473  0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
474  0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
475  0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
476  0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
477  0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
478  0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
479  0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
480  0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
481  0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
482  0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
483  0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
484  0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
485  0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
486};
487
488CONSTANT_VK u32a td2[256] =
489{
490  0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
491  0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
492  0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
493  0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
494  0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
495  0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
496  0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
497  0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
498  0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
499  0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
500  0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
501  0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
502  0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
503  0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
504  0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
505  0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
506  0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
507  0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
508  0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
509  0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
510  0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
511  0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
512  0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
513  0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
514  0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
515  0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
516  0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
517  0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
518  0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
519  0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
520  0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
521  0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
522  0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
523  0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
524  0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
525  0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
526  0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
527  0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
528  0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
529  0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
530  0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
531  0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
532  0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
533  0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
534  0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
535  0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
536  0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
537  0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
538  0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
539  0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
540  0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
541  0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
542  0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
543  0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
544  0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
545  0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
546  0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
547  0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
548  0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
549  0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
550  0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
551  0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
552  0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
553  0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
554};
555
556CONSTANT_VK u32a td3[256] =
557{
558  0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
559  0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
560  0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
561  0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
562  0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
563  0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
564  0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
565  0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
566  0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
567  0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
568  0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
569  0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
570  0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
571  0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
572  0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
573  0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
574  0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
575  0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
576  0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
577  0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
578  0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
579  0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
580  0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
581  0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
582  0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
583  0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
584  0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
585  0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
586  0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
587  0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
588  0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
589  0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
590  0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
591  0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
592  0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
593  0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
594  0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
595  0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
596  0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
597  0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
598  0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
599  0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
600  0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
601  0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
602  0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
603  0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
604  0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
605  0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
606  0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
607  0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
608  0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
609  0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
610  0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
611  0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
612  0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
613  0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
614  0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
615  0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
616  0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
617  0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
618  0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
619  0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
620  0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
621  0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
622};
623
624CONSTANT_VK u32a td4[256] =
625{
626  0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
627  0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
628  0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
629  0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
630  0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
631  0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
632  0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
633  0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
634  0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
635  0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
636  0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
637  0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
638  0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
639  0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
640  0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
641  0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
642  0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
643  0x86868686, 0x68686868, 0x98989898, 0x16161616,
644  0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
645  0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
646  0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
647  0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
648  0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
649  0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
650  0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
651  0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
652  0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
653  0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
654  0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
655  0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
656  0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
657  0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
658  0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
659  0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
660  0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
661  0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
662  0x96969696, 0xacacacac, 0x74747474, 0x22222222,
663  0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
664  0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
665  0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
666  0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
667  0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
668  0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
669  0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
670  0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
671  0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
672  0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
673  0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
674  0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
675  0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
676  0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
677  0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
678  0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
679  0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
680  0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
681  0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
682  0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
683  0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
684  0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
685  0x83838383, 0x53535353, 0x99999999, 0x61616161,
686  0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
687  0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
688  0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
689  0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d,
690};
691
692// 128 bit key
693
694DECLSPEC void aes128_ExpandKey (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3)
695{
696  ks[ 0] = ukey[0];
697  ks[ 1] = ukey[1];
698  ks[ 2] = ukey[2];
699  ks[ 3] = ukey[3];
700  ks[ 4] = ks[ 0] ^ 0x01000000
701                  ^ (s_te2[(ks[ 3] >> 16) & 0xff] & 0xff000000)
702                  ^ (s_te3[(ks[ 3] >>  8) & 0xff] & 0x00ff0000)
703                  ^ (s_te0[(ks[ 3] >>  0) & 0xff] & 0x0000ff00)
704                  ^ (s_te1[(ks[ 3] >> 24) & 0xff] & 0x000000ff);
705  ks[ 5] = ks[ 1] ^ ks[ 4];
706  ks[ 6] = ks[ 2] ^ ks[ 5];
707  ks[ 7] = ks[ 3] ^ ks[ 6];
708  ks[ 8] = ks[ 4] ^ 0x02000000
709                  ^ (s_te2[(ks[ 7] >> 16) & 0xff] & 0xff000000)
710                  ^ (s_te3[(ks[ 7] >>  8) & 0xff] & 0x00ff0000)
711                  ^ (s_te0[(ks[ 7] >>  0) & 0xff] & 0x0000ff00)
712                  ^ (s_te1[(ks[ 7] >> 24) & 0xff] & 0x000000ff);
713  ks[ 9] = ks[ 5] ^ ks[ 8];
714  ks[10] = ks[ 6] ^ ks[ 9];
715  ks[11] = ks[ 7] ^ ks[10];
716  ks[12] = ks[ 8] ^ 0x04000000
717                  ^ (s_te2[(ks[11] >> 16) & 0xff] & 0xff000000)
718                  ^ (s_te3[(ks[11] >>  8) & 0xff] & 0x00ff0000)
719                  ^ (s_te0[(ks[11] >>  0) & 0xff] & 0x0000ff00)
720                  ^ (s_te1[(ks[11] >> 24) & 0xff] & 0x000000ff);
721  ks[13] = ks[ 9] ^ ks[12];
722  ks[14] = ks[10] ^ ks[13];
723  ks[15] = ks[11] ^ ks[14];
724  ks[16] = ks[12] ^ 0x08000000
725                  ^ (s_te2[(ks[15] >> 16) & 0xff] & 0xff000000)
726                  ^ (s_te3[(ks[15] >>  8) & 0xff] & 0x00ff0000)
727                  ^ (s_te0[(ks[15] >>  0) & 0xff] & 0x0000ff00)
728                  ^ (s_te1[(ks[15] >> 24) & 0xff] & 0x000000ff);
729  ks[17] = ks[13] ^ ks[16];
730  ks[18] = ks[14] ^ ks[17];
731  ks[19] = ks[15] ^ ks[18];
732  ks[20] = ks[16] ^ 0x10000000
733                  ^ (s_te2[(ks[19] >> 16) & 0xff] & 0xff000000)
734                  ^ (s_te3[(ks[19] >>  8) & 0xff] & 0x00ff0000)
735                  ^ (s_te0[(ks[19] >>  0) & 0xff] & 0x0000ff00)
736                  ^ (s_te1[(ks[19] >> 24) & 0xff] & 0x000000ff);
737  ks[21] = ks[17] ^ ks[20];
738  ks[22] = ks[18] ^ ks[21];
739  ks[23] = ks[19] ^ ks[22];
740  ks[24] = ks[20] ^ 0x20000000
741                  ^ (s_te2[(ks[23] >> 16) & 0xff] & 0xff000000)
742                  ^ (s_te3[(ks[23] >>  8) & 0xff] & 0x00ff0000)
743                  ^ (s_te0[(ks[23] >>  0) & 0xff] & 0x0000ff00)
744                  ^ (s_te1[(ks[23] >> 24) & 0xff] & 0x000000ff);
745  ks[25] = ks[21] ^ ks[24];
746  ks[26] = ks[22] ^ ks[25];
747  ks[27] = ks[23] ^ ks[26];
748  ks[28] = ks[24] ^ 0x40000000
749                  ^ (s_te2[(ks[27] >> 16) & 0xff] & 0xff000000)
750                  ^ (s_te3[(ks[27] >>  8) & 0xff] & 0x00ff0000)
751                  ^ (s_te0[(ks[27] >>  0) & 0xff] & 0x0000ff00)
752                  ^ (s_te1[(ks[27] >> 24) & 0xff] & 0x000000ff);
753  ks[29] = ks[25] ^ ks[28];
754  ks[30] = ks[26] ^ ks[29];
755  ks[31] = ks[27] ^ ks[30];
756  ks[32] = ks[28] ^ 0x80000000
757                  ^ (s_te2[(ks[31] >> 16) & 0xff] & 0xff000000)
758                  ^ (s_te3[(ks[31] >>  8) & 0xff] & 0x00ff0000)
759                  ^ (s_te0[(ks[31] >>  0) & 0xff] & 0x0000ff00)
760                  ^ (s_te1[(ks[31] >> 24) & 0xff] & 0x000000ff);
761  ks[33] = ks[29] ^ ks[32];
762  ks[34] = ks[30] ^ ks[33];
763  ks[35] = ks[31] ^ ks[34];
764  ks[36] = ks[32] ^ 0x1b000000
765                  ^ (s_te2[(ks[35] >> 16) & 0xff] & 0xff000000)
766                  ^ (s_te3[(ks[35] >>  8) & 0xff] & 0x00ff0000)
767                  ^ (s_te0[(ks[35] >>  0) & 0xff] & 0x0000ff00)
768                  ^ (s_te1[(ks[35] >> 24) & 0xff] & 0x000000ff);
769  ks[37] = ks[33] ^ ks[36];
770  ks[38] = ks[34] ^ ks[37];
771  ks[39] = ks[35] ^ ks[38];
772  ks[40] = ks[36] ^ 0x36000000
773                  ^ (s_te2[(ks[39] >> 16) & 0xff] & 0xff000000)
774                  ^ (s_te3[(ks[39] >>  8) & 0xff] & 0x00ff0000)
775                  ^ (s_te0[(ks[39] >>  0) & 0xff] & 0x0000ff00)
776                  ^ (s_te1[(ks[39] >> 24) & 0xff] & 0x000000ff);
777  ks[41] = ks[37] ^ ks[40];
778  ks[42] = ks[38] ^ ks[41];
779  ks[43] = ks[39] ^ ks[42];
780}
781
782DECLSPEC void aes128_InvertKey (u32 *ks, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3)
783{
784  u32 temp;
785
786  temp = ks[ 0]; ks[ 0] = ks[40]; ks[40] = temp;
787  temp = ks[ 1]; ks[ 1] = ks[41]; ks[41] = temp;
788  temp = ks[ 2]; ks[ 2] = ks[42]; ks[42] = temp;
789  temp = ks[ 3]; ks[ 3] = ks[43]; ks[43] = temp;
790  temp = ks[ 4]; ks[ 4] = ks[36]; ks[36] = temp;
791  temp = ks[ 5]; ks[ 5] = ks[37]; ks[37] = temp;
792  temp = ks[ 6]; ks[ 6] = ks[38]; ks[38] = temp;
793  temp = ks[ 7]; ks[ 7] = ks[39]; ks[39] = temp;
794  temp = ks[ 8]; ks[ 8] = ks[32]; ks[32] = temp;
795  temp = ks[ 9]; ks[ 9] = ks[33]; ks[33] = temp;
796  temp = ks[10]; ks[10] = ks[34]; ks[34] = temp;
797  temp = ks[11]; ks[11] = ks[35]; ks[35] = temp;
798  temp = ks[12]; ks[12] = ks[28]; ks[28] = temp;
799  temp = ks[13]; ks[13] = ks[29]; ks[29] = temp;
800  temp = ks[14]; ks[14] = ks[30]; ks[30] = temp;
801  temp = ks[15]; ks[15] = ks[31]; ks[31] = temp;
802  temp = ks[16]; ks[16] = ks[24]; ks[24] = temp;
803  temp = ks[17]; ks[17] = ks[25]; ks[25] = temp;
804  temp = ks[18]; ks[18] = ks[26]; ks[26] = temp;
805  temp = ks[19]; ks[19] = ks[27]; ks[27] = temp;
806
807  ks[ 4] = s_td0[s_te1[(ks[ 4] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 4] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 4] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 4] >>  0) & 0xff] & 0xff];
808  ks[ 5] = s_td0[s_te1[(ks[ 5] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 5] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 5] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 5] >>  0) & 0xff] & 0xff];
809  ks[ 6] = s_td0[s_te1[(ks[ 6] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 6] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 6] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 6] >>  0) & 0xff] & 0xff];
810  ks[ 7] = s_td0[s_te1[(ks[ 7] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 7] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 7] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 7] >>  0) & 0xff] & 0xff];
811  ks[ 8] = s_td0[s_te1[(ks[ 8] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 8] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 8] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 8] >>  0) & 0xff] & 0xff];
812  ks[ 9] = s_td0[s_te1[(ks[ 9] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 9] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 9] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 9] >>  0) & 0xff] & 0xff];
813  ks[10] = s_td0[s_te1[(ks[10] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[10] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[10] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[10] >>  0) & 0xff] & 0xff];
814  ks[11] = s_td0[s_te1[(ks[11] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[11] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[11] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[11] >>  0) & 0xff] & 0xff];
815  ks[12] = s_td0[s_te1[(ks[12] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[12] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[12] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[12] >>  0) & 0xff] & 0xff];
816  ks[13] = s_td0[s_te1[(ks[13] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[13] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[13] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[13] >>  0) & 0xff] & 0xff];
817  ks[14] = s_td0[s_te1[(ks[14] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[14] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[14] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[14] >>  0) & 0xff] & 0xff];
818  ks[15] = s_td0[s_te1[(ks[15] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[15] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[15] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[15] >>  0) & 0xff] & 0xff];
819  ks[16] = s_td0[s_te1[(ks[16] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[16] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[16] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[16] >>  0) & 0xff] & 0xff];
820  ks[17] = s_td0[s_te1[(ks[17] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[17] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[17] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[17] >>  0) & 0xff] & 0xff];
821  ks[18] = s_td0[s_te1[(ks[18] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[18] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[18] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[18] >>  0) & 0xff] & 0xff];
822  ks[19] = s_td0[s_te1[(ks[19] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[19] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[19] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[19] >>  0) & 0xff] & 0xff];
823  ks[20] = s_td0[s_te1[(ks[20] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[20] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[20] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[20] >>  0) & 0xff] & 0xff];
824  ks[21] = s_td0[s_te1[(ks[21] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[21] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[21] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[21] >>  0) & 0xff] & 0xff];
825  ks[22] = s_td0[s_te1[(ks[22] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[22] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[22] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[22] >>  0) & 0xff] & 0xff];
826  ks[23] = s_td0[s_te1[(ks[23] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[23] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[23] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[23] >>  0) & 0xff] & 0xff];
827  ks[24] = s_td0[s_te1[(ks[24] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[24] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[24] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[24] >>  0) & 0xff] & 0xff];
828  ks[25] = s_td0[s_te1[(ks[25] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[25] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[25] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[25] >>  0) & 0xff] & 0xff];
829  ks[26] = s_td0[s_te1[(ks[26] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[26] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[26] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[26] >>  0) & 0xff] & 0xff];
830  ks[27] = s_td0[s_te1[(ks[27] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[27] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[27] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[27] >>  0) & 0xff] & 0xff];
831  ks[28] = s_td0[s_te1[(ks[28] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[28] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[28] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[28] >>  0) & 0xff] & 0xff];
832  ks[29] = s_td0[s_te1[(ks[29] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[29] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[29] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[29] >>  0) & 0xff] & 0xff];
833  ks[30] = s_td0[s_te1[(ks[30] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[30] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[30] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[30] >>  0) & 0xff] & 0xff];
834  ks[31] = s_td0[s_te1[(ks[31] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[31] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[31] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[31] >>  0) & 0xff] & 0xff];
835  ks[32] = s_td0[s_te1[(ks[32] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[32] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[32] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[32] >>  0) & 0xff] & 0xff];
836  ks[33] = s_td0[s_te1[(ks[33] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[33] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[33] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[33] >>  0) & 0xff] & 0xff];
837  ks[34] = s_td0[s_te1[(ks[34] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[34] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[34] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[34] >>  0) & 0xff] & 0xff];
838  ks[35] = s_td0[s_te1[(ks[35] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[35] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[35] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[35] >>  0) & 0xff] & 0xff];
839  ks[36] = s_td0[s_te1[(ks[36] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[36] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[36] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[36] >>  0) & 0xff] & 0xff];
840  ks[37] = s_td0[s_te1[(ks[37] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[37] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[37] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[37] >>  0) & 0xff] & 0xff];
841  ks[38] = s_td0[s_te1[(ks[38] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[38] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[38] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[38] >>  0) & 0xff] & 0xff];
842  ks[39] = s_td0[s_te1[(ks[39] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[39] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[39] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[39] >>  0) & 0xff] & 0xff];
843}
844
845DECLSPEC void aes128_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3)
846{
847  u32 ukey_s[4];
848
849  ukey_s[0] = hc_swap32_S (ukey[0]);
850  ukey_s[1] = hc_swap32_S (ukey[1]);
851  ukey_s[2] = hc_swap32_S (ukey[2]);
852  ukey_s[3] = hc_swap32_S (ukey[3]);
853
854  aes128_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3);
855}
856
857DECLSPEC void aes128_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3)
858{
859  u32 ukey_s[4];
860
861  ukey_s[0] = hc_swap32_S (ukey[0]);
862  ukey_s[1] = hc_swap32_S (ukey[1]);
863  ukey_s[2] = hc_swap32_S (ukey[2]);
864  ukey_s[3] = hc_swap32_S (ukey[3]);
865
866  aes128_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3);
867
868  aes128_InvertKey (ks, s_te1, s_td0, s_td1, s_td2, s_td3);
869}
870
871DECLSPEC void aes128_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
872{
873  u32 in_s[4];
874
875  in_s[0] = hc_swap32_S (in[0]);
876  in_s[1] = hc_swap32_S (in[1]);
877  in_s[2] = hc_swap32_S (in[2]);
878  in_s[3] = hc_swap32_S (in[3]);
879
880  u32 s0 = in_s[0] ^ ks[0];
881  u32 s1 = in_s[1] ^ ks[1];
882  u32 s2 = in_s[2] ^ ks[2];
883  u32 s3 = in_s[3] ^ ks[3];
884
885  u32 t0;
886  u32 t1;
887  u32 t2;
888  u32 t3;
889
890  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[ 4];
891  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[ 5];
892  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[ 6];
893  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[ 7];
894  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[ 8];
895  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[ 9];
896  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[10];
897  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[11];
898  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[12];
899  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[13];
900  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[14];
901  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[15];
902  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[16];
903  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[17];
904  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[18];
905  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[19];
906  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[20];
907  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[21];
908  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[22];
909  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[23];
910  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[24];
911  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[25];
912  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[26];
913  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[27];
914  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[28];
915  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[29];
916  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[30];
917  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[31];
918  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[32];
919  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[33];
920  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[34];
921  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[35];
922  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[36];
923  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[37];
924  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[38];
925  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[39];
926
927  out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000)
928         ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000)
929         ^ (s_te4[(t2 >>  8) & 0xff] & 0x0000ff00)
930         ^ (s_te4[(t3 >>  0) & 0xff] & 0x000000ff)
931         ^ ks[40];
932
933  out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000)
934         ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000)
935         ^ (s_te4[(t3 >>  8) & 0xff] & 0x0000ff00)
936         ^ (s_te4[(t0 >>  0) & 0xff] & 0x000000ff)
937         ^ ks[41];
938
939  out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000)
940         ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000)
941         ^ (s_te4[(t0 >>  8) & 0xff] & 0x0000ff00)
942         ^ (s_te4[(t1 >>  0) & 0xff] & 0x000000ff)
943         ^ ks[42];
944
945  out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000)
946         ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000)
947         ^ (s_te4[(t1 >>  8) & 0xff] & 0x0000ff00)
948         ^ (s_te4[(t2 >>  0) & 0xff] & 0x000000ff)
949         ^ ks[43];
950
951  out[0] = hc_swap32_S (out[0]);
952  out[1] = hc_swap32_S (out[1]);
953  out[2] = hc_swap32_S (out[2]);
954  out[3] = hc_swap32_S (out[3]);
955}
956
957DECLSPEC void aes128_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4)
958{
959  u32 in_s[4];
960
961  in_s[0] = hc_swap32_S (in[0]);
962  in_s[1] = hc_swap32_S (in[1]);
963  in_s[2] = hc_swap32_S (in[2]);
964  in_s[3] = hc_swap32_S (in[3]);
965
966  u32 s0 = in_s[0] ^ ks[0];
967  u32 s1 = in_s[1] ^ ks[1];
968  u32 s2 = in_s[2] ^ ks[2];
969  u32 s3 = in_s[3] ^ ks[3];
970
971  u32 t0;
972  u32 t1;
973  u32 t2;
974  u32 t3;
975
976  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[ 4];
977  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[ 5];
978  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[ 6];
979  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[ 7];
980  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[ 8];
981  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[ 9];
982  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[10];
983  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[11];
984  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[12];
985  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[13];
986  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[14];
987  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[15];
988  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[16];
989  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[17];
990  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[18];
991  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[19];
992  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[20];
993  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[21];
994  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[22];
995  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[23];
996  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[24];
997  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[25];
998  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[26];
999  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[27];
1000  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[28];
1001  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[29];
1002  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[30];
1003  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[31];
1004  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[32];
1005  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[33];
1006  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[34];
1007  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[35];
1008  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[36];
1009  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[37];
1010  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[38];
1011  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[39];
1012
1013  out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000)
1014         ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000)
1015         ^ (s_td4[(t2 >>  8) & 0xff] & 0x0000ff00)
1016         ^ (s_td4[(t1 >>  0) & 0xff] & 0x000000ff)
1017         ^ ks[40];
1018
1019  out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000)
1020         ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000)
1021         ^ (s_td4[(t3 >>  8) & 0xff] & 0x0000ff00)
1022         ^ (s_td4[(t2 >>  0) & 0xff] & 0x000000ff)
1023         ^ ks[41];
1024
1025  out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000)
1026         ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000)
1027         ^ (s_td4[(t0 >>  8) & 0xff] & 0x0000ff00)
1028         ^ (s_td4[(t3 >>  0) & 0xff] & 0x000000ff)
1029         ^ ks[42];
1030
1031  out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000)
1032         ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000)
1033         ^ (s_td4[(t1 >>  8) & 0xff] & 0x0000ff00)
1034         ^ (s_td4[(t0 >>  0) & 0xff] & 0x000000ff)
1035         ^ ks[43];
1036
1037  out[0] = hc_swap32_S (out[0]);
1038  out[1] = hc_swap32_S (out[1]);
1039  out[2] = hc_swap32_S (out[2]);
1040  out[3] = hc_swap32_S (out[3]);
1041}
1042
1043// 192 bit key
1044
1045DECLSPEC void aes192_ExpandKey (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3)
1046{
1047  ks[ 0] = ukey[0];
1048  ks[ 1] = ukey[1];
1049  ks[ 2] = ukey[2];
1050  ks[ 3] = ukey[3];
1051  ks[ 4] = ukey[4];
1052  ks[ 5] = ukey[5];
1053  ks[ 6] = ks[ 0] ^ 0x01000000
1054                  ^ (s_te2[(ks[ 5] >> 16) & 0xff] & 0xff000000)
1055                  ^ (s_te3[(ks[ 5] >>  8) & 0xff] & 0x00ff0000)
1056                  ^ (s_te0[(ks[ 5] >>  0) & 0xff] & 0x0000ff00)
1057                  ^ (s_te1[(ks[ 5] >> 24) & 0xff] & 0x000000ff);
1058  ks[ 7] = ks[ 1] ^ ks[ 6];
1059  ks[ 8] = ks[ 2] ^ ks[ 7];
1060  ks[ 9] = ks[ 3] ^ ks[ 8];
1061  ks[10] = ks[ 4] ^ ks[ 9];
1062  ks[11] = ks[ 5] ^ ks[10];
1063  ks[12] = ks[ 6] ^ 0x02000000
1064                  ^ (s_te2[(ks[11] >> 16) & 0xff] & 0xff000000)
1065                  ^ (s_te3[(ks[11] >>  8) & 0xff] & 0x00ff0000)
1066                  ^ (s_te0[(ks[11] >>  0) & 0xff] & 0x0000ff00)
1067                  ^ (s_te1[(ks[11] >> 24) & 0xff] & 0x000000ff);
1068  ks[13] = ks[ 7] ^ ks[12];
1069  ks[14] = ks[ 8] ^ ks[13];
1070  ks[15] = ks[ 9] ^ ks[14];
1071  ks[16] = ks[10] ^ ks[15];
1072  ks[17] = ks[11] ^ ks[16];
1073  ks[18] = ks[12] ^ 0x04000000
1074                  ^ (s_te2[(ks[17] >> 16) & 0xff] & 0xff000000)
1075                  ^ (s_te3[(ks[17] >>  8) & 0xff] & 0x00ff0000)
1076                  ^ (s_te0[(ks[17] >>  0) & 0xff] & 0x0000ff00)
1077                  ^ (s_te1[(ks[17] >> 24) & 0xff] & 0x000000ff);
1078  ks[19] = ks[13] ^ ks[18];
1079  ks[20] = ks[14] ^ ks[19];
1080  ks[21] = ks[15] ^ ks[20];
1081  ks[22] = ks[16] ^ ks[21];
1082  ks[23] = ks[17] ^ ks[22];
1083  ks[24] = ks[18] ^ 0x08000000
1084                  ^ (s_te2[(ks[23] >> 16) & 0xff] & 0xff000000)
1085                  ^ (s_te3[(ks[23] >>  8) & 0xff] & 0x00ff0000)
1086                  ^ (s_te0[(ks[23] >>  0) & 0xff] & 0x0000ff00)
1087                  ^ (s_te1[(ks[23] >> 24) & 0xff] & 0x000000ff);
1088  ks[25] = ks[19] ^ ks[24];
1089  ks[26] = ks[20] ^ ks[25];
1090  ks[27] = ks[21] ^ ks[26];
1091  ks[28] = ks[22] ^ ks[27];
1092  ks[29] = ks[23] ^ ks[28];
1093  ks[30] = ks[24] ^ 0x10000000
1094                  ^ (s_te2[(ks[29] >> 16) & 0xff] & 0xff000000)
1095                  ^ (s_te3[(ks[29] >>  8) & 0xff] & 0x00ff0000)
1096                  ^ (s_te0[(ks[29] >>  0) & 0xff] & 0x0000ff00)
1097                  ^ (s_te1[(ks[29] >> 24) & 0xff] & 0x000000ff);
1098  ks[31] = ks[25] ^ ks[30];
1099  ks[32] = ks[26] ^ ks[31];
1100  ks[33] = ks[27] ^ ks[32];
1101  ks[34] = ks[28] ^ ks[33];
1102  ks[35] = ks[29] ^ ks[34];
1103  ks[36] = ks[30] ^ 0x20000000
1104                  ^ (s_te2[(ks[35] >> 16) & 0xff] & 0xff000000)
1105                  ^ (s_te3[(ks[35] >>  8) & 0xff] & 0x00ff0000)
1106                  ^ (s_te0[(ks[35] >>  0) & 0xff] & 0x0000ff00)
1107                  ^ (s_te1[(ks[35] >> 24) & 0xff] & 0x000000ff);
1108  ks[37] = ks[31] ^ ks[36];
1109  ks[38] = ks[32] ^ ks[37];
1110  ks[39] = ks[33] ^ ks[38];
1111  ks[40] = ks[34] ^ ks[39];
1112  ks[41] = ks[35] ^ ks[40];
1113  ks[42] = ks[36] ^ 0x40000000
1114                  ^ (s_te2[(ks[41] >> 16) & 0xff] & 0xff000000)
1115                  ^ (s_te3[(ks[41] >>  8) & 0xff] & 0x00ff0000)
1116                  ^ (s_te0[(ks[41] >>  0) & 0xff] & 0x0000ff00)
1117                  ^ (s_te1[(ks[41] >> 24) & 0xff] & 0x000000ff);
1118  ks[43] = ks[37] ^ ks[42];
1119  ks[44] = ks[38] ^ ks[43];
1120  ks[45] = ks[39] ^ ks[44];
1121  ks[46] = ks[40] ^ ks[45];
1122  ks[47] = ks[41] ^ ks[46];
1123  ks[48] = ks[42] ^ 0x80000000
1124                  ^ (s_te2[(ks[47] >> 16) & 0xff] & 0xff000000)
1125                  ^ (s_te3[(ks[47] >>  8) & 0xff] & 0x00ff0000)
1126                  ^ (s_te0[(ks[47] >>  0) & 0xff] & 0x0000ff00)
1127                  ^ (s_te1[(ks[47] >> 24) & 0xff] & 0x000000ff);
1128  ks[49] = ks[43] ^ ks[48];
1129  ks[50] = ks[44] ^ ks[49];
1130  ks[51] = ks[45] ^ ks[50];
1131}
1132
1133DECLSPEC void aes192_InvertKey (u32 *ks, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3)
1134{
1135  u32 temp;
1136
1137  temp = ks[ 0]; ks[ 0] = ks[48]; ks[48] = temp;
1138  temp = ks[ 1]; ks[ 1] = ks[49]; ks[49] = temp;
1139  temp = ks[ 2]; ks[ 2] = ks[50]; ks[50] = temp;
1140  temp = ks[ 3]; ks[ 3] = ks[51]; ks[51] = temp;
1141  temp = ks[ 4]; ks[ 4] = ks[44]; ks[44] = temp;
1142  temp = ks[ 5]; ks[ 5] = ks[45]; ks[45] = temp;
1143  temp = ks[ 6]; ks[ 6] = ks[46]; ks[46] = temp;
1144  temp = ks[ 7]; ks[ 7] = ks[47]; ks[47] = temp;
1145  temp = ks[ 8]; ks[ 8] = ks[40]; ks[40] = temp;
1146  temp = ks[ 9]; ks[ 9] = ks[41]; ks[41] = temp;
1147  temp = ks[10]; ks[10] = ks[42]; ks[42] = temp;
1148  temp = ks[11]; ks[11] = ks[43]; ks[43] = temp;
1149  temp = ks[12]; ks[12] = ks[36]; ks[36] = temp;
1150  temp = ks[13]; ks[13] = ks[37]; ks[37] = temp;
1151  temp = ks[14]; ks[14] = ks[38]; ks[38] = temp;
1152  temp = ks[15]; ks[15] = ks[39]; ks[39] = temp;
1153  temp = ks[16]; ks[16] = ks[32]; ks[32] = temp;
1154  temp = ks[17]; ks[17] = ks[33]; ks[33] = temp;
1155  temp = ks[18]; ks[18] = ks[34]; ks[34] = temp;
1156  temp = ks[19]; ks[19] = ks[35]; ks[35] = temp;
1157  temp = ks[20]; ks[20] = ks[28]; ks[28] = temp;
1158  temp = ks[21]; ks[21] = ks[29]; ks[29] = temp;
1159  temp = ks[22]; ks[22] = ks[30]; ks[30] = temp;
1160  temp = ks[23]; ks[23] = ks[31]; ks[31] = temp;
1161
1162  ks[ 4] = s_td0[s_te1[(ks[ 4] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 4] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 4] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 4] >>  0) & 0xff] & 0xff];
1163  ks[ 5] = s_td0[s_te1[(ks[ 5] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 5] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 5] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 5] >>  0) & 0xff] & 0xff];
1164  ks[ 6] = s_td0[s_te1[(ks[ 6] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 6] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 6] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 6] >>  0) & 0xff] & 0xff];
1165  ks[ 7] = s_td0[s_te1[(ks[ 7] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 7] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 7] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 7] >>  0) & 0xff] & 0xff];
1166  ks[ 8] = s_td0[s_te1[(ks[ 8] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 8] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 8] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 8] >>  0) & 0xff] & 0xff];
1167  ks[ 9] = s_td0[s_te1[(ks[ 9] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 9] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 9] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 9] >>  0) & 0xff] & 0xff];
1168  ks[10] = s_td0[s_te1[(ks[10] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[10] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[10] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[10] >>  0) & 0xff] & 0xff];
1169  ks[11] = s_td0[s_te1[(ks[11] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[11] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[11] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[11] >>  0) & 0xff] & 0xff];
1170  ks[12] = s_td0[s_te1[(ks[12] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[12] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[12] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[12] >>  0) & 0xff] & 0xff];
1171  ks[13] = s_td0[s_te1[(ks[13] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[13] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[13] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[13] >>  0) & 0xff] & 0xff];
1172  ks[14] = s_td0[s_te1[(ks[14] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[14] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[14] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[14] >>  0) & 0xff] & 0xff];
1173  ks[15] = s_td0[s_te1[(ks[15] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[15] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[15] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[15] >>  0) & 0xff] & 0xff];
1174  ks[16] = s_td0[s_te1[(ks[16] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[16] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[16] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[16] >>  0) & 0xff] & 0xff];
1175  ks[17] = s_td0[s_te1[(ks[17] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[17] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[17] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[17] >>  0) & 0xff] & 0xff];
1176  ks[18] = s_td0[s_te1[(ks[18] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[18] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[18] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[18] >>  0) & 0xff] & 0xff];
1177  ks[19] = s_td0[s_te1[(ks[19] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[19] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[19] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[19] >>  0) & 0xff] & 0xff];
1178  ks[20] = s_td0[s_te1[(ks[20] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[20] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[20] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[20] >>  0) & 0xff] & 0xff];
1179  ks[21] = s_td0[s_te1[(ks[21] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[21] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[21] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[21] >>  0) & 0xff] & 0xff];
1180  ks[22] = s_td0[s_te1[(ks[22] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[22] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[22] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[22] >>  0) & 0xff] & 0xff];
1181  ks[23] = s_td0[s_te1[(ks[23] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[23] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[23] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[23] >>  0) & 0xff] & 0xff];
1182  ks[24] = s_td0[s_te1[(ks[24] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[24] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[24] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[24] >>  0) & 0xff] & 0xff];
1183  ks[25] = s_td0[s_te1[(ks[25] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[25] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[25] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[25] >>  0) & 0xff] & 0xff];
1184  ks[26] = s_td0[s_te1[(ks[26] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[26] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[26] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[26] >>  0) & 0xff] & 0xff];
1185  ks[27] = s_td0[s_te1[(ks[27] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[27] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[27] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[27] >>  0) & 0xff] & 0xff];
1186  ks[28] = s_td0[s_te1[(ks[28] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[28] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[28] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[28] >>  0) & 0xff] & 0xff];
1187  ks[29] = s_td0[s_te1[(ks[29] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[29] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[29] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[29] >>  0) & 0xff] & 0xff];
1188  ks[30] = s_td0[s_te1[(ks[30] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[30] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[30] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[30] >>  0) & 0xff] & 0xff];
1189  ks[31] = s_td0[s_te1[(ks[31] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[31] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[31] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[31] >>  0) & 0xff] & 0xff];
1190  ks[32] = s_td0[s_te1[(ks[32] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[32] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[32] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[32] >>  0) & 0xff] & 0xff];
1191  ks[33] = s_td0[s_te1[(ks[33] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[33] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[33] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[33] >>  0) & 0xff] & 0xff];
1192  ks[34] = s_td0[s_te1[(ks[34] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[34] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[34] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[34] >>  0) & 0xff] & 0xff];
1193  ks[35] = s_td0[s_te1[(ks[35] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[35] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[35] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[35] >>  0) & 0xff] & 0xff];
1194  ks[36] = s_td0[s_te1[(ks[36] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[36] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[36] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[36] >>  0) & 0xff] & 0xff];
1195  ks[37] = s_td0[s_te1[(ks[37] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[37] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[37] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[37] >>  0) & 0xff] & 0xff];
1196  ks[38] = s_td0[s_te1[(ks[38] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[38] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[38] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[38] >>  0) & 0xff] & 0xff];
1197  ks[39] = s_td0[s_te1[(ks[39] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[39] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[39] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[39] >>  0) & 0xff] & 0xff];
1198  ks[40] = s_td0[s_te1[(ks[40] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[40] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[40] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[40] >>  0) & 0xff] & 0xff];
1199  ks[41] = s_td0[s_te1[(ks[41] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[41] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[41] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[41] >>  0) & 0xff] & 0xff];
1200  ks[42] = s_td0[s_te1[(ks[42] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[42] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[42] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[42] >>  0) & 0xff] & 0xff];
1201  ks[43] = s_td0[s_te1[(ks[43] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[43] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[43] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[43] >>  0) & 0xff] & 0xff];
1202  ks[44] = s_td0[s_te1[(ks[44] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[44] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[44] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[44] >>  0) & 0xff] & 0xff];
1203  ks[45] = s_td0[s_te1[(ks[45] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[45] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[45] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[45] >>  0) & 0xff] & 0xff];
1204  ks[46] = s_td0[s_te1[(ks[46] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[46] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[46] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[46] >>  0) & 0xff] & 0xff];
1205  ks[47] = s_td0[s_te1[(ks[47] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[47] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[47] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[47] >>  0) & 0xff] & 0xff];
1206}
1207
1208DECLSPEC void aes192_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3)
1209{
1210  u32 ukey_s[6];
1211
1212  ukey_s[0] = hc_swap32_S (ukey[0]);
1213  ukey_s[1] = hc_swap32_S (ukey[1]);
1214  ukey_s[2] = hc_swap32_S (ukey[2]);
1215  ukey_s[3] = hc_swap32_S (ukey[3]);
1216  ukey_s[4] = hc_swap32_S (ukey[4]);
1217  ukey_s[5] = hc_swap32_S (ukey[5]);
1218
1219  aes192_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3);
1220}
1221
1222DECLSPEC void aes192_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3)
1223{
1224  u32 ukey_s[6];
1225
1226  ukey_s[0] = hc_swap32_S (ukey[0]);
1227  ukey_s[1] = hc_swap32_S (ukey[1]);
1228  ukey_s[2] = hc_swap32_S (ukey[2]);
1229  ukey_s[3] = hc_swap32_S (ukey[3]);
1230  ukey_s[4] = hc_swap32_S (ukey[4]);
1231  ukey_s[5] = hc_swap32_S (ukey[5]);
1232
1233  aes192_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3);
1234
1235  aes192_InvertKey (ks, s_te1, s_td0, s_td1, s_td2, s_td3);
1236}
1237
1238DECLSPEC void aes192_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
1239{
1240  u32 in_s[4];
1241
1242  in_s[0] = hc_swap32_S (in[0]);
1243  in_s[1] = hc_swap32_S (in[1]);
1244  in_s[2] = hc_swap32_S (in[2]);
1245  in_s[3] = hc_swap32_S (in[3]);
1246
1247  u32 s0 = in_s[0] ^ ks[0];
1248  u32 s1 = in_s[1] ^ ks[1];
1249  u32 s2 = in_s[2] ^ ks[2];
1250  u32 s3 = in_s[3] ^ ks[3];
1251
1252  u32 t0;
1253  u32 t1;
1254  u32 t2;
1255  u32 t3;
1256
1257  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[ 4];
1258  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[ 5];
1259  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[ 6];
1260  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[ 7];
1261  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[ 8];
1262  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[ 9];
1263  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[10];
1264  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[11];
1265  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[12];
1266  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[13];
1267  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[14];
1268  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[15];
1269  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[16];
1270  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[17];
1271  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[18];
1272  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[19];
1273  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[20];
1274  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[21];
1275  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[22];
1276  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[23];
1277  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[24];
1278  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[25];
1279  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[26];
1280  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[27];
1281  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[28];
1282  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[29];
1283  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[30];
1284  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[31];
1285  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[32];
1286  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[33];
1287  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[34];
1288  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[35];
1289  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[36];
1290  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[37];
1291  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[38];
1292  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[39];
1293  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[40];
1294  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[41];
1295  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[42];
1296  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[43];
1297  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[44];
1298  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[45];
1299  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[46];
1300  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[47];
1301
1302  out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000)
1303         ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000)
1304         ^ (s_te4[(t2 >>  8) & 0xff] & 0x0000ff00)
1305         ^ (s_te4[(t3 >>  0) & 0xff] & 0x000000ff)
1306         ^ ks[48];
1307
1308  out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000)
1309         ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000)
1310         ^ (s_te4[(t3 >>  8) & 0xff] & 0x0000ff00)
1311         ^ (s_te4[(t0 >>  0) & 0xff] & 0x000000ff)
1312         ^ ks[49];
1313
1314  out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000)
1315         ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000)
1316         ^ (s_te4[(t0 >>  8) & 0xff] & 0x0000ff00)
1317         ^ (s_te4[(t1 >>  0) & 0xff] & 0x000000ff)
1318         ^ ks[50];
1319
1320  out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000)
1321         ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000)
1322         ^ (s_te4[(t1 >>  8) & 0xff] & 0x0000ff00)
1323         ^ (s_te4[(t2 >>  0) & 0xff] & 0x000000ff)
1324         ^ ks[51];
1325
1326  out[0] = hc_swap32_S (out[0]);
1327  out[1] = hc_swap32_S (out[1]);
1328  out[2] = hc_swap32_S (out[2]);
1329  out[3] = hc_swap32_S (out[3]);
1330}
1331
1332DECLSPEC void aes192_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4)
1333{
1334  u32 in_s[4];
1335
1336  in_s[0] = hc_swap32_S (in[0]);
1337  in_s[1] = hc_swap32_S (in[1]);
1338  in_s[2] = hc_swap32_S (in[2]);
1339  in_s[3] = hc_swap32_S (in[3]);
1340
1341  u32 s0 = in_s[0] ^ ks[0];
1342  u32 s1 = in_s[1] ^ ks[1];
1343  u32 s2 = in_s[2] ^ ks[2];
1344  u32 s3 = in_s[3] ^ ks[3];
1345
1346  u32 t0;
1347  u32 t1;
1348  u32 t2;
1349  u32 t3;
1350
1351  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[ 4];
1352  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[ 5];
1353  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[ 6];
1354  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[ 7];
1355  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[ 8];
1356  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[ 9];
1357  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[10];
1358  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[11];
1359  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[12];
1360  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[13];
1361  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[14];
1362  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[15];
1363  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[16];
1364  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[17];
1365  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[18];
1366  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[19];
1367  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[20];
1368  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[21];
1369  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[22];
1370  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[23];
1371  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[24];
1372  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[25];
1373  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[26];
1374  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[27];
1375  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[28];
1376  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[29];
1377  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[30];
1378  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[31];
1379  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[32];
1380  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[33];
1381  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[34];
1382  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[35];
1383  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[36];
1384  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[37];
1385  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[38];
1386  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[39];
1387  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[40];
1388  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[41];
1389  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[42];
1390  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[43];
1391  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[44];
1392  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[45];
1393  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[46];
1394  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[47];
1395
1396  out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000)
1397         ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000)
1398         ^ (s_td4[(t2 >>  8) & 0xff] & 0x0000ff00)
1399         ^ (s_td4[(t1 >>  0) & 0xff] & 0x000000ff)
1400         ^ ks[48];
1401
1402  out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000)
1403         ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000)
1404         ^ (s_td4[(t3 >>  8) & 0xff] & 0x0000ff00)
1405         ^ (s_td4[(t2 >>  0) & 0xff] & 0x000000ff)
1406         ^ ks[49];
1407
1408  out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000)
1409         ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000)
1410         ^ (s_td4[(t0 >>  8) & 0xff] & 0x0000ff00)
1411         ^ (s_td4[(t3 >>  0) & 0xff] & 0x000000ff)
1412         ^ ks[50];
1413
1414  out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000)
1415         ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000)
1416         ^ (s_td4[(t1 >>  8) & 0xff] & 0x0000ff00)
1417         ^ (s_td4[(t0 >>  0) & 0xff] & 0x000000ff)
1418         ^ ks[51];
1419
1420  out[0] = hc_swap32_S (out[0]);
1421  out[1] = hc_swap32_S (out[1]);
1422  out[2] = hc_swap32_S (out[2]);
1423  out[3] = hc_swap32_S (out[3]);
1424}
1425
1426// 256 bit key
1427
1428DECLSPEC void aes256_ExpandKey (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3)
1429{
1430  ks[ 0] = ukey[0];
1431  ks[ 1] = ukey[1];
1432  ks[ 2] = ukey[2];
1433  ks[ 3] = ukey[3];
1434  ks[ 4] = ukey[4];
1435  ks[ 5] = ukey[5];
1436  ks[ 6] = ukey[6];
1437  ks[ 7] = ukey[7];
1438  ks[ 8] = ks[ 0] ^ 0x01000000
1439                  ^ (s_te2[(ks[ 7] >> 16) & 0xff] & 0xff000000)
1440                  ^ (s_te3[(ks[ 7] >>  8) & 0xff] & 0x00ff0000)
1441                  ^ (s_te0[(ks[ 7] >>  0) & 0xff] & 0x0000ff00)
1442                  ^ (s_te1[(ks[ 7] >> 24) & 0xff] & 0x000000ff);
1443  ks[ 9] = ks[ 1] ^ ks[ 8];
1444  ks[10] = ks[ 2] ^ ks[ 9];
1445  ks[11] = ks[ 3] ^ ks[10];
1446  ks[12] = ks[ 4] ^ 0
1447                  ^ (s_te2[(ks[11] >> 24) & 0xff] & 0xff000000)
1448                  ^ (s_te3[(ks[11] >> 16) & 0xff] & 0x00ff0000)
1449                  ^ (s_te0[(ks[11] >>  8) & 0xff] & 0x0000ff00)
1450                  ^ (s_te1[(ks[11] >>  0) & 0xff] & 0x000000ff);
1451  ks[13] = ks[ 5] ^ ks[12];
1452  ks[14] = ks[ 6] ^ ks[13];
1453  ks[15] = ks[ 7] ^ ks[14];
1454  ks[16] = ks[ 8] ^ 0x02000000
1455                  ^ (s_te2[(ks[15] >> 16) & 0xff] & 0xff000000)
1456                  ^ (s_te3[(ks[15] >>  8) & 0xff] & 0x00ff0000)
1457                  ^ (s_te0[(ks[15] >>  0) & 0xff] & 0x0000ff00)
1458                  ^ (s_te1[(ks[15] >> 24) & 0xff] & 0x000000ff);
1459  ks[17] = ks[ 9] ^ ks[16];
1460  ks[18] = ks[10] ^ ks[17];
1461  ks[19] = ks[11] ^ ks[18];
1462  ks[20] = ks[12] ^ 0
1463                  ^ (s_te2[(ks[19] >> 24) & 0xff] & 0xff000000)
1464                  ^ (s_te3[(ks[19] >> 16) & 0xff] & 0x00ff0000)
1465                  ^ (s_te0[(ks[19] >>  8) & 0xff] & 0x0000ff00)
1466                  ^ (s_te1[(ks[19] >>  0) & 0xff] & 0x000000ff);
1467  ks[21] = ks[13] ^ ks[20];
1468  ks[22] = ks[14] ^ ks[21];
1469  ks[23] = ks[15] ^ ks[22];
1470  ks[24] = ks[16] ^ 0x04000000
1471                  ^ (s_te2[(ks[23] >> 16) & 0xff] & 0xff000000)
1472                  ^ (s_te3[(ks[23] >>  8) & 0xff] & 0x00ff0000)
1473                  ^ (s_te0[(ks[23] >>  0) & 0xff] & 0x0000ff00)
1474                  ^ (s_te1[(ks[23] >> 24) & 0xff] & 0x000000ff);
1475  ks[25] = ks[17] ^ ks[24];
1476  ks[26] = ks[18] ^ ks[25];
1477  ks[27] = ks[19] ^ ks[26];
1478  ks[28] = ks[20] ^ 0
1479                  ^ (s_te2[(ks[27] >> 24) & 0xff] & 0xff000000)
1480                  ^ (s_te3[(ks[27] >> 16) & 0xff] & 0x00ff0000)
1481                  ^ (s_te0[(ks[27] >>  8) & 0xff] & 0x0000ff00)
1482                  ^ (s_te1[(ks[27] >>  0) & 0xff] & 0x000000ff);
1483  ks[29] = ks[21] ^ ks[28];
1484  ks[30] = ks[22] ^ ks[29];
1485  ks[31] = ks[23] ^ ks[30];
1486  ks[32] = ks[24] ^ 0x08000000
1487                  ^ (s_te2[(ks[31] >> 16) & 0xff] & 0xff000000)
1488                  ^ (s_te3[(ks[31] >>  8) & 0xff] & 0x00ff0000)
1489                  ^ (s_te0[(ks[31] >>  0) & 0xff] & 0x0000ff00)
1490                  ^ (s_te1[(ks[31] >> 24) & 0xff] & 0x000000ff);
1491  ks[33] = ks[25] ^ ks[32];
1492  ks[34] = ks[26] ^ ks[33];
1493  ks[35] = ks[27] ^ ks[34];
1494  ks[36] = ks[28] ^ 0
1495                  ^ (s_te2[(ks[35] >> 24) & 0xff] & 0xff000000)
1496                  ^ (s_te3[(ks[35] >> 16) & 0xff] & 0x00ff0000)
1497                  ^ (s_te0[(ks[35] >>  8) & 0xff] & 0x0000ff00)
1498                  ^ (s_te1[(ks[35] >>  0) & 0xff] & 0x000000ff);
1499  ks[37] = ks[29] ^ ks[36];
1500  ks[38] = ks[30] ^ ks[37];
1501  ks[39] = ks[31] ^ ks[38];
1502  ks[40] = ks[32] ^ 0x10000000
1503                  ^ (s_te2[(ks[39] >> 16) & 0xff] & 0xff000000)
1504                  ^ (s_te3[(ks[39] >>  8) & 0xff] & 0x00ff0000)
1505                  ^ (s_te0[(ks[39] >>  0) & 0xff] & 0x0000ff00)
1506                  ^ (s_te1[(ks[39] >> 24) & 0xff] & 0x000000ff);
1507  ks[41] = ks[33] ^ ks[40];
1508  ks[42] = ks[34] ^ ks[41];
1509  ks[43] = ks[35] ^ ks[42];
1510  ks[44] = ks[36] ^ 0
1511                  ^ (s_te2[(ks[43] >> 24) & 0xff] & 0xff000000)
1512                  ^ (s_te3[(ks[43] >> 16) & 0xff] & 0x00ff0000)
1513                  ^ (s_te0[(ks[43] >>  8) & 0xff] & 0x0000ff00)
1514                  ^ (s_te1[(ks[43] >>  0) & 0xff] & 0x000000ff);
1515  ks[45] = ks[37] ^ ks[44];
1516  ks[46] = ks[38] ^ ks[45];
1517  ks[47] = ks[39] ^ ks[46];
1518  ks[48] = ks[40] ^ 0x20000000
1519                  ^ (s_te2[(ks[47] >> 16) & 0xff] & 0xff000000)
1520                  ^ (s_te3[(ks[47] >>  8) & 0xff] & 0x00ff0000)
1521                  ^ (s_te0[(ks[47] >>  0) & 0xff] & 0x0000ff00)
1522                  ^ (s_te1[(ks[47] >> 24) & 0xff] & 0x000000ff);
1523  ks[49] = ks[41] ^ ks[48];
1524  ks[50] = ks[42] ^ ks[49];
1525  ks[51] = ks[43] ^ ks[50];
1526  ks[52] = ks[44] ^ 0
1527                  ^ (s_te2[(ks[51] >> 24) & 0xff] & 0xff000000)
1528                  ^ (s_te3[(ks[51] >> 16) & 0xff] & 0x00ff0000)
1529                  ^ (s_te0[(ks[51] >>  8) & 0xff] & 0x0000ff00)
1530                  ^ (s_te1[(ks[51] >>  0) & 0xff] & 0x000000ff);
1531  ks[53] = ks[45] ^ ks[52];
1532  ks[54] = ks[46] ^ ks[53];
1533  ks[55] = ks[47] ^ ks[54];
1534  ks[56] = ks[48] ^ 0x40000000
1535                  ^ (s_te2[(ks[55] >> 16) & 0xff] & 0xff000000)
1536                  ^ (s_te3[(ks[55] >>  8) & 0xff] & 0x00ff0000)
1537                  ^ (s_te0[(ks[55] >>  0) & 0xff] & 0x0000ff00)
1538                  ^ (s_te1[(ks[55] >> 24) & 0xff] & 0x000000ff);
1539  ks[57] = ks[49] ^ ks[56];
1540  ks[58] = ks[50] ^ ks[57];
1541  ks[59] = ks[51] ^ ks[58];
1542}
1543
1544DECLSPEC void aes256_InvertKey (u32 *ks, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3)
1545{
1546  u32 temp;
1547
1548  temp = ks[ 0]; ks[ 0] = ks[56]; ks[56] = temp;
1549  temp = ks[ 1]; ks[ 1] = ks[57]; ks[57] = temp;
1550  temp = ks[ 2]; ks[ 2] = ks[58]; ks[58] = temp;
1551  temp = ks[ 3]; ks[ 3] = ks[59]; ks[59] = temp;
1552  temp = ks[ 4]; ks[ 4] = ks[52]; ks[52] = temp;
1553  temp = ks[ 5]; ks[ 5] = ks[53]; ks[53] = temp;
1554  temp = ks[ 6]; ks[ 6] = ks[54]; ks[54] = temp;
1555  temp = ks[ 7]; ks[ 7] = ks[55]; ks[55] = temp;
1556  temp = ks[ 8]; ks[ 8] = ks[48]; ks[48] = temp;
1557  temp = ks[ 9]; ks[ 9] = ks[49]; ks[49] = temp;
1558  temp = ks[10]; ks[10] = ks[50]; ks[50] = temp;
1559  temp = ks[11]; ks[11] = ks[51]; ks[51] = temp;
1560  temp = ks[12]; ks[12] = ks[44]; ks[44] = temp;
1561  temp = ks[13]; ks[13] = ks[45]; ks[45] = temp;
1562  temp = ks[14]; ks[14] = ks[46]; ks[46] = temp;
1563  temp = ks[15]; ks[15] = ks[47]; ks[47] = temp;
1564  temp = ks[16]; ks[16] = ks[40]; ks[40] = temp;
1565  temp = ks[17]; ks[17] = ks[41]; ks[41] = temp;
1566  temp = ks[18]; ks[18] = ks[42]; ks[42] = temp;
1567  temp = ks[19]; ks[19] = ks[43]; ks[43] = temp;
1568  temp = ks[20]; ks[20] = ks[36]; ks[36] = temp;
1569  temp = ks[21]; ks[21] = ks[37]; ks[37] = temp;
1570  temp = ks[22]; ks[22] = ks[38]; ks[38] = temp;
1571  temp = ks[23]; ks[23] = ks[39]; ks[39] = temp;
1572  temp = ks[24]; ks[24] = ks[32]; ks[32] = temp;
1573  temp = ks[25]; ks[25] = ks[33]; ks[33] = temp;
1574  temp = ks[26]; ks[26] = ks[34]; ks[34] = temp;
1575  temp = ks[27]; ks[27] = ks[35]; ks[35] = temp;
1576
1577  ks[ 4] = s_td0[s_te1[(ks[ 4] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 4] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 4] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 4] >>  0) & 0xff] & 0xff];
1578  ks[ 5] = s_td0[s_te1[(ks[ 5] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 5] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 5] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 5] >>  0) & 0xff] & 0xff];
1579  ks[ 6] = s_td0[s_te1[(ks[ 6] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 6] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 6] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 6] >>  0) & 0xff] & 0xff];
1580  ks[ 7] = s_td0[s_te1[(ks[ 7] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 7] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 7] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 7] >>  0) & 0xff] & 0xff];
1581  ks[ 8] = s_td0[s_te1[(ks[ 8] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 8] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 8] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 8] >>  0) & 0xff] & 0xff];
1582  ks[ 9] = s_td0[s_te1[(ks[ 9] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[ 9] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[ 9] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[ 9] >>  0) & 0xff] & 0xff];
1583  ks[10] = s_td0[s_te1[(ks[10] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[10] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[10] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[10] >>  0) & 0xff] & 0xff];
1584  ks[11] = s_td0[s_te1[(ks[11] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[11] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[11] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[11] >>  0) & 0xff] & 0xff];
1585  ks[12] = s_td0[s_te1[(ks[12] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[12] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[12] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[12] >>  0) & 0xff] & 0xff];
1586  ks[13] = s_td0[s_te1[(ks[13] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[13] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[13] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[13] >>  0) & 0xff] & 0xff];
1587  ks[14] = s_td0[s_te1[(ks[14] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[14] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[14] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[14] >>  0) & 0xff] & 0xff];
1588  ks[15] = s_td0[s_te1[(ks[15] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[15] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[15] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[15] >>  0) & 0xff] & 0xff];
1589  ks[16] = s_td0[s_te1[(ks[16] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[16] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[16] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[16] >>  0) & 0xff] & 0xff];
1590  ks[17] = s_td0[s_te1[(ks[17] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[17] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[17] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[17] >>  0) & 0xff] & 0xff];
1591  ks[18] = s_td0[s_te1[(ks[18] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[18] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[18] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[18] >>  0) & 0xff] & 0xff];
1592  ks[19] = s_td0[s_te1[(ks[19] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[19] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[19] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[19] >>  0) & 0xff] & 0xff];
1593  ks[20] = s_td0[s_te1[(ks[20] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[20] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[20] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[20] >>  0) & 0xff] & 0xff];
1594  ks[21] = s_td0[s_te1[(ks[21] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[21] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[21] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[21] >>  0) & 0xff] & 0xff];
1595  ks[22] = s_td0[s_te1[(ks[22] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[22] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[22] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[22] >>  0) & 0xff] & 0xff];
1596  ks[23] = s_td0[s_te1[(ks[23] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[23] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[23] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[23] >>  0) & 0xff] & 0xff];
1597  ks[24] = s_td0[s_te1[(ks[24] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[24] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[24] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[24] >>  0) & 0xff] & 0xff];
1598  ks[25] = s_td0[s_te1[(ks[25] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[25] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[25] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[25] >>  0) & 0xff] & 0xff];
1599  ks[26] = s_td0[s_te1[(ks[26] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[26] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[26] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[26] >>  0) & 0xff] & 0xff];
1600  ks[27] = s_td0[s_te1[(ks[27] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[27] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[27] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[27] >>  0) & 0xff] & 0xff];
1601  ks[28] = s_td0[s_te1[(ks[28] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[28] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[28] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[28] >>  0) & 0xff] & 0xff];
1602  ks[29] = s_td0[s_te1[(ks[29] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[29] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[29] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[29] >>  0) & 0xff] & 0xff];
1603  ks[30] = s_td0[s_te1[(ks[30] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[30] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[30] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[30] >>  0) & 0xff] & 0xff];
1604  ks[31] = s_td0[s_te1[(ks[31] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[31] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[31] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[31] >>  0) & 0xff] & 0xff];
1605  ks[32] = s_td0[s_te1[(ks[32] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[32] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[32] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[32] >>  0) & 0xff] & 0xff];
1606  ks[33] = s_td0[s_te1[(ks[33] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[33] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[33] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[33] >>  0) & 0xff] & 0xff];
1607  ks[34] = s_td0[s_te1[(ks[34] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[34] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[34] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[34] >>  0) & 0xff] & 0xff];
1608  ks[35] = s_td0[s_te1[(ks[35] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[35] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[35] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[35] >>  0) & 0xff] & 0xff];
1609  ks[36] = s_td0[s_te1[(ks[36] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[36] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[36] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[36] >>  0) & 0xff] & 0xff];
1610  ks[37] = s_td0[s_te1[(ks[37] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[37] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[37] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[37] >>  0) & 0xff] & 0xff];
1611  ks[38] = s_td0[s_te1[(ks[38] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[38] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[38] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[38] >>  0) & 0xff] & 0xff];
1612  ks[39] = s_td0[s_te1[(ks[39] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[39] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[39] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[39] >>  0) & 0xff] & 0xff];
1613  ks[40] = s_td0[s_te1[(ks[40] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[40] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[40] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[40] >>  0) & 0xff] & 0xff];
1614  ks[41] = s_td0[s_te1[(ks[41] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[41] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[41] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[41] >>  0) & 0xff] & 0xff];
1615  ks[42] = s_td0[s_te1[(ks[42] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[42] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[42] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[42] >>  0) & 0xff] & 0xff];
1616  ks[43] = s_td0[s_te1[(ks[43] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[43] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[43] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[43] >>  0) & 0xff] & 0xff];
1617  ks[44] = s_td0[s_te1[(ks[44] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[44] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[44] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[44] >>  0) & 0xff] & 0xff];
1618  ks[45] = s_td0[s_te1[(ks[45] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[45] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[45] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[45] >>  0) & 0xff] & 0xff];
1619  ks[46] = s_td0[s_te1[(ks[46] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[46] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[46] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[46] >>  0) & 0xff] & 0xff];
1620  ks[47] = s_td0[s_te1[(ks[47] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[47] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[47] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[47] >>  0) & 0xff] & 0xff];
1621  ks[48] = s_td0[s_te1[(ks[48] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[48] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[48] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[48] >>  0) & 0xff] & 0xff];
1622  ks[49] = s_td0[s_te1[(ks[49] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[49] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[49] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[49] >>  0) & 0xff] & 0xff];
1623  ks[50] = s_td0[s_te1[(ks[50] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[50] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[50] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[50] >>  0) & 0xff] & 0xff];
1624  ks[51] = s_td0[s_te1[(ks[51] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[51] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[51] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[51] >>  0) & 0xff] & 0xff];
1625  ks[52] = s_td0[s_te1[(ks[52] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[52] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[52] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[52] >>  0) & 0xff] & 0xff];
1626  ks[53] = s_td0[s_te1[(ks[53] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[53] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[53] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[53] >>  0) & 0xff] & 0xff];
1627  ks[54] = s_td0[s_te1[(ks[54] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[54] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[54] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[54] >>  0) & 0xff] & 0xff];
1628  ks[55] = s_td0[s_te1[(ks[55] >> 24) & 0xff] & 0xff] ^ s_td1[s_te1[(ks[55] >> 16) & 0xff] & 0xff] ^ s_td2[s_te1[(ks[55] >>  8) & 0xff] & 0xff] ^ s_td3[s_te1[(ks[55] >>  0) & 0xff] & 0xff];
1629}
1630
1631DECLSPEC void aes256_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3)
1632{
1633  u32 ukey_s[8];
1634
1635  ukey_s[0] = hc_swap32_S (ukey[0]);
1636  ukey_s[1] = hc_swap32_S (ukey[1]);
1637  ukey_s[2] = hc_swap32_S (ukey[2]);
1638  ukey_s[3] = hc_swap32_S (ukey[3]);
1639  ukey_s[4] = hc_swap32_S (ukey[4]);
1640  ukey_s[5] = hc_swap32_S (ukey[5]);
1641  ukey_s[6] = hc_swap32_S (ukey[6]);
1642  ukey_s[7] = hc_swap32_S (ukey[7]);
1643
1644  aes256_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3);
1645}
1646
1647DECLSPEC void aes256_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3)
1648{
1649  u32 ukey_s[8];
1650
1651  ukey_s[0] = hc_swap32_S (ukey[0]);
1652  ukey_s[1] = hc_swap32_S (ukey[1]);
1653  ukey_s[2] = hc_swap32_S (ukey[2]);
1654  ukey_s[3] = hc_swap32_S (ukey[3]);
1655  ukey_s[4] = hc_swap32_S (ukey[4]);
1656  ukey_s[5] = hc_swap32_S (ukey[5]);
1657  ukey_s[6] = hc_swap32_S (ukey[6]);
1658  ukey_s[7] = hc_swap32_S (ukey[7]);
1659
1660  aes256_ExpandKey (ks, ukey_s, s_te0, s_te1, s_te2, s_te3);
1661
1662  aes256_InvertKey (ks, s_te1, s_td0, s_td1, s_td2, s_td3);
1663}
1664
1665DECLSPEC void aes256_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
1666{
1667  u32 in_s[4];
1668
1669  in_s[0] = hc_swap32_S (in[0]);
1670  in_s[1] = hc_swap32_S (in[1]);
1671  in_s[2] = hc_swap32_S (in[2]);
1672  in_s[3] = hc_swap32_S (in[3]);
1673
1674  u32 s0 = in_s[0] ^ ks[0];
1675  u32 s1 = in_s[1] ^ ks[1];
1676  u32 s2 = in_s[2] ^ ks[2];
1677  u32 s3 = in_s[3] ^ ks[3];
1678
1679  u32 t0;
1680  u32 t1;
1681  u32 t2;
1682  u32 t3;
1683
1684  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[ 4];
1685  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[ 5];
1686  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[ 6];
1687  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[ 7];
1688  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[ 8];
1689  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[ 9];
1690  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[10];
1691  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[11];
1692  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[12];
1693  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[13];
1694  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[14];
1695  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[15];
1696  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[16];
1697  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[17];
1698  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[18];
1699  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[19];
1700  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[20];
1701  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[21];
1702  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[22];
1703  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[23];
1704  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[24];
1705  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[25];
1706  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[26];
1707  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[27];
1708  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[28];
1709  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[29];
1710  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[30];
1711  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[31];
1712  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[32];
1713  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[33];
1714  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[34];
1715  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[35];
1716  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[36];
1717  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[37];
1718  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[38];
1719  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[39];
1720  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[40];
1721  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[41];
1722  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[42];
1723  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[43];
1724  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[44];
1725  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[45];
1726  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[46];
1727  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[47];
1728  s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >>  8) & 0xff] ^ s_te3[t3 & 0xff] ^ ks[48];
1729  s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >>  8) & 0xff] ^ s_te3[t0 & 0xff] ^ ks[49];
1730  s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >>  8) & 0xff] ^ s_te3[t1 & 0xff] ^ ks[50];
1731  s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >>  8) & 0xff] ^ s_te3[t2 & 0xff] ^ ks[51];
1732  t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >>  8) & 0xff] ^ s_te3[s3 & 0xff] ^ ks[52];
1733  t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >>  8) & 0xff] ^ s_te3[s0 & 0xff] ^ ks[53];
1734  t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >>  8) & 0xff] ^ s_te3[s1 & 0xff] ^ ks[54];
1735  t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >>  8) & 0xff] ^ s_te3[s2 & 0xff] ^ ks[55];
1736
1737  out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000)
1738         ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000)
1739         ^ (s_te4[(t2 >>  8) & 0xff] & 0x0000ff00)
1740         ^ (s_te4[(t3 >>  0) & 0xff] & 0x000000ff)
1741         ^ ks[56];
1742
1743  out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000)
1744         ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000)
1745         ^ (s_te4[(t3 >>  8) & 0xff] & 0x0000ff00)
1746         ^ (s_te4[(t0 >>  0) & 0xff] & 0x000000ff)
1747         ^ ks[57];
1748
1749  out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000)
1750         ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000)
1751         ^ (s_te4[(t0 >>  8) & 0xff] & 0x0000ff00)
1752         ^ (s_te4[(t1 >>  0) & 0xff] & 0x000000ff)
1753         ^ ks[58];
1754
1755  out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000)
1756         ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000)
1757         ^ (s_te4[(t1 >>  8) & 0xff] & 0x0000ff00)
1758         ^ (s_te4[(t2 >>  0) & 0xff] & 0x000000ff)
1759         ^ ks[59];
1760
1761  out[0] = hc_swap32_S (out[0]);
1762  out[1] = hc_swap32_S (out[1]);
1763  out[2] = hc_swap32_S (out[2]);
1764  out[3] = hc_swap32_S (out[3]);
1765}
1766
1767DECLSPEC void aes256_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4)
1768{
1769  u32 in_s[4];
1770
1771  in_s[0] = hc_swap32_S (in[0]);
1772  in_s[1] = hc_swap32_S (in[1]);
1773  in_s[2] = hc_swap32_S (in[2]);
1774  in_s[3] = hc_swap32_S (in[3]);
1775
1776  u32 s0 = in_s[0] ^ ks[0];
1777  u32 s1 = in_s[1] ^ ks[1];
1778  u32 s2 = in_s[2] ^ ks[2];
1779  u32 s3 = in_s[3] ^ ks[3];
1780
1781  u32 t0;
1782  u32 t1;
1783  u32 t2;
1784  u32 t3;
1785
1786  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[ 4];
1787  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[ 5];
1788  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[ 6];
1789  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[ 7];
1790  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[ 8];
1791  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[ 9];
1792  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[10];
1793  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[11];
1794  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[12];
1795  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[13];
1796  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[14];
1797  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[15];
1798  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[16];
1799  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[17];
1800  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[18];
1801  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[19];
1802  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[20];
1803  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[21];
1804  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[22];
1805  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[23];
1806  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[24];
1807  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[25];
1808  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[26];
1809  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[27];
1810  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[28];
1811  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[29];
1812  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[30];
1813  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[31];
1814  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[32];
1815  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[33];
1816  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[34];
1817  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[35];
1818  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[36];
1819  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[37];
1820  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[38];
1821  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[39];
1822  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[40];
1823  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[41];
1824  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[42];
1825  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[43];
1826  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[44];
1827  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[45];
1828  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[46];
1829  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[47];
1830  s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >>  8) & 0xff] ^ s_td3[t1 & 0xff] ^ ks[48];
1831  s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >>  8) & 0xff] ^ s_td3[t2 & 0xff] ^ ks[49];
1832  s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >>  8) & 0xff] ^ s_td3[t3 & 0xff] ^ ks[50];
1833  s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >>  8) & 0xff] ^ s_td3[t0 & 0xff] ^ ks[51];
1834  t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >>  8) & 0xff] ^ s_td3[s1 & 0xff] ^ ks[52];
1835  t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >>  8) & 0xff] ^ s_td3[s2 & 0xff] ^ ks[53];
1836  t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >>  8) & 0xff] ^ s_td3[s3 & 0xff] ^ ks[54];
1837  t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >>  8) & 0xff] ^ s_td3[s0 & 0xff] ^ ks[55];
1838
1839  out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000)
1840         ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000)
1841         ^ (s_td4[(t2 >>  8) & 0xff] & 0x0000ff00)
1842         ^ (s_td4[(t1 >>  0) & 0xff] & 0x000000ff)
1843         ^ ks[56];
1844
1845  out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000)
1846         ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000)
1847         ^ (s_td4[(t3 >>  8) & 0xff] & 0x0000ff00)
1848         ^ (s_td4[(t2 >>  0) & 0xff] & 0x000000ff)
1849         ^ ks[57];
1850
1851  out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000)
1852         ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000)
1853         ^ (s_td4[(t0 >>  8) & 0xff] & 0x0000ff00)
1854         ^ (s_td4[(t3 >>  0) & 0xff] & 0x000000ff)
1855         ^ ks[58];
1856
1857  out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000)
1858         ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000)
1859         ^ (s_td4[(t1 >>  8) & 0xff] & 0x0000ff00)
1860         ^ (s_td4[(t0 >>  0) & 0xff] & 0x000000ff)
1861         ^ ks[59];
1862
1863  out[0] = hc_swap32_S (out[0]);
1864  out[1] = hc_swap32_S (out[1]);
1865  out[2] = hc_swap32_S (out[2]);
1866  out[3] = hc_swap32_S (out[3]);
1867}
1868
1869// wrapper to avoid hc_swap32_S() confusion in the kernel code
1870
1871DECLSPEC void AES128_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3)
1872{
1873  u32 ukey_s[4];
1874
1875  ukey_s[0] = hc_swap32_S (ukey[0]);
1876  ukey_s[1] = hc_swap32_S (ukey[1]);
1877  ukey_s[2] = hc_swap32_S (ukey[2]);
1878  ukey_s[3] = hc_swap32_S (ukey[3]);
1879
1880  aes128_set_encrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3);
1881}
1882
1883DECLSPEC void AES128_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3)
1884{
1885  u32 ukey_s[4];
1886
1887  ukey_s[0] = hc_swap32_S (ukey[0]);
1888  ukey_s[1] = hc_swap32_S (ukey[1]);
1889  ukey_s[2] = hc_swap32_S (ukey[2]);
1890  ukey_s[3] = hc_swap32_S (ukey[3]);
1891
1892  aes128_set_decrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3);
1893}
1894
1895DECLSPEC void AES128_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
1896{
1897  u32 in_s[4];
1898
1899  in_s[0] = hc_swap32_S (in[0]);
1900  in_s[1] = hc_swap32_S (in[1]);
1901  in_s[2] = hc_swap32_S (in[2]);
1902  in_s[3] = hc_swap32_S (in[3]);
1903
1904  u32 out_s[4];
1905
1906  aes128_encrypt (ks, in_s, out_s, s_te0, s_te1, s_te2, s_te3, s_te4);
1907
1908  out[0] = hc_swap32_S (out_s[0]);
1909  out[1] = hc_swap32_S (out_s[1]);
1910  out[2] = hc_swap32_S (out_s[2]);
1911  out[3] = hc_swap32_S (out_s[3]);
1912}
1913
1914DECLSPEC void AES128_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4)
1915{
1916  u32 in_s[4];
1917
1918  in_s[0] = hc_swap32_S (in[0]);
1919  in_s[1] = hc_swap32_S (in[1]);
1920  in_s[2] = hc_swap32_S (in[2]);
1921  in_s[3] = hc_swap32_S (in[3]);
1922
1923  u32 out_s[4];
1924
1925  aes128_decrypt (ks, in_s, out_s, s_td0, s_td1, s_td2, s_td3, s_td4);
1926
1927  out[0] = hc_swap32_S (out_s[0]);
1928  out[1] = hc_swap32_S (out_s[1]);
1929  out[2] = hc_swap32_S (out_s[2]);
1930  out[3] = hc_swap32_S (out_s[3]);
1931}
1932
1933DECLSPEC void AES192_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3)
1934{
1935  u32 ukey_s[6];
1936
1937  ukey_s[0] = hc_swap32_S (ukey[0]);
1938  ukey_s[1] = hc_swap32_S (ukey[1]);
1939  ukey_s[2] = hc_swap32_S (ukey[2]);
1940  ukey_s[3] = hc_swap32_S (ukey[3]);
1941  ukey_s[4] = hc_swap32_S (ukey[4]);
1942  ukey_s[5] = hc_swap32_S (ukey[5]);
1943
1944  aes192_set_encrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3);
1945}
1946
1947DECLSPEC void AES192_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3)
1948{
1949  u32 ukey_s[6];
1950
1951  ukey_s[0] = hc_swap32_S (ukey[0]);
1952  ukey_s[1] = hc_swap32_S (ukey[1]);
1953  ukey_s[2] = hc_swap32_S (ukey[2]);
1954  ukey_s[3] = hc_swap32_S (ukey[3]);
1955  ukey_s[4] = hc_swap32_S (ukey[4]);
1956  ukey_s[5] = hc_swap32_S (ukey[5]);
1957
1958  aes192_set_decrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3);
1959}
1960
1961DECLSPEC void AES192_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
1962{
1963  u32 in_s[4];
1964
1965  in_s[0] = hc_swap32_S (in[0]);
1966  in_s[1] = hc_swap32_S (in[1]);
1967  in_s[2] = hc_swap32_S (in[2]);
1968  in_s[3] = hc_swap32_S (in[3]);
1969
1970  u32 out_s[4];
1971
1972  aes192_encrypt (ks, in_s, out_s, s_te0, s_te1, s_te2, s_te3, s_te4);
1973
1974  out[0] = hc_swap32_S (out_s[0]);
1975  out[1] = hc_swap32_S (out_s[1]);
1976  out[2] = hc_swap32_S (out_s[2]);
1977  out[3] = hc_swap32_S (out_s[3]);
1978}
1979
1980DECLSPEC void AES192_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4)
1981{
1982  u32 in_s[4];
1983
1984  in_s[0] = hc_swap32_S (in[0]);
1985  in_s[1] = hc_swap32_S (in[1]);
1986  in_s[2] = hc_swap32_S (in[2]);
1987  in_s[3] = hc_swap32_S (in[3]);
1988
1989  u32 out_s[4];
1990
1991  aes192_decrypt (ks, in_s, out_s, s_td0, s_td1, s_td2, s_td3, s_td4);
1992
1993  out[0] = hc_swap32_S (out_s[0]);
1994  out[1] = hc_swap32_S (out_s[1]);
1995  out[2] = hc_swap32_S (out_s[2]);
1996  out[3] = hc_swap32_S (out_s[3]);
1997}
1998
1999DECLSPEC void AES256_set_encrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3)
2000{
2001  u32 ukey_s[8];
2002
2003  ukey_s[0] = hc_swap32_S (ukey[0]);
2004  ukey_s[1] = hc_swap32_S (ukey[1]);
2005  ukey_s[2] = hc_swap32_S (ukey[2]);
2006  ukey_s[3] = hc_swap32_S (ukey[3]);
2007  ukey_s[4] = hc_swap32_S (ukey[4]);
2008  ukey_s[5] = hc_swap32_S (ukey[5]);
2009  ukey_s[6] = hc_swap32_S (ukey[6]);
2010  ukey_s[7] = hc_swap32_S (ukey[7]);
2011
2012  aes256_set_encrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3);
2013}
2014
2015DECLSPEC void AES256_set_decrypt_key (u32 *ks, const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3)
2016{
2017  u32 ukey_s[8];
2018
2019  ukey_s[0] = hc_swap32_S (ukey[0]);
2020  ukey_s[1] = hc_swap32_S (ukey[1]);
2021  ukey_s[2] = hc_swap32_S (ukey[2]);
2022  ukey_s[3] = hc_swap32_S (ukey[3]);
2023  ukey_s[4] = hc_swap32_S (ukey[4]);
2024  ukey_s[5] = hc_swap32_S (ukey[5]);
2025  ukey_s[6] = hc_swap32_S (ukey[6]);
2026  ukey_s[7] = hc_swap32_S (ukey[7]);
2027
2028  aes256_set_decrypt_key (ks, ukey_s, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3);
2029}
2030
2031DECLSPEC void AES256_encrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4)
2032{
2033  u32 in_s[4];
2034
2035  in_s[0] = hc_swap32_S (in[0]);
2036  in_s[1] = hc_swap32_S (in[1]);
2037  in_s[2] = hc_swap32_S (in[2]);
2038  in_s[3] = hc_swap32_S (in[3]);
2039
2040  u32 out_s[4];
2041
2042  aes256_encrypt (ks, in_s, out_s, s_te0, s_te1, s_te2, s_te3, s_te4);
2043
2044  out[0] = hc_swap32_S (out_s[0]);
2045  out[1] = hc_swap32_S (out_s[1]);
2046  out[2] = hc_swap32_S (out_s[2]);
2047  out[3] = hc_swap32_S (out_s[3]);
2048}
2049
2050DECLSPEC void AES256_decrypt (const u32 *ks, const u32 *in, u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4)
2051{
2052  u32 in_s[4];
2053
2054  in_s[0] = hc_swap32_S (in[0]);
2055  in_s[1] = hc_swap32_S (in[1]);
2056  in_s[2] = hc_swap32_S (in[2]);
2057  in_s[3] = hc_swap32_S (in[3]);
2058
2059  u32 out_s[4];
2060
2061  aes256_decrypt (ks, in_s, out_s, s_td0, s_td1, s_td2, s_td3, s_td4);
2062
2063  out[0] = hc_swap32_S (out_s[0]);
2064  out[1] = hc_swap32_S (out_s[1]);
2065  out[2] = hc_swap32_S (out_s[2]);
2066  out[3] = hc_swap32_S (out_s[3]);
2067}
2068