xref: /netbsd-src/external/bsd/elftosb/dist/common/rijndael.cpp (revision 993229b6fea628ff8b1fa09146c80b0cfb2768eb)
1*993229b6Sjkunz //
2*993229b6Sjkunz // File : rijndael.cpp
3*993229b6Sjkunz // Creation date : Sun Nov 5 2000 03:22:10 CEST
4*993229b6Sjkunz // Author : Szymon Stefanek (stefanek@tin.it)
5*993229b6Sjkunz //
6*993229b6Sjkunz // Another implementation of the Rijndael cipher.
7*993229b6Sjkunz // This is intended to be an easily usable library file.
8*993229b6Sjkunz // This code is public domain.
9*993229b6Sjkunz // Based on the Vincent Rijmen and K.U.Leuven implementation 2.4.
10*993229b6Sjkunz //
11*993229b6Sjkunz 
12*993229b6Sjkunz //
13*993229b6Sjkunz // Original Copyright notice:
14*993229b6Sjkunz //
15*993229b6Sjkunz //    rijndael-alg-fst.c   v2.4   April '2000
16*993229b6Sjkunz //    rijndael-alg-fst.h
17*993229b6Sjkunz //    rijndael-api-fst.c
18*993229b6Sjkunz //    rijndael-api-fst.h
19*993229b6Sjkunz //
20*993229b6Sjkunz //    Optimised ANSI C code
21*993229b6Sjkunz //
22*993229b6Sjkunz //    authors: v1.0: Antoon Bosselaers
23*993229b6Sjkunz //             v2.0: Vincent Rijmen, K.U.Leuven
24*993229b6Sjkunz //             v2.3: Paulo Barreto
25*993229b6Sjkunz //             v2.4: Vincent Rijmen, K.U.Leuven
26*993229b6Sjkunz //
27*993229b6Sjkunz //    This code is placed in the public domain.
28*993229b6Sjkunz //
29*993229b6Sjkunz 
30*993229b6Sjkunz //
31*993229b6Sjkunz // This implementation works on 128 , 192 , 256 bit keys
32*993229b6Sjkunz // and on 128 bit blocks
33*993229b6Sjkunz //
34*993229b6Sjkunz 
35*993229b6Sjkunz #define _RIJNDAEL_CPP_
36*993229b6Sjkunz 
37*993229b6Sjkunz #include "rijndael.h"
38*993229b6Sjkunz 
39*993229b6Sjkunz #include <stdio.h>
40*993229b6Sjkunz #include <stdlib.h>
41*993229b6Sjkunz #include <string.h>
42*993229b6Sjkunz 
43*993229b6Sjkunz 
44*993229b6Sjkunz static uint8_t S[256]=
45*993229b6Sjkunz {
46*993229b6Sjkunz 	 99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254, 215, 171, 118,
47*993229b6Sjkunz 	202, 130, 201, 125, 250,  89,  71, 240, 173, 212, 162, 175, 156, 164, 114, 192,
48*993229b6Sjkunz 	183, 253, 147,  38,  54,  63, 247, 204,  52, 165, 229, 241, 113, 216,  49,  21,
49*993229b6Sjkunz 	  4, 199,  35, 195,  24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,
50*993229b6Sjkunz 	  9, 131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,  47, 132,
51*993229b6Sjkunz 	 83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,  57,  74,  76,  88, 207,
52*993229b6Sjkunz 	208, 239, 170, 251,  67,  77,  51, 133,  69, 249,   2, 127,  80,  60, 159, 168,
53*993229b6Sjkunz 	 81, 163,  64, 143, 146, 157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210,
54*993229b6Sjkunz 	205,  12,  19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25, 115,
55*993229b6Sjkunz 	 96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20, 222,  94,  11, 219,
56*993229b6Sjkunz 	224,  50,  58,  10,  73,   6,  36,  92, 194, 211, 172,  98, 145, 149, 228, 121,
57*993229b6Sjkunz 	231, 200,  55, 109, 141, 213,  78, 169, 108,  86, 244, 234, 101, 122, 174,   8,
58*993229b6Sjkunz 	186, 120,  37,  46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,
59*993229b6Sjkunz 	112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134, 193,  29, 158,
60*993229b6Sjkunz 	225, 248, 152,  17, 105, 217, 142, 148, 155,  30, 135, 233, 206,  85,  40, 223,
61*993229b6Sjkunz 	140, 161, 137,  13, 191, 230,  66, 104,  65, 153,  45,  15, 176,  84, 187,  22
62*993229b6Sjkunz };
63*993229b6Sjkunz 
64*993229b6Sjkunz 
65*993229b6Sjkunz static uint8_t T1[256][4]=
66*993229b6Sjkunz {
67*993229b6Sjkunz 	0xc6,0x63,0x63,0xa5, 0xf8,0x7c,0x7c,0x84, 0xee,0x77,0x77,0x99, 0xf6,0x7b,0x7b,0x8d,
68*993229b6Sjkunz 	0xff,0xf2,0xf2,0x0d, 0xd6,0x6b,0x6b,0xbd, 0xde,0x6f,0x6f,0xb1, 0x91,0xc5,0xc5,0x54,
69*993229b6Sjkunz 	0x60,0x30,0x30,0x50, 0x02,0x01,0x01,0x03, 0xce,0x67,0x67,0xa9, 0x56,0x2b,0x2b,0x7d,
70*993229b6Sjkunz 	0xe7,0xfe,0xfe,0x19, 0xb5,0xd7,0xd7,0x62, 0x4d,0xab,0xab,0xe6, 0xec,0x76,0x76,0x9a,
71*993229b6Sjkunz 	0x8f,0xca,0xca,0x45, 0x1f,0x82,0x82,0x9d, 0x89,0xc9,0xc9,0x40, 0xfa,0x7d,0x7d,0x87,
72*993229b6Sjkunz 	0xef,0xfa,0xfa,0x15, 0xb2,0x59,0x59,0xeb, 0x8e,0x47,0x47,0xc9, 0xfb,0xf0,0xf0,0x0b,
73*993229b6Sjkunz 	0x41,0xad,0xad,0xec, 0xb3,0xd4,0xd4,0x67, 0x5f,0xa2,0xa2,0xfd, 0x45,0xaf,0xaf,0xea,
74*993229b6Sjkunz 	0x23,0x9c,0x9c,0xbf, 0x53,0xa4,0xa4,0xf7, 0xe4,0x72,0x72,0x96, 0x9b,0xc0,0xc0,0x5b,
75*993229b6Sjkunz 	0x75,0xb7,0xb7,0xc2, 0xe1,0xfd,0xfd,0x1c, 0x3d,0x93,0x93,0xae, 0x4c,0x26,0x26,0x6a,
76*993229b6Sjkunz 	0x6c,0x36,0x36,0x5a, 0x7e,0x3f,0x3f,0x41, 0xf5,0xf7,0xf7,0x02, 0x83,0xcc,0xcc,0x4f,
77*993229b6Sjkunz 	0x68,0x34,0x34,0x5c, 0x51,0xa5,0xa5,0xf4, 0xd1,0xe5,0xe5,0x34, 0xf9,0xf1,0xf1,0x08,
78*993229b6Sjkunz 	0xe2,0x71,0x71,0x93, 0xab,0xd8,0xd8,0x73, 0x62,0x31,0x31,0x53, 0x2a,0x15,0x15,0x3f,
79*993229b6Sjkunz 	0x08,0x04,0x04,0x0c, 0x95,0xc7,0xc7,0x52, 0x46,0x23,0x23,0x65, 0x9d,0xc3,0xc3,0x5e,
80*993229b6Sjkunz 	0x30,0x18,0x18,0x28, 0x37,0x96,0x96,0xa1, 0x0a,0x05,0x05,0x0f, 0x2f,0x9a,0x9a,0xb5,
81*993229b6Sjkunz 	0x0e,0x07,0x07,0x09, 0x24,0x12,0x12,0x36, 0x1b,0x80,0x80,0x9b, 0xdf,0xe2,0xe2,0x3d,
82*993229b6Sjkunz 	0xcd,0xeb,0xeb,0x26, 0x4e,0x27,0x27,0x69, 0x7f,0xb2,0xb2,0xcd, 0xea,0x75,0x75,0x9f,
83*993229b6Sjkunz 	0x12,0x09,0x09,0x1b, 0x1d,0x83,0x83,0x9e, 0x58,0x2c,0x2c,0x74, 0x34,0x1a,0x1a,0x2e,
84*993229b6Sjkunz 	0x36,0x1b,0x1b,0x2d, 0xdc,0x6e,0x6e,0xb2, 0xb4,0x5a,0x5a,0xee, 0x5b,0xa0,0xa0,0xfb,
85*993229b6Sjkunz 	0xa4,0x52,0x52,0xf6, 0x76,0x3b,0x3b,0x4d, 0xb7,0xd6,0xd6,0x61, 0x7d,0xb3,0xb3,0xce,
86*993229b6Sjkunz 	0x52,0x29,0x29,0x7b, 0xdd,0xe3,0xe3,0x3e, 0x5e,0x2f,0x2f,0x71, 0x13,0x84,0x84,0x97,
87*993229b6Sjkunz 	0xa6,0x53,0x53,0xf5, 0xb9,0xd1,0xd1,0x68, 0x00,0x00,0x00,0x00, 0xc1,0xed,0xed,0x2c,
88*993229b6Sjkunz 	0x40,0x20,0x20,0x60, 0xe3,0xfc,0xfc,0x1f, 0x79,0xb1,0xb1,0xc8, 0xb6,0x5b,0x5b,0xed,
89*993229b6Sjkunz 	0xd4,0x6a,0x6a,0xbe, 0x8d,0xcb,0xcb,0x46, 0x67,0xbe,0xbe,0xd9, 0x72,0x39,0x39,0x4b,
90*993229b6Sjkunz 	0x94,0x4a,0x4a,0xde, 0x98,0x4c,0x4c,0xd4, 0xb0,0x58,0x58,0xe8, 0x85,0xcf,0xcf,0x4a,
91*993229b6Sjkunz 	0xbb,0xd0,0xd0,0x6b, 0xc5,0xef,0xef,0x2a, 0x4f,0xaa,0xaa,0xe5, 0xed,0xfb,0xfb,0x16,
92*993229b6Sjkunz 	0x86,0x43,0x43,0xc5, 0x9a,0x4d,0x4d,0xd7, 0x66,0x33,0x33,0x55, 0x11,0x85,0x85,0x94,
93*993229b6Sjkunz 	0x8a,0x45,0x45,0xcf, 0xe9,0xf9,0xf9,0x10, 0x04,0x02,0x02,0x06, 0xfe,0x7f,0x7f,0x81,
94*993229b6Sjkunz 	0xa0,0x50,0x50,0xf0, 0x78,0x3c,0x3c,0x44, 0x25,0x9f,0x9f,0xba, 0x4b,0xa8,0xa8,0xe3,
95*993229b6Sjkunz 	0xa2,0x51,0x51,0xf3, 0x5d,0xa3,0xa3,0xfe, 0x80,0x40,0x40,0xc0, 0x05,0x8f,0x8f,0x8a,
96*993229b6Sjkunz 	0x3f,0x92,0x92,0xad, 0x21,0x9d,0x9d,0xbc, 0x70,0x38,0x38,0x48, 0xf1,0xf5,0xf5,0x04,
97*993229b6Sjkunz 	0x63,0xbc,0xbc,0xdf, 0x77,0xb6,0xb6,0xc1, 0xaf,0xda,0xda,0x75, 0x42,0x21,0x21,0x63,
98*993229b6Sjkunz 	0x20,0x10,0x10,0x30, 0xe5,0xff,0xff,0x1a, 0xfd,0xf3,0xf3,0x0e, 0xbf,0xd2,0xd2,0x6d,
99*993229b6Sjkunz 	0x81,0xcd,0xcd,0x4c, 0x18,0x0c,0x0c,0x14, 0x26,0x13,0x13,0x35, 0xc3,0xec,0xec,0x2f,
100*993229b6Sjkunz 	0xbe,0x5f,0x5f,0xe1, 0x35,0x97,0x97,0xa2, 0x88,0x44,0x44,0xcc, 0x2e,0x17,0x17,0x39,
101*993229b6Sjkunz 	0x93,0xc4,0xc4,0x57, 0x55,0xa7,0xa7,0xf2, 0xfc,0x7e,0x7e,0x82, 0x7a,0x3d,0x3d,0x47,
102*993229b6Sjkunz 	0xc8,0x64,0x64,0xac, 0xba,0x5d,0x5d,0xe7, 0x32,0x19,0x19,0x2b, 0xe6,0x73,0x73,0x95,
103*993229b6Sjkunz 	0xc0,0x60,0x60,0xa0, 0x19,0x81,0x81,0x98, 0x9e,0x4f,0x4f,0xd1, 0xa3,0xdc,0xdc,0x7f,
104*993229b6Sjkunz 	0x44,0x22,0x22,0x66, 0x54,0x2a,0x2a,0x7e, 0x3b,0x90,0x90,0xab, 0x0b,0x88,0x88,0x83,
105*993229b6Sjkunz 	0x8c,0x46,0x46,0xca, 0xc7,0xee,0xee,0x29, 0x6b,0xb8,0xb8,0xd3, 0x28,0x14,0x14,0x3c,
106*993229b6Sjkunz 	0xa7,0xde,0xde,0x79, 0xbc,0x5e,0x5e,0xe2, 0x16,0x0b,0x0b,0x1d, 0xad,0xdb,0xdb,0x76,
107*993229b6Sjkunz 	0xdb,0xe0,0xe0,0x3b, 0x64,0x32,0x32,0x56, 0x74,0x3a,0x3a,0x4e, 0x14,0x0a,0x0a,0x1e,
108*993229b6Sjkunz 	0x92,0x49,0x49,0xdb, 0x0c,0x06,0x06,0x0a, 0x48,0x24,0x24,0x6c, 0xb8,0x5c,0x5c,0xe4,
109*993229b6Sjkunz 	0x9f,0xc2,0xc2,0x5d, 0xbd,0xd3,0xd3,0x6e, 0x43,0xac,0xac,0xef, 0xc4,0x62,0x62,0xa6,
110*993229b6Sjkunz 	0x39,0x91,0x91,0xa8, 0x31,0x95,0x95,0xa4, 0xd3,0xe4,0xe4,0x37, 0xf2,0x79,0x79,0x8b,
111*993229b6Sjkunz 	0xd5,0xe7,0xe7,0x32, 0x8b,0xc8,0xc8,0x43, 0x6e,0x37,0x37,0x59, 0xda,0x6d,0x6d,0xb7,
112*993229b6Sjkunz 	0x01,0x8d,0x8d,0x8c, 0xb1,0xd5,0xd5,0x64, 0x9c,0x4e,0x4e,0xd2, 0x49,0xa9,0xa9,0xe0,
113*993229b6Sjkunz 	0xd8,0x6c,0x6c,0xb4, 0xac,0x56,0x56,0xfa, 0xf3,0xf4,0xf4,0x07, 0xcf,0xea,0xea,0x25,
114*993229b6Sjkunz 	0xca,0x65,0x65,0xaf, 0xf4,0x7a,0x7a,0x8e, 0x47,0xae,0xae,0xe9, 0x10,0x08,0x08,0x18,
115*993229b6Sjkunz 	0x6f,0xba,0xba,0xd5, 0xf0,0x78,0x78,0x88, 0x4a,0x25,0x25,0x6f, 0x5c,0x2e,0x2e,0x72,
116*993229b6Sjkunz 	0x38,0x1c,0x1c,0x24, 0x57,0xa6,0xa6,0xf1, 0x73,0xb4,0xb4,0xc7, 0x97,0xc6,0xc6,0x51,
117*993229b6Sjkunz 	0xcb,0xe8,0xe8,0x23, 0xa1,0xdd,0xdd,0x7c, 0xe8,0x74,0x74,0x9c, 0x3e,0x1f,0x1f,0x21,
118*993229b6Sjkunz 	0x96,0x4b,0x4b,0xdd, 0x61,0xbd,0xbd,0xdc, 0x0d,0x8b,0x8b,0x86, 0x0f,0x8a,0x8a,0x85,
119*993229b6Sjkunz 	0xe0,0x70,0x70,0x90, 0x7c,0x3e,0x3e,0x42, 0x71,0xb5,0xb5,0xc4, 0xcc,0x66,0x66,0xaa,
120*993229b6Sjkunz 	0x90,0x48,0x48,0xd8, 0x06,0x03,0x03,0x05, 0xf7,0xf6,0xf6,0x01, 0x1c,0x0e,0x0e,0x12,
121*993229b6Sjkunz 	0xc2,0x61,0x61,0xa3, 0x6a,0x35,0x35,0x5f, 0xae,0x57,0x57,0xf9, 0x69,0xb9,0xb9,0xd0,
122*993229b6Sjkunz 	0x17,0x86,0x86,0x91, 0x99,0xc1,0xc1,0x58, 0x3a,0x1d,0x1d,0x27, 0x27,0x9e,0x9e,0xb9,
123*993229b6Sjkunz 	0xd9,0xe1,0xe1,0x38, 0xeb,0xf8,0xf8,0x13, 0x2b,0x98,0x98,0xb3, 0x22,0x11,0x11,0x33,
124*993229b6Sjkunz 	0xd2,0x69,0x69,0xbb, 0xa9,0xd9,0xd9,0x70, 0x07,0x8e,0x8e,0x89, 0x33,0x94,0x94,0xa7,
125*993229b6Sjkunz 	0x2d,0x9b,0x9b,0xb6, 0x3c,0x1e,0x1e,0x22, 0x15,0x87,0x87,0x92, 0xc9,0xe9,0xe9,0x20,
126*993229b6Sjkunz 	0x87,0xce,0xce,0x49, 0xaa,0x55,0x55,0xff, 0x50,0x28,0x28,0x78, 0xa5,0xdf,0xdf,0x7a,
127*993229b6Sjkunz 	0x03,0x8c,0x8c,0x8f, 0x59,0xa1,0xa1,0xf8, 0x09,0x89,0x89,0x80, 0x1a,0x0d,0x0d,0x17,
128*993229b6Sjkunz 	0x65,0xbf,0xbf,0xda, 0xd7,0xe6,0xe6,0x31, 0x84,0x42,0x42,0xc6, 0xd0,0x68,0x68,0xb8,
129*993229b6Sjkunz 	0x82,0x41,0x41,0xc3, 0x29,0x99,0x99,0xb0, 0x5a,0x2d,0x2d,0x77, 0x1e,0x0f,0x0f,0x11,
130*993229b6Sjkunz 	0x7b,0xb0,0xb0,0xcb, 0xa8,0x54,0x54,0xfc, 0x6d,0xbb,0xbb,0xd6, 0x2c,0x16,0x16,0x3a
131*993229b6Sjkunz };
132*993229b6Sjkunz 
133*993229b6Sjkunz static uint8_t T2[256][4]=
134*993229b6Sjkunz {
135*993229b6Sjkunz 	0xa5,0xc6,0x63,0x63, 0x84,0xf8,0x7c,0x7c, 0x99,0xee,0x77,0x77, 0x8d,0xf6,0x7b,0x7b,
136*993229b6Sjkunz 	0x0d,0xff,0xf2,0xf2, 0xbd,0xd6,0x6b,0x6b, 0xb1,0xde,0x6f,0x6f, 0x54,0x91,0xc5,0xc5,
137*993229b6Sjkunz 	0x50,0x60,0x30,0x30, 0x03,0x02,0x01,0x01, 0xa9,0xce,0x67,0x67, 0x7d,0x56,0x2b,0x2b,
138*993229b6Sjkunz 	0x19,0xe7,0xfe,0xfe, 0x62,0xb5,0xd7,0xd7, 0xe6,0x4d,0xab,0xab, 0x9a,0xec,0x76,0x76,
139*993229b6Sjkunz 	0x45,0x8f,0xca,0xca, 0x9d,0x1f,0x82,0x82, 0x40,0x89,0xc9,0xc9, 0x87,0xfa,0x7d,0x7d,
140*993229b6Sjkunz 	0x15,0xef,0xfa,0xfa, 0xeb,0xb2,0x59,0x59, 0xc9,0x8e,0x47,0x47, 0x0b,0xfb,0xf0,0xf0,
141*993229b6Sjkunz 	0xec,0x41,0xad,0xad, 0x67,0xb3,0xd4,0xd4, 0xfd,0x5f,0xa2,0xa2, 0xea,0x45,0xaf,0xaf,
142*993229b6Sjkunz 	0xbf,0x23,0x9c,0x9c, 0xf7,0x53,0xa4,0xa4, 0x96,0xe4,0x72,0x72, 0x5b,0x9b,0xc0,0xc0,
143*993229b6Sjkunz 	0xc2,0x75,0xb7,0xb7, 0x1c,0xe1,0xfd,0xfd, 0xae,0x3d,0x93,0x93, 0x6a,0x4c,0x26,0x26,
144*993229b6Sjkunz 	0x5a,0x6c,0x36,0x36, 0x41,0x7e,0x3f,0x3f, 0x02,0xf5,0xf7,0xf7, 0x4f,0x83,0xcc,0xcc,
145*993229b6Sjkunz 	0x5c,0x68,0x34,0x34, 0xf4,0x51,0xa5,0xa5, 0x34,0xd1,0xe5,0xe5, 0x08,0xf9,0xf1,0xf1,
146*993229b6Sjkunz 	0x93,0xe2,0x71,0x71, 0x73,0xab,0xd8,0xd8, 0x53,0x62,0x31,0x31, 0x3f,0x2a,0x15,0x15,
147*993229b6Sjkunz 	0x0c,0x08,0x04,0x04, 0x52,0x95,0xc7,0xc7, 0x65,0x46,0x23,0x23, 0x5e,0x9d,0xc3,0xc3,
148*993229b6Sjkunz 	0x28,0x30,0x18,0x18, 0xa1,0x37,0x96,0x96, 0x0f,0x0a,0x05,0x05, 0xb5,0x2f,0x9a,0x9a,
149*993229b6Sjkunz 	0x09,0x0e,0x07,0x07, 0x36,0x24,0x12,0x12, 0x9b,0x1b,0x80,0x80, 0x3d,0xdf,0xe2,0xe2,
150*993229b6Sjkunz 	0x26,0xcd,0xeb,0xeb, 0x69,0x4e,0x27,0x27, 0xcd,0x7f,0xb2,0xb2, 0x9f,0xea,0x75,0x75,
151*993229b6Sjkunz 	0x1b,0x12,0x09,0x09, 0x9e,0x1d,0x83,0x83, 0x74,0x58,0x2c,0x2c, 0x2e,0x34,0x1a,0x1a,
152*993229b6Sjkunz 	0x2d,0x36,0x1b,0x1b, 0xb2,0xdc,0x6e,0x6e, 0xee,0xb4,0x5a,0x5a, 0xfb,0x5b,0xa0,0xa0,
153*993229b6Sjkunz 	0xf6,0xa4,0x52,0x52, 0x4d,0x76,0x3b,0x3b, 0x61,0xb7,0xd6,0xd6, 0xce,0x7d,0xb3,0xb3,
154*993229b6Sjkunz 	0x7b,0x52,0x29,0x29, 0x3e,0xdd,0xe3,0xe3, 0x71,0x5e,0x2f,0x2f, 0x97,0x13,0x84,0x84,
155*993229b6Sjkunz 	0xf5,0xa6,0x53,0x53, 0x68,0xb9,0xd1,0xd1, 0x00,0x00,0x00,0x00, 0x2c,0xc1,0xed,0xed,
156*993229b6Sjkunz 	0x60,0x40,0x20,0x20, 0x1f,0xe3,0xfc,0xfc, 0xc8,0x79,0xb1,0xb1, 0xed,0xb6,0x5b,0x5b,
157*993229b6Sjkunz 	0xbe,0xd4,0x6a,0x6a, 0x46,0x8d,0xcb,0xcb, 0xd9,0x67,0xbe,0xbe, 0x4b,0x72,0x39,0x39,
158*993229b6Sjkunz 	0xde,0x94,0x4a,0x4a, 0xd4,0x98,0x4c,0x4c, 0xe8,0xb0,0x58,0x58, 0x4a,0x85,0xcf,0xcf,
159*993229b6Sjkunz 	0x6b,0xbb,0xd0,0xd0, 0x2a,0xc5,0xef,0xef, 0xe5,0x4f,0xaa,0xaa, 0x16,0xed,0xfb,0xfb,
160*993229b6Sjkunz 	0xc5,0x86,0x43,0x43, 0xd7,0x9a,0x4d,0x4d, 0x55,0x66,0x33,0x33, 0x94,0x11,0x85,0x85,
161*993229b6Sjkunz 	0xcf,0x8a,0x45,0x45, 0x10,0xe9,0xf9,0xf9, 0x06,0x04,0x02,0x02, 0x81,0xfe,0x7f,0x7f,
162*993229b6Sjkunz 	0xf0,0xa0,0x50,0x50, 0x44,0x78,0x3c,0x3c, 0xba,0x25,0x9f,0x9f, 0xe3,0x4b,0xa8,0xa8,
163*993229b6Sjkunz 	0xf3,0xa2,0x51,0x51, 0xfe,0x5d,0xa3,0xa3, 0xc0,0x80,0x40,0x40, 0x8a,0x05,0x8f,0x8f,
164*993229b6Sjkunz 	0xad,0x3f,0x92,0x92, 0xbc,0x21,0x9d,0x9d, 0x48,0x70,0x38,0x38, 0x04,0xf1,0xf5,0xf5,
165*993229b6Sjkunz 	0xdf,0x63,0xbc,0xbc, 0xc1,0x77,0xb6,0xb6, 0x75,0xaf,0xda,0xda, 0x63,0x42,0x21,0x21,
166*993229b6Sjkunz 	0x30,0x20,0x10,0x10, 0x1a,0xe5,0xff,0xff, 0x0e,0xfd,0xf3,0xf3, 0x6d,0xbf,0xd2,0xd2,
167*993229b6Sjkunz 	0x4c,0x81,0xcd,0xcd, 0x14,0x18,0x0c,0x0c, 0x35,0x26,0x13,0x13, 0x2f,0xc3,0xec,0xec,
168*993229b6Sjkunz 	0xe1,0xbe,0x5f,0x5f, 0xa2,0x35,0x97,0x97, 0xcc,0x88,0x44,0x44, 0x39,0x2e,0x17,0x17,
169*993229b6Sjkunz 	0x57,0x93,0xc4,0xc4, 0xf2,0x55,0xa7,0xa7, 0x82,0xfc,0x7e,0x7e, 0x47,0x7a,0x3d,0x3d,
170*993229b6Sjkunz 	0xac,0xc8,0x64,0x64, 0xe7,0xba,0x5d,0x5d, 0x2b,0x32,0x19,0x19, 0x95,0xe6,0x73,0x73,
171*993229b6Sjkunz 	0xa0,0xc0,0x60,0x60, 0x98,0x19,0x81,0x81, 0xd1,0x9e,0x4f,0x4f, 0x7f,0xa3,0xdc,0xdc,
172*993229b6Sjkunz 	0x66,0x44,0x22,0x22, 0x7e,0x54,0x2a,0x2a, 0xab,0x3b,0x90,0x90, 0x83,0x0b,0x88,0x88,
173*993229b6Sjkunz 	0xca,0x8c,0x46,0x46, 0x29,0xc7,0xee,0xee, 0xd3,0x6b,0xb8,0xb8, 0x3c,0x28,0x14,0x14,
174*993229b6Sjkunz 	0x79,0xa7,0xde,0xde, 0xe2,0xbc,0x5e,0x5e, 0x1d,0x16,0x0b,0x0b, 0x76,0xad,0xdb,0xdb,
175*993229b6Sjkunz 	0x3b,0xdb,0xe0,0xe0, 0x56,0x64,0x32,0x32, 0x4e,0x74,0x3a,0x3a, 0x1e,0x14,0x0a,0x0a,
176*993229b6Sjkunz 	0xdb,0x92,0x49,0x49, 0x0a,0x0c,0x06,0x06, 0x6c,0x48,0x24,0x24, 0xe4,0xb8,0x5c,0x5c,
177*993229b6Sjkunz 	0x5d,0x9f,0xc2,0xc2, 0x6e,0xbd,0xd3,0xd3, 0xef,0x43,0xac,0xac, 0xa6,0xc4,0x62,0x62,
178*993229b6Sjkunz 	0xa8,0x39,0x91,0x91, 0xa4,0x31,0x95,0x95, 0x37,0xd3,0xe4,0xe4, 0x8b,0xf2,0x79,0x79,
179*993229b6Sjkunz 	0x32,0xd5,0xe7,0xe7, 0x43,0x8b,0xc8,0xc8, 0x59,0x6e,0x37,0x37, 0xb7,0xda,0x6d,0x6d,
180*993229b6Sjkunz 	0x8c,0x01,0x8d,0x8d, 0x64,0xb1,0xd5,0xd5, 0xd2,0x9c,0x4e,0x4e, 0xe0,0x49,0xa9,0xa9,
181*993229b6Sjkunz 	0xb4,0xd8,0x6c,0x6c, 0xfa,0xac,0x56,0x56, 0x07,0xf3,0xf4,0xf4, 0x25,0xcf,0xea,0xea,
182*993229b6Sjkunz 	0xaf,0xca,0x65,0x65, 0x8e,0xf4,0x7a,0x7a, 0xe9,0x47,0xae,0xae, 0x18,0x10,0x08,0x08,
183*993229b6Sjkunz 	0xd5,0x6f,0xba,0xba, 0x88,0xf0,0x78,0x78, 0x6f,0x4a,0x25,0x25, 0x72,0x5c,0x2e,0x2e,
184*993229b6Sjkunz 	0x24,0x38,0x1c,0x1c, 0xf1,0x57,0xa6,0xa6, 0xc7,0x73,0xb4,0xb4, 0x51,0x97,0xc6,0xc6,
185*993229b6Sjkunz 	0x23,0xcb,0xe8,0xe8, 0x7c,0xa1,0xdd,0xdd, 0x9c,0xe8,0x74,0x74, 0x21,0x3e,0x1f,0x1f,
186*993229b6Sjkunz 	0xdd,0x96,0x4b,0x4b, 0xdc,0x61,0xbd,0xbd, 0x86,0x0d,0x8b,0x8b, 0x85,0x0f,0x8a,0x8a,
187*993229b6Sjkunz 	0x90,0xe0,0x70,0x70, 0x42,0x7c,0x3e,0x3e, 0xc4,0x71,0xb5,0xb5, 0xaa,0xcc,0x66,0x66,
188*993229b6Sjkunz 	0xd8,0x90,0x48,0x48, 0x05,0x06,0x03,0x03, 0x01,0xf7,0xf6,0xf6, 0x12,0x1c,0x0e,0x0e,
189*993229b6Sjkunz 	0xa3,0xc2,0x61,0x61, 0x5f,0x6a,0x35,0x35, 0xf9,0xae,0x57,0x57, 0xd0,0x69,0xb9,0xb9,
190*993229b6Sjkunz 	0x91,0x17,0x86,0x86, 0x58,0x99,0xc1,0xc1, 0x27,0x3a,0x1d,0x1d, 0xb9,0x27,0x9e,0x9e,
191*993229b6Sjkunz 	0x38,0xd9,0xe1,0xe1, 0x13,0xeb,0xf8,0xf8, 0xb3,0x2b,0x98,0x98, 0x33,0x22,0x11,0x11,
192*993229b6Sjkunz 	0xbb,0xd2,0x69,0x69, 0x70,0xa9,0xd9,0xd9, 0x89,0x07,0x8e,0x8e, 0xa7,0x33,0x94,0x94,
193*993229b6Sjkunz 	0xb6,0x2d,0x9b,0x9b, 0x22,0x3c,0x1e,0x1e, 0x92,0x15,0x87,0x87, 0x20,0xc9,0xe9,0xe9,
194*993229b6Sjkunz 	0x49,0x87,0xce,0xce, 0xff,0xaa,0x55,0x55, 0x78,0x50,0x28,0x28, 0x7a,0xa5,0xdf,0xdf,
195*993229b6Sjkunz 	0x8f,0x03,0x8c,0x8c, 0xf8,0x59,0xa1,0xa1, 0x80,0x09,0x89,0x89, 0x17,0x1a,0x0d,0x0d,
196*993229b6Sjkunz 	0xda,0x65,0xbf,0xbf, 0x31,0xd7,0xe6,0xe6, 0xc6,0x84,0x42,0x42, 0xb8,0xd0,0x68,0x68,
197*993229b6Sjkunz 	0xc3,0x82,0x41,0x41, 0xb0,0x29,0x99,0x99, 0x77,0x5a,0x2d,0x2d, 0x11,0x1e,0x0f,0x0f,
198*993229b6Sjkunz 	0xcb,0x7b,0xb0,0xb0, 0xfc,0xa8,0x54,0x54, 0xd6,0x6d,0xbb,0xbb, 0x3a,0x2c,0x16,0x16
199*993229b6Sjkunz };
200*993229b6Sjkunz 
201*993229b6Sjkunz static uint8_t T3[256][4]=
202*993229b6Sjkunz {
203*993229b6Sjkunz 	0x63,0xa5,0xc6,0x63, 0x7c,0x84,0xf8,0x7c, 0x77,0x99,0xee,0x77, 0x7b,0x8d,0xf6,0x7b,
204*993229b6Sjkunz 	0xf2,0x0d,0xff,0xf2, 0x6b,0xbd,0xd6,0x6b, 0x6f,0xb1,0xde,0x6f, 0xc5,0x54,0x91,0xc5,
205*993229b6Sjkunz 	0x30,0x50,0x60,0x30, 0x01,0x03,0x02,0x01, 0x67,0xa9,0xce,0x67, 0x2b,0x7d,0x56,0x2b,
206*993229b6Sjkunz 	0xfe,0x19,0xe7,0xfe, 0xd7,0x62,0xb5,0xd7, 0xab,0xe6,0x4d,0xab, 0x76,0x9a,0xec,0x76,
207*993229b6Sjkunz 	0xca,0x45,0x8f,0xca, 0x82,0x9d,0x1f,0x82, 0xc9,0x40,0x89,0xc9, 0x7d,0x87,0xfa,0x7d,
208*993229b6Sjkunz 	0xfa,0x15,0xef,0xfa, 0x59,0xeb,0xb2,0x59, 0x47,0xc9,0x8e,0x47, 0xf0,0x0b,0xfb,0xf0,
209*993229b6Sjkunz 	0xad,0xec,0x41,0xad, 0xd4,0x67,0xb3,0xd4, 0xa2,0xfd,0x5f,0xa2, 0xaf,0xea,0x45,0xaf,
210*993229b6Sjkunz 	0x9c,0xbf,0x23,0x9c, 0xa4,0xf7,0x53,0xa4, 0x72,0x96,0xe4,0x72, 0xc0,0x5b,0x9b,0xc0,
211*993229b6Sjkunz 	0xb7,0xc2,0x75,0xb7, 0xfd,0x1c,0xe1,0xfd, 0x93,0xae,0x3d,0x93, 0x26,0x6a,0x4c,0x26,
212*993229b6Sjkunz 	0x36,0x5a,0x6c,0x36, 0x3f,0x41,0x7e,0x3f, 0xf7,0x02,0xf5,0xf7, 0xcc,0x4f,0x83,0xcc,
213*993229b6Sjkunz 	0x34,0x5c,0x68,0x34, 0xa5,0xf4,0x51,0xa5, 0xe5,0x34,0xd1,0xe5, 0xf1,0x08,0xf9,0xf1,
214*993229b6Sjkunz 	0x71,0x93,0xe2,0x71, 0xd8,0x73,0xab,0xd8, 0x31,0x53,0x62,0x31, 0x15,0x3f,0x2a,0x15,
215*993229b6Sjkunz 	0x04,0x0c,0x08,0x04, 0xc7,0x52,0x95,0xc7, 0x23,0x65,0x46,0x23, 0xc3,0x5e,0x9d,0xc3,
216*993229b6Sjkunz 	0x18,0x28,0x30,0x18, 0x96,0xa1,0x37,0x96, 0x05,0x0f,0x0a,0x05, 0x9a,0xb5,0x2f,0x9a,
217*993229b6Sjkunz 	0x07,0x09,0x0e,0x07, 0x12,0x36,0x24,0x12, 0x80,0x9b,0x1b,0x80, 0xe2,0x3d,0xdf,0xe2,
218*993229b6Sjkunz 	0xeb,0x26,0xcd,0xeb, 0x27,0x69,0x4e,0x27, 0xb2,0xcd,0x7f,0xb2, 0x75,0x9f,0xea,0x75,
219*993229b6Sjkunz 	0x09,0x1b,0x12,0x09, 0x83,0x9e,0x1d,0x83, 0x2c,0x74,0x58,0x2c, 0x1a,0x2e,0x34,0x1a,
220*993229b6Sjkunz 	0x1b,0x2d,0x36,0x1b, 0x6e,0xb2,0xdc,0x6e, 0x5a,0xee,0xb4,0x5a, 0xa0,0xfb,0x5b,0xa0,
221*993229b6Sjkunz 	0x52,0xf6,0xa4,0x52, 0x3b,0x4d,0x76,0x3b, 0xd6,0x61,0xb7,0xd6, 0xb3,0xce,0x7d,0xb3,
222*993229b6Sjkunz 	0x29,0x7b,0x52,0x29, 0xe3,0x3e,0xdd,0xe3, 0x2f,0x71,0x5e,0x2f, 0x84,0x97,0x13,0x84,
223*993229b6Sjkunz 	0x53,0xf5,0xa6,0x53, 0xd1,0x68,0xb9,0xd1, 0x00,0x00,0x00,0x00, 0xed,0x2c,0xc1,0xed,
224*993229b6Sjkunz 	0x20,0x60,0x40,0x20, 0xfc,0x1f,0xe3,0xfc, 0xb1,0xc8,0x79,0xb1, 0x5b,0xed,0xb6,0x5b,
225*993229b6Sjkunz 	0x6a,0xbe,0xd4,0x6a, 0xcb,0x46,0x8d,0xcb, 0xbe,0xd9,0x67,0xbe, 0x39,0x4b,0x72,0x39,
226*993229b6Sjkunz 	0x4a,0xde,0x94,0x4a, 0x4c,0xd4,0x98,0x4c, 0x58,0xe8,0xb0,0x58, 0xcf,0x4a,0x85,0xcf,
227*993229b6Sjkunz 	0xd0,0x6b,0xbb,0xd0, 0xef,0x2a,0xc5,0xef, 0xaa,0xe5,0x4f,0xaa, 0xfb,0x16,0xed,0xfb,
228*993229b6Sjkunz 	0x43,0xc5,0x86,0x43, 0x4d,0xd7,0x9a,0x4d, 0x33,0x55,0x66,0x33, 0x85,0x94,0x11,0x85,
229*993229b6Sjkunz 	0x45,0xcf,0x8a,0x45, 0xf9,0x10,0xe9,0xf9, 0x02,0x06,0x04,0x02, 0x7f,0x81,0xfe,0x7f,
230*993229b6Sjkunz 	0x50,0xf0,0xa0,0x50, 0x3c,0x44,0x78,0x3c, 0x9f,0xba,0x25,0x9f, 0xa8,0xe3,0x4b,0xa8,
231*993229b6Sjkunz 	0x51,0xf3,0xa2,0x51, 0xa3,0xfe,0x5d,0xa3, 0x40,0xc0,0x80,0x40, 0x8f,0x8a,0x05,0x8f,
232*993229b6Sjkunz 	0x92,0xad,0x3f,0x92, 0x9d,0xbc,0x21,0x9d, 0x38,0x48,0x70,0x38, 0xf5,0x04,0xf1,0xf5,
233*993229b6Sjkunz 	0xbc,0xdf,0x63,0xbc, 0xb6,0xc1,0x77,0xb6, 0xda,0x75,0xaf,0xda, 0x21,0x63,0x42,0x21,
234*993229b6Sjkunz 	0x10,0x30,0x20,0x10, 0xff,0x1a,0xe5,0xff, 0xf3,0x0e,0xfd,0xf3, 0xd2,0x6d,0xbf,0xd2,
235*993229b6Sjkunz 	0xcd,0x4c,0x81,0xcd, 0x0c,0x14,0x18,0x0c, 0x13,0x35,0x26,0x13, 0xec,0x2f,0xc3,0xec,
236*993229b6Sjkunz 	0x5f,0xe1,0xbe,0x5f, 0x97,0xa2,0x35,0x97, 0x44,0xcc,0x88,0x44, 0x17,0x39,0x2e,0x17,
237*993229b6Sjkunz 	0xc4,0x57,0x93,0xc4, 0xa7,0xf2,0x55,0xa7, 0x7e,0x82,0xfc,0x7e, 0x3d,0x47,0x7a,0x3d,
238*993229b6Sjkunz 	0x64,0xac,0xc8,0x64, 0x5d,0xe7,0xba,0x5d, 0x19,0x2b,0x32,0x19, 0x73,0x95,0xe6,0x73,
239*993229b6Sjkunz 	0x60,0xa0,0xc0,0x60, 0x81,0x98,0x19,0x81, 0x4f,0xd1,0x9e,0x4f, 0xdc,0x7f,0xa3,0xdc,
240*993229b6Sjkunz 	0x22,0x66,0x44,0x22, 0x2a,0x7e,0x54,0x2a, 0x90,0xab,0x3b,0x90, 0x88,0x83,0x0b,0x88,
241*993229b6Sjkunz 	0x46,0xca,0x8c,0x46, 0xee,0x29,0xc7,0xee, 0xb8,0xd3,0x6b,0xb8, 0x14,0x3c,0x28,0x14,
242*993229b6Sjkunz 	0xde,0x79,0xa7,0xde, 0x5e,0xe2,0xbc,0x5e, 0x0b,0x1d,0x16,0x0b, 0xdb,0x76,0xad,0xdb,
243*993229b6Sjkunz 	0xe0,0x3b,0xdb,0xe0, 0x32,0x56,0x64,0x32, 0x3a,0x4e,0x74,0x3a, 0x0a,0x1e,0x14,0x0a,
244*993229b6Sjkunz 	0x49,0xdb,0x92,0x49, 0x06,0x0a,0x0c,0x06, 0x24,0x6c,0x48,0x24, 0x5c,0xe4,0xb8,0x5c,
245*993229b6Sjkunz 	0xc2,0x5d,0x9f,0xc2, 0xd3,0x6e,0xbd,0xd3, 0xac,0xef,0x43,0xac, 0x62,0xa6,0xc4,0x62,
246*993229b6Sjkunz 	0x91,0xa8,0x39,0x91, 0x95,0xa4,0x31,0x95, 0xe4,0x37,0xd3,0xe4, 0x79,0x8b,0xf2,0x79,
247*993229b6Sjkunz 	0xe7,0x32,0xd5,0xe7, 0xc8,0x43,0x8b,0xc8, 0x37,0x59,0x6e,0x37, 0x6d,0xb7,0xda,0x6d,
248*993229b6Sjkunz 	0x8d,0x8c,0x01,0x8d, 0xd5,0x64,0xb1,0xd5, 0x4e,0xd2,0x9c,0x4e, 0xa9,0xe0,0x49,0xa9,
249*993229b6Sjkunz 	0x6c,0xb4,0xd8,0x6c, 0x56,0xfa,0xac,0x56, 0xf4,0x07,0xf3,0xf4, 0xea,0x25,0xcf,0xea,
250*993229b6Sjkunz 	0x65,0xaf,0xca,0x65, 0x7a,0x8e,0xf4,0x7a, 0xae,0xe9,0x47,0xae, 0x08,0x18,0x10,0x08,
251*993229b6Sjkunz 	0xba,0xd5,0x6f,0xba, 0x78,0x88,0xf0,0x78, 0x25,0x6f,0x4a,0x25, 0x2e,0x72,0x5c,0x2e,
252*993229b6Sjkunz 	0x1c,0x24,0x38,0x1c, 0xa6,0xf1,0x57,0xa6, 0xb4,0xc7,0x73,0xb4, 0xc6,0x51,0x97,0xc6,
253*993229b6Sjkunz 	0xe8,0x23,0xcb,0xe8, 0xdd,0x7c,0xa1,0xdd, 0x74,0x9c,0xe8,0x74, 0x1f,0x21,0x3e,0x1f,
254*993229b6Sjkunz 	0x4b,0xdd,0x96,0x4b, 0xbd,0xdc,0x61,0xbd, 0x8b,0x86,0x0d,0x8b, 0x8a,0x85,0x0f,0x8a,
255*993229b6Sjkunz 	0x70,0x90,0xe0,0x70, 0x3e,0x42,0x7c,0x3e, 0xb5,0xc4,0x71,0xb5, 0x66,0xaa,0xcc,0x66,
256*993229b6Sjkunz 	0x48,0xd8,0x90,0x48, 0x03,0x05,0x06,0x03, 0xf6,0x01,0xf7,0xf6, 0x0e,0x12,0x1c,0x0e,
257*993229b6Sjkunz 	0x61,0xa3,0xc2,0x61, 0x35,0x5f,0x6a,0x35, 0x57,0xf9,0xae,0x57, 0xb9,0xd0,0x69,0xb9,
258*993229b6Sjkunz 	0x86,0x91,0x17,0x86, 0xc1,0x58,0x99,0xc1, 0x1d,0x27,0x3a,0x1d, 0x9e,0xb9,0x27,0x9e,
259*993229b6Sjkunz 	0xe1,0x38,0xd9,0xe1, 0xf8,0x13,0xeb,0xf8, 0x98,0xb3,0x2b,0x98, 0x11,0x33,0x22,0x11,
260*993229b6Sjkunz 	0x69,0xbb,0xd2,0x69, 0xd9,0x70,0xa9,0xd9, 0x8e,0x89,0x07,0x8e, 0x94,0xa7,0x33,0x94,
261*993229b6Sjkunz 	0x9b,0xb6,0x2d,0x9b, 0x1e,0x22,0x3c,0x1e, 0x87,0x92,0x15,0x87, 0xe9,0x20,0xc9,0xe9,
262*993229b6Sjkunz 	0xce,0x49,0x87,0xce, 0x55,0xff,0xaa,0x55, 0x28,0x78,0x50,0x28, 0xdf,0x7a,0xa5,0xdf,
263*993229b6Sjkunz 	0x8c,0x8f,0x03,0x8c, 0xa1,0xf8,0x59,0xa1, 0x89,0x80,0x09,0x89, 0x0d,0x17,0x1a,0x0d,
264*993229b6Sjkunz 	0xbf,0xda,0x65,0xbf, 0xe6,0x31,0xd7,0xe6, 0x42,0xc6,0x84,0x42, 0x68,0xb8,0xd0,0x68,
265*993229b6Sjkunz 	0x41,0xc3,0x82,0x41, 0x99,0xb0,0x29,0x99, 0x2d,0x77,0x5a,0x2d, 0x0f,0x11,0x1e,0x0f,
266*993229b6Sjkunz 	0xb0,0xcb,0x7b,0xb0, 0x54,0xfc,0xa8,0x54, 0xbb,0xd6,0x6d,0xbb, 0x16,0x3a,0x2c,0x16
267*993229b6Sjkunz };
268*993229b6Sjkunz 
269*993229b6Sjkunz static uint8_t T4[256][4]=
270*993229b6Sjkunz {
271*993229b6Sjkunz 	0x63,0x63,0xa5,0xc6, 0x7c,0x7c,0x84,0xf8, 0x77,0x77,0x99,0xee, 0x7b,0x7b,0x8d,0xf6,
272*993229b6Sjkunz 	0xf2,0xf2,0x0d,0xff, 0x6b,0x6b,0xbd,0xd6, 0x6f,0x6f,0xb1,0xde, 0xc5,0xc5,0x54,0x91,
273*993229b6Sjkunz 	0x30,0x30,0x50,0x60, 0x01,0x01,0x03,0x02, 0x67,0x67,0xa9,0xce, 0x2b,0x2b,0x7d,0x56,
274*993229b6Sjkunz 	0xfe,0xfe,0x19,0xe7, 0xd7,0xd7,0x62,0xb5, 0xab,0xab,0xe6,0x4d, 0x76,0x76,0x9a,0xec,
275*993229b6Sjkunz 	0xca,0xca,0x45,0x8f, 0x82,0x82,0x9d,0x1f, 0xc9,0xc9,0x40,0x89, 0x7d,0x7d,0x87,0xfa,
276*993229b6Sjkunz 	0xfa,0xfa,0x15,0xef, 0x59,0x59,0xeb,0xb2, 0x47,0x47,0xc9,0x8e, 0xf0,0xf0,0x0b,0xfb,
277*993229b6Sjkunz 	0xad,0xad,0xec,0x41, 0xd4,0xd4,0x67,0xb3, 0xa2,0xa2,0xfd,0x5f, 0xaf,0xaf,0xea,0x45,
278*993229b6Sjkunz 	0x9c,0x9c,0xbf,0x23, 0xa4,0xa4,0xf7,0x53, 0x72,0x72,0x96,0xe4, 0xc0,0xc0,0x5b,0x9b,
279*993229b6Sjkunz 	0xb7,0xb7,0xc2,0x75, 0xfd,0xfd,0x1c,0xe1, 0x93,0x93,0xae,0x3d, 0x26,0x26,0x6a,0x4c,
280*993229b6Sjkunz 	0x36,0x36,0x5a,0x6c, 0x3f,0x3f,0x41,0x7e, 0xf7,0xf7,0x02,0xf5, 0xcc,0xcc,0x4f,0x83,
281*993229b6Sjkunz 	0x34,0x34,0x5c,0x68, 0xa5,0xa5,0xf4,0x51, 0xe5,0xe5,0x34,0xd1, 0xf1,0xf1,0x08,0xf9,
282*993229b6Sjkunz 	0x71,0x71,0x93,0xe2, 0xd8,0xd8,0x73,0xab, 0x31,0x31,0x53,0x62, 0x15,0x15,0x3f,0x2a,
283*993229b6Sjkunz 	0x04,0x04,0x0c,0x08, 0xc7,0xc7,0x52,0x95, 0x23,0x23,0x65,0x46, 0xc3,0xc3,0x5e,0x9d,
284*993229b6Sjkunz 	0x18,0x18,0x28,0x30, 0x96,0x96,0xa1,0x37, 0x05,0x05,0x0f,0x0a, 0x9a,0x9a,0xb5,0x2f,
285*993229b6Sjkunz 	0x07,0x07,0x09,0x0e, 0x12,0x12,0x36,0x24, 0x80,0x80,0x9b,0x1b, 0xe2,0xe2,0x3d,0xdf,
286*993229b6Sjkunz 	0xeb,0xeb,0x26,0xcd, 0x27,0x27,0x69,0x4e, 0xb2,0xb2,0xcd,0x7f, 0x75,0x75,0x9f,0xea,
287*993229b6Sjkunz 	0x09,0x09,0x1b,0x12, 0x83,0x83,0x9e,0x1d, 0x2c,0x2c,0x74,0x58, 0x1a,0x1a,0x2e,0x34,
288*993229b6Sjkunz 	0x1b,0x1b,0x2d,0x36, 0x6e,0x6e,0xb2,0xdc, 0x5a,0x5a,0xee,0xb4, 0xa0,0xa0,0xfb,0x5b,
289*993229b6Sjkunz 	0x52,0x52,0xf6,0xa4, 0x3b,0x3b,0x4d,0x76, 0xd6,0xd6,0x61,0xb7, 0xb3,0xb3,0xce,0x7d,
290*993229b6Sjkunz 	0x29,0x29,0x7b,0x52, 0xe3,0xe3,0x3e,0xdd, 0x2f,0x2f,0x71,0x5e, 0x84,0x84,0x97,0x13,
291*993229b6Sjkunz 	0x53,0x53,0xf5,0xa6, 0xd1,0xd1,0x68,0xb9, 0x00,0x00,0x00,0x00, 0xed,0xed,0x2c,0xc1,
292*993229b6Sjkunz 	0x20,0x20,0x60,0x40, 0xfc,0xfc,0x1f,0xe3, 0xb1,0xb1,0xc8,0x79, 0x5b,0x5b,0xed,0xb6,
293*993229b6Sjkunz 	0x6a,0x6a,0xbe,0xd4, 0xcb,0xcb,0x46,0x8d, 0xbe,0xbe,0xd9,0x67, 0x39,0x39,0x4b,0x72,
294*993229b6Sjkunz 	0x4a,0x4a,0xde,0x94, 0x4c,0x4c,0xd4,0x98, 0x58,0x58,0xe8,0xb0, 0xcf,0xcf,0x4a,0x85,
295*993229b6Sjkunz 	0xd0,0xd0,0x6b,0xbb, 0xef,0xef,0x2a,0xc5, 0xaa,0xaa,0xe5,0x4f, 0xfb,0xfb,0x16,0xed,
296*993229b6Sjkunz 	0x43,0x43,0xc5,0x86, 0x4d,0x4d,0xd7,0x9a, 0x33,0x33,0x55,0x66, 0x85,0x85,0x94,0x11,
297*993229b6Sjkunz 	0x45,0x45,0xcf,0x8a, 0xf9,0xf9,0x10,0xe9, 0x02,0x02,0x06,0x04, 0x7f,0x7f,0x81,0xfe,
298*993229b6Sjkunz 	0x50,0x50,0xf0,0xa0, 0x3c,0x3c,0x44,0x78, 0x9f,0x9f,0xba,0x25, 0xa8,0xa8,0xe3,0x4b,
299*993229b6Sjkunz 	0x51,0x51,0xf3,0xa2, 0xa3,0xa3,0xfe,0x5d, 0x40,0x40,0xc0,0x80, 0x8f,0x8f,0x8a,0x05,
300*993229b6Sjkunz 	0x92,0x92,0xad,0x3f, 0x9d,0x9d,0xbc,0x21, 0x38,0x38,0x48,0x70, 0xf5,0xf5,0x04,0xf1,
301*993229b6Sjkunz 	0xbc,0xbc,0xdf,0x63, 0xb6,0xb6,0xc1,0x77, 0xda,0xda,0x75,0xaf, 0x21,0x21,0x63,0x42,
302*993229b6Sjkunz 	0x10,0x10,0x30,0x20, 0xff,0xff,0x1a,0xe5, 0xf3,0xf3,0x0e,0xfd, 0xd2,0xd2,0x6d,0xbf,
303*993229b6Sjkunz 	0xcd,0xcd,0x4c,0x81, 0x0c,0x0c,0x14,0x18, 0x13,0x13,0x35,0x26, 0xec,0xec,0x2f,0xc3,
304*993229b6Sjkunz 	0x5f,0x5f,0xe1,0xbe, 0x97,0x97,0xa2,0x35, 0x44,0x44,0xcc,0x88, 0x17,0x17,0x39,0x2e,
305*993229b6Sjkunz 	0xc4,0xc4,0x57,0x93, 0xa7,0xa7,0xf2,0x55, 0x7e,0x7e,0x82,0xfc, 0x3d,0x3d,0x47,0x7a,
306*993229b6Sjkunz 	0x64,0x64,0xac,0xc8, 0x5d,0x5d,0xe7,0xba, 0x19,0x19,0x2b,0x32, 0x73,0x73,0x95,0xe6,
307*993229b6Sjkunz 	0x60,0x60,0xa0,0xc0, 0x81,0x81,0x98,0x19, 0x4f,0x4f,0xd1,0x9e, 0xdc,0xdc,0x7f,0xa3,
308*993229b6Sjkunz 	0x22,0x22,0x66,0x44, 0x2a,0x2a,0x7e,0x54, 0x90,0x90,0xab,0x3b, 0x88,0x88,0x83,0x0b,
309*993229b6Sjkunz 	0x46,0x46,0xca,0x8c, 0xee,0xee,0x29,0xc7, 0xb8,0xb8,0xd3,0x6b, 0x14,0x14,0x3c,0x28,
310*993229b6Sjkunz 	0xde,0xde,0x79,0xa7, 0x5e,0x5e,0xe2,0xbc, 0x0b,0x0b,0x1d,0x16, 0xdb,0xdb,0x76,0xad,
311*993229b6Sjkunz 	0xe0,0xe0,0x3b,0xdb, 0x32,0x32,0x56,0x64, 0x3a,0x3a,0x4e,0x74, 0x0a,0x0a,0x1e,0x14,
312*993229b6Sjkunz 	0x49,0x49,0xdb,0x92, 0x06,0x06,0x0a,0x0c, 0x24,0x24,0x6c,0x48, 0x5c,0x5c,0xe4,0xb8,
313*993229b6Sjkunz 	0xc2,0xc2,0x5d,0x9f, 0xd3,0xd3,0x6e,0xbd, 0xac,0xac,0xef,0x43, 0x62,0x62,0xa6,0xc4,
314*993229b6Sjkunz 	0x91,0x91,0xa8,0x39, 0x95,0x95,0xa4,0x31, 0xe4,0xe4,0x37,0xd3, 0x79,0x79,0x8b,0xf2,
315*993229b6Sjkunz 	0xe7,0xe7,0x32,0xd5, 0xc8,0xc8,0x43,0x8b, 0x37,0x37,0x59,0x6e, 0x6d,0x6d,0xb7,0xda,
316*993229b6Sjkunz 	0x8d,0x8d,0x8c,0x01, 0xd5,0xd5,0x64,0xb1, 0x4e,0x4e,0xd2,0x9c, 0xa9,0xa9,0xe0,0x49,
317*993229b6Sjkunz 	0x6c,0x6c,0xb4,0xd8, 0x56,0x56,0xfa,0xac, 0xf4,0xf4,0x07,0xf3, 0xea,0xea,0x25,0xcf,
318*993229b6Sjkunz 	0x65,0x65,0xaf,0xca, 0x7a,0x7a,0x8e,0xf4, 0xae,0xae,0xe9,0x47, 0x08,0x08,0x18,0x10,
319*993229b6Sjkunz 	0xba,0xba,0xd5,0x6f, 0x78,0x78,0x88,0xf0, 0x25,0x25,0x6f,0x4a, 0x2e,0x2e,0x72,0x5c,
320*993229b6Sjkunz 	0x1c,0x1c,0x24,0x38, 0xa6,0xa6,0xf1,0x57, 0xb4,0xb4,0xc7,0x73, 0xc6,0xc6,0x51,0x97,
321*993229b6Sjkunz 	0xe8,0xe8,0x23,0xcb, 0xdd,0xdd,0x7c,0xa1, 0x74,0x74,0x9c,0xe8, 0x1f,0x1f,0x21,0x3e,
322*993229b6Sjkunz 	0x4b,0x4b,0xdd,0x96, 0xbd,0xbd,0xdc,0x61, 0x8b,0x8b,0x86,0x0d, 0x8a,0x8a,0x85,0x0f,
323*993229b6Sjkunz 	0x70,0x70,0x90,0xe0, 0x3e,0x3e,0x42,0x7c, 0xb5,0xb5,0xc4,0x71, 0x66,0x66,0xaa,0xcc,
324*993229b6Sjkunz 	0x48,0x48,0xd8,0x90, 0x03,0x03,0x05,0x06, 0xf6,0xf6,0x01,0xf7, 0x0e,0x0e,0x12,0x1c,
325*993229b6Sjkunz 	0x61,0x61,0xa3,0xc2, 0x35,0x35,0x5f,0x6a, 0x57,0x57,0xf9,0xae, 0xb9,0xb9,0xd0,0x69,
326*993229b6Sjkunz 	0x86,0x86,0x91,0x17, 0xc1,0xc1,0x58,0x99, 0x1d,0x1d,0x27,0x3a, 0x9e,0x9e,0xb9,0x27,
327*993229b6Sjkunz 	0xe1,0xe1,0x38,0xd9, 0xf8,0xf8,0x13,0xeb, 0x98,0x98,0xb3,0x2b, 0x11,0x11,0x33,0x22,
328*993229b6Sjkunz 	0x69,0x69,0xbb,0xd2, 0xd9,0xd9,0x70,0xa9, 0x8e,0x8e,0x89,0x07, 0x94,0x94,0xa7,0x33,
329*993229b6Sjkunz 	0x9b,0x9b,0xb6,0x2d, 0x1e,0x1e,0x22,0x3c, 0x87,0x87,0x92,0x15, 0xe9,0xe9,0x20,0xc9,
330*993229b6Sjkunz 	0xce,0xce,0x49,0x87, 0x55,0x55,0xff,0xaa, 0x28,0x28,0x78,0x50, 0xdf,0xdf,0x7a,0xa5,
331*993229b6Sjkunz 	0x8c,0x8c,0x8f,0x03, 0xa1,0xa1,0xf8,0x59, 0x89,0x89,0x80,0x09, 0x0d,0x0d,0x17,0x1a,
332*993229b6Sjkunz 	0xbf,0xbf,0xda,0x65, 0xe6,0xe6,0x31,0xd7, 0x42,0x42,0xc6,0x84, 0x68,0x68,0xb8,0xd0,
333*993229b6Sjkunz 	0x41,0x41,0xc3,0x82, 0x99,0x99,0xb0,0x29, 0x2d,0x2d,0x77,0x5a, 0x0f,0x0f,0x11,0x1e,
334*993229b6Sjkunz 	0xb0,0xb0,0xcb,0x7b, 0x54,0x54,0xfc,0xa8, 0xbb,0xbb,0xd6,0x6d, 0x16,0x16,0x3a,0x2c
335*993229b6Sjkunz };
336*993229b6Sjkunz 
337*993229b6Sjkunz static uint8_t T5[256][4]=
338*993229b6Sjkunz {
339*993229b6Sjkunz 	0x51,0xf4,0xa7,0x50, 0x7e,0x41,0x65,0x53, 0x1a,0x17,0xa4,0xc3, 0x3a,0x27,0x5e,0x96,
340*993229b6Sjkunz 	0x3b,0xab,0x6b,0xcb, 0x1f,0x9d,0x45,0xf1, 0xac,0xfa,0x58,0xab, 0x4b,0xe3,0x03,0x93,
341*993229b6Sjkunz 	0x20,0x30,0xfa,0x55, 0xad,0x76,0x6d,0xf6, 0x88,0xcc,0x76,0x91, 0xf5,0x02,0x4c,0x25,
342*993229b6Sjkunz 	0x4f,0xe5,0xd7,0xfc, 0xc5,0x2a,0xcb,0xd7, 0x26,0x35,0x44,0x80, 0xb5,0x62,0xa3,0x8f,
343*993229b6Sjkunz 	0xde,0xb1,0x5a,0x49, 0x25,0xba,0x1b,0x67, 0x45,0xea,0x0e,0x98, 0x5d,0xfe,0xc0,0xe1,
344*993229b6Sjkunz 	0xc3,0x2f,0x75,0x02, 0x81,0x4c,0xf0,0x12, 0x8d,0x46,0x97,0xa3, 0x6b,0xd3,0xf9,0xc6,
345*993229b6Sjkunz 	0x03,0x8f,0x5f,0xe7, 0x15,0x92,0x9c,0x95, 0xbf,0x6d,0x7a,0xeb, 0x95,0x52,0x59,0xda,
346*993229b6Sjkunz 	0xd4,0xbe,0x83,0x2d, 0x58,0x74,0x21,0xd3, 0x49,0xe0,0x69,0x29, 0x8e,0xc9,0xc8,0x44,
347*993229b6Sjkunz 	0x75,0xc2,0x89,0x6a, 0xf4,0x8e,0x79,0x78, 0x99,0x58,0x3e,0x6b, 0x27,0xb9,0x71,0xdd,
348*993229b6Sjkunz 	0xbe,0xe1,0x4f,0xb6, 0xf0,0x88,0xad,0x17, 0xc9,0x20,0xac,0x66, 0x7d,0xce,0x3a,0xb4,
349*993229b6Sjkunz 	0x63,0xdf,0x4a,0x18, 0xe5,0x1a,0x31,0x82, 0x97,0x51,0x33,0x60, 0x62,0x53,0x7f,0x45,
350*993229b6Sjkunz 	0xb1,0x64,0x77,0xe0, 0xbb,0x6b,0xae,0x84, 0xfe,0x81,0xa0,0x1c, 0xf9,0x08,0x2b,0x94,
351*993229b6Sjkunz 	0x70,0x48,0x68,0x58, 0x8f,0x45,0xfd,0x19, 0x94,0xde,0x6c,0x87, 0x52,0x7b,0xf8,0xb7,
352*993229b6Sjkunz 	0xab,0x73,0xd3,0x23, 0x72,0x4b,0x02,0xe2, 0xe3,0x1f,0x8f,0x57, 0x66,0x55,0xab,0x2a,
353*993229b6Sjkunz 	0xb2,0xeb,0x28,0x07, 0x2f,0xb5,0xc2,0x03, 0x86,0xc5,0x7b,0x9a, 0xd3,0x37,0x08,0xa5,
354*993229b6Sjkunz 	0x30,0x28,0x87,0xf2, 0x23,0xbf,0xa5,0xb2, 0x02,0x03,0x6a,0xba, 0xed,0x16,0x82,0x5c,
355*993229b6Sjkunz 	0x8a,0xcf,0x1c,0x2b, 0xa7,0x79,0xb4,0x92, 0xf3,0x07,0xf2,0xf0, 0x4e,0x69,0xe2,0xa1,
356*993229b6Sjkunz 	0x65,0xda,0xf4,0xcd, 0x06,0x05,0xbe,0xd5, 0xd1,0x34,0x62,0x1f, 0xc4,0xa6,0xfe,0x8a,
357*993229b6Sjkunz 	0x34,0x2e,0x53,0x9d, 0xa2,0xf3,0x55,0xa0, 0x05,0x8a,0xe1,0x32, 0xa4,0xf6,0xeb,0x75,
358*993229b6Sjkunz 	0x0b,0x83,0xec,0x39, 0x40,0x60,0xef,0xaa, 0x5e,0x71,0x9f,0x06, 0xbd,0x6e,0x10,0x51,
359*993229b6Sjkunz 	0x3e,0x21,0x8a,0xf9, 0x96,0xdd,0x06,0x3d, 0xdd,0x3e,0x05,0xae, 0x4d,0xe6,0xbd,0x46,
360*993229b6Sjkunz 	0x91,0x54,0x8d,0xb5, 0x71,0xc4,0x5d,0x05, 0x04,0x06,0xd4,0x6f, 0x60,0x50,0x15,0xff,
361*993229b6Sjkunz 	0x19,0x98,0xfb,0x24, 0xd6,0xbd,0xe9,0x97, 0x89,0x40,0x43,0xcc, 0x67,0xd9,0x9e,0x77,
362*993229b6Sjkunz 	0xb0,0xe8,0x42,0xbd, 0x07,0x89,0x8b,0x88, 0xe7,0x19,0x5b,0x38, 0x79,0xc8,0xee,0xdb,
363*993229b6Sjkunz 	0xa1,0x7c,0x0a,0x47, 0x7c,0x42,0x0f,0xe9, 0xf8,0x84,0x1e,0xc9, 0x00,0x00,0x00,0x00,
364*993229b6Sjkunz 	0x09,0x80,0x86,0x83, 0x32,0x2b,0xed,0x48, 0x1e,0x11,0x70,0xac, 0x6c,0x5a,0x72,0x4e,
365*993229b6Sjkunz 	0xfd,0x0e,0xff,0xfb, 0x0f,0x85,0x38,0x56, 0x3d,0xae,0xd5,0x1e, 0x36,0x2d,0x39,0x27,
366*993229b6Sjkunz 	0x0a,0x0f,0xd9,0x64, 0x68,0x5c,0xa6,0x21, 0x9b,0x5b,0x54,0xd1, 0x24,0x36,0x2e,0x3a,
367*993229b6Sjkunz 	0x0c,0x0a,0x67,0xb1, 0x93,0x57,0xe7,0x0f, 0xb4,0xee,0x96,0xd2, 0x1b,0x9b,0x91,0x9e,
368*993229b6Sjkunz 	0x80,0xc0,0xc5,0x4f, 0x61,0xdc,0x20,0xa2, 0x5a,0x77,0x4b,0x69, 0x1c,0x12,0x1a,0x16,
369*993229b6Sjkunz 	0xe2,0x93,0xba,0x0a, 0xc0,0xa0,0x2a,0xe5, 0x3c,0x22,0xe0,0x43, 0x12,0x1b,0x17,0x1d,
370*993229b6Sjkunz 	0x0e,0x09,0x0d,0x0b, 0xf2,0x8b,0xc7,0xad, 0x2d,0xb6,0xa8,0xb9, 0x14,0x1e,0xa9,0xc8,
371*993229b6Sjkunz 	0x57,0xf1,0x19,0x85, 0xaf,0x75,0x07,0x4c, 0xee,0x99,0xdd,0xbb, 0xa3,0x7f,0x60,0xfd,
372*993229b6Sjkunz 	0xf7,0x01,0x26,0x9f, 0x5c,0x72,0xf5,0xbc, 0x44,0x66,0x3b,0xc5, 0x5b,0xfb,0x7e,0x34,
373*993229b6Sjkunz 	0x8b,0x43,0x29,0x76, 0xcb,0x23,0xc6,0xdc, 0xb6,0xed,0xfc,0x68, 0xb8,0xe4,0xf1,0x63,
374*993229b6Sjkunz 	0xd7,0x31,0xdc,0xca, 0x42,0x63,0x85,0x10, 0x13,0x97,0x22,0x40, 0x84,0xc6,0x11,0x20,
375*993229b6Sjkunz 	0x85,0x4a,0x24,0x7d, 0xd2,0xbb,0x3d,0xf8, 0xae,0xf9,0x32,0x11, 0xc7,0x29,0xa1,0x6d,
376*993229b6Sjkunz 	0x1d,0x9e,0x2f,0x4b, 0xdc,0xb2,0x30,0xf3, 0x0d,0x86,0x52,0xec, 0x77,0xc1,0xe3,0xd0,
377*993229b6Sjkunz 	0x2b,0xb3,0x16,0x6c, 0xa9,0x70,0xb9,0x99, 0x11,0x94,0x48,0xfa, 0x47,0xe9,0x64,0x22,
378*993229b6Sjkunz 	0xa8,0xfc,0x8c,0xc4, 0xa0,0xf0,0x3f,0x1a, 0x56,0x7d,0x2c,0xd8, 0x22,0x33,0x90,0xef,
379*993229b6Sjkunz 	0x87,0x49,0x4e,0xc7, 0xd9,0x38,0xd1,0xc1, 0x8c,0xca,0xa2,0xfe, 0x98,0xd4,0x0b,0x36,
380*993229b6Sjkunz 	0xa6,0xf5,0x81,0xcf, 0xa5,0x7a,0xde,0x28, 0xda,0xb7,0x8e,0x26, 0x3f,0xad,0xbf,0xa4,
381*993229b6Sjkunz 	0x2c,0x3a,0x9d,0xe4, 0x50,0x78,0x92,0x0d, 0x6a,0x5f,0xcc,0x9b, 0x54,0x7e,0x46,0x62,
382*993229b6Sjkunz 	0xf6,0x8d,0x13,0xc2, 0x90,0xd8,0xb8,0xe8, 0x2e,0x39,0xf7,0x5e, 0x82,0xc3,0xaf,0xf5,
383*993229b6Sjkunz 	0x9f,0x5d,0x80,0xbe, 0x69,0xd0,0x93,0x7c, 0x6f,0xd5,0x2d,0xa9, 0xcf,0x25,0x12,0xb3,
384*993229b6Sjkunz 	0xc8,0xac,0x99,0x3b, 0x10,0x18,0x7d,0xa7, 0xe8,0x9c,0x63,0x6e, 0xdb,0x3b,0xbb,0x7b,
385*993229b6Sjkunz 	0xcd,0x26,0x78,0x09, 0x6e,0x59,0x18,0xf4, 0xec,0x9a,0xb7,0x01, 0x83,0x4f,0x9a,0xa8,
386*993229b6Sjkunz 	0xe6,0x95,0x6e,0x65, 0xaa,0xff,0xe6,0x7e, 0x21,0xbc,0xcf,0x08, 0xef,0x15,0xe8,0xe6,
387*993229b6Sjkunz 	0xba,0xe7,0x9b,0xd9, 0x4a,0x6f,0x36,0xce, 0xea,0x9f,0x09,0xd4, 0x29,0xb0,0x7c,0xd6,
388*993229b6Sjkunz 	0x31,0xa4,0xb2,0xaf, 0x2a,0x3f,0x23,0x31, 0xc6,0xa5,0x94,0x30, 0x35,0xa2,0x66,0xc0,
389*993229b6Sjkunz 	0x74,0x4e,0xbc,0x37, 0xfc,0x82,0xca,0xa6, 0xe0,0x90,0xd0,0xb0, 0x33,0xa7,0xd8,0x15,
390*993229b6Sjkunz 	0xf1,0x04,0x98,0x4a, 0x41,0xec,0xda,0xf7, 0x7f,0xcd,0x50,0x0e, 0x17,0x91,0xf6,0x2f,
391*993229b6Sjkunz 	0x76,0x4d,0xd6,0x8d, 0x43,0xef,0xb0,0x4d, 0xcc,0xaa,0x4d,0x54, 0xe4,0x96,0x04,0xdf,
392*993229b6Sjkunz 	0x9e,0xd1,0xb5,0xe3, 0x4c,0x6a,0x88,0x1b, 0xc1,0x2c,0x1f,0xb8, 0x46,0x65,0x51,0x7f,
393*993229b6Sjkunz 	0x9d,0x5e,0xea,0x04, 0x01,0x8c,0x35,0x5d, 0xfa,0x87,0x74,0x73, 0xfb,0x0b,0x41,0x2e,
394*993229b6Sjkunz 	0xb3,0x67,0x1d,0x5a, 0x92,0xdb,0xd2,0x52, 0xe9,0x10,0x56,0x33, 0x6d,0xd6,0x47,0x13,
395*993229b6Sjkunz 	0x9a,0xd7,0x61,0x8c, 0x37,0xa1,0x0c,0x7a, 0x59,0xf8,0x14,0x8e, 0xeb,0x13,0x3c,0x89,
396*993229b6Sjkunz 	0xce,0xa9,0x27,0xee, 0xb7,0x61,0xc9,0x35, 0xe1,0x1c,0xe5,0xed, 0x7a,0x47,0xb1,0x3c,
397*993229b6Sjkunz 	0x9c,0xd2,0xdf,0x59, 0x55,0xf2,0x73,0x3f, 0x18,0x14,0xce,0x79, 0x73,0xc7,0x37,0xbf,
398*993229b6Sjkunz 	0x53,0xf7,0xcd,0xea, 0x5f,0xfd,0xaa,0x5b, 0xdf,0x3d,0x6f,0x14, 0x78,0x44,0xdb,0x86,
399*993229b6Sjkunz 	0xca,0xaf,0xf3,0x81, 0xb9,0x68,0xc4,0x3e, 0x38,0x24,0x34,0x2c, 0xc2,0xa3,0x40,0x5f,
400*993229b6Sjkunz 	0x16,0x1d,0xc3,0x72, 0xbc,0xe2,0x25,0x0c, 0x28,0x3c,0x49,0x8b, 0xff,0x0d,0x95,0x41,
401*993229b6Sjkunz 	0x39,0xa8,0x01,0x71, 0x08,0x0c,0xb3,0xde, 0xd8,0xb4,0xe4,0x9c, 0x64,0x56,0xc1,0x90,
402*993229b6Sjkunz 	0x7b,0xcb,0x84,0x61, 0xd5,0x32,0xb6,0x70, 0x48,0x6c,0x5c,0x74, 0xd0,0xb8,0x57,0x42
403*993229b6Sjkunz };
404*993229b6Sjkunz 
405*993229b6Sjkunz static uint8_t T6[256][4]=
406*993229b6Sjkunz {
407*993229b6Sjkunz 	0x50,0x51,0xf4,0xa7, 0x53,0x7e,0x41,0x65, 0xc3,0x1a,0x17,0xa4, 0x96,0x3a,0x27,0x5e,
408*993229b6Sjkunz 	0xcb,0x3b,0xab,0x6b, 0xf1,0x1f,0x9d,0x45, 0xab,0xac,0xfa,0x58, 0x93,0x4b,0xe3,0x03,
409*993229b6Sjkunz 	0x55,0x20,0x30,0xfa, 0xf6,0xad,0x76,0x6d, 0x91,0x88,0xcc,0x76, 0x25,0xf5,0x02,0x4c,
410*993229b6Sjkunz 	0xfc,0x4f,0xe5,0xd7, 0xd7,0xc5,0x2a,0xcb, 0x80,0x26,0x35,0x44, 0x8f,0xb5,0x62,0xa3,
411*993229b6Sjkunz 	0x49,0xde,0xb1,0x5a, 0x67,0x25,0xba,0x1b, 0x98,0x45,0xea,0x0e, 0xe1,0x5d,0xfe,0xc0,
412*993229b6Sjkunz 	0x02,0xc3,0x2f,0x75, 0x12,0x81,0x4c,0xf0, 0xa3,0x8d,0x46,0x97, 0xc6,0x6b,0xd3,0xf9,
413*993229b6Sjkunz 	0xe7,0x03,0x8f,0x5f, 0x95,0x15,0x92,0x9c, 0xeb,0xbf,0x6d,0x7a, 0xda,0x95,0x52,0x59,
414*993229b6Sjkunz 	0x2d,0xd4,0xbe,0x83, 0xd3,0x58,0x74,0x21, 0x29,0x49,0xe0,0x69, 0x44,0x8e,0xc9,0xc8,
415*993229b6Sjkunz 	0x6a,0x75,0xc2,0x89, 0x78,0xf4,0x8e,0x79, 0x6b,0x99,0x58,0x3e, 0xdd,0x27,0xb9,0x71,
416*993229b6Sjkunz 	0xb6,0xbe,0xe1,0x4f, 0x17,0xf0,0x88,0xad, 0x66,0xc9,0x20,0xac, 0xb4,0x7d,0xce,0x3a,
417*993229b6Sjkunz 	0x18,0x63,0xdf,0x4a, 0x82,0xe5,0x1a,0x31, 0x60,0x97,0x51,0x33, 0x45,0x62,0x53,0x7f,
418*993229b6Sjkunz 	0xe0,0xb1,0x64,0x77, 0x84,0xbb,0x6b,0xae, 0x1c,0xfe,0x81,0xa0, 0x94,0xf9,0x08,0x2b,
419*993229b6Sjkunz 	0x58,0x70,0x48,0x68, 0x19,0x8f,0x45,0xfd, 0x87,0x94,0xde,0x6c, 0xb7,0x52,0x7b,0xf8,
420*993229b6Sjkunz 	0x23,0xab,0x73,0xd3, 0xe2,0x72,0x4b,0x02, 0x57,0xe3,0x1f,0x8f, 0x2a,0x66,0x55,0xab,
421*993229b6Sjkunz 	0x07,0xb2,0xeb,0x28, 0x03,0x2f,0xb5,0xc2, 0x9a,0x86,0xc5,0x7b, 0xa5,0xd3,0x37,0x08,
422*993229b6Sjkunz 	0xf2,0x30,0x28,0x87, 0xb2,0x23,0xbf,0xa5, 0xba,0x02,0x03,0x6a, 0x5c,0xed,0x16,0x82,
423*993229b6Sjkunz 	0x2b,0x8a,0xcf,0x1c, 0x92,0xa7,0x79,0xb4, 0xf0,0xf3,0x07,0xf2, 0xa1,0x4e,0x69,0xe2,
424*993229b6Sjkunz 	0xcd,0x65,0xda,0xf4, 0xd5,0x06,0x05,0xbe, 0x1f,0xd1,0x34,0x62, 0x8a,0xc4,0xa6,0xfe,
425*993229b6Sjkunz 	0x9d,0x34,0x2e,0x53, 0xa0,0xa2,0xf3,0x55, 0x32,0x05,0x8a,0xe1, 0x75,0xa4,0xf6,0xeb,
426*993229b6Sjkunz 	0x39,0x0b,0x83,0xec, 0xaa,0x40,0x60,0xef, 0x06,0x5e,0x71,0x9f, 0x51,0xbd,0x6e,0x10,
427*993229b6Sjkunz 	0xf9,0x3e,0x21,0x8a, 0x3d,0x96,0xdd,0x06, 0xae,0xdd,0x3e,0x05, 0x46,0x4d,0xe6,0xbd,
428*993229b6Sjkunz 	0xb5,0x91,0x54,0x8d, 0x05,0x71,0xc4,0x5d, 0x6f,0x04,0x06,0xd4, 0xff,0x60,0x50,0x15,
429*993229b6Sjkunz 	0x24,0x19,0x98,0xfb, 0x97,0xd6,0xbd,0xe9, 0xcc,0x89,0x40,0x43, 0x77,0x67,0xd9,0x9e,
430*993229b6Sjkunz 	0xbd,0xb0,0xe8,0x42, 0x88,0x07,0x89,0x8b, 0x38,0xe7,0x19,0x5b, 0xdb,0x79,0xc8,0xee,
431*993229b6Sjkunz 	0x47,0xa1,0x7c,0x0a, 0xe9,0x7c,0x42,0x0f, 0xc9,0xf8,0x84,0x1e, 0x00,0x00,0x00,0x00,
432*993229b6Sjkunz 	0x83,0x09,0x80,0x86, 0x48,0x32,0x2b,0xed, 0xac,0x1e,0x11,0x70, 0x4e,0x6c,0x5a,0x72,
433*993229b6Sjkunz 	0xfb,0xfd,0x0e,0xff, 0x56,0x0f,0x85,0x38, 0x1e,0x3d,0xae,0xd5, 0x27,0x36,0x2d,0x39,
434*993229b6Sjkunz 	0x64,0x0a,0x0f,0xd9, 0x21,0x68,0x5c,0xa6, 0xd1,0x9b,0x5b,0x54, 0x3a,0x24,0x36,0x2e,
435*993229b6Sjkunz 	0xb1,0x0c,0x0a,0x67, 0x0f,0x93,0x57,0xe7, 0xd2,0xb4,0xee,0x96, 0x9e,0x1b,0x9b,0x91,
436*993229b6Sjkunz 	0x4f,0x80,0xc0,0xc5, 0xa2,0x61,0xdc,0x20, 0x69,0x5a,0x77,0x4b, 0x16,0x1c,0x12,0x1a,
437*993229b6Sjkunz 	0x0a,0xe2,0x93,0xba, 0xe5,0xc0,0xa0,0x2a, 0x43,0x3c,0x22,0xe0, 0x1d,0x12,0x1b,0x17,
438*993229b6Sjkunz 	0x0b,0x0e,0x09,0x0d, 0xad,0xf2,0x8b,0xc7, 0xb9,0x2d,0xb6,0xa8, 0xc8,0x14,0x1e,0xa9,
439*993229b6Sjkunz 	0x85,0x57,0xf1,0x19, 0x4c,0xaf,0x75,0x07, 0xbb,0xee,0x99,0xdd, 0xfd,0xa3,0x7f,0x60,
440*993229b6Sjkunz 	0x9f,0xf7,0x01,0x26, 0xbc,0x5c,0x72,0xf5, 0xc5,0x44,0x66,0x3b, 0x34,0x5b,0xfb,0x7e,
441*993229b6Sjkunz 	0x76,0x8b,0x43,0x29, 0xdc,0xcb,0x23,0xc6, 0x68,0xb6,0xed,0xfc, 0x63,0xb8,0xe4,0xf1,
442*993229b6Sjkunz 	0xca,0xd7,0x31,0xdc, 0x10,0x42,0x63,0x85, 0x40,0x13,0x97,0x22, 0x20,0x84,0xc6,0x11,
443*993229b6Sjkunz 	0x7d,0x85,0x4a,0x24, 0xf8,0xd2,0xbb,0x3d, 0x11,0xae,0xf9,0x32, 0x6d,0xc7,0x29,0xa1,
444*993229b6Sjkunz 	0x4b,0x1d,0x9e,0x2f, 0xf3,0xdc,0xb2,0x30, 0xec,0x0d,0x86,0x52, 0xd0,0x77,0xc1,0xe3,
445*993229b6Sjkunz 	0x6c,0x2b,0xb3,0x16, 0x99,0xa9,0x70,0xb9, 0xfa,0x11,0x94,0x48, 0x22,0x47,0xe9,0x64,
446*993229b6Sjkunz 	0xc4,0xa8,0xfc,0x8c, 0x1a,0xa0,0xf0,0x3f, 0xd8,0x56,0x7d,0x2c, 0xef,0x22,0x33,0x90,
447*993229b6Sjkunz 	0xc7,0x87,0x49,0x4e, 0xc1,0xd9,0x38,0xd1, 0xfe,0x8c,0xca,0xa2, 0x36,0x98,0xd4,0x0b,
448*993229b6Sjkunz 	0xcf,0xa6,0xf5,0x81, 0x28,0xa5,0x7a,0xde, 0x26,0xda,0xb7,0x8e, 0xa4,0x3f,0xad,0xbf,
449*993229b6Sjkunz 	0xe4,0x2c,0x3a,0x9d, 0x0d,0x50,0x78,0x92, 0x9b,0x6a,0x5f,0xcc, 0x62,0x54,0x7e,0x46,
450*993229b6Sjkunz 	0xc2,0xf6,0x8d,0x13, 0xe8,0x90,0xd8,0xb8, 0x5e,0x2e,0x39,0xf7, 0xf5,0x82,0xc3,0xaf,
451*993229b6Sjkunz 	0xbe,0x9f,0x5d,0x80, 0x7c,0x69,0xd0,0x93, 0xa9,0x6f,0xd5,0x2d, 0xb3,0xcf,0x25,0x12,
452*993229b6Sjkunz 	0x3b,0xc8,0xac,0x99, 0xa7,0x10,0x18,0x7d, 0x6e,0xe8,0x9c,0x63, 0x7b,0xdb,0x3b,0xbb,
453*993229b6Sjkunz 	0x09,0xcd,0x26,0x78, 0xf4,0x6e,0x59,0x18, 0x01,0xec,0x9a,0xb7, 0xa8,0x83,0x4f,0x9a,
454*993229b6Sjkunz 	0x65,0xe6,0x95,0x6e, 0x7e,0xaa,0xff,0xe6, 0x08,0x21,0xbc,0xcf, 0xe6,0xef,0x15,0xe8,
455*993229b6Sjkunz 	0xd9,0xba,0xe7,0x9b, 0xce,0x4a,0x6f,0x36, 0xd4,0xea,0x9f,0x09, 0xd6,0x29,0xb0,0x7c,
456*993229b6Sjkunz 	0xaf,0x31,0xa4,0xb2, 0x31,0x2a,0x3f,0x23, 0x30,0xc6,0xa5,0x94, 0xc0,0x35,0xa2,0x66,
457*993229b6Sjkunz 	0x37,0x74,0x4e,0xbc, 0xa6,0xfc,0x82,0xca, 0xb0,0xe0,0x90,0xd0, 0x15,0x33,0xa7,0xd8,
458*993229b6Sjkunz 	0x4a,0xf1,0x04,0x98, 0xf7,0x41,0xec,0xda, 0x0e,0x7f,0xcd,0x50, 0x2f,0x17,0x91,0xf6,
459*993229b6Sjkunz 	0x8d,0x76,0x4d,0xd6, 0x4d,0x43,0xef,0xb0, 0x54,0xcc,0xaa,0x4d, 0xdf,0xe4,0x96,0x04,
460*993229b6Sjkunz 	0xe3,0x9e,0xd1,0xb5, 0x1b,0x4c,0x6a,0x88, 0xb8,0xc1,0x2c,0x1f, 0x7f,0x46,0x65,0x51,
461*993229b6Sjkunz 	0x04,0x9d,0x5e,0xea, 0x5d,0x01,0x8c,0x35, 0x73,0xfa,0x87,0x74, 0x2e,0xfb,0x0b,0x41,
462*993229b6Sjkunz 	0x5a,0xb3,0x67,0x1d, 0x52,0x92,0xdb,0xd2, 0x33,0xe9,0x10,0x56, 0x13,0x6d,0xd6,0x47,
463*993229b6Sjkunz 	0x8c,0x9a,0xd7,0x61, 0x7a,0x37,0xa1,0x0c, 0x8e,0x59,0xf8,0x14, 0x89,0xeb,0x13,0x3c,
464*993229b6Sjkunz 	0xee,0xce,0xa9,0x27, 0x35,0xb7,0x61,0xc9, 0xed,0xe1,0x1c,0xe5, 0x3c,0x7a,0x47,0xb1,
465*993229b6Sjkunz 	0x59,0x9c,0xd2,0xdf, 0x3f,0x55,0xf2,0x73, 0x79,0x18,0x14,0xce, 0xbf,0x73,0xc7,0x37,
466*993229b6Sjkunz 	0xea,0x53,0xf7,0xcd, 0x5b,0x5f,0xfd,0xaa, 0x14,0xdf,0x3d,0x6f, 0x86,0x78,0x44,0xdb,
467*993229b6Sjkunz 	0x81,0xca,0xaf,0xf3, 0x3e,0xb9,0x68,0xc4, 0x2c,0x38,0x24,0x34, 0x5f,0xc2,0xa3,0x40,
468*993229b6Sjkunz 	0x72,0x16,0x1d,0xc3, 0x0c,0xbc,0xe2,0x25, 0x8b,0x28,0x3c,0x49, 0x41,0xff,0x0d,0x95,
469*993229b6Sjkunz 	0x71,0x39,0xa8,0x01, 0xde,0x08,0x0c,0xb3, 0x9c,0xd8,0xb4,0xe4, 0x90,0x64,0x56,0xc1,
470*993229b6Sjkunz 	0x61,0x7b,0xcb,0x84, 0x70,0xd5,0x32,0xb6, 0x74,0x48,0x6c,0x5c, 0x42,0xd0,0xb8,0x57
471*993229b6Sjkunz };
472*993229b6Sjkunz 
473*993229b6Sjkunz static uint8_t T7[256][4]=
474*993229b6Sjkunz {
475*993229b6Sjkunz 	0xa7,0x50,0x51,0xf4, 0x65,0x53,0x7e,0x41, 0xa4,0xc3,0x1a,0x17, 0x5e,0x96,0x3a,0x27,
476*993229b6Sjkunz 	0x6b,0xcb,0x3b,0xab, 0x45,0xf1,0x1f,0x9d, 0x58,0xab,0xac,0xfa, 0x03,0x93,0x4b,0xe3,
477*993229b6Sjkunz 	0xfa,0x55,0x20,0x30, 0x6d,0xf6,0xad,0x76, 0x76,0x91,0x88,0xcc, 0x4c,0x25,0xf5,0x02,
478*993229b6Sjkunz 	0xd7,0xfc,0x4f,0xe5, 0xcb,0xd7,0xc5,0x2a, 0x44,0x80,0x26,0x35, 0xa3,0x8f,0xb5,0x62,
479*993229b6Sjkunz 	0x5a,0x49,0xde,0xb1, 0x1b,0x67,0x25,0xba, 0x0e,0x98,0x45,0xea, 0xc0,0xe1,0x5d,0xfe,
480*993229b6Sjkunz 	0x75,0x02,0xc3,0x2f, 0xf0,0x12,0x81,0x4c, 0x97,0xa3,0x8d,0x46, 0xf9,0xc6,0x6b,0xd3,
481*993229b6Sjkunz 	0x5f,0xe7,0x03,0x8f, 0x9c,0x95,0x15,0x92, 0x7a,0xeb,0xbf,0x6d, 0x59,0xda,0x95,0x52,
482*993229b6Sjkunz 	0x83,0x2d,0xd4,0xbe, 0x21,0xd3,0x58,0x74, 0x69,0x29,0x49,0xe0, 0xc8,0x44,0x8e,0xc9,
483*993229b6Sjkunz 	0x89,0x6a,0x75,0xc2, 0x79,0x78,0xf4,0x8e, 0x3e,0x6b,0x99,0x58, 0x71,0xdd,0x27,0xb9,
484*993229b6Sjkunz 	0x4f,0xb6,0xbe,0xe1, 0xad,0x17,0xf0,0x88, 0xac,0x66,0xc9,0x20, 0x3a,0xb4,0x7d,0xce,
485*993229b6Sjkunz 	0x4a,0x18,0x63,0xdf, 0x31,0x82,0xe5,0x1a, 0x33,0x60,0x97,0x51, 0x7f,0x45,0x62,0x53,
486*993229b6Sjkunz 	0x77,0xe0,0xb1,0x64, 0xae,0x84,0xbb,0x6b, 0xa0,0x1c,0xfe,0x81, 0x2b,0x94,0xf9,0x08,
487*993229b6Sjkunz 	0x68,0x58,0x70,0x48, 0xfd,0x19,0x8f,0x45, 0x6c,0x87,0x94,0xde, 0xf8,0xb7,0x52,0x7b,
488*993229b6Sjkunz 	0xd3,0x23,0xab,0x73, 0x02,0xe2,0x72,0x4b, 0x8f,0x57,0xe3,0x1f, 0xab,0x2a,0x66,0x55,
489*993229b6Sjkunz 	0x28,0x07,0xb2,0xeb, 0xc2,0x03,0x2f,0xb5, 0x7b,0x9a,0x86,0xc5, 0x08,0xa5,0xd3,0x37,
490*993229b6Sjkunz 	0x87,0xf2,0x30,0x28, 0xa5,0xb2,0x23,0xbf, 0x6a,0xba,0x02,0x03, 0x82,0x5c,0xed,0x16,
491*993229b6Sjkunz 	0x1c,0x2b,0x8a,0xcf, 0xb4,0x92,0xa7,0x79, 0xf2,0xf0,0xf3,0x07, 0xe2,0xa1,0x4e,0x69,
492*993229b6Sjkunz 	0xf4,0xcd,0x65,0xda, 0xbe,0xd5,0x06,0x05, 0x62,0x1f,0xd1,0x34, 0xfe,0x8a,0xc4,0xa6,
493*993229b6Sjkunz 	0x53,0x9d,0x34,0x2e, 0x55,0xa0,0xa2,0xf3, 0xe1,0x32,0x05,0x8a, 0xeb,0x75,0xa4,0xf6,
494*993229b6Sjkunz 	0xec,0x39,0x0b,0x83, 0xef,0xaa,0x40,0x60, 0x9f,0x06,0x5e,0x71, 0x10,0x51,0xbd,0x6e,
495*993229b6Sjkunz 	0x8a,0xf9,0x3e,0x21, 0x06,0x3d,0x96,0xdd, 0x05,0xae,0xdd,0x3e, 0xbd,0x46,0x4d,0xe6,
496*993229b6Sjkunz 	0x8d,0xb5,0x91,0x54, 0x5d,0x05,0x71,0xc4, 0xd4,0x6f,0x04,0x06, 0x15,0xff,0x60,0x50,
497*993229b6Sjkunz 	0xfb,0x24,0x19,0x98, 0xe9,0x97,0xd6,0xbd, 0x43,0xcc,0x89,0x40, 0x9e,0x77,0x67,0xd9,
498*993229b6Sjkunz 	0x42,0xbd,0xb0,0xe8, 0x8b,0x88,0x07,0x89, 0x5b,0x38,0xe7,0x19, 0xee,0xdb,0x79,0xc8,
499*993229b6Sjkunz 	0x0a,0x47,0xa1,0x7c, 0x0f,0xe9,0x7c,0x42, 0x1e,0xc9,0xf8,0x84, 0x00,0x00,0x00,0x00,
500*993229b6Sjkunz 	0x86,0x83,0x09,0x80, 0xed,0x48,0x32,0x2b, 0x70,0xac,0x1e,0x11, 0x72,0x4e,0x6c,0x5a,
501*993229b6Sjkunz 	0xff,0xfb,0xfd,0x0e, 0x38,0x56,0x0f,0x85, 0xd5,0x1e,0x3d,0xae, 0x39,0x27,0x36,0x2d,
502*993229b6Sjkunz 	0xd9,0x64,0x0a,0x0f, 0xa6,0x21,0x68,0x5c, 0x54,0xd1,0x9b,0x5b, 0x2e,0x3a,0x24,0x36,
503*993229b6Sjkunz 	0x67,0xb1,0x0c,0x0a, 0xe7,0x0f,0x93,0x57, 0x96,0xd2,0xb4,0xee, 0x91,0x9e,0x1b,0x9b,
504*993229b6Sjkunz 	0xc5,0x4f,0x80,0xc0, 0x20,0xa2,0x61,0xdc, 0x4b,0x69,0x5a,0x77, 0x1a,0x16,0x1c,0x12,
505*993229b6Sjkunz 	0xba,0x0a,0xe2,0x93, 0x2a,0xe5,0xc0,0xa0, 0xe0,0x43,0x3c,0x22, 0x17,0x1d,0x12,0x1b,
506*993229b6Sjkunz 	0x0d,0x0b,0x0e,0x09, 0xc7,0xad,0xf2,0x8b, 0xa8,0xb9,0x2d,0xb6, 0xa9,0xc8,0x14,0x1e,
507*993229b6Sjkunz 	0x19,0x85,0x57,0xf1, 0x07,0x4c,0xaf,0x75, 0xdd,0xbb,0xee,0x99, 0x60,0xfd,0xa3,0x7f,
508*993229b6Sjkunz 	0x26,0x9f,0xf7,0x01, 0xf5,0xbc,0x5c,0x72, 0x3b,0xc5,0x44,0x66, 0x7e,0x34,0x5b,0xfb,
509*993229b6Sjkunz 	0x29,0x76,0x8b,0x43, 0xc6,0xdc,0xcb,0x23, 0xfc,0x68,0xb6,0xed, 0xf1,0x63,0xb8,0xe4,
510*993229b6Sjkunz 	0xdc,0xca,0xd7,0x31, 0x85,0x10,0x42,0x63, 0x22,0x40,0x13,0x97, 0x11,0x20,0x84,0xc6,
511*993229b6Sjkunz 	0x24,0x7d,0x85,0x4a, 0x3d,0xf8,0xd2,0xbb, 0x32,0x11,0xae,0xf9, 0xa1,0x6d,0xc7,0x29,
512*993229b6Sjkunz 	0x2f,0x4b,0x1d,0x9e, 0x30,0xf3,0xdc,0xb2, 0x52,0xec,0x0d,0x86, 0xe3,0xd0,0x77,0xc1,
513*993229b6Sjkunz 	0x16,0x6c,0x2b,0xb3, 0xb9,0x99,0xa9,0x70, 0x48,0xfa,0x11,0x94, 0x64,0x22,0x47,0xe9,
514*993229b6Sjkunz 	0x8c,0xc4,0xa8,0xfc, 0x3f,0x1a,0xa0,0xf0, 0x2c,0xd8,0x56,0x7d, 0x90,0xef,0x22,0x33,
515*993229b6Sjkunz 	0x4e,0xc7,0x87,0x49, 0xd1,0xc1,0xd9,0x38, 0xa2,0xfe,0x8c,0xca, 0x0b,0x36,0x98,0xd4,
516*993229b6Sjkunz 	0x81,0xcf,0xa6,0xf5, 0xde,0x28,0xa5,0x7a, 0x8e,0x26,0xda,0xb7, 0xbf,0xa4,0x3f,0xad,
517*993229b6Sjkunz 	0x9d,0xe4,0x2c,0x3a, 0x92,0x0d,0x50,0x78, 0xcc,0x9b,0x6a,0x5f, 0x46,0x62,0x54,0x7e,
518*993229b6Sjkunz 	0x13,0xc2,0xf6,0x8d, 0xb8,0xe8,0x90,0xd8, 0xf7,0x5e,0x2e,0x39, 0xaf,0xf5,0x82,0xc3,
519*993229b6Sjkunz 	0x80,0xbe,0x9f,0x5d, 0x93,0x7c,0x69,0xd0, 0x2d,0xa9,0x6f,0xd5, 0x12,0xb3,0xcf,0x25,
520*993229b6Sjkunz 	0x99,0x3b,0xc8,0xac, 0x7d,0xa7,0x10,0x18, 0x63,0x6e,0xe8,0x9c, 0xbb,0x7b,0xdb,0x3b,
521*993229b6Sjkunz 	0x78,0x09,0xcd,0x26, 0x18,0xf4,0x6e,0x59, 0xb7,0x01,0xec,0x9a, 0x9a,0xa8,0x83,0x4f,
522*993229b6Sjkunz 	0x6e,0x65,0xe6,0x95, 0xe6,0x7e,0xaa,0xff, 0xcf,0x08,0x21,0xbc, 0xe8,0xe6,0xef,0x15,
523*993229b6Sjkunz 	0x9b,0xd9,0xba,0xe7, 0x36,0xce,0x4a,0x6f, 0x09,0xd4,0xea,0x9f, 0x7c,0xd6,0x29,0xb0,
524*993229b6Sjkunz 	0xb2,0xaf,0x31,0xa4, 0x23,0x31,0x2a,0x3f, 0x94,0x30,0xc6,0xa5, 0x66,0xc0,0x35,0xa2,
525*993229b6Sjkunz 	0xbc,0x37,0x74,0x4e, 0xca,0xa6,0xfc,0x82, 0xd0,0xb0,0xe0,0x90, 0xd8,0x15,0x33,0xa7,
526*993229b6Sjkunz 	0x98,0x4a,0xf1,0x04, 0xda,0xf7,0x41,0xec, 0x50,0x0e,0x7f,0xcd, 0xf6,0x2f,0x17,0x91,
527*993229b6Sjkunz 	0xd6,0x8d,0x76,0x4d, 0xb0,0x4d,0x43,0xef, 0x4d,0x54,0xcc,0xaa, 0x04,0xdf,0xe4,0x96,
528*993229b6Sjkunz 	0xb5,0xe3,0x9e,0xd1, 0x88,0x1b,0x4c,0x6a, 0x1f,0xb8,0xc1,0x2c, 0x51,0x7f,0x46,0x65,
529*993229b6Sjkunz 	0xea,0x04,0x9d,0x5e, 0x35,0x5d,0x01,0x8c, 0x74,0x73,0xfa,0x87, 0x41,0x2e,0xfb,0x0b,
530*993229b6Sjkunz 	0x1d,0x5a,0xb3,0x67, 0xd2,0x52,0x92,0xdb, 0x56,0x33,0xe9,0x10, 0x47,0x13,0x6d,0xd6,
531*993229b6Sjkunz 	0x61,0x8c,0x9a,0xd7, 0x0c,0x7a,0x37,0xa1, 0x14,0x8e,0x59,0xf8, 0x3c,0x89,0xeb,0x13,
532*993229b6Sjkunz 	0x27,0xee,0xce,0xa9, 0xc9,0x35,0xb7,0x61, 0xe5,0xed,0xe1,0x1c, 0xb1,0x3c,0x7a,0x47,
533*993229b6Sjkunz 	0xdf,0x59,0x9c,0xd2, 0x73,0x3f,0x55,0xf2, 0xce,0x79,0x18,0x14, 0x37,0xbf,0x73,0xc7,
534*993229b6Sjkunz 	0xcd,0xea,0x53,0xf7, 0xaa,0x5b,0x5f,0xfd, 0x6f,0x14,0xdf,0x3d, 0xdb,0x86,0x78,0x44,
535*993229b6Sjkunz 	0xf3,0x81,0xca,0xaf, 0xc4,0x3e,0xb9,0x68, 0x34,0x2c,0x38,0x24, 0x40,0x5f,0xc2,0xa3,
536*993229b6Sjkunz 	0xc3,0x72,0x16,0x1d, 0x25,0x0c,0xbc,0xe2, 0x49,0x8b,0x28,0x3c, 0x95,0x41,0xff,0x0d,
537*993229b6Sjkunz 	0x01,0x71,0x39,0xa8, 0xb3,0xde,0x08,0x0c, 0xe4,0x9c,0xd8,0xb4, 0xc1,0x90,0x64,0x56,
538*993229b6Sjkunz 	0x84,0x61,0x7b,0xcb, 0xb6,0x70,0xd5,0x32, 0x5c,0x74,0x48,0x6c, 0x57,0x42,0xd0,0xb8
539*993229b6Sjkunz };
540*993229b6Sjkunz 
541*993229b6Sjkunz static uint8_t T8[256][4]=
542*993229b6Sjkunz {
543*993229b6Sjkunz 	0xf4,0xa7,0x50,0x51, 0x41,0x65,0x53,0x7e, 0x17,0xa4,0xc3,0x1a, 0x27,0x5e,0x96,0x3a,
544*993229b6Sjkunz 	0xab,0x6b,0xcb,0x3b, 0x9d,0x45,0xf1,0x1f, 0xfa,0x58,0xab,0xac, 0xe3,0x03,0x93,0x4b,
545*993229b6Sjkunz 	0x30,0xfa,0x55,0x20, 0x76,0x6d,0xf6,0xad, 0xcc,0x76,0x91,0x88, 0x02,0x4c,0x25,0xf5,
546*993229b6Sjkunz 	0xe5,0xd7,0xfc,0x4f, 0x2a,0xcb,0xd7,0xc5, 0x35,0x44,0x80,0x26, 0x62,0xa3,0x8f,0xb5,
547*993229b6Sjkunz 	0xb1,0x5a,0x49,0xde, 0xba,0x1b,0x67,0x25, 0xea,0x0e,0x98,0x45, 0xfe,0xc0,0xe1,0x5d,
548*993229b6Sjkunz 	0x2f,0x75,0x02,0xc3, 0x4c,0xf0,0x12,0x81, 0x46,0x97,0xa3,0x8d, 0xd3,0xf9,0xc6,0x6b,
549*993229b6Sjkunz 	0x8f,0x5f,0xe7,0x03, 0x92,0x9c,0x95,0x15, 0x6d,0x7a,0xeb,0xbf, 0x52,0x59,0xda,0x95,
550*993229b6Sjkunz 	0xbe,0x83,0x2d,0xd4, 0x74,0x21,0xd3,0x58, 0xe0,0x69,0x29,0x49, 0xc9,0xc8,0x44,0x8e,
551*993229b6Sjkunz 	0xc2,0x89,0x6a,0x75, 0x8e,0x79,0x78,0xf4, 0x58,0x3e,0x6b,0x99, 0xb9,0x71,0xdd,0x27,
552*993229b6Sjkunz 	0xe1,0x4f,0xb6,0xbe, 0x88,0xad,0x17,0xf0, 0x20,0xac,0x66,0xc9, 0xce,0x3a,0xb4,0x7d,
553*993229b6Sjkunz 	0xdf,0x4a,0x18,0x63, 0x1a,0x31,0x82,0xe5, 0x51,0x33,0x60,0x97, 0x53,0x7f,0x45,0x62,
554*993229b6Sjkunz 	0x64,0x77,0xe0,0xb1, 0x6b,0xae,0x84,0xbb, 0x81,0xa0,0x1c,0xfe, 0x08,0x2b,0x94,0xf9,
555*993229b6Sjkunz 	0x48,0x68,0x58,0x70, 0x45,0xfd,0x19,0x8f, 0xde,0x6c,0x87,0x94, 0x7b,0xf8,0xb7,0x52,
556*993229b6Sjkunz 	0x73,0xd3,0x23,0xab, 0x4b,0x02,0xe2,0x72, 0x1f,0x8f,0x57,0xe3, 0x55,0xab,0x2a,0x66,
557*993229b6Sjkunz 	0xeb,0x28,0x07,0xb2, 0xb5,0xc2,0x03,0x2f, 0xc5,0x7b,0x9a,0x86, 0x37,0x08,0xa5,0xd3,
558*993229b6Sjkunz 	0x28,0x87,0xf2,0x30, 0xbf,0xa5,0xb2,0x23, 0x03,0x6a,0xba,0x02, 0x16,0x82,0x5c,0xed,
559*993229b6Sjkunz 	0xcf,0x1c,0x2b,0x8a, 0x79,0xb4,0x92,0xa7, 0x07,0xf2,0xf0,0xf3, 0x69,0xe2,0xa1,0x4e,
560*993229b6Sjkunz 	0xda,0xf4,0xcd,0x65, 0x05,0xbe,0xd5,0x06, 0x34,0x62,0x1f,0xd1, 0xa6,0xfe,0x8a,0xc4,
561*993229b6Sjkunz 	0x2e,0x53,0x9d,0x34, 0xf3,0x55,0xa0,0xa2, 0x8a,0xe1,0x32,0x05, 0xf6,0xeb,0x75,0xa4,
562*993229b6Sjkunz 	0x83,0xec,0x39,0x0b, 0x60,0xef,0xaa,0x40, 0x71,0x9f,0x06,0x5e, 0x6e,0x10,0x51,0xbd,
563*993229b6Sjkunz 	0x21,0x8a,0xf9,0x3e, 0xdd,0x06,0x3d,0x96, 0x3e,0x05,0xae,0xdd, 0xe6,0xbd,0x46,0x4d,
564*993229b6Sjkunz 	0x54,0x8d,0xb5,0x91, 0xc4,0x5d,0x05,0x71, 0x06,0xd4,0x6f,0x04, 0x50,0x15,0xff,0x60,
565*993229b6Sjkunz 	0x98,0xfb,0x24,0x19, 0xbd,0xe9,0x97,0xd6, 0x40,0x43,0xcc,0x89, 0xd9,0x9e,0x77,0x67,
566*993229b6Sjkunz 	0xe8,0x42,0xbd,0xb0, 0x89,0x8b,0x88,0x07, 0x19,0x5b,0x38,0xe7, 0xc8,0xee,0xdb,0x79,
567*993229b6Sjkunz 	0x7c,0x0a,0x47,0xa1, 0x42,0x0f,0xe9,0x7c, 0x84,0x1e,0xc9,0xf8, 0x00,0x00,0x00,0x00,
568*993229b6Sjkunz 	0x80,0x86,0x83,0x09, 0x2b,0xed,0x48,0x32, 0x11,0x70,0xac,0x1e, 0x5a,0x72,0x4e,0x6c,
569*993229b6Sjkunz 	0x0e,0xff,0xfb,0xfd, 0x85,0x38,0x56,0x0f, 0xae,0xd5,0x1e,0x3d, 0x2d,0x39,0x27,0x36,
570*993229b6Sjkunz 	0x0f,0xd9,0x64,0x0a, 0x5c,0xa6,0x21,0x68, 0x5b,0x54,0xd1,0x9b, 0x36,0x2e,0x3a,0x24,
571*993229b6Sjkunz 	0x0a,0x67,0xb1,0x0c, 0x57,0xe7,0x0f,0x93, 0xee,0x96,0xd2,0xb4, 0x9b,0x91,0x9e,0x1b,
572*993229b6Sjkunz 	0xc0,0xc5,0x4f,0x80, 0xdc,0x20,0xa2,0x61, 0x77,0x4b,0x69,0x5a, 0x12,0x1a,0x16,0x1c,
573*993229b6Sjkunz 	0x93,0xba,0x0a,0xe2, 0xa0,0x2a,0xe5,0xc0, 0x22,0xe0,0x43,0x3c, 0x1b,0x17,0x1d,0x12,
574*993229b6Sjkunz 	0x09,0x0d,0x0b,0x0e, 0x8b,0xc7,0xad,0xf2, 0xb6,0xa8,0xb9,0x2d, 0x1e,0xa9,0xc8,0x14,
575*993229b6Sjkunz 	0xf1,0x19,0x85,0x57, 0x75,0x07,0x4c,0xaf, 0x99,0xdd,0xbb,0xee, 0x7f,0x60,0xfd,0xa3,
576*993229b6Sjkunz 	0x01,0x26,0x9f,0xf7, 0x72,0xf5,0xbc,0x5c, 0x66,0x3b,0xc5,0x44, 0xfb,0x7e,0x34,0x5b,
577*993229b6Sjkunz 	0x43,0x29,0x76,0x8b, 0x23,0xc6,0xdc,0xcb, 0xed,0xfc,0x68,0xb6, 0xe4,0xf1,0x63,0xb8,
578*993229b6Sjkunz 	0x31,0xdc,0xca,0xd7, 0x63,0x85,0x10,0x42, 0x97,0x22,0x40,0x13, 0xc6,0x11,0x20,0x84,
579*993229b6Sjkunz 	0x4a,0x24,0x7d,0x85, 0xbb,0x3d,0xf8,0xd2, 0xf9,0x32,0x11,0xae, 0x29,0xa1,0x6d,0xc7,
580*993229b6Sjkunz 	0x9e,0x2f,0x4b,0x1d, 0xb2,0x30,0xf3,0xdc, 0x86,0x52,0xec,0x0d, 0xc1,0xe3,0xd0,0x77,
581*993229b6Sjkunz 	0xb3,0x16,0x6c,0x2b, 0x70,0xb9,0x99,0xa9, 0x94,0x48,0xfa,0x11, 0xe9,0x64,0x22,0x47,
582*993229b6Sjkunz 	0xfc,0x8c,0xc4,0xa8, 0xf0,0x3f,0x1a,0xa0, 0x7d,0x2c,0xd8,0x56, 0x33,0x90,0xef,0x22,
583*993229b6Sjkunz 	0x49,0x4e,0xc7,0x87, 0x38,0xd1,0xc1,0xd9, 0xca,0xa2,0xfe,0x8c, 0xd4,0x0b,0x36,0x98,
584*993229b6Sjkunz 	0xf5,0x81,0xcf,0xa6, 0x7a,0xde,0x28,0xa5, 0xb7,0x8e,0x26,0xda, 0xad,0xbf,0xa4,0x3f,
585*993229b6Sjkunz 	0x3a,0x9d,0xe4,0x2c, 0x78,0x92,0x0d,0x50, 0x5f,0xcc,0x9b,0x6a, 0x7e,0x46,0x62,0x54,
586*993229b6Sjkunz 	0x8d,0x13,0xc2,0xf6, 0xd8,0xb8,0xe8,0x90, 0x39,0xf7,0x5e,0x2e, 0xc3,0xaf,0xf5,0x82,
587*993229b6Sjkunz 	0x5d,0x80,0xbe,0x9f, 0xd0,0x93,0x7c,0x69, 0xd5,0x2d,0xa9,0x6f, 0x25,0x12,0xb3,0xcf,
588*993229b6Sjkunz 	0xac,0x99,0x3b,0xc8, 0x18,0x7d,0xa7,0x10, 0x9c,0x63,0x6e,0xe8, 0x3b,0xbb,0x7b,0xdb,
589*993229b6Sjkunz 	0x26,0x78,0x09,0xcd, 0x59,0x18,0xf4,0x6e, 0x9a,0xb7,0x01,0xec, 0x4f,0x9a,0xa8,0x83,
590*993229b6Sjkunz 	0x95,0x6e,0x65,0xe6, 0xff,0xe6,0x7e,0xaa, 0xbc,0xcf,0x08,0x21, 0x15,0xe8,0xe6,0xef,
591*993229b6Sjkunz 	0xe7,0x9b,0xd9,0xba, 0x6f,0x36,0xce,0x4a, 0x9f,0x09,0xd4,0xea, 0xb0,0x7c,0xd6,0x29,
592*993229b6Sjkunz 	0xa4,0xb2,0xaf,0x31, 0x3f,0x23,0x31,0x2a, 0xa5,0x94,0x30,0xc6, 0xa2,0x66,0xc0,0x35,
593*993229b6Sjkunz 	0x4e,0xbc,0x37,0x74, 0x82,0xca,0xa6,0xfc, 0x90,0xd0,0xb0,0xe0, 0xa7,0xd8,0x15,0x33,
594*993229b6Sjkunz 	0x04,0x98,0x4a,0xf1, 0xec,0xda,0xf7,0x41, 0xcd,0x50,0x0e,0x7f, 0x91,0xf6,0x2f,0x17,
595*993229b6Sjkunz 	0x4d,0xd6,0x8d,0x76, 0xef,0xb0,0x4d,0x43, 0xaa,0x4d,0x54,0xcc, 0x96,0x04,0xdf,0xe4,
596*993229b6Sjkunz 	0xd1,0xb5,0xe3,0x9e, 0x6a,0x88,0x1b,0x4c, 0x2c,0x1f,0xb8,0xc1, 0x65,0x51,0x7f,0x46,
597*993229b6Sjkunz 	0x5e,0xea,0x04,0x9d, 0x8c,0x35,0x5d,0x01, 0x87,0x74,0x73,0xfa, 0x0b,0x41,0x2e,0xfb,
598*993229b6Sjkunz 	0x67,0x1d,0x5a,0xb3, 0xdb,0xd2,0x52,0x92, 0x10,0x56,0x33,0xe9, 0xd6,0x47,0x13,0x6d,
599*993229b6Sjkunz 	0xd7,0x61,0x8c,0x9a, 0xa1,0x0c,0x7a,0x37, 0xf8,0x14,0x8e,0x59, 0x13,0x3c,0x89,0xeb,
600*993229b6Sjkunz 	0xa9,0x27,0xee,0xce, 0x61,0xc9,0x35,0xb7, 0x1c,0xe5,0xed,0xe1, 0x47,0xb1,0x3c,0x7a,
601*993229b6Sjkunz 	0xd2,0xdf,0x59,0x9c, 0xf2,0x73,0x3f,0x55, 0x14,0xce,0x79,0x18, 0xc7,0x37,0xbf,0x73,
602*993229b6Sjkunz 	0xf7,0xcd,0xea,0x53, 0xfd,0xaa,0x5b,0x5f, 0x3d,0x6f,0x14,0xdf, 0x44,0xdb,0x86,0x78,
603*993229b6Sjkunz 	0xaf,0xf3,0x81,0xca, 0x68,0xc4,0x3e,0xb9, 0x24,0x34,0x2c,0x38, 0xa3,0x40,0x5f,0xc2,
604*993229b6Sjkunz 	0x1d,0xc3,0x72,0x16, 0xe2,0x25,0x0c,0xbc, 0x3c,0x49,0x8b,0x28, 0x0d,0x95,0x41,0xff,
605*993229b6Sjkunz 	0xa8,0x01,0x71,0x39, 0x0c,0xb3,0xde,0x08, 0xb4,0xe4,0x9c,0xd8, 0x56,0xc1,0x90,0x64,
606*993229b6Sjkunz 	0xcb,0x84,0x61,0x7b, 0x32,0xb6,0x70,0xd5, 0x6c,0x5c,0x74,0x48, 0xb8,0x57,0x42,0xd0
607*993229b6Sjkunz };
608*993229b6Sjkunz 
609*993229b6Sjkunz static uint8_t S5[256]=
610*993229b6Sjkunz {
611*993229b6Sjkunz 	0x52,0x09,0x6a,0xd5,
612*993229b6Sjkunz 	0x30,0x36,0xa5,0x38,
613*993229b6Sjkunz 	0xbf,0x40,0xa3,0x9e,
614*993229b6Sjkunz 	0x81,0xf3,0xd7,0xfb,
615*993229b6Sjkunz 	0x7c,0xe3,0x39,0x82,
616*993229b6Sjkunz 	0x9b,0x2f,0xff,0x87,
617*993229b6Sjkunz 	0x34,0x8e,0x43,0x44,
618*993229b6Sjkunz 	0xc4,0xde,0xe9,0xcb,
619*993229b6Sjkunz 	0x54,0x7b,0x94,0x32,
620*993229b6Sjkunz 	0xa6,0xc2,0x23,0x3d,
621*993229b6Sjkunz 	0xee,0x4c,0x95,0x0b,
622*993229b6Sjkunz 	0x42,0xfa,0xc3,0x4e,
623*993229b6Sjkunz 	0x08,0x2e,0xa1,0x66,
624*993229b6Sjkunz 	0x28,0xd9,0x24,0xb2,
625*993229b6Sjkunz 	0x76,0x5b,0xa2,0x49,
626*993229b6Sjkunz 	0x6d,0x8b,0xd1,0x25,
627*993229b6Sjkunz 	0x72,0xf8,0xf6,0x64,
628*993229b6Sjkunz 	0x86,0x68,0x98,0x16,
629*993229b6Sjkunz 	0xd4,0xa4,0x5c,0xcc,
630*993229b6Sjkunz 	0x5d,0x65,0xb6,0x92,
631*993229b6Sjkunz 	0x6c,0x70,0x48,0x50,
632*993229b6Sjkunz 	0xfd,0xed,0xb9,0xda,
633*993229b6Sjkunz 	0x5e,0x15,0x46,0x57,
634*993229b6Sjkunz 	0xa7,0x8d,0x9d,0x84,
635*993229b6Sjkunz 	0x90,0xd8,0xab,0x00,
636*993229b6Sjkunz 	0x8c,0xbc,0xd3,0x0a,
637*993229b6Sjkunz 	0xf7,0xe4,0x58,0x05,
638*993229b6Sjkunz 	0xb8,0xb3,0x45,0x06,
639*993229b6Sjkunz 	0xd0,0x2c,0x1e,0x8f,
640*993229b6Sjkunz 	0xca,0x3f,0x0f,0x02,
641*993229b6Sjkunz 	0xc1,0xaf,0xbd,0x03,
642*993229b6Sjkunz 	0x01,0x13,0x8a,0x6b,
643*993229b6Sjkunz 	0x3a,0x91,0x11,0x41,
644*993229b6Sjkunz 	0x4f,0x67,0xdc,0xea,
645*993229b6Sjkunz 	0x97,0xf2,0xcf,0xce,
646*993229b6Sjkunz 	0xf0,0xb4,0xe6,0x73,
647*993229b6Sjkunz 	0x96,0xac,0x74,0x22,
648*993229b6Sjkunz 	0xe7,0xad,0x35,0x85,
649*993229b6Sjkunz 	0xe2,0xf9,0x37,0xe8,
650*993229b6Sjkunz 	0x1c,0x75,0xdf,0x6e,
651*993229b6Sjkunz 	0x47,0xf1,0x1a,0x71,
652*993229b6Sjkunz 	0x1d,0x29,0xc5,0x89,
653*993229b6Sjkunz 	0x6f,0xb7,0x62,0x0e,
654*993229b6Sjkunz 	0xaa,0x18,0xbe,0x1b,
655*993229b6Sjkunz 	0xfc,0x56,0x3e,0x4b,
656*993229b6Sjkunz 	0xc6,0xd2,0x79,0x20,
657*993229b6Sjkunz 	0x9a,0xdb,0xc0,0xfe,
658*993229b6Sjkunz 	0x78,0xcd,0x5a,0xf4,
659*993229b6Sjkunz 	0x1f,0xdd,0xa8,0x33,
660*993229b6Sjkunz 	0x88,0x07,0xc7,0x31,
661*993229b6Sjkunz 	0xb1,0x12,0x10,0x59,
662*993229b6Sjkunz 	0x27,0x80,0xec,0x5f,
663*993229b6Sjkunz 	0x60,0x51,0x7f,0xa9,
664*993229b6Sjkunz 	0x19,0xb5,0x4a,0x0d,
665*993229b6Sjkunz 	0x2d,0xe5,0x7a,0x9f,
666*993229b6Sjkunz 	0x93,0xc9,0x9c,0xef,
667*993229b6Sjkunz 	0xa0,0xe0,0x3b,0x4d,
668*993229b6Sjkunz 	0xae,0x2a,0xf5,0xb0,
669*993229b6Sjkunz 	0xc8,0xeb,0xbb,0x3c,
670*993229b6Sjkunz 	0x83,0x53,0x99,0x61,
671*993229b6Sjkunz 	0x17,0x2b,0x04,0x7e,
672*993229b6Sjkunz 	0xba,0x77,0xd6,0x26,
673*993229b6Sjkunz 	0xe1,0x69,0x14,0x63,
674*993229b6Sjkunz 	0x55,0x21,0x0c,0x7d
675*993229b6Sjkunz };
676*993229b6Sjkunz 
677*993229b6Sjkunz static uint8_t U1[256][4]=
678*993229b6Sjkunz {
679*993229b6Sjkunz 	0x00,0x00,0x00,0x00, 0x0e,0x09,0x0d,0x0b, 0x1c,0x12,0x1a,0x16, 0x12,0x1b,0x17,0x1d,
680*993229b6Sjkunz 	0x38,0x24,0x34,0x2c, 0x36,0x2d,0x39,0x27, 0x24,0x36,0x2e,0x3a, 0x2a,0x3f,0x23,0x31,
681*993229b6Sjkunz 	0x70,0x48,0x68,0x58, 0x7e,0x41,0x65,0x53, 0x6c,0x5a,0x72,0x4e, 0x62,0x53,0x7f,0x45,
682*993229b6Sjkunz 	0x48,0x6c,0x5c,0x74, 0x46,0x65,0x51,0x7f, 0x54,0x7e,0x46,0x62, 0x5a,0x77,0x4b,0x69,
683*993229b6Sjkunz 	0xe0,0x90,0xd0,0xb0, 0xee,0x99,0xdd,0xbb, 0xfc,0x82,0xca,0xa6, 0xf2,0x8b,0xc7,0xad,
684*993229b6Sjkunz 	0xd8,0xb4,0xe4,0x9c, 0xd6,0xbd,0xe9,0x97, 0xc4,0xa6,0xfe,0x8a, 0xca,0xaf,0xf3,0x81,
685*993229b6Sjkunz 	0x90,0xd8,0xb8,0xe8, 0x9e,0xd1,0xb5,0xe3, 0x8c,0xca,0xa2,0xfe, 0x82,0xc3,0xaf,0xf5,
686*993229b6Sjkunz 	0xa8,0xfc,0x8c,0xc4, 0xa6,0xf5,0x81,0xcf, 0xb4,0xee,0x96,0xd2, 0xba,0xe7,0x9b,0xd9,
687*993229b6Sjkunz 	0xdb,0x3b,0xbb,0x7b, 0xd5,0x32,0xb6,0x70, 0xc7,0x29,0xa1,0x6d, 0xc9,0x20,0xac,0x66,
688*993229b6Sjkunz 	0xe3,0x1f,0x8f,0x57, 0xed,0x16,0x82,0x5c, 0xff,0x0d,0x95,0x41, 0xf1,0x04,0x98,0x4a,
689*993229b6Sjkunz 	0xab,0x73,0xd3,0x23, 0xa5,0x7a,0xde,0x28, 0xb7,0x61,0xc9,0x35, 0xb9,0x68,0xc4,0x3e,
690*993229b6Sjkunz 	0x93,0x57,0xe7,0x0f, 0x9d,0x5e,0xea,0x04, 0x8f,0x45,0xfd,0x19, 0x81,0x4c,0xf0,0x12,
691*993229b6Sjkunz 	0x3b,0xab,0x6b,0xcb, 0x35,0xa2,0x66,0xc0, 0x27,0xb9,0x71,0xdd, 0x29,0xb0,0x7c,0xd6,
692*993229b6Sjkunz 	0x03,0x8f,0x5f,0xe7, 0x0d,0x86,0x52,0xec, 0x1f,0x9d,0x45,0xf1, 0x11,0x94,0x48,0xfa,
693*993229b6Sjkunz 	0x4b,0xe3,0x03,0x93, 0x45,0xea,0x0e,0x98, 0x57,0xf1,0x19,0x85, 0x59,0xf8,0x14,0x8e,
694*993229b6Sjkunz 	0x73,0xc7,0x37,0xbf, 0x7d,0xce,0x3a,0xb4, 0x6f,0xd5,0x2d,0xa9, 0x61,0xdc,0x20,0xa2,
695*993229b6Sjkunz 	0xad,0x76,0x6d,0xf6, 0xa3,0x7f,0x60,0xfd, 0xb1,0x64,0x77,0xe0, 0xbf,0x6d,0x7a,0xeb,
696*993229b6Sjkunz 	0x95,0x52,0x59,0xda, 0x9b,0x5b,0x54,0xd1, 0x89,0x40,0x43,0xcc, 0x87,0x49,0x4e,0xc7,
697*993229b6Sjkunz 	0xdd,0x3e,0x05,0xae, 0xd3,0x37,0x08,0xa5, 0xc1,0x2c,0x1f,0xb8, 0xcf,0x25,0x12,0xb3,
698*993229b6Sjkunz 	0xe5,0x1a,0x31,0x82, 0xeb,0x13,0x3c,0x89, 0xf9,0x08,0x2b,0x94, 0xf7,0x01,0x26,0x9f,
699*993229b6Sjkunz 	0x4d,0xe6,0xbd,0x46, 0x43,0xef,0xb0,0x4d, 0x51,0xf4,0xa7,0x50, 0x5f,0xfd,0xaa,0x5b,
700*993229b6Sjkunz 	0x75,0xc2,0x89,0x6a, 0x7b,0xcb,0x84,0x61, 0x69,0xd0,0x93,0x7c, 0x67,0xd9,0x9e,0x77,
701*993229b6Sjkunz 	0x3d,0xae,0xd5,0x1e, 0x33,0xa7,0xd8,0x15, 0x21,0xbc,0xcf,0x08, 0x2f,0xb5,0xc2,0x03,
702*993229b6Sjkunz 	0x05,0x8a,0xe1,0x32, 0x0b,0x83,0xec,0x39, 0x19,0x98,0xfb,0x24, 0x17,0x91,0xf6,0x2f,
703*993229b6Sjkunz 	0x76,0x4d,0xd6,0x8d, 0x78,0x44,0xdb,0x86, 0x6a,0x5f,0xcc,0x9b, 0x64,0x56,0xc1,0x90,
704*993229b6Sjkunz 	0x4e,0x69,0xe2,0xa1, 0x40,0x60,0xef,0xaa, 0x52,0x7b,0xf8,0xb7, 0x5c,0x72,0xf5,0xbc,
705*993229b6Sjkunz 	0x06,0x05,0xbe,0xd5, 0x08,0x0c,0xb3,0xde, 0x1a,0x17,0xa4,0xc3, 0x14,0x1e,0xa9,0xc8,
706*993229b6Sjkunz 	0x3e,0x21,0x8a,0xf9, 0x30,0x28,0x87,0xf2, 0x22,0x33,0x90,0xef, 0x2c,0x3a,0x9d,0xe4,
707*993229b6Sjkunz 	0x96,0xdd,0x06,0x3d, 0x98,0xd4,0x0b,0x36, 0x8a,0xcf,0x1c,0x2b, 0x84,0xc6,0x11,0x20,
708*993229b6Sjkunz 	0xae,0xf9,0x32,0x11, 0xa0,0xf0,0x3f,0x1a, 0xb2,0xeb,0x28,0x07, 0xbc,0xe2,0x25,0x0c,
709*993229b6Sjkunz 	0xe6,0x95,0x6e,0x65, 0xe8,0x9c,0x63,0x6e, 0xfa,0x87,0x74,0x73, 0xf4,0x8e,0x79,0x78,
710*993229b6Sjkunz 	0xde,0xb1,0x5a,0x49, 0xd0,0xb8,0x57,0x42, 0xc2,0xa3,0x40,0x5f, 0xcc,0xaa,0x4d,0x54,
711*993229b6Sjkunz 	0x41,0xec,0xda,0xf7, 0x4f,0xe5,0xd7,0xfc, 0x5d,0xfe,0xc0,0xe1, 0x53,0xf7,0xcd,0xea,
712*993229b6Sjkunz 	0x79,0xc8,0xee,0xdb, 0x77,0xc1,0xe3,0xd0, 0x65,0xda,0xf4,0xcd, 0x6b,0xd3,0xf9,0xc6,
713*993229b6Sjkunz 	0x31,0xa4,0xb2,0xaf, 0x3f,0xad,0xbf,0xa4, 0x2d,0xb6,0xa8,0xb9, 0x23,0xbf,0xa5,0xb2,
714*993229b6Sjkunz 	0x09,0x80,0x86,0x83, 0x07,0x89,0x8b,0x88, 0x15,0x92,0x9c,0x95, 0x1b,0x9b,0x91,0x9e,
715*993229b6Sjkunz 	0xa1,0x7c,0x0a,0x47, 0xaf,0x75,0x07,0x4c, 0xbd,0x6e,0x10,0x51, 0xb3,0x67,0x1d,0x5a,
716*993229b6Sjkunz 	0x99,0x58,0x3e,0x6b, 0x97,0x51,0x33,0x60, 0x85,0x4a,0x24,0x7d, 0x8b,0x43,0x29,0x76,
717*993229b6Sjkunz 	0xd1,0x34,0x62,0x1f, 0xdf,0x3d,0x6f,0x14, 0xcd,0x26,0x78,0x09, 0xc3,0x2f,0x75,0x02,
718*993229b6Sjkunz 	0xe9,0x10,0x56,0x33, 0xe7,0x19,0x5b,0x38, 0xf5,0x02,0x4c,0x25, 0xfb,0x0b,0x41,0x2e,
719*993229b6Sjkunz 	0x9a,0xd7,0x61,0x8c, 0x94,0xde,0x6c,0x87, 0x86,0xc5,0x7b,0x9a, 0x88,0xcc,0x76,0x91,
720*993229b6Sjkunz 	0xa2,0xf3,0x55,0xa0, 0xac,0xfa,0x58,0xab, 0xbe,0xe1,0x4f,0xb6, 0xb0,0xe8,0x42,0xbd,
721*993229b6Sjkunz 	0xea,0x9f,0x09,0xd4, 0xe4,0x96,0x04,0xdf, 0xf6,0x8d,0x13,0xc2, 0xf8,0x84,0x1e,0xc9,
722*993229b6Sjkunz 	0xd2,0xbb,0x3d,0xf8, 0xdc,0xb2,0x30,0xf3, 0xce,0xa9,0x27,0xee, 0xc0,0xa0,0x2a,0xe5,
723*993229b6Sjkunz 	0x7a,0x47,0xb1,0x3c, 0x74,0x4e,0xbc,0x37, 0x66,0x55,0xab,0x2a, 0x68,0x5c,0xa6,0x21,
724*993229b6Sjkunz 	0x42,0x63,0x85,0x10, 0x4c,0x6a,0x88,0x1b, 0x5e,0x71,0x9f,0x06, 0x50,0x78,0x92,0x0d,
725*993229b6Sjkunz 	0x0a,0x0f,0xd9,0x64, 0x04,0x06,0xd4,0x6f, 0x16,0x1d,0xc3,0x72, 0x18,0x14,0xce,0x79,
726*993229b6Sjkunz 	0x32,0x2b,0xed,0x48, 0x3c,0x22,0xe0,0x43, 0x2e,0x39,0xf7,0x5e, 0x20,0x30,0xfa,0x55,
727*993229b6Sjkunz 	0xec,0x9a,0xb7,0x01, 0xe2,0x93,0xba,0x0a, 0xf0,0x88,0xad,0x17, 0xfe,0x81,0xa0,0x1c,
728*993229b6Sjkunz 	0xd4,0xbe,0x83,0x2d, 0xda,0xb7,0x8e,0x26, 0xc8,0xac,0x99,0x3b, 0xc6,0xa5,0x94,0x30,
729*993229b6Sjkunz 	0x9c,0xd2,0xdf,0x59, 0x92,0xdb,0xd2,0x52, 0x80,0xc0,0xc5,0x4f, 0x8e,0xc9,0xc8,0x44,
730*993229b6Sjkunz 	0xa4,0xf6,0xeb,0x75, 0xaa,0xff,0xe6,0x7e, 0xb8,0xe4,0xf1,0x63, 0xb6,0xed,0xfc,0x68,
731*993229b6Sjkunz 	0x0c,0x0a,0x67,0xb1, 0x02,0x03,0x6a,0xba, 0x10,0x18,0x7d,0xa7, 0x1e,0x11,0x70,0xac,
732*993229b6Sjkunz 	0x34,0x2e,0x53,0x9d, 0x3a,0x27,0x5e,0x96, 0x28,0x3c,0x49,0x8b, 0x26,0x35,0x44,0x80,
733*993229b6Sjkunz 	0x7c,0x42,0x0f,0xe9, 0x72,0x4b,0x02,0xe2, 0x60,0x50,0x15,0xff, 0x6e,0x59,0x18,0xf4,
734*993229b6Sjkunz 	0x44,0x66,0x3b,0xc5, 0x4a,0x6f,0x36,0xce, 0x58,0x74,0x21,0xd3, 0x56,0x7d,0x2c,0xd8,
735*993229b6Sjkunz 	0x37,0xa1,0x0c,0x7a, 0x39,0xa8,0x01,0x71, 0x2b,0xb3,0x16,0x6c, 0x25,0xba,0x1b,0x67,
736*993229b6Sjkunz 	0x0f,0x85,0x38,0x56, 0x01,0x8c,0x35,0x5d, 0x13,0x97,0x22,0x40, 0x1d,0x9e,0x2f,0x4b,
737*993229b6Sjkunz 	0x47,0xe9,0x64,0x22, 0x49,0xe0,0x69,0x29, 0x5b,0xfb,0x7e,0x34, 0x55,0xf2,0x73,0x3f,
738*993229b6Sjkunz 	0x7f,0xcd,0x50,0x0e, 0x71,0xc4,0x5d,0x05, 0x63,0xdf,0x4a,0x18, 0x6d,0xd6,0x47,0x13,
739*993229b6Sjkunz 	0xd7,0x31,0xdc,0xca, 0xd9,0x38,0xd1,0xc1, 0xcb,0x23,0xc6,0xdc, 0xc5,0x2a,0xcb,0xd7,
740*993229b6Sjkunz 	0xef,0x15,0xe8,0xe6, 0xe1,0x1c,0xe5,0xed, 0xf3,0x07,0xf2,0xf0, 0xfd,0x0e,0xff,0xfb,
741*993229b6Sjkunz 	0xa7,0x79,0xb4,0x92, 0xa9,0x70,0xb9,0x99, 0xbb,0x6b,0xae,0x84, 0xb5,0x62,0xa3,0x8f,
742*993229b6Sjkunz 	0x9f,0x5d,0x80,0xbe, 0x91,0x54,0x8d,0xb5, 0x83,0x4f,0x9a,0xa8, 0x8d,0x46,0x97,0xa3
743*993229b6Sjkunz };
744*993229b6Sjkunz 
745*993229b6Sjkunz static uint8_t U2[256][4]=
746*993229b6Sjkunz {
747*993229b6Sjkunz 	0x00,0x00,0x00,0x00, 0x0b,0x0e,0x09,0x0d, 0x16,0x1c,0x12,0x1a, 0x1d,0x12,0x1b,0x17,
748*993229b6Sjkunz 	0x2c,0x38,0x24,0x34, 0x27,0x36,0x2d,0x39, 0x3a,0x24,0x36,0x2e, 0x31,0x2a,0x3f,0x23,
749*993229b6Sjkunz 	0x58,0x70,0x48,0x68, 0x53,0x7e,0x41,0x65, 0x4e,0x6c,0x5a,0x72, 0x45,0x62,0x53,0x7f,
750*993229b6Sjkunz 	0x74,0x48,0x6c,0x5c, 0x7f,0x46,0x65,0x51, 0x62,0x54,0x7e,0x46, 0x69,0x5a,0x77,0x4b,
751*993229b6Sjkunz 	0xb0,0xe0,0x90,0xd0, 0xbb,0xee,0x99,0xdd, 0xa6,0xfc,0x82,0xca, 0xad,0xf2,0x8b,0xc7,
752*993229b6Sjkunz 	0x9c,0xd8,0xb4,0xe4, 0x97,0xd6,0xbd,0xe9, 0x8a,0xc4,0xa6,0xfe, 0x81,0xca,0xaf,0xf3,
753*993229b6Sjkunz 	0xe8,0x90,0xd8,0xb8, 0xe3,0x9e,0xd1,0xb5, 0xfe,0x8c,0xca,0xa2, 0xf5,0x82,0xc3,0xaf,
754*993229b6Sjkunz 	0xc4,0xa8,0xfc,0x8c, 0xcf,0xa6,0xf5,0x81, 0xd2,0xb4,0xee,0x96, 0xd9,0xba,0xe7,0x9b,
755*993229b6Sjkunz 	0x7b,0xdb,0x3b,0xbb, 0x70,0xd5,0x32,0xb6, 0x6d,0xc7,0x29,0xa1, 0x66,0xc9,0x20,0xac,
756*993229b6Sjkunz 	0x57,0xe3,0x1f,0x8f, 0x5c,0xed,0x16,0x82, 0x41,0xff,0x0d,0x95, 0x4a,0xf1,0x04,0x98,
757*993229b6Sjkunz 	0x23,0xab,0x73,0xd3, 0x28,0xa5,0x7a,0xde, 0x35,0xb7,0x61,0xc9, 0x3e,0xb9,0x68,0xc4,
758*993229b6Sjkunz 	0x0f,0x93,0x57,0xe7, 0x04,0x9d,0x5e,0xea, 0x19,0x8f,0x45,0xfd, 0x12,0x81,0x4c,0xf0,
759*993229b6Sjkunz 	0xcb,0x3b,0xab,0x6b, 0xc0,0x35,0xa2,0x66, 0xdd,0x27,0xb9,0x71, 0xd6,0x29,0xb0,0x7c,
760*993229b6Sjkunz 	0xe7,0x03,0x8f,0x5f, 0xec,0x0d,0x86,0x52, 0xf1,0x1f,0x9d,0x45, 0xfa,0x11,0x94,0x48,
761*993229b6Sjkunz 	0x93,0x4b,0xe3,0x03, 0x98,0x45,0xea,0x0e, 0x85,0x57,0xf1,0x19, 0x8e,0x59,0xf8,0x14,
762*993229b6Sjkunz 	0xbf,0x73,0xc7,0x37, 0xb4,0x7d,0xce,0x3a, 0xa9,0x6f,0xd5,0x2d, 0xa2,0x61,0xdc,0x20,
763*993229b6Sjkunz 	0xf6,0xad,0x76,0x6d, 0xfd,0xa3,0x7f,0x60, 0xe0,0xb1,0x64,0x77, 0xeb,0xbf,0x6d,0x7a,
764*993229b6Sjkunz 	0xda,0x95,0x52,0x59, 0xd1,0x9b,0x5b,0x54, 0xcc,0x89,0x40,0x43, 0xc7,0x87,0x49,0x4e,
765*993229b6Sjkunz 	0xae,0xdd,0x3e,0x05, 0xa5,0xd3,0x37,0x08, 0xb8,0xc1,0x2c,0x1f, 0xb3,0xcf,0x25,0x12,
766*993229b6Sjkunz 	0x82,0xe5,0x1a,0x31, 0x89,0xeb,0x13,0x3c, 0x94,0xf9,0x08,0x2b, 0x9f,0xf7,0x01,0x26,
767*993229b6Sjkunz 	0x46,0x4d,0xe6,0xbd, 0x4d,0x43,0xef,0xb0, 0x50,0x51,0xf4,0xa7, 0x5b,0x5f,0xfd,0xaa,
768*993229b6Sjkunz 	0x6a,0x75,0xc2,0x89, 0x61,0x7b,0xcb,0x84, 0x7c,0x69,0xd0,0x93, 0x77,0x67,0xd9,0x9e,
769*993229b6Sjkunz 	0x1e,0x3d,0xae,0xd5, 0x15,0x33,0xa7,0xd8, 0x08,0x21,0xbc,0xcf, 0x03,0x2f,0xb5,0xc2,
770*993229b6Sjkunz 	0x32,0x05,0x8a,0xe1, 0x39,0x0b,0x83,0xec, 0x24,0x19,0x98,0xfb, 0x2f,0x17,0x91,0xf6,
771*993229b6Sjkunz 	0x8d,0x76,0x4d,0xd6, 0x86,0x78,0x44,0xdb, 0x9b,0x6a,0x5f,0xcc, 0x90,0x64,0x56,0xc1,
772*993229b6Sjkunz 	0xa1,0x4e,0x69,0xe2, 0xaa,0x40,0x60,0xef, 0xb7,0x52,0x7b,0xf8, 0xbc,0x5c,0x72,0xf5,
773*993229b6Sjkunz 	0xd5,0x06,0x05,0xbe, 0xde,0x08,0x0c,0xb3, 0xc3,0x1a,0x17,0xa4, 0xc8,0x14,0x1e,0xa9,
774*993229b6Sjkunz 	0xf9,0x3e,0x21,0x8a, 0xf2,0x30,0x28,0x87, 0xef,0x22,0x33,0x90, 0xe4,0x2c,0x3a,0x9d,
775*993229b6Sjkunz 	0x3d,0x96,0xdd,0x06, 0x36,0x98,0xd4,0x0b, 0x2b,0x8a,0xcf,0x1c, 0x20,0x84,0xc6,0x11,
776*993229b6Sjkunz 	0x11,0xae,0xf9,0x32, 0x1a,0xa0,0xf0,0x3f, 0x07,0xb2,0xeb,0x28, 0x0c,0xbc,0xe2,0x25,
777*993229b6Sjkunz 	0x65,0xe6,0x95,0x6e, 0x6e,0xe8,0x9c,0x63, 0x73,0xfa,0x87,0x74, 0x78,0xf4,0x8e,0x79,
778*993229b6Sjkunz 	0x49,0xde,0xb1,0x5a, 0x42,0xd0,0xb8,0x57, 0x5f,0xc2,0xa3,0x40, 0x54,0xcc,0xaa,0x4d,
779*993229b6Sjkunz 	0xf7,0x41,0xec,0xda, 0xfc,0x4f,0xe5,0xd7, 0xe1,0x5d,0xfe,0xc0, 0xea,0x53,0xf7,0xcd,
780*993229b6Sjkunz 	0xdb,0x79,0xc8,0xee, 0xd0,0x77,0xc1,0xe3, 0xcd,0x65,0xda,0xf4, 0xc6,0x6b,0xd3,0xf9,
781*993229b6Sjkunz 	0xaf,0x31,0xa4,0xb2, 0xa4,0x3f,0xad,0xbf, 0xb9,0x2d,0xb6,0xa8, 0xb2,0x23,0xbf,0xa5,
782*993229b6Sjkunz 	0x83,0x09,0x80,0x86, 0x88,0x07,0x89,0x8b, 0x95,0x15,0x92,0x9c, 0x9e,0x1b,0x9b,0x91,
783*993229b6Sjkunz 	0x47,0xa1,0x7c,0x0a, 0x4c,0xaf,0x75,0x07, 0x51,0xbd,0x6e,0x10, 0x5a,0xb3,0x67,0x1d,
784*993229b6Sjkunz 	0x6b,0x99,0x58,0x3e, 0x60,0x97,0x51,0x33, 0x7d,0x85,0x4a,0x24, 0x76,0x8b,0x43,0x29,
785*993229b6Sjkunz 	0x1f,0xd1,0x34,0x62, 0x14,0xdf,0x3d,0x6f, 0x09,0xcd,0x26,0x78, 0x02,0xc3,0x2f,0x75,
786*993229b6Sjkunz 	0x33,0xe9,0x10,0x56, 0x38,0xe7,0x19,0x5b, 0x25,0xf5,0x02,0x4c, 0x2e,0xfb,0x0b,0x41,
787*993229b6Sjkunz 	0x8c,0x9a,0xd7,0x61, 0x87,0x94,0xde,0x6c, 0x9a,0x86,0xc5,0x7b, 0x91,0x88,0xcc,0x76,
788*993229b6Sjkunz 	0xa0,0xa2,0xf3,0x55, 0xab,0xac,0xfa,0x58, 0xb6,0xbe,0xe1,0x4f, 0xbd,0xb0,0xe8,0x42,
789*993229b6Sjkunz 	0xd4,0xea,0x9f,0x09, 0xdf,0xe4,0x96,0x04, 0xc2,0xf6,0x8d,0x13, 0xc9,0xf8,0x84,0x1e,
790*993229b6Sjkunz 	0xf8,0xd2,0xbb,0x3d, 0xf3,0xdc,0xb2,0x30, 0xee,0xce,0xa9,0x27, 0xe5,0xc0,0xa0,0x2a,
791*993229b6Sjkunz 	0x3c,0x7a,0x47,0xb1, 0x37,0x74,0x4e,0xbc, 0x2a,0x66,0x55,0xab, 0x21,0x68,0x5c,0xa6,
792*993229b6Sjkunz 	0x10,0x42,0x63,0x85, 0x1b,0x4c,0x6a,0x88, 0x06,0x5e,0x71,0x9f, 0x0d,0x50,0x78,0x92,
793*993229b6Sjkunz 	0x64,0x0a,0x0f,0xd9, 0x6f,0x04,0x06,0xd4, 0x72,0x16,0x1d,0xc3, 0x79,0x18,0x14,0xce,
794*993229b6Sjkunz 	0x48,0x32,0x2b,0xed, 0x43,0x3c,0x22,0xe0, 0x5e,0x2e,0x39,0xf7, 0x55,0x20,0x30,0xfa,
795*993229b6Sjkunz 	0x01,0xec,0x9a,0xb7, 0x0a,0xe2,0x93,0xba, 0x17,0xf0,0x88,0xad, 0x1c,0xfe,0x81,0xa0,
796*993229b6Sjkunz 	0x2d,0xd4,0xbe,0x83, 0x26,0xda,0xb7,0x8e, 0x3b,0xc8,0xac,0x99, 0x30,0xc6,0xa5,0x94,
797*993229b6Sjkunz 	0x59,0x9c,0xd2,0xdf, 0x52,0x92,0xdb,0xd2, 0x4f,0x80,0xc0,0xc5, 0x44,0x8e,0xc9,0xc8,
798*993229b6Sjkunz 	0x75,0xa4,0xf6,0xeb, 0x7e,0xaa,0xff,0xe6, 0x63,0xb8,0xe4,0xf1, 0x68,0xb6,0xed,0xfc,
799*993229b6Sjkunz 	0xb1,0x0c,0x0a,0x67, 0xba,0x02,0x03,0x6a, 0xa7,0x10,0x18,0x7d, 0xac,0x1e,0x11,0x70,
800*993229b6Sjkunz 	0x9d,0x34,0x2e,0x53, 0x96,0x3a,0x27,0x5e, 0x8b,0x28,0x3c,0x49, 0x80,0x26,0x35,0x44,
801*993229b6Sjkunz 	0xe9,0x7c,0x42,0x0f, 0xe2,0x72,0x4b,0x02, 0xff,0x60,0x50,0x15, 0xf4,0x6e,0x59,0x18,
802*993229b6Sjkunz 	0xc5,0x44,0x66,0x3b, 0xce,0x4a,0x6f,0x36, 0xd3,0x58,0x74,0x21, 0xd8,0x56,0x7d,0x2c,
803*993229b6Sjkunz 	0x7a,0x37,0xa1,0x0c, 0x71,0x39,0xa8,0x01, 0x6c,0x2b,0xb3,0x16, 0x67,0x25,0xba,0x1b,
804*993229b6Sjkunz 	0x56,0x0f,0x85,0x38, 0x5d,0x01,0x8c,0x35, 0x40,0x13,0x97,0x22, 0x4b,0x1d,0x9e,0x2f,
805*993229b6Sjkunz 	0x22,0x47,0xe9,0x64, 0x29,0x49,0xe0,0x69, 0x34,0x5b,0xfb,0x7e, 0x3f,0x55,0xf2,0x73,
806*993229b6Sjkunz 	0x0e,0x7f,0xcd,0x50, 0x05,0x71,0xc4,0x5d, 0x18,0x63,0xdf,0x4a, 0x13,0x6d,0xd6,0x47,
807*993229b6Sjkunz 	0xca,0xd7,0x31,0xdc, 0xc1,0xd9,0x38,0xd1, 0xdc,0xcb,0x23,0xc6, 0xd7,0xc5,0x2a,0xcb,
808*993229b6Sjkunz 	0xe6,0xef,0x15,0xe8, 0xed,0xe1,0x1c,0xe5, 0xf0,0xf3,0x07,0xf2, 0xfb,0xfd,0x0e,0xff,
809*993229b6Sjkunz 	0x92,0xa7,0x79,0xb4, 0x99,0xa9,0x70,0xb9, 0x84,0xbb,0x6b,0xae, 0x8f,0xb5,0x62,0xa3,
810*993229b6Sjkunz 	0xbe,0x9f,0x5d,0x80, 0xb5,0x91,0x54,0x8d, 0xa8,0x83,0x4f,0x9a, 0xa3,0x8d,0x46,0x97
811*993229b6Sjkunz };
812*993229b6Sjkunz 
813*993229b6Sjkunz static uint8_t U3[256][4]=
814*993229b6Sjkunz {
815*993229b6Sjkunz 	0x00,0x00,0x00,0x00, 0x0d,0x0b,0x0e,0x09, 0x1a,0x16,0x1c,0x12, 0x17,0x1d,0x12,0x1b,
816*993229b6Sjkunz 	0x34,0x2c,0x38,0x24, 0x39,0x27,0x36,0x2d, 0x2e,0x3a,0x24,0x36, 0x23,0x31,0x2a,0x3f,
817*993229b6Sjkunz 	0x68,0x58,0x70,0x48, 0x65,0x53,0x7e,0x41, 0x72,0x4e,0x6c,0x5a, 0x7f,0x45,0x62,0x53,
818*993229b6Sjkunz 	0x5c,0x74,0x48,0x6c, 0x51,0x7f,0x46,0x65, 0x46,0x62,0x54,0x7e, 0x4b,0x69,0x5a,0x77,
819*993229b6Sjkunz 	0xd0,0xb0,0xe0,0x90, 0xdd,0xbb,0xee,0x99, 0xca,0xa6,0xfc,0x82, 0xc7,0xad,0xf2,0x8b,
820*993229b6Sjkunz 	0xe4,0x9c,0xd8,0xb4, 0xe9,0x97,0xd6,0xbd, 0xfe,0x8a,0xc4,0xa6, 0xf3,0x81,0xca,0xaf,
821*993229b6Sjkunz 	0xb8,0xe8,0x90,0xd8, 0xb5,0xe3,0x9e,0xd1, 0xa2,0xfe,0x8c,0xca, 0xaf,0xf5,0x82,0xc3,
822*993229b6Sjkunz 	0x8c,0xc4,0xa8,0xfc, 0x81,0xcf,0xa6,0xf5, 0x96,0xd2,0xb4,0xee, 0x9b,0xd9,0xba,0xe7,
823*993229b6Sjkunz 	0xbb,0x7b,0xdb,0x3b, 0xb6,0x70,0xd5,0x32, 0xa1,0x6d,0xc7,0x29, 0xac,0x66,0xc9,0x20,
824*993229b6Sjkunz 	0x8f,0x57,0xe3,0x1f, 0x82,0x5c,0xed,0x16, 0x95,0x41,0xff,0x0d, 0x98,0x4a,0xf1,0x04,
825*993229b6Sjkunz 	0xd3,0x23,0xab,0x73, 0xde,0x28,0xa5,0x7a, 0xc9,0x35,0xb7,0x61, 0xc4,0x3e,0xb9,0x68,
826*993229b6Sjkunz 	0xe7,0x0f,0x93,0x57, 0xea,0x04,0x9d,0x5e, 0xfd,0x19,0x8f,0x45, 0xf0,0x12,0x81,0x4c,
827*993229b6Sjkunz 	0x6b,0xcb,0x3b,0xab, 0x66,0xc0,0x35,0xa2, 0x71,0xdd,0x27,0xb9, 0x7c,0xd6,0x29,0xb0,
828*993229b6Sjkunz 	0x5f,0xe7,0x03,0x8f, 0x52,0xec,0x0d,0x86, 0x45,0xf1,0x1f,0x9d, 0x48,0xfa,0x11,0x94,
829*993229b6Sjkunz 	0x03,0x93,0x4b,0xe3, 0x0e,0x98,0x45,0xea, 0x19,0x85,0x57,0xf1, 0x14,0x8e,0x59,0xf8,
830*993229b6Sjkunz 	0x37,0xbf,0x73,0xc7, 0x3a,0xb4,0x7d,0xce, 0x2d,0xa9,0x6f,0xd5, 0x20,0xa2,0x61,0xdc,
831*993229b6Sjkunz 	0x6d,0xf6,0xad,0x76, 0x60,0xfd,0xa3,0x7f, 0x77,0xe0,0xb1,0x64, 0x7a,0xeb,0xbf,0x6d,
832*993229b6Sjkunz 	0x59,0xda,0x95,0x52, 0x54,0xd1,0x9b,0x5b, 0x43,0xcc,0x89,0x40, 0x4e,0xc7,0x87,0x49,
833*993229b6Sjkunz 	0x05,0xae,0xdd,0x3e, 0x08,0xa5,0xd3,0x37, 0x1f,0xb8,0xc1,0x2c, 0x12,0xb3,0xcf,0x25,
834*993229b6Sjkunz 	0x31,0x82,0xe5,0x1a, 0x3c,0x89,0xeb,0x13, 0x2b,0x94,0xf9,0x08, 0x26,0x9f,0xf7,0x01,
835*993229b6Sjkunz 	0xbd,0x46,0x4d,0xe6, 0xb0,0x4d,0x43,0xef, 0xa7,0x50,0x51,0xf4, 0xaa,0x5b,0x5f,0xfd,
836*993229b6Sjkunz 	0x89,0x6a,0x75,0xc2, 0x84,0x61,0x7b,0xcb, 0x93,0x7c,0x69,0xd0, 0x9e,0x77,0x67,0xd9,
837*993229b6Sjkunz 	0xd5,0x1e,0x3d,0xae, 0xd8,0x15,0x33,0xa7, 0xcf,0x08,0x21,0xbc, 0xc2,0x03,0x2f,0xb5,
838*993229b6Sjkunz 	0xe1,0x32,0x05,0x8a, 0xec,0x39,0x0b,0x83, 0xfb,0x24,0x19,0x98, 0xf6,0x2f,0x17,0x91,
839*993229b6Sjkunz 	0xd6,0x8d,0x76,0x4d, 0xdb,0x86,0x78,0x44, 0xcc,0x9b,0x6a,0x5f, 0xc1,0x90,0x64,0x56,
840*993229b6Sjkunz 	0xe2,0xa1,0x4e,0x69, 0xef,0xaa,0x40,0x60, 0xf8,0xb7,0x52,0x7b, 0xf5,0xbc,0x5c,0x72,
841*993229b6Sjkunz 	0xbe,0xd5,0x06,0x05, 0xb3,0xde,0x08,0x0c, 0xa4,0xc3,0x1a,0x17, 0xa9,0xc8,0x14,0x1e,
842*993229b6Sjkunz 	0x8a,0xf9,0x3e,0x21, 0x87,0xf2,0x30,0x28, 0x90,0xef,0x22,0x33, 0x9d,0xe4,0x2c,0x3a,
843*993229b6Sjkunz 	0x06,0x3d,0x96,0xdd, 0x0b,0x36,0x98,0xd4, 0x1c,0x2b,0x8a,0xcf, 0x11,0x20,0x84,0xc6,
844*993229b6Sjkunz 	0x32,0x11,0xae,0xf9, 0x3f,0x1a,0xa0,0xf0, 0x28,0x07,0xb2,0xeb, 0x25,0x0c,0xbc,0xe2,
845*993229b6Sjkunz 	0x6e,0x65,0xe6,0x95, 0x63,0x6e,0xe8,0x9c, 0x74,0x73,0xfa,0x87, 0x79,0x78,0xf4,0x8e,
846*993229b6Sjkunz 	0x5a,0x49,0xde,0xb1, 0x57,0x42,0xd0,0xb8, 0x40,0x5f,0xc2,0xa3, 0x4d,0x54,0xcc,0xaa,
847*993229b6Sjkunz 	0xda,0xf7,0x41,0xec, 0xd7,0xfc,0x4f,0xe5, 0xc0,0xe1,0x5d,0xfe, 0xcd,0xea,0x53,0xf7,
848*993229b6Sjkunz 	0xee,0xdb,0x79,0xc8, 0xe3,0xd0,0x77,0xc1, 0xf4,0xcd,0x65,0xda, 0xf9,0xc6,0x6b,0xd3,
849*993229b6Sjkunz 	0xb2,0xaf,0x31,0xa4, 0xbf,0xa4,0x3f,0xad, 0xa8,0xb9,0x2d,0xb6, 0xa5,0xb2,0x23,0xbf,
850*993229b6Sjkunz 	0x86,0x83,0x09,0x80, 0x8b,0x88,0x07,0x89, 0x9c,0x95,0x15,0x92, 0x91,0x9e,0x1b,0x9b,
851*993229b6Sjkunz 	0x0a,0x47,0xa1,0x7c, 0x07,0x4c,0xaf,0x75, 0x10,0x51,0xbd,0x6e, 0x1d,0x5a,0xb3,0x67,
852*993229b6Sjkunz 	0x3e,0x6b,0x99,0x58, 0x33,0x60,0x97,0x51, 0x24,0x7d,0x85,0x4a, 0x29,0x76,0x8b,0x43,
853*993229b6Sjkunz 	0x62,0x1f,0xd1,0x34, 0x6f,0x14,0xdf,0x3d, 0x78,0x09,0xcd,0x26, 0x75,0x02,0xc3,0x2f,
854*993229b6Sjkunz 	0x56,0x33,0xe9,0x10, 0x5b,0x38,0xe7,0x19, 0x4c,0x25,0xf5,0x02, 0x41,0x2e,0xfb,0x0b,
855*993229b6Sjkunz 	0x61,0x8c,0x9a,0xd7, 0x6c,0x87,0x94,0xde, 0x7b,0x9a,0x86,0xc5, 0x76,0x91,0x88,0xcc,
856*993229b6Sjkunz 	0x55,0xa0,0xa2,0xf3, 0x58,0xab,0xac,0xfa, 0x4f,0xb6,0xbe,0xe1, 0x42,0xbd,0xb0,0xe8,
857*993229b6Sjkunz 	0x09,0xd4,0xea,0x9f, 0x04,0xdf,0xe4,0x96, 0x13,0xc2,0xf6,0x8d, 0x1e,0xc9,0xf8,0x84,
858*993229b6Sjkunz 	0x3d,0xf8,0xd2,0xbb, 0x30,0xf3,0xdc,0xb2, 0x27,0xee,0xce,0xa9, 0x2a,0xe5,0xc0,0xa0,
859*993229b6Sjkunz 	0xb1,0x3c,0x7a,0x47, 0xbc,0x37,0x74,0x4e, 0xab,0x2a,0x66,0x55, 0xa6,0x21,0x68,0x5c,
860*993229b6Sjkunz 	0x85,0x10,0x42,0x63, 0x88,0x1b,0x4c,0x6a, 0x9f,0x06,0x5e,0x71, 0x92,0x0d,0x50,0x78,
861*993229b6Sjkunz 	0xd9,0x64,0x0a,0x0f, 0xd4,0x6f,0x04,0x06, 0xc3,0x72,0x16,0x1d, 0xce,0x79,0x18,0x14,
862*993229b6Sjkunz 	0xed,0x48,0x32,0x2b, 0xe0,0x43,0x3c,0x22, 0xf7,0x5e,0x2e,0x39, 0xfa,0x55,0x20,0x30,
863*993229b6Sjkunz 	0xb7,0x01,0xec,0x9a, 0xba,0x0a,0xe2,0x93, 0xad,0x17,0xf0,0x88, 0xa0,0x1c,0xfe,0x81,
864*993229b6Sjkunz 	0x83,0x2d,0xd4,0xbe, 0x8e,0x26,0xda,0xb7, 0x99,0x3b,0xc8,0xac, 0x94,0x30,0xc6,0xa5,
865*993229b6Sjkunz 	0xdf,0x59,0x9c,0xd2, 0xd2,0x52,0x92,0xdb, 0xc5,0x4f,0x80,0xc0, 0xc8,0x44,0x8e,0xc9,
866*993229b6Sjkunz 	0xeb,0x75,0xa4,0xf6, 0xe6,0x7e,0xaa,0xff, 0xf1,0x63,0xb8,0xe4, 0xfc,0x68,0xb6,0xed,
867*993229b6Sjkunz 	0x67,0xb1,0x0c,0x0a, 0x6a,0xba,0x02,0x03, 0x7d,0xa7,0x10,0x18, 0x70,0xac,0x1e,0x11,
868*993229b6Sjkunz 	0x53,0x9d,0x34,0x2e, 0x5e,0x96,0x3a,0x27, 0x49,0x8b,0x28,0x3c, 0x44,0x80,0x26,0x35,
869*993229b6Sjkunz 	0x0f,0xe9,0x7c,0x42, 0x02,0xe2,0x72,0x4b, 0x15,0xff,0x60,0x50, 0x18,0xf4,0x6e,0x59,
870*993229b6Sjkunz 	0x3b,0xc5,0x44,0x66, 0x36,0xce,0x4a,0x6f, 0x21,0xd3,0x58,0x74, 0x2c,0xd8,0x56,0x7d,
871*993229b6Sjkunz 	0x0c,0x7a,0x37,0xa1, 0x01,0x71,0x39,0xa8, 0x16,0x6c,0x2b,0xb3, 0x1b,0x67,0x25,0xba,
872*993229b6Sjkunz 	0x38,0x56,0x0f,0x85, 0x35,0x5d,0x01,0x8c, 0x22,0x40,0x13,0x97, 0x2f,0x4b,0x1d,0x9e,
873*993229b6Sjkunz 	0x64,0x22,0x47,0xe9, 0x69,0x29,0x49,0xe0, 0x7e,0x34,0x5b,0xfb, 0x73,0x3f,0x55,0xf2,
874*993229b6Sjkunz 	0x50,0x0e,0x7f,0xcd, 0x5d,0x05,0x71,0xc4, 0x4a,0x18,0x63,0xdf, 0x47,0x13,0x6d,0xd6,
875*993229b6Sjkunz 	0xdc,0xca,0xd7,0x31, 0xd1,0xc1,0xd9,0x38, 0xc6,0xdc,0xcb,0x23, 0xcb,0xd7,0xc5,0x2a,
876*993229b6Sjkunz 	0xe8,0xe6,0xef,0x15, 0xe5,0xed,0xe1,0x1c, 0xf2,0xf0,0xf3,0x07, 0xff,0xfb,0xfd,0x0e,
877*993229b6Sjkunz 	0xb4,0x92,0xa7,0x79, 0xb9,0x99,0xa9,0x70, 0xae,0x84,0xbb,0x6b, 0xa3,0x8f,0xb5,0x62,
878*993229b6Sjkunz 	0x80,0xbe,0x9f,0x5d, 0x8d,0xb5,0x91,0x54, 0x9a,0xa8,0x83,0x4f, 0x97,0xa3,0x8d,0x46
879*993229b6Sjkunz };
880*993229b6Sjkunz 
881*993229b6Sjkunz static uint8_t U4[256][4]=
882*993229b6Sjkunz {
883*993229b6Sjkunz 	0x00,0x00,0x00,0x00, 0x09,0x0d,0x0b,0x0e, 0x12,0x1a,0x16,0x1c, 0x1b,0x17,0x1d,0x12,
884*993229b6Sjkunz 	0x24,0x34,0x2c,0x38, 0x2d,0x39,0x27,0x36, 0x36,0x2e,0x3a,0x24, 0x3f,0x23,0x31,0x2a,
885*993229b6Sjkunz 	0x48,0x68,0x58,0x70, 0x41,0x65,0x53,0x7e, 0x5a,0x72,0x4e,0x6c, 0x53,0x7f,0x45,0x62,
886*993229b6Sjkunz 	0x6c,0x5c,0x74,0x48, 0x65,0x51,0x7f,0x46, 0x7e,0x46,0x62,0x54, 0x77,0x4b,0x69,0x5a,
887*993229b6Sjkunz 	0x90,0xd0,0xb0,0xe0, 0x99,0xdd,0xbb,0xee, 0x82,0xca,0xa6,0xfc, 0x8b,0xc7,0xad,0xf2,
888*993229b6Sjkunz 	0xb4,0xe4,0x9c,0xd8, 0xbd,0xe9,0x97,0xd6, 0xa6,0xfe,0x8a,0xc4, 0xaf,0xf3,0x81,0xca,
889*993229b6Sjkunz 	0xd8,0xb8,0xe8,0x90, 0xd1,0xb5,0xe3,0x9e, 0xca,0xa2,0xfe,0x8c, 0xc3,0xaf,0xf5,0x82,
890*993229b6Sjkunz 	0xfc,0x8c,0xc4,0xa8, 0xf5,0x81,0xcf,0xa6, 0xee,0x96,0xd2,0xb4, 0xe7,0x9b,0xd9,0xba,
891*993229b6Sjkunz 	0x3b,0xbb,0x7b,0xdb, 0x32,0xb6,0x70,0xd5, 0x29,0xa1,0x6d,0xc7, 0x20,0xac,0x66,0xc9,
892*993229b6Sjkunz 	0x1f,0x8f,0x57,0xe3, 0x16,0x82,0x5c,0xed, 0x0d,0x95,0x41,0xff, 0x04,0x98,0x4a,0xf1,
893*993229b6Sjkunz 	0x73,0xd3,0x23,0xab, 0x7a,0xde,0x28,0xa5, 0x61,0xc9,0x35,0xb7, 0x68,0xc4,0x3e,0xb9,
894*993229b6Sjkunz 	0x57,0xe7,0x0f,0x93, 0x5e,0xea,0x04,0x9d, 0x45,0xfd,0x19,0x8f, 0x4c,0xf0,0x12,0x81,
895*993229b6Sjkunz 	0xab,0x6b,0xcb,0x3b, 0xa2,0x66,0xc0,0x35, 0xb9,0x71,0xdd,0x27, 0xb0,0x7c,0xd6,0x29,
896*993229b6Sjkunz 	0x8f,0x5f,0xe7,0x03, 0x86,0x52,0xec,0x0d, 0x9d,0x45,0xf1,0x1f, 0x94,0x48,0xfa,0x11,
897*993229b6Sjkunz 	0xe3,0x03,0x93,0x4b, 0xea,0x0e,0x98,0x45, 0xf1,0x19,0x85,0x57, 0xf8,0x14,0x8e,0x59,
898*993229b6Sjkunz 	0xc7,0x37,0xbf,0x73, 0xce,0x3a,0xb4,0x7d, 0xd5,0x2d,0xa9,0x6f, 0xdc,0x20,0xa2,0x61,
899*993229b6Sjkunz 	0x76,0x6d,0xf6,0xad, 0x7f,0x60,0xfd,0xa3, 0x64,0x77,0xe0,0xb1, 0x6d,0x7a,0xeb,0xbf,
900*993229b6Sjkunz 	0x52,0x59,0xda,0x95, 0x5b,0x54,0xd1,0x9b, 0x40,0x43,0xcc,0x89, 0x49,0x4e,0xc7,0x87,
901*993229b6Sjkunz 	0x3e,0x05,0xae,0xdd, 0x37,0x08,0xa5,0xd3, 0x2c,0x1f,0xb8,0xc1, 0x25,0x12,0xb3,0xcf,
902*993229b6Sjkunz 	0x1a,0x31,0x82,0xe5, 0x13,0x3c,0x89,0xeb, 0x08,0x2b,0x94,0xf9, 0x01,0x26,0x9f,0xf7,
903*993229b6Sjkunz 	0xe6,0xbd,0x46,0x4d, 0xef,0xb0,0x4d,0x43, 0xf4,0xa7,0x50,0x51, 0xfd,0xaa,0x5b,0x5f,
904*993229b6Sjkunz 	0xc2,0x89,0x6a,0x75, 0xcb,0x84,0x61,0x7b, 0xd0,0x93,0x7c,0x69, 0xd9,0x9e,0x77,0x67,
905*993229b6Sjkunz 	0xae,0xd5,0x1e,0x3d, 0xa7,0xd8,0x15,0x33, 0xbc,0xcf,0x08,0x21, 0xb5,0xc2,0x03,0x2f,
906*993229b6Sjkunz 	0x8a,0xe1,0x32,0x05, 0x83,0xec,0x39,0x0b, 0x98,0xfb,0x24,0x19, 0x91,0xf6,0x2f,0x17,
907*993229b6Sjkunz 	0x4d,0xd6,0x8d,0x76, 0x44,0xdb,0x86,0x78, 0x5f,0xcc,0x9b,0x6a, 0x56,0xc1,0x90,0x64,
908*993229b6Sjkunz 	0x69,0xe2,0xa1,0x4e, 0x60,0xef,0xaa,0x40, 0x7b,0xf8,0xb7,0x52, 0x72,0xf5,0xbc,0x5c,
909*993229b6Sjkunz 	0x05,0xbe,0xd5,0x06, 0x0c,0xb3,0xde,0x08, 0x17,0xa4,0xc3,0x1a, 0x1e,0xa9,0xc8,0x14,
910*993229b6Sjkunz 	0x21,0x8a,0xf9,0x3e, 0x28,0x87,0xf2,0x30, 0x33,0x90,0xef,0x22, 0x3a,0x9d,0xe4,0x2c,
911*993229b6Sjkunz 	0xdd,0x06,0x3d,0x96, 0xd4,0x0b,0x36,0x98, 0xcf,0x1c,0x2b,0x8a, 0xc6,0x11,0x20,0x84,
912*993229b6Sjkunz 	0xf9,0x32,0x11,0xae, 0xf0,0x3f,0x1a,0xa0, 0xeb,0x28,0x07,0xb2, 0xe2,0x25,0x0c,0xbc,
913*993229b6Sjkunz 	0x95,0x6e,0x65,0xe6, 0x9c,0x63,0x6e,0xe8, 0x87,0x74,0x73,0xfa, 0x8e,0x79,0x78,0xf4,
914*993229b6Sjkunz 	0xb1,0x5a,0x49,0xde, 0xb8,0x57,0x42,0xd0, 0xa3,0x40,0x5f,0xc2, 0xaa,0x4d,0x54,0xcc,
915*993229b6Sjkunz 	0xec,0xda,0xf7,0x41, 0xe5,0xd7,0xfc,0x4f, 0xfe,0xc0,0xe1,0x5d, 0xf7,0xcd,0xea,0x53,
916*993229b6Sjkunz 	0xc8,0xee,0xdb,0x79, 0xc1,0xe3,0xd0,0x77, 0xda,0xf4,0xcd,0x65, 0xd3,0xf9,0xc6,0x6b,
917*993229b6Sjkunz 	0xa4,0xb2,0xaf,0x31, 0xad,0xbf,0xa4,0x3f, 0xb6,0xa8,0xb9,0x2d, 0xbf,0xa5,0xb2,0x23,
918*993229b6Sjkunz 	0x80,0x86,0x83,0x09, 0x89,0x8b,0x88,0x07, 0x92,0x9c,0x95,0x15, 0x9b,0x91,0x9e,0x1b,
919*993229b6Sjkunz 	0x7c,0x0a,0x47,0xa1, 0x75,0x07,0x4c,0xaf, 0x6e,0x10,0x51,0xbd, 0x67,0x1d,0x5a,0xb3,
920*993229b6Sjkunz 	0x58,0x3e,0x6b,0x99, 0x51,0x33,0x60,0x97, 0x4a,0x24,0x7d,0x85, 0x43,0x29,0x76,0x8b,
921*993229b6Sjkunz 	0x34,0x62,0x1f,0xd1, 0x3d,0x6f,0x14,0xdf, 0x26,0x78,0x09,0xcd, 0x2f,0x75,0x02,0xc3,
922*993229b6Sjkunz 	0x10,0x56,0x33,0xe9, 0x19,0x5b,0x38,0xe7, 0x02,0x4c,0x25,0xf5, 0x0b,0x41,0x2e,0xfb,
923*993229b6Sjkunz 	0xd7,0x61,0x8c,0x9a, 0xde,0x6c,0x87,0x94, 0xc5,0x7b,0x9a,0x86, 0xcc,0x76,0x91,0x88,
924*993229b6Sjkunz 	0xf3,0x55,0xa0,0xa2, 0xfa,0x58,0xab,0xac, 0xe1,0x4f,0xb6,0xbe, 0xe8,0x42,0xbd,0xb0,
925*993229b6Sjkunz 	0x9f,0x09,0xd4,0xea, 0x96,0x04,0xdf,0xe4, 0x8d,0x13,0xc2,0xf6, 0x84,0x1e,0xc9,0xf8,
926*993229b6Sjkunz 	0xbb,0x3d,0xf8,0xd2, 0xb2,0x30,0xf3,0xdc, 0xa9,0x27,0xee,0xce, 0xa0,0x2a,0xe5,0xc0,
927*993229b6Sjkunz 	0x47,0xb1,0x3c,0x7a, 0x4e,0xbc,0x37,0x74, 0x55,0xab,0x2a,0x66, 0x5c,0xa6,0x21,0x68,
928*993229b6Sjkunz 	0x63,0x85,0x10,0x42, 0x6a,0x88,0x1b,0x4c, 0x71,0x9f,0x06,0x5e, 0x78,0x92,0x0d,0x50,
929*993229b6Sjkunz 	0x0f,0xd9,0x64,0x0a, 0x06,0xd4,0x6f,0x04, 0x1d,0xc3,0x72,0x16, 0x14,0xce,0x79,0x18,
930*993229b6Sjkunz 	0x2b,0xed,0x48,0x32, 0x22,0xe0,0x43,0x3c, 0x39,0xf7,0x5e,0x2e, 0x30,0xfa,0x55,0x20,
931*993229b6Sjkunz 	0x9a,0xb7,0x01,0xec, 0x93,0xba,0x0a,0xe2, 0x88,0xad,0x17,0xf0, 0x81,0xa0,0x1c,0xfe,
932*993229b6Sjkunz 	0xbe,0x83,0x2d,0xd4, 0xb7,0x8e,0x26,0xda, 0xac,0x99,0x3b,0xc8, 0xa5,0x94,0x30,0xc6,
933*993229b6Sjkunz 	0xd2,0xdf,0x59,0x9c, 0xdb,0xd2,0x52,0x92, 0xc0,0xc5,0x4f,0x80, 0xc9,0xc8,0x44,0x8e,
934*993229b6Sjkunz 	0xf6,0xeb,0x75,0xa4, 0xff,0xe6,0x7e,0xaa, 0xe4,0xf1,0x63,0xb8, 0xed,0xfc,0x68,0xb6,
935*993229b6Sjkunz 	0x0a,0x67,0xb1,0x0c, 0x03,0x6a,0xba,0x02, 0x18,0x7d,0xa7,0x10, 0x11,0x70,0xac,0x1e,
936*993229b6Sjkunz 	0x2e,0x53,0x9d,0x34, 0x27,0x5e,0x96,0x3a, 0x3c,0x49,0x8b,0x28, 0x35,0x44,0x80,0x26,
937*993229b6Sjkunz 	0x42,0x0f,0xe9,0x7c, 0x4b,0x02,0xe2,0x72, 0x50,0x15,0xff,0x60, 0x59,0x18,0xf4,0x6e,
938*993229b6Sjkunz 	0x66,0x3b,0xc5,0x44, 0x6f,0x36,0xce,0x4a, 0x74,0x21,0xd3,0x58, 0x7d,0x2c,0xd8,0x56,
939*993229b6Sjkunz 	0xa1,0x0c,0x7a,0x37, 0xa8,0x01,0x71,0x39, 0xb3,0x16,0x6c,0x2b, 0xba,0x1b,0x67,0x25,
940*993229b6Sjkunz 	0x85,0x38,0x56,0x0f, 0x8c,0x35,0x5d,0x01, 0x97,0x22,0x40,0x13, 0x9e,0x2f,0x4b,0x1d,
941*993229b6Sjkunz 	0xe9,0x64,0x22,0x47, 0xe0,0x69,0x29,0x49, 0xfb,0x7e,0x34,0x5b, 0xf2,0x73,0x3f,0x55,
942*993229b6Sjkunz 	0xcd,0x50,0x0e,0x7f, 0xc4,0x5d,0x05,0x71, 0xdf,0x4a,0x18,0x63, 0xd6,0x47,0x13,0x6d,
943*993229b6Sjkunz 	0x31,0xdc,0xca,0xd7, 0x38,0xd1,0xc1,0xd9, 0x23,0xc6,0xdc,0xcb, 0x2a,0xcb,0xd7,0xc5,
944*993229b6Sjkunz 	0x15,0xe8,0xe6,0xef, 0x1c,0xe5,0xed,0xe1, 0x07,0xf2,0xf0,0xf3, 0x0e,0xff,0xfb,0xfd,
945*993229b6Sjkunz 	0x79,0xb4,0x92,0xa7, 0x70,0xb9,0x99,0xa9, 0x6b,0xae,0x84,0xbb, 0x62,0xa3,0x8f,0xb5,
946*993229b6Sjkunz 	0x5d,0x80,0xbe,0x9f, 0x54,0x8d,0xb5,0x91, 0x4f,0x9a,0xa8,0x83, 0x46,0x97,0xa3,0x8d
947*993229b6Sjkunz };
948*993229b6Sjkunz 
949*993229b6Sjkunz static uint32_t rcon[30]=
950*993229b6Sjkunz {
951*993229b6Sjkunz 	0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
952*993229b6Sjkunz 	0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
953*993229b6Sjkunz 	0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
954*993229b6Sjkunz 	0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4,
955*993229b6Sjkunz 	0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91
956*993229b6Sjkunz };
957*993229b6Sjkunz 
958*993229b6Sjkunz 
959*993229b6Sjkunz 
960*993229b6Sjkunz //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
961*993229b6Sjkunz // API
962*993229b6Sjkunz //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
963*993229b6Sjkunz 
Rijndael()964*993229b6Sjkunz Rijndael::Rijndael()
965*993229b6Sjkunz {
966*993229b6Sjkunz 	 m_state = Invalid;
967*993229b6Sjkunz }
968*993229b6Sjkunz 
~Rijndael()969*993229b6Sjkunz Rijndael::~Rijndael()
970*993229b6Sjkunz {
971*993229b6Sjkunz 	// nothing here
972*993229b6Sjkunz }
973*993229b6Sjkunz 
init(Mode mode,Direction dir,const uint8_t * key,KeyLength keyLen,uint8_t * initVector)974*993229b6Sjkunz int Rijndael::init(Mode mode,Direction dir,const uint8_t * key,KeyLength keyLen,uint8_t * initVector)
975*993229b6Sjkunz {
976*993229b6Sjkunz 	// Not initialized yet
977*993229b6Sjkunz 	m_state = Invalid;
978*993229b6Sjkunz 
979*993229b6Sjkunz 	// Check the mode
980*993229b6Sjkunz 	if((mode != CBC) && (mode != ECB) && (mode != CFB1))return RIJNDAEL_UNSUPPORTED_MODE;
981*993229b6Sjkunz 	m_mode = mode;
982*993229b6Sjkunz 
983*993229b6Sjkunz 	// And the direction
984*993229b6Sjkunz 	if((dir != Encrypt) && (dir != Decrypt))return RIJNDAEL_UNSUPPORTED_DIRECTION;
985*993229b6Sjkunz 	m_direction = dir;
986*993229b6Sjkunz 
987*993229b6Sjkunz 	// Allow to set an init vector
988*993229b6Sjkunz 	if(initVector)
989*993229b6Sjkunz 	{
990*993229b6Sjkunz 		// specified init vector
991*993229b6Sjkunz 		for(int i = 0;i < MAX_IV_SIZE;i++)
992*993229b6Sjkunz 		{
993*993229b6Sjkunz 			m_initVector[i] = initVector[i];
994*993229b6Sjkunz 		}
995*993229b6Sjkunz 	} else {
996*993229b6Sjkunz 		// zero init vector
997*993229b6Sjkunz 		for(int i = 0;i < MAX_IV_SIZE;i++)
998*993229b6Sjkunz 		{
999*993229b6Sjkunz 			m_initVector[i] = 0;
1000*993229b6Sjkunz 		}
1001*993229b6Sjkunz 	}
1002*993229b6Sjkunz 
1003*993229b6Sjkunz 	uint32_t uKeyLenInBytes;
1004*993229b6Sjkunz 
1005*993229b6Sjkunz 	// And check the key length
1006*993229b6Sjkunz 	switch(keyLen)
1007*993229b6Sjkunz 	{
1008*993229b6Sjkunz 		case Key16Bytes:
1009*993229b6Sjkunz 			uKeyLenInBytes = 16;
1010*993229b6Sjkunz 			m_uRounds = 10;
1011*993229b6Sjkunz 		break;
1012*993229b6Sjkunz 		case Key24Bytes:
1013*993229b6Sjkunz 			uKeyLenInBytes = 24;
1014*993229b6Sjkunz 			m_uRounds = 12;
1015*993229b6Sjkunz 		break;
1016*993229b6Sjkunz 		case Key32Bytes:
1017*993229b6Sjkunz 			uKeyLenInBytes = 32;
1018*993229b6Sjkunz 			m_uRounds = 14;
1019*993229b6Sjkunz 		break;
1020*993229b6Sjkunz 		default:
1021*993229b6Sjkunz 			return RIJNDAEL_UNSUPPORTED_KEY_LENGTH;
1022*993229b6Sjkunz 		break;
1023*993229b6Sjkunz 	}
1024*993229b6Sjkunz 	// The number of rounds is calculated as
1025*993229b6Sjkunz 	// m_uRounds = (m_uKeyLenInBits / 32) + 6;
1026*993229b6Sjkunz 
1027*993229b6Sjkunz 	if(!key)return RIJNDAEL_BAD_KEY;
1028*993229b6Sjkunz 
1029*993229b6Sjkunz 	uint8_t keyMatrix[_MAX_KEY_COLUMNS][4];
1030*993229b6Sjkunz 
1031*993229b6Sjkunz 	for(uint32_t i = 0;i < uKeyLenInBytes;i++)keyMatrix[i >> 2][i & 3] = key[i];
1032*993229b6Sjkunz 
1033*993229b6Sjkunz 	keySched(keyMatrix);
1034*993229b6Sjkunz 
1035*993229b6Sjkunz 	if(m_direction == Decrypt)keyEncToDec();
1036*993229b6Sjkunz 
1037*993229b6Sjkunz 	m_state = Valid;
1038*993229b6Sjkunz 
1039*993229b6Sjkunz 	return RIJNDAEL_SUCCESS;
1040*993229b6Sjkunz }
1041*993229b6Sjkunz 
blockEncrypt(const uint8_t * input,int inputLen,uint8_t * outBuffer)1042*993229b6Sjkunz int Rijndael::blockEncrypt(const uint8_t *input,int inputLen,uint8_t *outBuffer)
1043*993229b6Sjkunz {
1044*993229b6Sjkunz 	int i, k, numBlocks;
1045*993229b6Sjkunz 	uint8_t block[16], iv[4][4];
1046*993229b6Sjkunz 
1047*993229b6Sjkunz 	if(m_state != Valid)return RIJNDAEL_NOT_INITIALIZED;
1048*993229b6Sjkunz 	if(m_direction != Encrypt)return RIJNDAEL_BAD_DIRECTION;
1049*993229b6Sjkunz 
1050*993229b6Sjkunz 	if(input == 0 || inputLen <= 0)return 0;
1051*993229b6Sjkunz 
1052*993229b6Sjkunz 	numBlocks = inputLen/128;
1053*993229b6Sjkunz 
1054*993229b6Sjkunz 	switch(m_mode){
1055*993229b6Sjkunz 		case ECB:
1056*993229b6Sjkunz 			for(i = numBlocks;i > 0;i--)
1057*993229b6Sjkunz 			{
1058*993229b6Sjkunz 				encrypt(input,outBuffer);
1059*993229b6Sjkunz 				input += 16;
1060*993229b6Sjkunz 				outBuffer += 16;
1061*993229b6Sjkunz 			}
1062*993229b6Sjkunz 		break;
1063*993229b6Sjkunz 		case CBC:
1064*993229b6Sjkunz 			((uint32_t*)block)[0] = ((uint32_t*)m_initVector)[0] ^ ((uint32_t*)input)[0];
1065*993229b6Sjkunz 			((uint32_t*)block)[1] = ((uint32_t*)m_initVector)[1] ^ ((uint32_t*)input)[1];
1066*993229b6Sjkunz 			((uint32_t*)block)[2] = ((uint32_t*)m_initVector)[2] ^ ((uint32_t*)input)[2];
1067*993229b6Sjkunz 			((uint32_t*)block)[3] = ((uint32_t*)m_initVector)[3] ^ ((uint32_t*)input)[3];
1068*993229b6Sjkunz 			encrypt(block,outBuffer);
1069*993229b6Sjkunz 			input += 16;
1070*993229b6Sjkunz 			for(i = numBlocks - 1;i > 0;i--)
1071*993229b6Sjkunz 			{
1072*993229b6Sjkunz 				((uint32_t*)block)[0] = ((uint32_t*)outBuffer)[0] ^ ((uint32_t*)input)[0];
1073*993229b6Sjkunz 				((uint32_t*)block)[1] = ((uint32_t*)outBuffer)[1] ^ ((uint32_t*)input)[1];
1074*993229b6Sjkunz 				((uint32_t*)block)[2] = ((uint32_t*)outBuffer)[2] ^ ((uint32_t*)input)[2];
1075*993229b6Sjkunz 				((uint32_t*)block)[3] = ((uint32_t*)outBuffer)[3] ^ ((uint32_t*)input)[3];
1076*993229b6Sjkunz 				outBuffer += 16;
1077*993229b6Sjkunz 				encrypt(block,outBuffer);
1078*993229b6Sjkunz 				input += 16;
1079*993229b6Sjkunz 			}
1080*993229b6Sjkunz 		break;
1081*993229b6Sjkunz 		case CFB1:
1082*993229b6Sjkunz #if STRICT_ALIGN
1083*993229b6Sjkunz 			memcpy(iv,m_initVector,16);
1084*993229b6Sjkunz #else  /* !STRICT_ALIGN */
1085*993229b6Sjkunz 			*((uint32_t*)iv[0]) = *((uint32_t*)(m_initVector   ));
1086*993229b6Sjkunz 			*((uint32_t*)iv[1]) = *((uint32_t*)(m_initVector + 4));
1087*993229b6Sjkunz 			*((uint32_t*)iv[2]) = *((uint32_t*)(m_initVector + 8));
1088*993229b6Sjkunz 			*((uint32_t*)iv[3]) = *((uint32_t*)(m_initVector +12));
1089*993229b6Sjkunz #endif /* ?STRICT_ALIGN */
1090*993229b6Sjkunz 			for(i = numBlocks; i > 0; i--)
1091*993229b6Sjkunz 			{
1092*993229b6Sjkunz 				for(k = 0; k < 128; k++)
1093*993229b6Sjkunz 				{
1094*993229b6Sjkunz 					*((uint32_t*) block    ) = *((uint32_t*)iv[0]);
1095*993229b6Sjkunz 					*((uint32_t*)(block+ 4)) = *((uint32_t*)iv[1]);
1096*993229b6Sjkunz 					*((uint32_t*)(block+ 8)) = *((uint32_t*)iv[2]);
1097*993229b6Sjkunz 					*((uint32_t*)(block+12)) = *((uint32_t*)iv[3]);
1098*993229b6Sjkunz 					encrypt(block,block);
1099*993229b6Sjkunz 					outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7);
1100*993229b6Sjkunz 					iv[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7);
1101*993229b6Sjkunz 					iv[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7);
1102*993229b6Sjkunz 					iv[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7);
1103*993229b6Sjkunz 					iv[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7);
1104*993229b6Sjkunz 					iv[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7);
1105*993229b6Sjkunz 					iv[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7);
1106*993229b6Sjkunz 					iv[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7);
1107*993229b6Sjkunz 					iv[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7);
1108*993229b6Sjkunz 					iv[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7);
1109*993229b6Sjkunz 					iv[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7);
1110*993229b6Sjkunz 					iv[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7);
1111*993229b6Sjkunz 					iv[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7);
1112*993229b6Sjkunz 					iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);
1113*993229b6Sjkunz 					iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);
1114*993229b6Sjkunz 					iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);
1115*993229b6Sjkunz 					iv[3][3] = (iv[3][3] << 1) | (outBuffer[k/8] >> (7-(k&7))) & 1;
1116*993229b6Sjkunz 				}
1117*993229b6Sjkunz 			}
1118*993229b6Sjkunz 		break;
1119*993229b6Sjkunz 		default:
1120*993229b6Sjkunz 			return -1;
1121*993229b6Sjkunz 		break;
1122*993229b6Sjkunz 	}
1123*993229b6Sjkunz 
1124*993229b6Sjkunz 	return 128 * numBlocks;
1125*993229b6Sjkunz }
1126*993229b6Sjkunz 
padEncrypt(const uint8_t * input,int inputOctets,uint8_t * outBuffer)1127*993229b6Sjkunz int Rijndael::padEncrypt(const uint8_t *input, int inputOctets, uint8_t *outBuffer)
1128*993229b6Sjkunz {
1129*993229b6Sjkunz 	int i, numBlocks, padLen;
1130*993229b6Sjkunz 	uint8_t block[16], *iv;
1131*993229b6Sjkunz 
1132*993229b6Sjkunz 	if(m_state != Valid)return RIJNDAEL_NOT_INITIALIZED;
1133*993229b6Sjkunz 	if(m_direction != Encrypt)return RIJNDAEL_NOT_INITIALIZED;
1134*993229b6Sjkunz 
1135*993229b6Sjkunz 	if(input == 0 || inputOctets <= 0)return 0;
1136*993229b6Sjkunz 
1137*993229b6Sjkunz 	numBlocks = inputOctets/16;
1138*993229b6Sjkunz 
1139*993229b6Sjkunz 	switch(m_mode)
1140*993229b6Sjkunz 	{
1141*993229b6Sjkunz 		case ECB:
1142*993229b6Sjkunz 			for(i = numBlocks; i > 0; i--)
1143*993229b6Sjkunz 			{
1144*993229b6Sjkunz 				encrypt(input, outBuffer);
1145*993229b6Sjkunz 				input += 16;
1146*993229b6Sjkunz 				outBuffer += 16;
1147*993229b6Sjkunz 			}
1148*993229b6Sjkunz 			padLen = 16 - (inputOctets - 16*numBlocks);
1149*993229b6Sjkunz //			assert(padLen > 0 && padLen <= 16);
1150*993229b6Sjkunz 			memcpy(block, input, 16 - padLen);
1151*993229b6Sjkunz 			memset(block + 16 - padLen, padLen, padLen);
1152*993229b6Sjkunz 			encrypt(block,outBuffer);
1153*993229b6Sjkunz 		break;
1154*993229b6Sjkunz 		case CBC:
1155*993229b6Sjkunz 			iv = m_initVector;
1156*993229b6Sjkunz 			for(i = numBlocks; i > 0; i--)
1157*993229b6Sjkunz 			{
1158*993229b6Sjkunz 				((uint32_t*)block)[0] = ((uint32_t*)input)[0] ^ ((uint32_t*)iv)[0];
1159*993229b6Sjkunz 				((uint32_t*)block)[1] = ((uint32_t*)input)[1] ^ ((uint32_t*)iv)[1];
1160*993229b6Sjkunz 				((uint32_t*)block)[2] = ((uint32_t*)input)[2] ^ ((uint32_t*)iv)[2];
1161*993229b6Sjkunz 				((uint32_t*)block)[3] = ((uint32_t*)input)[3] ^ ((uint32_t*)iv)[3];
1162*993229b6Sjkunz 				encrypt(block, outBuffer);
1163*993229b6Sjkunz 				iv = outBuffer;
1164*993229b6Sjkunz 				input += 16;
1165*993229b6Sjkunz 				outBuffer += 16;
1166*993229b6Sjkunz 			}
1167*993229b6Sjkunz 			padLen = 16 - (inputOctets - 16*numBlocks);
1168*993229b6Sjkunz //			assert(padLen > 0 && padLen <= 16); // DO SOMETHING HERE ?
1169*993229b6Sjkunz 			for (i = 0; i < 16 - padLen; i++) {
1170*993229b6Sjkunz 				block[i] = input[i] ^ iv[i];
1171*993229b6Sjkunz 			}
1172*993229b6Sjkunz 			for (i = 16 - padLen; i < 16; i++) {
1173*993229b6Sjkunz 				block[i] = (uint8_t)padLen ^ iv[i];
1174*993229b6Sjkunz 			}
1175*993229b6Sjkunz 			encrypt(block,outBuffer);
1176*993229b6Sjkunz 		break;
1177*993229b6Sjkunz 		default:
1178*993229b6Sjkunz 			return -1;
1179*993229b6Sjkunz 		break;
1180*993229b6Sjkunz 	}
1181*993229b6Sjkunz 
1182*993229b6Sjkunz 	return 16*(numBlocks + 1);
1183*993229b6Sjkunz }
1184*993229b6Sjkunz 
blockDecrypt(const uint8_t * input,int inputLen,uint8_t * outBuffer)1185*993229b6Sjkunz int Rijndael::blockDecrypt(const uint8_t *input, int inputLen, uint8_t *outBuffer)
1186*993229b6Sjkunz {
1187*993229b6Sjkunz 	int i, k, numBlocks;
1188*993229b6Sjkunz 	uint8_t block[16], iv[4][4];
1189*993229b6Sjkunz 
1190*993229b6Sjkunz 	if(m_state != Valid)return RIJNDAEL_NOT_INITIALIZED;
1191*993229b6Sjkunz 	if((m_mode != CFB1) && (m_direction == Encrypt))return RIJNDAEL_BAD_DIRECTION;
1192*993229b6Sjkunz 
1193*993229b6Sjkunz 	if (input == 0 || inputLen <= 0)return 0;
1194*993229b6Sjkunz 
1195*993229b6Sjkunz 	numBlocks = inputLen/128;
1196*993229b6Sjkunz 
1197*993229b6Sjkunz 	switch(m_mode)
1198*993229b6Sjkunz 	{
1199*993229b6Sjkunz 		case ECB:
1200*993229b6Sjkunz 			for (i = numBlocks; i > 0; i--)
1201*993229b6Sjkunz 			{
1202*993229b6Sjkunz 				decrypt(input,outBuffer);
1203*993229b6Sjkunz 				input += 16;
1204*993229b6Sjkunz 				outBuffer += 16;
1205*993229b6Sjkunz 			}
1206*993229b6Sjkunz 		break;
1207*993229b6Sjkunz 		case CBC:
1208*993229b6Sjkunz #if STRICT_ALIGN
1209*993229b6Sjkunz 			memcpy(iv,m_initVector,16);
1210*993229b6Sjkunz #else
1211*993229b6Sjkunz 			*((uint32_t*)iv[0]) = *((uint32_t*)(m_initVector  ));
1212*993229b6Sjkunz 			*((uint32_t*)iv[1]) = *((uint32_t*)(m_initVector+ 4));
1213*993229b6Sjkunz 			*((uint32_t*)iv[2]) = *((uint32_t*)(m_initVector+ 8));
1214*993229b6Sjkunz 			*((uint32_t*)iv[3]) = *((uint32_t*)(m_initVector+12));
1215*993229b6Sjkunz #endif
1216*993229b6Sjkunz 			for (i = numBlocks; i > 0; i--)
1217*993229b6Sjkunz 			{
1218*993229b6Sjkunz 				decrypt(input, block);
1219*993229b6Sjkunz 				((uint32_t*)block)[0] ^= *((uint32_t*)iv[0]);
1220*993229b6Sjkunz 				((uint32_t*)block)[1] ^= *((uint32_t*)iv[1]);
1221*993229b6Sjkunz 				((uint32_t*)block)[2] ^= *((uint32_t*)iv[2]);
1222*993229b6Sjkunz 				((uint32_t*)block)[3] ^= *((uint32_t*)iv[3]);
1223*993229b6Sjkunz #if STRICT_ALIGN
1224*993229b6Sjkunz 				memcpy(iv, input, 16);
1225*993229b6Sjkunz 				memcpy(outBuf, block, 16);
1226*993229b6Sjkunz #else
1227*993229b6Sjkunz 				*((uint32_t*)iv[0]) = ((uint32_t*)input)[0]; ((uint32_t*)outBuffer)[0] = ((uint32_t*)block)[0];
1228*993229b6Sjkunz 				*((uint32_t*)iv[1]) = ((uint32_t*)input)[1]; ((uint32_t*)outBuffer)[1] = ((uint32_t*)block)[1];
1229*993229b6Sjkunz 				*((uint32_t*)iv[2]) = ((uint32_t*)input)[2]; ((uint32_t*)outBuffer)[2] = ((uint32_t*)block)[2];
1230*993229b6Sjkunz 				*((uint32_t*)iv[3]) = ((uint32_t*)input)[3]; ((uint32_t*)outBuffer)[3] = ((uint32_t*)block)[3];
1231*993229b6Sjkunz #endif
1232*993229b6Sjkunz 				input += 16;
1233*993229b6Sjkunz 				outBuffer += 16;
1234*993229b6Sjkunz 			}
1235*993229b6Sjkunz 			break;
1236*993229b6Sjkunz 		case CFB1:
1237*993229b6Sjkunz #if STRICT_ALIGN
1238*993229b6Sjkunz 			memcpy(iv, m_initVector, 16);
1239*993229b6Sjkunz #else
1240*993229b6Sjkunz 			*((uint32_t*)iv[0]) = *((uint32_t*)(m_initVector));
1241*993229b6Sjkunz 			*((uint32_t*)iv[1]) = *((uint32_t*)(m_initVector+ 4));
1242*993229b6Sjkunz 			*((uint32_t*)iv[2]) = *((uint32_t*)(m_initVector+ 8));
1243*993229b6Sjkunz 			*((uint32_t*)iv[3]) = *((uint32_t*)(m_initVector+12));
1244*993229b6Sjkunz #endif
1245*993229b6Sjkunz 			for(i = numBlocks; i > 0; i--)
1246*993229b6Sjkunz 			{
1247*993229b6Sjkunz 				for(k = 0; k < 128; k++)
1248*993229b6Sjkunz 				{
1249*993229b6Sjkunz 					*((uint32_t*) block    ) = *((uint32_t*)iv[0]);
1250*993229b6Sjkunz 					*((uint32_t*)(block+ 4)) = *((uint32_t*)iv[1]);
1251*993229b6Sjkunz 					*((uint32_t*)(block+ 8)) = *((uint32_t*)iv[2]);
1252*993229b6Sjkunz 					*((uint32_t*)(block+12)) = *((uint32_t*)iv[3]);
1253*993229b6Sjkunz 					encrypt(block, block);
1254*993229b6Sjkunz 					iv[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7);
1255*993229b6Sjkunz 					iv[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7);
1256*993229b6Sjkunz 					iv[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7);
1257*993229b6Sjkunz 					iv[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7);
1258*993229b6Sjkunz 					iv[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7);
1259*993229b6Sjkunz 					iv[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7);
1260*993229b6Sjkunz 					iv[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7);
1261*993229b6Sjkunz 					iv[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7);
1262*993229b6Sjkunz 					iv[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7);
1263*993229b6Sjkunz 					iv[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7);
1264*993229b6Sjkunz 					iv[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7);
1265*993229b6Sjkunz 					iv[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7);
1266*993229b6Sjkunz 					iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);
1267*993229b6Sjkunz 					iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);
1268*993229b6Sjkunz 					iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);
1269*993229b6Sjkunz 					iv[3][3] = (iv[3][3] << 1) | (input[k/8] >> (7-(k&7))) & 1;
1270*993229b6Sjkunz 					outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7);
1271*993229b6Sjkunz 				}
1272*993229b6Sjkunz 			}
1273*993229b6Sjkunz 		break;
1274*993229b6Sjkunz 		default:
1275*993229b6Sjkunz 			return -1;
1276*993229b6Sjkunz 		break;
1277*993229b6Sjkunz 	}
1278*993229b6Sjkunz 
1279*993229b6Sjkunz 	return 128*numBlocks;
1280*993229b6Sjkunz }
1281*993229b6Sjkunz 
padDecrypt(const uint8_t * input,int inputOctets,uint8_t * outBuffer)1282*993229b6Sjkunz int Rijndael::padDecrypt(const uint8_t *input, int inputOctets, uint8_t *outBuffer)
1283*993229b6Sjkunz {
1284*993229b6Sjkunz 	int i, numBlocks, padLen;
1285*993229b6Sjkunz 	uint8_t block[16];
1286*993229b6Sjkunz 	uint32_t iv[4];
1287*993229b6Sjkunz 
1288*993229b6Sjkunz 	if(m_state != Valid)return RIJNDAEL_NOT_INITIALIZED;
1289*993229b6Sjkunz 	if(m_direction != Decrypt)return RIJNDAEL_BAD_DIRECTION;
1290*993229b6Sjkunz 
1291*993229b6Sjkunz 	if(input == 0 || inputOctets <= 0)return 0;
1292*993229b6Sjkunz 
1293*993229b6Sjkunz 	if((inputOctets % 16) != 0)return RIJNDAEL_CORRUPTED_DATA;
1294*993229b6Sjkunz 
1295*993229b6Sjkunz 	numBlocks = inputOctets/16;
1296*993229b6Sjkunz 
1297*993229b6Sjkunz 	switch(m_mode){
1298*993229b6Sjkunz 		case ECB:
1299*993229b6Sjkunz 			for (i = numBlocks - 1; i > 0; i--)
1300*993229b6Sjkunz 			{
1301*993229b6Sjkunz 				decrypt(input, outBuffer);
1302*993229b6Sjkunz 				input += 16;
1303*993229b6Sjkunz 				outBuffer += 16;
1304*993229b6Sjkunz 			}
1305*993229b6Sjkunz 
1306*993229b6Sjkunz 			decrypt(input, block);
1307*993229b6Sjkunz 			padLen = block[15];
1308*993229b6Sjkunz 			if (padLen >= 16)return RIJNDAEL_CORRUPTED_DATA;
1309*993229b6Sjkunz 			for(i = 16 - padLen; i < 16; i++)
1310*993229b6Sjkunz 			{
1311*993229b6Sjkunz 				if(block[i] != padLen)return RIJNDAEL_CORRUPTED_DATA;
1312*993229b6Sjkunz 			}
1313*993229b6Sjkunz 			memcpy(outBuffer, block, 16 - padLen);
1314*993229b6Sjkunz 		break;
1315*993229b6Sjkunz 		case CBC:
1316*993229b6Sjkunz 			memcpy(iv, m_initVector, 16);
1317*993229b6Sjkunz 			/* all blocks but last */
1318*993229b6Sjkunz 			for (i = numBlocks - 1; i > 0; i--)
1319*993229b6Sjkunz 			{
1320*993229b6Sjkunz 				decrypt(input, block);
1321*993229b6Sjkunz 				((uint32_t*)block)[0] ^= iv[0];
1322*993229b6Sjkunz 				((uint32_t*)block)[1] ^= iv[1];
1323*993229b6Sjkunz 				((uint32_t*)block)[2] ^= iv[2];
1324*993229b6Sjkunz 				((uint32_t*)block)[3] ^= iv[3];
1325*993229b6Sjkunz 				memcpy(iv, input, 16);
1326*993229b6Sjkunz 				memcpy(outBuffer, block, 16);
1327*993229b6Sjkunz 				input += 16;
1328*993229b6Sjkunz 				outBuffer += 16;
1329*993229b6Sjkunz 			}
1330*993229b6Sjkunz 			/* last block */
1331*993229b6Sjkunz 			decrypt(input, block);
1332*993229b6Sjkunz 			((uint32_t*)block)[0] ^= iv[0];
1333*993229b6Sjkunz 			((uint32_t*)block)[1] ^= iv[1];
1334*993229b6Sjkunz 			((uint32_t*)block)[2] ^= iv[2];
1335*993229b6Sjkunz 			((uint32_t*)block)[3] ^= iv[3];
1336*993229b6Sjkunz 			padLen = block[15];
1337*993229b6Sjkunz 			if(padLen <= 0 || padLen > 16)return RIJNDAEL_CORRUPTED_DATA;
1338*993229b6Sjkunz 			for(i = 16 - padLen; i < 16; i++)
1339*993229b6Sjkunz 			{
1340*993229b6Sjkunz 				if(block[i] != padLen)return RIJNDAEL_CORRUPTED_DATA;
1341*993229b6Sjkunz 			}
1342*993229b6Sjkunz 			memcpy(outBuffer, block, 16 - padLen);
1343*993229b6Sjkunz 			break;
1344*993229b6Sjkunz 
1345*993229b6Sjkunz 		default:
1346*993229b6Sjkunz 			return -1;
1347*993229b6Sjkunz 		break;
1348*993229b6Sjkunz 	}
1349*993229b6Sjkunz 
1350*993229b6Sjkunz 	return 16*numBlocks - padLen;
1351*993229b6Sjkunz }
1352*993229b6Sjkunz 
1353*993229b6Sjkunz //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1354*993229b6Sjkunz // ALGORITHM
1355*993229b6Sjkunz //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1356*993229b6Sjkunz 
1357*993229b6Sjkunz 
keySched(uint8_t key[_MAX_KEY_COLUMNS][4])1358*993229b6Sjkunz void Rijndael::keySched(uint8_t key[_MAX_KEY_COLUMNS][4])
1359*993229b6Sjkunz {
1360*993229b6Sjkunz 	unsigned j,rconpointer = 0;
1361*993229b6Sjkunz 
1362*993229b6Sjkunz 	// Calculate the necessary round keys
1363*993229b6Sjkunz 	// The number of calculations depends on keyBits and blockBits
1364*993229b6Sjkunz 	unsigned uKeyColumns = m_uRounds - 6;
1365*993229b6Sjkunz 
1366*993229b6Sjkunz 	uint8_t tempKey[_MAX_KEY_COLUMNS][4];
1367*993229b6Sjkunz 
1368*993229b6Sjkunz 	// Copy the input key to the temporary key matrix
1369*993229b6Sjkunz 
1370*993229b6Sjkunz 	for(j = 0;j < uKeyColumns;j++)
1371*993229b6Sjkunz 	{
1372*993229b6Sjkunz 		*((uint32_t*)(tempKey[j])) = *((uint32_t*)(key[j]));
1373*993229b6Sjkunz 	}
1374*993229b6Sjkunz 
1375*993229b6Sjkunz 	unsigned r = 0;
1376*993229b6Sjkunz 	unsigned t = 0;
1377*993229b6Sjkunz 
1378*993229b6Sjkunz 	// copy values into round key array
1379*993229b6Sjkunz 	for(j = 0;(j < uKeyColumns) && (r <= m_uRounds); )
1380*993229b6Sjkunz 	{
1381*993229b6Sjkunz 		for(;(j < uKeyColumns) && (t < 4); j++, t++)
1382*993229b6Sjkunz 		{
1383*993229b6Sjkunz 			*((uint32_t*)m_expandedKey[r][t]) = *((uint32_t*)tempKey[j]);
1384*993229b6Sjkunz 		}
1385*993229b6Sjkunz 
1386*993229b6Sjkunz 
1387*993229b6Sjkunz 		if(t == 4)
1388*993229b6Sjkunz 		{
1389*993229b6Sjkunz 			r++;
1390*993229b6Sjkunz 			t = 0;
1391*993229b6Sjkunz 		}
1392*993229b6Sjkunz 	}
1393*993229b6Sjkunz 
1394*993229b6Sjkunz 	while(r <= m_uRounds)
1395*993229b6Sjkunz 	{
1396*993229b6Sjkunz 		tempKey[0][0] ^= S[tempKey[uKeyColumns-1][1]];
1397*993229b6Sjkunz 		tempKey[0][1] ^= S[tempKey[uKeyColumns-1][2]];
1398*993229b6Sjkunz 		tempKey[0][2] ^= S[tempKey[uKeyColumns-1][3]];
1399*993229b6Sjkunz 		tempKey[0][3] ^= S[tempKey[uKeyColumns-1][0]];
1400*993229b6Sjkunz 		tempKey[0][0] ^= rcon[rconpointer++];
1401*993229b6Sjkunz 
1402*993229b6Sjkunz 		if (uKeyColumns != 8)
1403*993229b6Sjkunz 		{
1404*993229b6Sjkunz 			for(j = 1; j < uKeyColumns; j++)
1405*993229b6Sjkunz 			{
1406*993229b6Sjkunz 				*((uint32_t*)tempKey[j]) ^= *((uint32_t*)tempKey[j-1]);
1407*993229b6Sjkunz 			}
1408*993229b6Sjkunz 		} else {
1409*993229b6Sjkunz 			for(j = 1; j < uKeyColumns/2; j++)
1410*993229b6Sjkunz 			{
1411*993229b6Sjkunz 				*((uint32_t*)tempKey[j]) ^= *((uint32_t*)tempKey[j-1]);
1412*993229b6Sjkunz 			}
1413*993229b6Sjkunz 			tempKey[uKeyColumns/2][0] ^= S[tempKey[uKeyColumns/2 - 1][0]];
1414*993229b6Sjkunz 			tempKey[uKeyColumns/2][1] ^= S[tempKey[uKeyColumns/2 - 1][1]];
1415*993229b6Sjkunz 			tempKey[uKeyColumns/2][2] ^= S[tempKey[uKeyColumns/2 - 1][2]];
1416*993229b6Sjkunz 			tempKey[uKeyColumns/2][3] ^= S[tempKey[uKeyColumns/2 - 1][3]];
1417*993229b6Sjkunz 			for(j = uKeyColumns/2 + 1; j < uKeyColumns; j++)
1418*993229b6Sjkunz 			{
1419*993229b6Sjkunz 				*((uint32_t*)tempKey[j]) ^= *((uint32_t*)tempKey[j-1]);
1420*993229b6Sjkunz 			}
1421*993229b6Sjkunz 		}
1422*993229b6Sjkunz 		for(j = 0; (j < uKeyColumns) && (r <= m_uRounds); )
1423*993229b6Sjkunz 		{
1424*993229b6Sjkunz 			for(; (j < uKeyColumns) && (t < 4); j++, t++)
1425*993229b6Sjkunz 			{
1426*993229b6Sjkunz 				*((uint32_t*)m_expandedKey[r][t]) = *((uint32_t*)tempKey[j]);
1427*993229b6Sjkunz 			}
1428*993229b6Sjkunz 			if(t == 4)
1429*993229b6Sjkunz 			{
1430*993229b6Sjkunz 				r++;
1431*993229b6Sjkunz 				t = 0;
1432*993229b6Sjkunz 			}
1433*993229b6Sjkunz 		}
1434*993229b6Sjkunz 	}
1435*993229b6Sjkunz }
1436*993229b6Sjkunz 
keyEncToDec()1437*993229b6Sjkunz void Rijndael::keyEncToDec()
1438*993229b6Sjkunz {
1439*993229b6Sjkunz 	unsigned r;
1440*993229b6Sjkunz 	uint8_t *w;
1441*993229b6Sjkunz 
1442*993229b6Sjkunz 	for(r = 1; r < m_uRounds; r++)
1443*993229b6Sjkunz 	{
1444*993229b6Sjkunz 		w = m_expandedKey[r][0];
1445*993229b6Sjkunz 		*((uint32_t*)w) = *((uint32_t*)U1[w[0]]) ^ *((uint32_t*)U2[w[1]]) ^ *((uint32_t*)U3[w[2]]) ^ *((uint32_t*)U4[w[3]]);
1446*993229b6Sjkunz 		w = m_expandedKey[r][1];
1447*993229b6Sjkunz 		*((uint32_t*)w) = *((uint32_t*)U1[w[0]]) ^ *((uint32_t*)U2[w[1]]) ^ *((uint32_t*)U3[w[2]]) ^ *((uint32_t*)U4[w[3]]);
1448*993229b6Sjkunz 		w = m_expandedKey[r][2];
1449*993229b6Sjkunz 		*((uint32_t*)w) = *((uint32_t*)U1[w[0]]) ^ *((uint32_t*)U2[w[1]]) ^ *((uint32_t*)U3[w[2]]) ^ *((uint32_t*)U4[w[3]]);
1450*993229b6Sjkunz 		w = m_expandedKey[r][3];
1451*993229b6Sjkunz 		*((uint32_t*)w) = *((uint32_t*)U1[w[0]]) ^ *((uint32_t*)U2[w[1]]) ^ *((uint32_t*)U3[w[2]]) ^ *((uint32_t*)U4[w[3]]);
1452*993229b6Sjkunz 	}
1453*993229b6Sjkunz }
1454*993229b6Sjkunz 
encrypt(const uint8_t a[16],uint8_t b[16])1455*993229b6Sjkunz void Rijndael::encrypt(const uint8_t a[16], uint8_t b[16])
1456*993229b6Sjkunz {
1457*993229b6Sjkunz 	unsigned r;
1458*993229b6Sjkunz 	uint8_t temp[4][4];
1459*993229b6Sjkunz 
1460*993229b6Sjkunz     *((uint32_t*)temp[0]) = *((uint32_t*)(a   )) ^ *((uint32_t*)m_expandedKey[0][0]);
1461*993229b6Sjkunz     *((uint32_t*)temp[1]) = *((uint32_t*)(a+ 4)) ^ *((uint32_t*)m_expandedKey[0][1]);
1462*993229b6Sjkunz     *((uint32_t*)temp[2]) = *((uint32_t*)(a+ 8)) ^ *((uint32_t*)m_expandedKey[0][2]);
1463*993229b6Sjkunz     *((uint32_t*)temp[3]) = *((uint32_t*)(a+12)) ^ *((uint32_t*)m_expandedKey[0][3]);
1464*993229b6Sjkunz     *((uint32_t*)(b    )) = *((uint32_t*)T1[temp[0][0]])
1465*993229b6Sjkunz 						^ *((uint32_t*)T2[temp[1][1]])
1466*993229b6Sjkunz 						^ *((uint32_t*)T3[temp[2][2]])
1467*993229b6Sjkunz 						^ *((uint32_t*)T4[temp[3][3]]);
1468*993229b6Sjkunz     *((uint32_t*)(b + 4)) = *((uint32_t*)T1[temp[1][0]])
1469*993229b6Sjkunz 						^ *((uint32_t*)T2[temp[2][1]])
1470*993229b6Sjkunz 						^ *((uint32_t*)T3[temp[3][2]])
1471*993229b6Sjkunz 						^ *((uint32_t*)T4[temp[0][3]]);
1472*993229b6Sjkunz     *((uint32_t*)(b + 8)) = *((uint32_t*)T1[temp[2][0]])
1473*993229b6Sjkunz 						^ *((uint32_t*)T2[temp[3][1]])
1474*993229b6Sjkunz 						^ *((uint32_t*)T3[temp[0][2]])
1475*993229b6Sjkunz 						^ *((uint32_t*)T4[temp[1][3]]);
1476*993229b6Sjkunz     *((uint32_t*)(b +12)) = *((uint32_t*)T1[temp[3][0]])
1477*993229b6Sjkunz 						^ *((uint32_t*)T2[temp[0][1]])
1478*993229b6Sjkunz 						^ *((uint32_t*)T3[temp[1][2]])
1479*993229b6Sjkunz 						^ *((uint32_t*)T4[temp[2][3]]);
1480*993229b6Sjkunz 	for(r = 1; r < m_uRounds-1; r++)
1481*993229b6Sjkunz 	{
1482*993229b6Sjkunz 		*((uint32_t*)temp[0]) = *((uint32_t*)(b   )) ^ *((uint32_t*)m_expandedKey[r][0]);
1483*993229b6Sjkunz 		*((uint32_t*)temp[1]) = *((uint32_t*)(b+ 4)) ^ *((uint32_t*)m_expandedKey[r][1]);
1484*993229b6Sjkunz 		*((uint32_t*)temp[2]) = *((uint32_t*)(b+ 8)) ^ *((uint32_t*)m_expandedKey[r][2]);
1485*993229b6Sjkunz 		*((uint32_t*)temp[3]) = *((uint32_t*)(b+12)) ^ *((uint32_t*)m_expandedKey[r][3]);
1486*993229b6Sjkunz 
1487*993229b6Sjkunz 		*((uint32_t*)(b    )) = *((uint32_t*)T1[temp[0][0]])
1488*993229b6Sjkunz 							^ *((uint32_t*)T2[temp[1][1]])
1489*993229b6Sjkunz 							^ *((uint32_t*)T3[temp[2][2]])
1490*993229b6Sjkunz 							^ *((uint32_t*)T4[temp[3][3]]);
1491*993229b6Sjkunz 		*((uint32_t*)(b + 4)) = *((uint32_t*)T1[temp[1][0]])
1492*993229b6Sjkunz 							^ *((uint32_t*)T2[temp[2][1]])
1493*993229b6Sjkunz 							^ *((uint32_t*)T3[temp[3][2]])
1494*993229b6Sjkunz 							^ *((uint32_t*)T4[temp[0][3]]);
1495*993229b6Sjkunz 		*((uint32_t*)(b + 8)) = *((uint32_t*)T1[temp[2][0]])
1496*993229b6Sjkunz 							^ *((uint32_t*)T2[temp[3][1]])
1497*993229b6Sjkunz 							^ *((uint32_t*)T3[temp[0][2]])
1498*993229b6Sjkunz 							^ *((uint32_t*)T4[temp[1][3]]);
1499*993229b6Sjkunz 		*((uint32_t*)(b +12)) = *((uint32_t*)T1[temp[3][0]])
1500*993229b6Sjkunz 							^ *((uint32_t*)T2[temp[0][1]])
1501*993229b6Sjkunz 							^ *((uint32_t*)T3[temp[1][2]])
1502*993229b6Sjkunz 							^ *((uint32_t*)T4[temp[2][3]]);
1503*993229b6Sjkunz 	}
1504*993229b6Sjkunz 	*((uint32_t*)temp[0]) = *((uint32_t*)(b   )) ^ *((uint32_t*)m_expandedKey[m_uRounds-1][0]);
1505*993229b6Sjkunz 	*((uint32_t*)temp[1]) = *((uint32_t*)(b+ 4)) ^ *((uint32_t*)m_expandedKey[m_uRounds-1][1]);
1506*993229b6Sjkunz 	*((uint32_t*)temp[2]) = *((uint32_t*)(b+ 8)) ^ *((uint32_t*)m_expandedKey[m_uRounds-1][2]);
1507*993229b6Sjkunz 	*((uint32_t*)temp[3]) = *((uint32_t*)(b+12)) ^ *((uint32_t*)m_expandedKey[m_uRounds-1][3]);
1508*993229b6Sjkunz 	b[ 0] = T1[temp[0][0]][1];
1509*993229b6Sjkunz 	b[ 1] = T1[temp[1][1]][1];
1510*993229b6Sjkunz 	b[ 2] = T1[temp[2][2]][1];
1511*993229b6Sjkunz 	b[ 3] = T1[temp[3][3]][1];
1512*993229b6Sjkunz 	b[ 4] = T1[temp[1][0]][1];
1513*993229b6Sjkunz 	b[ 5] = T1[temp[2][1]][1];
1514*993229b6Sjkunz 	b[ 6] = T1[temp[3][2]][1];
1515*993229b6Sjkunz 	b[ 7] = T1[temp[0][3]][1];
1516*993229b6Sjkunz 	b[ 8] = T1[temp[2][0]][1];
1517*993229b6Sjkunz 	b[ 9] = T1[temp[3][1]][1];
1518*993229b6Sjkunz 	b[10] = T1[temp[0][2]][1];
1519*993229b6Sjkunz 	b[11] = T1[temp[1][3]][1];
1520*993229b6Sjkunz 	b[12] = T1[temp[3][0]][1];
1521*993229b6Sjkunz 	b[13] = T1[temp[0][1]][1];
1522*993229b6Sjkunz 	b[14] = T1[temp[1][2]][1];
1523*993229b6Sjkunz 	b[15] = T1[temp[2][3]][1];
1524*993229b6Sjkunz 	*((uint32_t*)(b   )) ^= *((uint32_t*)m_expandedKey[m_uRounds][0]);
1525*993229b6Sjkunz 	*((uint32_t*)(b+ 4)) ^= *((uint32_t*)m_expandedKey[m_uRounds][1]);
1526*993229b6Sjkunz 	*((uint32_t*)(b+ 8)) ^= *((uint32_t*)m_expandedKey[m_uRounds][2]);
1527*993229b6Sjkunz 	*((uint32_t*)(b+12)) ^= *((uint32_t*)m_expandedKey[m_uRounds][3]);
1528*993229b6Sjkunz }
1529*993229b6Sjkunz 
decrypt(const uint8_t a[16],uint8_t b[16])1530*993229b6Sjkunz void Rijndael::decrypt(const uint8_t a[16], uint8_t b[16])
1531*993229b6Sjkunz {
1532*993229b6Sjkunz 	int r;
1533*993229b6Sjkunz 	uint8_t temp[4][4];
1534*993229b6Sjkunz 
1535*993229b6Sjkunz     *((uint32_t*)temp[0]) = *((uint32_t*)(a   )) ^ *((uint32_t*)m_expandedKey[m_uRounds][0]);
1536*993229b6Sjkunz     *((uint32_t*)temp[1]) = *((uint32_t*)(a+ 4)) ^ *((uint32_t*)m_expandedKey[m_uRounds][1]);
1537*993229b6Sjkunz     *((uint32_t*)temp[2]) = *((uint32_t*)(a+ 8)) ^ *((uint32_t*)m_expandedKey[m_uRounds][2]);
1538*993229b6Sjkunz     *((uint32_t*)temp[3]) = *((uint32_t*)(a+12)) ^ *((uint32_t*)m_expandedKey[m_uRounds][3]);
1539*993229b6Sjkunz 
1540*993229b6Sjkunz     *((uint32_t*)(b   )) = *((uint32_t*)T5[temp[0][0]])
1541*993229b6Sjkunz            ^ *((uint32_t*)T6[temp[3][1]])
1542*993229b6Sjkunz            ^ *((uint32_t*)T7[temp[2][2]])
1543*993229b6Sjkunz            ^ *((uint32_t*)T8[temp[1][3]]);
1544*993229b6Sjkunz 	*((uint32_t*)(b+ 4)) = *((uint32_t*)T5[temp[1][0]])
1545*993229b6Sjkunz            ^ *((uint32_t*)T6[temp[0][1]])
1546*993229b6Sjkunz            ^ *((uint32_t*)T7[temp[3][2]])
1547*993229b6Sjkunz            ^ *((uint32_t*)T8[temp[2][3]]);
1548*993229b6Sjkunz 	*((uint32_t*)(b+ 8)) = *((uint32_t*)T5[temp[2][0]])
1549*993229b6Sjkunz            ^ *((uint32_t*)T6[temp[1][1]])
1550*993229b6Sjkunz            ^ *((uint32_t*)T7[temp[0][2]])
1551*993229b6Sjkunz            ^ *((uint32_t*)T8[temp[3][3]]);
1552*993229b6Sjkunz 	*((uint32_t*)(b+12)) = *((uint32_t*)T5[temp[3][0]])
1553*993229b6Sjkunz            ^ *((uint32_t*)T6[temp[2][1]])
1554*993229b6Sjkunz            ^ *((uint32_t*)T7[temp[1][2]])
1555*993229b6Sjkunz            ^ *((uint32_t*)T8[temp[0][3]]);
1556*993229b6Sjkunz 	for(r = m_uRounds-1; r > 1; r--)
1557*993229b6Sjkunz 	{
1558*993229b6Sjkunz 		*((uint32_t*)temp[0]) = *((uint32_t*)(b   )) ^ *((uint32_t*)m_expandedKey[r][0]);
1559*993229b6Sjkunz 		*((uint32_t*)temp[1]) = *((uint32_t*)(b+ 4)) ^ *((uint32_t*)m_expandedKey[r][1]);
1560*993229b6Sjkunz 		*((uint32_t*)temp[2]) = *((uint32_t*)(b+ 8)) ^ *((uint32_t*)m_expandedKey[r][2]);
1561*993229b6Sjkunz 		*((uint32_t*)temp[3]) = *((uint32_t*)(b+12)) ^ *((uint32_t*)m_expandedKey[r][3]);
1562*993229b6Sjkunz 		*((uint32_t*)(b   )) = *((uint32_t*)T5[temp[0][0]])
1563*993229b6Sjkunz            ^ *((uint32_t*)T6[temp[3][1]])
1564*993229b6Sjkunz            ^ *((uint32_t*)T7[temp[2][2]])
1565*993229b6Sjkunz            ^ *((uint32_t*)T8[temp[1][3]]);
1566*993229b6Sjkunz 		*((uint32_t*)(b+ 4)) = *((uint32_t*)T5[temp[1][0]])
1567*993229b6Sjkunz            ^ *((uint32_t*)T6[temp[0][1]])
1568*993229b6Sjkunz            ^ *((uint32_t*)T7[temp[3][2]])
1569*993229b6Sjkunz            ^ *((uint32_t*)T8[temp[2][3]]);
1570*993229b6Sjkunz 		*((uint32_t*)(b+ 8)) = *((uint32_t*)T5[temp[2][0]])
1571*993229b6Sjkunz            ^ *((uint32_t*)T6[temp[1][1]])
1572*993229b6Sjkunz            ^ *((uint32_t*)T7[temp[0][2]])
1573*993229b6Sjkunz            ^ *((uint32_t*)T8[temp[3][3]]);
1574*993229b6Sjkunz 		*((uint32_t*)(b+12)) = *((uint32_t*)T5[temp[3][0]])
1575*993229b6Sjkunz            ^ *((uint32_t*)T6[temp[2][1]])
1576*993229b6Sjkunz            ^ *((uint32_t*)T7[temp[1][2]])
1577*993229b6Sjkunz            ^ *((uint32_t*)T8[temp[0][3]]);
1578*993229b6Sjkunz 	}
1579*993229b6Sjkunz 
1580*993229b6Sjkunz 	*((uint32_t*)temp[0]) = *((uint32_t*)(b   )) ^ *((uint32_t*)m_expandedKey[1][0]);
1581*993229b6Sjkunz 	*((uint32_t*)temp[1]) = *((uint32_t*)(b+ 4)) ^ *((uint32_t*)m_expandedKey[1][1]);
1582*993229b6Sjkunz 	*((uint32_t*)temp[2]) = *((uint32_t*)(b+ 8)) ^ *((uint32_t*)m_expandedKey[1][2]);
1583*993229b6Sjkunz 	*((uint32_t*)temp[3]) = *((uint32_t*)(b+12)) ^ *((uint32_t*)m_expandedKey[1][3]);
1584*993229b6Sjkunz 	b[ 0] = S5[temp[0][0]];
1585*993229b6Sjkunz 	b[ 1] = S5[temp[3][1]];
1586*993229b6Sjkunz 	b[ 2] = S5[temp[2][2]];
1587*993229b6Sjkunz 	b[ 3] = S5[temp[1][3]];
1588*993229b6Sjkunz 	b[ 4] = S5[temp[1][0]];
1589*993229b6Sjkunz 	b[ 5] = S5[temp[0][1]];
1590*993229b6Sjkunz 	b[ 6] = S5[temp[3][2]];
1591*993229b6Sjkunz 	b[ 7] = S5[temp[2][3]];
1592*993229b6Sjkunz 	b[ 8] = S5[temp[2][0]];
1593*993229b6Sjkunz 	b[ 9] = S5[temp[1][1]];
1594*993229b6Sjkunz 	b[10] = S5[temp[0][2]];
1595*993229b6Sjkunz 	b[11] = S5[temp[3][3]];
1596*993229b6Sjkunz 	b[12] = S5[temp[3][0]];
1597*993229b6Sjkunz 	b[13] = S5[temp[2][1]];
1598*993229b6Sjkunz 	b[14] = S5[temp[1][2]];
1599*993229b6Sjkunz 	b[15] = S5[temp[0][3]];
1600*993229b6Sjkunz 	*((uint32_t*)(b   )) ^= *((uint32_t*)m_expandedKey[0][0]);
1601*993229b6Sjkunz 	*((uint32_t*)(b+ 4)) ^= *((uint32_t*)m_expandedKey[0][1]);
1602*993229b6Sjkunz 	*((uint32_t*)(b+ 8)) ^= *((uint32_t*)m_expandedKey[0][2]);
1603*993229b6Sjkunz 	*((uint32_t*)(b+12)) ^= *((uint32_t*)m_expandedKey[0][3]);
1604*993229b6Sjkunz }
1605