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