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