]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Adding AES encryption to spanningtree links
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Mon, 19 Dec 2005 14:15:48 +0000 (14:15 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Mon, 19 Dec 2005 14:15:48 +0000 (14:15 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@2568 e03df62e-2008-0410-955e-edbf42e46eb7

include/aes.h
src/aes.cpp
src/modules/m_spanningtree.cpp

index 66e68cac9ffbc64500af0c2b25e39ad04209af3c..05381954ab858afe4c71f734e81979e984056f7f 100644 (file)
@@ -161,3 +161,7 @@ private:
 \r
 #endif // __RIJNDAEL_H__\r
 \r
+void to64frombits(unsigned char *out, const unsigned char *in, int inlen);\r
+int from64tobits(char *out, const char *in, int maxlen);\r
+\r
+\r
index 649408309759cb12a5ef4ad2954a41b9ac95b497..c9189d68f25717351b12be62a05c8ef1fa4db0fb 100644 (file)
-\r
-//Rijndael.cpp\r
-\r
-#include <cstring>\r
-#include "aes.h"\r
-\r
-const int AES::sm_alog[256] =\r
-{\r
-       1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53, \r
-       95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170, \r
-       229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49, \r
-       83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205, \r
-       76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136, \r
-       131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154, \r
-       181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163, \r
-       254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160, \r
-       251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65, \r
-       195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117, \r
-       159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128, \r
-       155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84, \r
-       252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202, \r
-       69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14, \r
-       18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23, \r
-       57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1\r
-};\r
-\r
-const int AES::sm_log[256] =\r
-{\r
-       0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3, \r
-       100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193, \r
-       125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120, \r
-       101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142, \r
-       150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56, \r
-       102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16, \r
-       126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186, \r
-       43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, 167, 87, \r
-       175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230, 173, 232, \r
-       44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169, 81, 160, \r
-       127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183, \r
-       204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157, \r
-       151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209, \r
-       83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171, \r
-       68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, 227, 165, \r
-       103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7\r
-};\r
-\r
-const char AES::sm_S[256] =\r
-{\r
-       99, 124, 119, 123, -14, 107, 111, -59, 48, 1, 103, 43, -2, -41, -85, 118, \r
-       -54, -126, -55, 125, -6, 89, 71, -16, -83, -44, -94, -81, -100, -92, 114, -64, \r
-       -73, -3, -109, 38, 54, 63, -9, -52, 52, -91, -27, -15, 113, -40, 49, 21, \r
-       4, -57, 35, -61, 24, -106, 5, -102, 7, 18, -128, -30, -21, 39, -78, 117, \r
-       9, -125, 44, 26, 27, 110, 90, -96, 82, 59, -42, -77, 41, -29, 47, -124, \r
-       83, -47, 0, -19, 32, -4, -79, 91, 106, -53, -66, 57, 74, 76, 88, -49, \r
-       -48, -17, -86, -5, 67, 77, 51, -123, 69, -7, 2, 127, 80, 60, -97, -88, \r
-       81, -93, 64, -113, -110, -99, 56, -11, -68, -74, -38, 33, 16, -1, -13, -46, \r
-       -51, 12, 19, -20, 95, -105, 68, 23, -60, -89, 126, 61, 100, 93, 25, 115, \r
-       96, -127, 79, -36, 34, 42, -112, -120, 70, -18, -72, 20, -34, 94, 11, -37, \r
-       -32, 50, 58, 10, 73, 6, 36, 92, -62, -45, -84, 98, -111, -107, -28, 121, \r
-       -25, -56, 55, 109, -115, -43, 78, -87, 108, 86, -12, -22, 101, 122, -82, 8, \r
-       -70, 120, 37, 46, 28, -90, -76, -58, -24, -35, 116, 31, 75, -67, -117, -118, \r
-       112, 62, -75, 102, 72, 3, -10, 14, 97, 53, 87, -71, -122, -63, 29, -98, \r
-       -31, -8, -104, 17, 105, -39, -114, -108, -101, 30, -121, -23, -50, 85, 40, -33, \r
-       -116, -95, -119, 13, -65, -26, 66, 104, 65, -103, 45, 15, -80, 84, -69, 22\r
-};\r
-\r
-const char AES::sm_Si[256] =\r
-{\r
-       82, 9, 106, -43, 48, 54, -91, 56, -65, 64, -93, -98, -127, -13, -41, -5, \r
-       124, -29, 57, -126, -101, 47, -1, -121, 52, -114, 67, 68, -60, -34, -23, -53, \r
-       84, 123, -108, 50, -90, -62, 35, 61, -18, 76, -107, 11, 66, -6, -61, 78, \r
-       8, 46, -95, 102, 40, -39, 36, -78, 118, 91, -94, 73, 109, -117, -47, 37, \r
-       114, -8, -10, 100, -122, 104, -104, 22, -44, -92, 92, -52, 93, 101, -74, -110, \r
-       108, 112, 72, 80, -3, -19, -71, -38, 94, 21, 70, 87, -89, -115, -99, -124, \r
-       -112, -40, -85, 0, -116, -68, -45, 10, -9, -28, 88, 5, -72, -77, 69, 6, \r
-       -48, 44, 30, -113, -54, 63, 15, 2, -63, -81, -67, 3, 1, 19, -118, 107, \r
-       58, -111, 17, 65, 79, 103, -36, -22, -105, -14, -49, -50, -16, -76, -26, 115, \r
-       -106, -84, 116, 34, -25, -83, 53, -123, -30, -7, 55, -24, 28, 117, -33, 110, \r
-       71, -15, 26, 113, 29, 41, -59, -119, 111, -73, 98, 14, -86, 24, -66, 27, \r
-       -4, 86, 62, 75, -58, -46, 121, 32, -102, -37, -64, -2, 120, -51, 90, -12, \r
-       31, -35, -88, 51, -120, 7, -57, 49, -79, 18, 16, 89, 39, -128, -20, 95, \r
-       96, 81, 127, -87, 25, -75, 74, 13, 45, -27, 122, -97, -109, -55, -100, -17, \r
-       -96, -32, 59, 77, -82, 42, -11, -80, -56, -21, -69, 60, -125, 83, -103, 97, \r
-       23, 43, 4, 126, -70, 119, -42, 38, -31, 105, 20, 99, 85, 33, 12, 125\r
-};\r
-\r
-const int AES::sm_T1[256] =\r
-{\r
-       -966564955, -126059388, -294160487, -159679603, \r
-       -855539, -697603139, -563122255, -1849309868, \r
-       1613770832, 33620227, -832084055, 1445669757, \r
-       -402719207, -1244145822, 1303096294, -327780710, \r
-       -1882535355, 528646813, -1983264448, -92439161, \r
-       -268764651, -1302767125, -1907931191, -68095989, \r
-       1101901292, -1277897625, 1604494077, 1169141738, \r
-       597466303, 1403299063, -462261610, -1681866661, \r
-       1974974402, -503448292, 1033081774, 1277568618, \r
-       1815492186, 2118074177, -168298750, -2083730353, \r
-       1748251740, 1369810420, -773462732, -101584632, \r
-       -495881837, -1411852173, 1647391059, 706024767, \r
-       134480908, -1782069422, 1176707941, -1648114850, \r
-       806885416, 932615841, 168101135, 798661301, \r
-       235341577, 605164086, 461406363, -538779075, \r
-       -840176858, 1311188841, 2142417613, -361400929, \r
-       302582043, 495158174, 1479289972, 874125870, \r
-       907746093, -596742478, -1269146898, 1537253627, \r
-       -1538108682, 1983593293, -1210657183, 2108928974, \r
-       1378429307, -572267714, 1580150641, 327451799, \r
-       -1504488459, -1177431704, 0, -1041371860, \r
-       1075847264, -469959649, 2041688520, -1235526675, \r
-       -731223362, -1916023994, 1740553945, 1916352843, \r
-       -1807070498, -1739830060, -1336387352, -2049978550, \r
-       -1143943061, -974131414, 1336584933, -302253290, \r
-       -2042412091, -1706209833, 1714631509, 293963156, \r
-       -1975171633, -369493744, 67240454, -25198719, \r
-       -1605349136, 2017213508, 631218106, 1269344483, \r
-       -1571728909, 1571005438, -2143272768, 93294474, \r
-       1066570413, 563977660, 1882732616, -235539196, \r
-       1673313503, 2008463041, -1344611723, 1109467491, \r
-       537923632, -436207846, -34344178, -1076702611, \r
-       -2117218996, 403442708, 638784309, -1007883217, \r
-       -1101045791, 899127202, -2008791860, 773265209, \r
-       -1815821225, 1437050866, -58818942, 2050833735, \r
-       -932944724, -1168286233, 840505643, -428641387, \r
-       -1067425632, 427917720, -1638969391, -1545806721, \r
-       1143087718, 1412049534, 999329963, 193497219, \r
-       -1941551414, -940642775, 1807268051, 672404540, \r
-       -1478566279, -1134666014, 369822493, -1378100362, \r
-       -606019525, 1681011286, 1949973070, 336202270, \r
-       -1840690725, 201721354, 1210328172, -1201906460, \r
-       -1614626211, -1110191250, 1135389935, -1000185178, \r
-       965841320, 831886756, -739974089, -226920053, \r
-       -706222286, -1949775805, 1849112409, -630362697, \r
-       26054028, -1311386268, -1672589614, 1235855840, \r
-       -663982924, -1403627782, -202050553, -806688219, \r
-       -899324497, -193299826, 1202630377, 268961816, \r
-       1874508501, -260540280, 1243948399, 1546530418, \r
-       941366308, 1470539505, 1941222599, -1748580783, \r
-       -873928669, -1579295364, -395021156, 1042226977, \r
-       -1773450275, 1639824860, 227249030, 260737669, \r
-       -529502064, 2084453954, 1907733956, -865704278, \r
-       -1874310952, 100860677, -134810111, 470683154, \r
-       -1033805405, 1781871967, -1370007559, 1773779408, \r
-       394692241, -1715355304, 974986535, 664706745, \r
-       -639508168, -336005101, 731420851, 571543859, \r
-       -764843589, -1445340816, 126783113, 865375399, \r
-       765172662, 1008606754, 361203602, -907417312, \r
-       -2016489911, -1437248001, 1344809080, -1512054918, \r
-       59542671, 1503764984, 160008576, 437062935, \r
-       1707065306, -672733647, -2076032314, -798463816, \r
-       -2109652541, 697932208, 1512910199, 504303377, \r
-       2075177163, -1470868228, 1841019862, 739644986\r
-};\r
-\r
-const int AES::sm_T2[256] =\r
-{\r
-       -1513725085, -2064089988, -1712425097, -1913226373, \r
-       234877682, -1110021269, -1310822545, 1418839493, \r
-       1348481072, 50462977, -1446090905, 2102799147, \r
-       434634494, 1656084439, -431117397, -1695779210, \r
-       1167051466, -1658879358, 1082771913, -2013627011, \r
-       368048890, -340633255, -913422521, 201060592, \r
-       -331240019, 1739838676, -44064094, -364531793, \r
-       -1088185188, -145513308, -1763413390, 1536934080, \r
-       -1032472649, 484572669, -1371696237, 1783375398, \r
-       1517041206, 1098792767, 49674231, 1334037708, \r
-       1550332980, -195975771, 886171109, 150598129, \r
-       -1813876367, 1940642008, 1398944049, 1059722517, \r
-       201851908, 1385547719, 1699095331, 1587397571, \r
-       674240536, -1590192490, 252314885, -1255171430, \r
-       151914247, 908333586, -1692696448, 1038082786, \r
-       651029483, 1766729511, -847269198, -1612024459, \r
-       454166793, -1642232957, 1951935532, 775166490, \r
-       758520603, -1294176658, -290170278, -77881184, \r
-       -157003182, 1299594043, 1639438038, -830622797, \r
-       2068982057, 1054729187, 1901997871, -1760328572, \r
-       -173649069, 1757008337, 0, 750906861, \r
-       1614815264, 535035132, -931548751, -306816165, \r
-       -1093375382, 1183697867, -647512386, 1265776953, \r
-       -560706998, -728216500, -391096232, 1250283471, \r
-       1807470800, 717615087, -447763798, 384695291, \r
-       -981056701, -677753523, 1432761139, -1810791035, \r
-       -813021883, 283769337, 100925954, -2114027649, \r
-       -257929136, 1148730428, -1171939425, -481580888, \r
-       -207466159, -27417693, -1065336768, -1979347057, \r
-       -1388342638, -1138647651, 1215313976, 82966005, \r
-       -547111748, -1049119050, 1974459098, 1665278241, \r
-       807407632, 451280895, 251524083, 1841287890, \r
-       1283575245, 337120268, 891687699, 801369324, \r
-       -507617441, -1573546089, -863484860, 959321879, \r
-       1469301956, -229267545, -2097381762, 1199193405, \r
-       -1396153244, -407216803, 724703513, -1780059277, \r
-       -1598005152, -1743158911, -778154161, 2141445340, \r
-       1715741218, 2119445034, -1422159728, -2096396152, \r
-       -896776634, 700968686, -747915080, 1009259540, \r
-       2041044702, -490971554, 487983883, 1991105499, \r
-       1004265696, 1449407026, 1316239930, 504629770, \r
-       -611169975, 168560134, 1816667172, -457679780, \r
-       1570751170, 1857934291, -280777556, -1497079198, \r
-       -1472622191, -1540254315, 936633572, -1947043463, \r
-       852879335, 1133234376, 1500395319, -1210421907, \r
-       -1946055283, 1689376213, -761508274, -532043351, \r
-       -1260884884, -89369002, 133428468, 634383082, \r
-       -1345690267, -1896580486, -381178194, 403703816, \r
-       -714097990, -1997506440, 1867130149, 1918643758, \r
-       607656988, -245913946, -948718412, 1368901318, \r
-       600565992, 2090982877, -1662487436, 557719327, \r
-       -577352885, -597574211, -2045932661, -2062579062, \r
-       -1864339344, 1115438654, -999180875, -1429445018, \r
-       -661632952, 84280067, 33027830, 303828494, \r
-       -1547542175, 1600795957, -106014889, -798377543, \r
-       -1860729210, 1486471617, 658119965, -1188585826, \r
-       953803233, 334231800, -1288988520, 857870609, \r
-       -1143838359, 1890179545, -1995993458, -1489791852, \r
-       -1238525029, 574365214, -1844082809, 550103529, \r
-       1233637070, -5614251, 2018519080, 2057691103, \r
-       -1895592820, -128343647, -2146858615, 387583245, \r
-       -630865985, 836232934, -964410814, -1194301336, \r
-       -1014873791, -1339450983, 2002398509, 287182607, \r
-       -881086288, -56077228, -697451589, 975967766\r
-};\r
-\r
-const int AES::sm_T3[256] =\r
-{\r
-       1671808611, 2089089148, 2006576759, 2072901243, \r
-       -233963534, 1807603307, 1873927791, -984313403, \r
-       810573872, 16974337, 1739181671, 729634347, \r
-       -31856642, -681396777, -1410970197, 1989864566, \r
-       -901410870, -2103631998, -918517303, 2106063485, \r
-       -99225606, 1508618841, 1204391495, -267650064, \r
-       -1377025619, -731401260, -1560453214, -1343601233, \r
-       -1665195108, -1527295068, 1922491506, -1067738176, \r
-       -1211992649, -48438787, -1817297517, 644500518, \r
-       911895606, 1061256767, -150800905, -867204148, \r
-       878471220, -1510714971, -449523227, -251069967, \r
-       1905517169, -663508008, 827548209, 356461077, \r
-       67897348, -950889017, 593839651, -1017209405, \r
-       405286936, -1767819370, 84871685, -1699401830, \r
-       118033927, 305538066, -2137318528, -499261470, \r
-       -349778453, 661212711, -1295155278, 1973414517, \r
-       152769033, -2086789757, 745822252, 439235610, \r
-       455947803, 1857215598, 1525593178, -1594139744, \r
-       1391895634, 994932283, -698239018, -1278313037, \r
-       695947817, -482419229, 795958831, -2070473852, \r
-       1408607827, -781665839, 0, -315833875, \r
-       543178784, -65018884, -1312261711, 1542305371, \r
-       1790891114, -884568629, -1093048386, 961245753, \r
-       1256100938, 1289001036, 1491644504, -817199665, \r
-       -798245936, -282409489, -1427812438, -82383365, \r
-       1137018435, 1305975373, 861234739, -2053893755, \r
-       1171229253, -116332039, 33948674, 2139225727, \r
-       1357946960, 1011120188, -1615190625, -1461498968, \r
-       1374921297, -1543610973, 1086357568, -1886780017, \r
-       -1834139758, -1648615011, 944271416, -184225291, \r
-       -1126210628, -1228834890, -629821478, 560153121, \r
-       271589392, -15014401, -217121293, -764559406, \r
-       -850624051, 202643468, 322250259, -332413972, \r
-       1608629855, -1750977129, 1154254916, 389623319, \r
-       -1000893500, -1477290585, 2122513534, 1028094525, \r
-       1689045092, 1575467613, 422261273, 1939203699, \r
-       1621147744, -2120738431, 1339137615, -595614756, \r
-       577127458, 712922154, -1867826288, -2004677752, \r
-       1187679302, -299251730, -1194103880, 339486740, \r
-       -562452514, 1591917662, 186455563, -612979237, \r
-       -532948000, 844522546, 978220090, 169743370, \r
-       1239126601, 101321734, 611076132, 1558493276, \r
-       -1034051646, -747717165, -1393605716, 1655096418, \r
-       -1851246191, -1784401515, -466103324, 2039214713, \r
-       -416098841, -935097400, 928607799, 1840765549, \r
-       -1920204403, -714821163, 1322425422, -1444918871, \r
-       1823791212, 1459268694, -200805388, -366620694, \r
-       1706019429, 2056189050, -1360443474, 135794696, \r
-       -1160417350, 2022240376, 628050469, 779246638, \r
-       472135708, -1494132826, -1261997132, -967731258, \r
-       -400307224, -579034659, 1956440180, 522272287, \r
-       1272813131, -1109630531, -1954148981, -1970991222, \r
-       1888542832, 1044544574, -1245417035, 1722469478, \r
-       1222152264, 50660867, -167643146, 236067854, \r
-       1638122081, 895445557, 1475980887, -1177523783, \r
-       -2037311610, -1051158079, 489110045, -1632032866, \r
-       -516367903, -132912136, -1733088360, 288563729, \r
-       1773916777, -646927911, -1903622258, -1800981612, \r
-       -1682559589, 505560094, -2020469369, -383727127, \r
-       -834041906, 1442818645, 678973480, -545610273, \r
-       -1936784500, -1577559647, -1988097655, 219617805, \r
-       -1076206145, -432941082, 1120306242, 1756942440, \r
-       1103331905, -1716508263, 762796589, 252780047, \r
-       -1328841808, 1425844308, -1143575109, 372911126\r
-};\r
-\r
-const int AES::sm_T4[256] =\r
-{\r
-       1667474886, 2088535288, 2004326894, 2071694838, \r
-       -219017729, 1802223062, 1869591006, -976923503, \r
-       808472672, 16843522, 1734846926, 724270422, \r
-       -16901657, -673750347, -1414797747, 1987484396, \r
-       -892713585, -2105369313, -909557623, 2105378810, \r
-       -84273681, 1499065266, 1195886990, -252703749, \r
-       -1381110719, -724277325, -1566376609, -1347425723, \r
-       -1667449053, -1532692653, 1920112356, -1061135461, \r
-       -1212693899, -33743647, -1819038147, 640051788, \r
-       909531756, 1061110142, -134806795, -859025533, \r
-       875846760, -1515850671, -437963567, -235861767, \r
-       1903268834, -656903253, 825316194, 353713962, \r
-       67374088, -943238507, 589522246, -1010606435, \r
-       404236336, -1768513225, 84217610, -1701137105, \r
-       117901582, 303183396, -2139055333, -488489505, \r
-       -336910643, 656894286, -1296904833, 1970642922, \r
-       151591698, -2088526307, 741110872, 437923380, \r
-       454765878, 1852748508, 1515908788, -1600062629, \r
-       1381168804, 993742198, -690593353, -1280061827, \r
-       690584402, -471646499, 791638366, -2071685357, \r
-       1398011302, -774805319, 0, -303223615, \r
-       538992704, -50585629, -1313748871, 1532751286, \r
-       1785380564, -875870579, -1094788761, 960056178, \r
-       1246420628, 1280103576, 1482221744, -808498555, \r
-       -791647301, -269538619, -1431640753, -67430675, \r
-       1128514950, 1296947098, 859002214, -2054843375, \r
-       1162203018, -101117719, 33687044, 2139062782, \r
-       1347481760, 1010582648, -1616922075, -1465326773, \r
-       1364325282, -1549533603, 1077985408, -1886418427, \r
-       -1835881153, -1650607071, 943212656, -168491791, \r
-       -1128472733, -1229536905, -623217233, 555836226, \r
-       269496352, -58651, -202174723, -757961281, \r
-       -842183551, 202118168, 320025894, -320065597, \r
-       1600119230, -1751670219, 1145359496, 387397934, \r
-       -993765485, -1482165675, 2122220284, 1027426170, \r
-       1684319432, 1566435258, 421079858, 1936954854, \r
-       1616945344, -2122213351, 1330631070, -589529181, \r
-       572679748, 707427924, -1869567173, -2004319477, \r
-       1179044492, -286381625, -1195846805, 336870440, \r
-       -555845209, 1583276732, 185277718, -606374227, \r
-       -522175525, 842159716, 976899700, 168435220, \r
-       1229577106, 101059084, 606366792, 1549591736, \r
-       -1027449441, -741118275, -1397952701, 1650632388, \r
-       -1852725191, -1785355215, -454805549, 2038008818, \r
-       -404278571, -926399605, 926374254, 1835907034, \r
-       -1920103423, -707435343, 1313788572, -1448484791, \r
-       1819063512, 1448540844, -185333773, -353753649, \r
-       1701162954, 2054852340, -1364268729, 134748176, \r
-       -1162160785, 2021165296, 623210314, 774795868, \r
-       471606328, -1499008681, -1263220877, -960081513, \r
-       -387439669, -572687199, 1953799400, 522133822, \r
-       1263263126, -1111630751, -1953790451, -1970633457, \r
-       1886425312, 1044267644, -1246378895, 1718004428, \r
-       1212733584, 50529542, -151649801, 235803164, \r
-       1633788866, 892690282, 1465383342, -1179004823, \r
-       -2038001385, -1044293479, 488449850, -1633765081, \r
-       -505333543, -117959701, -1734823125, 286339874, \r
-       1768537042, -640061271, -1903261433, -1802197197, \r
-       -1684294099, 505291324, -2021158379, -370597687, \r
-       -825341561, 1431699370, 673740880, -539002203, \r
-       -1936945405, -1583220647, -1987477495, 218961690, \r
-       -1077945755, -421121577, 1111672452, 1751693520, \r
-       1094828930, -1717981143, 757954394, 252645662, \r
-       -1330590853, 1414855848, -1145317779, 370555436\r
-};\r
-\r
-const int AES::sm_T5[256] =\r
-{\r
-       1374988112, 2118214995, 437757123, 975658646, \r
-       1001089995, 530400753, -1392879445, 1273168787, \r
-       540080725, -1384747530, -1999866223, -184398811, \r
-       1340463100, -987051049, 641025152, -1251826801, \r
-       -558802359, 632953703, 1172967064, 1576976609, \r
-       -1020300030, -2125664238, -1924753501, 1809054150, \r
-       59727847, 361929877, -1083344149, -1789765158, \r
-       -725712083, 1484005843, 1239443753, -1899378620, \r
-       1975683434, -191989384, -1722270101, 666464733, \r
-       -1092530250, -259478249, -920605594, 2110667444, \r
-       1675577880, -451268222, -1756286112, 1649639237, \r
-       -1318815776, -1150570876, -25059300, -116905068, \r
-       1883793496, -1891238631, -1797362553, 1383856311, \r
-       -1418472669, 1917518562, -484470953, 1716890410, \r
-       -1293211641, 800440835, -2033878118, -751368027, \r
-       807962610, 599762354, 33778362, -317291940, \r
-       -1966138325, -1485196142, -217582864, 1315562145, \r
-       1708848333, 101039829, -785096161, -995688822, \r
-       875451293, -1561111136, 92987698, -1527321739, \r
-       193195065, 1080094634, 1584504582, -1116860335, \r
-       1042385657, -1763899843, -583137874, 1306967366, \r
-       -1856729675, 1908694277, 67556463, 1615861247, \r
-       429456164, -692196969, -1992277044, 1742315127, \r
-       -1326955843, 126454664, -417768648, 2043211483, \r
-       -1585706425, 2084704233, -125559095, 0, \r
-       159417987, 841739592, 504459436, 1817866830, \r
-       -49348613, 260388950, 1034867998, 908933415, \r
-       168810852, 1750902305, -1688513327, 607530554, \r
-       202008497, -1822955761, -1259432238, 463180190, \r
-       -2134850225, 1641816226, 1517767529, 470948374, \r
-       -493635062, -1063245083, 1008918595, 303765277, \r
-       235474187, -225720403, 766945465, 337553864, \r
-       1475418501, -1351284916, -291906117, -1551933187, \r
-       -150919521, 1551037884, 1147550661, 1543208500, \r
-       -1958532746, -886847780, -1225917336, -1192955549, \r
-       -684598070, 1113818384, 328671808, -2067394272, \r
-       -2058738563, -759480840, -1359400431, -953573011, \r
-       496906059, -592301837, 226906860, 2009195472, \r
-       733156972, -1452230247, 294930682, 1206477858, \r
-       -1459843900, -1594867942, 1451044056, 573804783, \r
-       -2025238841, -650587711, -1932877058, -1730933962, \r
-       -1493859889, -1518674392, -625504730, 1068351396, \r
-       742039012, 1350078989, 1784663195, 1417561698, \r
-       -158526526, -1864845080, 775550814, -2101104651, \r
-       -1621262146, 1775276924, 1876241833, -819653965, \r
-       -928212677, 270040487, -392404114, -616842373, \r
-       -853116919, 1851332852, -325404927, -2091935064, \r
-       -426414491, -1426069890, 566021896, -283776794, \r
-       -1159226407, 1248802510, -358676012, 699432150, \r
-       832877231, 708780849, -962227152, 899835584, \r
-       1951317047, -58537306, -527380304, 866637845, \r
-       -251357110, 1106041591, 2144161806, 395441711, \r
-       1984812685, 1139781709, -861254316, -459930401, \r
-       -1630423581, 1282050075, -1054072904, 1181045119, \r
-       -1654724092, 25965917, -91786125, -83148498, \r
-       -1285087910, -1831087534, -384805325, 1842759443, \r
-       -1697160820, 933301370, 1509430414, -351060855, \r
-       -827774994, -1218328267, -518199827, 2051518780, \r
-       -1663901863, 1441952575, 404016761, 1942435775, \r
-       1408749034, 1610459739, -549621996, 2017778566, \r
-       -894438527, -1184316354, 941896748, -1029488545, \r
-       371049330, -1126030068, 675039627, -15887039, \r
-       967311729, 135050206, -659233636, 1683407248, \r
-       2076935265, -718096784, 1215061108, -793225406\r
-};\r
-\r
-const int AES::sm_T6[256] =\r
-{\r
-       1347548327, 1400783205, -1021700188, -1774573730, \r
-       -885281941, -249586363, -1414727080, -1823743229, \r
-       1428173050, -156404115, -1853305738, 636813900, \r
-       -61872681, -674944309, -2144979644, -1883938141, \r
-       1239331162, 1730525723, -1740248562, -513933632, \r
-       46346101, 310463728, -1551022441, -966011911, \r
-       -419197089, -1793748324, -339776134, -627748263, \r
-       768917123, -749177823, 692707433, 1150208456, \r
-       1786102409, 2029293177, 1805211710, -584599183, \r
-       -1229004465, 401639597, 1724457132, -1266823622, \r
-       409198410, -2098914767, 1620529459, 1164071807, \r
-       -525245321, -2068091986, 486441376, -1795618773, \r
-       1483753576, 428819965, -2020286868, -1219331080, \r
-       598438867, -495826174, 1474502543, 711349675, \r
-       129166120, 53458370, -1702443653, -1512884472, \r
-       -231724921, -1306280027, -1174273174, 1559041666, \r
-       730517276, -1834518092, -252508174, -1588696606, \r
-       -848962828, -721025602, 533804130, -1966823682, \r
-       -1657524653, -1599933611, 839224033, 1973745387, \r
-       957055980, -1438621457, 106852767, 1371368976, \r
-       -113368694, 1033297158, -1361232379, 1179510461, \r
-       -1248766835, 91341917, 1862534868, -10465259, \r
-       605657339, -1747534359, -863420349, 2003294622, \r
-       -1112479678, -2012771957, 954669403, -612775698, \r
-       1201765386, -377732593, -906460130, 0, \r
-       -2096529274, 1211247597, -1407315600, 1315723890, \r
-       -67301633, 1443857720, 507358933, 657861945, \r
-       1678381017, 560487590, -778347692, 975451694, \r
-       -1324610969, 261314535, -759894378, -1642357871, \r
-       1333838021, -1570644960, 1767536459, 370938394, \r
-       182621114, -440360918, 1128014560, 487725847, \r
-       185469197, -1376613433, -1188186456, -938205527, \r
-       -2057834215, 1286567175, -1141990947, -39616672, \r
-       -1611202266, -1134791947, -985373125, 878443390, \r
-       1988838185, -590666810, 1756818940, 1673061617, \r
-       -891866660, 272786309, 1075025698, 545572369, \r
-       2105887268, -120407235, 296679730, 1841768865, \r
-       1260232239, -203640272, -334657966, -797457949, \r
-       1814803222, -1716948807, -99511224, 575138148, \r
-       -995558260, 446754879, -665420500, -282971248, \r
-       -947435186, -1042728751, -24327518, 915985419, \r
-       -811141759, 681933534, 651868046, -1539330625, \r
-       -466863459, 223377554, -1687527476, 1649704518, \r
-       -1024029421, -393160520, 1580087799, -175979601, \r
-       -1096852096, 2087309459, -1452288723, -1278270190, \r
-       1003007129, -1492117379, 1860738147, 2077965243, \r
-       164439672, -194094824, 32283319, -1467789414, \r
-       1709610350, 2125135846, 136428751, -420538904, \r
-       -642062437, -833982666, -722821367, -701910916, \r
-       -1355701070, 824852259, 818324884, -1070226842, \r
-       930369212, -1493400886, -1327460144, 355706840, \r
-       1257309336, -146674470, 243256656, 790073846, \r
-       -1921626666, 1296297904, 1422699085, -538667516, \r
-       -476130891, 457992840, -1195299809, 2135319889, \r
-       77422314, 1560382517, 1945798516, 788204353, \r
-       1521706781, 1385356242, 870912086, 325965383, \r
-       -1936009375, 2050466060, -1906706412, -1981082820, \r
-       -288446169, 901210569, -304014107, 1014646705, \r
-       1503449823, 1062597235, 2031621326, -1082931401, \r
-       -363595827, 1533017514, 350174575, -2038938405, \r
-       -2117423117, 1052338372, 741876788, 1606591296, \r
-       1914052035, 213705253, -1960297399, 1107234197, \r
-       1899603969, -569897805, -1663519516, -1872472383, \r
-       1635502980, 1893020342, 1950903388, 1120974935\r
-};\r
-\r
-const int AES::sm_T7[256] =\r
-{\r
-       -1487908364, 1699970625, -1530717673, 1586903591, \r
-       1808481195, 1173430173, 1487645946, 59984867, \r
-       -95084496, 1844882806, 1989249228, 1277555970, \r
-       -671330331, -875051734, 1149249077, -1550863006, \r
-       1514790577, 459744698, 244860394, -1058972162, \r
-       1963115311, -267222708, -1750889146, -104436781, \r
-       1608975247, -1667951214, 2062270317, 1507497298, \r
-       -2094148418, 567498868, 1764313568, -935031095, \r
-       -1989511742, 2037970062, 1047239000, 1910319033, \r
-       1337376481, -1390940024, -1402549984, 984907214, \r
-       1243112415, 830661914, 861968209, 2135253587, \r
-       2011214180, -1367032981, -1608712575, 731183368, \r
-       1750626376, -48656571, 1820824798, -122203525, \r
-       -752637069, 48394827, -1890065633, -1423284651, \r
-       671593195, -1039978571, 2073724613, 145085239, \r
-       -2014171096, -1515052097, 1790575107, -2107839210, \r
-       472615631, -1265457287, -219090169, -492745111, \r
-       -187865638, -1093335547, 1646252340, -24460122, \r
-       1402811438, 1436590835, -516815478, -344611594, \r
-       -331805821, -274055072, -1626972559, 273792366, \r
-       -1963377119, 104699613, 95345982, -1119466010, \r
-       -1917480620, 1560637892, -730921978, 369057872, \r
-       -81520232, -375925059, 1137477952, -1636341799, \r
-       1119727848, -1954019447, 1530455833, -287606328, \r
-       172466556, 266959938, 516552836, 0, \r
-       -2038232704, -314035669, 1890328081, 1917742170, \r
-       -262898, 945164165, -719438418, 958871085, \r
-       -647755249, -1507760036, 1423022939, 775562294, \r
-       1739656202, -418409641, -1764576018, -1851909221, \r
-       -984645440, 547512796, 1265195639, 437656594, \r
-       -1173691757, 719700128, -532464606, 387781147, \r
-       218828297, -944901493, -1464259146, -1446505442, \r
-       428169201, 122466165, -574886247, 1627235199, \r
-       648017665, -172204942, 1002783846, 2117360635, \r
-       695634755, -958608605, -60246291, -245122844, \r
-       -590686415, -2062531997, 574624663, 287343814, \r
-       612205898, 1039717051, 840019705, -1586641111, \r
-       793451934, 821288114, 1391201670, -472877119, \r
-       376187827, -1181111952, 1224348052, 1679968233, \r
-       -1933268740, 1058709744, 752375421, -1863376333, \r
-       1321699145, -775825096, -1560376118, 188127444, \r
-       -2117097739, -567761542, -1910056265, -1079754835, \r
-       -1645990854, -1844621192, -862229921, 1180849278, \r
-       331544205, -1192718120, -144822727, -1342864701, \r
-       -2134991011, -1820562992, 766078933, 313773861, \r
-       -1724135252, 2108100632, 1668212892, -1149510853, \r
-       2013908262, 418672217, -1224610662, -1700232369, \r
-       1852171925, -427906305, -821550660, -387518699, \r
-       -1680229657, 919489135, 164948639, 2094410160, \r
-       -1297141340, 590424639, -1808742747, 1723872674, \r
-       -1137216434, -895026046, -793714544, -669699161, \r
-       -1739919100, -621329940, 1343127501, -164685935, \r
-       -695372211, -1337113617, 1297403050, 81781910, \r
-       -1243373871, -2011476886, 532201772, 1367295589, \r
-       -368796322, 895287692, 1953757831, 1093597963, \r
-       492483431, -766340389, 1446242576, 1192455638, \r
-       1636604631, 209336225, 344873464, 1015671571, \r
-       669961897, -919226527, -437395172, -1321436601, \r
-       -547775278, 1933530610, -830924780, 935293895, \r
-       -840281097, -1436852227, 1863638845, -611944380, \r
-       -209597777, -1002522264, 875313188, 1080017571, \r
-       -1015933411, 621591778, 1233856572, -1790836979, \r
-       24197544, -1277294580, -459482956, -1047501738, \r
-       -2073986101, -1234119374, 1551124588, 1463996600\r
-};\r
-\r
-const int AES::sm_T8[256] =\r
-{\r
-       -190361519, 1097159550, 396673818, 660510266, \r
-       -1418998981, -1656360673, -94852180, -486304949, \r
-       821712160, 1986918061, -864644728, 38544885, \r
-       -438830001, 718002117, 893681702, 1654886325, \r
-       -1319482914, -1172609243, -368142267, -20913827, \r
-       796197571, 1290801793, 1184342925, -738605461, \r
-       -1889540349, -1835231979, 1836772287, 1381620373, \r
-       -1098699308, 1948373848, -529979063, -909622130, \r
-       -1031181707, -1904641804, 1480485785, -1183720153, \r
-       -514869570, -2001922064, 548169417, -835013507, \r
-       -548792221, 439452389, 1362321559, 1400849762, \r
-       1685577905, 1806599355, -2120213250, 137073913, \r
-       1214797936, 1174215055, -563312748, 2079897426, \r
-       1943217067, 1258480242, 529487843, 1437280870, \r
-       -349698126, -1245576401, -981755258, 923313619, \r
-       679998000, -1079659997, 57326082, 377642221, \r
-       -820237430, 2041877159, 133361907, 1776460110, \r
-       -621490843, 96392454, 878845905, -1493267772, \r
-       777231668, -212492126, -1964953083, -152341084, \r
-       -2081670901, 1626319424, 1906247262, 1846563261, \r
-       562755902, -586793578, 1040559837, -423803315, \r
-       1418573201, -1000536719, 114585348, 1343618912, \r
-       -1728371687, -1108764714, 1078185097, -643926169, \r
-       -398279248, -1987344377, 425408743, -923870343, \r
-       2081048481, 1108339068, -2078357000, 0, \r
-       -2138668279, 736970802, 292596766, 1517440620, \r
-       251657213, -2059905521, -1361764803, 758720310, \r
-       265905162, 1554391400, 1532285339, 908999204, \r
-       174567692, 1474760595, -292105548, -1684955621, \r
-       -1060810880, -601841055, 2001430874, 303699484, \r
-       -1816524062, -1607801408, 585122620, 454499602, \r
-       151849742, -1949848078, -1230456531, 514443284, \r
-       -249985705, 1963412655, -1713521682, 2137062819, \r
-       19308535, 1928707164, 1715193156, -75615141, \r
-       1126790795, 600235211, -302225226, -453942344, \r
-       836553431, 1669664834, -1759363053, -971956092, \r
-       1243905413, -1153566510, -114159186, 698445255, \r
-       -1641067747, -1305414692, -2041385971, -1042034569, \r
-       -1290376149, 1891211689, -1807156719, -379313593, \r
-       -57883480, -264299872, 2100090966, 865136418, \r
-       1229899655, 953270745, -895287668, -737462632, \r
-       -176042074, 2061379749, -1215420710, -1379949505, \r
-       983426092, 2022837584, 1607244650, 2118541908, \r
-       -1928084746, -658970480, 972512814, -1011878526, \r
-       1568718495, -795640727, -718427793, 621982671, \r
-       -1399243832, 410887952, -1671205144, 1002142683, \r
-       645401037, 1494807662, -1699282452, 1335535747, \r
-       -1787927066, -1671510, -1127282655, 367585007, \r
-       -409216582, 1865862730, -1626745622, -1333995991, \r
-       -1531793615, 1059270954, -1517014842, -1570324427, \r
-       1320957812, -2100648196, -1865371424, -1479011021, \r
-       77089521, -321194175, -850391425, -1846137065, \r
-       1305906550, -273658557, -1437772596, -1778065436, \r
-       -776608866, 1787304780, 740276417, 1699839814, \r
-       1592394909, -1942659839, -2022411270, 188821243, \r
-       1729977011, -606973294, 274084841, -699985043, \r
-       -681472870, -1593017801, -132870567, 322734571, \r
-       -1457000754, 1640576439, 484830689, 1202797690, \r
-       -757114468, -227328171, 349075736, -952647821, \r
-       -137500077, -39167137, 1030690015, 1155237496, \r
-       -1342996022, 1757691577, 607398968, -1556062270, \r
-       499347990, -500888388, 1011452712, 227885567, \r
-       -1476300487, 213114376, -1260086056, 1455525988, \r
-       -880516741, 850817237, 1817998408, -1202240816\r
-};\r
-\r
-const int AES::sm_U1[256] =\r
-{\r
-       0, 235474187, 470948374, 303765277, \r
-       941896748, 908933415, 607530554, 708780849, \r
-       1883793496, 2118214995, 1817866830, 1649639237, \r
-       1215061108, 1181045119, 1417561698, 1517767529, \r
-       -527380304, -291906117, -58537306, -225720403, \r
-       -659233636, -692196969, -995688822, -894438527, \r
-       -1864845080, -1630423581, -1932877058, -2101104651, \r
-       -1459843900, -1493859889, -1259432238, -1159226407, \r
-       -616842373, -718096784, -953573011, -920605594, \r
-       -484470953, -317291940, -15887039, -251357110, \r
-       -1418472669, -1518674392, -1218328267, -1184316354, \r
-       -1822955761, -1654724092, -1891238631, -2125664238, \r
-       1001089995, 899835584, 666464733, 699432150, \r
-       59727847, 226906860, 530400753, 294930682, \r
-       1273168787, 1172967064, 1475418501, 1509430414, \r
-       1942435775, 2110667444, 1876241833, 1641816226, \r
-       -1384747530, -1551933187, -1318815776, -1083344149, \r
-       -1789765158, -1688513327, -1992277044, -2025238841, \r
-       -583137874, -751368027, -1054072904, -819653965, \r
-       -451268222, -351060855, -116905068, -150919521, \r
-       1306967366, 1139781709, 1374988112, 1610459739, \r
-       1975683434, 2076935265, 1775276924, 1742315127, \r
-       1034867998, 866637845, 566021896, 800440835, \r
-       92987698, 193195065, 429456164, 395441711, \r
-       1984812685, 2017778566, 1784663195, 1683407248, \r
-       1315562145, 1080094634, 1383856311, 1551037884, \r
-       101039829, 135050206, 437757123, 337553864, \r
-       1042385657, 807962610, 573804783, 742039012, \r
-       -1763899843, -1730933962, -1966138325, -2067394272, \r
-       -1359400431, -1594867942, -1293211641, -1126030068, \r
-       -426414491, -392404114, -91786125, -191989384, \r
-       -558802359, -793225406, -1029488545, -861254316, \r
-       1106041591, 1340463100, 1576976609, 1408749034, \r
-       2043211483, 2009195472, 1708848333, 1809054150, \r
-       832877231, 1068351396, 766945465, 599762354, \r
-       159417987, 126454664, 361929877, 463180190, \r
-       -1585706425, -1351284916, -1116860335, -1285087910, \r
-       -1722270101, -1756286112, -2058738563, -1958532746, \r
-       -785096161, -549621996, -853116919, -1020300030, \r
-       -384805325, -417768648, -184398811, -83148498, \r
-       -1697160820, -1797362553, -2033878118, -1999866223, \r
-       -1561111136, -1392879445, -1092530250, -1326955843, \r
-       -358676012, -459930401, -158526526, -125559095, \r
-       -759480840, -592301837, -827774994, -1063245083, \r
-       2051518780, 1951317047, 1716890410, 1750902305, \r
-       1113818384, 1282050075, 1584504582, 1350078989, \r
-       168810852, 67556463, 371049330, 404016761, \r
-       841739592, 1008918595, 775550814, 540080725, \r
-       -325404927, -493635062, -259478249, -25059300, \r
-       -725712083, -625504730, -928212677, -962227152, \r
-       -1663901863, -1831087534, -2134850225, -1899378620, \r
-       -1527321739, -1426069890, -1192955549, -1225917336, \r
-       202008497, 33778362, 270040487, 504459436, \r
-       875451293, 975658646, 675039627, 641025152, \r
-       2084704233, 1917518562, 1615861247, 1851332852, \r
-       1147550661, 1248802510, 1484005843, 1451044056, \r
-       933301370, 967311729, 733156972, 632953703, \r
-       260388950, 25965917, 328671808, 496906059, \r
-       1206477858, 1239443753, 1543208500, 1441952575, \r
-       2144161806, 1908694277, 1675577880, 1842759443, \r
-       -684598070, -650587711, -886847780, -987051049, \r
-       -283776794, -518199827, -217582864, -49348613, \r
-       -1485196142, -1452230247, -1150570876, -1251826801, \r
-       -1621262146, -1856729675, -2091935064, -1924753501\r
-};\r
-\r
-const int AES::sm_U2[256] =\r
-{\r
-       0, 185469197, 370938394, 487725847, \r
-       741876788, 657861945, 975451694, 824852259, \r
-       1483753576, 1400783205, 1315723890, 1164071807, \r
-       1950903388, 2135319889, 1649704518, 1767536459, \r
-       -1327460144, -1141990947, -1493400886, -1376613433, \r
-       -1663519516, -1747534359, -1966823682, -2117423117, \r
-       -393160520, -476130891, -24327518, -175979601, \r
-       -995558260, -811141759, -759894378, -642062437, \r
-       2077965243, 1893020342, 1841768865, 1724457132, \r
-       1474502543, 1559041666, 1107234197, 1257309336, \r
-       598438867, 681933534, 901210569, 1052338372, \r
-       261314535, 77422314, 428819965, 310463728, \r
-       -885281941, -1070226842, -584599183, -701910916, \r
-       -419197089, -334657966, -249586363, -99511224, \r
-       -1823743229, -1740248562, -2057834215, -1906706412, \r
-       -1082931401, -1266823622, -1452288723, -1570644960, \r
-       -156404115, -39616672, -525245321, -339776134, \r
-       -627748263, -778347692, -863420349, -947435186, \r
-       -1361232379, -1512884472, -1195299809, -1278270190, \r
-       -2098914767, -1981082820, -1795618773, -1611202266, \r
-       1179510461, 1296297904, 1347548327, 1533017514, \r
-       1786102409, 1635502980, 2087309459, 2003294622, \r
-       507358933, 355706840, 136428751, 53458370, \r
-       839224033, 957055980, 605657339, 790073846, \r
-       -1921626666, -2038938405, -1687527476, -1872472383, \r
-       -1588696606, -1438621457, -1219331080, -1134791947, \r
-       -721025602, -569897805, -1021700188, -938205527, \r
-       -113368694, -231724921, -282971248, -466863459, \r
-       1033297158, 915985419, 730517276, 545572369, \r
-       296679730, 446754879, 129166120, 213705253, \r
-       1709610350, 1860738147, 1945798516, 2029293177, \r
-       1239331162, 1120974935, 1606591296, 1422699085, \r
-       -146674470, -61872681, -513933632, -363595827, \r
-       -612775698, -797457949, -848962828, -966011911, \r
-       -1355701070, -1539330625, -1188186456, -1306280027, \r
-       -2096529274, -2012771957, -1793748324, -1642357871, \r
-       1201765386, 1286567175, 1371368976, 1521706781, \r
-       1805211710, 1620529459, 2105887268, 1988838185, \r
-       533804130, 350174575, 164439672, 46346101, \r
-       870912086, 954669403, 636813900, 788204353, \r
-       -1936009375, -2020286868, -1702443653, -1853305738, \r
-       -1599933611, -1414727080, -1229004465, -1112479678, \r
-       -722821367, -538667516, -1024029421, -906460130, \r
-       -120407235, -203640272, -288446169, -440360918, \r
-       1014646705, 930369212, 711349675, 560487590, \r
-       272786309, 457992840, 106852767, 223377554, \r
-       1678381017, 1862534868, 1914052035, 2031621326, \r
-       1211247597, 1128014560, 1580087799, 1428173050, \r
-       32283319, 182621114, 401639597, 486441376, \r
-       768917123, 651868046, 1003007129, 818324884, \r
-       1503449823, 1385356242, 1333838021, 1150208456, \r
-       1973745387, 2125135846, 1673061617, 1756818940, \r
-       -1324610969, -1174273174, -1492117379, -1407315600, \r
-       -1657524653, -1774573730, -1960297399, -2144979644, \r
-       -377732593, -495826174, -10465259, -194094824, \r
-       -985373125, -833982666, -749177823, -665420500, \r
-       2050466060, 1899603969, 1814803222, 1730525723, \r
-       1443857720, 1560382517, 1075025698, 1260232239, \r
-       575138148, 692707433, 878443390, 1062597235, \r
-       243256656, 91341917, 409198410, 325965383, \r
-       -891866660, -1042728751, -590666810, -674944309, \r
-       -420538904, -304014107, -252508174, -67301633, \r
-       -1834518092, -1716948807, -2068091986, -1883938141, \r
-       -1096852096, -1248766835, -1467789414, -1551022441, \r
-};\r
-\r
-const int AES::sm_U3[256] =\r
-{\r
-       0, 218828297, 437656594, 387781147, \r
-       875313188, 958871085, 775562294, 590424639, \r
-       1750626376, 1699970625, 1917742170, 2135253587, \r
-       1551124588, 1367295589, 1180849278, 1265195639, \r
-       -793714544, -574886247, -895026046, -944901493, \r
-       -459482956, -375925059, -24460122, -209597777, \r
-       -1192718120, -1243373871, -1560376118, -1342864701, \r
-       -1933268740, -2117097739, -1764576018, -1680229657, \r
-       -1149510853, -1234119374, -1586641111, -1402549984, \r
-       -1890065633, -2107839210, -1790836979, -1739919100, \r
-       -752637069, -567761542, -919226527, -1002522264, \r
-       -418409641, -368796322, -48656571, -267222708, \r
-       1808481195, 1723872674, 1910319033, 2094410160, \r
-       1608975247, 1391201670, 1173430173, 1224348052, \r
-       59984867, 244860394, 428169201, 344873464, \r
-       935293895, 984907214, 766078933, 547512796, \r
-       1844882806, 1627235199, 2011214180, 2062270317, \r
-       1507497298, 1423022939, 1137477952, 1321699145, \r
-       95345982, 145085239, 532201772, 313773861, \r
-       830661914, 1015671571, 731183368, 648017665, \r
-       -1119466010, -1337113617, -1487908364, -1436852227, \r
-       -1989511742, -2073986101, -1820562992, -1636341799, \r
-       -719438418, -669699161, -821550660, -1039978571, \r
-       -516815478, -331805821, -81520232, -164685935, \r
-       -695372211, -611944380, -862229921, -1047501738, \r
-       -492745111, -274055072, -122203525, -172204942, \r
-       -1093335547, -1277294580, -1530717673, -1446505442, \r
-       -1963377119, -2014171096, -1863376333, -1645990854, \r
-       104699613, 188127444, 472615631, 287343814, \r
-       840019705, 1058709744, 671593195, 621591778, \r
-       1852171925, 1668212892, 1953757831, 2037970062, \r
-       1514790577, 1463996600, 1080017571, 1297403050, \r
-       -621329940, -671330331, -1058972162, -840281097, \r
-       -287606328, -472877119, -187865638, -104436781, \r
-       -1297141340, -1079754835, -1464259146, -1515052097, \r
-       -2038232704, -1954019447, -1667951214, -1851909221, \r
-       172466556, 122466165, 273792366, 492483431, \r
-       1047239000, 861968209, 612205898, 695634755, \r
-       1646252340, 1863638845, 2013908262, 1963115311, \r
-       1446242576, 1530455833, 1277555970, 1093597963, \r
-       1636604631, 1820824798, 2073724613, 1989249228, \r
-       1436590835, 1487645946, 1337376481, 1119727848, \r
-       164948639, 81781910, 331544205, 516552836, \r
-       1039717051, 821288114, 669961897, 719700128, \r
-       -1321436601, -1137216434, -1423284651, -1507760036, \r
-       -2062531997, -2011476886, -1626972559, -1844621192, \r
-       -647755249, -730921978, -1015933411, -830924780, \r
-       -314035669, -532464606, -144822727, -95084496, \r
-       -1224610662, -1173691757, -1390940024, -1608712575, \r
-       -2094148418, -1910056265, -1724135252, -1808742747, \r
-       -547775278, -766340389, -984645440, -935031095, \r
-       -344611594, -427906305, -245122844, -60246291, \r
-       1739656202, 1790575107, 2108100632, 1890328081, \r
-       1402811438, 1586903591, 1233856572, 1149249077, \r
-       266959938, 48394827, 369057872, 418672217, \r
-       1002783846, 919489135, 567498868, 752375421, \r
-       209336225, 24197544, 376187827, 459744698, \r
-       945164165, 895287692, 574624663, 793451934, \r
-       1679968233, 1764313568, 2117360635, 1933530610, \r
-       1343127501, 1560637892, 1243112415, 1192455638, \r
-       -590686415, -775825096, -958608605, -875051734, \r
-       -387518699, -437395172, -219090169, -262898, \r
-       -1265457287, -1181111952, -1367032981, -1550863006, \r
-       -2134991011, -1917480620, -1700232369, -1750889146\r
-};\r
-\r
-const int AES::sm_U4[256] =\r
-{\r
-       0, 151849742, 303699484, 454499602, \r
-       607398968, 758720310, 908999204, 1059270954, \r
-       1214797936, 1097159550, 1517440620, 1400849762, \r
-       1817998408, 1699839814, 2118541908, 2001430874, \r
-       -1865371424, -1713521682, -2100648196, -1949848078, \r
-       -1260086056, -1108764714, -1493267772, -1342996022, \r
-       -658970480, -776608866, -895287668, -1011878526, \r
-       -57883480, -176042074, -292105548, -409216582, \r
-       1002142683, 850817237, 698445255, 548169417, \r
-       529487843, 377642221, 227885567, 77089521, \r
-       1943217067, 2061379749, 1640576439, 1757691577, \r
-       1474760595, 1592394909, 1174215055, 1290801793, \r
-       -1418998981, -1570324427, -1183720153, -1333995991, \r
-       -1889540349, -2041385971, -1656360673, -1807156719, \r
-       -486304949, -368142267, -249985705, -132870567, \r
-       -952647821, -835013507, -718427793, -601841055, \r
-       1986918061, 2137062819, 1685577905, 1836772287, \r
-       1381620373, 1532285339, 1078185097, 1229899655, \r
-       1040559837, 923313619, 740276417, 621982671, \r
-       439452389, 322734571, 137073913, 19308535, \r
-       -423803315, -273658557, -190361519, -39167137, \r
-       -1031181707, -880516741, -795640727, -643926169, \r
-       -1361764803, -1479011021, -1127282655, -1245576401, \r
-       -1964953083, -2081670901, -1728371687, -1846137065, \r
-       1305906550, 1155237496, 1607244650, 1455525988, \r
-       1776460110, 1626319424, 2079897426, 1928707164, \r
-       96392454, 213114376, 396673818, 514443284, \r
-       562755902, 679998000, 865136418, 983426092, \r
-       -586793578, -737462632, -820237430, -971956092, \r
-       -114159186, -264299872, -349698126, -500888388, \r
-       -1787927066, -1671205144, -2022411270, -1904641804, \r
-       -1319482914, -1202240816, -1556062270, -1437772596, \r
-       -321194175, -438830001, -20913827, -137500077, \r
-       -923870343, -1042034569, -621490843, -738605461, \r
-       -1531793615, -1379949505, -1230456531, -1079659997, \r
-       -2138668279, -1987344377, -1835231979, -1684955621, \r
-       2081048481, 1963412655, 1846563261, 1729977011, \r
-       1480485785, 1362321559, 1243905413, 1126790795, \r
-       878845905, 1030690015, 645401037, 796197571, \r
-       274084841, 425408743, 38544885, 188821243, \r
-       -681472870, -563312748, -981755258, -864644728, \r
-       -212492126, -94852180, -514869570, -398279248, \r
-       -1626745622, -1778065436, -1928084746, -2078357000, \r
-       -1153566510, -1305414692, -1457000754, -1607801408, \r
-       1202797690, 1320957812, 1437280870, 1554391400, \r
-       1669664834, 1787304780, 1906247262, 2022837584, \r
-       265905162, 114585348, 499347990, 349075736, \r
-       736970802, 585122620, 972512814, 821712160, \r
-       -1699282452, -1816524062, -2001922064, -2120213250, \r
-       -1098699308, -1215420710, -1399243832, -1517014842, \r
-       -757114468, -606973294, -1060810880, -909622130, \r
-       -152341084, -1671510, -453942344, -302225226, \r
-       174567692, 57326082, 410887952, 292596766, \r
-       777231668, 660510266, 1011452712, 893681702, \r
-       1108339068, 1258480242, 1343618912, 1494807662, \r
-       1715193156, 1865862730, 1948373848, 2100090966, \r
-       -1593017801, -1476300487, -1290376149, -1172609243, \r
-       -2059905521, -1942659839, -1759363053, -1641067747, \r
-       -379313593, -529979063, -75615141, -227328171, \r
-       -850391425, -1000536719, -548792221, -699985043, \r
-       836553431, 953270745, 600235211, 718002117, \r
-       367585007, 484830689, 133361907, 251657213, \r
-       2041877159, 1891211689, 1806599355, 1654886325, \r
-       1568718495, 1418573201, 1335535747, 1184342925\r
-};\r
-\r
-const char AES::sm_rcon[30] =\r
-{\r
-       1, 2, 4, 8, 16, 32, \r
-       64, -128, 27, 54, 108, -40, \r
-       -85, 77, -102, 47, 94, -68, \r
-       99, -58, -105, 53, 106, -44, \r
-       -77, 125, -6, -17, -59, -111\r
-};\r
-\r
-const int AES::sm_shifts[3][4][2] =\r
-{\r
-       { {0, 0}, {1, 3}, {2, 2}, {3, 1} },\r
-       { {0, 0}, {1, 5}, {2, 4}, {3, 3} },\r
-       { {0, 0}, {1, 7}, {3, 5}, {4, 4} }\r
-};\r
-\r
-//Null chain\r
-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";\r
-\r
-//CONSTRUCTOR\r
-AES::AES() : m_bKeyInit(false)\r
-{\r
-}\r
-\r
-//DESTRUCTOR\r
-AES::~AES()\r
-{\r
-}\r
-\r
-//Expand a user-supplied key material into a session key.\r
-// key        - The 128/192/256-bit user-key to use.\r
-// chain      - initial chain block for CBC and CFB modes.\r
-// keylength  - 16, 24 or 32 bytes\r
-// blockSize  - The block size in bytes of this Rijndael (16, 24 or 32 bytes).\r
-void AES::MakeKey(char const* key, char const* chain, int keylength, int blockSize)\r
-{\r
-       if (NULL == key)\r
-               return;\r
-       if (!(keylength == 16 || keylength == 24 || keylength == 32))\r
-               return;\r
-       if (!(blockSize == 16 || blockSize == 24 || blockSize == 32))\r
-               return;\r
-       m_keylength = keylength;\r
-       m_blockSize = blockSize;\r
-       //Initialize the chain\r
-       memcpy(m_chain0, chain, m_blockSize);\r
-       memcpy(m_chain, chain, m_blockSize);\r
-       //Calculate Number of Rounds\r
-       switch (m_keylength)\r
-       {\r
-               case 16:\r
-                       m_iROUNDS = (m_blockSize == 16) ? 10 : (m_blockSize == 24 ? 12 : 14);\r
-                       break;\r
-\r
-               case 24:\r
-                       m_iROUNDS = (m_blockSize != 32) ? 12 : 14;\r
-                       break;\r
-\r
-               default: // 32 bytes = 256 bits\r
-                       m_iROUNDS = 14;\r
-       }\r
-       int BC = m_blockSize / 4;\r
-       int i, j;\r
-       for (i=0; i<=m_iROUNDS; i++)\r
-       {\r
-               for (j=0; j<BC; j++)\r
-                       m_Ke[i][j] = 0;\r
-       }\r
-       for (i=0; i<=m_iROUNDS; i++)\r
-       {\r
-               for (j=0; j<BC; j++)\r
-                       m_Kd[i][j] = 0;\r
-       }\r
-       int ROUND_KEY_COUNT = (m_iROUNDS + 1) * BC;\r
-       int KC = m_keylength/4;\r
-       //Copy user material bytes into temporary ints\r
-       int* pi = tk;\r
-       char const* pc = key;\r
-       for (i=0; i<KC; i++)\r
-       {\r
-               *pi = (unsigned char)*(pc++) << 24;\r
-               *pi |= (unsigned char)*(pc++) << 16;\r
-               *pi |= (unsigned char)*(pc++) << 8;\r
-               *(pi++) |= (unsigned char)*(pc++);\r
-       }\r
-       //Copy values into round key arrays\r
-       int t = 0;\r
-       for (j=0; (j<KC)&&(t<ROUND_KEY_COUNT); j++,t++)\r
-       {\r
-               m_Ke[t/BC][t%BC] = tk[j];\r
-               m_Kd[m_iROUNDS - (t/BC)][t%BC] = tk[j];\r
-       }\r
-       int tt, rconpointer = 0;\r
-       while (t < ROUND_KEY_COUNT)\r
-       {\r
-               //Extrapolate using phi (the round key evolution function)\r
-               tt = tk[KC-1];\r
-               tk[0] ^= (sm_S[(tt >> 16) & 0xFF] & 0xFF) << 24 ^\r
-                       (sm_S[(tt >>  8) & 0xFF] & 0xFF) << 16 ^\r
-                       (sm_S[ tt & 0xFF] & 0xFF) <<  8 ^\r
-                       (sm_S[(tt >> 24) & 0xFF] & 0xFF) ^\r
-                       (sm_rcon[rconpointer++]  & 0xFF) << 24;\r
-               if (KC != 8)\r
-                       for (i=1, j=0; i<KC;)\r
-                               tk[i++] ^= tk[j++];\r
-               else\r
-               {\r
-                       for (i=1, j=0; i<KC/2; )\r
-                               tk[i++] ^= tk[j++];\r
-                       tt = tk[KC/2-1];\r
-                       tk[KC/2] ^= (sm_S[ tt & 0xFF] & 0xFF) ^\r
-                               (sm_S[(tt >>  8) & 0xFF] & 0xFF) <<  8 ^\r
-                               (sm_S[(tt >> 16) & 0xFF] & 0xFF) << 16 ^\r
-                               (sm_S[(tt >> 24) & 0xFF] & 0xFF) << 24;\r
-                       for (j = KC/2, i=j+1; i<KC; )\r
-                               tk[i++] ^= tk[j++];\r
-               }\r
-               //Copy values into round key arrays\r
-               for (j=0; (j<KC) && (t<ROUND_KEY_COUNT); j++, t++)\r
-               {\r
-                       m_Ke[t/BC][t%BC] = tk[j];\r
-                       m_Kd[m_iROUNDS - (t/BC)][t%BC] = tk[j];\r
-               }\r
-       }\r
-       //Inverse MixColumn where needed\r
-       for (int r=1; r<m_iROUNDS; r++)\r
-               for (j=0; j<BC; j++)\r
-               {\r
-                       tt = m_Kd[r][j];\r
-                       m_Kd[r][j] = sm_U1[(tt >> 24) & 0xFF] ^\r
-                               sm_U2[(tt >> 16) & 0xFF] ^\r
-                               sm_U3[(tt >>  8) & 0xFF] ^\r
-                               sm_U4[tt & 0xFF];\r
-               }\r
-       m_bKeyInit = true;\r
-}\r
-\r
-//Convenience method to encrypt exactly one block of plaintext, assuming\r
-//Rijndael's default block size (128-bit).\r
-// in         - The plaintext\r
-// result     - The ciphertext generated from a plaintext using the key\r
-void AES::DefEncryptBlock(char const* in, char* result)\r
-{\r
-       if (m_bKeyInit == false)\r
-               return;\r
-       int* Ker = m_Ke[0];\r
-       int t0 = ((unsigned char)*(in++) << 24);\r
-       t0 |= ((unsigned char)*(in++) << 16);\r
-       t0 |= ((unsigned char)*(in++) << 8);\r
-       (t0 |= (unsigned char)*(in++)) ^= Ker[0];\r
-       int t1 = ((unsigned char)*(in++) << 24);\r
-       t1 |= ((unsigned char)*(in++) << 16);\r
-       t1 |= ((unsigned char)*(in++) << 8);\r
-       (t1 |= (unsigned char)*(in++)) ^= Ker[1];\r
-       int t2 = ((unsigned char)*(in++) << 24);\r
-       t2 |= ((unsigned char)*(in++) << 16);\r
-       t2 |= ((unsigned char)*(in++) << 8);\r
-       (t2 |= (unsigned char)*(in++)) ^= Ker[2];\r
-       int t3 = ((unsigned char)*(in++) << 24);\r
-       t3 |= ((unsigned char)*(in++) << 16);\r
-       t3 |= ((unsigned char)*(in++) << 8);\r
-       (t3 |= (unsigned char)*(in++)) ^= Ker[3];\r
-       int a0, a1, a2, a3;\r
-       //Apply Round Transforms\r
-       for (int r = 1; r < m_iROUNDS; r++)\r
-       {\r
-               Ker = m_Ke[r];\r
-               a0 = (sm_T1[(t0 >> 24) & 0xFF] ^\r
-                       sm_T2[(t1 >> 16) & 0xFF] ^\r
-                       sm_T3[(t2 >>  8) & 0xFF] ^\r
-                       sm_T4[t3 & 0xFF]) ^ Ker[0];\r
-               a1 = (sm_T1[(t1 >> 24) & 0xFF] ^\r
-                       sm_T2[(t2 >> 16) & 0xFF] ^\r
-                       sm_T3[(t3 >>  8) & 0xFF] ^\r
-                       sm_T4[t0 & 0xFF]) ^ Ker[1];\r
-               a2 = (sm_T1[(t2 >> 24) & 0xFF] ^\r
-                       sm_T2[(t3 >> 16) & 0xFF] ^\r
-                       sm_T3[(t0 >>  8) & 0xFF] ^\r
-                       sm_T4[t1 & 0xFF]) ^ Ker[2];\r
-               a3 = (sm_T1[(t3 >> 24) & 0xFF] ^\r
-                       sm_T2[(t0 >> 16) & 0xFF] ^\r
-                       sm_T3[(t1 >>  8) & 0xFF] ^\r
-                       sm_T4[t2 & 0xFF]) ^ Ker[3];\r
-               t0 = a0;\r
-               t1 = a1;\r
-               t2 = a2;\r
-               t3 = a3;\r
-       }\r
-       //Last Round is special\r
-       Ker = m_Ke[m_iROUNDS];\r
-       int tt = Ker[0];\r
-       result[0] = sm_S[(t0 >> 24) & 0xFF] ^ (tt >> 24);\r
-       result[1] = sm_S[(t1 >> 16) & 0xFF] ^ (tt >> 16);\r
-       result[2] = sm_S[(t2 >>  8) & 0xFF] ^ (tt >>  8);\r
-       result[3] = sm_S[t3 & 0xFF] ^ tt;\r
-       tt = Ker[1];\r
-       result[4] = sm_S[(t1 >> 24) & 0xFF] ^ (tt >> 24);\r
-       result[5] = sm_S[(t2 >> 16) & 0xFF] ^ (tt >> 16);\r
-       result[6] = sm_S[(t3 >>  8) & 0xFF] ^ (tt >>  8);\r
-       result[7] = sm_S[t0 & 0xFF] ^ tt;\r
-       tt = Ker[2];\r
-       result[8] = sm_S[(t2 >> 24) & 0xFF] ^ (tt >> 24);\r
-       result[9] = sm_S[(t3 >> 16) & 0xFF] ^ (tt >> 16);\r
-       result[10] = sm_S[(t0 >>  8) & 0xFF] ^ (tt >>  8);\r
-       result[11] = sm_S[t1 & 0xFF] ^ tt;\r
-       tt = Ker[3];\r
-       result[12] = sm_S[(t3 >> 24) & 0xFF] ^ (tt >> 24);\r
-       result[13] = sm_S[(t0 >> 16) & 0xFF] ^ (tt >> 16);\r
-       result[14] = sm_S[(t1 >>  8) & 0xFF] ^ (tt >>  8);\r
-       result[15] = sm_S[t2 & 0xFF] ^ tt;\r
-}\r
-\r
-//Convenience method to decrypt exactly one block of plaintext, assuming\r
-//Rijndael's default block size (128-bit).\r
-// in         - The ciphertext.\r
-// result     - The plaintext generated from a ciphertext using the session key.\r
-void AES::DefDecryptBlock(char const* in, char* result)\r
-{\r
-       if (m_bKeyInit == false)\r
-               return;\r
-       int* Kdr = m_Kd[0];\r
-       int t0 = ((unsigned char)*(in++) << 24);\r
-       t0 = t0 | ((unsigned char)*(in++) << 16);\r
-       t0 |= ((unsigned char)*(in++) << 8);\r
-       (t0 |= (unsigned char)*(in++)) ^= Kdr[0];\r
-       int t1 = ((unsigned char)*(in++) << 24);\r
-       t1 |= ((unsigned char)*(in++) << 16);\r
-       t1 |= ((unsigned char)*(in++) << 8);\r
-       (t1 |= (unsigned char)*(in++)) ^= Kdr[1];\r
-       int t2 = ((unsigned char)*(in++) << 24);\r
-       t2 |= ((unsigned char)*(in++) << 16);\r
-       t2 |= ((unsigned char)*(in++) << 8);\r
-       (t2 |= (unsigned char)*(in++)) ^= Kdr[2];\r
-       int t3 = ((unsigned char)*(in++) << 24);\r
-       t3 |= ((unsigned char)*(in++) << 16);\r
-       t3 |= ((unsigned char)*(in++) << 8);\r
-       (t3 |= (unsigned char)*(in++)) ^= Kdr[3];\r
-       int a0, a1, a2, a3;\r
-       for (int r = 1; r < m_iROUNDS; r++) // apply round transforms\r
-       {\r
-               Kdr = m_Kd[r];\r
-               a0 = (sm_T5[(t0 >> 24) & 0xFF] ^\r
-                       sm_T6[(t3 >> 16) & 0xFF] ^\r
-                       sm_T7[(t2 >>  8) & 0xFF] ^\r
-                       sm_T8[ t1        & 0xFF] ) ^ Kdr[0];\r
-               a1 = (sm_T5[(t1 >> 24) & 0xFF] ^\r
-                       sm_T6[(t0 >> 16) & 0xFF] ^\r
-                       sm_T7[(t3 >>  8) & 0xFF] ^\r
-                       sm_T8[ t2        & 0xFF] ) ^ Kdr[1];\r
-               a2 = (sm_T5[(t2 >> 24) & 0xFF] ^\r
-                       sm_T6[(t1 >> 16) & 0xFF] ^\r
-                       sm_T7[(t0 >>  8) & 0xFF] ^\r
-                       sm_T8[ t3        & 0xFF] ) ^ Kdr[2];\r
-               a3 = (sm_T5[(t3 >> 24) & 0xFF] ^\r
-                       sm_T6[(t2 >> 16) & 0xFF] ^\r
-                       sm_T7[(t1 >>  8) & 0xFF] ^\r
-                       sm_T8[ t0        & 0xFF] ) ^ Kdr[3];\r
-               t0 = a0;\r
-               t1 = a1;\r
-               t2 = a2;\r
-               t3 = a3;\r
-       }\r
-       //Last Round is special\r
-       Kdr = m_Kd[m_iROUNDS];\r
-       int tt = Kdr[0];\r
-       result[ 0] = sm_Si[(t0 >> 24) & 0xFF] ^ (tt >> 24);\r
-       result[ 1] = sm_Si[(t3 >> 16) & 0xFF] ^ (tt >> 16);\r
-       result[ 2] = sm_Si[(t2 >>  8) & 0xFF] ^ (tt >>  8);\r
-       result[ 3] = sm_Si[ t1 & 0xFF] ^ tt;\r
-       tt = Kdr[1];\r
-       result[ 4] = sm_Si[(t1 >> 24) & 0xFF] ^ (tt >> 24);\r
-       result[ 5] = sm_Si[(t0 >> 16) & 0xFF] ^ (tt >> 16);\r
-       result[ 6] = sm_Si[(t3 >>  8) & 0xFF] ^ (tt >>  8);\r
-       result[ 7] = sm_Si[ t2 & 0xFF] ^ tt;\r
-       tt = Kdr[2];\r
-       result[ 8] = sm_Si[(t2 >> 24) & 0xFF] ^ (tt >> 24);\r
-       result[ 9] = sm_Si[(t1 >> 16) & 0xFF] ^ (tt >> 16);\r
-       result[10] = sm_Si[(t0 >>  8) & 0xFF] ^ (tt >>  8);\r
-       result[11] = sm_Si[ t3 & 0xFF] ^ tt;\r
-       tt = Kdr[3];\r
-       result[12] = sm_Si[(t3 >> 24) & 0xFF] ^ (tt >> 24);\r
-       result[13] = sm_Si[(t2 >> 16) & 0xFF] ^ (tt >> 16);\r
-       result[14] = sm_Si[(t1 >>  8) & 0xFF] ^ (tt >>  8);\r
-       result[15] = sm_Si[ t0 & 0xFF] ^ tt;\r
-}\r
-\r
-//Encrypt exactly one block of plaintext.\r
-// in           - The plaintext.\r
-// result       - The ciphertext generated from a plaintext using the key.\r
-void AES::EncryptBlock(char const* in, char* result)\r
-{\r
-       if (m_bKeyInit == false)\r
-               return;\r
-       if (DEFAULT_BLOCK_SIZE == m_blockSize)\r
-       {\r
-               DefEncryptBlock(in, result);\r
-               return;\r
-       }\r
-       int BC = m_blockSize / 4;\r
-       int SC = (BC == 4) ? 0 : (BC == 6 ? 1 : 2);\r
-       int s1 = sm_shifts[SC][1][0];\r
-       int s2 = sm_shifts[SC][2][0];\r
-       int s3 = sm_shifts[SC][3][0];\r
-       //Temporary Work Arrays\r
-       int i;\r
-       int tt;\r
-       int* pi = t;\r
-       for (i=0; i<BC; i++)\r
-       {\r
-               *pi = ((unsigned char)*(in++) << 24);\r
-               *pi |= ((unsigned char)*(in++) << 16);\r
-               *pi |= ((unsigned char)*(in++) << 8);\r
-               (*(pi++) |= (unsigned char)*(in++)) ^= m_Ke[0][i];\r
-       }\r
-       //Apply Round Transforms\r
-       for (int r=1; r<m_iROUNDS; r++)\r
-       {\r
-               for (i=0; i<BC; i++)\r
-                       a[i] = (sm_T1[(t[i] >> 24) & 0xFF] ^\r
-                               sm_T2[(t[(i + s1) % BC] >> 16) & 0xFF] ^\r
-                               sm_T3[(t[(i + s2) % BC] >>  8) & 0xFF] ^\r
-                               sm_T4[ t[(i + s3) % BC] & 0xFF] ) ^ m_Ke[r][i];\r
-               memcpy(t, a, 4*BC);\r
-       }\r
-       int j;\r
-       //Last Round is Special\r
-       for (i=0,j=0; i<BC; i++)\r
-       {\r
-               tt = m_Ke[m_iROUNDS][i];\r
-               result[j++] = sm_S[(t[i] >> 24) & 0xFF] ^ (tt >> 24);\r
-               result[j++] = sm_S[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16);\r
-               result[j++] = sm_S[(t[(i + s2) % BC] >>  8) & 0xFF] ^ (tt >>  8);\r
-               result[j++] = sm_S[ t[(i + s3) % BC] & 0xFF] ^ tt;\r
-       }\r
-}\r
-\r
-//Decrypt exactly one block of ciphertext.\r
-// in         - The ciphertext.\r
-// result     - The plaintext generated from a ciphertext using the session key.\r
-void AES::DecryptBlock(char const* in, char* result)\r
-{\r
-       if (m_bKeyInit == false)\r
-               return;\r
-       if (DEFAULT_BLOCK_SIZE == m_blockSize)\r
-       {\r
-               DefDecryptBlock(in, result);\r
-               return;\r
-       }\r
-       int BC = m_blockSize / 4;\r
-       int SC = BC == 4 ? 0 : (BC == 6 ? 1 : 2);\r
-       int s1 = sm_shifts[SC][1][1];\r
-       int s2 = sm_shifts[SC][2][1];\r
-       int s3 = sm_shifts[SC][3][1];\r
-       //Temporary Work Arrays\r
-       int i;\r
-       int tt;\r
-       int* pi = t;\r
-       for (i=0; i<BC; i++)\r
-       {\r
-               *pi = ((unsigned char)*(in++) << 24);\r
-               *pi |= ((unsigned char)*(in++) << 16);\r
-               *pi |= ((unsigned char)*(in++) << 8);\r
-               (*(pi++) |= (unsigned char)*(in++)) ^= m_Kd[0][i];\r
-       }\r
-       //Apply Round Transforms\r
-       for (int r=1; r<m_iROUNDS; r++)\r
-       {\r
-               for (i=0; i<BC; i++)\r
-                       a[i] = (sm_T5[(t[i] >> 24) & 0xFF] ^\r
-                               sm_T6[(t[(i + s1) % BC] >> 16) & 0xFF] ^\r
-                               sm_T7[(t[(i + s2) % BC] >>  8) & 0xFF] ^\r
-                               sm_T8[ t[(i + s3) % BC] & 0xFF]) ^ m_Kd[r][i];\r
-               memcpy(t, a, 4*BC);\r
-       }\r
-       int j;\r
-       //Last Round is Special\r
-       for (i=0,j=0; i<BC; i++)\r
-       {\r
-               tt = m_Kd[m_iROUNDS][i];\r
-               result[j++] = sm_Si[(t[i] >> 24) & 0xFF] ^ (tt >> 24);\r
-               result[j++] = sm_Si[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16);\r
-               result[j++] = sm_Si[(t[(i + s2) % BC] >>  8) & 0xFF] ^ (tt >>  8);\r
-               result[j++] = sm_Si[ t[(i + s3) % BC] & 0xFF] ^ tt;\r
-       }\r
-}\r
-\r
-void AES::Encrypt(char const* in, char* result, size_t n, int iMode)\r
-{\r
-       if (m_bKeyInit == false)\r
-               return;\r
-       //n should be > 0 and multiple of m_blockSize\r
-       if (n == 0 || n%m_blockSize!=0)\r
-               return;\r
-       unsigned int i;\r
-       char const* pin;\r
-       char* presult;\r
-       if (CBC == iMode) //CBC mode, using the Chain\r
-       {\r
-               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)\r
-               {\r
-                       Xor(m_chain, pin);\r
-                       EncryptBlock(m_chain, presult);\r
-                       memcpy(m_chain, presult, m_blockSize);\r
-                       pin += m_blockSize;\r
-                       presult += m_blockSize;\r
-               }\r
-       }\r
-       else if (CFB == iMode) //CFB mode, using the Chain\r
-       {\r
-               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)\r
-               {\r
-                       EncryptBlock(m_chain, presult);\r
-                       Xor(presult, pin);\r
-                       memcpy(m_chain, presult, m_blockSize);\r
-                       pin += m_blockSize;\r
-                       presult += m_blockSize;\r
-               }\r
-       }\r
-       else //ECB mode, not using the Chain\r
-       {\r
-               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)\r
-               {\r
-                       EncryptBlock(pin, presult);\r
-                       pin += m_blockSize;\r
-                       presult += m_blockSize;\r
-               }\r
-       }\r
-}\r
-\r
-void AES::Decrypt(char const* in, char* result, size_t n, int iMode)\r
-{\r
-       if (m_bKeyInit == false)\r
-               return;\r
-       //n should be > 0 and multiple of m_blockSize\r
-       if (n == 0 || n%m_blockSize!=0)\r
-               return;\r
-       unsigned int i;\r
-       char const* pin;\r
-       char* presult;\r
-       if (CBC == iMode) //CBC mode, using the Chain\r
-       {\r
-               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)\r
-               {\r
-                       DecryptBlock(pin, presult);\r
-                       Xor(presult, m_chain);\r
-                       memcpy(m_chain, pin, m_blockSize);                              \r
-                       pin += m_blockSize;\r
-                       presult += m_blockSize;\r
-               }\r
-       }\r
-       else if (CFB == iMode) //CFB mode, using the Chain, not using Decrypt()\r
-       {\r
-               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)\r
-               {\r
-                       EncryptBlock(m_chain, presult);\r
-                       //memcpy(presult, pin, m_blockSize);\r
-                       Xor(presult, pin);\r
-                       memcpy(m_chain, pin, m_blockSize);\r
-                       pin += m_blockSize;\r
-                       presult += m_blockSize;\r
-               }\r
-       }\r
-       else //ECB mode, not using the Chain\r
-       {\r
-               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)\r
-               {\r
-                       DecryptBlock(pin, presult);\r
-                       pin += m_blockSize;\r
-                       presult += m_blockSize;\r
-               }\r
-       }\r
-}\r
-\r
+
+//Rijndael.cpp
+
+#include <cstring>
+#include "aes.h"
+
+const int AES::sm_alog[256] =
+{
+       1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53, 
+       95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170, 
+       229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49, 
+       83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205, 
+       76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136, 
+       131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154, 
+       181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163, 
+       254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160, 
+       251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65, 
+       195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117, 
+       159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128, 
+       155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84, 
+       252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202, 
+       69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14, 
+       18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23, 
+       57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1
+};
+
+const int AES::sm_log[256] =
+{
+       0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3, 
+       100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193, 
+       125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120, 
+       101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142, 
+       150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56, 
+       102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16, 
+       126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186, 
+       43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, 167, 87, 
+       175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230, 173, 232, 
+       44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169, 81, 160, 
+       127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183, 
+       204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157, 
+       151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209, 
+       83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171, 
+       68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, 227, 165, 
+       103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7
+};
+
+const char AES::sm_S[256] =
+{
+       99, 124, 119, 123, -14, 107, 111, -59, 48, 1, 103, 43, -2, -41, -85, 118, 
+       -54, -126, -55, 125, -6, 89, 71, -16, -83, -44, -94, -81, -100, -92, 114, -64, 
+       -73, -3, -109, 38, 54, 63, -9, -52, 52, -91, -27, -15, 113, -40, 49, 21, 
+       4, -57, 35, -61, 24, -106, 5, -102, 7, 18, -128, -30, -21, 39, -78, 117, 
+       9, -125, 44, 26, 27, 110, 90, -96, 82, 59, -42, -77, 41, -29, 47, -124, 
+       83, -47, 0, -19, 32, -4, -79, 91, 106, -53, -66, 57, 74, 76, 88, -49, 
+       -48, -17, -86, -5, 67, 77, 51, -123, 69, -7, 2, 127, 80, 60, -97, -88, 
+       81, -93, 64, -113, -110, -99, 56, -11, -68, -74, -38, 33, 16, -1, -13, -46, 
+       -51, 12, 19, -20, 95, -105, 68, 23, -60, -89, 126, 61, 100, 93, 25, 115, 
+       96, -127, 79, -36, 34, 42, -112, -120, 70, -18, -72, 20, -34, 94, 11, -37, 
+       -32, 50, 58, 10, 73, 6, 36, 92, -62, -45, -84, 98, -111, -107, -28, 121, 
+       -25, -56, 55, 109, -115, -43, 78, -87, 108, 86, -12, -22, 101, 122, -82, 8, 
+       -70, 120, 37, 46, 28, -90, -76, -58, -24, -35, 116, 31, 75, -67, -117, -118, 
+       112, 62, -75, 102, 72, 3, -10, 14, 97, 53, 87, -71, -122, -63, 29, -98, 
+       -31, -8, -104, 17, 105, -39, -114, -108, -101, 30, -121, -23, -50, 85, 40, -33, 
+       -116, -95, -119, 13, -65, -26, 66, 104, 65, -103, 45, 15, -80, 84, -69, 22
+};
+
+const char AES::sm_Si[256] =
+{
+       82, 9, 106, -43, 48, 54, -91, 56, -65, 64, -93, -98, -127, -13, -41, -5, 
+       124, -29, 57, -126, -101, 47, -1, -121, 52, -114, 67, 68, -60, -34, -23, -53, 
+       84, 123, -108, 50, -90, -62, 35, 61, -18, 76, -107, 11, 66, -6, -61, 78, 
+       8, 46, -95, 102, 40, -39, 36, -78, 118, 91, -94, 73, 109, -117, -47, 37, 
+       114, -8, -10, 100, -122, 104, -104, 22, -44, -92, 92, -52, 93, 101, -74, -110, 
+       108, 112, 72, 80, -3, -19, -71, -38, 94, 21, 70, 87, -89, -115, -99, -124, 
+       -112, -40, -85, 0, -116, -68, -45, 10, -9, -28, 88, 5, -72, -77, 69, 6, 
+       -48, 44, 30, -113, -54, 63, 15, 2, -63, -81, -67, 3, 1, 19, -118, 107, 
+       58, -111, 17, 65, 79, 103, -36, -22, -105, -14, -49, -50, -16, -76, -26, 115, 
+       -106, -84, 116, 34, -25, -83, 53, -123, -30, -7, 55, -24, 28, 117, -33, 110, 
+       71, -15, 26, 113, 29, 41, -59, -119, 111, -73, 98, 14, -86, 24, -66, 27, 
+       -4, 86, 62, 75, -58, -46, 121, 32, -102, -37, -64, -2, 120, -51, 90, -12, 
+       31, -35, -88, 51, -120, 7, -57, 49, -79, 18, 16, 89, 39, -128, -20, 95, 
+       96, 81, 127, -87, 25, -75, 74, 13, 45, -27, 122, -97, -109, -55, -100, -17, 
+       -96, -32, 59, 77, -82, 42, -11, -80, -56, -21, -69, 60, -125, 83, -103, 97, 
+       23, 43, 4, 126, -70, 119, -42, 38, -31, 105, 20, 99, 85, 33, 12, 125
+};
+
+const int AES::sm_T1[256] =
+{
+       -966564955, -126059388, -294160487, -159679603, 
+       -855539, -697603139, -563122255, -1849309868, 
+       1613770832, 33620227, -832084055, 1445669757, 
+       -402719207, -1244145822, 1303096294, -327780710, 
+       -1882535355, 528646813, -1983264448, -92439161, 
+       -268764651, -1302767125, -1907931191, -68095989, 
+       1101901292, -1277897625, 1604494077, 1169141738, 
+       597466303, 1403299063, -462261610, -1681866661, 
+       1974974402, -503448292, 1033081774, 1277568618, 
+       1815492186, 2118074177, -168298750, -2083730353, 
+       1748251740, 1369810420, -773462732, -101584632, 
+       -495881837, -1411852173, 1647391059, 706024767, 
+       134480908, -1782069422, 1176707941, -1648114850, 
+       806885416, 932615841, 168101135, 798661301, 
+       235341577, 605164086, 461406363, -538779075, 
+       -840176858, 1311188841, 2142417613, -361400929, 
+       302582043, 495158174, 1479289972, 874125870, 
+       907746093, -596742478, -1269146898, 1537253627, 
+       -1538108682, 1983593293, -1210657183, 2108928974, 
+       1378429307, -572267714, 1580150641, 327451799, 
+       -1504488459, -1177431704, 0, -1041371860, 
+       1075847264, -469959649, 2041688520, -1235526675, 
+       -731223362, -1916023994, 1740553945, 1916352843, 
+       -1807070498, -1739830060, -1336387352, -2049978550, 
+       -1143943061, -974131414, 1336584933, -302253290, 
+       -2042412091, -1706209833, 1714631509, 293963156, 
+       -1975171633, -369493744, 67240454, -25198719, 
+       -1605349136, 2017213508, 631218106, 1269344483, 
+       -1571728909, 1571005438, -2143272768, 93294474, 
+       1066570413, 563977660, 1882732616, -235539196, 
+       1673313503, 2008463041, -1344611723, 1109467491, 
+       537923632, -436207846, -34344178, -1076702611, 
+       -2117218996, 403442708, 638784309, -1007883217, 
+       -1101045791, 899127202, -2008791860, 773265209, 
+       -1815821225, 1437050866, -58818942, 2050833735, 
+       -932944724, -1168286233, 840505643, -428641387, 
+       -1067425632, 427917720, -1638969391, -1545806721, 
+       1143087718, 1412049534, 999329963, 193497219, 
+       -1941551414, -940642775, 1807268051, 672404540, 
+       -1478566279, -1134666014, 369822493, -1378100362, 
+       -606019525, 1681011286, 1949973070, 336202270, 
+       -1840690725, 201721354, 1210328172, -1201906460, 
+       -1614626211, -1110191250, 1135389935, -1000185178, 
+       965841320, 831886756, -739974089, -226920053, 
+       -706222286, -1949775805, 1849112409, -630362697, 
+       26054028, -1311386268, -1672589614, 1235855840, 
+       -663982924, -1403627782, -202050553, -806688219, 
+       -899324497, -193299826, 1202630377, 268961816, 
+       1874508501, -260540280, 1243948399, 1546530418, 
+       941366308, 1470539505, 1941222599, -1748580783, 
+       -873928669, -1579295364, -395021156, 1042226977, 
+       -1773450275, 1639824860, 227249030, 260737669, 
+       -529502064, 2084453954, 1907733956, -865704278, 
+       -1874310952, 100860677, -134810111, 470683154, 
+       -1033805405, 1781871967, -1370007559, 1773779408, 
+       394692241, -1715355304, 974986535, 664706745, 
+       -639508168, -336005101, 731420851, 571543859, 
+       -764843589, -1445340816, 126783113, 865375399, 
+       765172662, 1008606754, 361203602, -907417312, 
+       -2016489911, -1437248001, 1344809080, -1512054918, 
+       59542671, 1503764984, 160008576, 437062935, 
+       1707065306, -672733647, -2076032314, -798463816, 
+       -2109652541, 697932208, 1512910199, 504303377, 
+       2075177163, -1470868228, 1841019862, 739644986
+};
+
+const int AES::sm_T2[256] =
+{
+       -1513725085, -2064089988, -1712425097, -1913226373, 
+       234877682, -1110021269, -1310822545, 1418839493, 
+       1348481072, 50462977, -1446090905, 2102799147, 
+       434634494, 1656084439, -431117397, -1695779210, 
+       1167051466, -1658879358, 1082771913, -2013627011, 
+       368048890, -340633255, -913422521, 201060592, 
+       -331240019, 1739838676, -44064094, -364531793, 
+       -1088185188, -145513308, -1763413390, 1536934080, 
+       -1032472649, 484572669, -1371696237, 1783375398, 
+       1517041206, 1098792767, 49674231, 1334037708, 
+       1550332980, -195975771, 886171109, 150598129, 
+       -1813876367, 1940642008, 1398944049, 1059722517, 
+       201851908, 1385547719, 1699095331, 1587397571, 
+       674240536, -1590192490, 252314885, -1255171430, 
+       151914247, 908333586, -1692696448, 1038082786, 
+       651029483, 1766729511, -847269198, -1612024459, 
+       454166793, -1642232957, 1951935532, 775166490, 
+       758520603, -1294176658, -290170278, -77881184, 
+       -157003182, 1299594043, 1639438038, -830622797, 
+       2068982057, 1054729187, 1901997871, -1760328572, 
+       -173649069, 1757008337, 0, 750906861, 
+       1614815264, 535035132, -931548751, -306816165, 
+       -1093375382, 1183697867, -647512386, 1265776953, 
+       -560706998, -728216500, -391096232, 1250283471, 
+       1807470800, 717615087, -447763798, 384695291, 
+       -981056701, -677753523, 1432761139, -1810791035, 
+       -813021883, 283769337, 100925954, -2114027649, 
+       -257929136, 1148730428, -1171939425, -481580888, 
+       -207466159, -27417693, -1065336768, -1979347057, 
+       -1388342638, -1138647651, 1215313976, 82966005, 
+       -547111748, -1049119050, 1974459098, 1665278241, 
+       807407632, 451280895, 251524083, 1841287890, 
+       1283575245, 337120268, 891687699, 801369324, 
+       -507617441, -1573546089, -863484860, 959321879, 
+       1469301956, -229267545, -2097381762, 1199193405, 
+       -1396153244, -407216803, 724703513, -1780059277, 
+       -1598005152, -1743158911, -778154161, 2141445340, 
+       1715741218, 2119445034, -1422159728, -2096396152, 
+       -896776634, 700968686, -747915080, 1009259540, 
+       2041044702, -490971554, 487983883, 1991105499, 
+       1004265696, 1449407026, 1316239930, 504629770, 
+       -611169975, 168560134, 1816667172, -457679780, 
+       1570751170, 1857934291, -280777556, -1497079198, 
+       -1472622191, -1540254315, 936633572, -1947043463, 
+       852879335, 1133234376, 1500395319, -1210421907, 
+       -1946055283, 1689376213, -761508274, -532043351, 
+       -1260884884, -89369002, 133428468, 634383082, 
+       -1345690267, -1896580486, -381178194, 403703816, 
+       -714097990, -1997506440, 1867130149, 1918643758, 
+       607656988, -245913946, -948718412, 1368901318, 
+       600565992, 2090982877, -1662487436, 557719327, 
+       -577352885, -597574211, -2045932661, -2062579062, 
+       -1864339344, 1115438654, -999180875, -1429445018, 
+       -661632952, 84280067, 33027830, 303828494, 
+       -1547542175, 1600795957, -106014889, -798377543, 
+       -1860729210, 1486471617, 658119965, -1188585826, 
+       953803233, 334231800, -1288988520, 857870609, 
+       -1143838359, 1890179545, -1995993458, -1489791852, 
+       -1238525029, 574365214, -1844082809, 550103529, 
+       1233637070, -5614251, 2018519080, 2057691103, 
+       -1895592820, -128343647, -2146858615, 387583245, 
+       -630865985, 836232934, -964410814, -1194301336, 
+       -1014873791, -1339450983, 2002398509, 287182607, 
+       -881086288, -56077228, -697451589, 975967766
+};
+
+const int AES::sm_T3[256] =
+{
+       1671808611, 2089089148, 2006576759, 2072901243, 
+       -233963534, 1807603307, 1873927791, -984313403, 
+       810573872, 16974337, 1739181671, 729634347, 
+       -31856642, -681396777, -1410970197, 1989864566, 
+       -901410870, -2103631998, -918517303, 2106063485, 
+       -99225606, 1508618841, 1204391495, -267650064, 
+       -1377025619, -731401260, -1560453214, -1343601233, 
+       -1665195108, -1527295068, 1922491506, -1067738176, 
+       -1211992649, -48438787, -1817297517, 644500518, 
+       911895606, 1061256767, -150800905, -867204148, 
+       878471220, -1510714971, -449523227, -251069967, 
+       1905517169, -663508008, 827548209, 356461077, 
+       67897348, -950889017, 593839651, -1017209405, 
+       405286936, -1767819370, 84871685, -1699401830, 
+       118033927, 305538066, -2137318528, -499261470, 
+       -349778453, 661212711, -1295155278, 1973414517, 
+       152769033, -2086789757, 745822252, 439235610, 
+       455947803, 1857215598, 1525593178, -1594139744, 
+       1391895634, 994932283, -698239018, -1278313037, 
+       695947817, -482419229, 795958831, -2070473852, 
+       1408607827, -781665839, 0, -315833875, 
+       543178784, -65018884, -1312261711, 1542305371, 
+       1790891114, -884568629, -1093048386, 961245753, 
+       1256100938, 1289001036, 1491644504, -817199665, 
+       -798245936, -282409489, -1427812438, -82383365, 
+       1137018435, 1305975373, 861234739, -2053893755, 
+       1171229253, -116332039, 33948674, 2139225727, 
+       1357946960, 1011120188, -1615190625, -1461498968, 
+       1374921297, -1543610973, 1086357568, -1886780017, 
+       -1834139758, -1648615011, 944271416, -184225291, 
+       -1126210628, -1228834890, -629821478, 560153121, 
+       271589392, -15014401, -217121293, -764559406, 
+       -850624051, 202643468, 322250259, -332413972, 
+       1608629855, -1750977129, 1154254916, 389623319, 
+       -1000893500, -1477290585, 2122513534, 1028094525, 
+       1689045092, 1575467613, 422261273, 1939203699, 
+       1621147744, -2120738431, 1339137615, -595614756, 
+       577127458, 712922154, -1867826288, -2004677752, 
+       1187679302, -299251730, -1194103880, 339486740, 
+       -562452514, 1591917662, 186455563, -612979237, 
+       -532948000, 844522546, 978220090, 169743370, 
+       1239126601, 101321734, 611076132, 1558493276, 
+       -1034051646, -747717165, -1393605716, 1655096418, 
+       -1851246191, -1784401515, -466103324, 2039214713, 
+       -416098841, -935097400, 928607799, 1840765549, 
+       -1920204403, -714821163, 1322425422, -1444918871, 
+       1823791212, 1459268694, -200805388, -366620694, 
+       1706019429, 2056189050, -1360443474, 135794696, 
+       -1160417350, 2022240376, 628050469, 779246638, 
+       472135708, -1494132826, -1261997132, -967731258, 
+       -400307224, -579034659, 1956440180, 522272287, 
+       1272813131, -1109630531, -1954148981, -1970991222, 
+       1888542832, 1044544574, -1245417035, 1722469478, 
+       1222152264, 50660867, -167643146, 236067854, 
+       1638122081, 895445557, 1475980887, -1177523783, 
+       -2037311610, -1051158079, 489110045, -1632032866, 
+       -516367903, -132912136, -1733088360, 288563729, 
+       1773916777, -646927911, -1903622258, -1800981612, 
+       -1682559589, 505560094, -2020469369, -383727127, 
+       -834041906, 1442818645, 678973480, -545610273, 
+       -1936784500, -1577559647, -1988097655, 219617805, 
+       -1076206145, -432941082, 1120306242, 1756942440, 
+       1103331905, -1716508263, 762796589, 252780047, 
+       -1328841808, 1425844308, -1143575109, 372911126
+};
+
+const int AES::sm_T4[256] =
+{
+       1667474886, 2088535288, 2004326894, 2071694838, 
+       -219017729, 1802223062, 1869591006, -976923503, 
+       808472672, 16843522, 1734846926, 724270422, 
+       -16901657, -673750347, -1414797747, 1987484396, 
+       -892713585, -2105369313, -909557623, 2105378810, 
+       -84273681, 1499065266, 1195886990, -252703749, 
+       -1381110719, -724277325, -1566376609, -1347425723, 
+       -1667449053, -1532692653, 1920112356, -1061135461, 
+       -1212693899, -33743647, -1819038147, 640051788, 
+       909531756, 1061110142, -134806795, -859025533, 
+       875846760, -1515850671, -437963567, -235861767, 
+       1903268834, -656903253, 825316194, 353713962, 
+       67374088, -943238507, 589522246, -1010606435, 
+       404236336, -1768513225, 84217610, -1701137105, 
+       117901582, 303183396, -2139055333, -488489505, 
+       -336910643, 656894286, -1296904833, 1970642922, 
+       151591698, -2088526307, 741110872, 437923380, 
+       454765878, 1852748508, 1515908788, -1600062629, 
+       1381168804, 993742198, -690593353, -1280061827, 
+       690584402, -471646499, 791638366, -2071685357, 
+       1398011302, -774805319, 0, -303223615, 
+       538992704, -50585629, -1313748871, 1532751286, 
+       1785380564, -875870579, -1094788761, 960056178, 
+       1246420628, 1280103576, 1482221744, -808498555, 
+       -791647301, -269538619, -1431640753, -67430675, 
+       1128514950, 1296947098, 859002214, -2054843375, 
+       1162203018, -101117719, 33687044, 2139062782, 
+       1347481760, 1010582648, -1616922075, -1465326773, 
+       1364325282, -1549533603, 1077985408, -1886418427, 
+       -1835881153, -1650607071, 943212656, -168491791, 
+       -1128472733, -1229536905, -623217233, 555836226, 
+       269496352, -58651, -202174723, -757961281, 
+       -842183551, 202118168, 320025894, -320065597, 
+       1600119230, -1751670219, 1145359496, 387397934, 
+       -993765485, -1482165675, 2122220284, 1027426170, 
+       1684319432, 1566435258, 421079858, 1936954854, 
+       1616945344, -2122213351, 1330631070, -589529181, 
+       572679748, 707427924, -1869567173, -2004319477, 
+       1179044492, -286381625, -1195846805, 336870440, 
+       -555845209, 1583276732, 185277718, -606374227, 
+       -522175525, 842159716, 976899700, 168435220, 
+       1229577106, 101059084, 606366792, 1549591736, 
+       -1027449441, -741118275, -1397952701, 1650632388, 
+       -1852725191, -1785355215, -454805549, 2038008818, 
+       -404278571, -926399605, 926374254, 1835907034, 
+       -1920103423, -707435343, 1313788572, -1448484791, 
+       1819063512, 1448540844, -185333773, -353753649, 
+       1701162954, 2054852340, -1364268729, 134748176, 
+       -1162160785, 2021165296, 623210314, 774795868, 
+       471606328, -1499008681, -1263220877, -960081513, 
+       -387439669, -572687199, 1953799400, 522133822, 
+       1263263126, -1111630751, -1953790451, -1970633457, 
+       1886425312, 1044267644, -1246378895, 1718004428, 
+       1212733584, 50529542, -151649801, 235803164, 
+       1633788866, 892690282, 1465383342, -1179004823, 
+       -2038001385, -1044293479, 488449850, -1633765081, 
+       -505333543, -117959701, -1734823125, 286339874, 
+       1768537042, -640061271, -1903261433, -1802197197, 
+       -1684294099, 505291324, -2021158379, -370597687, 
+       -825341561, 1431699370, 673740880, -539002203, 
+       -1936945405, -1583220647, -1987477495, 218961690, 
+       -1077945755, -421121577, 1111672452, 1751693520, 
+       1094828930, -1717981143, 757954394, 252645662, 
+       -1330590853, 1414855848, -1145317779, 370555436
+};
+
+const int AES::sm_T5[256] =
+{
+       1374988112, 2118214995, 437757123, 975658646, 
+       1001089995, 530400753, -1392879445, 1273168787, 
+       540080725, -1384747530, -1999866223, -184398811, 
+       1340463100, -987051049, 641025152, -1251826801, 
+       -558802359, 632953703, 1172967064, 1576976609, 
+       -1020300030, -2125664238, -1924753501, 1809054150, 
+       59727847, 361929877, -1083344149, -1789765158, 
+       -725712083, 1484005843, 1239443753, -1899378620, 
+       1975683434, -191989384, -1722270101, 666464733, 
+       -1092530250, -259478249, -920605594, 2110667444, 
+       1675577880, -451268222, -1756286112, 1649639237, 
+       -1318815776, -1150570876, -25059300, -116905068, 
+       1883793496, -1891238631, -1797362553, 1383856311, 
+       -1418472669, 1917518562, -484470953, 1716890410, 
+       -1293211641, 800440835, -2033878118, -751368027, 
+       807962610, 599762354, 33778362, -317291940, 
+       -1966138325, -1485196142, -217582864, 1315562145, 
+       1708848333, 101039829, -785096161, -995688822, 
+       875451293, -1561111136, 92987698, -1527321739, 
+       193195065, 1080094634, 1584504582, -1116860335, 
+       1042385657, -1763899843, -583137874, 1306967366, 
+       -1856729675, 1908694277, 67556463, 1615861247, 
+       429456164, -692196969, -1992277044, 1742315127, 
+       -1326955843, 126454664, -417768648, 2043211483, 
+       -1585706425, 2084704233, -125559095, 0, 
+       159417987, 841739592, 504459436, 1817866830, 
+       -49348613, 260388950, 1034867998, 908933415, 
+       168810852, 1750902305, -1688513327, 607530554, 
+       202008497, -1822955761, -1259432238, 463180190, 
+       -2134850225, 1641816226, 1517767529, 470948374, 
+       -493635062, -1063245083, 1008918595, 303765277, 
+       235474187, -225720403, 766945465, 337553864, 
+       1475418501, -1351284916, -291906117, -1551933187, 
+       -150919521, 1551037884, 1147550661, 1543208500, 
+       -1958532746, -886847780, -1225917336, -1192955549, 
+       -684598070, 1113818384, 328671808, -2067394272, 
+       -2058738563, -759480840, -1359400431, -953573011, 
+       496906059, -592301837, 226906860, 2009195472, 
+       733156972, -1452230247, 294930682, 1206477858, 
+       -1459843900, -1594867942, 1451044056, 573804783, 
+       -2025238841, -650587711, -1932877058, -1730933962, 
+       -1493859889, -1518674392, -625504730, 1068351396, 
+       742039012, 1350078989, 1784663195, 1417561698, 
+       -158526526, -1864845080, 775550814, -2101104651, 
+       -1621262146, 1775276924, 1876241833, -819653965, 
+       -928212677, 270040487, -392404114, -616842373, 
+       -853116919, 1851332852, -325404927, -2091935064, 
+       -426414491, -1426069890, 566021896, -283776794, 
+       -1159226407, 1248802510, -358676012, 699432150, 
+       832877231, 708780849, -962227152, 899835584, 
+       1951317047, -58537306, -527380304, 866637845, 
+       -251357110, 1106041591, 2144161806, 395441711, 
+       1984812685, 1139781709, -861254316, -459930401, 
+       -1630423581, 1282050075, -1054072904, 1181045119, 
+       -1654724092, 25965917, -91786125, -83148498, 
+       -1285087910, -1831087534, -384805325, 1842759443, 
+       -1697160820, 933301370, 1509430414, -351060855, 
+       -827774994, -1218328267, -518199827, 2051518780, 
+       -1663901863, 1441952575, 404016761, 1942435775, 
+       1408749034, 1610459739, -549621996, 2017778566, 
+       -894438527, -1184316354, 941896748, -1029488545, 
+       371049330, -1126030068, 675039627, -15887039, 
+       967311729, 135050206, -659233636, 1683407248, 
+       2076935265, -718096784, 1215061108, -793225406
+};
+
+const int AES::sm_T6[256] =
+{
+       1347548327, 1400783205, -1021700188, -1774573730, 
+       -885281941, -249586363, -1414727080, -1823743229, 
+       1428173050, -156404115, -1853305738, 636813900, 
+       -61872681, -674944309, -2144979644, -1883938141, 
+       1239331162, 1730525723, -1740248562, -513933632, 
+       46346101, 310463728, -1551022441, -966011911, 
+       -419197089, -1793748324, -339776134, -627748263, 
+       768917123, -749177823, 692707433, 1150208456, 
+       1786102409, 2029293177, 1805211710, -584599183, 
+       -1229004465, 401639597, 1724457132, -1266823622, 
+       409198410, -2098914767, 1620529459, 1164071807, 
+       -525245321, -2068091986, 486441376, -1795618773, 
+       1483753576, 428819965, -2020286868, -1219331080, 
+       598438867, -495826174, 1474502543, 711349675, 
+       129166120, 53458370, -1702443653, -1512884472, 
+       -231724921, -1306280027, -1174273174, 1559041666, 
+       730517276, -1834518092, -252508174, -1588696606, 
+       -848962828, -721025602, 533804130, -1966823682, 
+       -1657524653, -1599933611, 839224033, 1973745387, 
+       957055980, -1438621457, 106852767, 1371368976, 
+       -113368694, 1033297158, -1361232379, 1179510461, 
+       -1248766835, 91341917, 1862534868, -10465259, 
+       605657339, -1747534359, -863420349, 2003294622, 
+       -1112479678, -2012771957, 954669403, -612775698, 
+       1201765386, -377732593, -906460130, 0, 
+       -2096529274, 1211247597, -1407315600, 1315723890, 
+       -67301633, 1443857720, 507358933, 657861945, 
+       1678381017, 560487590, -778347692, 975451694, 
+       -1324610969, 261314535, -759894378, -1642357871, 
+       1333838021, -1570644960, 1767536459, 370938394, 
+       182621114, -440360918, 1128014560, 487725847, 
+       185469197, -1376613433, -1188186456, -938205527, 
+       -2057834215, 1286567175, -1141990947, -39616672, 
+       -1611202266, -1134791947, -985373125, 878443390, 
+       1988838185, -590666810, 1756818940, 1673061617, 
+       -891866660, 272786309, 1075025698, 545572369, 
+       2105887268, -120407235, 296679730, 1841768865, 
+       1260232239, -203640272, -334657966, -797457949, 
+       1814803222, -1716948807, -99511224, 575138148, 
+       -995558260, 446754879, -665420500, -282971248, 
+       -947435186, -1042728751, -24327518, 915985419, 
+       -811141759, 681933534, 651868046, -1539330625, 
+       -466863459, 223377554, -1687527476, 1649704518, 
+       -1024029421, -393160520, 1580087799, -175979601, 
+       -1096852096, 2087309459, -1452288723, -1278270190, 
+       1003007129, -1492117379, 1860738147, 2077965243, 
+       164439672, -194094824, 32283319, -1467789414, 
+       1709610350, 2125135846, 136428751, -420538904, 
+       -642062437, -833982666, -722821367, -701910916, 
+       -1355701070, 824852259, 818324884, -1070226842, 
+       930369212, -1493400886, -1327460144, 355706840, 
+       1257309336, -146674470, 243256656, 790073846, 
+       -1921626666, 1296297904, 1422699085, -538667516, 
+       -476130891, 457992840, -1195299809, 2135319889, 
+       77422314, 1560382517, 1945798516, 788204353, 
+       1521706781, 1385356242, 870912086, 325965383, 
+       -1936009375, 2050466060, -1906706412, -1981082820, 
+       -288446169, 901210569, -304014107, 1014646705, 
+       1503449823, 1062597235, 2031621326, -1082931401, 
+       -363595827, 1533017514, 350174575, -2038938405, 
+       -2117423117, 1052338372, 741876788, 1606591296, 
+       1914052035, 213705253, -1960297399, 1107234197, 
+       1899603969, -569897805, -1663519516, -1872472383, 
+       1635502980, 1893020342, 1950903388, 1120974935
+};
+
+const int AES::sm_T7[256] =
+{
+       -1487908364, 1699970625, -1530717673, 1586903591, 
+       1808481195, 1173430173, 1487645946, 59984867, 
+       -95084496, 1844882806, 1989249228, 1277555970, 
+       -671330331, -875051734, 1149249077, -1550863006, 
+       1514790577, 459744698, 244860394, -1058972162, 
+       1963115311, -267222708, -1750889146, -104436781, 
+       1608975247, -1667951214, 2062270317, 1507497298, 
+       -2094148418, 567498868, 1764313568, -935031095, 
+       -1989511742, 2037970062, 1047239000, 1910319033, 
+       1337376481, -1390940024, -1402549984, 984907214, 
+       1243112415, 830661914, 861968209, 2135253587, 
+       2011214180, -1367032981, -1608712575, 731183368, 
+       1750626376, -48656571, 1820824798, -122203525, 
+       -752637069, 48394827, -1890065633, -1423284651, 
+       671593195, -1039978571, 2073724613, 145085239, 
+       -2014171096, -1515052097, 1790575107, -2107839210, 
+       472615631, -1265457287, -219090169, -492745111, 
+       -187865638, -1093335547, 1646252340, -24460122, 
+       1402811438, 1436590835, -516815478, -344611594, 
+       -331805821, -274055072, -1626972559, 273792366, 
+       -1963377119, 104699613, 95345982, -1119466010, 
+       -1917480620, 1560637892, -730921978, 369057872, 
+       -81520232, -375925059, 1137477952, -1636341799, 
+       1119727848, -1954019447, 1530455833, -287606328, 
+       172466556, 266959938, 516552836, 0, 
+       -2038232704, -314035669, 1890328081, 1917742170, 
+       -262898, 945164165, -719438418, 958871085, 
+       -647755249, -1507760036, 1423022939, 775562294, 
+       1739656202, -418409641, -1764576018, -1851909221, 
+       -984645440, 547512796, 1265195639, 437656594, 
+       -1173691757, 719700128, -532464606, 387781147, 
+       218828297, -944901493, -1464259146, -1446505442, 
+       428169201, 122466165, -574886247, 1627235199, 
+       648017665, -172204942, 1002783846, 2117360635, 
+       695634755, -958608605, -60246291, -245122844, 
+       -590686415, -2062531997, 574624663, 287343814, 
+       612205898, 1039717051, 840019705, -1586641111, 
+       793451934, 821288114, 1391201670, -472877119, 
+       376187827, -1181111952, 1224348052, 1679968233, 
+       -1933268740, 1058709744, 752375421, -1863376333, 
+       1321699145, -775825096, -1560376118, 188127444, 
+       -2117097739, -567761542, -1910056265, -1079754835, 
+       -1645990854, -1844621192, -862229921, 1180849278, 
+       331544205, -1192718120, -144822727, -1342864701, 
+       -2134991011, -1820562992, 766078933, 313773861, 
+       -1724135252, 2108100632, 1668212892, -1149510853, 
+       2013908262, 418672217, -1224610662, -1700232369, 
+       1852171925, -427906305, -821550660, -387518699, 
+       -1680229657, 919489135, 164948639, 2094410160, 
+       -1297141340, 590424639, -1808742747, 1723872674, 
+       -1137216434, -895026046, -793714544, -669699161, 
+       -1739919100, -621329940, 1343127501, -164685935, 
+       -695372211, -1337113617, 1297403050, 81781910, 
+       -1243373871, -2011476886, 532201772, 1367295589, 
+       -368796322, 895287692, 1953757831, 1093597963, 
+       492483431, -766340389, 1446242576, 1192455638, 
+       1636604631, 209336225, 344873464, 1015671571, 
+       669961897, -919226527, -437395172, -1321436601, 
+       -547775278, 1933530610, -830924780, 935293895, 
+       -840281097, -1436852227, 1863638845, -611944380, 
+       -209597777, -1002522264, 875313188, 1080017571, 
+       -1015933411, 621591778, 1233856572, -1790836979, 
+       24197544, -1277294580, -459482956, -1047501738, 
+       -2073986101, -1234119374, 1551124588, 1463996600
+};
+
+const int AES::sm_T8[256] =
+{
+       -190361519, 1097159550, 396673818, 660510266, 
+       -1418998981, -1656360673, -94852180, -486304949, 
+       821712160, 1986918061, -864644728, 38544885, 
+       -438830001, 718002117, 893681702, 1654886325, 
+       -1319482914, -1172609243, -368142267, -20913827, 
+       796197571, 1290801793, 1184342925, -738605461, 
+       -1889540349, -1835231979, 1836772287, 1381620373, 
+       -1098699308, 1948373848, -529979063, -909622130, 
+       -1031181707, -1904641804, 1480485785, -1183720153, 
+       -514869570, -2001922064, 548169417, -835013507, 
+       -548792221, 439452389, 1362321559, 1400849762, 
+       1685577905, 1806599355, -2120213250, 137073913, 
+       1214797936, 1174215055, -563312748, 2079897426, 
+       1943217067, 1258480242, 529487843, 1437280870, 
+       -349698126, -1245576401, -981755258, 923313619, 
+       679998000, -1079659997, 57326082, 377642221, 
+       -820237430, 2041877159, 133361907, 1776460110, 
+       -621490843, 96392454, 878845905, -1493267772, 
+       777231668, -212492126, -1964953083, -152341084, 
+       -2081670901, 1626319424, 1906247262, 1846563261, 
+       562755902, -586793578, 1040559837, -423803315, 
+       1418573201, -1000536719, 114585348, 1343618912, 
+       -1728371687, -1108764714, 1078185097, -643926169, 
+       -398279248, -1987344377, 425408743, -923870343, 
+       2081048481, 1108339068, -2078357000, 0, 
+       -2138668279, 736970802, 292596766, 1517440620, 
+       251657213, -2059905521, -1361764803, 758720310, 
+       265905162, 1554391400, 1532285339, 908999204, 
+       174567692, 1474760595, -292105548, -1684955621, 
+       -1060810880, -601841055, 2001430874, 303699484, 
+       -1816524062, -1607801408, 585122620, 454499602, 
+       151849742, -1949848078, -1230456531, 514443284, 
+       -249985705, 1963412655, -1713521682, 2137062819, 
+       19308535, 1928707164, 1715193156, -75615141, 
+       1126790795, 600235211, -302225226, -453942344, 
+       836553431, 1669664834, -1759363053, -971956092, 
+       1243905413, -1153566510, -114159186, 698445255, 
+       -1641067747, -1305414692, -2041385971, -1042034569, 
+       -1290376149, 1891211689, -1807156719, -379313593, 
+       -57883480, -264299872, 2100090966, 865136418, 
+       1229899655, 953270745, -895287668, -737462632, 
+       -176042074, 2061379749, -1215420710, -1379949505, 
+       983426092, 2022837584, 1607244650, 2118541908, 
+       -1928084746, -658970480, 972512814, -1011878526, 
+       1568718495, -795640727, -718427793, 621982671, 
+       -1399243832, 410887952, -1671205144, 1002142683, 
+       645401037, 1494807662, -1699282452, 1335535747, 
+       -1787927066, -1671510, -1127282655, 367585007, 
+       -409216582, 1865862730, -1626745622, -1333995991, 
+       -1531793615, 1059270954, -1517014842, -1570324427, 
+       1320957812, -2100648196, -1865371424, -1479011021, 
+       77089521, -321194175, -850391425, -1846137065, 
+       1305906550, -273658557, -1437772596, -1778065436, 
+       -776608866, 1787304780, 740276417, 1699839814, 
+       1592394909, -1942659839, -2022411270, 188821243, 
+       1729977011, -606973294, 274084841, -699985043, 
+       -681472870, -1593017801, -132870567, 322734571, 
+       -1457000754, 1640576439, 484830689, 1202797690, 
+       -757114468, -227328171, 349075736, -952647821, 
+       -137500077, -39167137, 1030690015, 1155237496, 
+       -1342996022, 1757691577, 607398968, -1556062270, 
+       499347990, -500888388, 1011452712, 227885567, 
+       -1476300487, 213114376, -1260086056, 1455525988, 
+       -880516741, 850817237, 1817998408, -1202240816
+};
+
+const int AES::sm_U1[256] =
+{
+       0, 235474187, 470948374, 303765277, 
+       941896748, 908933415, 607530554, 708780849, 
+       1883793496, 2118214995, 1817866830, 1649639237, 
+       1215061108, 1181045119, 1417561698, 1517767529, 
+       -527380304, -291906117, -58537306, -225720403, 
+       -659233636, -692196969, -995688822, -894438527, 
+       -1864845080, -1630423581, -1932877058, -2101104651, 
+       -1459843900, -1493859889, -1259432238, -1159226407, 
+       -616842373, -718096784, -953573011, -920605594, 
+       -484470953, -317291940, -15887039, -251357110, 
+       -1418472669, -1518674392, -1218328267, -1184316354, 
+       -1822955761, -1654724092, -1891238631, -2125664238, 
+       1001089995, 899835584, 666464733, 699432150, 
+       59727847, 226906860, 530400753, 294930682, 
+       1273168787, 1172967064, 1475418501, 1509430414, 
+       1942435775, 2110667444, 1876241833, 1641816226, 
+       -1384747530, -1551933187, -1318815776, -1083344149, 
+       -1789765158, -1688513327, -1992277044, -2025238841, 
+       -583137874, -751368027, -1054072904, -819653965, 
+       -451268222, -351060855, -116905068, -150919521, 
+       1306967366, 1139781709, 1374988112, 1610459739, 
+       1975683434, 2076935265, 1775276924, 1742315127, 
+       1034867998, 866637845, 566021896, 800440835, 
+       92987698, 193195065, 429456164, 395441711, 
+       1984812685, 2017778566, 1784663195, 1683407248, 
+       1315562145, 1080094634, 1383856311, 1551037884, 
+       101039829, 135050206, 437757123, 337553864, 
+       1042385657, 807962610, 573804783, 742039012, 
+       -1763899843, -1730933962, -1966138325, -2067394272, 
+       -1359400431, -1594867942, -1293211641, -1126030068, 
+       -426414491, -392404114, -91786125, -191989384, 
+       -558802359, -793225406, -1029488545, -861254316, 
+       1106041591, 1340463100, 1576976609, 1408749034, 
+       2043211483, 2009195472, 1708848333, 1809054150, 
+       832877231, 1068351396, 766945465, 599762354, 
+       159417987, 126454664, 361929877, 463180190, 
+       -1585706425, -1351284916, -1116860335, -1285087910, 
+       -1722270101, -1756286112, -2058738563, -1958532746, 
+       -785096161, -549621996, -853116919, -1020300030, 
+       -384805325, -417768648, -184398811, -83148498, 
+       -1697160820, -1797362553, -2033878118, -1999866223, 
+       -1561111136, -1392879445, -1092530250, -1326955843, 
+       -358676012, -459930401, -158526526, -125559095, 
+       -759480840, -592301837, -827774994, -1063245083, 
+       2051518780, 1951317047, 1716890410, 1750902305, 
+       1113818384, 1282050075, 1584504582, 1350078989, 
+       168810852, 67556463, 371049330, 404016761, 
+       841739592, 1008918595, 775550814, 540080725, 
+       -325404927, -493635062, -259478249, -25059300, 
+       -725712083, -625504730, -928212677, -962227152, 
+       -1663901863, -1831087534, -2134850225, -1899378620, 
+       -1527321739, -1426069890, -1192955549, -1225917336, 
+       202008497, 33778362, 270040487, 504459436, 
+       875451293, 975658646, 675039627, 641025152, 
+       2084704233, 1917518562, 1615861247, 1851332852, 
+       1147550661, 1248802510, 1484005843, 1451044056, 
+       933301370, 967311729, 733156972, 632953703, 
+       260388950, 25965917, 328671808, 496906059, 
+       1206477858, 1239443753, 1543208500, 1441952575, 
+       2144161806, 1908694277, 1675577880, 1842759443, 
+       -684598070, -650587711, -886847780, -987051049, 
+       -283776794, -518199827, -217582864, -49348613, 
+       -1485196142, -1452230247, -1150570876, -1251826801, 
+       -1621262146, -1856729675, -2091935064, -1924753501
+};
+
+const int AES::sm_U2[256] =
+{
+       0, 185469197, 370938394, 487725847, 
+       741876788, 657861945, 975451694, 824852259, 
+       1483753576, 1400783205, 1315723890, 1164071807, 
+       1950903388, 2135319889, 1649704518, 1767536459, 
+       -1327460144, -1141990947, -1493400886, -1376613433, 
+       -1663519516, -1747534359, -1966823682, -2117423117, 
+       -393160520, -476130891, -24327518, -175979601, 
+       -995558260, -811141759, -759894378, -642062437, 
+       2077965243, 1893020342, 1841768865, 1724457132, 
+       1474502543, 1559041666, 1107234197, 1257309336, 
+       598438867, 681933534, 901210569, 1052338372, 
+       261314535, 77422314, 428819965, 310463728, 
+       -885281941, -1070226842, -584599183, -701910916, 
+       -419197089, -334657966, -249586363, -99511224, 
+       -1823743229, -1740248562, -2057834215, -1906706412, 
+       -1082931401, -1266823622, -1452288723, -1570644960, 
+       -156404115, -39616672, -525245321, -339776134, 
+       -627748263, -778347692, -863420349, -947435186, 
+       -1361232379, -1512884472, -1195299809, -1278270190, 
+       -2098914767, -1981082820, -1795618773, -1611202266, 
+       1179510461, 1296297904, 1347548327, 1533017514, 
+       1786102409, 1635502980, 2087309459, 2003294622, 
+       507358933, 355706840, 136428751, 53458370, 
+       839224033, 957055980, 605657339, 790073846, 
+       -1921626666, -2038938405, -1687527476, -1872472383, 
+       -1588696606, -1438621457, -1219331080, -1134791947, 
+       -721025602, -569897805, -1021700188, -938205527, 
+       -113368694, -231724921, -282971248, -466863459, 
+       1033297158, 915985419, 730517276, 545572369, 
+       296679730, 446754879, 129166120, 213705253, 
+       1709610350, 1860738147, 1945798516, 2029293177, 
+       1239331162, 1120974935, 1606591296, 1422699085, 
+       -146674470, -61872681, -513933632, -363595827, 
+       -612775698, -797457949, -848962828, -966011911, 
+       -1355701070, -1539330625, -1188186456, -1306280027, 
+       -2096529274, -2012771957, -1793748324, -1642357871, 
+       1201765386, 1286567175, 1371368976, 1521706781, 
+       1805211710, 1620529459, 2105887268, 1988838185, 
+       533804130, 350174575, 164439672, 46346101, 
+       870912086, 954669403, 636813900, 788204353, 
+       -1936009375, -2020286868, -1702443653, -1853305738, 
+       -1599933611, -1414727080, -1229004465, -1112479678, 
+       -722821367, -538667516, -1024029421, -906460130, 
+       -120407235, -203640272, -288446169, -440360918, 
+       1014646705, 930369212, 711349675, 560487590, 
+       272786309, 457992840, 106852767, 223377554, 
+       1678381017, 1862534868, 1914052035, 2031621326, 
+       1211247597, 1128014560, 1580087799, 1428173050, 
+       32283319, 182621114, 401639597, 486441376, 
+       768917123, 651868046, 1003007129, 818324884, 
+       1503449823, 1385356242, 1333838021, 1150208456, 
+       1973745387, 2125135846, 1673061617, 1756818940, 
+       -1324610969, -1174273174, -1492117379, -1407315600, 
+       -1657524653, -1774573730, -1960297399, -2144979644, 
+       -377732593, -495826174, -10465259, -194094824, 
+       -985373125, -833982666, -749177823, -665420500, 
+       2050466060, 1899603969, 1814803222, 1730525723, 
+       1443857720, 1560382517, 1075025698, 1260232239, 
+       575138148, 692707433, 878443390, 1062597235, 
+       243256656, 91341917, 409198410, 325965383, 
+       -891866660, -1042728751, -590666810, -674944309, 
+       -420538904, -304014107, -252508174, -67301633, 
+       -1834518092, -1716948807, -2068091986, -1883938141, 
+       -1096852096, -1248766835, -1467789414, -1551022441, 
+};
+
+const int AES::sm_U3[256] =
+{
+       0, 218828297, 437656594, 387781147, 
+       875313188, 958871085, 775562294, 590424639, 
+       1750626376, 1699970625, 1917742170, 2135253587, 
+       1551124588, 1367295589, 1180849278, 1265195639, 
+       -793714544, -574886247, -895026046, -944901493, 
+       -459482956, -375925059, -24460122, -209597777, 
+       -1192718120, -1243373871, -1560376118, -1342864701, 
+       -1933268740, -2117097739, -1764576018, -1680229657, 
+       -1149510853, -1234119374, -1586641111, -1402549984, 
+       -1890065633, -2107839210, -1790836979, -1739919100, 
+       -752637069, -567761542, -919226527, -1002522264, 
+       -418409641, -368796322, -48656571, -267222708, 
+       1808481195, 1723872674, 1910319033, 2094410160, 
+       1608975247, 1391201670, 1173430173, 1224348052, 
+       59984867, 244860394, 428169201, 344873464, 
+       935293895, 984907214, 766078933, 547512796, 
+       1844882806, 1627235199, 2011214180, 2062270317, 
+       1507497298, 1423022939, 1137477952, 1321699145, 
+       95345982, 145085239, 532201772, 313773861, 
+       830661914, 1015671571, 731183368, 648017665, 
+       -1119466010, -1337113617, -1487908364, -1436852227, 
+       -1989511742, -2073986101, -1820562992, -1636341799, 
+       -719438418, -669699161, -821550660, -1039978571, 
+       -516815478, -331805821, -81520232, -164685935, 
+       -695372211, -611944380, -862229921, -1047501738, 
+       -492745111, -274055072, -122203525, -172204942, 
+       -1093335547, -1277294580, -1530717673, -1446505442, 
+       -1963377119, -2014171096, -1863376333, -1645990854, 
+       104699613, 188127444, 472615631, 287343814, 
+       840019705, 1058709744, 671593195, 621591778, 
+       1852171925, 1668212892, 1953757831, 2037970062, 
+       1514790577, 1463996600, 1080017571, 1297403050, 
+       -621329940, -671330331, -1058972162, -840281097, 
+       -287606328, -472877119, -187865638, -104436781, 
+       -1297141340, -1079754835, -1464259146, -1515052097, 
+       -2038232704, -1954019447, -1667951214, -1851909221, 
+       172466556, 122466165, 273792366, 492483431, 
+       1047239000, 861968209, 612205898, 695634755, 
+       1646252340, 1863638845, 2013908262, 1963115311, 
+       1446242576, 1530455833, 1277555970, 1093597963, 
+       1636604631, 1820824798, 2073724613, 1989249228, 
+       1436590835, 1487645946, 1337376481, 1119727848, 
+       164948639, 81781910, 331544205, 516552836, 
+       1039717051, 821288114, 669961897, 719700128, 
+       -1321436601, -1137216434, -1423284651, -1507760036, 
+       -2062531997, -2011476886, -1626972559, -1844621192, 
+       -647755249, -730921978, -1015933411, -830924780, 
+       -314035669, -532464606, -144822727, -95084496, 
+       -1224610662, -1173691757, -1390940024, -1608712575, 
+       -2094148418, -1910056265, -1724135252, -1808742747, 
+       -547775278, -766340389, -984645440, -935031095, 
+       -344611594, -427906305, -245122844, -60246291, 
+       1739656202, 1790575107, 2108100632, 1890328081, 
+       1402811438, 1586903591, 1233856572, 1149249077, 
+       266959938, 48394827, 369057872, 418672217, 
+       1002783846, 919489135, 567498868, 752375421, 
+       209336225, 24197544, 376187827, 459744698, 
+       945164165, 895287692, 574624663, 793451934, 
+       1679968233, 1764313568, 2117360635, 1933530610, 
+       1343127501, 1560637892, 1243112415, 1192455638, 
+       -590686415, -775825096, -958608605, -875051734, 
+       -387518699, -437395172, -219090169, -262898, 
+       -1265457287, -1181111952, -1367032981, -1550863006, 
+       -2134991011, -1917480620, -1700232369, -1750889146
+};
+
+const int AES::sm_U4[256] =
+{
+       0, 151849742, 303699484, 454499602, 
+       607398968, 758720310, 908999204, 1059270954, 
+       1214797936, 1097159550, 1517440620, 1400849762, 
+       1817998408, 1699839814, 2118541908, 2001430874, 
+       -1865371424, -1713521682, -2100648196, -1949848078, 
+       -1260086056, -1108764714, -1493267772, -1342996022, 
+       -658970480, -776608866, -895287668, -1011878526, 
+       -57883480, -176042074, -292105548, -409216582, 
+       1002142683, 850817237, 698445255, 548169417, 
+       529487843, 377642221, 227885567, 77089521, 
+       1943217067, 2061379749, 1640576439, 1757691577, 
+       1474760595, 1592394909, 1174215055, 1290801793, 
+       -1418998981, -1570324427, -1183720153, -1333995991, 
+       -1889540349, -2041385971, -1656360673, -1807156719, 
+       -486304949, -368142267, -249985705, -132870567, 
+       -952647821, -835013507, -718427793, -601841055, 
+       1986918061, 2137062819, 1685577905, 1836772287, 
+       1381620373, 1532285339, 1078185097, 1229899655, 
+       1040559837, 923313619, 740276417, 621982671, 
+       439452389, 322734571, 137073913, 19308535, 
+       -423803315, -273658557, -190361519, -39167137, 
+       -1031181707, -880516741, -795640727, -643926169, 
+       -1361764803, -1479011021, -1127282655, -1245576401, 
+       -1964953083, -2081670901, -1728371687, -1846137065, 
+       1305906550, 1155237496, 1607244650, 1455525988, 
+       1776460110, 1626319424, 2079897426, 1928707164, 
+       96392454, 213114376, 396673818, 514443284, 
+       562755902, 679998000, 865136418, 983426092, 
+       -586793578, -737462632, -820237430, -971956092, 
+       -114159186, -264299872, -349698126, -500888388, 
+       -1787927066, -1671205144, -2022411270, -1904641804, 
+       -1319482914, -1202240816, -1556062270, -1437772596, 
+       -321194175, -438830001, -20913827, -137500077, 
+       -923870343, -1042034569, -621490843, -738605461, 
+       -1531793615, -1379949505, -1230456531, -1079659997, 
+       -2138668279, -1987344377, -1835231979, -1684955621, 
+       2081048481, 1963412655, 1846563261, 1729977011, 
+       1480485785, 1362321559, 1243905413, 1126790795, 
+       878845905, 1030690015, 645401037, 796197571, 
+       274084841, 425408743, 38544885, 188821243, 
+       -681472870, -563312748, -981755258, -864644728, 
+       -212492126, -94852180, -514869570, -398279248, 
+       -1626745622, -1778065436, -1928084746, -2078357000, 
+       -1153566510, -1305414692, -1457000754, -1607801408, 
+       1202797690, 1320957812, 1437280870, 1554391400, 
+       1669664834, 1787304780, 1906247262, 2022837584, 
+       265905162, 114585348, 499347990, 349075736, 
+       736970802, 585122620, 972512814, 821712160, 
+       -1699282452, -1816524062, -2001922064, -2120213250, 
+       -1098699308, -1215420710, -1399243832, -1517014842, 
+       -757114468, -606973294, -1060810880, -909622130, 
+       -152341084, -1671510, -453942344, -302225226, 
+       174567692, 57326082, 410887952, 292596766, 
+       777231668, 660510266, 1011452712, 893681702, 
+       1108339068, 1258480242, 1343618912, 1494807662, 
+       1715193156, 1865862730, 1948373848, 2100090966, 
+       -1593017801, -1476300487, -1290376149, -1172609243, 
+       -2059905521, -1942659839, -1759363053, -1641067747, 
+       -379313593, -529979063, -75615141, -227328171, 
+       -850391425, -1000536719, -548792221, -699985043, 
+       836553431, 953270745, 600235211, 718002117, 
+       367585007, 484830689, 133361907, 251657213, 
+       2041877159, 1891211689, 1806599355, 1654886325, 
+       1568718495, 1418573201, 1335535747, 1184342925
+};
+
+const char AES::sm_rcon[30] =
+{
+       1, 2, 4, 8, 16, 32, 
+       64, -128, 27, 54, 108, -40, 
+       -85, 77, -102, 47, 94, -68, 
+       99, -58, -105, 53, 106, -44, 
+       -77, 125, -6, -17, -59, -111
+};
+
+const int AES::sm_shifts[3][4][2] =
+{
+       { {0, 0}, {1, 3}, {2, 2}, {3, 1} },
+       { {0, 0}, {1, 5}, {2, 4}, {3, 3} },
+       { {0, 0}, {1, 7}, {3, 5}, {4, 4} }
+};
+
+//Null chain
+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";
+
+//CONSTRUCTOR
+AES::AES() : m_bKeyInit(false)
+{
+}
+
+//DESTRUCTOR
+AES::~AES()
+{
+}
+
+//Expand a user-supplied key material into a session key.
+// key        - The 128/192/256-bit user-key to use.
+// chain      - initial chain block for CBC and CFB modes.
+// keylength  - 16, 24 or 32 bytes
+// blockSize  - The block size in bytes of this Rijndael (16, 24 or 32 bytes).
+void AES::MakeKey(char const* key, char const* chain, int keylength, int blockSize)
+{
+       if (NULL == key)
+               return;
+       if (!(keylength == 16 || keylength == 24 || keylength == 32))
+               return;
+       if (!(blockSize == 16 || blockSize == 24 || blockSize == 32))
+               return;
+       m_keylength = keylength;
+       m_blockSize = blockSize;
+       //Initialize the chain
+       memcpy(m_chain0, chain, m_blockSize);
+       memcpy(m_chain, chain, m_blockSize);
+       //Calculate Number of Rounds
+       switch (m_keylength)
+       {
+               case 16:
+                       m_iROUNDS = (m_blockSize == 16) ? 10 : (m_blockSize == 24 ? 12 : 14);
+                       break;
+
+               case 24:
+                       m_iROUNDS = (m_blockSize != 32) ? 12 : 14;
+                       break;
+
+               default: // 32 bytes = 256 bits
+                       m_iROUNDS = 14;
+       }
+       int BC = m_blockSize / 4;
+       int i, j;
+       for (i=0; i<=m_iROUNDS; i++)
+       {
+               for (j=0; j<BC; j++)
+                       m_Ke[i][j] = 0;
+       }
+       for (i=0; i<=m_iROUNDS; i++)
+       {
+               for (j=0; j<BC; j++)
+                       m_Kd[i][j] = 0;
+       }
+       int ROUND_KEY_COUNT = (m_iROUNDS + 1) * BC;
+       int KC = m_keylength/4;
+       //Copy user material bytes into temporary ints
+       int* pi = tk;
+       char const* pc = key;
+       for (i=0; i<KC; i++)
+       {
+               *pi = (unsigned char)*(pc++) << 24;
+               *pi |= (unsigned char)*(pc++) << 16;
+               *pi |= (unsigned char)*(pc++) << 8;
+               *(pi++) |= (unsigned char)*(pc++);
+       }
+       //Copy values into round key arrays
+       int t = 0;
+       for (j=0; (j<KC)&&(t<ROUND_KEY_COUNT); j++,t++)
+       {
+               m_Ke[t/BC][t%BC] = tk[j];
+               m_Kd[m_iROUNDS - (t/BC)][t%BC] = tk[j];
+       }
+       int tt, rconpointer = 0;
+       while (t < ROUND_KEY_COUNT)
+       {
+               //Extrapolate using phi (the round key evolution function)
+               tt = tk[KC-1];
+               tk[0] ^= (sm_S[(tt >> 16) & 0xFF] & 0xFF) << 24 ^
+                       (sm_S[(tt >>  8) & 0xFF] & 0xFF) << 16 ^
+                       (sm_S[ tt & 0xFF] & 0xFF) <<  8 ^
+                       (sm_S[(tt >> 24) & 0xFF] & 0xFF) ^
+                       (sm_rcon[rconpointer++]  & 0xFF) << 24;
+               if (KC != 8)
+                       for (i=1, j=0; i<KC;)
+                               tk[i++] ^= tk[j++];
+               else
+               {
+                       for (i=1, j=0; i<KC/2; )
+                               tk[i++] ^= tk[j++];
+                       tt = tk[KC/2-1];
+                       tk[KC/2] ^= (sm_S[ tt & 0xFF] & 0xFF) ^
+                               (sm_S[(tt >>  8) & 0xFF] & 0xFF) <<  8 ^
+                               (sm_S[(tt >> 16) & 0xFF] & 0xFF) << 16 ^
+                               (sm_S[(tt >> 24) & 0xFF] & 0xFF) << 24;
+                       for (j = KC/2, i=j+1; i<KC; )
+                               tk[i++] ^= tk[j++];
+               }
+               //Copy values into round key arrays
+               for (j=0; (j<KC) && (t<ROUND_KEY_COUNT); j++, t++)
+               {
+                       m_Ke[t/BC][t%BC] = tk[j];
+                       m_Kd[m_iROUNDS - (t/BC)][t%BC] = tk[j];
+               }
+       }
+       //Inverse MixColumn where needed
+       for (int r=1; r<m_iROUNDS; r++)
+               for (j=0; j<BC; j++)
+               {
+                       tt = m_Kd[r][j];
+                       m_Kd[r][j] = sm_U1[(tt >> 24) & 0xFF] ^
+                               sm_U2[(tt >> 16) & 0xFF] ^
+                               sm_U3[(tt >>  8) & 0xFF] ^
+                               sm_U4[tt & 0xFF];
+               }
+       m_bKeyInit = true;
+}
+
+//Convenience method to encrypt exactly one block of plaintext, assuming
+//Rijndael's default block size (128-bit).
+// in         - The plaintext
+// result     - The ciphertext generated from a plaintext using the key
+void AES::DefEncryptBlock(char const* in, char* result)
+{
+       if (m_bKeyInit == false)
+               return;
+       int* Ker = m_Ke[0];
+       int t0 = ((unsigned char)*(in++) << 24);
+       t0 |= ((unsigned char)*(in++) << 16);
+       t0 |= ((unsigned char)*(in++) << 8);
+       (t0 |= (unsigned char)*(in++)) ^= Ker[0];
+       int t1 = ((unsigned char)*(in++) << 24);
+       t1 |= ((unsigned char)*(in++) << 16);
+       t1 |= ((unsigned char)*(in++) << 8);
+       (t1 |= (unsigned char)*(in++)) ^= Ker[1];
+       int t2 = ((unsigned char)*(in++) << 24);
+       t2 |= ((unsigned char)*(in++) << 16);
+       t2 |= ((unsigned char)*(in++) << 8);
+       (t2 |= (unsigned char)*(in++)) ^= Ker[2];
+       int t3 = ((unsigned char)*(in++) << 24);
+       t3 |= ((unsigned char)*(in++) << 16);
+       t3 |= ((unsigned char)*(in++) << 8);
+       (t3 |= (unsigned char)*(in++)) ^= Ker[3];
+       int a0, a1, a2, a3;
+       //Apply Round Transforms
+       for (int r = 1; r < m_iROUNDS; r++)
+       {
+               Ker = m_Ke[r];
+               a0 = (sm_T1[(t0 >> 24) & 0xFF] ^
+                       sm_T2[(t1 >> 16) & 0xFF] ^
+                       sm_T3[(t2 >>  8) & 0xFF] ^
+                       sm_T4[t3 & 0xFF]) ^ Ker[0];
+               a1 = (sm_T1[(t1 >> 24) & 0xFF] ^
+                       sm_T2[(t2 >> 16) & 0xFF] ^
+                       sm_T3[(t3 >>  8) & 0xFF] ^
+                       sm_T4[t0 & 0xFF]) ^ Ker[1];
+               a2 = (sm_T1[(t2 >> 24) & 0xFF] ^
+                       sm_T2[(t3 >> 16) & 0xFF] ^
+                       sm_T3[(t0 >>  8) & 0xFF] ^
+                       sm_T4[t1 & 0xFF]) ^ Ker[2];
+               a3 = (sm_T1[(t3 >> 24) & 0xFF] ^
+                       sm_T2[(t0 >> 16) & 0xFF] ^
+                       sm_T3[(t1 >>  8) & 0xFF] ^
+                       sm_T4[t2 & 0xFF]) ^ Ker[3];
+               t0 = a0;
+               t1 = a1;
+               t2 = a2;
+               t3 = a3;
+       }
+       //Last Round is special
+       Ker = m_Ke[m_iROUNDS];
+       int tt = Ker[0];
+       result[0] = sm_S[(t0 >> 24) & 0xFF] ^ (tt >> 24);
+       result[1] = sm_S[(t1 >> 16) & 0xFF] ^ (tt >> 16);
+       result[2] = sm_S[(t2 >>  8) & 0xFF] ^ (tt >>  8);
+       result[3] = sm_S[t3 & 0xFF] ^ tt;
+       tt = Ker[1];
+       result[4] = sm_S[(t1 >> 24) & 0xFF] ^ (tt >> 24);
+       result[5] = sm_S[(t2 >> 16) & 0xFF] ^ (tt >> 16);
+       result[6] = sm_S[(t3 >>  8) & 0xFF] ^ (tt >>  8);
+       result[7] = sm_S[t0 & 0xFF] ^ tt;
+       tt = Ker[2];
+       result[8] = sm_S[(t2 >> 24) & 0xFF] ^ (tt >> 24);
+       result[9] = sm_S[(t3 >> 16) & 0xFF] ^ (tt >> 16);
+       result[10] = sm_S[(t0 >>  8) & 0xFF] ^ (tt >>  8);
+       result[11] = sm_S[t1 & 0xFF] ^ tt;
+       tt = Ker[3];
+       result[12] = sm_S[(t3 >> 24) & 0xFF] ^ (tt >> 24);
+       result[13] = sm_S[(t0 >> 16) & 0xFF] ^ (tt >> 16);
+       result[14] = sm_S[(t1 >>  8) & 0xFF] ^ (tt >>  8);
+       result[15] = sm_S[t2 & 0xFF] ^ tt;
+}
+
+//Convenience method to decrypt exactly one block of plaintext, assuming
+//Rijndael's default block size (128-bit).
+// in         - The ciphertext.
+// result     - The plaintext generated from a ciphertext using the session key.
+void AES::DefDecryptBlock(char const* in, char* result)
+{
+       if (m_bKeyInit == false)
+               return;
+       int* Kdr = m_Kd[0];
+       int t0 = ((unsigned char)*(in++) << 24);
+       t0 = t0 | ((unsigned char)*(in++) << 16);
+       t0 |= ((unsigned char)*(in++) << 8);
+       (t0 |= (unsigned char)*(in++)) ^= Kdr[0];
+       int t1 = ((unsigned char)*(in++) << 24);
+       t1 |= ((unsigned char)*(in++) << 16);
+       t1 |= ((unsigned char)*(in++) << 8);
+       (t1 |= (unsigned char)*(in++)) ^= Kdr[1];
+       int t2 = ((unsigned char)*(in++) << 24);
+       t2 |= ((unsigned char)*(in++) << 16);
+       t2 |= ((unsigned char)*(in++) << 8);
+       (t2 |= (unsigned char)*(in++)) ^= Kdr[2];
+       int t3 = ((unsigned char)*(in++) << 24);
+       t3 |= ((unsigned char)*(in++) << 16);
+       t3 |= ((unsigned char)*(in++) << 8);
+       (t3 |= (unsigned char)*(in++)) ^= Kdr[3];
+       int a0, a1, a2, a3;
+       for (int r = 1; r < m_iROUNDS; r++) // apply round transforms
+       {
+               Kdr = m_Kd[r];
+               a0 = (sm_T5[(t0 >> 24) & 0xFF] ^
+                       sm_T6[(t3 >> 16) & 0xFF] ^
+                       sm_T7[(t2 >>  8) & 0xFF] ^
+                       sm_T8[ t1        & 0xFF] ) ^ Kdr[0];
+               a1 = (sm_T5[(t1 >> 24) & 0xFF] ^
+                       sm_T6[(t0 >> 16) & 0xFF] ^
+                       sm_T7[(t3 >>  8) & 0xFF] ^
+                       sm_T8[ t2        & 0xFF] ) ^ Kdr[1];
+               a2 = (sm_T5[(t2 >> 24) & 0xFF] ^
+                       sm_T6[(t1 >> 16) & 0xFF] ^
+                       sm_T7[(t0 >>  8) & 0xFF] ^
+                       sm_T8[ t3        & 0xFF] ) ^ Kdr[2];
+               a3 = (sm_T5[(t3 >> 24) & 0xFF] ^
+                       sm_T6[(t2 >> 16) & 0xFF] ^
+                       sm_T7[(t1 >>  8) & 0xFF] ^
+                       sm_T8[ t0        & 0xFF] ) ^ Kdr[3];
+               t0 = a0;
+               t1 = a1;
+               t2 = a2;
+               t3 = a3;
+       }
+       //Last Round is special
+       Kdr = m_Kd[m_iROUNDS];
+       int tt = Kdr[0];
+       result[ 0] = sm_Si[(t0 >> 24) & 0xFF] ^ (tt >> 24);
+       result[ 1] = sm_Si[(t3 >> 16) & 0xFF] ^ (tt >> 16);
+       result[ 2] = sm_Si[(t2 >>  8) & 0xFF] ^ (tt >>  8);
+       result[ 3] = sm_Si[ t1 & 0xFF] ^ tt;
+       tt = Kdr[1];
+       result[ 4] = sm_Si[(t1 >> 24) & 0xFF] ^ (tt >> 24);
+       result[ 5] = sm_Si[(t0 >> 16) & 0xFF] ^ (tt >> 16);
+       result[ 6] = sm_Si[(t3 >>  8) & 0xFF] ^ (tt >>  8);
+       result[ 7] = sm_Si[ t2 & 0xFF] ^ tt;
+       tt = Kdr[2];
+       result[ 8] = sm_Si[(t2 >> 24) & 0xFF] ^ (tt >> 24);
+       result[ 9] = sm_Si[(t1 >> 16) & 0xFF] ^ (tt >> 16);
+       result[10] = sm_Si[(t0 >>  8) & 0xFF] ^ (tt >>  8);
+       result[11] = sm_Si[ t3 & 0xFF] ^ tt;
+       tt = Kdr[3];
+       result[12] = sm_Si[(t3 >> 24) & 0xFF] ^ (tt >> 24);
+       result[13] = sm_Si[(t2 >> 16) & 0xFF] ^ (tt >> 16);
+       result[14] = sm_Si[(t1 >>  8) & 0xFF] ^ (tt >>  8);
+       result[15] = sm_Si[ t0 & 0xFF] ^ tt;
+}
+
+//Encrypt exactly one block of plaintext.
+// in           - The plaintext.
+// result       - The ciphertext generated from a plaintext using the key.
+void AES::EncryptBlock(char const* in, char* result)
+{
+       if (m_bKeyInit == false)
+               return;
+       if (DEFAULT_BLOCK_SIZE == m_blockSize)
+       {
+               DefEncryptBlock(in, result);
+               return;
+       }
+       int BC = m_blockSize / 4;
+       int SC = (BC == 4) ? 0 : (BC == 6 ? 1 : 2);
+       int s1 = sm_shifts[SC][1][0];
+       int s2 = sm_shifts[SC][2][0];
+       int s3 = sm_shifts[SC][3][0];
+       //Temporary Work Arrays
+       int i;
+       int tt;
+       int* pi = t;
+       for (i=0; i<BC; i++)
+       {
+               *pi = ((unsigned char)*(in++) << 24);
+               *pi |= ((unsigned char)*(in++) << 16);
+               *pi |= ((unsigned char)*(in++) << 8);
+               (*(pi++) |= (unsigned char)*(in++)) ^= m_Ke[0][i];
+       }
+       //Apply Round Transforms
+       for (int r=1; r<m_iROUNDS; r++)
+       {
+               for (i=0; i<BC; i++)
+                       a[i] = (sm_T1[(t[i] >> 24) & 0xFF] ^
+                               sm_T2[(t[(i + s1) % BC] >> 16) & 0xFF] ^
+                               sm_T3[(t[(i + s2) % BC] >>  8) & 0xFF] ^
+                               sm_T4[ t[(i + s3) % BC] & 0xFF] ) ^ m_Ke[r][i];
+               memcpy(t, a, 4*BC);
+       }
+       int j;
+       //Last Round is Special
+       for (i=0,j=0; i<BC; i++)
+       {
+               tt = m_Ke[m_iROUNDS][i];
+               result[j++] = sm_S[(t[i] >> 24) & 0xFF] ^ (tt >> 24);
+               result[j++] = sm_S[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16);
+               result[j++] = sm_S[(t[(i + s2) % BC] >>  8) & 0xFF] ^ (tt >>  8);
+               result[j++] = sm_S[ t[(i + s3) % BC] & 0xFF] ^ tt;
+       }
+}
+
+//Decrypt exactly one block of ciphertext.
+// in         - The ciphertext.
+// result     - The plaintext generated from a ciphertext using the session key.
+void AES::DecryptBlock(char const* in, char* result)
+{
+       if (m_bKeyInit == false)
+               return;
+       if (DEFAULT_BLOCK_SIZE == m_blockSize)
+       {
+               DefDecryptBlock(in, result);
+               return;
+       }
+       int BC = m_blockSize / 4;
+       int SC = BC == 4 ? 0 : (BC == 6 ? 1 : 2);
+       int s1 = sm_shifts[SC][1][1];
+       int s2 = sm_shifts[SC][2][1];
+       int s3 = sm_shifts[SC][3][1];
+       //Temporary Work Arrays
+       int i;
+       int tt;
+       int* pi = t;
+       for (i=0; i<BC; i++)
+       {
+               *pi = ((unsigned char)*(in++) << 24);
+               *pi |= ((unsigned char)*(in++) << 16);
+               *pi |= ((unsigned char)*(in++) << 8);
+               (*(pi++) |= (unsigned char)*(in++)) ^= m_Kd[0][i];
+       }
+       //Apply Round Transforms
+       for (int r=1; r<m_iROUNDS; r++)
+       {
+               for (i=0; i<BC; i++)
+                       a[i] = (sm_T5[(t[i] >> 24) & 0xFF] ^
+                               sm_T6[(t[(i + s1) % BC] >> 16) & 0xFF] ^
+                               sm_T7[(t[(i + s2) % BC] >>  8) & 0xFF] ^
+                               sm_T8[ t[(i + s3) % BC] & 0xFF]) ^ m_Kd[r][i];
+               memcpy(t, a, 4*BC);
+       }
+       int j;
+       //Last Round is Special
+       for (i=0,j=0; i<BC; i++)
+       {
+               tt = m_Kd[m_iROUNDS][i];
+               result[j++] = sm_Si[(t[i] >> 24) & 0xFF] ^ (tt >> 24);
+               result[j++] = sm_Si[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16);
+               result[j++] = sm_Si[(t[(i + s2) % BC] >>  8) & 0xFF] ^ (tt >>  8);
+               result[j++] = sm_Si[ t[(i + s3) % BC] & 0xFF] ^ tt;
+       }
+}
+
+void AES::Encrypt(char const* in, char* result, size_t n, int iMode)
+{
+       if (m_bKeyInit == false)
+               return;
+       //n should be > 0 and multiple of m_blockSize
+       if (n == 0 || n%m_blockSize!=0)
+               return;
+       unsigned int i;
+       char const* pin;
+       char* presult;
+       if (CBC == iMode) //CBC mode, using the Chain
+       {
+               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
+               {
+                       Xor(m_chain, pin);
+                       EncryptBlock(m_chain, presult);
+                       memcpy(m_chain, presult, m_blockSize);
+                       pin += m_blockSize;
+                       presult += m_blockSize;
+               }
+       }
+       else if (CFB == iMode) //CFB mode, using the Chain
+       {
+               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
+               {
+                       EncryptBlock(m_chain, presult);
+                       Xor(presult, pin);
+                       memcpy(m_chain, presult, m_blockSize);
+                       pin += m_blockSize;
+                       presult += m_blockSize;
+               }
+       }
+       else //ECB mode, not using the Chain
+       {
+               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
+               {
+                       EncryptBlock(pin, presult);
+                       pin += m_blockSize;
+                       presult += m_blockSize;
+               }
+       }
+}
+
+void AES::Decrypt(char const* in, char* result, size_t n, int iMode)
+{
+       if (m_bKeyInit == false)
+               return;
+       //n should be > 0 and multiple of m_blockSize
+       if (n == 0 || n%m_blockSize!=0)
+               return;
+       unsigned int i;
+       char const* pin;
+       char* presult;
+       if (CBC == iMode) //CBC mode, using the Chain
+       {
+               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
+               {
+                       DecryptBlock(pin, presult);
+                       Xor(presult, m_chain);
+                       memcpy(m_chain, pin, m_blockSize);                              
+                       pin += m_blockSize;
+                       presult += m_blockSize;
+               }
+       }
+       else if (CFB == iMode) //CFB mode, using the Chain, not using Decrypt()
+       {
+               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
+               {
+                       EncryptBlock(m_chain, presult);
+                       //memcpy(presult, pin, m_blockSize);
+                       Xor(presult, pin);
+                       memcpy(m_chain, pin, m_blockSize);
+                       pin += m_blockSize;
+                       presult += m_blockSize;
+               }
+       }
+       else //ECB mode, not using the Chain
+       {
+               for (i=0,pin=in,presult=result; i<n/m_blockSize; i++)
+               {
+                       DecryptBlock(pin, presult);
+                       pin += m_blockSize;
+                       presult += m_blockSize;
+               }
+       }
+}
+
+
+
+static const char base64digits[] =
+   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+#define BAD    -1
+static const char base64val[] = {
+    BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
+    BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
+    BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63,
+     52, 53, 54, 55,  56, 57, 58, 59,  60, 61,BAD,BAD, BAD,BAD,BAD,BAD,
+    BAD,  0,  1,  2,   3,  4,  5,  6,   7,  8,  9, 10,  11, 12, 13, 14,
+     15, 16, 17, 18,  19, 20, 21, 22,  23, 24, 25,BAD, BAD,BAD,BAD,BAD,
+    BAD, 26, 27, 28,  29, 30, 31, 32,  33, 34, 35, 36,  37, 38, 39, 40,
+     41, 42, 43, 44,  45, 46, 47, 48,  49, 50, 51,BAD, BAD,BAD,BAD,BAD
+};
+#define DECODE64(c)  (isascii(c) ? base64val[c] : BAD)
+
+void to64frombits(unsigned char *out, const unsigned char *in, int inlen)
+/* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */
+{
+    for (; inlen >= 3; inlen -= 3)
+    {
+       *out++ = base64digits[in[0] >> 2];
+       *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)];
+       *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
+       *out++ = base64digits[in[2] & 0x3f];
+       in += 3;
+    }
+    if (inlen > 0)
+    {
+       unsigned char fragment;
+    
+       *out++ = base64digits[in[0] >> 2];
+       fragment = (in[0] << 4) & 0x30;
+       if (inlen > 1)
+           fragment |= in[1] >> 4;
+       *out++ = base64digits[fragment];
+       *out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c];
+       *out++ = '=';
+    }
+    *out = '\0';
+}
+
+int from64tobits(char *out, const char *in, int maxlen)
+/* base 64 to raw bytes in quasi-big-endian order, returning count of bytes */
+/* maxlen limits output buffer size, set to zero to ignore */
+{
+    int len = 0;
+    register unsigned char digit1, digit2, digit3, digit4;
+
+    if (in[0] == '+' && in[1] == ' ')
+       in += 2;
+    if (*in == '\r')
+       return(0);
+
+    do {
+       digit1 = in[0];
+       if (DECODE64(digit1) == BAD)
+           return(-1);
+       digit2 = in[1];
+       if (DECODE64(digit2) == BAD)
+           return(-1);
+       digit3 = in[2];
+       if (digit3 != '=' && DECODE64(digit3) == BAD)
+           return(-1); 
+       digit4 = in[3];
+       if (digit4 != '=' && DECODE64(digit4) == BAD)
+           return(-1);
+       in += 4;
+       ++len;
+       if (maxlen && len > maxlen)
+           return(-1);
+       *out++ = (DECODE64(digit1) << 2) | (DECODE64(digit2) >> 4);
+       if (digit3 != '=')
+       {
+           ++len;
+           if (maxlen && len > maxlen)
+               return(-1);
+           *out++ = ((DECODE64(digit2) << 4) & 0xf0) | (DECODE64(digit3) >> 2);
+           if (digit4 != '=')
+           {
+               ++len;
+               if (maxlen && len > maxlen)
+                   return(-1);
+               *out++ = ((DECODE64(digit3) << 6) & 0xc0) | DECODE64(digit4);
+           }
+       }
+    } while 
+       (*in && *in != '\r' && digit4 != '=');
+
+    return (len);
+}
index 33c4813916ea63b1b6899e6cedf6214e19998139..55313eb053934eba03f7b31af9ab0f502ac785e0 100644 (file)
@@ -41,6 +41,7 @@ using namespace std;
 #include "xline.h"
 #include "typedefs.h"
 #include "cull_list.h"
+#include "aes.h"
 
 #ifdef GCC3
 #define nspace __gnu_cxx
@@ -439,6 +440,7 @@ class Link
         std::string RecvPass;
         unsigned long AutoConnect;
         time_t NextConnectTime;
+        std::string EncryptionKey;
 };
 
 /* The usual stuff for inspircd modules,
@@ -536,6 +538,7 @@ class TreeSocket : public InspSocket
        time_t NextPing;
        bool LastPingWasGood;
        bool bursting;
+       AES* ctx;
        
  public:
 
@@ -551,21 +554,41 @@ class TreeSocket : public InspSocket
                this->LinkState = LISTENER;
        }
 
-       TreeSocket(std::string host, int port, bool listening, unsigned long maxtime, std::string ServerName)
+       TreeSocket(std::string host, int port, bool listening, unsigned long maxtime, std::string ServerName, std::string encryptionkey)
                : InspSocket(host, port, listening, maxtime)
        {
                myhost = ServerName;
                this->LinkState = CONNECTING;
+               InitAES(encryptionkey);
        }
 
        /* When a listening socket gives us a new file descriptor,
         * we must associate it with a socket without creating a new
         * connection. This constructor is used for this purpose.
         */
-       TreeSocket(int newfd, char* ip)
+       TreeSocket(int newfd, char* ip, std::string encryptionkey)
                : InspSocket(newfd, ip)
        {
                this->LinkState = WAIT_AUTH_1;
+               InitAES(encryptionkey);
+       }
+
+       void InitAES(std::string key)
+       {
+               if (key == "")
+                       return;
+
+               ctx = new AES();
+               // key must be 16, 24, 32 etc bytes (multiple of 8)
+               unsigned int keylength = key.length();
+               if (!(keylength == 16 || keylength == 24 || keylength == 32))
+               {
+               }
+               else
+               {
+                       ctx->MakeKey(key.c_str(), "\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
+                               \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", keylength, keylength);
+               }
        }
        
        /* When an outbound connection finishes connecting, we receive
@@ -1137,6 +1160,15 @@ class TreeSocket : public InspSocket
                                /* Process this one, abort if it
                                 * didnt return true.
                                 */
+                               if (this->ctx)
+                               {
+                                       char out[1024];
+                                       char result[1024];
+                                       int nbytes = from64tobits(out, ret.c_str(), 1024);
+                                       log(DEBUG,"m_spanningtree: decrypt %d bytes",nbytes);
+                                       ctx->Decrypt(out, result, nbytes, AES::ECB);
+                                       ret = result;
+                               }
                                if (!this->ProcessLine(ret))
                                {
                                        return false;
@@ -1149,6 +1181,21 @@ class TreeSocket : public InspSocket
        int WriteLine(std::string line)
        {
                log(DEBUG,"OUT: %s",line.c_str());
+               if (ctx)
+               {
+                       char* result[1024];
+                       char* result64[1024];
+                       while (line.length() % this->keylength != 0)
+                       {
+                               // pad it to be a multiple of the key length
+                               line = line + "\0";
+                       }
+                       ctx->Encrypt(line.c_str(), result, line.length(), AES::ECB);
+                       to64frombits(result64, result, line.length());
+                       line = result64;
+                       log(DEBUG,"Encrypted: %s",line.c_str());
+                       //int from64tobits(char *out, const char *in, int maxlen);
+               }
                return this->Write(line + "\r\n");
        }
 
@@ -2138,6 +2185,7 @@ void ReadConfiguration(bool rebind)
                L.SendPass = Conf->ReadValue("link","sendpass",j);
                L.RecvPass = Conf->ReadValue("link","recvpass",j);
                L.AutoConnect = Conf->ReadInteger("link","autoconnect",j,true);
+               L.EncryptionKey =  Conf->ReadValue("link","encryptionkey",j);
                L.NextConnectTime = time(NULL) + L.AutoConnect;
                /* Bugfix by brain, do not allow people to enter bad configurations */
                if ((L.RecvPass != "") && (L.SendPass != "") && (L.Name != "") && (L.Port))