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