1#!/usr/bin/perl -w
2# $Id: Rijndael_PP.pm,v 1.21 2010/09/22 13:31:36 lackas Exp $
3package Crypt::Rijndael_PP;
4
5require 5.004;
6use strict;
7use integer;
8use Carp;
9
10use vars qw'$VERSION @EXPORT @EXPORT_OK %EXPORT_TAGS @ISA';
11require Exporter;
12
13@ISA = 'Exporter';
14$VERSION = 0.05;
15@EXPORT_OK = qw(
16	blockDecrypt blockEncrypt blockEncryptRound blockDecryptRound
17	cipherUpdateRounds cipherInit makeKey
18	MODE_ECB MODE_CBC MODE_CFB1
19	DIR_ENCRYPT DIR_DECRYPT
20);
21@EXPORT = qw(rijndael_encrypt rijndael_decrypt);
22%EXPORT_TAGS = (
23	all => [@EXPORT_OK,@EXPORT],
24	modes => [qw(MODE_ECB MODE_CBC MODE_CFB1)],
25	directions => [qw(DIR_ENCRYPT DIR_DECRYPT)],
26	CAPI => [qw(cipherInit makeKey blockDecrypt blockEncrypt)]
27);
28
29
30# boxes-ref.dat
31use constant Logtable => [
32  0,   0,  25,   1,  50,   2,  26, 198,  75, 199,  27, 104,  51, 238, 223,   3,
33100,   4, 224,  14,  52, 141, 129, 239,  76, 113,   8, 200, 248, 105,  28, 193,
34125, 194,  29, 181, 249, 185,  39, 106,  77, 228, 166, 114, 154, 201,   9, 120,
35101,  47, 138,   5,  33,  15, 225,  36,  18, 240, 130,  69,  53, 147, 218, 142,
36150, 143, 219, 189,  54, 208, 206, 148,  19,  92, 210, 241,  64,  70, 131,  56,
37102, 221, 253,  48, 191,   6, 139,  98, 179,  37, 226, 152,  34, 136, 145,  16,
38126, 110,  72, 195, 163, 182,  30,  66,  58, 107,  40,  84, 250, 133,  61, 186,
39 43, 121,  10,  21, 155, 159,  94, 202,  78, 212, 172, 229, 243, 115, 167,  87,
40175,  88, 168,  80, 244, 234, 214, 116,  79, 174, 233, 213, 231, 230, 173, 232,
41 44, 215, 117, 122, 235,  22,  11, 245,  89, 203,  95, 176, 156, 169,  81, 160,
42127,  12, 246, 111,  23, 196,  73, 236, 216,  67,  31,  45, 164, 118, 123, 183,
43204, 187,  62,  90, 251,  96, 177, 134,  59,  82, 161, 108, 170,  85,  41, 157,
44151, 178, 135, 144,  97, 190, 220, 252, 188, 149, 207, 205,  55,  63,  91, 209,
45 83,  57, 132,  60,  65, 162, 109,  71,  20,  42, 158,  93,  86, 242, 211, 171,
46 68,  17, 146, 217,  35,  32,  46, 137, 180, 124, 184,  38, 119, 153, 227, 165,
47103,  74, 237, 222, 197,  49, 254,  24,  13,  99, 140, 128, 192, 247, 112,   7
48];
49
50use constant Algotable => [
51  1,   3,   5,  15,  17,  51,  85, 255,  26,  46, 114, 150, 161, 248,  19,  53,
52 95, 225,  56,  72, 216, 115, 149, 164, 247,   2,   6,  10,  30,  34, 102, 170,
53229,  52,  92, 228,  55,  89, 235,  38, 106, 190, 217, 112, 144, 171, 230,  49,
54 83, 245,   4,  12,  20,  60,  68, 204,  79, 209, 104, 184, 211, 110, 178, 205,
55 76, 212, 103, 169, 224,  59,  77, 215,  98, 166, 241,   8,  24,  40, 120, 136,
56131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206,  73, 219, 118, 154,
57181, 196,  87, 249,  16,  48,  80, 240,  11,  29,  39, 105, 187, 214,  97, 163,
58254,  25,  43, 125, 135, 146, 173, 236,  47, 113, 147, 174, 233,  32,  96, 160,
59251,  22,  58,  78, 210, 109, 183, 194,  93, 231,  50,  86, 250,  21,  63,  65,
60195,  94, 226,  61,  71, 201,  64, 192,  91, 237,  44, 116, 156, 191, 218, 117,
61159, 186, 213, 100, 172, 239,  42, 126, 130, 157, 188, 223, 122, 142, 137, 128,
62155, 182, 193,  88, 232,  35, 101, 175, 234,  37, 111, 177, 200,  67, 197,  84,
63252,  31,  33,  99, 165, 244,   7,   9,  27,  45, 119, 153, 176, 203,  70, 202,
64 69, 207,  74, 222, 121, 139, 134, 145, 168, 227,  62,  66, 198,  81, 243,  14,
65 18,  54,  90, 238,  41, 123, 141, 140, 143, 138, 133, 148, 167, 242,  13,  23,
66 57,  75, 221, 124, 132, 151, 162, 253,  28,  36, 108, 180, 199,  82, 246,   1
67];
68
69my @S = (
70 99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254, 215, 171, 118,
71202, 130, 201, 125, 250,  89,  71, 240, 173, 212, 162, 175, 156, 164, 114, 192,
72183, 253, 147,  38,  54,  63, 247, 204,  52, 165, 229, 241, 113, 216,  49,  21,
73  4, 199,  35, 195,  24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,
74  9, 131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,  47, 132,
75 83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,  57,  74,  76,  88, 207,
76208, 239, 170, 251,  67,  77,  51, 133,  69, 249,   2, 127,  80,  60, 159, 168,
77 81, 163,  64, 143, 146, 157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210,
78205,  12,  19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25, 115,
79 96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20, 222,  94,  11, 219,
80224,  50,  58,  10,  73,   6,  36,  92, 194, 211, 172,  98, 145, 149, 228, 121,
81231, 200,  55, 109, 141, 213,  78, 169, 108,  86, 244, 234, 101, 122, 174,   8,
82186, 120,  37,  46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138,
83112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134, 193,  29, 158,
84225, 248, 152,  17, 105, 217, 142, 148, 155,  30, 135, 233, 206,  85,  40, 223,
85140, 161, 137,  13, 191, 230,  66, 104,  65, 153,  45,  15, 176,  84, 187,  22
86);
87
88my @Si = (
89 82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129, 243, 215, 251,
90124, 227,  57, 130, 155,  47, 255, 135,  52, 142,  67,  68, 196, 222, 233, 203,
91 84, 123, 148,  50, 166, 194,  35,  61, 238,  76, 149,  11,  66, 250, 195,  78,
92  8,  46, 161, 102,  40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37,
93114, 248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101, 182, 146,
94108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,  87, 167, 141, 157, 132,
95144, 216, 171,   0, 140, 188, 211,  10, 247, 228,  88,   5, 184, 179,  69,   6,
96208,  44,  30, 143, 202,  63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107,
97 58, 145,  17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115,
98150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,  28, 117, 223, 110,
99 71, 241,  26, 113,  29,  41, 197, 137, 111, 183,  98,  14, 170,  24, 190,  27,
100252,  86,  62,  75, 198, 210, 121,  32, 154, 219, 192, 254, 120, 205,  90, 244,
101 31, 221, 168,  51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95,
102 96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147, 201, 156, 239,
103160, 224,  59,  77, 174,  42, 245, 176, 200, 235, 187,  60, 131,  83, 153,  97,
104 23,  43,   4, 126, 186, 119, 214,  38, 225, 105,  20,  99,  85,  33,  12, 125
105);
106
107my @iG = (
108	[ 0x0e, 0x09, 0x0d, 0x0b ],
109	[ 0x0b, 0x0e, 0x09, 0x0d ],
110	[ 0x0d, 0x0b, 0x0e, 0x09 ],
111	[ 0x09, 0x0d, 0x0b, 0x0e ]
112);
113
114my @rcon = (
115	0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
116	0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f,
117	0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4,
118	0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91
119);
120
121my @T1 = (
122	[0xc6,0x63,0x63,0xa5], [0xf8,0x7c,0x7c,0x84], [0xee,0x77,0x77,0x99], [0xf6,0x7b,0x7b,0x8d],
123	[0xff,0xf2,0xf2,0x0d], [0xd6,0x6b,0x6b,0xbd], [0xde,0x6f,0x6f,0xb1], [0x91,0xc5,0xc5,0x54],
124	[0x60,0x30,0x30,0x50], [0x02,0x01,0x01,0x03], [0xce,0x67,0x67,0xa9], [0x56,0x2b,0x2b,0x7d],
125	[0xe7,0xfe,0xfe,0x19], [0xb5,0xd7,0xd7,0x62], [0x4d,0xab,0xab,0xe6], [0xec,0x76,0x76,0x9a],
126	[0x8f,0xca,0xca,0x45], [0x1f,0x82,0x82,0x9d], [0x89,0xc9,0xc9,0x40], [0xfa,0x7d,0x7d,0x87],
127	[0xef,0xfa,0xfa,0x15], [0xb2,0x59,0x59,0xeb], [0x8e,0x47,0x47,0xc9], [0xfb,0xf0,0xf0,0x0b],
128	[0x41,0xad,0xad,0xec], [0xb3,0xd4,0xd4,0x67], [0x5f,0xa2,0xa2,0xfd], [0x45,0xaf,0xaf,0xea],
129	[0x23,0x9c,0x9c,0xbf], [0x53,0xa4,0xa4,0xf7], [0xe4,0x72,0x72,0x96], [0x9b,0xc0,0xc0,0x5b],
130	[0x75,0xb7,0xb7,0xc2], [0xe1,0xfd,0xfd,0x1c], [0x3d,0x93,0x93,0xae], [0x4c,0x26,0x26,0x6a],
131	[0x6c,0x36,0x36,0x5a], [0x7e,0x3f,0x3f,0x41], [0xf5,0xf7,0xf7,0x02], [0x83,0xcc,0xcc,0x4f],
132	[0x68,0x34,0x34,0x5c], [0x51,0xa5,0xa5,0xf4], [0xd1,0xe5,0xe5,0x34], [0xf9,0xf1,0xf1,0x08],
133	[0xe2,0x71,0x71,0x93], [0xab,0xd8,0xd8,0x73], [0x62,0x31,0x31,0x53], [0x2a,0x15,0x15,0x3f],
134	[0x08,0x04,0x04,0x0c], [0x95,0xc7,0xc7,0x52], [0x46,0x23,0x23,0x65], [0x9d,0xc3,0xc3,0x5e],
135	[0x30,0x18,0x18,0x28], [0x37,0x96,0x96,0xa1], [0x0a,0x05,0x05,0x0f], [0x2f,0x9a,0x9a,0xb5],
136	[0x0e,0x07,0x07,0x09], [0x24,0x12,0x12,0x36], [0x1b,0x80,0x80,0x9b], [0xdf,0xe2,0xe2,0x3d],
137	[0xcd,0xeb,0xeb,0x26], [0x4e,0x27,0x27,0x69], [0x7f,0xb2,0xb2,0xcd], [0xea,0x75,0x75,0x9f],
138	[0x12,0x09,0x09,0x1b], [0x1d,0x83,0x83,0x9e], [0x58,0x2c,0x2c,0x74], [0x34,0x1a,0x1a,0x2e],
139	[0x36,0x1b,0x1b,0x2d], [0xdc,0x6e,0x6e,0xb2], [0xb4,0x5a,0x5a,0xee], [0x5b,0xa0,0xa0,0xfb],
140	[0xa4,0x52,0x52,0xf6], [0x76,0x3b,0x3b,0x4d], [0xb7,0xd6,0xd6,0x61], [0x7d,0xb3,0xb3,0xce],
141	[0x52,0x29,0x29,0x7b], [0xdd,0xe3,0xe3,0x3e], [0x5e,0x2f,0x2f,0x71], [0x13,0x84,0x84,0x97],
142	[0xa6,0x53,0x53,0xf5], [0xb9,0xd1,0xd1,0x68], [0x00,0x00,0x00,0x00], [0xc1,0xed,0xed,0x2c],
143	[0x40,0x20,0x20,0x60], [0xe3,0xfc,0xfc,0x1f], [0x79,0xb1,0xb1,0xc8], [0xb6,0x5b,0x5b,0xed],
144	[0xd4,0x6a,0x6a,0xbe], [0x8d,0xcb,0xcb,0x46], [0x67,0xbe,0xbe,0xd9], [0x72,0x39,0x39,0x4b],
145	[0x94,0x4a,0x4a,0xde], [0x98,0x4c,0x4c,0xd4], [0xb0,0x58,0x58,0xe8], [0x85,0xcf,0xcf,0x4a],
146	[0xbb,0xd0,0xd0,0x6b], [0xc5,0xef,0xef,0x2a], [0x4f,0xaa,0xaa,0xe5], [0xed,0xfb,0xfb,0x16],
147	[0x86,0x43,0x43,0xc5], [0x9a,0x4d,0x4d,0xd7], [0x66,0x33,0x33,0x55], [0x11,0x85,0x85,0x94],
148	[0x8a,0x45,0x45,0xcf], [0xe9,0xf9,0xf9,0x10], [0x04,0x02,0x02,0x06], [0xfe,0x7f,0x7f,0x81],
149	[0xa0,0x50,0x50,0xf0], [0x78,0x3c,0x3c,0x44], [0x25,0x9f,0x9f,0xba], [0x4b,0xa8,0xa8,0xe3],
150	[0xa2,0x51,0x51,0xf3], [0x5d,0xa3,0xa3,0xfe], [0x80,0x40,0x40,0xc0], [0x05,0x8f,0x8f,0x8a],
151	[0x3f,0x92,0x92,0xad], [0x21,0x9d,0x9d,0xbc], [0x70,0x38,0x38,0x48], [0xf1,0xf5,0xf5,0x04],
152	[0x63,0xbc,0xbc,0xdf], [0x77,0xb6,0xb6,0xc1], [0xaf,0xda,0xda,0x75], [0x42,0x21,0x21,0x63],
153	[0x20,0x10,0x10,0x30], [0xe5,0xff,0xff,0x1a], [0xfd,0xf3,0xf3,0x0e], [0xbf,0xd2,0xd2,0x6d],
154	[0x81,0xcd,0xcd,0x4c], [0x18,0x0c,0x0c,0x14], [0x26,0x13,0x13,0x35], [0xc3,0xec,0xec,0x2f],
155	[0xbe,0x5f,0x5f,0xe1], [0x35,0x97,0x97,0xa2], [0x88,0x44,0x44,0xcc], [0x2e,0x17,0x17,0x39],
156	[0x93,0xc4,0xc4,0x57], [0x55,0xa7,0xa7,0xf2], [0xfc,0x7e,0x7e,0x82], [0x7a,0x3d,0x3d,0x47],
157	[0xc8,0x64,0x64,0xac], [0xba,0x5d,0x5d,0xe7], [0x32,0x19,0x19,0x2b], [0xe6,0x73,0x73,0x95],
158	[0xc0,0x60,0x60,0xa0], [0x19,0x81,0x81,0x98], [0x9e,0x4f,0x4f,0xd1], [0xa3,0xdc,0xdc,0x7f],
159	[0x44,0x22,0x22,0x66], [0x54,0x2a,0x2a,0x7e], [0x3b,0x90,0x90,0xab], [0x0b,0x88,0x88,0x83],
160	[0x8c,0x46,0x46,0xca], [0xc7,0xee,0xee,0x29], [0x6b,0xb8,0xb8,0xd3], [0x28,0x14,0x14,0x3c],
161	[0xa7,0xde,0xde,0x79], [0xbc,0x5e,0x5e,0xe2], [0x16,0x0b,0x0b,0x1d], [0xad,0xdb,0xdb,0x76],
162	[0xdb,0xe0,0xe0,0x3b], [0x64,0x32,0x32,0x56], [0x74,0x3a,0x3a,0x4e], [0x14,0x0a,0x0a,0x1e],
163	[0x92,0x49,0x49,0xdb], [0x0c,0x06,0x06,0x0a], [0x48,0x24,0x24,0x6c], [0xb8,0x5c,0x5c,0xe4],
164	[0x9f,0xc2,0xc2,0x5d], [0xbd,0xd3,0xd3,0x6e], [0x43,0xac,0xac,0xef], [0xc4,0x62,0x62,0xa6],
165	[0x39,0x91,0x91,0xa8], [0x31,0x95,0x95,0xa4], [0xd3,0xe4,0xe4,0x37], [0xf2,0x79,0x79,0x8b],
166	[0xd5,0xe7,0xe7,0x32], [0x8b,0xc8,0xc8,0x43], [0x6e,0x37,0x37,0x59], [0xda,0x6d,0x6d,0xb7],
167	[0x01,0x8d,0x8d,0x8c], [0xb1,0xd5,0xd5,0x64], [0x9c,0x4e,0x4e,0xd2], [0x49,0xa9,0xa9,0xe0],
168	[0xd8,0x6c,0x6c,0xb4], [0xac,0x56,0x56,0xfa], [0xf3,0xf4,0xf4,0x07], [0xcf,0xea,0xea,0x25],
169	[0xca,0x65,0x65,0xaf], [0xf4,0x7a,0x7a,0x8e], [0x47,0xae,0xae,0xe9], [0x10,0x08,0x08,0x18],
170	[0x6f,0xba,0xba,0xd5], [0xf0,0x78,0x78,0x88], [0x4a,0x25,0x25,0x6f], [0x5c,0x2e,0x2e,0x72],
171	[0x38,0x1c,0x1c,0x24], [0x57,0xa6,0xa6,0xf1], [0x73,0xb4,0xb4,0xc7], [0x97,0xc6,0xc6,0x51],
172	[0xcb,0xe8,0xe8,0x23], [0xa1,0xdd,0xdd,0x7c], [0xe8,0x74,0x74,0x9c], [0x3e,0x1f,0x1f,0x21],
173	[0x96,0x4b,0x4b,0xdd], [0x61,0xbd,0xbd,0xdc], [0x0d,0x8b,0x8b,0x86], [0x0f,0x8a,0x8a,0x85],
174	[0xe0,0x70,0x70,0x90], [0x7c,0x3e,0x3e,0x42], [0x71,0xb5,0xb5,0xc4], [0xcc,0x66,0x66,0xaa],
175	[0x90,0x48,0x48,0xd8], [0x06,0x03,0x03,0x05], [0xf7,0xf6,0xf6,0x01], [0x1c,0x0e,0x0e,0x12],
176	[0xc2,0x61,0x61,0xa3], [0x6a,0x35,0x35,0x5f], [0xae,0x57,0x57,0xf9], [0x69,0xb9,0xb9,0xd0],
177	[0x17,0x86,0x86,0x91], [0x99,0xc1,0xc1,0x58], [0x3a,0x1d,0x1d,0x27], [0x27,0x9e,0x9e,0xb9],
178	[0xd9,0xe1,0xe1,0x38], [0xeb,0xf8,0xf8,0x13], [0x2b,0x98,0x98,0xb3], [0x22,0x11,0x11,0x33],
179	[0xd2,0x69,0x69,0xbb], [0xa9,0xd9,0xd9,0x70], [0x07,0x8e,0x8e,0x89], [0x33,0x94,0x94,0xa7],
180	[0x2d,0x9b,0x9b,0xb6], [0x3c,0x1e,0x1e,0x22], [0x15,0x87,0x87,0x92], [0xc9,0xe9,0xe9,0x20],
181	[0x87,0xce,0xce,0x49], [0xaa,0x55,0x55,0xff], [0x50,0x28,0x28,0x78], [0xa5,0xdf,0xdf,0x7a],
182	[0x03,0x8c,0x8c,0x8f], [0x59,0xa1,0xa1,0xf8], [0x09,0x89,0x89,0x80], [0x1a,0x0d,0x0d,0x17],
183	[0x65,0xbf,0xbf,0xda], [0xd7,0xe6,0xe6,0x31], [0x84,0x42,0x42,0xc6], [0xd0,0x68,0x68,0xb8],
184	[0x82,0x41,0x41,0xc3], [0x29,0x99,0x99,0xb0], [0x5a,0x2d,0x2d,0x77], [0x1e,0x0f,0x0f,0x11],
185	[0x7b,0xb0,0xb0,0xcb], [0xa8,0x54,0x54,0xfc], [0x6d,0xbb,0xbb,0xd6], [0x2c,0x16,0x16,0x3a]
186);
187
188my @T2 = (
189	[0xa5,0xc6,0x63,0x63], [0x84,0xf8,0x7c,0x7c], [0x99,0xee,0x77,0x77], [0x8d,0xf6,0x7b,0x7b],
190	[0x0d,0xff,0xf2,0xf2], [0xbd,0xd6,0x6b,0x6b], [0xb1,0xde,0x6f,0x6f], [0x54,0x91,0xc5,0xc5],
191	[0x50,0x60,0x30,0x30], [0x03,0x02,0x01,0x01], [0xa9,0xce,0x67,0x67], [0x7d,0x56,0x2b,0x2b],
192	[0x19,0xe7,0xfe,0xfe], [0x62,0xb5,0xd7,0xd7], [0xe6,0x4d,0xab,0xab], [0x9a,0xec,0x76,0x76],
193	[0x45,0x8f,0xca,0xca], [0x9d,0x1f,0x82,0x82], [0x40,0x89,0xc9,0xc9], [0x87,0xfa,0x7d,0x7d],
194	[0x15,0xef,0xfa,0xfa], [0xeb,0xb2,0x59,0x59], [0xc9,0x8e,0x47,0x47], [0x0b,0xfb,0xf0,0xf0],
195	[0xec,0x41,0xad,0xad], [0x67,0xb3,0xd4,0xd4], [0xfd,0x5f,0xa2,0xa2], [0xea,0x45,0xaf,0xaf],
196	[0xbf,0x23,0x9c,0x9c], [0xf7,0x53,0xa4,0xa4], [0x96,0xe4,0x72,0x72], [0x5b,0x9b,0xc0,0xc0],
197	[0xc2,0x75,0xb7,0xb7], [0x1c,0xe1,0xfd,0xfd], [0xae,0x3d,0x93,0x93], [0x6a,0x4c,0x26,0x26],
198	[0x5a,0x6c,0x36,0x36], [0x41,0x7e,0x3f,0x3f], [0x02,0xf5,0xf7,0xf7], [0x4f,0x83,0xcc,0xcc],
199	[0x5c,0x68,0x34,0x34], [0xf4,0x51,0xa5,0xa5], [0x34,0xd1,0xe5,0xe5], [0x08,0xf9,0xf1,0xf1],
200	[0x93,0xe2,0x71,0x71], [0x73,0xab,0xd8,0xd8], [0x53,0x62,0x31,0x31], [0x3f,0x2a,0x15,0x15],
201	[0x0c,0x08,0x04,0x04], [0x52,0x95,0xc7,0xc7], [0x65,0x46,0x23,0x23], [0x5e,0x9d,0xc3,0xc3],
202	[0x28,0x30,0x18,0x18], [0xa1,0x37,0x96,0x96], [0x0f,0x0a,0x05,0x05], [0xb5,0x2f,0x9a,0x9a],
203	[0x09,0x0e,0x07,0x07], [0x36,0x24,0x12,0x12], [0x9b,0x1b,0x80,0x80], [0x3d,0xdf,0xe2,0xe2],
204	[0x26,0xcd,0xeb,0xeb], [0x69,0x4e,0x27,0x27], [0xcd,0x7f,0xb2,0xb2], [0x9f,0xea,0x75,0x75],
205	[0x1b,0x12,0x09,0x09], [0x9e,0x1d,0x83,0x83], [0x74,0x58,0x2c,0x2c], [0x2e,0x34,0x1a,0x1a],
206	[0x2d,0x36,0x1b,0x1b], [0xb2,0xdc,0x6e,0x6e], [0xee,0xb4,0x5a,0x5a], [0xfb,0x5b,0xa0,0xa0],
207	[0xf6,0xa4,0x52,0x52], [0x4d,0x76,0x3b,0x3b], [0x61,0xb7,0xd6,0xd6], [0xce,0x7d,0xb3,0xb3],
208	[0x7b,0x52,0x29,0x29], [0x3e,0xdd,0xe3,0xe3], [0x71,0x5e,0x2f,0x2f], [0x97,0x13,0x84,0x84],
209	[0xf5,0xa6,0x53,0x53], [0x68,0xb9,0xd1,0xd1], [0x00,0x00,0x00,0x00], [0x2c,0xc1,0xed,0xed],
210	[0x60,0x40,0x20,0x20], [0x1f,0xe3,0xfc,0xfc], [0xc8,0x79,0xb1,0xb1], [0xed,0xb6,0x5b,0x5b],
211	[0xbe,0xd4,0x6a,0x6a], [0x46,0x8d,0xcb,0xcb], [0xd9,0x67,0xbe,0xbe], [0x4b,0x72,0x39,0x39],
212	[0xde,0x94,0x4a,0x4a], [0xd4,0x98,0x4c,0x4c], [0xe8,0xb0,0x58,0x58], [0x4a,0x85,0xcf,0xcf],
213	[0x6b,0xbb,0xd0,0xd0], [0x2a,0xc5,0xef,0xef], [0xe5,0x4f,0xaa,0xaa], [0x16,0xed,0xfb,0xfb],
214	[0xc5,0x86,0x43,0x43], [0xd7,0x9a,0x4d,0x4d], [0x55,0x66,0x33,0x33], [0x94,0x11,0x85,0x85],
215	[0xcf,0x8a,0x45,0x45], [0x10,0xe9,0xf9,0xf9], [0x06,0x04,0x02,0x02], [0x81,0xfe,0x7f,0x7f],
216	[0xf0,0xa0,0x50,0x50], [0x44,0x78,0x3c,0x3c], [0xba,0x25,0x9f,0x9f], [0xe3,0x4b,0xa8,0xa8],
217	[0xf3,0xa2,0x51,0x51], [0xfe,0x5d,0xa3,0xa3], [0xc0,0x80,0x40,0x40], [0x8a,0x05,0x8f,0x8f],
218	[0xad,0x3f,0x92,0x92], [0xbc,0x21,0x9d,0x9d], [0x48,0x70,0x38,0x38], [0x04,0xf1,0xf5,0xf5],
219	[0xdf,0x63,0xbc,0xbc], [0xc1,0x77,0xb6,0xb6], [0x75,0xaf,0xda,0xda], [0x63,0x42,0x21,0x21],
220	[0x30,0x20,0x10,0x10], [0x1a,0xe5,0xff,0xff], [0x0e,0xfd,0xf3,0xf3], [0x6d,0xbf,0xd2,0xd2],
221	[0x4c,0x81,0xcd,0xcd], [0x14,0x18,0x0c,0x0c], [0x35,0x26,0x13,0x13], [0x2f,0xc3,0xec,0xec],
222	[0xe1,0xbe,0x5f,0x5f], [0xa2,0x35,0x97,0x97], [0xcc,0x88,0x44,0x44], [0x39,0x2e,0x17,0x17],
223	[0x57,0x93,0xc4,0xc4], [0xf2,0x55,0xa7,0xa7], [0x82,0xfc,0x7e,0x7e], [0x47,0x7a,0x3d,0x3d],
224	[0xac,0xc8,0x64,0x64], [0xe7,0xba,0x5d,0x5d], [0x2b,0x32,0x19,0x19], [0x95,0xe6,0x73,0x73],
225	[0xa0,0xc0,0x60,0x60], [0x98,0x19,0x81,0x81], [0xd1,0x9e,0x4f,0x4f], [0x7f,0xa3,0xdc,0xdc],
226	[0x66,0x44,0x22,0x22], [0x7e,0x54,0x2a,0x2a], [0xab,0x3b,0x90,0x90], [0x83,0x0b,0x88,0x88],
227	[0xca,0x8c,0x46,0x46], [0x29,0xc7,0xee,0xee], [0xd3,0x6b,0xb8,0xb8], [0x3c,0x28,0x14,0x14],
228	[0x79,0xa7,0xde,0xde], [0xe2,0xbc,0x5e,0x5e], [0x1d,0x16,0x0b,0x0b], [0x76,0xad,0xdb,0xdb],
229	[0x3b,0xdb,0xe0,0xe0], [0x56,0x64,0x32,0x32], [0x4e,0x74,0x3a,0x3a], [0x1e,0x14,0x0a,0x0a],
230	[0xdb,0x92,0x49,0x49], [0x0a,0x0c,0x06,0x06], [0x6c,0x48,0x24,0x24], [0xe4,0xb8,0x5c,0x5c],
231	[0x5d,0x9f,0xc2,0xc2], [0x6e,0xbd,0xd3,0xd3], [0xef,0x43,0xac,0xac], [0xa6,0xc4,0x62,0x62],
232	[0xa8,0x39,0x91,0x91], [0xa4,0x31,0x95,0x95], [0x37,0xd3,0xe4,0xe4], [0x8b,0xf2,0x79,0x79],
233	[0x32,0xd5,0xe7,0xe7], [0x43,0x8b,0xc8,0xc8], [0x59,0x6e,0x37,0x37], [0xb7,0xda,0x6d,0x6d],
234	[0x8c,0x01,0x8d,0x8d], [0x64,0xb1,0xd5,0xd5], [0xd2,0x9c,0x4e,0x4e], [0xe0,0x49,0xa9,0xa9],
235	[0xb4,0xd8,0x6c,0x6c], [0xfa,0xac,0x56,0x56], [0x07,0xf3,0xf4,0xf4], [0x25,0xcf,0xea,0xea],
236	[0xaf,0xca,0x65,0x65], [0x8e,0xf4,0x7a,0x7a], [0xe9,0x47,0xae,0xae], [0x18,0x10,0x08,0x08],
237	[0xd5,0x6f,0xba,0xba], [0x88,0xf0,0x78,0x78], [0x6f,0x4a,0x25,0x25], [0x72,0x5c,0x2e,0x2e],
238	[0x24,0x38,0x1c,0x1c], [0xf1,0x57,0xa6,0xa6], [0xc7,0x73,0xb4,0xb4], [0x51,0x97,0xc6,0xc6],
239	[0x23,0xcb,0xe8,0xe8], [0x7c,0xa1,0xdd,0xdd], [0x9c,0xe8,0x74,0x74], [0x21,0x3e,0x1f,0x1f],
240	[0xdd,0x96,0x4b,0x4b], [0xdc,0x61,0xbd,0xbd], [0x86,0x0d,0x8b,0x8b], [0x85,0x0f,0x8a,0x8a],
241	[0x90,0xe0,0x70,0x70], [0x42,0x7c,0x3e,0x3e], [0xc4,0x71,0xb5,0xb5], [0xaa,0xcc,0x66,0x66],
242	[0xd8,0x90,0x48,0x48], [0x05,0x06,0x03,0x03], [0x01,0xf7,0xf6,0xf6], [0x12,0x1c,0x0e,0x0e],
243	[0xa3,0xc2,0x61,0x61], [0x5f,0x6a,0x35,0x35], [0xf9,0xae,0x57,0x57], [0xd0,0x69,0xb9,0xb9],
244	[0x91,0x17,0x86,0x86], [0x58,0x99,0xc1,0xc1], [0x27,0x3a,0x1d,0x1d], [0xb9,0x27,0x9e,0x9e],
245	[0x38,0xd9,0xe1,0xe1], [0x13,0xeb,0xf8,0xf8], [0xb3,0x2b,0x98,0x98], [0x33,0x22,0x11,0x11],
246	[0xbb,0xd2,0x69,0x69], [0x70,0xa9,0xd9,0xd9], [0x89,0x07,0x8e,0x8e], [0xa7,0x33,0x94,0x94],
247	[0xb6,0x2d,0x9b,0x9b], [0x22,0x3c,0x1e,0x1e], [0x92,0x15,0x87,0x87], [0x20,0xc9,0xe9,0xe9],
248	[0x49,0x87,0xce,0xce], [0xff,0xaa,0x55,0x55], [0x78,0x50,0x28,0x28], [0x7a,0xa5,0xdf,0xdf],
249	[0x8f,0x03,0x8c,0x8c], [0xf8,0x59,0xa1,0xa1], [0x80,0x09,0x89,0x89], [0x17,0x1a,0x0d,0x0d],
250	[0xda,0x65,0xbf,0xbf], [0x31,0xd7,0xe6,0xe6], [0xc6,0x84,0x42,0x42], [0xb8,0xd0,0x68,0x68],
251	[0xc3,0x82,0x41,0x41], [0xb0,0x29,0x99,0x99], [0x77,0x5a,0x2d,0x2d], [0x11,0x1e,0x0f,0x0f],
252	[0xcb,0x7b,0xb0,0xb0], [0xfc,0xa8,0x54,0x54], [0xd6,0x6d,0xbb,0xbb], [0x3a,0x2c,0x16,0x16]
253);
254
255my @T3 = (
256	[0x63,0xa5,0xc6,0x63], [0x7c,0x84,0xf8,0x7c], [0x77,0x99,0xee,0x77], [0x7b,0x8d,0xf6,0x7b],
257	[0xf2,0x0d,0xff,0xf2], [0x6b,0xbd,0xd6,0x6b], [0x6f,0xb1,0xde,0x6f], [0xc5,0x54,0x91,0xc5],
258	[0x30,0x50,0x60,0x30], [0x01,0x03,0x02,0x01], [0x67,0xa9,0xce,0x67], [0x2b,0x7d,0x56,0x2b],
259	[0xfe,0x19,0xe7,0xfe], [0xd7,0x62,0xb5,0xd7], [0xab,0xe6,0x4d,0xab], [0x76,0x9a,0xec,0x76],
260	[0xca,0x45,0x8f,0xca], [0x82,0x9d,0x1f,0x82], [0xc9,0x40,0x89,0xc9], [0x7d,0x87,0xfa,0x7d],
261	[0xfa,0x15,0xef,0xfa], [0x59,0xeb,0xb2,0x59], [0x47,0xc9,0x8e,0x47], [0xf0,0x0b,0xfb,0xf0],
262	[0xad,0xec,0x41,0xad], [0xd4,0x67,0xb3,0xd4], [0xa2,0xfd,0x5f,0xa2], [0xaf,0xea,0x45,0xaf],
263	[0x9c,0xbf,0x23,0x9c], [0xa4,0xf7,0x53,0xa4], [0x72,0x96,0xe4,0x72], [0xc0,0x5b,0x9b,0xc0],
264	[0xb7,0xc2,0x75,0xb7], [0xfd,0x1c,0xe1,0xfd], [0x93,0xae,0x3d,0x93], [0x26,0x6a,0x4c,0x26],
265	[0x36,0x5a,0x6c,0x36], [0x3f,0x41,0x7e,0x3f], [0xf7,0x02,0xf5,0xf7], [0xcc,0x4f,0x83,0xcc],
266	[0x34,0x5c,0x68,0x34], [0xa5,0xf4,0x51,0xa5], [0xe5,0x34,0xd1,0xe5], [0xf1,0x08,0xf9,0xf1],
267	[0x71,0x93,0xe2,0x71], [0xd8,0x73,0xab,0xd8], [0x31,0x53,0x62,0x31], [0x15,0x3f,0x2a,0x15],
268	[0x04,0x0c,0x08,0x04], [0xc7,0x52,0x95,0xc7], [0x23,0x65,0x46,0x23], [0xc3,0x5e,0x9d,0xc3],
269	[0x18,0x28,0x30,0x18], [0x96,0xa1,0x37,0x96], [0x05,0x0f,0x0a,0x05], [0x9a,0xb5,0x2f,0x9a],
270	[0x07,0x09,0x0e,0x07], [0x12,0x36,0x24,0x12], [0x80,0x9b,0x1b,0x80], [0xe2,0x3d,0xdf,0xe2],
271	[0xeb,0x26,0xcd,0xeb], [0x27,0x69,0x4e,0x27], [0xb2,0xcd,0x7f,0xb2], [0x75,0x9f,0xea,0x75],
272	[0x09,0x1b,0x12,0x09], [0x83,0x9e,0x1d,0x83], [0x2c,0x74,0x58,0x2c], [0x1a,0x2e,0x34,0x1a],
273	[0x1b,0x2d,0x36,0x1b], [0x6e,0xb2,0xdc,0x6e], [0x5a,0xee,0xb4,0x5a], [0xa0,0xfb,0x5b,0xa0],
274	[0x52,0xf6,0xa4,0x52], [0x3b,0x4d,0x76,0x3b], [0xd6,0x61,0xb7,0xd6], [0xb3,0xce,0x7d,0xb3],
275	[0x29,0x7b,0x52,0x29], [0xe3,0x3e,0xdd,0xe3], [0x2f,0x71,0x5e,0x2f], [0x84,0x97,0x13,0x84],
276	[0x53,0xf5,0xa6,0x53], [0xd1,0x68,0xb9,0xd1], [0x00,0x00,0x00,0x00], [0xed,0x2c,0xc1,0xed],
277	[0x20,0x60,0x40,0x20], [0xfc,0x1f,0xe3,0xfc], [0xb1,0xc8,0x79,0xb1], [0x5b,0xed,0xb6,0x5b],
278	[0x6a,0xbe,0xd4,0x6a], [0xcb,0x46,0x8d,0xcb], [0xbe,0xd9,0x67,0xbe], [0x39,0x4b,0x72,0x39],
279	[0x4a,0xde,0x94,0x4a], [0x4c,0xd4,0x98,0x4c], [0x58,0xe8,0xb0,0x58], [0xcf,0x4a,0x85,0xcf],
280	[0xd0,0x6b,0xbb,0xd0], [0xef,0x2a,0xc5,0xef], [0xaa,0xe5,0x4f,0xaa], [0xfb,0x16,0xed,0xfb],
281	[0x43,0xc5,0x86,0x43], [0x4d,0xd7,0x9a,0x4d], [0x33,0x55,0x66,0x33], [0x85,0x94,0x11,0x85],
282	[0x45,0xcf,0x8a,0x45], [0xf9,0x10,0xe9,0xf9], [0x02,0x06,0x04,0x02], [0x7f,0x81,0xfe,0x7f],
283	[0x50,0xf0,0xa0,0x50], [0x3c,0x44,0x78,0x3c], [0x9f,0xba,0x25,0x9f], [0xa8,0xe3,0x4b,0xa8],
284	[0x51,0xf3,0xa2,0x51], [0xa3,0xfe,0x5d,0xa3], [0x40,0xc0,0x80,0x40], [0x8f,0x8a,0x05,0x8f],
285	[0x92,0xad,0x3f,0x92], [0x9d,0xbc,0x21,0x9d], [0x38,0x48,0x70,0x38], [0xf5,0x04,0xf1,0xf5],
286	[0xbc,0xdf,0x63,0xbc], [0xb6,0xc1,0x77,0xb6], [0xda,0x75,0xaf,0xda], [0x21,0x63,0x42,0x21],
287	[0x10,0x30,0x20,0x10], [0xff,0x1a,0xe5,0xff], [0xf3,0x0e,0xfd,0xf3], [0xd2,0x6d,0xbf,0xd2],
288	[0xcd,0x4c,0x81,0xcd], [0x0c,0x14,0x18,0x0c], [0x13,0x35,0x26,0x13], [0xec,0x2f,0xc3,0xec],
289	[0x5f,0xe1,0xbe,0x5f], [0x97,0xa2,0x35,0x97], [0x44,0xcc,0x88,0x44], [0x17,0x39,0x2e,0x17],
290	[0xc4,0x57,0x93,0xc4], [0xa7,0xf2,0x55,0xa7], [0x7e,0x82,0xfc,0x7e], [0x3d,0x47,0x7a,0x3d],
291	[0x64,0xac,0xc8,0x64], [0x5d,0xe7,0xba,0x5d], [0x19,0x2b,0x32,0x19], [0x73,0x95,0xe6,0x73],
292	[0x60,0xa0,0xc0,0x60], [0x81,0x98,0x19,0x81], [0x4f,0xd1,0x9e,0x4f], [0xdc,0x7f,0xa3,0xdc],
293	[0x22,0x66,0x44,0x22], [0x2a,0x7e,0x54,0x2a], [0x90,0xab,0x3b,0x90], [0x88,0x83,0x0b,0x88],
294	[0x46,0xca,0x8c,0x46], [0xee,0x29,0xc7,0xee], [0xb8,0xd3,0x6b,0xb8], [0x14,0x3c,0x28,0x14],
295	[0xde,0x79,0xa7,0xde], [0x5e,0xe2,0xbc,0x5e], [0x0b,0x1d,0x16,0x0b], [0xdb,0x76,0xad,0xdb],
296	[0xe0,0x3b,0xdb,0xe0], [0x32,0x56,0x64,0x32], [0x3a,0x4e,0x74,0x3a], [0x0a,0x1e,0x14,0x0a],
297	[0x49,0xdb,0x92,0x49], [0x06,0x0a,0x0c,0x06], [0x24,0x6c,0x48,0x24], [0x5c,0xe4,0xb8,0x5c],
298	[0xc2,0x5d,0x9f,0xc2], [0xd3,0x6e,0xbd,0xd3], [0xac,0xef,0x43,0xac], [0x62,0xa6,0xc4,0x62],
299	[0x91,0xa8,0x39,0x91], [0x95,0xa4,0x31,0x95], [0xe4,0x37,0xd3,0xe4], [0x79,0x8b,0xf2,0x79],
300	[0xe7,0x32,0xd5,0xe7], [0xc8,0x43,0x8b,0xc8], [0x37,0x59,0x6e,0x37], [0x6d,0xb7,0xda,0x6d],
301	[0x8d,0x8c,0x01,0x8d], [0xd5,0x64,0xb1,0xd5], [0x4e,0xd2,0x9c,0x4e], [0xa9,0xe0,0x49,0xa9],
302	[0x6c,0xb4,0xd8,0x6c], [0x56,0xfa,0xac,0x56], [0xf4,0x07,0xf3,0xf4], [0xea,0x25,0xcf,0xea],
303	[0x65,0xaf,0xca,0x65], [0x7a,0x8e,0xf4,0x7a], [0xae,0xe9,0x47,0xae], [0x08,0x18,0x10,0x08],
304	[0xba,0xd5,0x6f,0xba], [0x78,0x88,0xf0,0x78], [0x25,0x6f,0x4a,0x25], [0x2e,0x72,0x5c,0x2e],
305	[0x1c,0x24,0x38,0x1c], [0xa6,0xf1,0x57,0xa6], [0xb4,0xc7,0x73,0xb4], [0xc6,0x51,0x97,0xc6],
306	[0xe8,0x23,0xcb,0xe8], [0xdd,0x7c,0xa1,0xdd], [0x74,0x9c,0xe8,0x74], [0x1f,0x21,0x3e,0x1f],
307	[0x4b,0xdd,0x96,0x4b], [0xbd,0xdc,0x61,0xbd], [0x8b,0x86,0x0d,0x8b], [0x8a,0x85,0x0f,0x8a],
308	[0x70,0x90,0xe0,0x70], [0x3e,0x42,0x7c,0x3e], [0xb5,0xc4,0x71,0xb5], [0x66,0xaa,0xcc,0x66],
309	[0x48,0xd8,0x90,0x48], [0x03,0x05,0x06,0x03], [0xf6,0x01,0xf7,0xf6], [0x0e,0x12,0x1c,0x0e],
310	[0x61,0xa3,0xc2,0x61], [0x35,0x5f,0x6a,0x35], [0x57,0xf9,0xae,0x57], [0xb9,0xd0,0x69,0xb9],
311	[0x86,0x91,0x17,0x86], [0xc1,0x58,0x99,0xc1], [0x1d,0x27,0x3a,0x1d], [0x9e,0xb9,0x27,0x9e],
312	[0xe1,0x38,0xd9,0xe1], [0xf8,0x13,0xeb,0xf8], [0x98,0xb3,0x2b,0x98], [0x11,0x33,0x22,0x11],
313	[0x69,0xbb,0xd2,0x69], [0xd9,0x70,0xa9,0xd9], [0x8e,0x89,0x07,0x8e], [0x94,0xa7,0x33,0x94],
314	[0x9b,0xb6,0x2d,0x9b], [0x1e,0x22,0x3c,0x1e], [0x87,0x92,0x15,0x87], [0xe9,0x20,0xc9,0xe9],
315	[0xce,0x49,0x87,0xce], [0x55,0xff,0xaa,0x55], [0x28,0x78,0x50,0x28], [0xdf,0x7a,0xa5,0xdf],
316	[0x8c,0x8f,0x03,0x8c], [0xa1,0xf8,0x59,0xa1], [0x89,0x80,0x09,0x89], [0x0d,0x17,0x1a,0x0d],
317	[0xbf,0xda,0x65,0xbf], [0xe6,0x31,0xd7,0xe6], [0x42,0xc6,0x84,0x42], [0x68,0xb8,0xd0,0x68],
318	[0x41,0xc3,0x82,0x41], [0x99,0xb0,0x29,0x99], [0x2d,0x77,0x5a,0x2d], [0x0f,0x11,0x1e,0x0f],
319	[0xb0,0xcb,0x7b,0xb0], [0x54,0xfc,0xa8,0x54], [0xbb,0xd6,0x6d,0xbb], [0x16,0x3a,0x2c,0x16]
320);
321
322my @T4 = (
323	[0x63,0x63,0xa5,0xc6], [0x7c,0x7c,0x84,0xf8], [0x77,0x77,0x99,0xee], [0x7b,0x7b,0x8d,0xf6],
324	[0xf2,0xf2,0x0d,0xff], [0x6b,0x6b,0xbd,0xd6], [0x6f,0x6f,0xb1,0xde], [0xc5,0xc5,0x54,0x91],
325	[0x30,0x30,0x50,0x60], [0x01,0x01,0x03,0x02], [0x67,0x67,0xa9,0xce], [0x2b,0x2b,0x7d,0x56],
326	[0xfe,0xfe,0x19,0xe7], [0xd7,0xd7,0x62,0xb5], [0xab,0xab,0xe6,0x4d], [0x76,0x76,0x9a,0xec],
327	[0xca,0xca,0x45,0x8f], [0x82,0x82,0x9d,0x1f], [0xc9,0xc9,0x40,0x89], [0x7d,0x7d,0x87,0xfa],
328	[0xfa,0xfa,0x15,0xef], [0x59,0x59,0xeb,0xb2], [0x47,0x47,0xc9,0x8e], [0xf0,0xf0,0x0b,0xfb],
329	[0xad,0xad,0xec,0x41], [0xd4,0xd4,0x67,0xb3], [0xa2,0xa2,0xfd,0x5f], [0xaf,0xaf,0xea,0x45],
330	[0x9c,0x9c,0xbf,0x23], [0xa4,0xa4,0xf7,0x53], [0x72,0x72,0x96,0xe4], [0xc0,0xc0,0x5b,0x9b],
331	[0xb7,0xb7,0xc2,0x75], [0xfd,0xfd,0x1c,0xe1], [0x93,0x93,0xae,0x3d], [0x26,0x26,0x6a,0x4c],
332	[0x36,0x36,0x5a,0x6c], [0x3f,0x3f,0x41,0x7e], [0xf7,0xf7,0x02,0xf5], [0xcc,0xcc,0x4f,0x83],
333	[0x34,0x34,0x5c,0x68], [0xa5,0xa5,0xf4,0x51], [0xe5,0xe5,0x34,0xd1], [0xf1,0xf1,0x08,0xf9],
334	[0x71,0x71,0x93,0xe2], [0xd8,0xd8,0x73,0xab], [0x31,0x31,0x53,0x62], [0x15,0x15,0x3f,0x2a],
335	[0x04,0x04,0x0c,0x08], [0xc7,0xc7,0x52,0x95], [0x23,0x23,0x65,0x46], [0xc3,0xc3,0x5e,0x9d],
336	[0x18,0x18,0x28,0x30], [0x96,0x96,0xa1,0x37], [0x05,0x05,0x0f,0x0a], [0x9a,0x9a,0xb5,0x2f],
337	[0x07,0x07,0x09,0x0e], [0x12,0x12,0x36,0x24], [0x80,0x80,0x9b,0x1b], [0xe2,0xe2,0x3d,0xdf],
338	[0xeb,0xeb,0x26,0xcd], [0x27,0x27,0x69,0x4e], [0xb2,0xb2,0xcd,0x7f], [0x75,0x75,0x9f,0xea],
339	[0x09,0x09,0x1b,0x12], [0x83,0x83,0x9e,0x1d], [0x2c,0x2c,0x74,0x58], [0x1a,0x1a,0x2e,0x34],
340	[0x1b,0x1b,0x2d,0x36], [0x6e,0x6e,0xb2,0xdc], [0x5a,0x5a,0xee,0xb4], [0xa0,0xa0,0xfb,0x5b],
341	[0x52,0x52,0xf6,0xa4], [0x3b,0x3b,0x4d,0x76], [0xd6,0xd6,0x61,0xb7], [0xb3,0xb3,0xce,0x7d],
342	[0x29,0x29,0x7b,0x52], [0xe3,0xe3,0x3e,0xdd], [0x2f,0x2f,0x71,0x5e], [0x84,0x84,0x97,0x13],
343	[0x53,0x53,0xf5,0xa6], [0xd1,0xd1,0x68,0xb9], [0x00,0x00,0x00,0x00], [0xed,0xed,0x2c,0xc1],
344	[0x20,0x20,0x60,0x40], [0xfc,0xfc,0x1f,0xe3], [0xb1,0xb1,0xc8,0x79], [0x5b,0x5b,0xed,0xb6],
345	[0x6a,0x6a,0xbe,0xd4], [0xcb,0xcb,0x46,0x8d], [0xbe,0xbe,0xd9,0x67], [0x39,0x39,0x4b,0x72],
346	[0x4a,0x4a,0xde,0x94], [0x4c,0x4c,0xd4,0x98], [0x58,0x58,0xe8,0xb0], [0xcf,0xcf,0x4a,0x85],
347	[0xd0,0xd0,0x6b,0xbb], [0xef,0xef,0x2a,0xc5], [0xaa,0xaa,0xe5,0x4f], [0xfb,0xfb,0x16,0xed],
348	[0x43,0x43,0xc5,0x86], [0x4d,0x4d,0xd7,0x9a], [0x33,0x33,0x55,0x66], [0x85,0x85,0x94,0x11],
349	[0x45,0x45,0xcf,0x8a], [0xf9,0xf9,0x10,0xe9], [0x02,0x02,0x06,0x04], [0x7f,0x7f,0x81,0xfe],
350	[0x50,0x50,0xf0,0xa0], [0x3c,0x3c,0x44,0x78], [0x9f,0x9f,0xba,0x25], [0xa8,0xa8,0xe3,0x4b],
351	[0x51,0x51,0xf3,0xa2], [0xa3,0xa3,0xfe,0x5d], [0x40,0x40,0xc0,0x80], [0x8f,0x8f,0x8a,0x05],
352	[0x92,0x92,0xad,0x3f], [0x9d,0x9d,0xbc,0x21], [0x38,0x38,0x48,0x70], [0xf5,0xf5,0x04,0xf1],
353	[0xbc,0xbc,0xdf,0x63], [0xb6,0xb6,0xc1,0x77], [0xda,0xda,0x75,0xaf], [0x21,0x21,0x63,0x42],
354	[0x10,0x10,0x30,0x20], [0xff,0xff,0x1a,0xe5], [0xf3,0xf3,0x0e,0xfd], [0xd2,0xd2,0x6d,0xbf],
355	[0xcd,0xcd,0x4c,0x81], [0x0c,0x0c,0x14,0x18], [0x13,0x13,0x35,0x26], [0xec,0xec,0x2f,0xc3],
356	[0x5f,0x5f,0xe1,0xbe], [0x97,0x97,0xa2,0x35], [0x44,0x44,0xcc,0x88], [0x17,0x17,0x39,0x2e],
357	[0xc4,0xc4,0x57,0x93], [0xa7,0xa7,0xf2,0x55], [0x7e,0x7e,0x82,0xfc], [0x3d,0x3d,0x47,0x7a],
358	[0x64,0x64,0xac,0xc8], [0x5d,0x5d,0xe7,0xba], [0x19,0x19,0x2b,0x32], [0x73,0x73,0x95,0xe6],
359	[0x60,0x60,0xa0,0xc0], [0x81,0x81,0x98,0x19], [0x4f,0x4f,0xd1,0x9e], [0xdc,0xdc,0x7f,0xa3],
360	[0x22,0x22,0x66,0x44], [0x2a,0x2a,0x7e,0x54], [0x90,0x90,0xab,0x3b], [0x88,0x88,0x83,0x0b],
361	[0x46,0x46,0xca,0x8c], [0xee,0xee,0x29,0xc7], [0xb8,0xb8,0xd3,0x6b], [0x14,0x14,0x3c,0x28],
362	[0xde,0xde,0x79,0xa7], [0x5e,0x5e,0xe2,0xbc], [0x0b,0x0b,0x1d,0x16], [0xdb,0xdb,0x76,0xad],
363	[0xe0,0xe0,0x3b,0xdb], [0x32,0x32,0x56,0x64], [0x3a,0x3a,0x4e,0x74], [0x0a,0x0a,0x1e,0x14],
364	[0x49,0x49,0xdb,0x92], [0x06,0x06,0x0a,0x0c], [0x24,0x24,0x6c,0x48], [0x5c,0x5c,0xe4,0xb8],
365	[0xc2,0xc2,0x5d,0x9f], [0xd3,0xd3,0x6e,0xbd], [0xac,0xac,0xef,0x43], [0x62,0x62,0xa6,0xc4],
366	[0x91,0x91,0xa8,0x39], [0x95,0x95,0xa4,0x31], [0xe4,0xe4,0x37,0xd3], [0x79,0x79,0x8b,0xf2],
367	[0xe7,0xe7,0x32,0xd5], [0xc8,0xc8,0x43,0x8b], [0x37,0x37,0x59,0x6e], [0x6d,0x6d,0xb7,0xda],
368	[0x8d,0x8d,0x8c,0x01], [0xd5,0xd5,0x64,0xb1], [0x4e,0x4e,0xd2,0x9c], [0xa9,0xa9,0xe0,0x49],
369	[0x6c,0x6c,0xb4,0xd8], [0x56,0x56,0xfa,0xac], [0xf4,0xf4,0x07,0xf3], [0xea,0xea,0x25,0xcf],
370	[0x65,0x65,0xaf,0xca], [0x7a,0x7a,0x8e,0xf4], [0xae,0xae,0xe9,0x47], [0x08,0x08,0x18,0x10],
371	[0xba,0xba,0xd5,0x6f], [0x78,0x78,0x88,0xf0], [0x25,0x25,0x6f,0x4a], [0x2e,0x2e,0x72,0x5c],
372	[0x1c,0x1c,0x24,0x38], [0xa6,0xa6,0xf1,0x57], [0xb4,0xb4,0xc7,0x73], [0xc6,0xc6,0x51,0x97],
373	[0xe8,0xe8,0x23,0xcb], [0xdd,0xdd,0x7c,0xa1], [0x74,0x74,0x9c,0xe8], [0x1f,0x1f,0x21,0x3e],
374	[0x4b,0x4b,0xdd,0x96], [0xbd,0xbd,0xdc,0x61], [0x8b,0x8b,0x86,0x0d], [0x8a,0x8a,0x85,0x0f],
375	[0x70,0x70,0x90,0xe0], [0x3e,0x3e,0x42,0x7c], [0xb5,0xb5,0xc4,0x71], [0x66,0x66,0xaa,0xcc],
376	[0x48,0x48,0xd8,0x90], [0x03,0x03,0x05,0x06], [0xf6,0xf6,0x01,0xf7], [0x0e,0x0e,0x12,0x1c],
377	[0x61,0x61,0xa3,0xc2], [0x35,0x35,0x5f,0x6a], [0x57,0x57,0xf9,0xae], [0xb9,0xb9,0xd0,0x69],
378	[0x86,0x86,0x91,0x17], [0xc1,0xc1,0x58,0x99], [0x1d,0x1d,0x27,0x3a], [0x9e,0x9e,0xb9,0x27],
379	[0xe1,0xe1,0x38,0xd9], [0xf8,0xf8,0x13,0xeb], [0x98,0x98,0xb3,0x2b], [0x11,0x11,0x33,0x22],
380	[0x69,0x69,0xbb,0xd2], [0xd9,0xd9,0x70,0xa9], [0x8e,0x8e,0x89,0x07], [0x94,0x94,0xa7,0x33],
381	[0x9b,0x9b,0xb6,0x2d], [0x1e,0x1e,0x22,0x3c], [0x87,0x87,0x92,0x15], [0xe9,0xe9,0x20,0xc9],
382	[0xce,0xce,0x49,0x87], [0x55,0x55,0xff,0xaa], [0x28,0x28,0x78,0x50], [0xdf,0xdf,0x7a,0xa5],
383	[0x8c,0x8c,0x8f,0x03], [0xa1,0xa1,0xf8,0x59], [0x89,0x89,0x80,0x09], [0x0d,0x0d,0x17,0x1a],
384	[0xbf,0xbf,0xda,0x65], [0xe6,0xe6,0x31,0xd7], [0x42,0x42,0xc6,0x84], [0x68,0x68,0xb8,0xd0],
385	[0x41,0x41,0xc3,0x82], [0x99,0x99,0xb0,0x29], [0x2d,0x2d,0x77,0x5a], [0x0f,0x0f,0x11,0x1e],
386	[0xb0,0xb0,0xcb,0x7b], [0x54,0x54,0xfc,0xa8], [0xbb,0xbb,0xd6,0x6d], [0x16,0x16,0x3a,0x2c]
387);
388
389my @T5 = (
390	[0x51,0xf4,0xa7,0x50], [0x7e,0x41,0x65,0x53], [0x1a,0x17,0xa4,0xc3], [0x3a,0x27,0x5e,0x96],
391	[0x3b,0xab,0x6b,0xcb], [0x1f,0x9d,0x45,0xf1], [0xac,0xfa,0x58,0xab], [0x4b,0xe3,0x03,0x93],
392	[0x20,0x30,0xfa,0x55], [0xad,0x76,0x6d,0xf6], [0x88,0xcc,0x76,0x91], [0xf5,0x02,0x4c,0x25],
393	[0x4f,0xe5,0xd7,0xfc], [0xc5,0x2a,0xcb,0xd7], [0x26,0x35,0x44,0x80], [0xb5,0x62,0xa3,0x8f],
394	[0xde,0xb1,0x5a,0x49], [0x25,0xba,0x1b,0x67], [0x45,0xea,0x0e,0x98], [0x5d,0xfe,0xc0,0xe1],
395	[0xc3,0x2f,0x75,0x02], [0x81,0x4c,0xf0,0x12], [0x8d,0x46,0x97,0xa3], [0x6b,0xd3,0xf9,0xc6],
396	[0x03,0x8f,0x5f,0xe7], [0x15,0x92,0x9c,0x95], [0xbf,0x6d,0x7a,0xeb], [0x95,0x52,0x59,0xda],
397	[0xd4,0xbe,0x83,0x2d], [0x58,0x74,0x21,0xd3], [0x49,0xe0,0x69,0x29], [0x8e,0xc9,0xc8,0x44],
398	[0x75,0xc2,0x89,0x6a], [0xf4,0x8e,0x79,0x78], [0x99,0x58,0x3e,0x6b], [0x27,0xb9,0x71,0xdd],
399	[0xbe,0xe1,0x4f,0xb6], [0xf0,0x88,0xad,0x17], [0xc9,0x20,0xac,0x66], [0x7d,0xce,0x3a,0xb4],
400	[0x63,0xdf,0x4a,0x18], [0xe5,0x1a,0x31,0x82], [0x97,0x51,0x33,0x60], [0x62,0x53,0x7f,0x45],
401	[0xb1,0x64,0x77,0xe0], [0xbb,0x6b,0xae,0x84], [0xfe,0x81,0xa0,0x1c], [0xf9,0x08,0x2b,0x94],
402	[0x70,0x48,0x68,0x58], [0x8f,0x45,0xfd,0x19], [0x94,0xde,0x6c,0x87], [0x52,0x7b,0xf8,0xb7],
403	[0xab,0x73,0xd3,0x23], [0x72,0x4b,0x02,0xe2], [0xe3,0x1f,0x8f,0x57], [0x66,0x55,0xab,0x2a],
404	[0xb2,0xeb,0x28,0x07], [0x2f,0xb5,0xc2,0x03], [0x86,0xc5,0x7b,0x9a], [0xd3,0x37,0x08,0xa5],
405	[0x30,0x28,0x87,0xf2], [0x23,0xbf,0xa5,0xb2], [0x02,0x03,0x6a,0xba], [0xed,0x16,0x82,0x5c],
406	[0x8a,0xcf,0x1c,0x2b], [0xa7,0x79,0xb4,0x92], [0xf3,0x07,0xf2,0xf0], [0x4e,0x69,0xe2,0xa1],
407	[0x65,0xda,0xf4,0xcd], [0x06,0x05,0xbe,0xd5], [0xd1,0x34,0x62,0x1f], [0xc4,0xa6,0xfe,0x8a],
408	[0x34,0x2e,0x53,0x9d], [0xa2,0xf3,0x55,0xa0], [0x05,0x8a,0xe1,0x32], [0xa4,0xf6,0xeb,0x75],
409	[0x0b,0x83,0xec,0x39], [0x40,0x60,0xef,0xaa], [0x5e,0x71,0x9f,0x06], [0xbd,0x6e,0x10,0x51],
410	[0x3e,0x21,0x8a,0xf9], [0x96,0xdd,0x06,0x3d], [0xdd,0x3e,0x05,0xae], [0x4d,0xe6,0xbd,0x46],
411	[0x91,0x54,0x8d,0xb5], [0x71,0xc4,0x5d,0x05], [0x04,0x06,0xd4,0x6f], [0x60,0x50,0x15,0xff],
412	[0x19,0x98,0xfb,0x24], [0xd6,0xbd,0xe9,0x97], [0x89,0x40,0x43,0xcc], [0x67,0xd9,0x9e,0x77],
413	[0xb0,0xe8,0x42,0xbd], [0x07,0x89,0x8b,0x88], [0xe7,0x19,0x5b,0x38], [0x79,0xc8,0xee,0xdb],
414	[0xa1,0x7c,0x0a,0x47], [0x7c,0x42,0x0f,0xe9], [0xf8,0x84,0x1e,0xc9], [0x00,0x00,0x00,0x00],
415	[0x09,0x80,0x86,0x83], [0x32,0x2b,0xed,0x48], [0x1e,0x11,0x70,0xac], [0x6c,0x5a,0x72,0x4e],
416	[0xfd,0x0e,0xff,0xfb], [0x0f,0x85,0x38,0x56], [0x3d,0xae,0xd5,0x1e], [0x36,0x2d,0x39,0x27],
417	[0x0a,0x0f,0xd9,0x64], [0x68,0x5c,0xa6,0x21], [0x9b,0x5b,0x54,0xd1], [0x24,0x36,0x2e,0x3a],
418	[0x0c,0x0a,0x67,0xb1], [0x93,0x57,0xe7,0x0f], [0xb4,0xee,0x96,0xd2], [0x1b,0x9b,0x91,0x9e],
419	[0x80,0xc0,0xc5,0x4f], [0x61,0xdc,0x20,0xa2], [0x5a,0x77,0x4b,0x69], [0x1c,0x12,0x1a,0x16],
420	[0xe2,0x93,0xba,0x0a], [0xc0,0xa0,0x2a,0xe5], [0x3c,0x22,0xe0,0x43], [0x12,0x1b,0x17,0x1d],
421	[0x0e,0x09,0x0d,0x0b], [0xf2,0x8b,0xc7,0xad], [0x2d,0xb6,0xa8,0xb9], [0x14,0x1e,0xa9,0xc8],
422	[0x57,0xf1,0x19,0x85], [0xaf,0x75,0x07,0x4c], [0xee,0x99,0xdd,0xbb], [0xa3,0x7f,0x60,0xfd],
423	[0xf7,0x01,0x26,0x9f], [0x5c,0x72,0xf5,0xbc], [0x44,0x66,0x3b,0xc5], [0x5b,0xfb,0x7e,0x34],
424	[0x8b,0x43,0x29,0x76], [0xcb,0x23,0xc6,0xdc], [0xb6,0xed,0xfc,0x68], [0xb8,0xe4,0xf1,0x63],
425	[0xd7,0x31,0xdc,0xca], [0x42,0x63,0x85,0x10], [0x13,0x97,0x22,0x40], [0x84,0xc6,0x11,0x20],
426	[0x85,0x4a,0x24,0x7d], [0xd2,0xbb,0x3d,0xf8], [0xae,0xf9,0x32,0x11], [0xc7,0x29,0xa1,0x6d],
427	[0x1d,0x9e,0x2f,0x4b], [0xdc,0xb2,0x30,0xf3], [0x0d,0x86,0x52,0xec], [0x77,0xc1,0xe3,0xd0],
428	[0x2b,0xb3,0x16,0x6c], [0xa9,0x70,0xb9,0x99], [0x11,0x94,0x48,0xfa], [0x47,0xe9,0x64,0x22],
429	[0xa8,0xfc,0x8c,0xc4], [0xa0,0xf0,0x3f,0x1a], [0x56,0x7d,0x2c,0xd8], [0x22,0x33,0x90,0xef],
430	[0x87,0x49,0x4e,0xc7], [0xd9,0x38,0xd1,0xc1], [0x8c,0xca,0xa2,0xfe], [0x98,0xd4,0x0b,0x36],
431	[0xa6,0xf5,0x81,0xcf], [0xa5,0x7a,0xde,0x28], [0xda,0xb7,0x8e,0x26], [0x3f,0xad,0xbf,0xa4],
432	[0x2c,0x3a,0x9d,0xe4], [0x50,0x78,0x92,0x0d], [0x6a,0x5f,0xcc,0x9b], [0x54,0x7e,0x46,0x62],
433	[0xf6,0x8d,0x13,0xc2], [0x90,0xd8,0xb8,0xe8], [0x2e,0x39,0xf7,0x5e], [0x82,0xc3,0xaf,0xf5],
434	[0x9f,0x5d,0x80,0xbe], [0x69,0xd0,0x93,0x7c], [0x6f,0xd5,0x2d,0xa9], [0xcf,0x25,0x12,0xb3],
435	[0xc8,0xac,0x99,0x3b], [0x10,0x18,0x7d,0xa7], [0xe8,0x9c,0x63,0x6e], [0xdb,0x3b,0xbb,0x7b],
436	[0xcd,0x26,0x78,0x09], [0x6e,0x59,0x18,0xf4], [0xec,0x9a,0xb7,0x01], [0x83,0x4f,0x9a,0xa8],
437	[0xe6,0x95,0x6e,0x65], [0xaa,0xff,0xe6,0x7e], [0x21,0xbc,0xcf,0x08], [0xef,0x15,0xe8,0xe6],
438	[0xba,0xe7,0x9b,0xd9], [0x4a,0x6f,0x36,0xce], [0xea,0x9f,0x09,0xd4], [0x29,0xb0,0x7c,0xd6],
439	[0x31,0xa4,0xb2,0xaf], [0x2a,0x3f,0x23,0x31], [0xc6,0xa5,0x94,0x30], [0x35,0xa2,0x66,0xc0],
440	[0x74,0x4e,0xbc,0x37], [0xfc,0x82,0xca,0xa6], [0xe0,0x90,0xd0,0xb0], [0x33,0xa7,0xd8,0x15],
441	[0xf1,0x04,0x98,0x4a], [0x41,0xec,0xda,0xf7], [0x7f,0xcd,0x50,0x0e], [0x17,0x91,0xf6,0x2f],
442	[0x76,0x4d,0xd6,0x8d], [0x43,0xef,0xb0,0x4d], [0xcc,0xaa,0x4d,0x54], [0xe4,0x96,0x04,0xdf],
443	[0x9e,0xd1,0xb5,0xe3], [0x4c,0x6a,0x88,0x1b], [0xc1,0x2c,0x1f,0xb8], [0x46,0x65,0x51,0x7f],
444	[0x9d,0x5e,0xea,0x04], [0x01,0x8c,0x35,0x5d], [0xfa,0x87,0x74,0x73], [0xfb,0x0b,0x41,0x2e],
445	[0xb3,0x67,0x1d,0x5a], [0x92,0xdb,0xd2,0x52], [0xe9,0x10,0x56,0x33], [0x6d,0xd6,0x47,0x13],
446	[0x9a,0xd7,0x61,0x8c], [0x37,0xa1,0x0c,0x7a], [0x59,0xf8,0x14,0x8e], [0xeb,0x13,0x3c,0x89],
447	[0xce,0xa9,0x27,0xee], [0xb7,0x61,0xc9,0x35], [0xe1,0x1c,0xe5,0xed], [0x7a,0x47,0xb1,0x3c],
448	[0x9c,0xd2,0xdf,0x59], [0x55,0xf2,0x73,0x3f], [0x18,0x14,0xce,0x79], [0x73,0xc7,0x37,0xbf],
449	[0x53,0xf7,0xcd,0xea], [0x5f,0xfd,0xaa,0x5b], [0xdf,0x3d,0x6f,0x14], [0x78,0x44,0xdb,0x86],
450	[0xca,0xaf,0xf3,0x81], [0xb9,0x68,0xc4,0x3e], [0x38,0x24,0x34,0x2c], [0xc2,0xa3,0x40,0x5f],
451	[0x16,0x1d,0xc3,0x72], [0xbc,0xe2,0x25,0x0c], [0x28,0x3c,0x49,0x8b], [0xff,0x0d,0x95,0x41],
452	[0x39,0xa8,0x01,0x71], [0x08,0x0c,0xb3,0xde], [0xd8,0xb4,0xe4,0x9c], [0x64,0x56,0xc1,0x90],
453	[0x7b,0xcb,0x84,0x61], [0xd5,0x32,0xb6,0x70], [0x48,0x6c,0x5c,0x74], [0xd0,0xb8,0x57,0x42]
454);
455
456my @T6 = (
457	[0x50,0x51,0xf4,0xa7], [0x53,0x7e,0x41,0x65], [0xc3,0x1a,0x17,0xa4], [0x96,0x3a,0x27,0x5e],
458	[0xcb,0x3b,0xab,0x6b], [0xf1,0x1f,0x9d,0x45], [0xab,0xac,0xfa,0x58], [0x93,0x4b,0xe3,0x03],
459	[0x55,0x20,0x30,0xfa], [0xf6,0xad,0x76,0x6d], [0x91,0x88,0xcc,0x76], [0x25,0xf5,0x02,0x4c],
460	[0xfc,0x4f,0xe5,0xd7], [0xd7,0xc5,0x2a,0xcb], [0x80,0x26,0x35,0x44], [0x8f,0xb5,0x62,0xa3],
461	[0x49,0xde,0xb1,0x5a], [0x67,0x25,0xba,0x1b], [0x98,0x45,0xea,0x0e], [0xe1,0x5d,0xfe,0xc0],
462	[0x02,0xc3,0x2f,0x75], [0x12,0x81,0x4c,0xf0], [0xa3,0x8d,0x46,0x97], [0xc6,0x6b,0xd3,0xf9],
463	[0xe7,0x03,0x8f,0x5f], [0x95,0x15,0x92,0x9c], [0xeb,0xbf,0x6d,0x7a], [0xda,0x95,0x52,0x59],
464	[0x2d,0xd4,0xbe,0x83], [0xd3,0x58,0x74,0x21], [0x29,0x49,0xe0,0x69], [0x44,0x8e,0xc9,0xc8],
465	[0x6a,0x75,0xc2,0x89], [0x78,0xf4,0x8e,0x79], [0x6b,0x99,0x58,0x3e], [0xdd,0x27,0xb9,0x71],
466	[0xb6,0xbe,0xe1,0x4f], [0x17,0xf0,0x88,0xad], [0x66,0xc9,0x20,0xac], [0xb4,0x7d,0xce,0x3a],
467	[0x18,0x63,0xdf,0x4a], [0x82,0xe5,0x1a,0x31], [0x60,0x97,0x51,0x33], [0x45,0x62,0x53,0x7f],
468	[0xe0,0xb1,0x64,0x77], [0x84,0xbb,0x6b,0xae], [0x1c,0xfe,0x81,0xa0], [0x94,0xf9,0x08,0x2b],
469	[0x58,0x70,0x48,0x68], [0x19,0x8f,0x45,0xfd], [0x87,0x94,0xde,0x6c], [0xb7,0x52,0x7b,0xf8],
470	[0x23,0xab,0x73,0xd3], [0xe2,0x72,0x4b,0x02], [0x57,0xe3,0x1f,0x8f], [0x2a,0x66,0x55,0xab],
471	[0x07,0xb2,0xeb,0x28], [0x03,0x2f,0xb5,0xc2], [0x9a,0x86,0xc5,0x7b], [0xa5,0xd3,0x37,0x08],
472	[0xf2,0x30,0x28,0x87], [0xb2,0x23,0xbf,0xa5], [0xba,0x02,0x03,0x6a], [0x5c,0xed,0x16,0x82],
473	[0x2b,0x8a,0xcf,0x1c], [0x92,0xa7,0x79,0xb4], [0xf0,0xf3,0x07,0xf2], [0xa1,0x4e,0x69,0xe2],
474	[0xcd,0x65,0xda,0xf4], [0xd5,0x06,0x05,0xbe], [0x1f,0xd1,0x34,0x62], [0x8a,0xc4,0xa6,0xfe],
475	[0x9d,0x34,0x2e,0x53], [0xa0,0xa2,0xf3,0x55], [0x32,0x05,0x8a,0xe1], [0x75,0xa4,0xf6,0xeb],
476	[0x39,0x0b,0x83,0xec], [0xaa,0x40,0x60,0xef], [0x06,0x5e,0x71,0x9f], [0x51,0xbd,0x6e,0x10],
477	[0xf9,0x3e,0x21,0x8a], [0x3d,0x96,0xdd,0x06], [0xae,0xdd,0x3e,0x05], [0x46,0x4d,0xe6,0xbd],
478	[0xb5,0x91,0x54,0x8d], [0x05,0x71,0xc4,0x5d], [0x6f,0x04,0x06,0xd4], [0xff,0x60,0x50,0x15],
479	[0x24,0x19,0x98,0xfb], [0x97,0xd6,0xbd,0xe9], [0xcc,0x89,0x40,0x43], [0x77,0x67,0xd9,0x9e],
480	[0xbd,0xb0,0xe8,0x42], [0x88,0x07,0x89,0x8b], [0x38,0xe7,0x19,0x5b], [0xdb,0x79,0xc8,0xee],
481	[0x47,0xa1,0x7c,0x0a], [0xe9,0x7c,0x42,0x0f], [0xc9,0xf8,0x84,0x1e], [0x00,0x00,0x00,0x00],
482	[0x83,0x09,0x80,0x86], [0x48,0x32,0x2b,0xed], [0xac,0x1e,0x11,0x70], [0x4e,0x6c,0x5a,0x72],
483	[0xfb,0xfd,0x0e,0xff], [0x56,0x0f,0x85,0x38], [0x1e,0x3d,0xae,0xd5], [0x27,0x36,0x2d,0x39],
484	[0x64,0x0a,0x0f,0xd9], [0x21,0x68,0x5c,0xa6], [0xd1,0x9b,0x5b,0x54], [0x3a,0x24,0x36,0x2e],
485	[0xb1,0x0c,0x0a,0x67], [0x0f,0x93,0x57,0xe7], [0xd2,0xb4,0xee,0x96], [0x9e,0x1b,0x9b,0x91],
486	[0x4f,0x80,0xc0,0xc5], [0xa2,0x61,0xdc,0x20], [0x69,0x5a,0x77,0x4b], [0x16,0x1c,0x12,0x1a],
487	[0x0a,0xe2,0x93,0xba], [0xe5,0xc0,0xa0,0x2a], [0x43,0x3c,0x22,0xe0], [0x1d,0x12,0x1b,0x17],
488	[0x0b,0x0e,0x09,0x0d], [0xad,0xf2,0x8b,0xc7], [0xb9,0x2d,0xb6,0xa8], [0xc8,0x14,0x1e,0xa9],
489	[0x85,0x57,0xf1,0x19], [0x4c,0xaf,0x75,0x07], [0xbb,0xee,0x99,0xdd], [0xfd,0xa3,0x7f,0x60],
490	[0x9f,0xf7,0x01,0x26], [0xbc,0x5c,0x72,0xf5], [0xc5,0x44,0x66,0x3b], [0x34,0x5b,0xfb,0x7e],
491	[0x76,0x8b,0x43,0x29], [0xdc,0xcb,0x23,0xc6], [0x68,0xb6,0xed,0xfc], [0x63,0xb8,0xe4,0xf1],
492	[0xca,0xd7,0x31,0xdc], [0x10,0x42,0x63,0x85], [0x40,0x13,0x97,0x22], [0x20,0x84,0xc6,0x11],
493	[0x7d,0x85,0x4a,0x24], [0xf8,0xd2,0xbb,0x3d], [0x11,0xae,0xf9,0x32], [0x6d,0xc7,0x29,0xa1],
494	[0x4b,0x1d,0x9e,0x2f], [0xf3,0xdc,0xb2,0x30], [0xec,0x0d,0x86,0x52], [0xd0,0x77,0xc1,0xe3],
495	[0x6c,0x2b,0xb3,0x16], [0x99,0xa9,0x70,0xb9], [0xfa,0x11,0x94,0x48], [0x22,0x47,0xe9,0x64],
496	[0xc4,0xa8,0xfc,0x8c], [0x1a,0xa0,0xf0,0x3f], [0xd8,0x56,0x7d,0x2c], [0xef,0x22,0x33,0x90],
497	[0xc7,0x87,0x49,0x4e], [0xc1,0xd9,0x38,0xd1], [0xfe,0x8c,0xca,0xa2], [0x36,0x98,0xd4,0x0b],
498	[0xcf,0xa6,0xf5,0x81], [0x28,0xa5,0x7a,0xde], [0x26,0xda,0xb7,0x8e], [0xa4,0x3f,0xad,0xbf],
499	[0xe4,0x2c,0x3a,0x9d], [0x0d,0x50,0x78,0x92], [0x9b,0x6a,0x5f,0xcc], [0x62,0x54,0x7e,0x46],
500	[0xc2,0xf6,0x8d,0x13], [0xe8,0x90,0xd8,0xb8], [0x5e,0x2e,0x39,0xf7], [0xf5,0x82,0xc3,0xaf],
501	[0xbe,0x9f,0x5d,0x80], [0x7c,0x69,0xd0,0x93], [0xa9,0x6f,0xd5,0x2d], [0xb3,0xcf,0x25,0x12],
502	[0x3b,0xc8,0xac,0x99], [0xa7,0x10,0x18,0x7d], [0x6e,0xe8,0x9c,0x63], [0x7b,0xdb,0x3b,0xbb],
503	[0x09,0xcd,0x26,0x78], [0xf4,0x6e,0x59,0x18], [0x01,0xec,0x9a,0xb7], [0xa8,0x83,0x4f,0x9a],
504	[0x65,0xe6,0x95,0x6e], [0x7e,0xaa,0xff,0xe6], [0x08,0x21,0xbc,0xcf], [0xe6,0xef,0x15,0xe8],
505	[0xd9,0xba,0xe7,0x9b], [0xce,0x4a,0x6f,0x36], [0xd4,0xea,0x9f,0x09], [0xd6,0x29,0xb0,0x7c],
506	[0xaf,0x31,0xa4,0xb2], [0x31,0x2a,0x3f,0x23], [0x30,0xc6,0xa5,0x94], [0xc0,0x35,0xa2,0x66],
507	[0x37,0x74,0x4e,0xbc], [0xa6,0xfc,0x82,0xca], [0xb0,0xe0,0x90,0xd0], [0x15,0x33,0xa7,0xd8],
508	[0x4a,0xf1,0x04,0x98], [0xf7,0x41,0xec,0xda], [0x0e,0x7f,0xcd,0x50], [0x2f,0x17,0x91,0xf6],
509	[0x8d,0x76,0x4d,0xd6], [0x4d,0x43,0xef,0xb0], [0x54,0xcc,0xaa,0x4d], [0xdf,0xe4,0x96,0x04],
510	[0xe3,0x9e,0xd1,0xb5], [0x1b,0x4c,0x6a,0x88], [0xb8,0xc1,0x2c,0x1f], [0x7f,0x46,0x65,0x51],
511	[0x04,0x9d,0x5e,0xea], [0x5d,0x01,0x8c,0x35], [0x73,0xfa,0x87,0x74], [0x2e,0xfb,0x0b,0x41],
512	[0x5a,0xb3,0x67,0x1d], [0x52,0x92,0xdb,0xd2], [0x33,0xe9,0x10,0x56], [0x13,0x6d,0xd6,0x47],
513	[0x8c,0x9a,0xd7,0x61], [0x7a,0x37,0xa1,0x0c], [0x8e,0x59,0xf8,0x14], [0x89,0xeb,0x13,0x3c],
514	[0xee,0xce,0xa9,0x27], [0x35,0xb7,0x61,0xc9], [0xed,0xe1,0x1c,0xe5], [0x3c,0x7a,0x47,0xb1],
515	[0x59,0x9c,0xd2,0xdf], [0x3f,0x55,0xf2,0x73], [0x79,0x18,0x14,0xce], [0xbf,0x73,0xc7,0x37],
516	[0xea,0x53,0xf7,0xcd], [0x5b,0x5f,0xfd,0xaa], [0x14,0xdf,0x3d,0x6f], [0x86,0x78,0x44,0xdb],
517	[0x81,0xca,0xaf,0xf3], [0x3e,0xb9,0x68,0xc4], [0x2c,0x38,0x24,0x34], [0x5f,0xc2,0xa3,0x40],
518	[0x72,0x16,0x1d,0xc3], [0x0c,0xbc,0xe2,0x25], [0x8b,0x28,0x3c,0x49], [0x41,0xff,0x0d,0x95],
519	[0x71,0x39,0xa8,0x01], [0xde,0x08,0x0c,0xb3], [0x9c,0xd8,0xb4,0xe4], [0x90,0x64,0x56,0xc1],
520	[0x61,0x7b,0xcb,0x84], [0x70,0xd5,0x32,0xb6], [0x74,0x48,0x6c,0x5c], [0x42,0xd0,0xb8,0x57]
521);
522
523my @T7 = (
524	[0xa7,0x50,0x51,0xf4], [0x65,0x53,0x7e,0x41], [0xa4,0xc3,0x1a,0x17], [0x5e,0x96,0x3a,0x27],
525	[0x6b,0xcb,0x3b,0xab], [0x45,0xf1,0x1f,0x9d], [0x58,0xab,0xac,0xfa], [0x03,0x93,0x4b,0xe3],
526	[0xfa,0x55,0x20,0x30], [0x6d,0xf6,0xad,0x76], [0x76,0x91,0x88,0xcc], [0x4c,0x25,0xf5,0x02],
527	[0xd7,0xfc,0x4f,0xe5], [0xcb,0xd7,0xc5,0x2a], [0x44,0x80,0x26,0x35], [0xa3,0x8f,0xb5,0x62],
528	[0x5a,0x49,0xde,0xb1], [0x1b,0x67,0x25,0xba], [0x0e,0x98,0x45,0xea], [0xc0,0xe1,0x5d,0xfe],
529	[0x75,0x02,0xc3,0x2f], [0xf0,0x12,0x81,0x4c], [0x97,0xa3,0x8d,0x46], [0xf9,0xc6,0x6b,0xd3],
530	[0x5f,0xe7,0x03,0x8f], [0x9c,0x95,0x15,0x92], [0x7a,0xeb,0xbf,0x6d], [0x59,0xda,0x95,0x52],
531	[0x83,0x2d,0xd4,0xbe], [0x21,0xd3,0x58,0x74], [0x69,0x29,0x49,0xe0], [0xc8,0x44,0x8e,0xc9],
532	[0x89,0x6a,0x75,0xc2], [0x79,0x78,0xf4,0x8e], [0x3e,0x6b,0x99,0x58], [0x71,0xdd,0x27,0xb9],
533	[0x4f,0xb6,0xbe,0xe1], [0xad,0x17,0xf0,0x88], [0xac,0x66,0xc9,0x20], [0x3a,0xb4,0x7d,0xce],
534	[0x4a,0x18,0x63,0xdf], [0x31,0x82,0xe5,0x1a], [0x33,0x60,0x97,0x51], [0x7f,0x45,0x62,0x53],
535	[0x77,0xe0,0xb1,0x64], [0xae,0x84,0xbb,0x6b], [0xa0,0x1c,0xfe,0x81], [0x2b,0x94,0xf9,0x08],
536	[0x68,0x58,0x70,0x48], [0xfd,0x19,0x8f,0x45], [0x6c,0x87,0x94,0xde], [0xf8,0xb7,0x52,0x7b],
537	[0xd3,0x23,0xab,0x73], [0x02,0xe2,0x72,0x4b], [0x8f,0x57,0xe3,0x1f], [0xab,0x2a,0x66,0x55],
538	[0x28,0x07,0xb2,0xeb], [0xc2,0x03,0x2f,0xb5], [0x7b,0x9a,0x86,0xc5], [0x08,0xa5,0xd3,0x37],
539	[0x87,0xf2,0x30,0x28], [0xa5,0xb2,0x23,0xbf], [0x6a,0xba,0x02,0x03], [0x82,0x5c,0xed,0x16],
540	[0x1c,0x2b,0x8a,0xcf], [0xb4,0x92,0xa7,0x79], [0xf2,0xf0,0xf3,0x07], [0xe2,0xa1,0x4e,0x69],
541	[0xf4,0xcd,0x65,0xda], [0xbe,0xd5,0x06,0x05], [0x62,0x1f,0xd1,0x34], [0xfe,0x8a,0xc4,0xa6],
542	[0x53,0x9d,0x34,0x2e], [0x55,0xa0,0xa2,0xf3], [0xe1,0x32,0x05,0x8a], [0xeb,0x75,0xa4,0xf6],
543	[0xec,0x39,0x0b,0x83], [0xef,0xaa,0x40,0x60], [0x9f,0x06,0x5e,0x71], [0x10,0x51,0xbd,0x6e],
544	[0x8a,0xf9,0x3e,0x21], [0x06,0x3d,0x96,0xdd], [0x05,0xae,0xdd,0x3e], [0xbd,0x46,0x4d,0xe6],
545	[0x8d,0xb5,0x91,0x54], [0x5d,0x05,0x71,0xc4], [0xd4,0x6f,0x04,0x06], [0x15,0xff,0x60,0x50],
546	[0xfb,0x24,0x19,0x98], [0xe9,0x97,0xd6,0xbd], [0x43,0xcc,0x89,0x40], [0x9e,0x77,0x67,0xd9],
547	[0x42,0xbd,0xb0,0xe8], [0x8b,0x88,0x07,0x89], [0x5b,0x38,0xe7,0x19], [0xee,0xdb,0x79,0xc8],
548	[0x0a,0x47,0xa1,0x7c], [0x0f,0xe9,0x7c,0x42], [0x1e,0xc9,0xf8,0x84], [0x00,0x00,0x00,0x00],
549	[0x86,0x83,0x09,0x80], [0xed,0x48,0x32,0x2b], [0x70,0xac,0x1e,0x11], [0x72,0x4e,0x6c,0x5a],
550	[0xff,0xfb,0xfd,0x0e], [0x38,0x56,0x0f,0x85], [0xd5,0x1e,0x3d,0xae], [0x39,0x27,0x36,0x2d],
551	[0xd9,0x64,0x0a,0x0f], [0xa6,0x21,0x68,0x5c], [0x54,0xd1,0x9b,0x5b], [0x2e,0x3a,0x24,0x36],
552	[0x67,0xb1,0x0c,0x0a], [0xe7,0x0f,0x93,0x57], [0x96,0xd2,0xb4,0xee], [0x91,0x9e,0x1b,0x9b],
553	[0xc5,0x4f,0x80,0xc0], [0x20,0xa2,0x61,0xdc], [0x4b,0x69,0x5a,0x77], [0x1a,0x16,0x1c,0x12],
554	[0xba,0x0a,0xe2,0x93], [0x2a,0xe5,0xc0,0xa0], [0xe0,0x43,0x3c,0x22], [0x17,0x1d,0x12,0x1b],
555	[0x0d,0x0b,0x0e,0x09], [0xc7,0xad,0xf2,0x8b], [0xa8,0xb9,0x2d,0xb6], [0xa9,0xc8,0x14,0x1e],
556	[0x19,0x85,0x57,0xf1], [0x07,0x4c,0xaf,0x75], [0xdd,0xbb,0xee,0x99], [0x60,0xfd,0xa3,0x7f],
557	[0x26,0x9f,0xf7,0x01], [0xf5,0xbc,0x5c,0x72], [0x3b,0xc5,0x44,0x66], [0x7e,0x34,0x5b,0xfb],
558	[0x29,0x76,0x8b,0x43], [0xc6,0xdc,0xcb,0x23], [0xfc,0x68,0xb6,0xed], [0xf1,0x63,0xb8,0xe4],
559	[0xdc,0xca,0xd7,0x31], [0x85,0x10,0x42,0x63], [0x22,0x40,0x13,0x97], [0x11,0x20,0x84,0xc6],
560	[0x24,0x7d,0x85,0x4a], [0x3d,0xf8,0xd2,0xbb], [0x32,0x11,0xae,0xf9], [0xa1,0x6d,0xc7,0x29],
561	[0x2f,0x4b,0x1d,0x9e], [0x30,0xf3,0xdc,0xb2], [0x52,0xec,0x0d,0x86], [0xe3,0xd0,0x77,0xc1],
562	[0x16,0x6c,0x2b,0xb3], [0xb9,0x99,0xa9,0x70], [0x48,0xfa,0x11,0x94], [0x64,0x22,0x47,0xe9],
563	[0x8c,0xc4,0xa8,0xfc], [0x3f,0x1a,0xa0,0xf0], [0x2c,0xd8,0x56,0x7d], [0x90,0xef,0x22,0x33],
564	[0x4e,0xc7,0x87,0x49], [0xd1,0xc1,0xd9,0x38], [0xa2,0xfe,0x8c,0xca], [0x0b,0x36,0x98,0xd4],
565	[0x81,0xcf,0xa6,0xf5], [0xde,0x28,0xa5,0x7a], [0x8e,0x26,0xda,0xb7], [0xbf,0xa4,0x3f,0xad],
566	[0x9d,0xe4,0x2c,0x3a], [0x92,0x0d,0x50,0x78], [0xcc,0x9b,0x6a,0x5f], [0x46,0x62,0x54,0x7e],
567	[0x13,0xc2,0xf6,0x8d], [0xb8,0xe8,0x90,0xd8], [0xf7,0x5e,0x2e,0x39], [0xaf,0xf5,0x82,0xc3],
568	[0x80,0xbe,0x9f,0x5d], [0x93,0x7c,0x69,0xd0], [0x2d,0xa9,0x6f,0xd5], [0x12,0xb3,0xcf,0x25],
569	[0x99,0x3b,0xc8,0xac], [0x7d,0xa7,0x10,0x18], [0x63,0x6e,0xe8,0x9c], [0xbb,0x7b,0xdb,0x3b],
570	[0x78,0x09,0xcd,0x26], [0x18,0xf4,0x6e,0x59], [0xb7,0x01,0xec,0x9a], [0x9a,0xa8,0x83,0x4f],
571	[0x6e,0x65,0xe6,0x95], [0xe6,0x7e,0xaa,0xff], [0xcf,0x08,0x21,0xbc], [0xe8,0xe6,0xef,0x15],
572	[0x9b,0xd9,0xba,0xe7], [0x36,0xce,0x4a,0x6f], [0x09,0xd4,0xea,0x9f], [0x7c,0xd6,0x29,0xb0],
573	[0xb2,0xaf,0x31,0xa4], [0x23,0x31,0x2a,0x3f], [0x94,0x30,0xc6,0xa5], [0x66,0xc0,0x35,0xa2],
574	[0xbc,0x37,0x74,0x4e], [0xca,0xa6,0xfc,0x82], [0xd0,0xb0,0xe0,0x90], [0xd8,0x15,0x33,0xa7],
575	[0x98,0x4a,0xf1,0x04], [0xda,0xf7,0x41,0xec], [0x50,0x0e,0x7f,0xcd], [0xf6,0x2f,0x17,0x91],
576	[0xd6,0x8d,0x76,0x4d], [0xb0,0x4d,0x43,0xef], [0x4d,0x54,0xcc,0xaa], [0x04,0xdf,0xe4,0x96],
577	[0xb5,0xe3,0x9e,0xd1], [0x88,0x1b,0x4c,0x6a], [0x1f,0xb8,0xc1,0x2c], [0x51,0x7f,0x46,0x65],
578	[0xea,0x04,0x9d,0x5e], [0x35,0x5d,0x01,0x8c], [0x74,0x73,0xfa,0x87], [0x41,0x2e,0xfb,0x0b],
579	[0x1d,0x5a,0xb3,0x67], [0xd2,0x52,0x92,0xdb], [0x56,0x33,0xe9,0x10], [0x47,0x13,0x6d,0xd6],
580	[0x61,0x8c,0x9a,0xd7], [0x0c,0x7a,0x37,0xa1], [0x14,0x8e,0x59,0xf8], [0x3c,0x89,0xeb,0x13],
581	[0x27,0xee,0xce,0xa9], [0xc9,0x35,0xb7,0x61], [0xe5,0xed,0xe1,0x1c], [0xb1,0x3c,0x7a,0x47],
582	[0xdf,0x59,0x9c,0xd2], [0x73,0x3f,0x55,0xf2], [0xce,0x79,0x18,0x14], [0x37,0xbf,0x73,0xc7],
583	[0xcd,0xea,0x53,0xf7], [0xaa,0x5b,0x5f,0xfd], [0x6f,0x14,0xdf,0x3d], [0xdb,0x86,0x78,0x44],
584	[0xf3,0x81,0xca,0xaf], [0xc4,0x3e,0xb9,0x68], [0x34,0x2c,0x38,0x24], [0x40,0x5f,0xc2,0xa3],
585	[0xc3,0x72,0x16,0x1d], [0x25,0x0c,0xbc,0xe2], [0x49,0x8b,0x28,0x3c], [0x95,0x41,0xff,0x0d],
586	[0x01,0x71,0x39,0xa8], [0xb3,0xde,0x08,0x0c], [0xe4,0x9c,0xd8,0xb4], [0xc1,0x90,0x64,0x56],
587	[0x84,0x61,0x7b,0xcb], [0xb6,0x70,0xd5,0x32], [0x5c,0x74,0x48,0x6c], [0x57,0x42,0xd0,0xb8]
588);
589
590my @T8 = (
591	[0xf4,0xa7,0x50,0x51], [0x41,0x65,0x53,0x7e], [0x17,0xa4,0xc3,0x1a], [0x27,0x5e,0x96,0x3a],
592	[0xab,0x6b,0xcb,0x3b], [0x9d,0x45,0xf1,0x1f], [0xfa,0x58,0xab,0xac], [0xe3,0x03,0x93,0x4b],
593	[0x30,0xfa,0x55,0x20], [0x76,0x6d,0xf6,0xad], [0xcc,0x76,0x91,0x88], [0x02,0x4c,0x25,0xf5],
594	[0xe5,0xd7,0xfc,0x4f], [0x2a,0xcb,0xd7,0xc5], [0x35,0x44,0x80,0x26], [0x62,0xa3,0x8f,0xb5],
595	[0xb1,0x5a,0x49,0xde], [0xba,0x1b,0x67,0x25], [0xea,0x0e,0x98,0x45], [0xfe,0xc0,0xe1,0x5d],
596	[0x2f,0x75,0x02,0xc3], [0x4c,0xf0,0x12,0x81], [0x46,0x97,0xa3,0x8d], [0xd3,0xf9,0xc6,0x6b],
597	[0x8f,0x5f,0xe7,0x03], [0x92,0x9c,0x95,0x15], [0x6d,0x7a,0xeb,0xbf], [0x52,0x59,0xda,0x95],
598	[0xbe,0x83,0x2d,0xd4], [0x74,0x21,0xd3,0x58], [0xe0,0x69,0x29,0x49], [0xc9,0xc8,0x44,0x8e],
599	[0xc2,0x89,0x6a,0x75], [0x8e,0x79,0x78,0xf4], [0x58,0x3e,0x6b,0x99], [0xb9,0x71,0xdd,0x27],
600	[0xe1,0x4f,0xb6,0xbe], [0x88,0xad,0x17,0xf0], [0x20,0xac,0x66,0xc9], [0xce,0x3a,0xb4,0x7d],
601	[0xdf,0x4a,0x18,0x63], [0x1a,0x31,0x82,0xe5], [0x51,0x33,0x60,0x97], [0x53,0x7f,0x45,0x62],
602	[0x64,0x77,0xe0,0xb1], [0x6b,0xae,0x84,0xbb], [0x81,0xa0,0x1c,0xfe], [0x08,0x2b,0x94,0xf9],
603	[0x48,0x68,0x58,0x70], [0x45,0xfd,0x19,0x8f], [0xde,0x6c,0x87,0x94], [0x7b,0xf8,0xb7,0x52],
604	[0x73,0xd3,0x23,0xab], [0x4b,0x02,0xe2,0x72], [0x1f,0x8f,0x57,0xe3], [0x55,0xab,0x2a,0x66],
605	[0xeb,0x28,0x07,0xb2], [0xb5,0xc2,0x03,0x2f], [0xc5,0x7b,0x9a,0x86], [0x37,0x08,0xa5,0xd3],
606	[0x28,0x87,0xf2,0x30], [0xbf,0xa5,0xb2,0x23], [0x03,0x6a,0xba,0x02], [0x16,0x82,0x5c,0xed],
607	[0xcf,0x1c,0x2b,0x8a], [0x79,0xb4,0x92,0xa7], [0x07,0xf2,0xf0,0xf3], [0x69,0xe2,0xa1,0x4e],
608	[0xda,0xf4,0xcd,0x65], [0x05,0xbe,0xd5,0x06], [0x34,0x62,0x1f,0xd1], [0xa6,0xfe,0x8a,0xc4],
609	[0x2e,0x53,0x9d,0x34], [0xf3,0x55,0xa0,0xa2], [0x8a,0xe1,0x32,0x05], [0xf6,0xeb,0x75,0xa4],
610	[0x83,0xec,0x39,0x0b], [0x60,0xef,0xaa,0x40], [0x71,0x9f,0x06,0x5e], [0x6e,0x10,0x51,0xbd],
611	[0x21,0x8a,0xf9,0x3e], [0xdd,0x06,0x3d,0x96], [0x3e,0x05,0xae,0xdd], [0xe6,0xbd,0x46,0x4d],
612	[0x54,0x8d,0xb5,0x91], [0xc4,0x5d,0x05,0x71], [0x06,0xd4,0x6f,0x04], [0x50,0x15,0xff,0x60],
613	[0x98,0xfb,0x24,0x19], [0xbd,0xe9,0x97,0xd6], [0x40,0x43,0xcc,0x89], [0xd9,0x9e,0x77,0x67],
614	[0xe8,0x42,0xbd,0xb0], [0x89,0x8b,0x88,0x07], [0x19,0x5b,0x38,0xe7], [0xc8,0xee,0xdb,0x79],
615	[0x7c,0x0a,0x47,0xa1], [0x42,0x0f,0xe9,0x7c], [0x84,0x1e,0xc9,0xf8], [0x00,0x00,0x00,0x00],
616	[0x80,0x86,0x83,0x09], [0x2b,0xed,0x48,0x32], [0x11,0x70,0xac,0x1e], [0x5a,0x72,0x4e,0x6c],
617	[0x0e,0xff,0xfb,0xfd], [0x85,0x38,0x56,0x0f], [0xae,0xd5,0x1e,0x3d], [0x2d,0x39,0x27,0x36],
618	[0x0f,0xd9,0x64,0x0a], [0x5c,0xa6,0x21,0x68], [0x5b,0x54,0xd1,0x9b], [0x36,0x2e,0x3a,0x24],
619	[0x0a,0x67,0xb1,0x0c], [0x57,0xe7,0x0f,0x93], [0xee,0x96,0xd2,0xb4], [0x9b,0x91,0x9e,0x1b],
620	[0xc0,0xc5,0x4f,0x80], [0xdc,0x20,0xa2,0x61], [0x77,0x4b,0x69,0x5a], [0x12,0x1a,0x16,0x1c],
621	[0x93,0xba,0x0a,0xe2], [0xa0,0x2a,0xe5,0xc0], [0x22,0xe0,0x43,0x3c], [0x1b,0x17,0x1d,0x12],
622	[0x09,0x0d,0x0b,0x0e], [0x8b,0xc7,0xad,0xf2], [0xb6,0xa8,0xb9,0x2d], [0x1e,0xa9,0xc8,0x14],
623	[0xf1,0x19,0x85,0x57], [0x75,0x07,0x4c,0xaf], [0x99,0xdd,0xbb,0xee], [0x7f,0x60,0xfd,0xa3],
624	[0x01,0x26,0x9f,0xf7], [0x72,0xf5,0xbc,0x5c], [0x66,0x3b,0xc5,0x44], [0xfb,0x7e,0x34,0x5b],
625	[0x43,0x29,0x76,0x8b], [0x23,0xc6,0xdc,0xcb], [0xed,0xfc,0x68,0xb6], [0xe4,0xf1,0x63,0xb8],
626	[0x31,0xdc,0xca,0xd7], [0x63,0x85,0x10,0x42], [0x97,0x22,0x40,0x13], [0xc6,0x11,0x20,0x84],
627	[0x4a,0x24,0x7d,0x85], [0xbb,0x3d,0xf8,0xd2], [0xf9,0x32,0x11,0xae], [0x29,0xa1,0x6d,0xc7],
628	[0x9e,0x2f,0x4b,0x1d], [0xb2,0x30,0xf3,0xdc], [0x86,0x52,0xec,0x0d], [0xc1,0xe3,0xd0,0x77],
629	[0xb3,0x16,0x6c,0x2b], [0x70,0xb9,0x99,0xa9], [0x94,0x48,0xfa,0x11], [0xe9,0x64,0x22,0x47],
630	[0xfc,0x8c,0xc4,0xa8], [0xf0,0x3f,0x1a,0xa0], [0x7d,0x2c,0xd8,0x56], [0x33,0x90,0xef,0x22],
631	[0x49,0x4e,0xc7,0x87], [0x38,0xd1,0xc1,0xd9], [0xca,0xa2,0xfe,0x8c], [0xd4,0x0b,0x36,0x98],
632	[0xf5,0x81,0xcf,0xa6], [0x7a,0xde,0x28,0xa5], [0xb7,0x8e,0x26,0xda], [0xad,0xbf,0xa4,0x3f],
633	[0x3a,0x9d,0xe4,0x2c], [0x78,0x92,0x0d,0x50], [0x5f,0xcc,0x9b,0x6a], [0x7e,0x46,0x62,0x54],
634	[0x8d,0x13,0xc2,0xf6], [0xd8,0xb8,0xe8,0x90], [0x39,0xf7,0x5e,0x2e], [0xc3,0xaf,0xf5,0x82],
635	[0x5d,0x80,0xbe,0x9f], [0xd0,0x93,0x7c,0x69], [0xd5,0x2d,0xa9,0x6f], [0x25,0x12,0xb3,0xcf],
636	[0xac,0x99,0x3b,0xc8], [0x18,0x7d,0xa7,0x10], [0x9c,0x63,0x6e,0xe8], [0x3b,0xbb,0x7b,0xdb],
637	[0x26,0x78,0x09,0xcd], [0x59,0x18,0xf4,0x6e], [0x9a,0xb7,0x01,0xec], [0x4f,0x9a,0xa8,0x83],
638	[0x95,0x6e,0x65,0xe6], [0xff,0xe6,0x7e,0xaa], [0xbc,0xcf,0x08,0x21], [0x15,0xe8,0xe6,0xef],
639	[0xe7,0x9b,0xd9,0xba], [0x6f,0x36,0xce,0x4a], [0x9f,0x09,0xd4,0xea], [0xb0,0x7c,0xd6,0x29],
640	[0xa4,0xb2,0xaf,0x31], [0x3f,0x23,0x31,0x2a], [0xa5,0x94,0x30,0xc6], [0xa2,0x66,0xc0,0x35],
641	[0x4e,0xbc,0x37,0x74], [0x82,0xca,0xa6,0xfc], [0x90,0xd0,0xb0,0xe0], [0xa7,0xd8,0x15,0x33],
642	[0x04,0x98,0x4a,0xf1], [0xec,0xda,0xf7,0x41], [0xcd,0x50,0x0e,0x7f], [0x91,0xf6,0x2f,0x17],
643	[0x4d,0xd6,0x8d,0x76], [0xef,0xb0,0x4d,0x43], [0xaa,0x4d,0x54,0xcc], [0x96,0x04,0xdf,0xe4],
644	[0xd1,0xb5,0xe3,0x9e], [0x6a,0x88,0x1b,0x4c], [0x2c,0x1f,0xb8,0xc1], [0x65,0x51,0x7f,0x46],
645	[0x5e,0xea,0x04,0x9d], [0x8c,0x35,0x5d,0x01], [0x87,0x74,0x73,0xfa], [0x0b,0x41,0x2e,0xfb],
646	[0x67,0x1d,0x5a,0xb3], [0xdb,0xd2,0x52,0x92], [0x10,0x56,0x33,0xe9], [0xd6,0x47,0x13,0x6d],
647	[0xd7,0x61,0x8c,0x9a], [0xa1,0x0c,0x7a,0x37], [0xf8,0x14,0x8e,0x59], [0x13,0x3c,0x89,0xeb],
648	[0xa9,0x27,0xee,0xce], [0x61,0xc9,0x35,0xb7], [0x1c,0xe5,0xed,0xe1], [0x47,0xb1,0x3c,0x7a],
649	[0xd2,0xdf,0x59,0x9c], [0xf2,0x73,0x3f,0x55], [0x14,0xce,0x79,0x18], [0xc7,0x37,0xbf,0x73],
650	[0xf7,0xcd,0xea,0x53], [0xfd,0xaa,0x5b,0x5f], [0x3d,0x6f,0x14,0xdf], [0x44,0xdb,0x86,0x78],
651	[0xaf,0xf3,0x81,0xca], [0x68,0xc4,0x3e,0xb9], [0x24,0x34,0x2c,0x38], [0xa3,0x40,0x5f,0xc2],
652	[0x1d,0xc3,0x72,0x16], [0xe2,0x25,0x0c,0xbc], [0x3c,0x49,0x8b,0x28], [0x0d,0x95,0x41,0xff],
653	[0xa8,0x01,0x71,0x39], [0x0c,0xb3,0xde,0x08], [0xb4,0xe4,0x9c,0xd8], [0x56,0xc1,0x90,0x64],
654	[0xcb,0x84,0x61,0x7b], [0x32,0xb6,0x70,0xd5], [0x6c,0x5c,0x74,0x48], [0xb8,0x57,0x42,0xd0]
655);
656
657my @S5 = (
658	0x52,0x09,0x6a,0xd5,
659	0x30,0x36,0xa5,0x38,
660	0xbf,0x40,0xa3,0x9e,
661	0x81,0xf3,0xd7,0xfb,
662	0x7c,0xe3,0x39,0x82,
663	0x9b,0x2f,0xff,0x87,
664	0x34,0x8e,0x43,0x44,
665	0xc4,0xde,0xe9,0xcb,
666	0x54,0x7b,0x94,0x32,
667	0xa6,0xc2,0x23,0x3d,
668	0xee,0x4c,0x95,0x0b,
669	0x42,0xfa,0xc3,0x4e,
670	0x08,0x2e,0xa1,0x66,
671	0x28,0xd9,0x24,0xb2,
672	0x76,0x5b,0xa2,0x49,
673	0x6d,0x8b,0xd1,0x25,
674	0x72,0xf8,0xf6,0x64,
675	0x86,0x68,0x98,0x16,
676	0xd4,0xa4,0x5c,0xcc,
677	0x5d,0x65,0xb6,0x92,
678	0x6c,0x70,0x48,0x50,
679	0xfd,0xed,0xb9,0xda,
680	0x5e,0x15,0x46,0x57,
681	0xa7,0x8d,0x9d,0x84,
682	0x90,0xd8,0xab,0x00,
683	0x8c,0xbc,0xd3,0x0a,
684	0xf7,0xe4,0x58,0x05,
685	0xb8,0xb3,0x45,0x06,
686	0xd0,0x2c,0x1e,0x8f,
687	0xca,0x3f,0x0f,0x02,
688	0xc1,0xaf,0xbd,0x03,
689	0x01,0x13,0x8a,0x6b,
690	0x3a,0x91,0x11,0x41,
691	0x4f,0x67,0xdc,0xea,
692	0x97,0xf2,0xcf,0xce,
693	0xf0,0xb4,0xe6,0x73,
694	0x96,0xac,0x74,0x22,
695	0xe7,0xad,0x35,0x85,
696	0xe2,0xf9,0x37,0xe8,
697	0x1c,0x75,0xdf,0x6e,
698	0x47,0xf1,0x1a,0x71,
699	0x1d,0x29,0xc5,0x89,
700	0x6f,0xb7,0x62,0x0e,
701	0xaa,0x18,0xbe,0x1b,
702	0xfc,0x56,0x3e,0x4b,
703	0xc6,0xd2,0x79,0x20,
704	0x9a,0xdb,0xc0,0xfe,
705	0x78,0xcd,0x5a,0xf4,
706	0x1f,0xdd,0xa8,0x33,
707	0x88,0x07,0xc7,0x31,
708	0xb1,0x12,0x10,0x59,
709	0x27,0x80,0xec,0x5f,
710	0x60,0x51,0x7f,0xa9,
711	0x19,0xb5,0x4a,0x0d,
712	0x2d,0xe5,0x7a,0x9f,
713	0x93,0xc9,0x9c,0xef,
714	0xa0,0xe0,0x3b,0x4d,
715	0xae,0x2a,0xf5,0xb0,
716	0xc8,0xeb,0xbb,0x3c,
717	0x83,0x53,0x99,0x61,
718	0x17,0x2b,0x04,0x7e,
719	0xba,0x77,0xd6,0x26,
720	0xe1,0x69,0x14,0x63,
721	0x55,0x21,0x0c,0x7d
722);
723
724my @U1 = (
725	[0x00,0x00,0x00,0x00], [0x0e,0x09,0x0d,0x0b], [0x1c,0x12,0x1a,0x16], [0x12,0x1b,0x17,0x1d],
726	[0x38,0x24,0x34,0x2c], [0x36,0x2d,0x39,0x27], [0x24,0x36,0x2e,0x3a], [0x2a,0x3f,0x23,0x31],
727	[0x70,0x48,0x68,0x58], [0x7e,0x41,0x65,0x53], [0x6c,0x5a,0x72,0x4e], [0x62,0x53,0x7f,0x45],
728	[0x48,0x6c,0x5c,0x74], [0x46,0x65,0x51,0x7f], [0x54,0x7e,0x46,0x62], [0x5a,0x77,0x4b,0x69],
729	[0xe0,0x90,0xd0,0xb0], [0xee,0x99,0xdd,0xbb], [0xfc,0x82,0xca,0xa6], [0xf2,0x8b,0xc7,0xad],
730	[0xd8,0xb4,0xe4,0x9c], [0xd6,0xbd,0xe9,0x97], [0xc4,0xa6,0xfe,0x8a], [0xca,0xaf,0xf3,0x81],
731	[0x90,0xd8,0xb8,0xe8], [0x9e,0xd1,0xb5,0xe3], [0x8c,0xca,0xa2,0xfe], [0x82,0xc3,0xaf,0xf5],
732	[0xa8,0xfc,0x8c,0xc4], [0xa6,0xf5,0x81,0xcf], [0xb4,0xee,0x96,0xd2], [0xba,0xe7,0x9b,0xd9],
733	[0xdb,0x3b,0xbb,0x7b], [0xd5,0x32,0xb6,0x70], [0xc7,0x29,0xa1,0x6d], [0xc9,0x20,0xac,0x66],
734	[0xe3,0x1f,0x8f,0x57], [0xed,0x16,0x82,0x5c], [0xff,0x0d,0x95,0x41], [0xf1,0x04,0x98,0x4a],
735	[0xab,0x73,0xd3,0x23], [0xa5,0x7a,0xde,0x28], [0xb7,0x61,0xc9,0x35], [0xb9,0x68,0xc4,0x3e],
736	[0x93,0x57,0xe7,0x0f], [0x9d,0x5e,0xea,0x04], [0x8f,0x45,0xfd,0x19], [0x81,0x4c,0xf0,0x12],
737	[0x3b,0xab,0x6b,0xcb], [0x35,0xa2,0x66,0xc0], [0x27,0xb9,0x71,0xdd], [0x29,0xb0,0x7c,0xd6],
738	[0x03,0x8f,0x5f,0xe7], [0x0d,0x86,0x52,0xec], [0x1f,0x9d,0x45,0xf1], [0x11,0x94,0x48,0xfa],
739	[0x4b,0xe3,0x03,0x93], [0x45,0xea,0x0e,0x98], [0x57,0xf1,0x19,0x85], [0x59,0xf8,0x14,0x8e],
740	[0x73,0xc7,0x37,0xbf], [0x7d,0xce,0x3a,0xb4], [0x6f,0xd5,0x2d,0xa9], [0x61,0xdc,0x20,0xa2],
741	[0xad,0x76,0x6d,0xf6], [0xa3,0x7f,0x60,0xfd], [0xb1,0x64,0x77,0xe0], [0xbf,0x6d,0x7a,0xeb],
742	[0x95,0x52,0x59,0xda], [0x9b,0x5b,0x54,0xd1], [0x89,0x40,0x43,0xcc], [0x87,0x49,0x4e,0xc7],
743	[0xdd,0x3e,0x05,0xae], [0xd3,0x37,0x08,0xa5], [0xc1,0x2c,0x1f,0xb8], [0xcf,0x25,0x12,0xb3],
744	[0xe5,0x1a,0x31,0x82], [0xeb,0x13,0x3c,0x89], [0xf9,0x08,0x2b,0x94], [0xf7,0x01,0x26,0x9f],
745	[0x4d,0xe6,0xbd,0x46], [0x43,0xef,0xb0,0x4d], [0x51,0xf4,0xa7,0x50], [0x5f,0xfd,0xaa,0x5b],
746	[0x75,0xc2,0x89,0x6a], [0x7b,0xcb,0x84,0x61], [0x69,0xd0,0x93,0x7c], [0x67,0xd9,0x9e,0x77],
747	[0x3d,0xae,0xd5,0x1e], [0x33,0xa7,0xd8,0x15], [0x21,0xbc,0xcf,0x08], [0x2f,0xb5,0xc2,0x03],
748	[0x05,0x8a,0xe1,0x32], [0x0b,0x83,0xec,0x39], [0x19,0x98,0xfb,0x24], [0x17,0x91,0xf6,0x2f],
749	[0x76,0x4d,0xd6,0x8d], [0x78,0x44,0xdb,0x86], [0x6a,0x5f,0xcc,0x9b], [0x64,0x56,0xc1,0x90],
750	[0x4e,0x69,0xe2,0xa1], [0x40,0x60,0xef,0xaa], [0x52,0x7b,0xf8,0xb7], [0x5c,0x72,0xf5,0xbc],
751	[0x06,0x05,0xbe,0xd5], [0x08,0x0c,0xb3,0xde], [0x1a,0x17,0xa4,0xc3], [0x14,0x1e,0xa9,0xc8],
752	[0x3e,0x21,0x8a,0xf9], [0x30,0x28,0x87,0xf2], [0x22,0x33,0x90,0xef], [0x2c,0x3a,0x9d,0xe4],
753	[0x96,0xdd,0x06,0x3d], [0x98,0xd4,0x0b,0x36], [0x8a,0xcf,0x1c,0x2b], [0x84,0xc6,0x11,0x20],
754	[0xae,0xf9,0x32,0x11], [0xa0,0xf0,0x3f,0x1a], [0xb2,0xeb,0x28,0x07], [0xbc,0xe2,0x25,0x0c],
755	[0xe6,0x95,0x6e,0x65], [0xe8,0x9c,0x63,0x6e], [0xfa,0x87,0x74,0x73], [0xf4,0x8e,0x79,0x78],
756	[0xde,0xb1,0x5a,0x49], [0xd0,0xb8,0x57,0x42], [0xc2,0xa3,0x40,0x5f], [0xcc,0xaa,0x4d,0x54],
757	[0x41,0xec,0xda,0xf7], [0x4f,0xe5,0xd7,0xfc], [0x5d,0xfe,0xc0,0xe1], [0x53,0xf7,0xcd,0xea],
758	[0x79,0xc8,0xee,0xdb], [0x77,0xc1,0xe3,0xd0], [0x65,0xda,0xf4,0xcd], [0x6b,0xd3,0xf9,0xc6],
759	[0x31,0xa4,0xb2,0xaf], [0x3f,0xad,0xbf,0xa4], [0x2d,0xb6,0xa8,0xb9], [0x23,0xbf,0xa5,0xb2],
760	[0x09,0x80,0x86,0x83], [0x07,0x89,0x8b,0x88], [0x15,0x92,0x9c,0x95], [0x1b,0x9b,0x91,0x9e],
761	[0xa1,0x7c,0x0a,0x47], [0xaf,0x75,0x07,0x4c], [0xbd,0x6e,0x10,0x51], [0xb3,0x67,0x1d,0x5a],
762	[0x99,0x58,0x3e,0x6b], [0x97,0x51,0x33,0x60], [0x85,0x4a,0x24,0x7d], [0x8b,0x43,0x29,0x76],
763	[0xd1,0x34,0x62,0x1f], [0xdf,0x3d,0x6f,0x14], [0xcd,0x26,0x78,0x09], [0xc3,0x2f,0x75,0x02],
764	[0xe9,0x10,0x56,0x33], [0xe7,0x19,0x5b,0x38], [0xf5,0x02,0x4c,0x25], [0xfb,0x0b,0x41,0x2e],
765	[0x9a,0xd7,0x61,0x8c], [0x94,0xde,0x6c,0x87], [0x86,0xc5,0x7b,0x9a], [0x88,0xcc,0x76,0x91],
766	[0xa2,0xf3,0x55,0xa0], [0xac,0xfa,0x58,0xab], [0xbe,0xe1,0x4f,0xb6], [0xb0,0xe8,0x42,0xbd],
767	[0xea,0x9f,0x09,0xd4], [0xe4,0x96,0x04,0xdf], [0xf6,0x8d,0x13,0xc2], [0xf8,0x84,0x1e,0xc9],
768	[0xd2,0xbb,0x3d,0xf8], [0xdc,0xb2,0x30,0xf3], [0xce,0xa9,0x27,0xee], [0xc0,0xa0,0x2a,0xe5],
769	[0x7a,0x47,0xb1,0x3c], [0x74,0x4e,0xbc,0x37], [0x66,0x55,0xab,0x2a], [0x68,0x5c,0xa6,0x21],
770	[0x42,0x63,0x85,0x10], [0x4c,0x6a,0x88,0x1b], [0x5e,0x71,0x9f,0x06], [0x50,0x78,0x92,0x0d],
771	[0x0a,0x0f,0xd9,0x64], [0x04,0x06,0xd4,0x6f], [0x16,0x1d,0xc3,0x72], [0x18,0x14,0xce,0x79],
772	[0x32,0x2b,0xed,0x48], [0x3c,0x22,0xe0,0x43], [0x2e,0x39,0xf7,0x5e], [0x20,0x30,0xfa,0x55],
773	[0xec,0x9a,0xb7,0x01], [0xe2,0x93,0xba,0x0a], [0xf0,0x88,0xad,0x17], [0xfe,0x81,0xa0,0x1c],
774	[0xd4,0xbe,0x83,0x2d], [0xda,0xb7,0x8e,0x26], [0xc8,0xac,0x99,0x3b], [0xc6,0xa5,0x94,0x30],
775	[0x9c,0xd2,0xdf,0x59], [0x92,0xdb,0xd2,0x52], [0x80,0xc0,0xc5,0x4f], [0x8e,0xc9,0xc8,0x44],
776	[0xa4,0xf6,0xeb,0x75], [0xaa,0xff,0xe6,0x7e], [0xb8,0xe4,0xf1,0x63], [0xb6,0xed,0xfc,0x68],
777	[0x0c,0x0a,0x67,0xb1], [0x02,0x03,0x6a,0xba], [0x10,0x18,0x7d,0xa7], [0x1e,0x11,0x70,0xac],
778	[0x34,0x2e,0x53,0x9d], [0x3a,0x27,0x5e,0x96], [0x28,0x3c,0x49,0x8b], [0x26,0x35,0x44,0x80],
779	[0x7c,0x42,0x0f,0xe9], [0x72,0x4b,0x02,0xe2], [0x60,0x50,0x15,0xff], [0x6e,0x59,0x18,0xf4],
780	[0x44,0x66,0x3b,0xc5], [0x4a,0x6f,0x36,0xce], [0x58,0x74,0x21,0xd3], [0x56,0x7d,0x2c,0xd8],
781	[0x37,0xa1,0x0c,0x7a], [0x39,0xa8,0x01,0x71], [0x2b,0xb3,0x16,0x6c], [0x25,0xba,0x1b,0x67],
782	[0x0f,0x85,0x38,0x56], [0x01,0x8c,0x35,0x5d], [0x13,0x97,0x22,0x40], [0x1d,0x9e,0x2f,0x4b],
783	[0x47,0xe9,0x64,0x22], [0x49,0xe0,0x69,0x29], [0x5b,0xfb,0x7e,0x34], [0x55,0xf2,0x73,0x3f],
784	[0x7f,0xcd,0x50,0x0e], [0x71,0xc4,0x5d,0x05], [0x63,0xdf,0x4a,0x18], [0x6d,0xd6,0x47,0x13],
785	[0xd7,0x31,0xdc,0xca], [0xd9,0x38,0xd1,0xc1], [0xcb,0x23,0xc6,0xdc], [0xc5,0x2a,0xcb,0xd7],
786	[0xef,0x15,0xe8,0xe6], [0xe1,0x1c,0xe5,0xed], [0xf3,0x07,0xf2,0xf0], [0xfd,0x0e,0xff,0xfb],
787	[0xa7,0x79,0xb4,0x92], [0xa9,0x70,0xb9,0x99], [0xbb,0x6b,0xae,0x84], [0xb5,0x62,0xa3,0x8f],
788	[0x9f,0x5d,0x80,0xbe], [0x91,0x54,0x8d,0xb5], [0x83,0x4f,0x9a,0xa8], [0x8d,0x46,0x97,0xa3]
789);
790
791my @U2 = (
792	[0x00,0x00,0x00,0x00], [0x0b,0x0e,0x09,0x0d], [0x16,0x1c,0x12,0x1a], [0x1d,0x12,0x1b,0x17],
793	[0x2c,0x38,0x24,0x34], [0x27,0x36,0x2d,0x39], [0x3a,0x24,0x36,0x2e], [0x31,0x2a,0x3f,0x23],
794	[0x58,0x70,0x48,0x68], [0x53,0x7e,0x41,0x65], [0x4e,0x6c,0x5a,0x72], [0x45,0x62,0x53,0x7f],
795	[0x74,0x48,0x6c,0x5c], [0x7f,0x46,0x65,0x51], [0x62,0x54,0x7e,0x46], [0x69,0x5a,0x77,0x4b],
796	[0xb0,0xe0,0x90,0xd0], [0xbb,0xee,0x99,0xdd], [0xa6,0xfc,0x82,0xca], [0xad,0xf2,0x8b,0xc7],
797	[0x9c,0xd8,0xb4,0xe4], [0x97,0xd6,0xbd,0xe9], [0x8a,0xc4,0xa6,0xfe], [0x81,0xca,0xaf,0xf3],
798	[0xe8,0x90,0xd8,0xb8], [0xe3,0x9e,0xd1,0xb5], [0xfe,0x8c,0xca,0xa2], [0xf5,0x82,0xc3,0xaf],
799	[0xc4,0xa8,0xfc,0x8c], [0xcf,0xa6,0xf5,0x81], [0xd2,0xb4,0xee,0x96], [0xd9,0xba,0xe7,0x9b],
800	[0x7b,0xdb,0x3b,0xbb], [0x70,0xd5,0x32,0xb6], [0x6d,0xc7,0x29,0xa1], [0x66,0xc9,0x20,0xac],
801	[0x57,0xe3,0x1f,0x8f], [0x5c,0xed,0x16,0x82], [0x41,0xff,0x0d,0x95], [0x4a,0xf1,0x04,0x98],
802	[0x23,0xab,0x73,0xd3], [0x28,0xa5,0x7a,0xde], [0x35,0xb7,0x61,0xc9], [0x3e,0xb9,0x68,0xc4],
803	[0x0f,0x93,0x57,0xe7], [0x04,0x9d,0x5e,0xea], [0x19,0x8f,0x45,0xfd], [0x12,0x81,0x4c,0xf0],
804	[0xcb,0x3b,0xab,0x6b], [0xc0,0x35,0xa2,0x66], [0xdd,0x27,0xb9,0x71], [0xd6,0x29,0xb0,0x7c],
805	[0xe7,0x03,0x8f,0x5f], [0xec,0x0d,0x86,0x52], [0xf1,0x1f,0x9d,0x45], [0xfa,0x11,0x94,0x48],
806	[0x93,0x4b,0xe3,0x03], [0x98,0x45,0xea,0x0e], [0x85,0x57,0xf1,0x19], [0x8e,0x59,0xf8,0x14],
807	[0xbf,0x73,0xc7,0x37], [0xb4,0x7d,0xce,0x3a], [0xa9,0x6f,0xd5,0x2d], [0xa2,0x61,0xdc,0x20],
808	[0xf6,0xad,0x76,0x6d], [0xfd,0xa3,0x7f,0x60], [0xe0,0xb1,0x64,0x77], [0xeb,0xbf,0x6d,0x7a],
809	[0xda,0x95,0x52,0x59], [0xd1,0x9b,0x5b,0x54], [0xcc,0x89,0x40,0x43], [0xc7,0x87,0x49,0x4e],
810	[0xae,0xdd,0x3e,0x05], [0xa5,0xd3,0x37,0x08], [0xb8,0xc1,0x2c,0x1f], [0xb3,0xcf,0x25,0x12],
811	[0x82,0xe5,0x1a,0x31], [0x89,0xeb,0x13,0x3c], [0x94,0xf9,0x08,0x2b], [0x9f,0xf7,0x01,0x26],
812	[0x46,0x4d,0xe6,0xbd], [0x4d,0x43,0xef,0xb0], [0x50,0x51,0xf4,0xa7], [0x5b,0x5f,0xfd,0xaa],
813	[0x6a,0x75,0xc2,0x89], [0x61,0x7b,0xcb,0x84], [0x7c,0x69,0xd0,0x93], [0x77,0x67,0xd9,0x9e],
814	[0x1e,0x3d,0xae,0xd5], [0x15,0x33,0xa7,0xd8], [0x08,0x21,0xbc,0xcf], [0x03,0x2f,0xb5,0xc2],
815	[0x32,0x05,0x8a,0xe1], [0x39,0x0b,0x83,0xec], [0x24,0x19,0x98,0xfb], [0x2f,0x17,0x91,0xf6],
816	[0x8d,0x76,0x4d,0xd6], [0x86,0x78,0x44,0xdb], [0x9b,0x6a,0x5f,0xcc], [0x90,0x64,0x56,0xc1],
817	[0xa1,0x4e,0x69,0xe2], [0xaa,0x40,0x60,0xef], [0xb7,0x52,0x7b,0xf8], [0xbc,0x5c,0x72,0xf5],
818	[0xd5,0x06,0x05,0xbe], [0xde,0x08,0x0c,0xb3], [0xc3,0x1a,0x17,0xa4], [0xc8,0x14,0x1e,0xa9],
819	[0xf9,0x3e,0x21,0x8a], [0xf2,0x30,0x28,0x87], [0xef,0x22,0x33,0x90], [0xe4,0x2c,0x3a,0x9d],
820	[0x3d,0x96,0xdd,0x06], [0x36,0x98,0xd4,0x0b], [0x2b,0x8a,0xcf,0x1c], [0x20,0x84,0xc6,0x11],
821	[0x11,0xae,0xf9,0x32], [0x1a,0xa0,0xf0,0x3f], [0x07,0xb2,0xeb,0x28], [0x0c,0xbc,0xe2,0x25],
822	[0x65,0xe6,0x95,0x6e], [0x6e,0xe8,0x9c,0x63], [0x73,0xfa,0x87,0x74], [0x78,0xf4,0x8e,0x79],
823	[0x49,0xde,0xb1,0x5a], [0x42,0xd0,0xb8,0x57], [0x5f,0xc2,0xa3,0x40], [0x54,0xcc,0xaa,0x4d],
824	[0xf7,0x41,0xec,0xda], [0xfc,0x4f,0xe5,0xd7], [0xe1,0x5d,0xfe,0xc0], [0xea,0x53,0xf7,0xcd],
825	[0xdb,0x79,0xc8,0xee], [0xd0,0x77,0xc1,0xe3], [0xcd,0x65,0xda,0xf4], [0xc6,0x6b,0xd3,0xf9],
826	[0xaf,0x31,0xa4,0xb2], [0xa4,0x3f,0xad,0xbf], [0xb9,0x2d,0xb6,0xa8], [0xb2,0x23,0xbf,0xa5],
827	[0x83,0x09,0x80,0x86], [0x88,0x07,0x89,0x8b], [0x95,0x15,0x92,0x9c], [0x9e,0x1b,0x9b,0x91],
828	[0x47,0xa1,0x7c,0x0a], [0x4c,0xaf,0x75,0x07], [0x51,0xbd,0x6e,0x10], [0x5a,0xb3,0x67,0x1d],
829	[0x6b,0x99,0x58,0x3e], [0x60,0x97,0x51,0x33], [0x7d,0x85,0x4a,0x24], [0x76,0x8b,0x43,0x29],
830	[0x1f,0xd1,0x34,0x62], [0x14,0xdf,0x3d,0x6f], [0x09,0xcd,0x26,0x78], [0x02,0xc3,0x2f,0x75],
831	[0x33,0xe9,0x10,0x56], [0x38,0xe7,0x19,0x5b], [0x25,0xf5,0x02,0x4c], [0x2e,0xfb,0x0b,0x41],
832	[0x8c,0x9a,0xd7,0x61], [0x87,0x94,0xde,0x6c], [0x9a,0x86,0xc5,0x7b], [0x91,0x88,0xcc,0x76],
833	[0xa0,0xa2,0xf3,0x55], [0xab,0xac,0xfa,0x58], [0xb6,0xbe,0xe1,0x4f], [0xbd,0xb0,0xe8,0x42],
834	[0xd4,0xea,0x9f,0x09], [0xdf,0xe4,0x96,0x04], [0xc2,0xf6,0x8d,0x13], [0xc9,0xf8,0x84,0x1e],
835	[0xf8,0xd2,0xbb,0x3d], [0xf3,0xdc,0xb2,0x30], [0xee,0xce,0xa9,0x27], [0xe5,0xc0,0xa0,0x2a],
836	[0x3c,0x7a,0x47,0xb1], [0x37,0x74,0x4e,0xbc], [0x2a,0x66,0x55,0xab], [0x21,0x68,0x5c,0xa6],
837	[0x10,0x42,0x63,0x85], [0x1b,0x4c,0x6a,0x88], [0x06,0x5e,0x71,0x9f], [0x0d,0x50,0x78,0x92],
838	[0x64,0x0a,0x0f,0xd9], [0x6f,0x04,0x06,0xd4], [0x72,0x16,0x1d,0xc3], [0x79,0x18,0x14,0xce],
839	[0x48,0x32,0x2b,0xed], [0x43,0x3c,0x22,0xe0], [0x5e,0x2e,0x39,0xf7], [0x55,0x20,0x30,0xfa],
840	[0x01,0xec,0x9a,0xb7], [0x0a,0xe2,0x93,0xba], [0x17,0xf0,0x88,0xad], [0x1c,0xfe,0x81,0xa0],
841	[0x2d,0xd4,0xbe,0x83], [0x26,0xda,0xb7,0x8e], [0x3b,0xc8,0xac,0x99], [0x30,0xc6,0xa5,0x94],
842	[0x59,0x9c,0xd2,0xdf], [0x52,0x92,0xdb,0xd2], [0x4f,0x80,0xc0,0xc5], [0x44,0x8e,0xc9,0xc8],
843	[0x75,0xa4,0xf6,0xeb], [0x7e,0xaa,0xff,0xe6], [0x63,0xb8,0xe4,0xf1], [0x68,0xb6,0xed,0xfc],
844	[0xb1,0x0c,0x0a,0x67], [0xba,0x02,0x03,0x6a], [0xa7,0x10,0x18,0x7d], [0xac,0x1e,0x11,0x70],
845	[0x9d,0x34,0x2e,0x53], [0x96,0x3a,0x27,0x5e], [0x8b,0x28,0x3c,0x49], [0x80,0x26,0x35,0x44],
846	[0xe9,0x7c,0x42,0x0f], [0xe2,0x72,0x4b,0x02], [0xff,0x60,0x50,0x15], [0xf4,0x6e,0x59,0x18],
847	[0xc5,0x44,0x66,0x3b], [0xce,0x4a,0x6f,0x36], [0xd3,0x58,0x74,0x21], [0xd8,0x56,0x7d,0x2c],
848	[0x7a,0x37,0xa1,0x0c], [0x71,0x39,0xa8,0x01], [0x6c,0x2b,0xb3,0x16], [0x67,0x25,0xba,0x1b],
849	[0x56,0x0f,0x85,0x38], [0x5d,0x01,0x8c,0x35], [0x40,0x13,0x97,0x22], [0x4b,0x1d,0x9e,0x2f],
850	[0x22,0x47,0xe9,0x64], [0x29,0x49,0xe0,0x69], [0x34,0x5b,0xfb,0x7e], [0x3f,0x55,0xf2,0x73],
851	[0x0e,0x7f,0xcd,0x50], [0x05,0x71,0xc4,0x5d], [0x18,0x63,0xdf,0x4a], [0x13,0x6d,0xd6,0x47],
852	[0xca,0xd7,0x31,0xdc], [0xc1,0xd9,0x38,0xd1], [0xdc,0xcb,0x23,0xc6], [0xd7,0xc5,0x2a,0xcb],
853	[0xe6,0xef,0x15,0xe8], [0xed,0xe1,0x1c,0xe5], [0xf0,0xf3,0x07,0xf2], [0xfb,0xfd,0x0e,0xff],
854	[0x92,0xa7,0x79,0xb4], [0x99,0xa9,0x70,0xb9], [0x84,0xbb,0x6b,0xae], [0x8f,0xb5,0x62,0xa3],
855	[0xbe,0x9f,0x5d,0x80], [0xb5,0x91,0x54,0x8d], [0xa8,0x83,0x4f,0x9a], [0xa3,0x8d,0x46,0x97]
856);
857
858my @U3 = (
859	[0x00,0x00,0x00,0x00], [0x0d,0x0b,0x0e,0x09], [0x1a,0x16,0x1c,0x12], [0x17,0x1d,0x12,0x1b],
860	[0x34,0x2c,0x38,0x24], [0x39,0x27,0x36,0x2d], [0x2e,0x3a,0x24,0x36], [0x23,0x31,0x2a,0x3f],
861	[0x68,0x58,0x70,0x48], [0x65,0x53,0x7e,0x41], [0x72,0x4e,0x6c,0x5a], [0x7f,0x45,0x62,0x53],
862	[0x5c,0x74,0x48,0x6c], [0x51,0x7f,0x46,0x65], [0x46,0x62,0x54,0x7e], [0x4b,0x69,0x5a,0x77],
863	[0xd0,0xb0,0xe0,0x90], [0xdd,0xbb,0xee,0x99], [0xca,0xa6,0xfc,0x82], [0xc7,0xad,0xf2,0x8b],
864	[0xe4,0x9c,0xd8,0xb4], [0xe9,0x97,0xd6,0xbd], [0xfe,0x8a,0xc4,0xa6], [0xf3,0x81,0xca,0xaf],
865	[0xb8,0xe8,0x90,0xd8], [0xb5,0xe3,0x9e,0xd1], [0xa2,0xfe,0x8c,0xca], [0xaf,0xf5,0x82,0xc3],
866	[0x8c,0xc4,0xa8,0xfc], [0x81,0xcf,0xa6,0xf5], [0x96,0xd2,0xb4,0xee], [0x9b,0xd9,0xba,0xe7],
867	[0xbb,0x7b,0xdb,0x3b], [0xb6,0x70,0xd5,0x32], [0xa1,0x6d,0xc7,0x29], [0xac,0x66,0xc9,0x20],
868	[0x8f,0x57,0xe3,0x1f], [0x82,0x5c,0xed,0x16], [0x95,0x41,0xff,0x0d], [0x98,0x4a,0xf1,0x04],
869	[0xd3,0x23,0xab,0x73], [0xde,0x28,0xa5,0x7a], [0xc9,0x35,0xb7,0x61], [0xc4,0x3e,0xb9,0x68],
870	[0xe7,0x0f,0x93,0x57], [0xea,0x04,0x9d,0x5e], [0xfd,0x19,0x8f,0x45], [0xf0,0x12,0x81,0x4c],
871	[0x6b,0xcb,0x3b,0xab], [0x66,0xc0,0x35,0xa2], [0x71,0xdd,0x27,0xb9], [0x7c,0xd6,0x29,0xb0],
872	[0x5f,0xe7,0x03,0x8f], [0x52,0xec,0x0d,0x86], [0x45,0xf1,0x1f,0x9d], [0x48,0xfa,0x11,0x94],
873	[0x03,0x93,0x4b,0xe3], [0x0e,0x98,0x45,0xea], [0x19,0x85,0x57,0xf1], [0x14,0x8e,0x59,0xf8],
874	[0x37,0xbf,0x73,0xc7], [0x3a,0xb4,0x7d,0xce], [0x2d,0xa9,0x6f,0xd5], [0x20,0xa2,0x61,0xdc],
875	[0x6d,0xf6,0xad,0x76], [0x60,0xfd,0xa3,0x7f], [0x77,0xe0,0xb1,0x64], [0x7a,0xeb,0xbf,0x6d],
876	[0x59,0xda,0x95,0x52], [0x54,0xd1,0x9b,0x5b], [0x43,0xcc,0x89,0x40], [0x4e,0xc7,0x87,0x49],
877	[0x05,0xae,0xdd,0x3e], [0x08,0xa5,0xd3,0x37], [0x1f,0xb8,0xc1,0x2c], [0x12,0xb3,0xcf,0x25],
878	[0x31,0x82,0xe5,0x1a], [0x3c,0x89,0xeb,0x13], [0x2b,0x94,0xf9,0x08], [0x26,0x9f,0xf7,0x01],
879	[0xbd,0x46,0x4d,0xe6], [0xb0,0x4d,0x43,0xef], [0xa7,0x50,0x51,0xf4], [0xaa,0x5b,0x5f,0xfd],
880	[0x89,0x6a,0x75,0xc2], [0x84,0x61,0x7b,0xcb], [0x93,0x7c,0x69,0xd0], [0x9e,0x77,0x67,0xd9],
881	[0xd5,0x1e,0x3d,0xae], [0xd8,0x15,0x33,0xa7], [0xcf,0x08,0x21,0xbc], [0xc2,0x03,0x2f,0xb5],
882	[0xe1,0x32,0x05,0x8a], [0xec,0x39,0x0b,0x83], [0xfb,0x24,0x19,0x98], [0xf6,0x2f,0x17,0x91],
883	[0xd6,0x8d,0x76,0x4d], [0xdb,0x86,0x78,0x44], [0xcc,0x9b,0x6a,0x5f], [0xc1,0x90,0x64,0x56],
884	[0xe2,0xa1,0x4e,0x69], [0xef,0xaa,0x40,0x60], [0xf8,0xb7,0x52,0x7b], [0xf5,0xbc,0x5c,0x72],
885	[0xbe,0xd5,0x06,0x05], [0xb3,0xde,0x08,0x0c], [0xa4,0xc3,0x1a,0x17], [0xa9,0xc8,0x14,0x1e],
886	[0x8a,0xf9,0x3e,0x21], [0x87,0xf2,0x30,0x28], [0x90,0xef,0x22,0x33], [0x9d,0xe4,0x2c,0x3a],
887	[0x06,0x3d,0x96,0xdd], [0x0b,0x36,0x98,0xd4], [0x1c,0x2b,0x8a,0xcf], [0x11,0x20,0x84,0xc6],
888	[0x32,0x11,0xae,0xf9], [0x3f,0x1a,0xa0,0xf0], [0x28,0x07,0xb2,0xeb], [0x25,0x0c,0xbc,0xe2],
889	[0x6e,0x65,0xe6,0x95], [0x63,0x6e,0xe8,0x9c], [0x74,0x73,0xfa,0x87], [0x79,0x78,0xf4,0x8e],
890	[0x5a,0x49,0xde,0xb1], [0x57,0x42,0xd0,0xb8], [0x40,0x5f,0xc2,0xa3], [0x4d,0x54,0xcc,0xaa],
891	[0xda,0xf7,0x41,0xec], [0xd7,0xfc,0x4f,0xe5], [0xc0,0xe1,0x5d,0xfe], [0xcd,0xea,0x53,0xf7],
892	[0xee,0xdb,0x79,0xc8], [0xe3,0xd0,0x77,0xc1], [0xf4,0xcd,0x65,0xda], [0xf9,0xc6,0x6b,0xd3],
893	[0xb2,0xaf,0x31,0xa4], [0xbf,0xa4,0x3f,0xad], [0xa8,0xb9,0x2d,0xb6], [0xa5,0xb2,0x23,0xbf],
894	[0x86,0x83,0x09,0x80], [0x8b,0x88,0x07,0x89], [0x9c,0x95,0x15,0x92], [0x91,0x9e,0x1b,0x9b],
895	[0x0a,0x47,0xa1,0x7c], [0x07,0x4c,0xaf,0x75], [0x10,0x51,0xbd,0x6e], [0x1d,0x5a,0xb3,0x67],
896	[0x3e,0x6b,0x99,0x58], [0x33,0x60,0x97,0x51], [0x24,0x7d,0x85,0x4a], [0x29,0x76,0x8b,0x43],
897	[0x62,0x1f,0xd1,0x34], [0x6f,0x14,0xdf,0x3d], [0x78,0x09,0xcd,0x26], [0x75,0x02,0xc3,0x2f],
898	[0x56,0x33,0xe9,0x10], [0x5b,0x38,0xe7,0x19], [0x4c,0x25,0xf5,0x02], [0x41,0x2e,0xfb,0x0b],
899	[0x61,0x8c,0x9a,0xd7], [0x6c,0x87,0x94,0xde], [0x7b,0x9a,0x86,0xc5], [0x76,0x91,0x88,0xcc],
900	[0x55,0xa0,0xa2,0xf3], [0x58,0xab,0xac,0xfa], [0x4f,0xb6,0xbe,0xe1], [0x42,0xbd,0xb0,0xe8],
901	[0x09,0xd4,0xea,0x9f], [0x04,0xdf,0xe4,0x96], [0x13,0xc2,0xf6,0x8d], [0x1e,0xc9,0xf8,0x84],
902	[0x3d,0xf8,0xd2,0xbb], [0x30,0xf3,0xdc,0xb2], [0x27,0xee,0xce,0xa9], [0x2a,0xe5,0xc0,0xa0],
903	[0xb1,0x3c,0x7a,0x47], [0xbc,0x37,0x74,0x4e], [0xab,0x2a,0x66,0x55], [0xa6,0x21,0x68,0x5c],
904	[0x85,0x10,0x42,0x63], [0x88,0x1b,0x4c,0x6a], [0x9f,0x06,0x5e,0x71], [0x92,0x0d,0x50,0x78],
905	[0xd9,0x64,0x0a,0x0f], [0xd4,0x6f,0x04,0x06], [0xc3,0x72,0x16,0x1d], [0xce,0x79,0x18,0x14],
906	[0xed,0x48,0x32,0x2b], [0xe0,0x43,0x3c,0x22], [0xf7,0x5e,0x2e,0x39], [0xfa,0x55,0x20,0x30],
907	[0xb7,0x01,0xec,0x9a], [0xba,0x0a,0xe2,0x93], [0xad,0x17,0xf0,0x88], [0xa0,0x1c,0xfe,0x81],
908	[0x83,0x2d,0xd4,0xbe], [0x8e,0x26,0xda,0xb7], [0x99,0x3b,0xc8,0xac], [0x94,0x30,0xc6,0xa5],
909	[0xdf,0x59,0x9c,0xd2], [0xd2,0x52,0x92,0xdb], [0xc5,0x4f,0x80,0xc0], [0xc8,0x44,0x8e,0xc9],
910	[0xeb,0x75,0xa4,0xf6], [0xe6,0x7e,0xaa,0xff], [0xf1,0x63,0xb8,0xe4], [0xfc,0x68,0xb6,0xed],
911	[0x67,0xb1,0x0c,0x0a], [0x6a,0xba,0x02,0x03], [0x7d,0xa7,0x10,0x18], [0x70,0xac,0x1e,0x11],
912	[0x53,0x9d,0x34,0x2e], [0x5e,0x96,0x3a,0x27], [0x49,0x8b,0x28,0x3c], [0x44,0x80,0x26,0x35],
913	[0x0f,0xe9,0x7c,0x42], [0x02,0xe2,0x72,0x4b], [0x15,0xff,0x60,0x50], [0x18,0xf4,0x6e,0x59],
914	[0x3b,0xc5,0x44,0x66], [0x36,0xce,0x4a,0x6f], [0x21,0xd3,0x58,0x74], [0x2c,0xd8,0x56,0x7d],
915	[0x0c,0x7a,0x37,0xa1], [0x01,0x71,0x39,0xa8], [0x16,0x6c,0x2b,0xb3], [0x1b,0x67,0x25,0xba],
916	[0x38,0x56,0x0f,0x85], [0x35,0x5d,0x01,0x8c], [0x22,0x40,0x13,0x97], [0x2f,0x4b,0x1d,0x9e],
917	[0x64,0x22,0x47,0xe9], [0x69,0x29,0x49,0xe0], [0x7e,0x34,0x5b,0xfb], [0x73,0x3f,0x55,0xf2],
918	[0x50,0x0e,0x7f,0xcd], [0x5d,0x05,0x71,0xc4], [0x4a,0x18,0x63,0xdf], [0x47,0x13,0x6d,0xd6],
919	[0xdc,0xca,0xd7,0x31], [0xd1,0xc1,0xd9,0x38], [0xc6,0xdc,0xcb,0x23], [0xcb,0xd7,0xc5,0x2a],
920	[0xe8,0xe6,0xef,0x15], [0xe5,0xed,0xe1,0x1c], [0xf2,0xf0,0xf3,0x07], [0xff,0xfb,0xfd,0x0e],
921	[0xb4,0x92,0xa7,0x79], [0xb9,0x99,0xa9,0x70], [0xae,0x84,0xbb,0x6b], [0xa3,0x8f,0xb5,0x62],
922	[0x80,0xbe,0x9f,0x5d], [0x8d,0xb5,0x91,0x54], [0x9a,0xa8,0x83,0x4f], [0x97,0xa3,0x8d,0x46]
923);
924
925my @U4 = (
926	[0x00,0x00,0x00,0x00], [0x09,0x0d,0x0b,0x0e], [0x12,0x1a,0x16,0x1c], [0x1b,0x17,0x1d,0x12],
927	[0x24,0x34,0x2c,0x38], [0x2d,0x39,0x27,0x36], [0x36,0x2e,0x3a,0x24], [0x3f,0x23,0x31,0x2a],
928	[0x48,0x68,0x58,0x70], [0x41,0x65,0x53,0x7e], [0x5a,0x72,0x4e,0x6c], [0x53,0x7f,0x45,0x62],
929	[0x6c,0x5c,0x74,0x48], [0x65,0x51,0x7f,0x46], [0x7e,0x46,0x62,0x54], [0x77,0x4b,0x69,0x5a],
930	[0x90,0xd0,0xb0,0xe0], [0x99,0xdd,0xbb,0xee], [0x82,0xca,0xa6,0xfc], [0x8b,0xc7,0xad,0xf2],
931	[0xb4,0xe4,0x9c,0xd8], [0xbd,0xe9,0x97,0xd6], [0xa6,0xfe,0x8a,0xc4], [0xaf,0xf3,0x81,0xca],
932	[0xd8,0xb8,0xe8,0x90], [0xd1,0xb5,0xe3,0x9e], [0xca,0xa2,0xfe,0x8c], [0xc3,0xaf,0xf5,0x82],
933	[0xfc,0x8c,0xc4,0xa8], [0xf5,0x81,0xcf,0xa6], [0xee,0x96,0xd2,0xb4], [0xe7,0x9b,0xd9,0xba],
934	[0x3b,0xbb,0x7b,0xdb], [0x32,0xb6,0x70,0xd5], [0x29,0xa1,0x6d,0xc7], [0x20,0xac,0x66,0xc9],
935	[0x1f,0x8f,0x57,0xe3], [0x16,0x82,0x5c,0xed], [0x0d,0x95,0x41,0xff], [0x04,0x98,0x4a,0xf1],
936	[0x73,0xd3,0x23,0xab], [0x7a,0xde,0x28,0xa5], [0x61,0xc9,0x35,0xb7], [0x68,0xc4,0x3e,0xb9],
937	[0x57,0xe7,0x0f,0x93], [0x5e,0xea,0x04,0x9d], [0x45,0xfd,0x19,0x8f], [0x4c,0xf0,0x12,0x81],
938	[0xab,0x6b,0xcb,0x3b], [0xa2,0x66,0xc0,0x35], [0xb9,0x71,0xdd,0x27], [0xb0,0x7c,0xd6,0x29],
939	[0x8f,0x5f,0xe7,0x03], [0x86,0x52,0xec,0x0d], [0x9d,0x45,0xf1,0x1f], [0x94,0x48,0xfa,0x11],
940	[0xe3,0x03,0x93,0x4b], [0xea,0x0e,0x98,0x45], [0xf1,0x19,0x85,0x57], [0xf8,0x14,0x8e,0x59],
941	[0xc7,0x37,0xbf,0x73], [0xce,0x3a,0xb4,0x7d], [0xd5,0x2d,0xa9,0x6f], [0xdc,0x20,0xa2,0x61],
942	[0x76,0x6d,0xf6,0xad], [0x7f,0x60,0xfd,0xa3], [0x64,0x77,0xe0,0xb1], [0x6d,0x7a,0xeb,0xbf],
943	[0x52,0x59,0xda,0x95], [0x5b,0x54,0xd1,0x9b], [0x40,0x43,0xcc,0x89], [0x49,0x4e,0xc7,0x87],
944	[0x3e,0x05,0xae,0xdd], [0x37,0x08,0xa5,0xd3], [0x2c,0x1f,0xb8,0xc1], [0x25,0x12,0xb3,0xcf],
945	[0x1a,0x31,0x82,0xe5], [0x13,0x3c,0x89,0xeb], [0x08,0x2b,0x94,0xf9], [0x01,0x26,0x9f,0xf7],
946	[0xe6,0xbd,0x46,0x4d], [0xef,0xb0,0x4d,0x43], [0xf4,0xa7,0x50,0x51], [0xfd,0xaa,0x5b,0x5f],
947	[0xc2,0x89,0x6a,0x75], [0xcb,0x84,0x61,0x7b], [0xd0,0x93,0x7c,0x69], [0xd9,0x9e,0x77,0x67],
948	[0xae,0xd5,0x1e,0x3d], [0xa7,0xd8,0x15,0x33], [0xbc,0xcf,0x08,0x21], [0xb5,0xc2,0x03,0x2f],
949	[0x8a,0xe1,0x32,0x05], [0x83,0xec,0x39,0x0b], [0x98,0xfb,0x24,0x19], [0x91,0xf6,0x2f,0x17],
950	[0x4d,0xd6,0x8d,0x76], [0x44,0xdb,0x86,0x78], [0x5f,0xcc,0x9b,0x6a], [0x56,0xc1,0x90,0x64],
951	[0x69,0xe2,0xa1,0x4e], [0x60,0xef,0xaa,0x40], [0x7b,0xf8,0xb7,0x52], [0x72,0xf5,0xbc,0x5c],
952	[0x05,0xbe,0xd5,0x06], [0x0c,0xb3,0xde,0x08], [0x17,0xa4,0xc3,0x1a], [0x1e,0xa9,0xc8,0x14],
953	[0x21,0x8a,0xf9,0x3e], [0x28,0x87,0xf2,0x30], [0x33,0x90,0xef,0x22], [0x3a,0x9d,0xe4,0x2c],
954	[0xdd,0x06,0x3d,0x96], [0xd4,0x0b,0x36,0x98], [0xcf,0x1c,0x2b,0x8a], [0xc6,0x11,0x20,0x84],
955	[0xf9,0x32,0x11,0xae], [0xf0,0x3f,0x1a,0xa0], [0xeb,0x28,0x07,0xb2], [0xe2,0x25,0x0c,0xbc],
956	[0x95,0x6e,0x65,0xe6], [0x9c,0x63,0x6e,0xe8], [0x87,0x74,0x73,0xfa], [0x8e,0x79,0x78,0xf4],
957	[0xb1,0x5a,0x49,0xde], [0xb8,0x57,0x42,0xd0], [0xa3,0x40,0x5f,0xc2], [0xaa,0x4d,0x54,0xcc],
958	[0xec,0xda,0xf7,0x41], [0xe5,0xd7,0xfc,0x4f], [0xfe,0xc0,0xe1,0x5d], [0xf7,0xcd,0xea,0x53],
959	[0xc8,0xee,0xdb,0x79], [0xc1,0xe3,0xd0,0x77], [0xda,0xf4,0xcd,0x65], [0xd3,0xf9,0xc6,0x6b],
960	[0xa4,0xb2,0xaf,0x31], [0xad,0xbf,0xa4,0x3f], [0xb6,0xa8,0xb9,0x2d], [0xbf,0xa5,0xb2,0x23],
961	[0x80,0x86,0x83,0x09], [0x89,0x8b,0x88,0x07], [0x92,0x9c,0x95,0x15], [0x9b,0x91,0x9e,0x1b],
962	[0x7c,0x0a,0x47,0xa1], [0x75,0x07,0x4c,0xaf], [0x6e,0x10,0x51,0xbd], [0x67,0x1d,0x5a,0xb3],
963	[0x58,0x3e,0x6b,0x99], [0x51,0x33,0x60,0x97], [0x4a,0x24,0x7d,0x85], [0x43,0x29,0x76,0x8b],
964	[0x34,0x62,0x1f,0xd1], [0x3d,0x6f,0x14,0xdf], [0x26,0x78,0x09,0xcd], [0x2f,0x75,0x02,0xc3],
965	[0x10,0x56,0x33,0xe9], [0x19,0x5b,0x38,0xe7], [0x02,0x4c,0x25,0xf5], [0x0b,0x41,0x2e,0xfb],
966	[0xd7,0x61,0x8c,0x9a], [0xde,0x6c,0x87,0x94], [0xc5,0x7b,0x9a,0x86], [0xcc,0x76,0x91,0x88],
967	[0xf3,0x55,0xa0,0xa2], [0xfa,0x58,0xab,0xac], [0xe1,0x4f,0xb6,0xbe], [0xe8,0x42,0xbd,0xb0],
968	[0x9f,0x09,0xd4,0xea], [0x96,0x04,0xdf,0xe4], [0x8d,0x13,0xc2,0xf6], [0x84,0x1e,0xc9,0xf8],
969	[0xbb,0x3d,0xf8,0xd2], [0xb2,0x30,0xf3,0xdc], [0xa9,0x27,0xee,0xce], [0xa0,0x2a,0xe5,0xc0],
970	[0x47,0xb1,0x3c,0x7a], [0x4e,0xbc,0x37,0x74], [0x55,0xab,0x2a,0x66], [0x5c,0xa6,0x21,0x68],
971	[0x63,0x85,0x10,0x42], [0x6a,0x88,0x1b,0x4c], [0x71,0x9f,0x06,0x5e], [0x78,0x92,0x0d,0x50],
972	[0x0f,0xd9,0x64,0x0a], [0x06,0xd4,0x6f,0x04], [0x1d,0xc3,0x72,0x16], [0x14,0xce,0x79,0x18],
973	[0x2b,0xed,0x48,0x32], [0x22,0xe0,0x43,0x3c], [0x39,0xf7,0x5e,0x2e], [0x30,0xfa,0x55,0x20],
974	[0x9a,0xb7,0x01,0xec], [0x93,0xba,0x0a,0xe2], [0x88,0xad,0x17,0xf0], [0x81,0xa0,0x1c,0xfe],
975	[0xbe,0x83,0x2d,0xd4], [0xb7,0x8e,0x26,0xda], [0xac,0x99,0x3b,0xc8], [0xa5,0x94,0x30,0xc6],
976	[0xd2,0xdf,0x59,0x9c], [0xdb,0xd2,0x52,0x92], [0xc0,0xc5,0x4f,0x80], [0xc9,0xc8,0x44,0x8e],
977	[0xf6,0xeb,0x75,0xa4], [0xff,0xe6,0x7e,0xaa], [0xe4,0xf1,0x63,0xb8], [0xed,0xfc,0x68,0xb6],
978	[0x0a,0x67,0xb1,0x0c], [0x03,0x6a,0xba,0x02], [0x18,0x7d,0xa7,0x10], [0x11,0x70,0xac,0x1e],
979	[0x2e,0x53,0x9d,0x34], [0x27,0x5e,0x96,0x3a], [0x3c,0x49,0x8b,0x28], [0x35,0x44,0x80,0x26],
980	[0x42,0x0f,0xe9,0x7c], [0x4b,0x02,0xe2,0x72], [0x50,0x15,0xff,0x60], [0x59,0x18,0xf4,0x6e],
981	[0x66,0x3b,0xc5,0x44], [0x6f,0x36,0xce,0x4a], [0x74,0x21,0xd3,0x58], [0x7d,0x2c,0xd8,0x56],
982	[0xa1,0x0c,0x7a,0x37], [0xa8,0x01,0x71,0x39], [0xb3,0x16,0x6c,0x2b], [0xba,0x1b,0x67,0x25],
983	[0x85,0x38,0x56,0x0f], [0x8c,0x35,0x5d,0x01], [0x97,0x22,0x40,0x13], [0x9e,0x2f,0x4b,0x1d],
984	[0xe9,0x64,0x22,0x47], [0xe0,0x69,0x29,0x49], [0xfb,0x7e,0x34,0x5b], [0xf2,0x73,0x3f,0x55],
985	[0xcd,0x50,0x0e,0x7f], [0xc4,0x5d,0x05,0x71], [0xdf,0x4a,0x18,0x63], [0xd6,0x47,0x13,0x6d],
986	[0x31,0xdc,0xca,0xd7], [0x38,0xd1,0xc1,0xd9], [0x23,0xc6,0xdc,0xcb], [0x2a,0xcb,0xd7,0xc5],
987	[0x15,0xe8,0xe6,0xef], [0x1c,0xe5,0xed,0xe1], [0x07,0xf2,0xf0,0xf3], [0x0e,0xff,0xfb,0xfd],
988	[0x79,0xb4,0x92,0xa7], [0x70,0xb9,0x99,0xa9], [0x6b,0xae,0x84,0xbb], [0x62,0xa3,0x8f,0xb5],
989	[0x5d,0x80,0xbe,0x9f], [0x54,0x8d,0xb5,0x91], [0x4f,0x9a,0xa8,0x83], [0x46,0x97,0xa3,0x8d]
990);
991
992
993# alg-ref.h
994# define MAXBC				(256/32)
995# define MAXKC				(256/32)
996# define MAXROUNDS			14
997sub MAXBC() { 8 }
998sub MAXKC() { 8 }
999sub MAXROUNDS() { 14 }
1000
1001
1002# alg-ref.c
1003use constant shifts => [
1004   [[0, 0], [1, 3], [2, 2], [3, 1]],
1005   [[0, 0], [1, 5], [2, 4], [3, 3]],
1006   [[0, 0], [1, 7], [3, 5], [4, 4]]
1007];
1008
1009#word8 mul(word8 a, word8 b) {
1010#   /* multiply two elements of GF(2^m)
1011#    * needed for MixColumn and InvMixColumn
1012#    */
1013#	if (a && b) return Alogtable[(Logtable[a] + Logtable[b])%255];
1014#	else return 0;
1015#}
1016sub mul($$) {
1017	$_[0] && $_[1] ? Algotable->[(Logtable->[$_[0]] + Logtable->[$_[1]]) % 255] : 0
1018}
1019
1020#void KeyAddition(word8 a[4][MAXBC], word8 rk[4][MAXBC], word8 BC) {
1021#	/* Exor corresponding text input and round key input bytes
1022#	 */
1023#	int i, j;
1024#
1025#	for(i = 0; i < 4; i++)
1026#   		for(j = 0; j < BC; j++) a[i][j] ^= rk[i][j];
1027#}
1028
1029#sub KeyAddition(@) {
1030#	my @a = @_[0..3];
1031#	my $rk = $_[4];
1032#	my $BC = $_[5];
1033#	my $i;
1034#	for $i (0..3) {
1035#		for my $j (0 .. $BC-1) {
1036#			$a[$i][$j] ^= $rk->[$i][$j]
1037#		}
1038#	}
1039#	@_[0..3] = @a; # return by reference
1040#}
1041
1042
1043
1044
1045
1046sub KeyAddition {
1047  for my $j (0..($_[5]-1)) {
1048    $_[0][$j] ^= $_[4][0][$j];
1049    $_[1][$j] ^= $_[4][1][$j];
1050    $_[2][$j] ^= $_[4][2][$j];
1051    $_[3][$j] ^= $_[4][3][$j];
1052
1053  }
1054}
1055
1056#void ShiftRow(word8 a[4][MAXBC], word8 d, word8 BC) {
1057#	/* Row 0 remains unchanged
1058#	 * The other three rows are shifted a variable amount
1059#	 */
1060#	word8 tmp[MAXBC];
1061#	int i, j;
1062#
1063#	for(i = 1; i < 4; i++) {
1064#		for(j = 0; j < BC; j++) tmp[j] = a[i][(j + shifts[SC][i][d]) % BC];
1065#		for(j = 0; j < BC; j++) a[i][j] = tmp[j];
1066#	}
1067#}
1068
1069#sub ShiftRow(@) {
1070#	my @a = @_[0..3];
1071#	my ($d,$BC) = @_[4,5];
1072#	my @tmp;
1073#	my $i;
1074#	# define SC	((BC - 4) >> 1)
1075#	my $SC = ($BC-4)>>1;
1076#	for $i (1..3) {
1077#		my $j;
1078#		for $j (0..$BC-1) { $tmp[$j] = $a[$i][($j + shifts->[$SC][$i][$d]) % $BC]	}
1079#		for $j (0..$BC-1) { $a[$i][$j] = $tmp[$j] }
1080#	}
1081#	@_[0..3] = @a; # return by reference
1082#}
1083
1084sub ShiftRow(@) {
1085	my @tmp;
1086	for my $i (1..3) {
1087		my $j;
1088		for $j (0..$_[5]-1) { $tmp[$j] = $_[$i][($j + shifts->[($_[5]-4)>>1][$i][$_[4]]) % $_[5]]	}
1089		for $j (0..$_[5]-1) { $_[$i][$j] = $tmp[$j] }
1090	}
1091}
1092
1093#void Substitution(word8 a[4][MAXBC], word8 box[256], word8 BC) {
1094#	/* Replace every byte of the input by the byte at that place
1095#	 * in the nonlinear S-box
1096#	 */
1097#	int i, j;
1098#
1099#	for(i = 0; i < 4; i++)
1100#		for(j = 0; j < BC; j++) a[i][j] = box[a[i][j]] ;
1101#}
1102
1103sub Substitution (@) {
1104	die "Substitution" unless @_ == 261;
1105	my @a = @_[0..3];
1106	my @box = @_[4..259];
1107	my $BC = $_[260];
1108	my $i;
1109	for $i (0..3) {
1110		my $j;
1111		for $j (0..$BC-1) { $a[$i][$j] = $box[$a[$i][$j]] }
1112	}
1113	@_[0..3] = @a; # return by reference
1114}
1115
1116#void MixColumn(word8 a[4][MAXBC], word8 BC) {
1117#        /* Mix the four bytes of every column in a linear way
1118#	 */
1119#	word8 b[4][MAXBC];
1120#	int i, j;
1121#
1122#	for(j = 0; j < BC; j++)
1123#		for(i = 0; i < 4; i++)
1124#			b[i][j] = mul(2,a[i][j])
1125#				^ mul(3,a[(i + 1) % 4][j])
1126#				^ a[(i + 2) % 4][j]
1127#				^ a[(i + 3) % 4][j];
1128#	for(i = 0; i < 4; i++)
1129#		for(j = 0; j < BC; j++) a[i][j] = b[i][j];
1130#}
1131
1132sub MixColumn (@) {
1133	my @a = @_[0..3];
1134	my $BC = $_[4];
1135	my @b;
1136	my ($j,$i);
1137	for $j (0..$BC-1) {
1138		for $i (0..3) {
1139			$b[$i][$j] = mul(2,$a[$i][$j])
1140				   ^ mul(3,$a[($i+1) % 4][$j])
1141				   ^ $a[($i+2) % 4][$j]
1142				   ^ $a[($i+3) % 4][$j]
1143		}
1144	}
1145	for $i (0..3) {
1146		for $j (0..$BC-1) {
1147			$a[$i][$j] = $b[$i][$j];
1148		}
1149	}
1150	@_[0..3] = @a; # return by reference
1151}
1152
1153#void InvMixColumn(word8 a[4][MAXBC], word8 BC) {
1154#        /* Mix the four bytes of every column in a linear way
1155#	 * This is the opposite operation of Mixcolumn
1156#	 */
1157#	word8 b[4][MAXBC];
1158#	int i, j;
1159#
1160#	for(j = 0; j < BC; j++)
1161#	for(i = 0; i < 4; i++)
1162#		b[i][j] = mul(0xe,a[i][j])
1163#			^ mul(0xb,a[(i + 1) % 4][j])
1164#			^ mul(0xd,a[(i + 2) % 4][j])
1165#			^ mul(0x9,a[(i + 3) % 4][j]);
1166#	for(i = 0; i < 4; i++)
1167#		for(j = 0; j < BC; j++) a[i][j] = b[i][j];
1168#}
1169
1170sub InvMixColumn (@) {
1171	my @a = @_[0..3];
1172	my $BC = $_[4];
1173	my @b;
1174	my ($i,$j);
1175	for $j (0..$BC-1) {
1176		for $i (0..3) {
1177			$b[$i][$j] = mul(0xe,$a[$i][$j])
1178				   ^ mul(0xb,$a[($i+1) % 4][$j])
1179				   ^ mul(0xd,$a[($i+2) % 4][$j])
1180				   ^ mul(0x9,$a[($i+3) % 4][$j])
1181		}
1182	}
1183	for $i (0..3) {
1184		for $j (0..$BC-1) {
1185			$a[$i][$j] = $b[$i][$j];
1186		}
1187	}
1188	@_[0..3] = @a; # return by reference
1189}
1190
1191#int rijndaelKeySched (word8 k[4][MAXKC], int keyBits, int blockBits, word8 W[MAXROUNDS+1][4][MAXBC]) {
1192#	/* Calculate the necessary round keys
1193#	 * The number of calculations depends on keyBits and blockBits
1194#	 */
1195#	int KC, BC, ROUNDS;
1196#	int i, j, t, rconpointer = 0;
1197#	word8 tk[4][MAXKC];
1198
1199sub rijndaelKeySched (@) {
1200	my @k = @_[0..3];
1201	my $keyBits = $_[4];
1202	my $blockBits = $_[5];
1203	# my @W = @_[6..$#_]; # the rest
1204	my $W = $_[6];
1205
1206	my @tk;
1207	my $rconpointer = 0;
1208
1209#
1210#	switch (keyBits) {
1211#	case 128: KC = 4; break;
1212#	case 192: KC = 6; break;
1213#	case 256: KC = 8; break;
1214#	default : return (-1);
1215#	}
1216#
1217#	switch (blockBits) {
1218#	case 128: BC = 4; break;
1219#	case 192: BC = 6; break;
1220#	case 256: BC = 8; break;
1221#	default : return (-2);
1222#	}
1223#
1224#	switch (keyBits >= blockBits ? keyBits : blockBits) {
1225#	case 128: ROUNDS = 10; break;
1226#	case 192: ROUNDS = 12; break;
1227#	case 256: ROUNDS = 14; break;
1228#	default : return (-3); /* this cannot happen */
1229#	}
1230
1231	my $KC = $keyBits == 128 ? 4 : $keyBits == 192 ? 6 : $keyBits == 256 ? 8 : return -1;
1232
1233	my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
1234
1235	my $ROUNDS;
1236	{ my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
1237	  $ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
1238	}
1239
1240#
1241#
1242#	for(j = 0; j < KC; j++)
1243#		for(i = 0; i < 4; i++)
1244#			tk[i][j] = k[i][j];
1245#	t = 0;
1246#	/* copy values into round key array */
1247#	for(j = 0; (j < KC) && (t < (ROUNDS+1)*BC); j++, t++)
1248#		for(i = 0; i < 4; i++) W[t / BC][i][t % BC] = tk[i][j];
1249#
1250
1251	my ($j,$i);
1252	for $j (0..$KC-1) {
1253		for $i (0..3) {
1254			$tk[$i][$j] = $k[$i][$j];
1255		}
1256	}
1257
1258	my $t = 0;
1259
1260	for ($j = 0; ($j <$KC) and ($t < ($ROUNDS+1)*$BC); $j++, $t++) {
1261		for $i (0..3) {
1262			$W->[$t/$BC][$i][$t % $BC] = $tk[$i][$j]
1263		}
1264	}
1265
1266#	while (t < (ROUNDS+1)*BC) { /* while not enough round key material calculated */
1267#		/* calculate new values */
1268#		for(i = 0; i < 4; i++)
1269#			tk[i][0] ^= S[tk[(i+1)%4][KC-1]];
1270#		tk[0][0] ^= rcon[rconpointer++];
1271#
1272#		if (KC != 8)
1273#			for(j = 1; j < KC; j++)
1274#				for(i = 0; i < 4; i++) tk[i][j] ^= tk[i][j-1];
1275#		else {
1276#			for(j = 1; j < KC/2; j++)
1277#				for(i = 0; i < 4; i++) tk[i][j] ^= tk[i][j-1];
1278#			for(i = 0; i < 4; i++) tk[i][KC/2] ^= S[tk[i][KC/2 - 1]];
1279#			for(j = KC/2 + 1; j < KC; j++)
1280#				for(i = 0; i < 4; i++) tk[i][j] ^= tk[i][j-1];
1281#		}
1282
1283	while ($t < ($ROUNDS+1)*$BC) {
1284		for $i (0..3) {
1285			$tk[$i][0] ^= $S[$tk[($i+1) % 4][$KC-1]];
1286		}
1287		$tk[0][0] ^= $rcon[$rconpointer++];
1288
1289		if ($KC != 8) {
1290			for $j (1..$KC-1) {
1291				for $i (0..3) {	$tk[$i][$j] ^= $tk[$i][$j-1] }
1292			}
1293		} else {
1294			for ($j = 1; $j < $KC/2; $j++) {
1295				for $i (0..3) {	$tk[$i][$j] ^= $tk[$i][$j-1] }
1296			}
1297			for $i (0..3) { $tk[$i][$KC/2] ^= $S[$tk[$i][$KC/2-1]] }
1298			for ($j = $KC/2+1; $j < $KC; $j++) {
1299				for $i (0..3) { $tk[$i][$j] ^= $tk[$i][$j-1] }
1300			}
1301		}
1302
1303#		/* copy values into round key array */
1304#		for(j = 0; (j < KC) && (t < (ROUNDS+1)*BC); j++, t++)
1305#			for(i = 0; i < 4; i++) W[t / BC][i][t % BC] = tk[i][j];
1306#	}
1307#
1308#	return 0;
1309#}
1310
1311		for ($j=0; ($j<$KC) and ($t < ($ROUNDS+1)*$BC); $j++, $t++) {
1312			for $i (0..3) { $W->[$t/$BC][$i][$t % $BC] = $tk[$i][$j] }
1313		}
1314	}
1315
1316	# @_[6..$#_] = @W; # return by reference
1317	$_[6] = $W;
1318	return 0;
1319}
1320
1321
1322
1323#int rijndaelEncrypt (word8 a[4][MAXBC], int keyBits, int blockBits, word8 rk[MAXROUNDS+1][4][MAXBC])
1324#{
1325#	/* Encryption of one block.
1326#	 */
1327#	int r, BC, ROUNDS;
1328
1329sub rijndaelEncrypt (@) {
1330	my @a = @_[0..3];
1331	my $keyBits = $_[4];
1332	my $blockBits = $_[5];
1333	#my @rk = $_[6..$#_]; # rest
1334	my $rk = $_[6];
1335
1336	my $r;
1337
1338#
1339#	switch (blockBits) {
1340#	case 128: BC = 4; break;
1341#	case 192: BC = 6; break;
1342#	case 256: BC = 8; break;
1343#	default : return (-2);
1344#	}
1345#
1346#	switch (keyBits >= blockBits ? keyBits : blockBits) {
1347#	case 128: ROUNDS = 10; break;
1348#	case 192: ROUNDS = 12; break;
1349#	case 256: ROUNDS = 14; break;
1350#	default : return (-3); /* this cannot happen */
1351#	}
1352
1353	my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
1354
1355	my $ROUNDS;
1356	{ my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
1357	  $ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
1358	}
1359
1360#
1361#	/* begin with a key addition
1362#	 */
1363#	KeyAddition(a,rk[0],BC);
1364
1365	KeyAddition(@a,$rk->[0],$BC);
1366
1367#
1368#       /* ROUNDS-1 ordinary rounds
1369#	 */
1370#	for(r = 1; r < ROUNDS; r++) {
1371#		Substitution(a,S,BC);
1372#		ShiftRow(a,0,BC);
1373#		MixColumn(a,BC);
1374#		KeyAddition(a,rk[r],BC);
1375#	}
1376
1377	for $r (1..$ROUNDS-1) {
1378		Substitution(@a,@S,$BC);
1379		ShiftRow(@a,0,$BC);
1380		MixColumn(@a,$BC);
1381		KeyAddition(@a,$rk->[$r],$BC);
1382	}
1383
1384#
1385#	/* Last round is special: there is no MixColumn
1386#	 */
1387#	Substitution(a,S,BC);
1388#	ShiftRow(a,0,BC);
1389#	KeyAddition(a,rk[ROUNDS],BC);
1390#
1391#	return 0;
1392#}
1393
1394	Substitution(@a,@S,$BC);
1395	ShiftRow(@a,0,$BC);
1396	KeyAddition(@a,$rk->[$ROUNDS],$BC);
1397
1398	@_[0..3] = @a;
1399
1400	return 0;
1401}
1402
1403
1404
1405#int rijndaelEncryptRound (word8 a[4][MAXBC], int keyBits, int blockBits,
1406#		word8 rk[MAXROUNDS+1][4][MAXBC], int rounds)
1407#/* Encrypt only a certain number of rounds.
1408# * Only used in the Intermediate Value Known Answer Test.
1409# */
1410#{
1411#	int r, BC, ROUNDS;
1412
1413sub rijndaelEncryptRound (@) {
1414	my $rounds = pop; # last element
1415
1416	my @a = @_[0..3];
1417	my $keyBits = $_[4];
1418	my $blockBits = $_[5];
1419	# my @rk = $_[6..$#_]; # rest
1420	my $rk = $_[6];
1421
1422	my $r;
1423
1424#
1425#	switch (blockBits) {
1426#	case 128: BC = 4; break;
1427#	case 192: BC = 6; break;
1428#	case 256: BC = 8; break;
1429#	default : return (-2);
1430#	}
1431#
1432#	switch (keyBits >= blockBits ? keyBits : blockBits) {
1433#	case 128: ROUNDS = 10; break;
1434#	case 192: ROUNDS = 12; break;
1435#	case 256: ROUNDS = 14; break;
1436#	default : return (-3); /* this cannot happen */
1437#	}
1438
1439	my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
1440
1441	my $ROUNDS;
1442	{ my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
1443	  $ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
1444	}
1445
1446
1447#
1448#	/* make number of rounds sane */
1449#	if (rounds > ROUNDS) rounds = ROUNDS;
1450
1451	$rounds = $ROUNDS if $rounds > $ROUNDS;
1452
1453#
1454#	/* begin with a key addition
1455#	 */
1456#	KeyAddition(a,rk[0],BC);
1457
1458	KeyAddition(@a,$rk->[0],$BC);
1459
1460#
1461#	/* at most ROUNDS-1 ordinary rounds
1462#	 */
1463#	for(r = 1; (r <= rounds) && (r < ROUNDS); r++) {
1464#		Substitution(a,S,BC);
1465#		ShiftRow(a,0,BC);
1466#		MixColumn(a,BC);
1467#		KeyAddition(a,rk[r],BC);
1468#	}
1469	for ($r = 1; $r <= $rounds and $r < $ROUNDS; $r++) {
1470		Substitution(@a,@S,$BC);
1471		ShiftRow(@a,0,$BC);
1472		MixColumn(@a,$BC);
1473		KeyAddition(@a,$rk->[$r],$BC);
1474	}
1475#
1476#	/* if necessary, do the last, special, round:
1477#	 */
1478#	if (rounds == ROUNDS) {
1479#		Substitution(a,S,BC);
1480#		ShiftRow(a,0,BC);
1481#		KeyAddition(a,rk[ROUNDS],BC);
1482#	}
1483
1484	if ($rounds == $ROUNDS) {
1485		Substitution(@a,@S,$BC);
1486		ShiftRow(@a,0,$BC);
1487		KeyAddition(@a,$rk->[$ROUNDS],$BC);
1488	}
1489
1490#
1491#	return 0;
1492
1493	@_[0..3] = @a;
1494
1495	return 0;
1496#}
1497
1498}
1499
1500
1501
1502
1503#int rijndaelDecrypt (word8 a[4][MAXBC], int keyBits, int blockBits, word8 rk[MAXROUNDS+1][4][MAXBC])
1504#{
1505#	int r, BC, ROUNDS;
1506
1507sub rijndaelDecrypt (@) {
1508
1509	my @a = @_[0..3];
1510	my $keyBits = $_[4];
1511	my $blockBits = $_[5];
1512	my $rk = $_[6];
1513
1514	my $r;
1515
1516#
1517#	switch (blockBits) {
1518#	case 128: BC = 4; break;
1519#	case 192: BC = 6; break;
1520#	case 256: BC = 8; break;
1521#	default : return (-2);
1522#	}
1523#
1524#	switch (keyBits >= blockBits ? keyBits : blockBits) {
1525#	case 128: ROUNDS = 10; break;
1526#	case 192: ROUNDS = 12; break;
1527#	case 256: ROUNDS = 14; break;
1528#	default : return (-3); /* this cannot happen */
1529#	}
1530
1531	my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
1532
1533	my $ROUNDS;
1534	{
1535		my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
1536		$ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
1537	}
1538
1539#
1540#	/* To decrypt: apply the inverse operations of the encrypt routine,
1541#	 *             in opposite order
1542#	 *
1543#	 * (KeyAddition is an involution: it 's equal to its inverse)
1544#	 * (the inverse of Substitution with table S is Substitution with the inverse table of S)
1545#	 * (the inverse of Shiftrow is Shiftrow over a suitable distance)
1546#	 */
1547#
1548#       /* First the special round:
1549#	 *   without InvMixColumn
1550#	 *   with extra KeyAddition
1551#	 */
1552#	KeyAddition(a,rk[ROUNDS],BC);
1553#	Substitution(a,Si,BC);
1554#	ShiftRow(a,1,BC);
1555
1556	KeyAddition(@a,$rk->[$ROUNDS],$BC);
1557	Substitution(@a,@Si,$BC);
1558	ShiftRow(@a,1,$BC);
1559
1560#
1561#	/* ROUNDS-1 ordinary rounds
1562#	 */
1563#	for(r = ROUNDS-1; r > 0; r--) {
1564#		KeyAddition(a,rk[r],BC);
1565#		InvMixColumn(a,BC);
1566#		Substitution(a,Si,BC);
1567#		ShiftRow(a,1,BC);
1568#	}
1569
1570	for ($r = $ROUNDS-1; $r > 0; $r--) {
1571		KeyAddition(@a,$rk->[$r],$BC);
1572		InvMixColumn(@a,$BC);
1573		Substitution(@a,@Si,$BC);
1574		ShiftRow(@a,1,$BC);
1575	}
1576#
1577#	/* End with the extra key addition
1578#	 */
1579#
1580#	KeyAddition(a,rk[0],BC);
1581
1582	KeyAddition(@a,$rk->[0],$BC);
1583
1584#
1585#	return 0;
1586#}
1587
1588	@_[0..3] = @a;
1589
1590	return 0;
1591}
1592
1593
1594#int rijndaelDecryptRound (word8 a[4][MAXBC], int keyBits, int blockBits,
1595#	word8 rk[MAXROUNDS+1][4][MAXBC], int rounds)
1596#/* Decrypt only a certain number of rounds.
1597# * Only used in the Intermediate Value Known Answer Test.
1598# * Operations rearranged such that the intermediate values
1599# * of decryption correspond with the intermediate values
1600# * of encryption.
1601# */
1602#{
1603#	int r, BC, ROUNDS;
1604
1605sub rijndaelDecryptRound (@) {
1606
1607	my @a = @_[0..3];
1608	my $keyBits = $_[4];
1609	my $blockBits = $_[5];
1610	my $rk = $_[6];
1611	my $rounds = $_[7];
1612
1613	my $r;
1614
1615#
1616#	switch (blockBits) {
1617#	case 128: BC = 4; break;
1618#	case 192: BC = 6; break;
1619#	case 256: BC = 8; break;
1620#	default : return (-2);
1621#	}
1622#
1623#	switch (keyBits >= blockBits ? keyBits : blockBits) {
1624#	case 128: ROUNDS = 10; break;
1625#	case 192: ROUNDS = 12; break;
1626#	case 256: ROUNDS = 14; break;
1627#	default : return (-3); /* this cannot happen */
1628#	}
1629#
1630
1631	my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
1632
1633	my $ROUNDS;
1634	{
1635		my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
1636		$ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
1637	}
1638
1639
1640
1641#
1642#	/* make number of rounds sane */
1643#	if (rounds > ROUNDS) rounds = ROUNDS;
1644
1645	$rounds = $ROUNDS if $rounds > $ROUNDS;
1646
1647#
1648#       /* First the special round:
1649#	 *   without InvMixColumn
1650#	 *   with extra KeyAddition
1651#	 */
1652#	KeyAddition(a,rk[ROUNDS],BC);
1653#	Substitution(a,Si,BC);
1654#	ShiftRow(a,1,BC);
1655
1656	KeyAddition(@a,$rk->[$ROUNDS],$BC);
1657	Substitution(@a,@Si,$BC);
1658	ShiftRow(@a,1,$BC);
1659
1660
1661#
1662#	/* ROUNDS-1 ordinary rounds
1663#	 */
1664#	for(r = ROUNDS-1; r > rounds; r--) {
1665#		KeyAddition(a,rk[r],BC);
1666#		InvMixColumn(a,BC);
1667#		Substitution(a,Si,BC);
1668#		ShiftRow(a,1,BC);
1669#	}
1670
1671	for ($r = $ROUNDS-1; $r > $rounds; $r--) {
1672		KeyAddition(@a,$rk->[$r],$BC);
1673		InvMixColumn(@a,$BC);
1674		Substitution(@a,@Si,$BC);
1675		ShiftRow(@a,1,$BC);
1676	}
1677
1678
1679#
1680#	if (rounds == 0) {
1681#		/* End with the extra key addition
1682#		 */
1683#		KeyAddition(a,rk[0],BC);
1684#	}
1685
1686	if ($rounds == 0) {
1687		KeyAddition(@a,$rk->[0],$BC);
1688	}
1689
1690#
1691#	return 0;
1692#}
1693
1694	@_[0..3] = @a;
1695
1696	return 0
1697}
1698
1699
1700
1701
1702
1703##################################
1704# api-ref.c
1705
1706# define     DIR_ENCRYPT     0    /*  Are we encrpyting?  */
1707sub DIR_ENCRYPT() { 0 }
1708# define     DIR_DECRYPT     1    /*  Are we decrpyting?  */
1709sub DIR_DECRYPT() { 1 }
1710# define     MODE_ECB        1    /*  Are we ciphering in ECB mode?   */
1711sub MODE_ECB() { 1 }
1712# define     MODE_CBC        2    /*  Are we ciphering in CBC mode?   */
1713sub MODE_CBC() { 2 }
1714# define     MODE_CFB1       3    /*  Are we ciphering in 1-bit CFB mode? */
1715sub MODE_CFB1() { 3 }
1716# define     TRUE            1
1717sub TRUE() { 1 }
1718# define     FALSE           0
1719sub FALSE() { 0 }
1720# define	BITSPERBLOCK		128		/* Default number of bits in a cipher block */
1721sub BITSPERBLOCK() { 128 }
1722
1723# /*  Error Codes - CHANGE POSSIBLE: inclusion of additional error codes  */
1724#define     BAD_KEY_DIR        -1  /*  Key direction is invalid, e.g., unknown value */
1725#define     BAD_KEY_MAT        -2  /*  Key material not of correct length */
1726#define     BAD_KEY_INSTANCE   -3  /*  Key passed is not valid  */
1727#define     BAD_CIPHER_MODE    -4  /*  Params struct passed to cipherInit invalid */
1728#define     BAD_CIPHER_STATE   -5  /*  Cipher in wrong state (e.g., not initialized) */
1729#define     BAD_CIPHER_INSTANCE   -7
1730
1731# /*  CHANGE POSSIBLE:  inclusion of algorithm specific defines  */
1732#define     MAX_KEY_SIZE	64  /* # of ASCII char's needed to represent a key */
1733sub MAX_KEY_SIZE() { 64 }
1734#define     MAX_IV_SIZE		BITSPERBLOCK/8  /* # bytes needed to represent an IV  */
1735sub MAX_IV_SIZE() { BITSPERBLOCK/8 }
1736
1737
1738
1739#int makeKey(keyInstance *key, BYTE direction, int keyLen, char *keyMaterial)
1740#{
1741#	word8 k[4][MAXKC];
1742#	int i, j, t;
1743
1744sub makeKey($$$$) {
1745
1746	my ($key, $direction, $keyLen, $keyMaterial) = @_;
1747
1748	#$keyLen = length $keyMaterial; # hey, it's perl :-)
1749
1750	my @k;
1751
1752#
1753#	if (key == NULL) {
1754#		return BAD_KEY_INSTANCE;
1755#	}
1756
1757	unless ( defined $key and ref $key eq 'HASH') {
1758		die "BAD_KEY_INSTANCE";
1759	}
1760
1761#
1762#	if ((direction == DIR_ENCRYPT) || (direction == DIR_DECRYPT)) {
1763#		key->direction = direction;
1764#	} else {
1765#		return BAD_KEY_DIR;
1766#	}
1767
1768	if ($direction == DIR_ENCRYPT or $direction == DIR_DECRYPT) {
1769		$key->{direction} = $direction
1770	} else {
1771		die "BAD_KEY_DIR";
1772	}
1773
1774#
1775#	if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256)) {
1776#		key->keyLen = keyLen;
1777#	} else {
1778#		return BAD_KEY_MAT;
1779#	}
1780
1781	if ($keyLen == 128 or $keyLen == 192 or $keyLen == 256) {
1782		$key->{keyLen} = $keyLen
1783	} else {
1784		die "BAD_KEY_MAT";
1785	}
1786
1787#
1788#	if ( keyMaterial ) {
1789#		strncpy(key->keyMaterial, keyMaterial, keyLen/4);
1790#	}
1791
1792	if (defined $keyMaterial) {
1793		$key->{keyMaterial} = substr ($keyMaterial,0,$keyLen/4)
1794	}
1795
1796#
1797#	/* initialize key schedule: */
1798#	for(i = 0; i < key->keyLen/8; i++) {
1799#		t = key->keyMaterial[2*i];
1800#		if ((t >= '0') && (t <= '9')) j = (t - '0') << 4;
1801#		else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4;
1802#		else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4;
1803#		else return BAD_KEY_MAT;
1804#
1805#		t = key->keyMaterial[2*i+1];
1806#		if ((t >= '0') && (t <= '9')) j ^= (t - '0');
1807#		else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10);
1808#		else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10);
1809#		else return BAD_KEY_MAT;
1810#
1811#		k[i % 4][i / 4] = (word8) j;
1812#	}
1813
1814	my $i;
1815	my @keyMaterial = unpack 'A2'x(length($key->{keyMaterial})/2), $key->{keyMaterial};
1816	for $i (0..$keyLen/8-1) {
1817		$k[$i % 4][$i / 4] = hex $keyMaterial[$i];
1818	}
1819#
1820#	rijndaelKeySched (k, key->keyLen, key->blockLen, key->keySched);
1821
1822	#my @W;
1823	#rijndaelKeySched(@k, $key->{keyLen}, $key->{blockLen}, @W);
1824
1825	rijndaelKeySched(@k, $key->{keyLen}, $key->{blockLen}, $key->{keySched});
1826
1827
1828#	$key->{keySched} = \@W;
1829
1830#
1831#	return TRUE;
1832#}
1833	$_[0] = $key;
1834
1835	return TRUE;
1836}
1837
1838
1839
1840#int cipherInit(cipherInstance *cipher, BYTE mode, char *IV)
1841#{
1842#	int i, j, t;
1843
1844sub cipherInit($$;$) {
1845
1846	my ($cipher, $mode, $IV) = @_;
1847
1848	my $i;
1849
1850#
1851#	if ((mode == MODE_ECB) || (mode == MODE_CBC) || (mode == MODE_CFB1)) {
1852#		cipher->mode = mode;
1853#	} else {
1854#		return BAD_CIPHER_MODE;
1855#	}
1856
1857	if ($mode == MODE_ECB or $mode == MODE_CBC or $mode == MODE_CFB1) {
1858		$cipher->{mode} = $mode
1859	} else {
1860		die "BAD_CIPHER_MODE";
1861	}
1862
1863#
1864#	if (IV != NULL) {
1865#		for(i = 0; i < cipher->blockLen/8; i++) {
1866#			t = IV[2*i];
1867#			if ((t >= '0') && (t <= '9')) j = (t - '0') << 4;
1868#			else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4;
1869#			else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4;
1870#			else return BAD_CIPHER_INSTANCE;
1871#
1872#			t = IV[2*i+1];
1873#			if ((t >= '0') && (t <= '9')) j ^= (t - '0');
1874#			else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10);
1875#			else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10);
1876#			else return BAD_CIPHER_INSTANCE;
1877#
1878#			cipher->IV[i] = (BYTE) j;
1879#		}
1880#	}
1881
1882	if (defined $IV) {
1883		# my @block = unpack 'C'x(length $IV), $IV;
1884		# for $i (0..$cipher->{blockLen}/8-1) {
1885		#	$cipher->{IV}[$i] = $block[$i];
1886		# }
1887		$cipher->{IV} = [ unpack 'C'x(length $IV), $IV ]
1888	}
1889
1890#
1891#	return TRUE;
1892#}
1893
1894	$_[0] = $cipher;
1895	return TRUE;
1896}
1897
1898
1899
1900
1901#int blockEncrypt(cipherInstance *cipher,
1902#	keyInstance *key, BYTE *input, int inputLen, BYTE *outBuffer)
1903#{
1904#	int i, j, t, numBlocks;
1905#	word8 block[4][MAXBC];
1906
1907sub blockEncrypt($$$$$) {
1908
1909	my ($cipher, $key, $input, $inputLen, $outBuffer) = @_;
1910
1911	my ($i,$j,$t,$numBlocks,@block);
1912
1913#
1914#
1915#        /* check parameter consistency: */
1916#       if (key == NULL ||
1917#                key->direction != DIR_ENCRYPT ||
1918#                (key->keyLen != 128 && key->keyLen != 192 && key->keyLen != 256)) {
1919#                return BAD_KEY_MAT;
1920#        }
1921
1922	if (not defined $key or $key->{direction} != DIR_ENCRYPT or
1923	    ($key->{keyLen} != 128 and $key->{keyLen} != 192 and $key->{keyLen} != 256)) {
1924		die "BAD_KEY_MAT"
1925	}
1926
1927#        if (cipher == NULL ||
1928#                (cipher->mode != MODE_ECB && cipher->mode != MODE_CBC && cipher->mode != MODE_CFB1) ||
1929#                (cipher->blockLen != 128 && cipher->blockLen != 192 && cipher->blockLen != 256)) {
1930#                return BAD_CIPHER_STATE;
1931#        }
1932
1933	if (not defined $cipher or ($cipher->{mode} != MODE_ECB and $cipher->{mode} != MODE_CBC and $cipher->{mode} != MODE_CFB1) or
1934	    ($cipher->{blockLen} != 128 and $cipher->{blockLen} != 192 and $cipher->{blockLen} != 256)) {
1935		die "BAD_CIPHER_STATE";
1936	}
1937
1938#
1939#
1940#	numBlocks = inputLen/cipher->blockLen;
1941
1942	$numBlocks = $inputLen/$cipher->{blockLen};
1943
1944#
1945#	switch (cipher->mode) {
1946#	case MODE_ECB:
1947#		for (i = 0; i < numBlocks; i++) {
1948#			for (j = 0; j < cipher->blockLen/32; j++) {
1949#				for(t = 0; t < 4; t++)
1950#				/* parse input stream into rectangular array */
1951#					block[t][j] = input[4*j+t] & 0xFF;
1952#			}
1953#			rijndaelEncrypt (block, key->keyLen, cipher->blockLen, key->keySched);
1954#			for (j = 0; j < cipher->blockLen/32; j++) {
1955#				/* parse rectangular array into output ciphertext bytes */
1956#				for(t = 0; t < 4; t++)
1957#					outBuffer[4*j+t] = (BYTE) block[t][j];
1958#			}
1959#		}
1960#		break;
1961
1962	if ($cipher->{mode} == MODE_ECB) {
1963		for $i (0..$numBlocks-1) {
1964			for $j (0..$cipher->{blockLen}/32-1) {
1965				for $t (0..3) {
1966					$block[$t][$j] = $input->[4*$j+$t] & 0xFF;
1967				}
1968			}
1969			rijndaelEncrypt(@block, $key->{keyLen}, $cipher->{blockLen}, $key->{keySched});
1970			for $j (0..$cipher->{blockLen}/32-1) {
1971				for $t (0..3) {
1972					$outBuffer->[4*$j+$t] = $block[$t][$j];
1973				}
1974			}
1975		}
1976	}
1977
1978#
1979#	case MODE_CBC:
1980#		for (j = 0; j < cipher->blockLen/32; j++) {
1981#			for(t = 0; t < 4; t++)
1982#			/* parse initial value into rectangular array */
1983#					block[t][j] = cipher->IV[t+4*j] & 0xFF;
1984#			}
1985#		for (i = 0; i < numBlocks; i++) {
1986#			for (j = 0; j < cipher->blockLen/32; j++) {
1987#				for(t = 0; t < 4; t++)
1988#				/* parse input stream into rectangular array and exor with
1989#				   IV or the previous ciphertext */
1990#					block[t][j] ^= input[4*j+t] & 0xFF;
1991#			}
1992#			rijndaelEncrypt (block, key->keyLen, cipher->blockLen, key->keySched);
1993#			for (j = 0; j < cipher->blockLen/32; j++) {
1994#				/* parse rectangular array into output ciphertext bytes */
1995#				for(t = 0; t < 4; t++)
1996#					outBuffer[4*j+t] = (BYTE) block[t][j];
1997#			}
1998#		}
1999#		break;
2000
2001	elsif ($cipher->{mode} == MODE_CBC) {
2002		for $j (0..$cipher->{blockLen}/32-1) {
2003			for $t (0..3) {
2004				$block[$t][$j] = $cipher->{IV}[$t+4*$j] & 0xFF
2005			}
2006		}
2007		for $i (0..$numBlocks-1) {
2008			for $j (0..$cipher->{blockLen}/32-1) {
2009				for $t (0..3) {
2010					$block[$t][$j] ^= $input->[4*$j+$t] & 0xFF;
2011				}
2012			}
2013			rijndaelEncrypt(@block,$key->{keyLen},$cipher->{blockLen}, $key->{keySched});
2014			for $j (0..$cipher->{blockLen}/32-1) {
2015				for $t (0..3) {
2016					$outBuffer->[4*$j+$t] = $block[$t][$j];
2017				}
2018			}
2019		}
2020	}
2021
2022#
2023#	default: return BAD_CIPHER_STATE;
2024#	}
2025
2026	else { die "BAD_CIPHER_STATE" }
2027
2028#
2029#	return numBlocks*cipher->blockLen;
2030#}
2031	# @_ = ($cipher, $key, $input, $inputLen, $outBuffer);
2032	$_[4] = $outBuffer;
2033
2034	return $numBlocks * $cipher->{blockLen};
2035}
2036
2037
2038
2039
2040#int blockDecrypt(cipherInstance *cipher,
2041#	keyInstance *key, BYTE *input, int inputLen, BYTE *outBuffer)
2042#{
2043#	int i, j, t, numBlocks;
2044#	word8 block[4][MAXBC];
2045
2046sub blockDecrypt($$$$$) {
2047
2048	my ($cipher, $key, $input, $inputLen, $outBuffer) = @_;
2049
2050	my ($i,$j,$t,$numBlocks,@block);
2051
2052#
2053#	if (cipher == NULL ||
2054#		key == NULL ||
2055#		key->direction == DIR_ENCRYPT ||
2056#		cipher->blockLen != key->blockLen) {
2057#		return BAD_CIPHER_STATE;
2058#	}
2059
2060	if (not defined $cipher or not defined $key or $key->{direction} == DIR_ENCRYPT or $cipher->{blockLen} != $key->{blockLen}) {
2061		die "BAD_CIPHER_STATE";
2062	}
2063
2064
2065#
2066#       /* check parameter consistency: */
2067#        if (key == NULL ||
2068#                key->direction != DIR_DECRYPT ||
2069#                (key->keyLen != 128 && key->keyLen != 192 && key->keyLen != 256)) {
2070#                return BAD_KEY_MAT;
2071#        }
2072
2073	if (not defined $key or $key->{direction} != DIR_DECRYPT or
2074		($key->{keyLen} != 128 and $key->{keyLen} != 192 and $key->{keyLen} != 256)) {
2075			die "BAD_KEY_MAT";
2076	}
2077
2078#        if (cipher == NULL ||
2079#                (cipher->mode != MODE_ECB && cipher->mode != MODE_CBC && cipher->mode != MODE_CFB1) ||
2080#                (cipher->blockLen != 128 && cipher->blockLen != 192 && cipher->blockLen != 256)) {
2081#                return BAD_CIPHER_STATE;
2082#        }
2083
2084	if (not defined $cipher or ($cipher->{mode} != MODE_ECB and $cipher->{mode} != MODE_CBC and $cipher->{mode} != MODE_CFB1) or
2085	    ($cipher->{blockLen} != 128 and $cipher->{blockLen} != 192 and $cipher->{blockLen} != 256)) {
2086		die "BAD_CIPHER_STATE";
2087	}
2088
2089#
2090#
2091#	numBlocks = inputLen/cipher->blockLen;
2092
2093	$numBlocks = $inputLen / $cipher->{blockLen};
2094
2095#
2096#	switch (cipher->mode) {
2097#	case MODE_ECB:
2098#		for (i = 0; i < numBlocks; i++) {
2099#			for (j = 0; j < cipher->blockLen/32; j++) {
2100#				for(t = 0; t < 4; t++)
2101#				/* parse input stream into rectangular array */
2102#					block[t][j] = input[4*j+t] & 0xFF;
2103#			}
2104#			rijndaelDecrypt (block, key->keyLen, cipher->blockLen, key->keySched);
2105#			for (j = 0; j < cipher->blockLen/32; j++) {
2106#				/* parse rectangular array into output ciphertext bytes */
2107#				for(t = 0; t < 4; t++)
2108#					outBuffer[4*j+t] = (BYTE) block[t][j];
2109#			}
2110#		}
2111#		break;
2112
2113	if ($cipher->{mode} == MODE_ECB) {
2114		for $i (0..$numBlocks-1) {
2115			for $j (0..$cipher->{blockLen}/32-1) {
2116				for $t (0..3) {
2117					$block[$t][$j] = $input->[4*$j+$t] & 0xFF;
2118				}
2119			}
2120			rijndaelDecrypt(@block, $key->{keyLen}, $cipher->{blockLen}, $key->{keySched});
2121			for $j (0..$cipher->{blockLen}/32-1) {
2122				for $t (0..3) {
2123					$outBuffer->[4*$j+$t] = $block[$t][$j];
2124				}
2125			}
2126		}
2127	}
2128
2129
2130#
2131#	case MODE_CBC:
2132#		/* first block */
2133#		for (j = 0; j < cipher->blockLen/32; j++) {
2134#			for(t = 0; t < 4; t++)
2135#			/* parse input stream into rectangular array */
2136#				block[t][j] = input[4*j+t] & 0xFF;
2137#		}
2138
2139	elsif ($cipher->{mode} == MODE_CBC) {
2140		for $j (0..$cipher->{blockLen}/32-1) {
2141			for $t (0..3) {
2142				$block[$t][$j] = $input->[$t+4*$j] & 0xFF
2143			}
2144		}
2145
2146
2147#		rijndaelDecrypt (block, key->keyLen, cipher->blockLen, key->keySched);
2148
2149		rijndaelDecrypt(@block, $key->{keyLen}, $cipher->{blockLen}, $key->{keySched});
2150
2151#
2152#		for (j = 0; j < cipher->blockLen/32; j++) {
2153#			/* exor the IV and parse rectangular array into output ciphertext bytes */
2154#			for(t = 0; t < 4; t++)
2155#				outBuffer[4*j+t] = (BYTE) (block[t][j] ^ cipher->IV[t+4*j]);
2156#		}
2157
2158		for $j (0.. $cipher->{blockLen}/32-1) {
2159			for $t (0..3) {
2160				$outBuffer->[4*$j+$t] = $block[$t][$j] ^ $cipher->{IV}[$t+4*$j]
2161			}
2162		}
2163
2164#
2165#		/* next blocks */
2166#		for (i = 1; i < numBlocks; i++) {
2167#			for (j = 0; j < cipher->blockLen/32; j++) {
2168#				for(t = 0; t < 4; t++)
2169#				/* parse input stream into rectangular array */
2170#					block[t][j] = input[cipher->blockLen/8+4*j+t] & 0xFF;
2171#			}
2172#			rijndaelDecrypt (block, key->keyLen, cipher->blockLen, key->keySched);
2173#
2174#			for (j = 0; j < cipher->blockLen/32; j++) {
2175#				/* exor previous ciphertext block and parse rectangular array
2176#				       into output ciphertext bytes */
2177#				for(t = 0; t < 4; t++)
2178#					outBuffer[cipher->blockLen/8+4*j+t] = (BYTE) (block[t][j] ^
2179#						input[4*j+t-4*cipher->blockLen/32]);
2180#			}
2181#		}
2182#		break;
2183
2184		for $i (1..$numBlocks-1) {
2185			for $j (0..$cipher->{blockLen}/32-1) {
2186				for $t (0..3) {
2187					$block[$t][$j] ^= $input->[$cipher->{blockLen}/8+4*$j+$t] & 0xFF;
2188				}
2189			}
2190			rijndaelDecrypt(@block,$key->{keyLen},$cipher->{blockLen}, $key->{keySched});
2191			for $j (0..$cipher->{blockLen}/32-1) {
2192				for $t (0..3) {
2193					$outBuffer->[$cipher->{blockLen}/8+4*$j+$t] =
2194						$block[$t][$j] ^ $input->[4*$j+$t-4*$cipher->{blockLen}/32];
2195				}
2196			}
2197		}
2198	}
2199
2200
2201
2202
2203#
2204#	default: return BAD_CIPHER_STATE;
2205
2206	else { die "BAD_CIPHER_STATE" }
2207
2208#	}
2209#
2210#	return numBlocks*cipher->blockLen;
2211#}
2212
2213	$_[4] = $outBuffer;
2214
2215	return $numBlocks * $cipher->{blockLen};
2216}
2217
2218
2219#/**
2220# *	cipherUpdateRounds:
2221# *
2222# *	Encrypts/Decrypts exactly one full block a specified number of rounds.
2223# *	Only used in the Intermediate Value Known Answer Test.
2224# *
2225# *	Returns:
2226# *		TRUE - on success
2227# *		BAD_CIPHER_STATE - cipher in bad state (e.g., not initialized)
2228# */
2229#int cipherUpdateRounds(cipherInstance *cipher,
2230#	keyInstance *key, BYTE *input, int inputLen, BYTE *outBuffer, int rounds)
2231#{
2232
2233sub cipherUpdateRounds($$$$$$) {
2234
2235	my ($cipher, $key, $input, $inputLen, $outBuffer, $rounds) = @_;
2236
2237#	int j, t;
2238#	word8 block[4][MAXBC];
2239
2240	my ($j,$t,@block);
2241
2242#
2243#	if (cipher == NULL ||
2244#		key == NULL ||
2245#		cipher->blockLen != key->blockLen) {
2246#		return BAD_CIPHER_STATE;
2247#	}
2248
2249	if (not defined $cipher or not defined $key or $key->{direction} == DIR_ENCRYPT or $cipher->{blockLen} != $key->{blockLen}) {
2250		die "BAD_CIPHER_STATE";
2251	}
2252
2253
2254#
2255#	for (j = 0; j < cipher->blockLen/32; j++) {
2256#		for(t = 0; t < 4; t++)
2257#			/* parse input stream into rectangular array */
2258#			block[t][j] = input[4*j+t] & 0xFF;
2259#	}
2260
2261	for $j (0..$cipher->{blockLen}/32-1) {
2262		for $t (0..3) {
2263			$block[$t][$j] = $input->[4*$j+$t] & 0xFF
2264		}
2265	}
2266
2267#	switch (key->direction) {
2268#	case DIR_ENCRYPT:
2269#		rijndaelEncryptRound (block, key->keyLen, cipher->blockLen,
2270#				key->keySched, rounds);
2271#	break;
2272
2273	if ($key->{direction} == DIR_ENCRYPT) {
2274		rijndaelEncryptRound(@block, $key->{keyLen}, $cipher->{blockLen}, $key->{keySched}, $rounds);
2275	}
2276
2277#
2278#	case DIR_DECRYPT:
2279#		rijndaelDecryptRound (block, key->keyLen, cipher->blockLen,
2280#				key->keySched, rounds);
2281#	break;
2282
2283	elsif ($key->{direction} == DIR_DECRYPT) {
2284		rijndaelDecryptRound(@block, $key->{keyLen}, $cipher->{blockLen}, $key->{keySched}, $rounds);
2285	}
2286
2287#
2288#	default: return BAD_KEY_DIR;
2289#	}
2290
2291	else {
2292		die "BAD_KEY_DIR"
2293	}
2294
2295#	for (j = 0; j < cipher->blockLen/32; j++) {
2296#		/* parse rectangular array into output ciphertext bytes */
2297#		for(t = 0; t < 4; t++)
2298#			outBuffer[4*j+t] = (BYTE) block[t][j];
2299#	}
2300
2301	for $j (0..$cipher->{blockLen}/32-1) {
2302		for $t (0..3) {
2303			$outBuffer->[4*$j+$t] = $block[$t][$j];
2304		}
2305	}
2306
2307#
2308#	return TRUE;
2309
2310	return TRUE;
2311
2312#}
2313#
2314
2315}
2316
2317#####################################################################################
2318# my code
2319#####################################################################################
2320#
2321#
2322#
2323#
2324#
2325#
2326#
2327#
2328#
2329#
2330#
2331#
2332#
2333#
2334
2335#
2336# objektinterface
2337#
2338
2339use vars qw'$DEFAULT_BLOCKSIZE $DEFAULT_KEYSIZE';
2340# sub DEFAULT_BLOCKSIZE() { 128 }
2341# sub DEFAULT_KEYSIZE() { 256 }
2342$DEFAULT_BLOCKSIZE = 128;
2343$DEFAULT_KEYSIZE = 256;
2344
2345sub new {
2346	my ($class,$key,$mode) = @_;
2347
2348 	my $blocksize = $DEFAULT_BLOCKSIZE;
2349	my $keysize = $DEFAULT_KEYSIZE;
2350	my $ENkeyInst = { blockLen => $blocksize };
2351	my $DEkeyInst = { blockLen => $blocksize };
2352	$mode = MODE_ECB unless defined $mode;
2353
2354	# compatibility mode for Crypt::Rijndael
2355	$key = join '', unpack 'H*', $key;
2356
2357	if (length($key) * 4 != $keysize) {
2358		warn __PACKAGE__, ": set keysize to ", length($key)*4, ".\n";
2359		$keysize = length($key) * 4;
2360	}
2361
2362	eval { makeKey($ENkeyInst, DIR_ENCRYPT, $keysize, $key) };
2363	die $@ if $@;
2364
2365	eval { makeKey($DEkeyInst, DIR_DECRYPT, $keysize, $key) };
2366	die $@ if $@;
2367
2368	my $cipherInst = { blockLen => $blocksize };
2369	my $IV = "\0" x ($blocksize/8);
2370	eval { cipherInit($cipherInst, $mode, $IV) };
2371	die $@ if $@;
2372
2373	my $self = {
2374		cipherInst => $cipherInst,
2375		ENkeyInst => $ENkeyInst,
2376		DEkeyInst => $DEkeyInst,
2377		IV => $IV,
2378		keysize => $keysize,
2379		blocksize => $blocksize
2380	};
2381
2382	bless $self, ref($class) || $class;
2383}
2384
2385sub encrypt {
2386	my ($self,$data) = @_;
2387	my $out;
2388	for (my $i=0; $i < length($data) / ($self->{blocksize}/8); $i++) {
2389		my $tmp = [];
2390		my @block = unpack 'C'x($self->{blocksize}/8),
2391			substr($data,$i*$self->{blocksize}/8,$self->{blocksize}/8);
2392		eval {
2393			my $res = blockEncrypt($self->{cipherInst}, $self->{ENkeyInst}, \@block, $self->{blocksize}, $tmp);
2394		};
2395		die $@ if $@;
2396		$out .= pack 'C'x($self->{blocksize}/8), @$tmp;
2397	}
2398	return unless defined $out;
2399	$out;
2400}
2401
2402sub decrypt {
2403	my ($self,$data) = @_;
2404	my $out;
2405	for (my $i=0; $i < length($data) / ($self->{blocksize}/8); $i++) {
2406		my $tmp = [];
2407		my @block = unpack 'C'x($self->{blocksize}/8),
2408			substr($data,$i*$self->{blocksize}/8,$self->{blocksize}/8);
2409		eval {
2410			my $res = blockDecrypt($self->{cipherInst}, $self->{DEkeyInst}, \@block, $self->{blocksize}, $tmp);
2411		};
2412		die $@ if $@;
2413		$out .= pack 'C'x($self->{blocksize}/8), @$tmp;
2414	}
2415	return unless defined $out;
2416	$out;
2417}
2418
2419
2420sub rijndael_encrypt($$$;$$) {
2421	my ($key, $mode, $data, $keysize, $blocksize) = @_;
2422
2423	$keysize = 128 unless defined $keysize;
2424	$blocksize = 128 unless defined $blocksize;
2425
2426	my $keyInst = { blockLen => $blocksize };
2427
2428	if (length $key < $keysize/4) {
2429		$key .= "0" x ($keysize/4 - length $key);
2430		warn "rijndael_encrypt: padded key to keysize ($keysize)\n";
2431	} elsif (length $key > $keysize/4) {
2432		$key = substr $key, 0, $keysize/4;
2433		warn "rijndael_encrypt: truncated key to keysize ($keysize)\n";
2434	}
2435
2436	if (length($data) % ($blocksize/8)) {
2437		$data .= "0" x ($blocksize/8 - (length($data) % ($blocksize/8)));
2438		warn "rijndael_encrypt: padded data to multiple of blocksize ($blocksize)\n";
2439	}
2440
2441	my $res;
2442
2443	eval { makeKey($keyInst, DIR_ENCRYPT, $keysize, $key) };
2444	die $@ if $@;
2445
2446	my $cipherInst = { blockLen => $blocksize };
2447
2448	my $IV = "\0" x ($blocksize/8);
2449
2450	eval { cipherInit($cipherInst, $mode, $IV) };
2451	die $@ if $@;
2452
2453	my $out;
2454
2455	my $i;
2456	for ($i=0; $i < length($data) / ($blocksize/8); $i++) {
2457		my $tmp = [];
2458		my @block = unpack 'C'x($blocksize/8), substr($data,$i*$blocksize/8,$blocksize/8);
2459		eval {
2460			my $res = blockEncrypt($cipherInst, $keyInst, \@block, $blocksize, $tmp);
2461		};
2462		die $@ if $@;
2463		$out .= pack 'C'x($blocksize/8), @$tmp;
2464	}
2465
2466	return unless defined $out;
2467	$out;
2468}
2469
2470
2471
2472sub rijndael_decrypt($$$;$$) {
2473	my ($key, $mode, $data, $keysize, $blocksize) = @_;
2474
2475	$keysize = 128 unless defined $keysize;
2476	$blocksize = 128 unless defined $blocksize;
2477
2478	my $keyInst = { blockLen => $blocksize };
2479
2480	if (length $key < ($keysize/4)) {
2481		$key .= "0" x ($keysize/4 - length $key);
2482		warn "rijndael_decrypt: padded key to keysize ($keysize)\n";
2483	} elsif (length $key > $keysize/4) {
2484		$key = substr $key, 0, $keysize/4;
2485		warn "rijndael_decrypt: truncate key to keysize ($keysize)\n";
2486	}
2487
2488	my $res;
2489
2490	eval { makeKey($keyInst, DIR_DECRYPT, $keysize, $key) };
2491	die $@ if $@;
2492
2493	my $cipherInst = { blockLen => $blocksize };
2494
2495	my $IV = "\0" x ($blocksize/8);
2496
2497	eval { cipherInit($cipherInst, $mode, $IV) };
2498	die $@ if $@;
2499
2500	my $out;
2501	my $i;
2502
2503	for ($i=0; $i < length($data) / ($blocksize/8); $i++) {
2504		my $tmp = [];
2505		my @block = unpack 'C'x($blocksize/8), substr($data,$i*$blocksize/8,$blocksize/8);
2506		eval {
2507			blockDecrypt($cipherInst, $keyInst, \@block, $blocksize, $tmp)
2508		};
2509		die $@ if $@;
2510		$out .= pack 'C'x($blocksize/8), @$tmp;
2511	}
2512
2513	return unless defined $out;
2514	$out;
2515}
2516
2517####################################################
2518#
2519# Interface for Crypt::CBC
2520#
2521####################################################
2522
2523# return keysize in bytes
2524sub keysize {
2525	my $self = shift;
2526	if (defined $self and ref $self and defined $self->{keysize}) {
2527		return $self->{keysize}/8
2528	}
2529	return $DEFAULT_KEYSIZE/8
2530}
2531
2532# return blocksize in bytes
2533sub blocksize {
2534	my $self = shift;
2535	if (defined $self and ref $self and defined $self->{blocksize}) {
2536		return $self->{blocksize}/8
2537	}
2538	return $DEFAULT_BLOCKSIZE/8
2539}
2540
25411; # make require happy :-)
2542
2543__END__
2544
2545=head1 NAME
2546
2547Crypt::Rijndael_PP - Perl implementation of Rijndael
2548
2549=head1 DISCLAIMER
2550
2551This is a pure perl implementation of the new AES Rijndael.
2552You want to use C<Crypt::Rijndael> where available. This implementation
2553is really slow, but I am working on it.
2554
2555=head1 SYNOPSIS
2556
2557 # Functional style
2558 use Crypt::Rijndael_PP ':all';
2559
2560 $key = '1234567890ABCDEF' x 4; # 256bit hex number
2561
2562 # keysize = 256bit, blocksize = 128bit
2563 $c_txt = rijndael_encrypt($key, MODE_CBC, $data,  256, 128);
2564 $p_txt = rijndael_decrypt($key, MODE_CBC, $c_txt, 256, 128);
2565
2566
2567 # OO style
2568 # same interface as Crypt::Rijndael
2569 use Crypt::Rijndael_PP;
2570
2571 $cipher = Crypt::Rijndael_PP->new( pack('H*', $key), MODE_CBC );
2572
2573 $c_txt = $cipher->encrypt($data);
2574 $p_txt = $cipher->decrypt($c_txt);
2575
2576=head1 DESCRIPTION
2577
2578This modules shares the OO style interface with C<Crypt::Rijndael>
2579from Rafael R. Sevilla.
2580
2581=over 4
2582
2583=item
2584
2585Supported modes: Electronic CodeBook (MODE_ECB) and Cipher Block Chaining
2586(MODE_CBC). Please use C<Crypt::CBC> for CBC-Mode, as my CBC is not compatible
2587with neither C<Crypt::CBC> nor C<Crypt::Rijndael> and it is subject to change
2588in the near future. When using C<Crypt::CBC> this module is 100% compatible to
2589C<Crypt::Rijndael> and you can decrypt and encrypt your data with both modules!
2590
2591=item
2592
2593Supported keysizes: 128, 192 and 256 (default)
2594
2595=item
2596
2597Supported blocksizes: 128 (default), 192 and 256
2598
2599=back
2600
2601If the size of the key does not match the given
2602keysize then the key is padded with "0" (hex) or
2603truncated to the right size.
2604
2605The last data block is padded with "\0" if it does not match
2606a multiple of the blocksize.
2607
2608Warnings a raised in both cases.
2609
2610=head1 EXAMPLES
2611
2612Using C<Crypt::CBC>
2613
2614 use Crypt::CBC;
2615
2616 my $key = 'my secret key';
2617 my $input = 'The answer is 42.';
2618 my $cipher = new Crypt::CBC($key,'Rijndael_PP');
2619
2620 my $ciphertext = $cipher->encrypt($input);
2621 my $plaintext  = $cipher->decrypt($ciphertext);
2622
2623
2624 # - or -
2625
2626 #!/usr/local/bin/perl -w
2627 #
2628 # Usage: r.pl e "my secret key" < in > out
2629 #
2630 use strict;
2631 use Crypt::CBC;
2632 die "Usage: $0 mode([ed]) key\n" unless @ARGV == 2;
2633 my $cipher = new Crypt::CBC($ARGV[1],'Rijndael_PP');
2634 $cipher->start($ARGV[0]);
2635 my $buffer;
2636 while( read(STDIN, $buffer, 1024) ) {
2637	 print $cipher->crypt($buffer);
2638 }
2639 print $cipher->finish;
2640
2641
2642=head1 LIMITATIONS
2643
2644This implementation is really slow. I'm trying to tweak the
2645performance in coming releases.
2646
2647CBC-Mode is not yet compatible to C<Crypt::Rijndael>. But you are
2648advised to use C<Crypt::CBC> for this mode anyway.
2649
2650=head1 SEE ALSO
2651
2652L<Crypt::Rijndael>
2653
2654L<Crypt::CBC>
2655
2656L<http://csrc.nist.gov/encryption/aes/>
2657
2658=head1 COPYRIGHT
2659
2660This library is free software; you can redistribute it and/or
2661modify it under the same terms as Perl itself.
2662
2663 Copyright 2001 Christian Lackas
2664 Copyright 2000 Vincent Rijmen and Joan Daemen
2665
2666=head1 AUTHORS
2667
2668The original algorithm was developed by Vincent Rijmen and Joan Daemen.
2669
2670This release was made by Christian Lackas <delta@lackas.net>.
2671http://www.lackas.net/. It is based on the reference implementation
2672for the AES contest. At present I am working on a faster version.
2673
2674=cut
2675