]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/aes.cpp
I'll give you ##TOAST, :p
[user/henk/code/inspircd.git] / src / aes.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 /* Based on existing implementations of the industry
18  * standard AES algorithms in the public domain.
19  */
20
21 #include <cstring>
22 #include "aes.h"
23
24 const int AES::sm_alog[256] =
25 {
26         1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53, 
27         95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170, 
28         229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49, 
29         83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205, 
30         76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136, 
31         131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154, 
32         181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163, 
33         254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160, 
34         251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65, 
35         195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117, 
36         159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128, 
37         155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84, 
38         252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202, 
39         69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14, 
40         18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23, 
41         57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1
42 };
43
44 const int AES::sm_log[256] =
45 {
46         0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3, 
47         100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193, 
48         125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120, 
49         101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142, 
50         150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56, 
51         102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16, 
52         126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186, 
53         43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, 167, 87, 
54         175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230, 173, 232, 
55         44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169, 81, 160, 
56         127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183, 
57         204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157, 
58         151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209, 
59         83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171, 
60         68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, 227, 165, 
61         103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7
62 };
63
64 const char AES::sm_S[256] =
65 {
66         99, 124, 119, 123, -14, 107, 111, -59, 48, 1, 103, 43, -2, -41, -85, 118, 
67         -54, -126, -55, 125, -6, 89, 71, -16, -83, -44, -94, -81, -100, -92, 114, -64, 
68         -73, -3, -109, 38, 54, 63, -9, -52, 52, -91, -27, -15, 113, -40, 49, 21, 
69         4, -57, 35, -61, 24, -106, 5, -102, 7, 18, -128, -30, -21, 39, -78, 117, 
70         9, -125, 44, 26, 27, 110, 90, -96, 82, 59, -42, -77, 41, -29, 47, -124, 
71         83, -47, 0, -19, 32, -4, -79, 91, 106, -53, -66, 57, 74, 76, 88, -49, 
72         -48, -17, -86, -5, 67, 77, 51, -123, 69, -7, 2, 127, 80, 60, -97, -88, 
73         81, -93, 64, -113, -110, -99, 56, -11, -68, -74, -38, 33, 16, -1, -13, -46, 
74         -51, 12, 19, -20, 95, -105, 68, 23, -60, -89, 126, 61, 100, 93, 25, 115, 
75         96, -127, 79, -36, 34, 42, -112, -120, 70, -18, -72, 20, -34, 94, 11, -37, 
76         -32, 50, 58, 10, 73, 6, 36, 92, -62, -45, -84, 98, -111, -107, -28, 121, 
77         -25, -56, 55, 109, -115, -43, 78, -87, 108, 86, -12, -22, 101, 122, -82, 8, 
78         -70, 120, 37, 46, 28, -90, -76, -58, -24, -35, 116, 31, 75, -67, -117, -118, 
79         112, 62, -75, 102, 72, 3, -10, 14, 97, 53, 87, -71, -122, -63, 29, -98, 
80         -31, -8, -104, 17, 105, -39, -114, -108, -101, 30, -121, -23, -50, 85, 40, -33, 
81         -116, -95, -119, 13, -65, -26, 66, 104, 65, -103, 45, 15, -80, 84, -69, 22
82 };
83
84 const char AES::sm_Si[256] =
85 {
86         82, 9, 106, -43, 48, 54, -91, 56, -65, 64, -93, -98, -127, -13, -41, -5, 
87         124, -29, 57, -126, -101, 47, -1, -121, 52, -114, 67, 68, -60, -34, -23, -53, 
88         84, 123, -108, 50, -90, -62, 35, 61, -18, 76, -107, 11, 66, -6, -61, 78, 
89         8, 46, -95, 102, 40, -39, 36, -78, 118, 91, -94, 73, 109, -117, -47, 37, 
90         114, -8, -10, 100, -122, 104, -104, 22, -44, -92, 92, -52, 93, 101, -74, -110, 
91         108, 112, 72, 80, -3, -19, -71, -38, 94, 21, 70, 87, -89, -115, -99, -124, 
92         -112, -40, -85, 0, -116, -68, -45, 10, -9, -28, 88, 5, -72, -77, 69, 6, 
93         -48, 44, 30, -113, -54, 63, 15, 2, -63, -81, -67, 3, 1, 19, -118, 107, 
94         58, -111, 17, 65, 79, 103, -36, -22, -105, -14, -49, -50, -16, -76, -26, 115, 
95         -106, -84, 116, 34, -25, -83, 53, -123, -30, -7, 55, -24, 28, 117, -33, 110, 
96         71, -15, 26, 113, 29, 41, -59, -119, 111, -73, 98, 14, -86, 24, -66, 27, 
97         -4, 86, 62, 75, -58, -46, 121, 32, -102, -37, -64, -2, 120, -51, 90, -12, 
98         31, -35, -88, 51, -120, 7, -57, 49, -79, 18, 16, 89, 39, -128, -20, 95, 
99         96, 81, 127, -87, 25, -75, 74, 13, 45, -27, 122, -97, -109, -55, -100, -17, 
100         -96, -32, 59, 77, -82, 42, -11, -80, -56, -21, -69, 60, -125, 83, -103, 97, 
101         23, 43, 4, 126, -70, 119, -42, 38, -31, 105, 20, 99, 85, 33, 12, 125
102 };
103
104 const int AES::sm_T1[256] =
105 {
106         -966564955, -126059388, -294160487, -159679603, 
107         -855539, -697603139, -563122255, -1849309868, 
108         1613770832, 33620227, -832084055, 1445669757, 
109         -402719207, -1244145822, 1303096294, -327780710, 
110         -1882535355, 528646813, -1983264448, -92439161, 
111         -268764651, -1302767125, -1907931191, -68095989, 
112         1101901292, -1277897625, 1604494077, 1169141738, 
113         597466303, 1403299063, -462261610, -1681866661, 
114         1974974402, -503448292, 1033081774, 1277568618, 
115         1815492186, 2118074177, -168298750, -2083730353, 
116         1748251740, 1369810420, -773462732, -101584632, 
117         -495881837, -1411852173, 1647391059, 706024767, 
118         134480908, -1782069422, 1176707941, -1648114850, 
119         806885416, 932615841, 168101135, 798661301, 
120         235341577, 605164086, 461406363, -538779075, 
121         -840176858, 1311188841, 2142417613, -361400929, 
122         302582043, 495158174, 1479289972, 874125870, 
123         907746093, -596742478, -1269146898, 1537253627, 
124         -1538108682, 1983593293, -1210657183, 2108928974, 
125         1378429307, -572267714, 1580150641, 327451799, 
126         -1504488459, -1177431704, 0, -1041371860, 
127         1075847264, -469959649, 2041688520, -1235526675, 
128         -731223362, -1916023994, 1740553945, 1916352843, 
129         -1807070498, -1739830060, -1336387352, -2049978550, 
130         -1143943061, -974131414, 1336584933, -302253290, 
131         -2042412091, -1706209833, 1714631509, 293963156, 
132         -1975171633, -369493744, 67240454, -25198719, 
133         -1605349136, 2017213508, 631218106, 1269344483, 
134         -1571728909, 1571005438, -2143272768, 93294474, 
135         1066570413, 563977660, 1882732616, -235539196, 
136         1673313503, 2008463041, -1344611723, 1109467491, 
137         537923632, -436207846, -34344178, -1076702611, 
138         -2117218996, 403442708, 638784309, -1007883217, 
139         -1101045791, 899127202, -2008791860, 773265209, 
140         -1815821225, 1437050866, -58818942, 2050833735, 
141         -932944724, -1168286233, 840505643, -428641387, 
142         -1067425632, 427917720, -1638969391, -1545806721, 
143         1143087718, 1412049534, 999329963, 193497219, 
144         -1941551414, -940642775, 1807268051, 672404540, 
145         -1478566279, -1134666014, 369822493, -1378100362, 
146         -606019525, 1681011286, 1949973070, 336202270, 
147         -1840690725, 201721354, 1210328172, -1201906460, 
148         -1614626211, -1110191250, 1135389935, -1000185178, 
149         965841320, 831886756, -739974089, -226920053, 
150         -706222286, -1949775805, 1849112409, -630362697, 
151         26054028, -1311386268, -1672589614, 1235855840, 
152         -663982924, -1403627782, -202050553, -806688219, 
153         -899324497, -193299826, 1202630377, 268961816, 
154         1874508501, -260540280, 1243948399, 1546530418, 
155         941366308, 1470539505, 1941222599, -1748580783, 
156         -873928669, -1579295364, -395021156, 1042226977, 
157         -1773450275, 1639824860, 227249030, 260737669, 
158         -529502064, 2084453954, 1907733956, -865704278, 
159         -1874310952, 100860677, -134810111, 470683154, 
160         -1033805405, 1781871967, -1370007559, 1773779408, 
161         394692241, -1715355304, 974986535, 664706745, 
162         -639508168, -336005101, 731420851, 571543859, 
163         -764843589, -1445340816, 126783113, 865375399, 
164         765172662, 1008606754, 361203602, -907417312, 
165         -2016489911, -1437248001, 1344809080, -1512054918, 
166         59542671, 1503764984, 160008576, 437062935, 
167         1707065306, -672733647, -2076032314, -798463816, 
168         -2109652541, 697932208, 1512910199, 504303377, 
169         2075177163, -1470868228, 1841019862, 739644986
170 };
171
172 const int AES::sm_T2[256] =
173 {
174         -1513725085, -2064089988, -1712425097, -1913226373, 
175         234877682, -1110021269, -1310822545, 1418839493, 
176         1348481072, 50462977, -1446090905, 2102799147, 
177         434634494, 1656084439, -431117397, -1695779210, 
178         1167051466, -1658879358, 1082771913, -2013627011, 
179         368048890, -340633255, -913422521, 201060592, 
180         -331240019, 1739838676, -44064094, -364531793, 
181         -1088185188, -145513308, -1763413390, 1536934080, 
182         -1032472649, 484572669, -1371696237, 1783375398, 
183         1517041206, 1098792767, 49674231, 1334037708, 
184         1550332980, -195975771, 886171109, 150598129, 
185         -1813876367, 1940642008, 1398944049, 1059722517, 
186         201851908, 1385547719, 1699095331, 1587397571, 
187         674240536, -1590192490, 252314885, -1255171430, 
188         151914247, 908333586, -1692696448, 1038082786, 
189         651029483, 1766729511, -847269198, -1612024459, 
190         454166793, -1642232957, 1951935532, 775166490, 
191         758520603, -1294176658, -290170278, -77881184, 
192         -157003182, 1299594043, 1639438038, -830622797, 
193         2068982057, 1054729187, 1901997871, -1760328572, 
194         -173649069, 1757008337, 0, 750906861, 
195         1614815264, 535035132, -931548751, -306816165, 
196         -1093375382, 1183697867, -647512386, 1265776953, 
197         -560706998, -728216500, -391096232, 1250283471, 
198         1807470800, 717615087, -447763798, 384695291, 
199         -981056701, -677753523, 1432761139, -1810791035, 
200         -813021883, 283769337, 100925954, -2114027649, 
201         -257929136, 1148730428, -1171939425, -481580888, 
202         -207466159, -27417693, -1065336768, -1979347057, 
203         -1388342638, -1138647651, 1215313976, 82966005, 
204         -547111748, -1049119050, 1974459098, 1665278241, 
205         807407632, 451280895, 251524083, 1841287890, 
206         1283575245, 337120268, 891687699, 801369324, 
207         -507617441, -1573546089, -863484860, 959321879, 
208         1469301956, -229267545, -2097381762, 1199193405, 
209         -1396153244, -407216803, 724703513, -1780059277, 
210         -1598005152, -1743158911, -778154161, 2141445340, 
211         1715741218, 2119445034, -1422159728, -2096396152, 
212         -896776634, 700968686, -747915080, 1009259540, 
213         2041044702, -490971554, 487983883, 1991105499, 
214         1004265696, 1449407026, 1316239930, 504629770, 
215         -611169975, 168560134, 1816667172, -457679780, 
216         1570751170, 1857934291, -280777556, -1497079198, 
217         -1472622191, -1540254315, 936633572, -1947043463, 
218         852879335, 1133234376, 1500395319, -1210421907, 
219         -1946055283, 1689376213, -761508274, -532043351, 
220         -1260884884, -89369002, 133428468, 634383082, 
221         -1345690267, -1896580486, -381178194, 403703816, 
222         -714097990, -1997506440, 1867130149, 1918643758, 
223         607656988, -245913946, -948718412, 1368901318, 
224         600565992, 2090982877, -1662487436, 557719327, 
225         -577352885, -597574211, -2045932661, -2062579062, 
226         -1864339344, 1115438654, -999180875, -1429445018, 
227         -661632952, 84280067, 33027830, 303828494, 
228         -1547542175, 1600795957, -106014889, -798377543, 
229         -1860729210, 1486471617, 658119965, -1188585826, 
230         953803233, 334231800, -1288988520, 857870609, 
231         -1143838359, 1890179545, -1995993458, -1489791852, 
232         -1238525029, 574365214, -1844082809, 550103529, 
233         1233637070, -5614251, 2018519080, 2057691103, 
234         -1895592820, -128343647, -2146858615, 387583245, 
235         -630865985, 836232934, -964410814, -1194301336, 
236         -1014873791, -1339450983, 2002398509, 287182607, 
237         -881086288, -56077228, -697451589, 975967766
238 };
239
240 const int AES::sm_T3[256] =
241 {
242         1671808611, 2089089148, 2006576759, 2072901243, 
243         -233963534, 1807603307, 1873927791, -984313403, 
244         810573872, 16974337, 1739181671, 729634347, 
245         -31856642, -681396777, -1410970197, 1989864566, 
246         -901410870, -2103631998, -918517303, 2106063485, 
247         -99225606, 1508618841, 1204391495, -267650064, 
248         -1377025619, -731401260, -1560453214, -1343601233, 
249         -1665195108, -1527295068, 1922491506, -1067738176, 
250         -1211992649, -48438787, -1817297517, 644500518, 
251         911895606, 1061256767, -150800905, -867204148, 
252         878471220, -1510714971, -449523227, -251069967, 
253         1905517169, -663508008, 827548209, 356461077, 
254         67897348, -950889017, 593839651, -1017209405, 
255         405286936, -1767819370, 84871685, -1699401830, 
256         118033927, 305538066, -2137318528, -499261470, 
257         -349778453, 661212711, -1295155278, 1973414517, 
258         152769033, -2086789757, 745822252, 439235610, 
259         455947803, 1857215598, 1525593178, -1594139744, 
260         1391895634, 994932283, -698239018, -1278313037, 
261         695947817, -482419229, 795958831, -2070473852, 
262         1408607827, -781665839, 0, -315833875, 
263         543178784, -65018884, -1312261711, 1542305371, 
264         1790891114, -884568629, -1093048386, 961245753, 
265         1256100938, 1289001036, 1491644504, -817199665, 
266         -798245936, -282409489, -1427812438, -82383365, 
267         1137018435, 1305975373, 861234739, -2053893755, 
268         1171229253, -116332039, 33948674, 2139225727, 
269         1357946960, 1011120188, -1615190625, -1461498968, 
270         1374921297, -1543610973, 1086357568, -1886780017, 
271         -1834139758, -1648615011, 944271416, -184225291, 
272         -1126210628, -1228834890, -629821478, 560153121, 
273         271589392, -15014401, -217121293, -764559406, 
274         -850624051, 202643468, 322250259, -332413972, 
275         1608629855, -1750977129, 1154254916, 389623319, 
276         -1000893500, -1477290585, 2122513534, 1028094525, 
277         1689045092, 1575467613, 422261273, 1939203699, 
278         1621147744, -2120738431, 1339137615, -595614756, 
279         577127458, 712922154, -1867826288, -2004677752, 
280         1187679302, -299251730, -1194103880, 339486740, 
281         -562452514, 1591917662, 186455563, -612979237, 
282         -532948000, 844522546, 978220090, 169743370, 
283         1239126601, 101321734, 611076132, 1558493276, 
284         -1034051646, -747717165, -1393605716, 1655096418, 
285         -1851246191, -1784401515, -466103324, 2039214713, 
286         -416098841, -935097400, 928607799, 1840765549, 
287         -1920204403, -714821163, 1322425422, -1444918871, 
288         1823791212, 1459268694, -200805388, -366620694, 
289         1706019429, 2056189050, -1360443474, 135794696, 
290         -1160417350, 2022240376, 628050469, 779246638, 
291         472135708, -1494132826, -1261997132, -967731258, 
292         -400307224, -579034659, 1956440180, 522272287, 
293         1272813131, -1109630531, -1954148981, -1970991222, 
294         1888542832, 1044544574, -1245417035, 1722469478, 
295         1222152264, 50660867, -167643146, 236067854, 
296         1638122081, 895445557, 1475980887, -1177523783, 
297         -2037311610, -1051158079, 489110045, -1632032866, 
298         -516367903, -132912136, -1733088360, 288563729, 
299         1773916777, -646927911, -1903622258, -1800981612, 
300         -1682559589, 505560094, -2020469369, -383727127, 
301         -834041906, 1442818645, 678973480, -545610273, 
302         -1936784500, -1577559647, -1988097655, 219617805, 
303         -1076206145, -432941082, 1120306242, 1756942440, 
304         1103331905, -1716508263, 762796589, 252780047, 
305         -1328841808, 1425844308, -1143575109, 372911126
306 };
307
308 const int AES::sm_T4[256] =
309 {
310         1667474886, 2088535288, 2004326894, 2071694838, 
311         -219017729, 1802223062, 1869591006, -976923503, 
312         808472672, 16843522, 1734846926, 724270422, 
313         -16901657, -673750347, -1414797747, 1987484396, 
314         -892713585, -2105369313, -909557623, 2105378810, 
315         -84273681, 1499065266, 1195886990, -252703749, 
316         -1381110719, -724277325, -1566376609, -1347425723, 
317         -1667449053, -1532692653, 1920112356, -1061135461, 
318         -1212693899, -33743647, -1819038147, 640051788, 
319         909531756, 1061110142, -134806795, -859025533, 
320         875846760, -1515850671, -437963567, -235861767, 
321         1903268834, -656903253, 825316194, 353713962, 
322         67374088, -943238507, 589522246, -1010606435, 
323         404236336, -1768513225, 84217610, -1701137105, 
324         117901582, 303183396, -2139055333, -488489505, 
325         -336910643, 656894286, -1296904833, 1970642922, 
326         151591698, -2088526307, 741110872, 437923380, 
327         454765878, 1852748508, 1515908788, -1600062629, 
328         1381168804, 993742198, -690593353, -1280061827, 
329         690584402, -471646499, 791638366, -2071685357, 
330         1398011302, -774805319, 0, -303223615, 
331         538992704, -50585629, -1313748871, 1532751286, 
332         1785380564, -875870579, -1094788761, 960056178, 
333         1246420628, 1280103576, 1482221744, -808498555, 
334         -791647301, -269538619, -1431640753, -67430675, 
335         1128514950, 1296947098, 859002214, -2054843375, 
336         1162203018, -101117719, 33687044, 2139062782, 
337         1347481760, 1010582648, -1616922075, -1465326773, 
338         1364325282, -1549533603, 1077985408, -1886418427, 
339         -1835881153, -1650607071, 943212656, -168491791, 
340         -1128472733, -1229536905, -623217233, 555836226, 
341         269496352, -58651, -202174723, -757961281, 
342         -842183551, 202118168, 320025894, -320065597, 
343         1600119230, -1751670219, 1145359496, 387397934, 
344         -993765485, -1482165675, 2122220284, 1027426170, 
345         1684319432, 1566435258, 421079858, 1936954854, 
346         1616945344, -2122213351, 1330631070, -589529181, 
347         572679748, 707427924, -1869567173, -2004319477, 
348         1179044492, -286381625, -1195846805, 336870440, 
349         -555845209, 1583276732, 185277718, -606374227, 
350         -522175525, 842159716, 976899700, 168435220, 
351         1229577106, 101059084, 606366792, 1549591736, 
352         -1027449441, -741118275, -1397952701, 1650632388, 
353         -1852725191, -1785355215, -454805549, 2038008818, 
354         -404278571, -926399605, 926374254, 1835907034, 
355         -1920103423, -707435343, 1313788572, -1448484791, 
356         1819063512, 1448540844, -185333773, -353753649, 
357         1701162954, 2054852340, -1364268729, 134748176, 
358         -1162160785, 2021165296, 623210314, 774795868, 
359         471606328, -1499008681, -1263220877, -960081513, 
360         -387439669, -572687199, 1953799400, 522133822, 
361         1263263126, -1111630751, -1953790451, -1970633457, 
362         1886425312, 1044267644, -1246378895, 1718004428, 
363         1212733584, 50529542, -151649801, 235803164, 
364         1633788866, 892690282, 1465383342, -1179004823, 
365         -2038001385, -1044293479, 488449850, -1633765081, 
366         -505333543, -117959701, -1734823125, 286339874, 
367         1768537042, -640061271, -1903261433, -1802197197, 
368         -1684294099, 505291324, -2021158379, -370597687, 
369         -825341561, 1431699370, 673740880, -539002203, 
370         -1936945405, -1583220647, -1987477495, 218961690, 
371         -1077945755, -421121577, 1111672452, 1751693520, 
372         1094828930, -1717981143, 757954394, 252645662, 
373         -1330590853, 1414855848, -1145317779, 370555436
374 };
375
376 const int AES::sm_T5[256] =
377 {
378         1374988112, 2118214995, 437757123, 975658646, 
379         1001089995, 530400753, -1392879445, 1273168787, 
380         540080725, -1384747530, -1999866223, -184398811, 
381         1340463100, -987051049, 641025152, -1251826801, 
382         -558802359, 632953703, 1172967064, 1576976609, 
383         -1020300030, -2125664238, -1924753501, 1809054150, 
384         59727847, 361929877, -1083344149, -1789765158, 
385         -725712083, 1484005843, 1239443753, -1899378620, 
386         1975683434, -191989384, -1722270101, 666464733, 
387         -1092530250, -259478249, -920605594, 2110667444, 
388         1675577880, -451268222, -1756286112, 1649639237, 
389         -1318815776, -1150570876, -25059300, -116905068, 
390         1883793496, -1891238631, -1797362553, 1383856311, 
391         -1418472669, 1917518562, -484470953, 1716890410, 
392         -1293211641, 800440835, -2033878118, -751368027, 
393         807962610, 599762354, 33778362, -317291940, 
394         -1966138325, -1485196142, -217582864, 1315562145, 
395         1708848333, 101039829, -785096161, -995688822, 
396         875451293, -1561111136, 92987698, -1527321739, 
397         193195065, 1080094634, 1584504582, -1116860335, 
398         1042385657, -1763899843, -583137874, 1306967366, 
399         -1856729675, 1908694277, 67556463, 1615861247, 
400         429456164, -692196969, -1992277044, 1742315127, 
401         -1326955843, 126454664, -417768648, 2043211483, 
402         -1585706425, 2084704233, -125559095, 0, 
403         159417987, 841739592, 504459436, 1817866830, 
404         -49348613, 260388950, 1034867998, 908933415, 
405         168810852, 1750902305, -1688513327, 607530554, 
406         202008497, -1822955761, -1259432238, 463180190, 
407         -2134850225, 1641816226, 1517767529, 470948374, 
408         -493635062, -1063245083, 1008918595, 303765277, 
409         235474187, -225720403, 766945465, 337553864, 
410         1475418501, -1351284916, -291906117, -1551933187, 
411         -150919521, 1551037884, 1147550661, 1543208500, 
412         -1958532746, -886847780, -1225917336, -1192955549, 
413         -684598070, 1113818384, 328671808, -2067394272, 
414         -2058738563, -759480840, -1359400431, -953573011, 
415         496906059, -592301837, 226906860, 2009195472, 
416         733156972, -1452230247, 294930682, 1206477858, 
417         -1459843900, -1594867942, 1451044056, 573804783, 
418         -2025238841, -650587711, -1932877058, -1730933962, 
419         -1493859889, -1518674392, -625504730, 1068351396, 
420         742039012, 1350078989, 1784663195, 1417561698, 
421         -158526526, -1864845080, 775550814, -2101104651, 
422         -1621262146, 1775276924, 1876241833, -819653965, 
423         -928212677, 270040487, -392404114, -616842373, 
424         -853116919, 1851332852, -325404927, -2091935064, 
425         -426414491, -1426069890, 566021896, -283776794, 
426         -1159226407, 1248802510, -358676012, 699432150, 
427         832877231, 708780849, -962227152, 899835584, 
428         1951317047, -58537306, -527380304, 866637845, 
429         -251357110, 1106041591, 2144161806, 395441711, 
430         1984812685, 1139781709, -861254316, -459930401, 
431         -1630423581, 1282050075, -1054072904, 1181045119, 
432         -1654724092, 25965917, -91786125, -83148498, 
433         -1285087910, -1831087534, -384805325, 1842759443, 
434         -1697160820, 933301370, 1509430414, -351060855, 
435         -827774994, -1218328267, -518199827, 2051518780, 
436         -1663901863, 1441952575, 404016761, 1942435775, 
437         1408749034, 1610459739, -549621996, 2017778566, 
438         -894438527, -1184316354, 941896748, -1029488545, 
439         371049330, -1126030068, 675039627, -15887039, 
440         967311729, 135050206, -659233636, 1683407248, 
441         2076935265, -718096784, 1215061108, -793225406
442 };
443
444 const int AES::sm_T6[256] =
445 {
446         1347548327, 1400783205, -1021700188, -1774573730, 
447         -885281941, -249586363, -1414727080, -1823743229, 
448         1428173050, -156404115, -1853305738, 636813900, 
449         -61872681, -674944309, -2144979644, -1883938141, 
450         1239331162, 1730525723, -1740248562, -513933632, 
451         46346101, 310463728, -1551022441, -966011911, 
452         -419197089, -1793748324, -339776134, -627748263, 
453         768917123, -749177823, 692707433, 1150208456, 
454         1786102409, 2029293177, 1805211710, -584599183, 
455         -1229004465, 401639597, 1724457132, -1266823622, 
456         409198410, -2098914767, 1620529459, 1164071807, 
457         -525245321, -2068091986, 486441376, -1795618773, 
458         1483753576, 428819965, -2020286868, -1219331080, 
459         598438867, -495826174, 1474502543, 711349675, 
460         129166120, 53458370, -1702443653, -1512884472, 
461         -231724921, -1306280027, -1174273174, 1559041666, 
462         730517276, -1834518092, -252508174, -1588696606, 
463         -848962828, -721025602, 533804130, -1966823682, 
464         -1657524653, -1599933611, 839224033, 1973745387, 
465         957055980, -1438621457, 106852767, 1371368976, 
466         -113368694, 1033297158, -1361232379, 1179510461, 
467         -1248766835, 91341917, 1862534868, -10465259, 
468         605657339, -1747534359, -863420349, 2003294622, 
469         -1112479678, -2012771957, 954669403, -612775698, 
470         1201765386, -377732593, -906460130, 0, 
471         -2096529274, 1211247597, -1407315600, 1315723890, 
472         -67301633, 1443857720, 507358933, 657861945, 
473         1678381017, 560487590, -778347692, 975451694, 
474         -1324610969, 261314535, -759894378, -1642357871, 
475         1333838021, -1570644960, 1767536459, 370938394, 
476         182621114, -440360918, 1128014560, 487725847, 
477         185469197, -1376613433, -1188186456, -938205527, 
478         -2057834215, 1286567175, -1141990947, -39616672, 
479         -1611202266, -1134791947, -985373125, 878443390, 
480         1988838185, -590666810, 1756818940, 1673061617, 
481         -891866660, 272786309, 1075025698, 545572369, 
482         2105887268, -120407235, 296679730, 1841768865, 
483         1260232239, -203640272, -334657966, -797457949, 
484         1814803222, -1716948807, -99511224, 575138148, 
485         -995558260, 446754879, -665420500, -282971248, 
486         -947435186, -1042728751, -24327518, 915985419, 
487         -811141759, 681933534, 651868046, -1539330625, 
488         -466863459, 223377554, -1687527476, 1649704518, 
489         -1024029421, -393160520, 1580087799, -175979601, 
490         -1096852096, 2087309459, -1452288723, -1278270190, 
491         1003007129, -1492117379, 1860738147, 2077965243, 
492         164439672, -194094824, 32283319, -1467789414, 
493         1709610350, 2125135846, 136428751, -420538904, 
494         -642062437, -833982666, -722821367, -701910916, 
495         -1355701070, 824852259, 818324884, -1070226842, 
496         930369212, -1493400886, -1327460144, 355706840, 
497         1257309336, -146674470, 243256656, 790073846, 
498         -1921626666, 1296297904, 1422699085, -538667516, 
499         -476130891, 457992840, -1195299809, 2135319889, 
500         77422314, 1560382517, 1945798516, 788204353, 
501         1521706781, 1385356242, 870912086, 325965383, 
502         -1936009375, 2050466060, -1906706412, -1981082820, 
503         -288446169, 901210569, -304014107, 1014646705, 
504         1503449823, 1062597235, 2031621326, -1082931401, 
505         -363595827, 1533017514, 350174575, -2038938405, 
506         -2117423117, 1052338372, 741876788, 1606591296, 
507         1914052035, 213705253, -1960297399, 1107234197, 
508         1899603969, -569897805, -1663519516, -1872472383, 
509         1635502980, 1893020342, 1950903388, 1120974935
510 };
511
512 const int AES::sm_T7[256] =
513 {
514         -1487908364, 1699970625, -1530717673, 1586903591, 
515         1808481195, 1173430173, 1487645946, 59984867, 
516         -95084496, 1844882806, 1989249228, 1277555970, 
517         -671330331, -875051734, 1149249077, -1550863006, 
518         1514790577, 459744698, 244860394, -1058972162, 
519         1963115311, -267222708, -1750889146, -104436781, 
520         1608975247, -1667951214, 2062270317, 1507497298, 
521         -2094148418, 567498868, 1764313568, -935031095, 
522         -1989511742, 2037970062, 1047239000, 1910319033, 
523         1337376481, -1390940024, -1402549984, 984907214, 
524         1243112415, 830661914, 861968209, 2135253587, 
525         2011214180, -1367032981, -1608712575, 731183368, 
526         1750626376, -48656571, 1820824798, -122203525, 
527         -752637069, 48394827, -1890065633, -1423284651, 
528         671593195, -1039978571, 2073724613, 145085239, 
529         -2014171096, -1515052097, 1790575107, -2107839210, 
530         472615631, -1265457287, -219090169, -492745111, 
531         -187865638, -1093335547, 1646252340, -24460122, 
532         1402811438, 1436590835, -516815478, -344611594, 
533         -331805821, -274055072, -1626972559, 273792366, 
534         -1963377119, 104699613, 95345982, -1119466010, 
535         -1917480620, 1560637892, -730921978, 369057872, 
536         -81520232, -375925059, 1137477952, -1636341799, 
537         1119727848, -1954019447, 1530455833, -287606328, 
538         172466556, 266959938, 516552836, 0, 
539         -2038232704, -314035669, 1890328081, 1917742170, 
540         -262898, 945164165, -719438418, 958871085, 
541         -647755249, -1507760036, 1423022939, 775562294, 
542         1739656202, -418409641, -1764576018, -1851909221, 
543         -984645440, 547512796, 1265195639, 437656594, 
544         -1173691757, 719700128, -532464606, 387781147, 
545         218828297, -944901493, -1464259146, -1446505442, 
546         428169201, 122466165, -574886247, 1627235199, 
547         648017665, -172204942, 1002783846, 2117360635, 
548         695634755, -958608605, -60246291, -245122844, 
549         -590686415, -2062531997, 574624663, 287343814, 
550         612205898, 1039717051, 840019705, -1586641111, 
551         793451934, 821288114, 1391201670, -472877119, 
552         376187827, -1181111952, 1224348052, 1679968233, 
553         -1933268740, 1058709744, 752375421, -1863376333, 
554         1321699145, -775825096, -1560376118, 188127444, 
555         -2117097739, -567761542, -1910056265, -1079754835, 
556         -1645990854, -1844621192, -862229921, 1180849278, 
557         331544205, -1192718120, -144822727, -1342864701, 
558         -2134991011, -1820562992, 766078933, 313773861, 
559         -1724135252, 2108100632, 1668212892, -1149510853, 
560         2013908262, 418672217, -1224610662, -1700232369, 
561         1852171925, -427906305, -821550660, -387518699, 
562         -1680229657, 919489135, 164948639, 2094410160, 
563         -1297141340, 590424639, -1808742747, 1723872674, 
564         -1137216434, -895026046, -793714544, -669699161, 
565         -1739919100, -621329940, 1343127501, -164685935, 
566         -695372211, -1337113617, 1297403050, 81781910, 
567         -1243373871, -2011476886, 532201772, 1367295589, 
568         -368796322, 895287692, 1953757831, 1093597963, 
569         492483431, -766340389, 1446242576, 1192455638, 
570         1636604631, 209336225, 344873464, 1015671571, 
571         669961897, -919226527, -437395172, -1321436601, 
572         -547775278, 1933530610, -830924780, 935293895, 
573         -840281097, -1436852227, 1863638845, -611944380, 
574         -209597777, -1002522264, 875313188, 1080017571, 
575         -1015933411, 621591778, 1233856572, -1790836979, 
576         24197544, -1277294580, -459482956, -1047501738, 
577         -2073986101, -1234119374, 1551124588, 1463996600
578 };
579
580 const int AES::sm_T8[256] =
581 {
582         -190361519, 1097159550, 396673818, 660510266, 
583         -1418998981, -1656360673, -94852180, -486304949, 
584         821712160, 1986918061, -864644728, 38544885, 
585         -438830001, 718002117, 893681702, 1654886325, 
586         -1319482914, -1172609243, -368142267, -20913827, 
587         796197571, 1290801793, 1184342925, -738605461, 
588         -1889540349, -1835231979, 1836772287, 1381620373, 
589         -1098699308, 1948373848, -529979063, -909622130, 
590         -1031181707, -1904641804, 1480485785, -1183720153, 
591         -514869570, -2001922064, 548169417, -835013507, 
592         -548792221, 439452389, 1362321559, 1400849762, 
593         1685577905, 1806599355, -2120213250, 137073913, 
594         1214797936, 1174215055, -563312748, 2079897426, 
595         1943217067, 1258480242, 529487843, 1437280870, 
596         -349698126, -1245576401, -981755258, 923313619, 
597         679998000, -1079659997, 57326082, 377642221, 
598         -820237430, 2041877159, 133361907, 1776460110, 
599         -621490843, 96392454, 878845905, -1493267772, 
600         777231668, -212492126, -1964953083, -152341084, 
601         -2081670901, 1626319424, 1906247262, 1846563261, 
602         562755902, -586793578, 1040559837, -423803315, 
603         1418573201, -1000536719, 114585348, 1343618912, 
604         -1728371687, -1108764714, 1078185097, -643926169, 
605         -398279248, -1987344377, 425408743, -923870343, 
606         2081048481, 1108339068, -2078357000, 0, 
607         -2138668279, 736970802, 292596766, 1517440620, 
608         251657213, -2059905521, -1361764803, 758720310, 
609         265905162, 1554391400, 1532285339, 908999204, 
610         174567692, 1474760595, -292105548, -1684955621, 
611         -1060810880, -601841055, 2001430874, 303699484, 
612         -1816524062, -1607801408, 585122620, 454499602, 
613         151849742, -1949848078, -1230456531, 514443284, 
614         -249985705, 1963412655, -1713521682, 2137062819, 
615         19308535, 1928707164, 1715193156, -75615141, 
616         1126790795, 600235211, -302225226, -453942344, 
617         836553431, 1669664834, -1759363053, -971956092, 
618         1243905413, -1153566510, -114159186, 698445255, 
619         -1641067747, -1305414692, -2041385971, -1042034569, 
620         -1290376149, 1891211689, -1807156719, -379313593, 
621         -57883480, -264299872, 2100090966, 865136418, 
622         1229899655, 953270745, -895287668, -737462632, 
623         -176042074, 2061379749, -1215420710, -1379949505, 
624         983426092, 2022837584, 1607244650, 2118541908, 
625         -1928084746, -658970480, 972512814, -1011878526, 
626         1568718495, -795640727, -718427793, 621982671, 
627         -1399243832, 410887952, -1671205144, 1002142683, 
628         645401037, 1494807662, -1699282452, 1335535747, 
629         -1787927066, -1671510, -1127282655, 367585007, 
630         -409216582, 1865862730, -1626745622, -1333995991, 
631         -1531793615, 1059270954, -1517014842, -1570324427, 
632         1320957812, -2100648196, -1865371424, -1479011021, 
633         77089521, -321194175, -850391425, -1846137065, 
634         1305906550, -273658557, -1437772596, -1778065436, 
635         -776608866, 1787304780, 740276417, 1699839814, 
636         1592394909, -1942659839, -2022411270, 188821243, 
637         1729977011, -606973294, 274084841, -699985043, 
638         -681472870, -1593017801, -132870567, 322734571, 
639         -1457000754, 1640576439, 484830689, 1202797690, 
640         -757114468, -227328171, 349075736, -952647821, 
641         -137500077, -39167137, 1030690015, 1155237496, 
642         -1342996022, 1757691577, 607398968, -1556062270, 
643         499347990, -500888388, 1011452712, 227885567, 
644         -1476300487, 213114376, -1260086056, 1455525988, 
645         -880516741, 850817237, 1817998408, -1202240816
646 };
647
648 const int AES::sm_U1[256] =
649 {
650         0, 235474187, 470948374, 303765277, 
651         941896748, 908933415, 607530554, 708780849, 
652         1883793496, 2118214995, 1817866830, 1649639237, 
653         1215061108, 1181045119, 1417561698, 1517767529, 
654         -527380304, -291906117, -58537306, -225720403, 
655         -659233636, -692196969, -995688822, -894438527, 
656         -1864845080, -1630423581, -1932877058, -2101104651, 
657         -1459843900, -1493859889, -1259432238, -1159226407, 
658         -616842373, -718096784, -953573011, -920605594, 
659         -484470953, -317291940, -15887039, -251357110, 
660         -1418472669, -1518674392, -1218328267, -1184316354, 
661         -1822955761, -1654724092, -1891238631, -2125664238, 
662         1001089995, 899835584, 666464733, 699432150, 
663         59727847, 226906860, 530400753, 294930682, 
664         1273168787, 1172967064, 1475418501, 1509430414, 
665         1942435775, 2110667444, 1876241833, 1641816226, 
666         -1384747530, -1551933187, -1318815776, -1083344149, 
667         -1789765158, -1688513327, -1992277044, -2025238841, 
668         -583137874, -751368027, -1054072904, -819653965, 
669         -451268222, -351060855, -116905068, -150919521, 
670         1306967366, 1139781709, 1374988112, 1610459739, 
671         1975683434, 2076935265, 1775276924, 1742315127, 
672         1034867998, 866637845, 566021896, 800440835, 
673         92987698, 193195065, 429456164, 395441711, 
674         1984812685, 2017778566, 1784663195, 1683407248, 
675         1315562145, 1080094634, 1383856311, 1551037884, 
676         101039829, 135050206, 437757123, 337553864, 
677         1042385657, 807962610, 573804783, 742039012, 
678         -1763899843, -1730933962, -1966138325, -2067394272, 
679         -1359400431, -1594867942, -1293211641, -1126030068, 
680         -426414491, -392404114, -91786125, -191989384, 
681         -558802359, -793225406, -1029488545, -861254316, 
682         1106041591, 1340463100, 1576976609, 1408749034, 
683         2043211483, 2009195472, 1708848333, 1809054150, 
684         832877231, 1068351396, 766945465, 599762354, 
685         159417987, 126454664, 361929877, 463180190, 
686         -1585706425, -1351284916, -1116860335, -1285087910, 
687         -1722270101, -1756286112, -2058738563, -1958532746, 
688         -785096161, -549621996, -853116919, -1020300030, 
689         -384805325, -417768648, -184398811, -83148498, 
690         -1697160820, -1797362553, -2033878118, -1999866223, 
691         -1561111136, -1392879445, -1092530250, -1326955843, 
692         -358676012, -459930401, -158526526, -125559095, 
693         -759480840, -592301837, -827774994, -1063245083, 
694         2051518780, 1951317047, 1716890410, 1750902305, 
695         1113818384, 1282050075, 1584504582, 1350078989, 
696         168810852, 67556463, 371049330, 404016761, 
697         841739592, 1008918595, 775550814, 540080725, 
698         -325404927, -493635062, -259478249, -25059300, 
699         -725712083, -625504730, -928212677, -962227152, 
700         -1663901863, -1831087534, -2134850225, -1899378620, 
701         -1527321739, -1426069890, -1192955549, -1225917336, 
702         202008497, 33778362, 270040487, 504459436, 
703         875451293, 975658646, 675039627, 641025152, 
704         2084704233, 1917518562, 1615861247, 1851332852, 
705         1147550661, 1248802510, 1484005843, 1451044056, 
706         933301370, 967311729, 733156972, 632953703, 
707         260388950, 25965917, 328671808, 496906059, 
708         1206477858, 1239443753, 1543208500, 1441952575, 
709         2144161806, 1908694277, 1675577880, 1842759443, 
710         -684598070, -650587711, -886847780, -987051049, 
711         -283776794, -518199827, -217582864, -49348613, 
712         -1485196142, -1452230247, -1150570876, -1251826801, 
713         -1621262146, -1856729675, -2091935064, -1924753501
714 };
715
716 const int AES::sm_U2[256] =
717 {
718         0, 185469197, 370938394, 487725847, 
719         741876788, 657861945, 975451694, 824852259, 
720         1483753576, 1400783205, 1315723890, 1164071807, 
721         1950903388, 2135319889, 1649704518, 1767536459, 
722         -1327460144, -1141990947, -1493400886, -1376613433, 
723         -1663519516, -1747534359, -1966823682, -2117423117, 
724         -393160520, -476130891, -24327518, -175979601, 
725         -995558260, -811141759, -759894378, -642062437, 
726         2077965243, 1893020342, 1841768865, 1724457132, 
727         1474502543, 1559041666, 1107234197, 1257309336, 
728         598438867, 681933534, 901210569, 1052338372, 
729         261314535, 77422314, 428819965, 310463728, 
730         -885281941, -1070226842, -584599183, -701910916, 
731         -419197089, -334657966, -249586363, -99511224, 
732         -1823743229, -1740248562, -2057834215, -1906706412, 
733         -1082931401, -1266823622, -1452288723, -1570644960, 
734         -156404115, -39616672, -525245321, -339776134, 
735         -627748263, -778347692, -863420349, -947435186, 
736         -1361232379, -1512884472, -1195299809, -1278270190, 
737         -2098914767, -1981082820, -1795618773, -1611202266, 
738         1179510461, 1296297904, 1347548327, 1533017514, 
739         1786102409, 1635502980, 2087309459, 2003294622, 
740         507358933, 355706840, 136428751, 53458370, 
741         839224033, 957055980, 605657339, 790073846, 
742         -1921626666, -2038938405, -1687527476, -1872472383, 
743         -1588696606, -1438621457, -1219331080, -1134791947, 
744         -721025602, -569897805, -1021700188, -938205527, 
745         -113368694, -231724921, -282971248, -466863459, 
746         1033297158, 915985419, 730517276, 545572369, 
747         296679730, 446754879, 129166120, 213705253, 
748         1709610350, 1860738147, 1945798516, 2029293177, 
749         1239331162, 1120974935, 1606591296, 1422699085, 
750         -146674470, -61872681, -513933632, -363595827, 
751         -612775698, -797457949, -848962828, -966011911, 
752         -1355701070, -1539330625, -1188186456, -1306280027, 
753         -2096529274, -2012771957, -1793748324, -1642357871, 
754         1201765386, 1286567175, 1371368976, 1521706781, 
755         1805211710, 1620529459, 2105887268, 1988838185, 
756         533804130, 350174575, 164439672, 46346101, 
757         870912086, 954669403, 636813900, 788204353, 
758         -1936009375, -2020286868, -1702443653, -1853305738, 
759         -1599933611, -1414727080, -1229004465, -1112479678, 
760         -722821367, -538667516, -1024029421, -906460130, 
761         -120407235, -203640272, -288446169, -440360918, 
762         1014646705, 930369212, 711349675, 560487590, 
763         272786309, 457992840, 106852767, 223377554, 
764         1678381017, 1862534868, 1914052035, 2031621326, 
765         1211247597, 1128014560, 1580087799, 1428173050, 
766         32283319, 182621114, 401639597, 486441376, 
767         768917123, 651868046, 1003007129, 818324884, 
768         1503449823, 1385356242, 1333838021, 1150208456, 
769         1973745387, 2125135846, 1673061617, 1756818940, 
770         -1324610969, -1174273174, -1492117379, -1407315600, 
771         -1657524653, -1774573730, -1960297399, -2144979644, 
772         -377732593, -495826174, -10465259, -194094824, 
773         -985373125, -833982666, -749177823, -665420500, 
774         2050466060, 1899603969, 1814803222, 1730525723, 
775         1443857720, 1560382517, 1075025698, 1260232239, 
776         575138148, 692707433, 878443390, 1062597235, 
777         243256656, 91341917, 409198410, 325965383, 
778         -891866660, -1042728751, -590666810, -674944309, 
779         -420538904, -304014107, -252508174, -67301633, 
780         -1834518092, -1716948807, -2068091986, -1883938141, 
781         -1096852096, -1248766835, -1467789414, -1551022441, 
782 };
783
784 const int AES::sm_U3[256] =
785 {
786         0, 218828297, 437656594, 387781147, 
787         875313188, 958871085, 775562294, 590424639, 
788         1750626376, 1699970625, 1917742170, 2135253587, 
789         1551124588, 1367295589, 1180849278, 1265195639, 
790         -793714544, -574886247, -895026046, -944901493, 
791         -459482956, -375925059, -24460122, -209597777, 
792         -1192718120, -1243373871, -1560376118, -1342864701, 
793         -1933268740, -2117097739, -1764576018, -1680229657, 
794         -1149510853, -1234119374, -1586641111, -1402549984, 
795         -1890065633, -2107839210, -1790836979, -1739919100, 
796         -752637069, -567761542, -919226527, -1002522264, 
797         -418409641, -368796322, -48656571, -267222708, 
798         1808481195, 1723872674, 1910319033, 2094410160, 
799         1608975247, 1391201670, 1173430173, 1224348052, 
800         59984867, 244860394, 428169201, 344873464, 
801         935293895, 984907214, 766078933, 547512796, 
802         1844882806, 1627235199, 2011214180, 2062270317, 
803         1507497298, 1423022939, 1137477952, 1321699145, 
804         95345982, 145085239, 532201772, 313773861, 
805         830661914, 1015671571, 731183368, 648017665, 
806         -1119466010, -1337113617, -1487908364, -1436852227, 
807         -1989511742, -2073986101, -1820562992, -1636341799, 
808         -719438418, -669699161, -821550660, -1039978571, 
809         -516815478, -331805821, -81520232, -164685935, 
810         -695372211, -611944380, -862229921, -1047501738, 
811         -492745111, -274055072, -122203525, -172204942, 
812         -1093335547, -1277294580, -1530717673, -1446505442, 
813         -1963377119, -2014171096, -1863376333, -1645990854, 
814         104699613, 188127444, 472615631, 287343814, 
815         840019705, 1058709744, 671593195, 621591778, 
816         1852171925, 1668212892, 1953757831, 2037970062, 
817         1514790577, 1463996600, 1080017571, 1297403050, 
818         -621329940, -671330331, -1058972162, -840281097, 
819         -287606328, -472877119, -187865638, -104436781, 
820         -1297141340, -1079754835, -1464259146, -1515052097, 
821         -2038232704, -1954019447, -1667951214, -1851909221, 
822         172466556, 122466165, 273792366, 492483431, 
823         1047239000, 861968209, 612205898, 695634755, 
824         1646252340, 1863638845, 2013908262, 1963115311, 
825         1446242576, 1530455833, 1277555970, 1093597963, 
826         1636604631, 1820824798, 2073724613, 1989249228, 
827         1436590835, 1487645946, 1337376481, 1119727848, 
828         164948639, 81781910, 331544205, 516552836, 
829         1039717051, 821288114, 669961897, 719700128, 
830         -1321436601, -1137216434, -1423284651, -1507760036, 
831         -2062531997, -2011476886, -1626972559, -1844621192, 
832         -647755249, -730921978, -1015933411, -830924780, 
833         -314035669, -532464606, -144822727, -95084496, 
834         -1224610662, -1173691757, -1390940024, -1608712575, 
835         -2094148418, -1910056265, -1724135252, -1808742747, 
836         -547775278, -766340389, -984645440, -935031095, 
837         -344611594, -427906305, -245122844, -60246291, 
838         1739656202, 1790575107, 2108100632, 1890328081, 
839         1402811438, 1586903591, 1233856572, 1149249077, 
840         266959938, 48394827, 369057872, 418672217, 
841         1002783846, 919489135, 567498868, 752375421, 
842         209336225, 24197544, 376187827, 459744698, 
843         945164165, 895287692, 574624663, 793451934, 
844         1679968233, 1764313568, 2117360635, 1933530610, 
845         1343127501, 1560637892, 1243112415, 1192455638, 
846         -590686415, -775825096, -958608605, -875051734, 
847         -387518699, -437395172, -219090169, -262898, 
848         -1265457287, -1181111952, -1367032981, -1550863006, 
849         -2134991011, -1917480620, -1700232369, -1750889146
850 };
851
852 const int AES::sm_U4[256] =
853 {
854         0, 151849742, 303699484, 454499602, 
855         607398968, 758720310, 908999204, 1059270954, 
856         1214797936, 1097159550, 1517440620, 1400849762, 
857         1817998408, 1699839814, 2118541908, 2001430874, 
858         -1865371424, -1713521682, -2100648196, -1949848078, 
859         -1260086056, -1108764714, -1493267772, -1342996022, 
860         -658970480, -776608866, -895287668, -1011878526, 
861         -57883480, -176042074, -292105548, -409216582, 
862         1002142683, 850817237, 698445255, 548169417, 
863         529487843, 377642221, 227885567, 77089521, 
864         1943217067, 2061379749, 1640576439, 1757691577, 
865         1474760595, 1592394909, 1174215055, 1290801793, 
866         -1418998981, -1570324427, -1183720153, -1333995991, 
867         -1889540349, -2041385971, -1656360673, -1807156719, 
868         -486304949, -368142267, -249985705, -132870567, 
869         -952647821, -835013507, -718427793, -601841055, 
870         1986918061, 2137062819, 1685577905, 1836772287, 
871         1381620373, 1532285339, 1078185097, 1229899655, 
872         1040559837, 923313619, 740276417, 621982671, 
873         439452389, 322734571, 137073913, 19308535, 
874         -423803315, -273658557, -190361519, -39167137, 
875         -1031181707, -880516741, -795640727, -643926169, 
876         -1361764803, -1479011021, -1127282655, -1245576401, 
877         -1964953083, -2081670901, -1728371687, -1846137065, 
878         1305906550, 1155237496, 1607244650, 1455525988, 
879         1776460110, 1626319424, 2079897426, 1928707164, 
880         96392454, 213114376, 396673818, 514443284, 
881         562755902, 679998000, 865136418, 983426092, 
882         -586793578, -737462632, -820237430, -971956092, 
883         -114159186, -264299872, -349698126, -500888388, 
884         -1787927066, -1671205144, -2022411270, -1904641804, 
885         -1319482914, -1202240816, -1556062270, -1437772596, 
886         -321194175, -438830001, -20913827, -137500077, 
887         -923870343, -1042034569, -621490843, -738605461, 
888         -1531793615, -1379949505, -1230456531, -1079659997, 
889         -2138668279, -1987344377, -1835231979, -1684955621, 
890         2081048481, 1963412655, 1846563261, 1729977011, 
891         1480485785, 1362321559, 1243905413, 1126790795, 
892         878845905, 1030690015, 645401037, 796197571, 
893         274084841, 425408743, 38544885, 188821243, 
894         -681472870, -563312748, -981755258, -864644728, 
895         -212492126, -94852180, -514869570, -398279248, 
896         -1626745622, -1778065436, -1928084746, -2078357000, 
897         -1153566510, -1305414692, -1457000754, -1607801408, 
898         1202797690, 1320957812, 1437280870, 1554391400, 
899         1669664834, 1787304780, 1906247262, 2022837584, 
900         265905162, 114585348, 499347990, 349075736, 
901         736970802, 585122620, 972512814, 821712160, 
902         -1699282452, -1816524062, -2001922064, -2120213250, 
903         -1098699308, -1215420710, -1399243832, -1517014842, 
904         -757114468, -606973294, -1060810880, -909622130, 
905         -152341084, -1671510, -453942344, -302225226, 
906         174567692, 57326082, 410887952, 292596766, 
907         777231668, 660510266, 1011452712, 893681702, 
908         1108339068, 1258480242, 1343618912, 1494807662, 
909         1715193156, 1865862730, 1948373848, 2100090966, 
910         -1593017801, -1476300487, -1290376149, -1172609243, 
911         -2059905521, -1942659839, -1759363053, -1641067747, 
912         -379313593, -529979063, -75615141, -227328171, 
913         -850391425, -1000536719, -548792221, -699985043, 
914         836553431, 953270745, 600235211, 718002117, 
915         367585007, 484830689, 133361907, 251657213, 
916         2041877159, 1891211689, 1806599355, 1654886325, 
917         1568718495, 1418573201, 1335535747, 1184342925
918 };
919
920 const char AES::sm_rcon[30] =
921 {
922         1, 2, 4, 8, 16, 32, 
923         64, -128, 27, 54, 108, -40, 
924         -85, 77, -102, 47, 94, -68, 
925         99, -58, -105, 53, 106, -44, 
926         -77, 125, -6, -17, -59, -111
927 };
928
929 const int AES::sm_shifts[3][4][2] =
930 {
931         { {0, 0}, {1, 3}, {2, 2}, {3, 1} },
932         { {0, 0}, {1, 5}, {2, 4}, {3, 3} },
933         { {0, 0}, {1, 7}, {3, 5}, {4, 4} }
934 };
935
936 /**
937  * Null chain
938  */
939 char const* AES::sm_chain0 = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
940
941 /**
942  * CONSTRUCTOR
943  */
944 AES::AES() : m_bKeyInit(false)
945 {
946 }
947
948 /**
949  * DESTRUCTOR
950  */
951 AES::~AES()
952 {
953 }
954
955 /** Expand a user-supplied key material into a session key.
956  * @param key The 128/192/256-bit user-key to use.
957  * @param chain initial chain block for CBC and CFB modes.
958  * @param keylength 16, 24 or 32 bytes
959  * @param blockSize The block size in bytes of this Rijndael (16, 24 or 32 bytes).
960  */
961 void AES::MakeKey(char const* key, char const* chain, int keylength, int blockSize)
962 {
963         if (NULL == key)
964                 return;
965         if (!(keylength == 16 || keylength == 24 || keylength == 32))
966                 return;
967         if (!(blockSize == 16 || blockSize == 24 || blockSize == 32))
968                 return;
969         m_keylength = keylength;
970         m_blockSize = blockSize;
971         /* Initialize the chain */
972         memcpy(m_chain0, chain, m_blockSize);
973         memcpy(m_chain, chain, m_blockSize);
974         /* Calculate Number of Rounds */
975         switch (m_keylength)
976         {
977                 case 16:
978                         m_iROUNDS = (m_blockSize == 16) ? 10 : (m_blockSize == 24 ? 12 : 14);
979                         break;
980
981                 case 24:
982                         m_iROUNDS = (m_blockSize != 32) ? 12 : 14;
983                         break;
984
985                 default: /* 32 bytes = 256 bits */
986                         m_iROUNDS = 14;
987         }
988         int BC = m_blockSize / 4;
989         int i, j;
990         for (i=0; i<=m_iROUNDS; i++)
991         {
992                 for (j=0; j<BC; j++)
993                         m_Ke[i][j] = 0;
994         }
995         for (i=0; i<=m_iROUNDS; i++)
996         {
997                 for (j=0; j<BC; j++)
998                         m_Kd[i][j] = 0;
999         }
1000         int ROUND_KEY_COUNT = (m_iROUNDS + 1) * BC;
1001         int KC = m_keylength/4;
1002         /* Copy user material bytes into temporary ints */
1003         int* pi = tk;
1004         char const* pc = key;
1005         for (i=0; i<KC; i++)
1006         {
1007                 *pi = (unsigned char)*(pc++) << 24;
1008                 *pi |= (unsigned char)*(pc++) << 16;
1009                 *pi |= (unsigned char)*(pc++) << 8;
1010                 *(pi++) |= (unsigned char)*(pc++);
1011         }
1012         /* Copy values into round key arrays */
1013         int t = 0;
1014         for (j=0; (j<KC)&&(t<ROUND_KEY_COUNT); j++,t++)
1015         {
1016                 m_Ke[t/BC][t%BC] = tk[j];
1017                 m_Kd[m_iROUNDS - (t/BC)][t%BC] = tk[j];
1018         }
1019         int tt, rconpointer = 0;
1020         while (t < ROUND_KEY_COUNT)
1021         {
1022                 /* Extrapolate using phi (the round key evolution function) */
1023                 tt = tk[KC-1];
1024                 tk[0] ^= (sm_S[(tt >> 16) & 0xFF] & 0xFF) << 24 ^
1025                         (sm_S[(tt >>  8) & 0xFF] & 0xFF) << 16 ^
1026                         (sm_S[ tt & 0xFF] & 0xFF) <<  8 ^
1027                         (sm_S[(tt >> 24) & 0xFF] & 0xFF) ^
1028                         (sm_rcon[rconpointer++]  & 0xFF) << 24;
1029                 if (KC != 8)
1030                         for (i=1, j=0; i<KC;)
1031                                 tk[i++] ^= tk[j++];
1032                 else
1033                 {
1034                         for (i=1, j=0; i<KC/2; )
1035                                 tk[i++] ^= tk[j++];
1036                         tt = tk[KC/2-1];
1037                         tk[KC/2] ^= (sm_S[ tt & 0xFF] & 0xFF) ^
1038                                 (sm_S[(tt >>  8) & 0xFF] & 0xFF) <<  8 ^
1039                                 (sm_S[(tt >> 16) & 0xFF] & 0xFF) << 16 ^
1040                                 (sm_S[(tt >> 24) & 0xFF] & 0xFF) << 24;
1041                         for (j = KC/2, i=j+1; i<KC; )
1042                                 tk[i++] ^= tk[j++];
1043                 }
1044                 /* Copy values into round key arrays */
1045                 for (j=0; (j<KC) && (t<ROUND_KEY_COUNT); j++, t++)
1046                 {
1047                         m_Ke[t/BC][t%BC] = tk[j];
1048                         m_Kd[m_iROUNDS - (t/BC)][t%BC] = tk[j];
1049                 }
1050         }
1051         /* Inverse MixColumn where needed */
1052         for (int r=1; r<m_iROUNDS; r++)
1053                 for (j=0; j<BC; j++)
1054                 {
1055                         tt = m_Kd[r][j];
1056                         m_Kd[r][j] = sm_U1[(tt >> 24) & 0xFF] ^
1057                                 sm_U2[(tt >> 16) & 0xFF] ^
1058                                 sm_U3[(tt >>  8) & 0xFF] ^
1059                                 sm_U4[tt & 0xFF];
1060                 }
1061         m_bKeyInit = true;
1062 }
1063
1064 /** Convenience method to encrypt exactly one block of plaintext, assuming Rijndael's default block size (128-bit).
1065  * @param in The plaintext
1066  * @returns The ciphertext generated from a plaintext using the key
1067  */
1068 void AES::DefEncryptBlock(char const* in, char* result)
1069 {
1070         if (m_bKeyInit == false)
1071                 return;
1072         int* Ker = m_Ke[0];
1073         int t0 = ((unsigned char)*(in++) << 24);
1074         t0 |= ((unsigned char)*(in++) << 16);
1075         t0 |= ((unsigned char)*(in++) << 8);
1076         (t0 |= (unsigned char)*(in++)) ^= Ker[0];
1077         int t1 = ((unsigned char)*(in++) << 24);
1078         t1 |= ((unsigned char)*(in++) << 16);
1079         t1 |= ((unsigned char)*(in++) << 8);
1080         (t1 |= (unsigned char)*(in++)) ^= Ker[1];
1081         int t2 = ((unsigned char)*(in++) << 24);
1082         t2 |= ((unsigned char)*(in++) << 16);
1083         t2 |= ((unsigned char)*(in++) << 8);
1084         (t2 |= (unsigned char)*(in++)) ^= Ker[2];
1085         int t3 = ((unsigned char)*(in++) << 24);
1086         t3 |= ((unsigned char)*(in++) << 16);
1087         t3 |= ((unsigned char)*(in++) << 8);
1088         (t3 |= (unsigned char)*(in++)) ^= Ker[3];
1089         int a0, a1, a2, a3;
1090         /* Apply round transforms */
1091         for (int r = 1; r < m_iROUNDS; r++)
1092         {
1093                 Ker = m_Ke[r];
1094                 a0 = (sm_T1[(t0 >> 24) & 0xFF] ^
1095                         sm_T2[(t1 >> 16) & 0xFF] ^
1096                         sm_T3[(t2 >>  8) & 0xFF] ^
1097                         sm_T4[t3 & 0xFF]) ^ Ker[0];
1098                 a1 = (sm_T1[(t1 >> 24) & 0xFF] ^
1099                         sm_T2[(t2 >> 16) & 0xFF] ^
1100                         sm_T3[(t3 >>  8) & 0xFF] ^
1101                         sm_T4[t0 & 0xFF]) ^ Ker[1];
1102                 a2 = (sm_T1[(t2 >> 24) & 0xFF] ^
1103                         sm_T2[(t3 >> 16) & 0xFF] ^
1104                         sm_T3[(t0 >>  8) & 0xFF] ^
1105                         sm_T4[t1 & 0xFF]) ^ Ker[2];
1106                 a3 = (sm_T1[(t3 >> 24) & 0xFF] ^
1107                         sm_T2[(t0 >> 16) & 0xFF] ^
1108                         sm_T3[(t1 >>  8) & 0xFF] ^
1109                         sm_T4[t2 & 0xFF]) ^ Ker[3];
1110                 t0 = a0;
1111                 t1 = a1;
1112                 t2 = a2;
1113                 t3 = a3;
1114         }
1115         /* Last round is special */
1116         Ker = m_Ke[m_iROUNDS];
1117         int tt = Ker[0];
1118         result[0] = sm_S[(t0 >> 24) & 0xFF] ^ (tt >> 24);
1119         result[1] = sm_S[(t1 >> 16) & 0xFF] ^ (tt >> 16);
1120         result[2] = sm_S[(t2 >>  8) & 0xFF] ^ (tt >>  8);
1121         result[3] = sm_S[t3 & 0xFF] ^ tt;
1122         tt = Ker[1];
1123         result[4] = sm_S[(t1 >> 24) & 0xFF] ^ (tt >> 24);
1124         result[5] = sm_S[(t2 >> 16) & 0xFF] ^ (tt >> 16);
1125         result[6] = sm_S[(t3 >>  8) & 0xFF] ^ (tt >>  8);
1126         result[7] = sm_S[t0 & 0xFF] ^ tt;
1127         tt = Ker[2];
1128         result[8] = sm_S[(t2 >> 24) & 0xFF] ^ (tt >> 24);
1129         result[9] = sm_S[(t3 >> 16) & 0xFF] ^ (tt >> 16);
1130         result[10] = sm_S[(t0 >>  8) & 0xFF] ^ (tt >>  8);
1131         result[11] = sm_S[t1 & 0xFF] ^ tt;
1132         tt = Ker[3];
1133         result[12] = sm_S[(t3 >> 24) & 0xFF] ^ (tt >> 24);
1134         result[13] = sm_S[(t0 >> 16) & 0xFF] ^ (tt >> 16);
1135         result[14] = sm_S[(t1 >>  8) & 0xFF] ^ (tt >>  8);
1136         result[15] = sm_S[t2 & 0xFF] ^ tt;
1137 }
1138
1139 /** Convenience method to decrypt exactly one block of plaintext, assuming Rijndael's default block size (128-bit).
1140  * @param in The ciphertext.
1141  * @return The plaintext generated from a ciphertext using the session key.
1142  */
1143 void AES::DefDecryptBlock(char const* in, char* result)
1144 {
1145         if (m_bKeyInit == false)
1146                 return;
1147         int* Kdr = m_Kd[0];
1148         int t0 = ((unsigned char)*(in++) << 24);
1149         t0 = t0 | ((unsigned char)*(in++) << 16);
1150         t0 |= ((unsigned char)*(in++) << 8);
1151         (t0 |= (unsigned char)*(in++)) ^= Kdr[0];
1152         int t1 = ((unsigned char)*(in++) << 24);
1153         t1 |= ((unsigned char)*(in++) << 16);
1154         t1 |= ((unsigned char)*(in++) << 8);
1155         (t1 |= (unsigned char)*(in++)) ^= Kdr[1];
1156         int t2 = ((unsigned char)*(in++) << 24);
1157         t2 |= ((unsigned char)*(in++) << 16);
1158         t2 |= ((unsigned char)*(in++) << 8);
1159         (t2 |= (unsigned char)*(in++)) ^= Kdr[2];
1160         int t3 = ((unsigned char)*(in++) << 24);
1161         t3 |= ((unsigned char)*(in++) << 16);
1162         t3 |= ((unsigned char)*(in++) << 8);
1163         (t3 |= (unsigned char)*(in++)) ^= Kdr[3];
1164         int a0, a1, a2, a3;
1165         for (int r = 1; r < m_iROUNDS; r++) /* apply round transforms */
1166         {
1167                 Kdr = m_Kd[r];
1168                 a0 = (sm_T5[(t0 >> 24) & 0xFF] ^
1169                         sm_T6[(t3 >> 16) & 0xFF] ^
1170                         sm_T7[(t2 >>  8) & 0xFF] ^
1171                         sm_T8[ t1        & 0xFF] ) ^ Kdr[0];
1172                 a1 = (sm_T5[(t1 >> 24) & 0xFF] ^
1173                         sm_T6[(t0 >> 16) & 0xFF] ^
1174                         sm_T7[(t3 >>  8) & 0xFF] ^
1175                         sm_T8[ t2        & 0xFF] ) ^ Kdr[1];
1176                 a2 = (sm_T5[(t2 >> 24) & 0xFF] ^
1177                         sm_T6[(t1 >> 16) & 0xFF] ^
1178                         sm_T7[(t0 >>  8) & 0xFF] ^
1179                         sm_T8[ t3        & 0xFF] ) ^ Kdr[2];
1180                 a3 = (sm_T5[(t3 >> 24) & 0xFF] ^
1181                         sm_T6[(t2 >> 16) & 0xFF] ^
1182                         sm_T7[(t1 >>  8) & 0xFF] ^
1183                         sm_T8[ t0        & 0xFF] ) ^ Kdr[3];
1184                 t0 = a0;
1185                 t1 = a1;
1186                 t2 = a2;
1187                 t3 = a3;
1188         }
1189         /* Last round is special */
1190         Kdr = m_Kd[m_iROUNDS];
1191         int tt = Kdr[0];
1192         result[ 0] = sm_Si[(t0 >> 24) & 0xFF] ^ (tt >> 24);
1193         result[ 1] = sm_Si[(t3 >> 16) & 0xFF] ^ (tt >> 16);
1194         result[ 2] = sm_Si[(t2 >>  8) & 0xFF] ^ (tt >>  8);
1195         result[ 3] = sm_Si[ t1 & 0xFF] ^ tt;
1196         tt = Kdr[1];
1197         result[ 4] = sm_Si[(t1 >> 24) & 0xFF] ^ (tt >> 24);
1198         result[ 5] = sm_Si[(t0 >> 16) & 0xFF] ^ (tt >> 16);
1199         result[ 6] = sm_Si[(t3 >>  8) & 0xFF] ^ (tt >>  8);
1200         result[ 7] = sm_Si[ t2 & 0xFF] ^ tt;
1201         tt = Kdr[2];
1202         result[ 8] = sm_Si[(t2 >> 24) & 0xFF] ^ (tt >> 24);
1203         result[ 9] = sm_Si[(t1 >> 16) & 0xFF] ^ (tt >> 16);
1204         result[10] = sm_Si[(t0 >>  8) & 0xFF] ^ (tt >>  8);
1205         result[11] = sm_Si[ t3 & 0xFF] ^ tt;
1206         tt = Kdr[3];
1207         result[12] = sm_Si[(t3 >> 24) & 0xFF] ^ (tt >> 24);
1208         result[13] = sm_Si[(t2 >> 16) & 0xFF] ^ (tt >> 16);
1209         result[14] = sm_Si[(t1 >>  8) & 0xFF] ^ (tt >>  8);
1210         result[15] = sm_Si[ t0 & 0xFF] ^ tt;
1211 }
1212
1213 /** Encrypt exactly one block of plaintext.
1214  * @param in The plaintext.
1215  * @return The ciphertext generated from a plaintext using the key.
1216  */
1217 void AES::EncryptBlock(char const* in, char* result)
1218 {
1219         if (m_bKeyInit == false)
1220                 return;
1221         if (DEFAULT_BLOCK_SIZE == m_blockSize)
1222         {
1223                 DefEncryptBlock(in, result);
1224                 return;
1225         }
1226         int BC = m_blockSize / 4;
1227         int SC = (BC == 4) ? 0 : (BC == 6 ? 1 : 2);
1228         int s1 = sm_shifts[SC][1][0];
1229         int s2 = sm_shifts[SC][2][0];
1230         int s3 = sm_shifts[SC][3][0];
1231         /* Temporary work arrays */
1232         int i;
1233         int tt;
1234         int* pi = t;
1235         for (i=0; i<BC; i++)
1236         {
1237                 *pi = ((unsigned char)*(in++) << 24);
1238                 *pi |= ((unsigned char)*(in++) << 16);
1239                 *pi |= ((unsigned char)*(in++) << 8);
1240                 (*(pi++) |= (unsigned char)*(in++)) ^= m_Ke[0][i];
1241         }
1242         /* Apply round transforms */
1243         for (int r=1; r<m_iROUNDS; r++)
1244         {
1245                 for (i=0; i<BC; i++)
1246                         a[i] = (sm_T1[(t[i] >> 24) & 0xFF] ^
1247                                 sm_T2[(t[(i + s1) % BC] >> 16) & 0xFF] ^
1248                                 sm_T3[(t[(i + s2) % BC] >>  8) & 0xFF] ^
1249                                 sm_T4[ t[(i + s3) % BC] & 0xFF] ) ^ m_Ke[r][i];
1250                 memcpy(t, a, 4*BC);
1251         }
1252         int j;
1253         /* Last round is special */
1254         for (i=0,j=0; i<BC; i++)
1255         {
1256                 tt = m_Ke[m_iROUNDS][i];
1257                 result[j++] = sm_S[(t[i] >> 24) & 0xFF] ^ (tt >> 24);
1258                 result[j++] = sm_S[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16);
1259                 result[j++] = sm_S[(t[(i + s2) % BC] >>  8) & 0xFF] ^ (tt >>  8);
1260                 result[j++] = sm_S[ t[(i + s3) % BC] & 0xFF] ^ tt;
1261         }
1262 }
1263
1264 /** Decrypt exactly one block of ciphertext.
1265  * @param inThe ciphertext.
1266  * @return The plaintext generated from a ciphertext using the session key.
1267  */
1268 void AES::DecryptBlock(char const* in, char* result)
1269 {
1270         if (m_bKeyInit == false)
1271                 return;
1272         if (DEFAULT_BLOCK_SIZE == m_blockSize)
1273         {
1274                 DefDecryptBlock(in, result);
1275                 return;
1276         }
1277         int BC = m_blockSize / 4;
1278         int SC = BC == 4 ? 0 : (BC == 6 ? 1 : 2);
1279         int s1 = sm_shifts[SC][1][1];
1280         int s2 = sm_shifts[SC][2][1];
1281         int s3 = sm_shifts[SC][3][1];
1282         /* Temporary work arrays */
1283         int i;
1284         int tt;
1285         int* pi = t;
1286         for (i=0; i<BC; i++)
1287         {
1288                 *pi = ((unsigned char)*(in++) << 24);
1289                 *pi |= ((unsigned char)*(in++) << 16);
1290                 *pi |= ((unsigned char)*(in++) << 8);
1291                 (*(pi++) |= (unsigned char)*(in++)) ^= m_Kd[0][i];
1292         }
1293         /* Apply round transforms */
1294         for (int r=1; r<m_iROUNDS; r++)
1295         {
1296                 for (i=0; i<BC; i++)
1297                         a[i] = (sm_T5[(t[i] >> 24) & 0xFF] ^
1298                                 sm_T6[(t[(i + s1) % BC] >> 16) & 0xFF] ^
1299                                 sm_T7[(t[(i + s2) % BC] >>  8) & 0xFF] ^
1300                                 sm_T8[ t[(i + s3) % BC] & 0xFF]) ^ m_Kd[r][i];
1301                 memcpy(t, a, 4*BC);
1302         }
1303         int j;
1304         /* Last round is special */
1305         for (i=0,j=0; i<BC; i++)
1306         {
1307                 tt = m_Kd[m_iROUNDS][i];
1308                 result[j++] = sm_Si[(t[i] >> 24) & 0xFF] ^ (tt >> 24);
1309                 result[j++] = sm_Si[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16);
1310                 result[j++] = sm_Si[(t[(i + s2) % BC] >>  8) & 0xFF] ^ (tt >>  8);
1311                 result[j++] = sm_Si[ t[(i + s3) % BC] & 0xFF] ^ tt;
1312         }
1313 }
1314
1315 void AES::Encrypt(char const* in, char* result, size_t n, int iMode)
1316 {
1317         if (m_bKeyInit == false)
1318                 return;
1319         /* n should be > 0 and multiple of m_blockSize */
1320         if (n == 0 || n%m_blockSize!=0)
1321                 return;
1322         unsigned int i;
1323         char const* pin;
1324         char* presult;
1325         if (CBC == iMode) /* CBC mode, using the chain */
1326         {
1327                 for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
1328                 {
1329                         Xor(m_chain, pin);
1330                         EncryptBlock(m_chain, presult);
1331                         memcpy(m_chain, presult, m_blockSize);
1332                         pin += m_blockSize;
1333                         presult += m_blockSize;
1334                 }
1335         }
1336         else if (CFB == iMode) /* CFB mode, using the chain */
1337         {
1338                 for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
1339                 {
1340                         EncryptBlock(m_chain, presult);
1341                         Xor(presult, pin);
1342                         memcpy(m_chain, presult, m_blockSize);
1343                         pin += m_blockSize;
1344                         presult += m_blockSize;
1345                 }
1346         }
1347         else /* ECB mode, not using the chain */
1348         {
1349                 for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
1350                 {
1351                         EncryptBlock(pin, presult);
1352                         pin += m_blockSize;
1353                         presult += m_blockSize;
1354                 }
1355         }
1356 }
1357
1358 void AES::Decrypt(char const* in, char* result, size_t n, int iMode)
1359 {
1360         if (m_bKeyInit == false)
1361                 return;
1362         /* n should be > 0 and multiple of m_blockSize */
1363         if (n == 0 || n%m_blockSize!=0)
1364                 return;
1365         unsigned int i;
1366         char const* pin;
1367         char* presult;
1368         if (CBC == iMode) /* CBC mode, using the chain */
1369         {
1370                 for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
1371                 {
1372                         DecryptBlock(pin, presult);
1373                         Xor(presult, m_chain);
1374                         memcpy(m_chain, pin, m_blockSize);                              
1375                         pin += m_blockSize;
1376                         presult += m_blockSize;
1377                 }
1378         }
1379         else if (CFB == iMode) /* CFB mode, using the chain, not using Decrypt() */
1380         {
1381                 for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
1382                 {
1383                         EncryptBlock(m_chain, presult);
1384                         Xor(presult, pin);
1385                         memcpy(m_chain, pin, m_blockSize);
1386                         pin += m_blockSize;
1387                         presult += m_blockSize;
1388                 }
1389         }
1390         else /* ECB mode, not using the Chain */
1391         {
1392                 for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
1393                 {
1394                         DecryptBlock(pin, presult);
1395                         pin += m_blockSize;
1396                         presult += m_blockSize;
1397                 }
1398         }
1399 }
1400
1401
1402
1403 static const char base64digits[] =
1404    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1405
1406 #define BAD     -1
1407 static const char base64val[] = {
1408     BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
1409     BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
1410     BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63,
1411      52, 53, 54, 55,  56, 57, 58, 59,  60, 61,BAD,BAD, BAD,BAD,BAD,BAD,
1412     BAD,  0,  1,  2,   3,  4,  5,  6,   7,  8,  9, 10,  11, 12, 13, 14,
1413      15, 16, 17, 18,  19, 20, 21, 22,  23, 24, 25,BAD, BAD,BAD,BAD,BAD,
1414     BAD, 26, 27, 28,  29, 30, 31, 32,  33, 34, 35, 36,  37, 38, 39, 40,
1415      41, 42, 43, 44,  45, 46, 47, 48,  49, 50, 51,BAD, BAD,BAD,BAD,BAD
1416 };
1417 #define DECODE64(c)  (c < 128 ? base64val[c] : BAD)
1418
1419 void to64frombits(unsigned char *out, const unsigned char *in, int inlen)
1420 /* Raw bytes to base 64 string (NUL-terminated) */
1421 {
1422     for (; inlen >= 3; inlen -= 3)
1423     {
1424         *out++ = base64digits[in[0] >> 2];
1425         *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)];
1426         *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
1427         *out++ = base64digits[in[2] & 0x3f];
1428         in += 3;
1429     }
1430     if (inlen > 0)
1431     {
1432         unsigned char fragment;
1433     
1434         *out++ = base64digits[in[0] >> 2];
1435         fragment = (in[0] << 4) & 0x30;
1436         if (inlen > 1)
1437             fragment |= in[1] >> 4;
1438         *out++ = base64digits[fragment];
1439         *out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c];
1440         *out++ = '=';
1441     }
1442     *out = '\0';
1443 }
1444
1445 int from64tobits(char *out, const char *in, int maxlen)
1446 /* base 64 to raw bytes, returning count of bytes */
1447 /* maxlen limits output buffer size, set to zero to ignore */
1448 {
1449     int len = 0;
1450     register unsigned char digit1, digit2, digit3, digit4;
1451
1452     if (in[0] == '+' && in[1] == ' ')
1453         in += 2;
1454     if (*in == '\r')
1455         return(0);
1456
1457     do {
1458         digit1 = in[0];
1459         if (DECODE64(digit1) == BAD)
1460             return(-1);
1461         digit2 = in[1];
1462         if (DECODE64(digit2) == BAD)
1463             return(-1);
1464         digit3 = in[2];
1465         if (digit3 != '=' && DECODE64(digit3) == BAD)
1466             return(-1); 
1467         digit4 = in[3];
1468         if (digit4 != '=' && DECODE64(digit4) == BAD)
1469             return(-1);
1470         in += 4;
1471         ++len;
1472         if (maxlen && len > maxlen)
1473             return(-1);
1474         *out++ = (DECODE64(digit1) << 2) | (DECODE64(digit2) >> 4);
1475         if (digit3 != '=')
1476         {
1477             ++len;
1478             if (maxlen && len > maxlen)
1479                         return(-1);
1480             *out++ = ((DECODE64(digit2) << 4) & 0xf0) | (DECODE64(digit3) >> 2);
1481             if (digit4 != '=')
1482             {
1483                         ++len;
1484                 if (maxlen && len > maxlen)
1485                     return(-1);
1486                 *out++ = ((DECODE64(digit3) << 6) & 0xc0) | DECODE64(digit4);
1487             }
1488         }
1489     } while 
1490         (*in && *in != '\r' && digit4 != '=');
1491
1492     return (len);
1493 }