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