File Coverage

blib/lib/Crypt/Rijndael_PP.pm
Criterion Covered Total %
statement 320 421 76.0
branch 89 182 48.9
condition 55 123 44.7
subroutine 26 31 83.8
pod 0 23 0.0
total 490 780 62.8


line stmt bran cond sub pod time code
1             #!/usr/bin/perl -w
2             # $Id: Rijndael_PP.pm,v 1.21 2010/09/22 13:31:36 lackas Exp $
3             package Crypt::Rijndael_PP;
4              
5             require 5.004;
6 5     5   11372 use strict;
  5         9  
  5         156  
7 5     5   4756 use integer;
  5         48  
  5         23  
8 5     5   160 use Carp;
  5         9  
  5         557  
9              
10 5     5   26 use vars qw'$VERSION @EXPORT @EXPORT_OK %EXPORT_TAGS @ISA';
  5         9  
  5         1488  
11             require 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
31 5         1382 use constant Logtable => [
32             0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3,
33             100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193,
34             125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120,
35             101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142,
36             150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56,
37             102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16,
38             126, 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,
40             175, 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,
42             127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183,
43             204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157,
44             151, 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,
47             103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7
48 5     5   28 ];
  5         10  
49              
50 5         56611 use 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,
53             229, 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,
56             131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154,
57             181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163,
58             254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160,
59             251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65,
60             195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117,
61             159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128,
62             155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84,
63             252, 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 5     5   28 ];
  5         9  
68              
69             my @S = (
70             99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118,
71             202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192,
72             183, 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,
76             208, 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,
78             205, 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,
80             224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121,
81             231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8,
82             186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138,
83             112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158,
84             225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
85             140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22
86             );
87              
88             my @Si = (
89             82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251,
90             124, 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,
93             114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146,
94             108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132,
95             144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6,
96             208, 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,
98             150, 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,
100             252, 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,
103             160, 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              
107             my @iG = (
108             [ 0x0e, 0x09, 0x0d, 0x0b ],
109             [ 0x0b, 0x0e, 0x09, 0x0d ],
110             [ 0x0d, 0x0b, 0x0e, 0x09 ],
111             [ 0x09, 0x0d, 0x0b, 0x0e ]
112             );
113              
114             my @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              
121             my @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              
188             my @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              
255             my @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              
322             my @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              
389             my @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              
456             my @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              
523             my @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              
590             my @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              
657             my @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              
724             my @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              
791             my @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              
858             my @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              
925             my @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
997             sub MAXBC() { 8 }
998             sub MAXKC() { 8 }
999             sub MAXROUNDS() { 14 }
1000              
1001              
1002             # alg-ref.c
1003 5         25580 use 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 5     5   74 ];
  5         11  
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             #}
1016             sub mul($$) {
1017 2506704 100 33 2506704 0 12230108 $_[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              
1046             sub KeyAddition {
1047 60130     60130 0 113244 for my $j (0..($_[5]-1)) {
1048 241044         432665 $_[0][$j] ^= $_[4][0][$j];
1049 241044         376260 $_[1][$j] ^= $_[4][1][$j];
1050 241044         378341 $_[2][$j] ^= $_[4][2][$j];
1051 241044         605632 $_[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              
1084             sub ShiftRow(@) {
1085 56120     56120 0 64147 my @tmp;
1086 56120         94842 for my $i (1..3) {
1087 168360         173703 my $j;
1088 168360         279763 for $j (0..$_[5]-1) { $tmp[$j] = $_[$i][($j + shifts->[($_[5]-4)>>1][$i][$_[4]]) % $_[5]] }
  674904         1677159  
1089 168360         384852 for $j (0..$_[5]-1) { $_[$i][$j] = $tmp[$j] }
  674904         1281312  
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              
1103             sub Substitution (@) {
1104 56120 50   56120 0 144375 die "Substitution" unless @_ == 261;
1105 56120         158700 my @a = @_[0..3];
1106 56120         1560399 my @box = @_[4..259];
1107 56120         107864 my $BC = $_[260];
1108 56120         60513 my $i;
1109 56120         110766 for $i (0..3) {
1110 224480         237856 my $j;
1111 224480         352165 for $j (0..$BC-1) { $a[$i][$j] = $box[$a[$i][$j]] }
  899872         1835000  
1112             }
1113 56120         608469 @_[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              
1132             sub MixColumn (@) {
1133 26055     26055 0 74129 my @a = @_[0..3];
1134 26055         31458 my $BC = $_[4];
1135 26055         25556 my @b;
1136 26055         25879 my ($j,$i);
1137 26055         56988 for $j (0..$BC-1) {
1138 104446         183408 for $i (0..3) {
1139 417784         805912 $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 26055         69046 for $i (0..3) {
1146 104220         184195 for $j (0..$BC-1) {
1147 417784         796518 $a[$i][$j] = $b[$i][$j];
1148             }
1149             }
1150 26055         156765 @_[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              
1170             sub InvMixColumn (@) {
1171 26055     26055 0 67764 my @a = @_[0..3];
1172 26055         31332 my $BC = $_[4];
1173 26055         25630 my @b;
1174 26055         25905 my ($i,$j);
1175 26055         42530 for $j (0..$BC-1) {
1176 104446         153531 for $i (0..3) {
1177 417784         907644 $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 26055         50678 for $i (0..3) {
1184 104220         178599 for $j (0..$BC-1) {
1185 417784         762810 $a[$i][$j] = $b[$i][$j];
1186             }
1187             }
1188 26055         229584 @_[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              
1199             sub rijndaelKeySched (@) {
1200 438     438 0 1502 my @k = @_[0..3];
1201 438         784 my $keyBits = $_[4];
1202 438         584 my $blockBits = $_[5];
1203             # my @W = @_[6..$#_]; # the rest
1204 438         1255 my $W = $_[6];
1205              
1206 438         549 my @tk;
1207 438         564 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 438 50       2063 my $KC = $keyBits == 128 ? 4 : $keyBits == 192 ? 6 : $keyBits == 256 ? 8 : return -1;
    100          
    100          
1232              
1233 438 50       917 my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
    100          
    100          
1234              
1235 438         602 my $ROUNDS;
1236 438 100       636 { my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
  438         1023  
1237 438 50       1860 $ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
    100          
    100          
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 438         539 my ($j,$i);
1252 438         923 for $j (0..$KC-1) {
1253 3468         4463 for $i (0..3) {
1254 13872         29732 $tk[$i][$j] = $k[$i][$j];
1255             }
1256             }
1257              
1258 438         775 my $t = 0;
1259              
1260 438   66     2694 for ($j = 0; ($j <$KC) and ($t < ($ROUNDS+1)*$BC); $j++, $t++) {
1261 3468         4647 for $i (0..3) {
1262 13872         38824 $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 438         1450 while ($t < ($ROUNDS+1)*$BC) {
1284 3198         4282 for $i (0..3) {
1285 12792         23968 $tk[$i][0] ^= $S[$tk[($i+1) % 4][$KC-1]];
1286             }
1287 3198         6143 $tk[0][0] ^= $rcon[$rconpointer++];
1288            
1289 3198 100       5923 if ($KC != 8) {
1290 194         465 for $j (1..$KC-1) {
1291 738         842 for $i (0..3) { $tk[$i][$j] ^= $tk[$i][$j-1] }
  2952         5060  
1292             }
1293             } else {
1294 3004         8550 for ($j = 1; $j < $KC/2; $j++) {
1295 9012         11171 for $i (0..3) { $tk[$i][$j] ^= $tk[$i][$j-1] }
  36048         74559  
1296             }
1297 3004         4108 for $i (0..3) { $tk[$i][$KC/2] ^= $S[$tk[$i][$KC/2-1]] }
  12016         21714  
1298 3004         7500 for ($j = $KC/2+1; $j < $KC; $j++) {
1299 9012         11238 for $i (0..3) { $tk[$i][$j] ^= $tk[$i][$j-1] }
  36048         70742  
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 3198   100     14964 for ($j=0; ($j<$KC) and ($t < ($ROUNDS+1)*$BC); $j++, $t++) {
1312 23256         29628 for $i (0..3) { $W->[$t/$BC][$i][$t % $BC] = $tk[$i][$j] }
  93024         262738  
1313             }
1314             }
1315              
1316             # @_[6..$#_] = @W; # return by reference
1317 438         1546 $_[6] = $W;
1318 438         2147 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              
1329             sub rijndaelEncrypt (@) {
1330 2005     2005 0 6014 my @a = @_[0..3];
1331 2005         9885 my $keyBits = $_[4];
1332 2005         3049 my $blockBits = $_[5];
1333             #my @rk = $_[6..$#_]; # rest
1334 2005         3392 my $rk = $_[6];
1335            
1336 2005         4033 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 2005 50       4881 my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
    100          
    100          
1354              
1355 2005         3728 my $ROUNDS;
1356 2005 100       2451 { my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
  2005         4199  
1357 2005 50       8243 $ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
    100          
    100          
1358             }
1359              
1360             #
1361             # /* begin with a key addition
1362             # */
1363             # KeyAddition(a,rk[0],BC);
1364              
1365 2005         5679 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 2005         7986 for $r (1..$ROUNDS-1) {
1378 26055         143855 Substitution(@a,@S,$BC);
1379 26055         64380 ShiftRow(@a,0,$BC);
1380 26055         55757 MixColumn(@a,$BC);
1381 26055         70659 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 2005         9419 Substitution(@a,@S,$BC);
1395 2005         5594 ShiftRow(@a,0,$BC);
1396 2005         6275 KeyAddition(@a,$rk->[$ROUNDS],$BC);
1397              
1398 2005         6891 @_[0..3] = @a;
1399            
1400 2005         5883 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              
1413             sub rijndaelEncryptRound (@) {
1414 0     0 0 0 my $rounds = pop; # last element
1415            
1416 0         0 my @a = @_[0..3];
1417 0         0 my $keyBits = $_[4];
1418 0         0 my $blockBits = $_[5];
1419             # my @rk = $_[6..$#_]; # rest
1420 0         0 my $rk = $_[6];
1421            
1422 0         0 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 0 0       0 my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
    0          
    0          
1440              
1441 0         0 my $ROUNDS;
1442 0 0       0 { my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
  0         0  
1443 0 0       0 $ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
    0          
    0          
1444             }
1445              
1446              
1447             #
1448             # /* make number of rounds sane */
1449             # if (rounds > ROUNDS) rounds = ROUNDS;
1450              
1451 0 0       0 $rounds = $ROUNDS if $rounds > $ROUNDS;
1452              
1453             #
1454             # /* begin with a key addition
1455             # */
1456             # KeyAddition(a,rk[0],BC);
1457              
1458 0         0 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 0   0     0 for ($r = 1; $r <= $rounds and $r < $ROUNDS; $r++) {
1470 0         0 Substitution(@a,@S,$BC);
1471 0         0 ShiftRow(@a,0,$BC);
1472 0         0 MixColumn(@a,$BC);
1473 0         0 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 0 0       0 if ($rounds == $ROUNDS) {
1485 0         0 Substitution(@a,@S,$BC);
1486 0         0 ShiftRow(@a,0,$BC);
1487 0         0 KeyAddition(@a,$rk->[$ROUNDS],$BC);
1488             }
1489              
1490             #
1491             # return 0;
1492              
1493 0         0 @_[0..3] = @a;
1494            
1495 0         0 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              
1507             sub rijndaelDecrypt (@) {
1508            
1509 2005     2005 0 7907 my @a = @_[0..3];
1510 2005         2845 my $keyBits = $_[4];
1511 2005         2916 my $blockBits = $_[5];
1512 2005         2886 my $rk = $_[6];
1513              
1514 2005         3876 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 2005 50       4675 my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
    100          
    100          
1532              
1533 2005         2668 my $ROUNDS;
1534             {
1535 2005 100       2640 my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
  2005         4598  
1536 2005 50       10229 $ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
    100          
    100          
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 2005         6008 KeyAddition(@a,$rk->[$ROUNDS],$BC);
1557 2005         11474 Substitution(@a,@Si,$BC);
1558 2005         4741 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 2005         6291 for ($r = $ROUNDS-1; $r > 0; $r--) {
1571 26055         62517 KeyAddition(@a,$rk->[$r],$BC);
1572 26055         62980 InvMixColumn(@a,$BC);
1573 26055         157405 Substitution(@a,@Si,$BC);
1574 26055         66123 ShiftRow(@a,1,$BC);
1575             }
1576             #
1577             # /* End with the extra key addition
1578             # */
1579             #
1580             # KeyAddition(a,rk[0],BC);
1581              
1582 2005         6037 KeyAddition(@a,$rk->[0],$BC);
1583              
1584             #
1585             # return 0;
1586             #}
1587              
1588 2005         7127 @_[0..3] = @a;
1589            
1590 2005         5618 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              
1605             sub rijndaelDecryptRound (@) {
1606            
1607 0     0 0 0 my @a = @_[0..3];
1608 0         0 my $keyBits = $_[4];
1609 0         0 my $blockBits = $_[5];
1610 0         0 my $rk = $_[6];
1611 0         0 my $rounds = $_[7];
1612              
1613 0         0 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 0 0       0 my $BC = $blockBits == 128 ? 4 : $blockBits == 192 ? 6 : $blockBits == 256 ? 8 : return -2;
    0          
    0          
1632              
1633 0         0 my $ROUNDS;
1634             {
1635 0 0       0 my $tmp = $keyBits >= $blockBits ? $keyBits : $blockBits;
  0         0  
1636 0 0       0 $ROUNDS = $tmp == 128 ? 10 : $tmp == 192 ? 12 : $tmp == 256 ? 14 : return -3; # this cannot happen
    0          
    0          
1637             }
1638              
1639              
1640              
1641             #
1642             # /* make number of rounds sane */
1643             # if (rounds > ROUNDS) rounds = ROUNDS;
1644              
1645 0 0       0 $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 0         0 KeyAddition(@a,$rk->[$ROUNDS],$BC);
1657 0         0 Substitution(@a,@Si,$BC);
1658 0         0 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 0         0 for ($r = $ROUNDS-1; $r > $rounds; $r--) {
1672 0         0 KeyAddition(@a,$rk->[$r],$BC);
1673 0         0 InvMixColumn(@a,$BC);
1674 0         0 Substitution(@a,@Si,$BC);
1675 0         0 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 0 0       0 if ($rounds == 0) {
1687 0         0 KeyAddition(@a,$rk->[0],$BC);
1688             }
1689              
1690             #
1691             # return 0;
1692             #}
1693              
1694 0         0 @_[0..3] = @a;
1695              
1696 0         0 return 0
1697             }
1698              
1699              
1700              
1701              
1702              
1703             ##################################
1704             # api-ref.c
1705              
1706             # define DIR_ENCRYPT 0 /* Are we encrpyting? */
1707             sub DIR_ENCRYPT() { 0 }
1708             # define DIR_DECRYPT 1 /* Are we decrpyting? */
1709             sub DIR_DECRYPT() { 1 }
1710             # define MODE_ECB 1 /* Are we ciphering in ECB mode? */
1711             sub MODE_ECB() { 1 }
1712             # define MODE_CBC 2 /* Are we ciphering in CBC mode? */
1713             sub MODE_CBC() { 2 }
1714             # define MODE_CFB1 3 /* Are we ciphering in 1-bit CFB mode? */
1715             sub MODE_CFB1() { 3 }
1716             # define TRUE 1
1717             sub TRUE() { 1 }
1718             # define FALSE 0
1719             sub FALSE() { 0 }
1720             # define BITSPERBLOCK 128 /* Default number of bits in a cipher block */
1721             sub 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 */
1733             sub MAX_KEY_SIZE() { 64 }
1734             #define MAX_IV_SIZE BITSPERBLOCK/8 /* # bytes needed to represent an IV */
1735             sub 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              
1744             sub makeKey($$$$) {
1745              
1746 438     438 0 926 my ($key, $direction, $keyLen, $keyMaterial) = @_;
1747            
1748             #$keyLen = length $keyMaterial; # hey, it's perl :-)
1749            
1750 438         572 my @k;
1751            
1752             #
1753             # if (key == NULL) {
1754             # return BAD_KEY_INSTANCE;
1755             # }
1756              
1757 438 50 33     3113 unless ( defined $key and ref $key eq 'HASH') {
1758 0         0 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 438 50 66     1767 if ($direction == DIR_ENCRYPT or $direction == DIR_DECRYPT) {
1769 438         1174 $key->{direction} = $direction
1770             } else {
1771 0         0 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 438 50 100     3693 if ($keyLen == 128 or $keyLen == 192 or $keyLen == 256) {
      66        
1782 438         1070 $key->{keyLen} = $keyLen
1783             } else {
1784 0         0 die "BAD_KEY_MAT";
1785             }
1786              
1787             #
1788             # if ( keyMaterial ) {
1789             # strncpy(key->keyMaterial, keyMaterial, keyLen/4);
1790             # }
1791              
1792 438 50       1087 if (defined $keyMaterial) {
1793 438         1464 $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 438         602 my $i;
1815 438         8053 my @keyMaterial = unpack 'A2'x(length($key->{keyMaterial})/2), $key->{keyMaterial};
1816 438         1615 for $i (0..$keyLen/8-1) {
1817 13872         23246 $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 438         2982 rijndaelKeySched(@k, $key->{keyLen}, $key->{blockLen}, $key->{keySched});
1826            
1827              
1828             # $key->{keySched} = \@W;
1829            
1830             #
1831             # return TRUE;
1832             #}
1833 438         1052 $_[0] = $key;
1834            
1835 438         6096 return TRUE;
1836             }
1837              
1838              
1839              
1840             #int cipherInit(cipherInstance *cipher, BYTE mode, char *IV)
1841             #{
1842             # int i, j, t;
1843              
1844             sub cipherInit($$;$) {
1845            
1846 428     428 0 1026 my ($cipher, $mode, $IV) = @_;
1847            
1848 428         491 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 428 50 66     2696 if ($mode == MODE_ECB or $mode == MODE_CBC or $mode == MODE_CFB1) {
      33        
1858 428         1264 $cipher->{mode} = $mode
1859             } else {
1860 0         0 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 428 50       976 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 428         6379 $cipher->{IV} = [ unpack 'C'x(length $IV), $IV ]
1888             }
1889              
1890             #
1891             # return TRUE;
1892             #}
1893              
1894 428         916 $_[0] = $cipher;
1895 428         818 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              
1907             sub blockEncrypt($$$$$) {
1908              
1909 2005     2005 0 3601 my ($cipher, $key, $input, $inputLen, $outBuffer) = @_;
1910            
1911 2005         2520 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 2005 50 33     30293 if (not defined $key or $key->{direction} != DIR_ENCRYPT or
      100        
      66        
      33        
1923             ($key->{keyLen} != 128 and $key->{keyLen} != 192 and $key->{keyLen} != 256)) {
1924 0         0 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 2005 50 66     19368 if (not defined $cipher or ($cipher->{mode} != MODE_ECB and $cipher->{mode} != MODE_CBC and $cipher->{mode} != MODE_CFB1) or
      33        
      33        
      100        
      66        
      33        
1934             ($cipher->{blockLen} != 128 and $cipher->{blockLen} != 192 and $cipher->{blockLen} != 256)) {
1935 0         0 die "BAD_CIPHER_STATE";
1936             }
1937            
1938             #
1939             #
1940             # numBlocks = inputLen/cipher->blockLen;
1941              
1942 2005         3636 $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 2005 100       6432 if ($cipher->{mode} == MODE_ECB) {
    50          
1963 559         1053 for $i (0..$numBlocks-1) {
1964 559         1103 for $j (0..$cipher->{blockLen}/32-1) {
1965 2254         2892 for $t (0..3) {
1966 9016         16669 $block[$t][$j] = $input->[4*$j+$t] & 0xFF;
1967             }
1968             }
1969 559         2078 rijndaelEncrypt(@block, $key->{keyLen}, $cipher->{blockLen}, $key->{keySched});
1970 559         1802 for $j (0..$cipher->{blockLen}/32-1) {
1971 2254         2812 for $t (0..3) {
1972 9016         17364 $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 1446         3751 for $j (0..$cipher->{blockLen}/32-1) {
2003 5784         9533 for $t (0..3) {
2004 23136         68246 $block[$t][$j] = $cipher->{IV}[$t+4*$j] & 0xFF
2005             }
2006             }
2007 1446         3441 for $i (0..$numBlocks-1) {
2008 1446         4337 for $j (0..$cipher->{blockLen}/32-1) {
2009 5784         8089 for $t (0..3) {
2010 23136         47338 $block[$t][$j] ^= $input->[4*$j+$t] & 0xFF;
2011             }
2012             }
2013 1446         6557 rijndaelEncrypt(@block,$key->{keyLen},$cipher->{blockLen}, $key->{keySched});
2014 1446         5866 for $j (0..$cipher->{blockLen}/32-1) {
2015 5784         8946 for $t (0..3) {
2016 23136         63222 $outBuffer->[4*$j+$t] = $block[$t][$j];
2017             }
2018             }
2019             }
2020             }
2021              
2022             #
2023             # default: return BAD_CIPHER_STATE;
2024             # }
2025              
2026 0         0 else { die "BAD_CIPHER_STATE" }
2027              
2028             #
2029             # return numBlocks*cipher->blockLen;
2030             #}
2031             # @_ = ($cipher, $key, $input, $inputLen, $outBuffer);
2032 2005         4703 $_[4] = $outBuffer;
2033            
2034 2005         23445 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              
2046             sub blockDecrypt($$$$$) {
2047            
2048 2005     2005 0 4755 my ($cipher, $key, $input, $inputLen, $outBuffer) = @_;
2049            
2050 2005         3147 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 2005 50 33     40115 if (not defined $cipher or not defined $key or $key->{direction} == DIR_ENCRYPT or $cipher->{blockLen} != $key->{blockLen}) {
      33        
      33        
2061 0         0 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 2005 50 33     38321 if (not defined $key or $key->{direction} != DIR_DECRYPT or
      100        
      66        
      33        
2074             ($key->{keyLen} != 128 and $key->{keyLen} != 192 and $key->{keyLen} != 256)) {
2075 0         0 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 2005 50 66     19576 if (not defined $cipher or ($cipher->{mode} != MODE_ECB and $cipher->{mode} != MODE_CBC and $cipher->{mode} != MODE_CFB1) or
      33        
      33        
      100        
      66        
      33        
2085             ($cipher->{blockLen} != 128 and $cipher->{blockLen} != 192 and $cipher->{blockLen} != 256)) {
2086 0         0 die "BAD_CIPHER_STATE";
2087             }
2088              
2089             #
2090             #
2091             # numBlocks = inputLen/cipher->blockLen;
2092              
2093 2005         3168 $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 2005 100       7465 if ($cipher->{mode} == MODE_ECB) {
    50          
2114 559         1050 for $i (0..$numBlocks-1) {
2115 559         1161 for $j (0..$cipher->{blockLen}/32-1) {
2116 2254         3196 for $t (0..3) {
2117 9016         16843 $block[$t][$j] = $input->[4*$j+$t] & 0xFF;
2118             }
2119             }
2120 559         1969 rijndaelDecrypt(@block, $key->{keyLen}, $cipher->{blockLen}, $key->{keySched});
2121 559         1864 for $j (0..$cipher->{blockLen}/32-1) {
2122 2254         3293 for $t (0..3) {
2123 9016         18467 $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 1446         3981 for $j (0..$cipher->{blockLen}/32-1) {
2141 5784         12846 for $t (0..3) {
2142 23136         54306 $block[$t][$j] = $input->[$t+4*$j] & 0xFF
2143             }
2144             }
2145              
2146              
2147             # rijndaelDecrypt (block, key->keyLen, cipher->blockLen, key->keySched);
2148              
2149 1446         6733 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 1446         6401 for $j (0.. $cipher->{blockLen}/32-1) {
2159 5784         9648 for $t (0..3) {
2160 23136         67128 $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 1446         16054 for $i (1..$numBlocks-1) {
2185 0         0 for $j (0..$cipher->{blockLen}/32-1) {
2186 0         0 for $t (0..3) {
2187 0         0 $block[$t][$j] ^= $input->[$cipher->{blockLen}/8+4*$j+$t] & 0xFF;
2188             }
2189             }
2190 0         0 rijndaelDecrypt(@block,$key->{keyLen},$cipher->{blockLen}, $key->{keySched});
2191 0         0 for $j (0..$cipher->{blockLen}/32-1) {
2192 0         0 for $t (0..3) {
2193 0         0 $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 0         0 else { die "BAD_CIPHER_STATE" }
2207              
2208             # }
2209             #
2210             # return numBlocks*cipher->blockLen;
2211             #}
2212              
2213 2005         3993 $_[4] = $outBuffer;
2214            
2215 2005         15854 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            
2233             sub cipherUpdateRounds($$$$$$) {
2234            
2235 0     0 0 0 my ($cipher, $key, $input, $inputLen, $outBuffer, $rounds) = @_;
2236            
2237             # int j, t;
2238             # word8 block[4][MAXBC];
2239              
2240 0         0 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 0 0 0     0 if (not defined $cipher or not defined $key or $key->{direction} == DIR_ENCRYPT or $cipher->{blockLen} != $key->{blockLen}) {
      0        
      0        
2250 0         0 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 0         0 for $j (0..$cipher->{blockLen}/32-1) {
2262 0         0 for $t (0..3) {
2263 0         0 $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 0 0       0 if ($key->{direction} == DIR_ENCRYPT) {
    0          
2274 0         0 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 0         0 rijndaelDecryptRound(@block, $key->{keyLen}, $cipher->{blockLen}, $key->{keySched}, $rounds);
2285             }
2286              
2287             #
2288             # default: return BAD_KEY_DIR;
2289             # }
2290              
2291             else {
2292 0         0 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 0         0 for $j (0..$cipher->{blockLen}/32-1) {
2302 0         0 for $t (0..3) {
2303 0         0 $outBuffer->[4*$j+$t] = $block[$t][$j];
2304             }
2305             }
2306              
2307             #
2308             # return TRUE;
2309              
2310 0         0 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              
2339 5     5   54 use vars qw'$DEFAULT_BLOCKSIZE $DEFAULT_KEYSIZE';
  5         11  
  5         24370  
2340             # sub DEFAULT_BLOCKSIZE() { 128 }
2341             # sub DEFAULT_KEYSIZE() { 256 }
2342             $DEFAULT_BLOCKSIZE = 128;
2343             $DEFAULT_KEYSIZE = 256;
2344              
2345             sub new {
2346 10     10 0 5989 my ($class,$key,$mode) = @_;
2347              
2348 10         22 my $blocksize = $DEFAULT_BLOCKSIZE;
2349 10         24 my $keysize = $DEFAULT_KEYSIZE;
2350 10         31 my $ENkeyInst = { blockLen => $blocksize };
2351 10         30 my $DEkeyInst = { blockLen => $blocksize };
2352 10 50       36 $mode = MODE_ECB unless defined $mode;
2353            
2354             # compatibility mode for Crypt::Rijndael
2355 10         66 $key = join '', unpack 'H*', $key;
2356              
2357 10 50       63 if (length($key) * 4 != $keysize) {
2358 0         0 warn __PACKAGE__, ": set keysize to ", length($key)*4, ".\n";
2359 0         0 $keysize = length($key) * 4;
2360             }
2361              
2362 10         19 eval { makeKey($ENkeyInst, DIR_ENCRYPT, $keysize, $key) };
  10         35  
2363 10 50       30 die $@ if $@;
2364              
2365 10         18 eval { makeKey($DEkeyInst, DIR_DECRYPT, $keysize, $key) };
  10         57  
2366 10 50       33 die $@ if $@;
2367              
2368 10         34 my $cipherInst = { blockLen => $blocksize };
2369 10         34 my $IV = "\0" x ($blocksize/8);
2370 10         17 eval { cipherInit($cipherInst, $mode, $IV) };
  10         36  
2371 10 50       35 die $@ if $@;
2372            
2373 10         65 my $self = {
2374             cipherInst => $cipherInst,
2375             ENkeyInst => $ENkeyInst,
2376             DEkeyInst => $DEkeyInst,
2377             IV => $IV,
2378             keysize => $keysize,
2379             blocksize => $blocksize
2380             };
2381            
2382 10   33     103 bless $self, ref($class) || $class;
2383             }
2384              
2385             sub encrypt {
2386 100     100 0 83345 my ($self,$data) = @_;
2387 100         157 my $out;
2388 100         603 for (my $i=0; $i < length($data) / ($self->{blocksize}/8); $i++) {
2389 896         11063 my $tmp = [];
2390 896         8842 my @block = unpack 'C'x($self->{blocksize}/8),
2391             substr($data,$i*$self->{blocksize}/8,$self->{blocksize}/8);
2392 896         2445 eval {
2393 896         4204 my $res = blockEncrypt($self->{cipherInst}, $self->{ENkeyInst}, \@block, $self->{blocksize}, $tmp);
2394             };
2395 896 50       11212 die $@ if $@;
2396 896         37757 $out .= pack 'C'x($self->{blocksize}/8), @$tmp;
2397             }
2398 100 50       389 return unless defined $out;
2399 100         727 $out;
2400             }
2401              
2402             sub decrypt {
2403 100     100 0 1123 my ($self,$data) = @_;
2404 100         184 my $out;
2405 100         1008 for (my $i=0; $i < length($data) / ($self->{blocksize}/8); $i++) {
2406 896         21680 my $tmp = [];
2407 896         17749 my @block = unpack 'C'x($self->{blocksize}/8),
2408             substr($data,$i*$self->{blocksize}/8,$self->{blocksize}/8);
2409 896         10084 eval {
2410 896         11059 my $res = blockDecrypt($self->{cipherInst}, $self->{DEkeyInst}, \@block, $self->{blocksize}, $tmp);
2411             };
2412 896 50       3569 die $@ if $@;
2413 896         24518 $out .= pack 'C'x($self->{blocksize}/8), @$tmp;
2414             }
2415 100 50       423 return unless defined $out;
2416 100         768 $out;
2417             }
2418              
2419              
2420             sub rijndael_encrypt($$$;$$) {
2421 209     209 0 92307 my ($key, $mode, $data, $keysize, $blocksize) = @_;
2422              
2423 209 50       773 $keysize = 128 unless defined $keysize;
2424 209 50       704 $blocksize = 128 unless defined $blocksize;
2425            
2426 209         805 my $keyInst = { blockLen => $blocksize };
2427            
2428 209 50       1510 if (length $key < $keysize/4) {
    50          
2429 0         0 $key .= "0" x ($keysize/4 - length $key);
2430 0         0 warn "rijndael_encrypt: padded key to keysize ($keysize)\n";
2431             } elsif (length $key > $keysize/4) {
2432 0         0 $key = substr $key, 0, $keysize/4;
2433 0         0 warn "rijndael_encrypt: truncated key to keysize ($keysize)\n";
2434             }
2435            
2436 209 50       838 if (length($data) % ($blocksize/8)) {
2437 0         0 $data .= "0" x ($blocksize/8 - (length($data) % ($blocksize/8)));
2438 0         0 warn "rijndael_encrypt: padded data to multiple of blocksize ($blocksize)\n";
2439             }
2440            
2441 209         290 my $res;
2442              
2443 209         512 eval { makeKey($keyInst, DIR_ENCRYPT, $keysize, $key) };
  209         807  
2444 209 50       821 die $@ if $@;
2445            
2446 209         678 my $cipherInst = { blockLen => $blocksize };
2447              
2448 209         508 my $IV = "\0" x ($blocksize/8);
2449              
2450 209         314 eval { cipherInit($cipherInst, $mode, $IV) };
  209         677  
2451 209 50       493 die $@ if $@;
2452            
2453 209         326 my $out;
2454            
2455             my $i;
2456 209         826 for ($i=0; $i < length($data) / ($blocksize/8); $i++) {
2457 1109         2416 my $tmp = [];
2458 1109         7823 my @block = unpack 'C'x($blocksize/8), substr($data,$i*$blocksize/8,$blocksize/8);
2459 1109         1891 eval {
2460 1109         3196 my $res = blockEncrypt($cipherInst, $keyInst, \@block, $blocksize, $tmp);
2461             };
2462 1109 50       2955 die $@ if $@;
2463 1109         11722 $out .= pack 'C'x($blocksize/8), @$tmp;
2464             }
2465            
2466 209 50       577 return unless defined $out;
2467 209         6453 $out;
2468             }
2469              
2470              
2471              
2472             sub rijndael_decrypt($$$;$$) {
2473 209     209 0 2041 my ($key, $mode, $data, $keysize, $blocksize) = @_;
2474            
2475 209 50       620 $keysize = 128 unless defined $keysize;
2476 209 50       535 $blocksize = 128 unless defined $blocksize;
2477            
2478 209         778 my $keyInst = { blockLen => $blocksize };
2479              
2480 209 50       1041 if (length $key < ($keysize/4)) {
    50          
2481 0         0 $key .= "0" x ($keysize/4 - length $key);
2482 0         0 warn "rijndael_decrypt: padded key to keysize ($keysize)\n";
2483             } elsif (length $key > $keysize/4) {
2484 0         0 $key = substr $key, 0, $keysize/4;
2485 0         0 warn "rijndael_decrypt: truncate key to keysize ($keysize)\n";
2486             }
2487            
2488 209         307 my $res;
2489              
2490 209         322 eval { makeKey($keyInst, DIR_DECRYPT, $keysize, $key) };
  209         737  
2491 209 50       625 die $@ if $@;
2492            
2493 209         990 my $cipherInst = { blockLen => $blocksize };
2494              
2495 209         788 my $IV = "\0" x ($blocksize/8);
2496              
2497 209         262 eval { cipherInit($cipherInst, $mode, $IV) };
  209         641  
2498 209 50       653 die $@ if $@;
2499            
2500 209         304 my $out;
2501             my $i;
2502            
2503 209         809 for ($i=0; $i < length($data) / ($blocksize/8); $i++) {
2504 1109         2318 my $tmp = [];
2505 1109         8072 my @block = unpack 'C'x($blocksize/8), substr($data,$i*$blocksize/8,$blocksize/8);
2506 1109         2252 eval {
2507 1109         3454 blockDecrypt($cipherInst, $keyInst, \@block, $blocksize, $tmp)
2508             };
2509 1109 50       8937 die $@ if $@;
2510 1109         12813 $out .= pack 'C'x($blocksize/8), @$tmp;
2511             }
2512            
2513 209 50       645 return unless defined $out;
2514 209         6420 $out;
2515             }
2516              
2517             ####################################################
2518             #
2519             # Interface for Crypt::CBC
2520             #
2521             ####################################################
2522              
2523             # return keysize in bytes
2524             sub keysize {
2525 0     0 0   my $self = shift;
2526 0 0 0       if (defined $self and ref $self and defined $self->{keysize}) {
      0        
2527 0           return $self->{keysize}/8
2528             }
2529 0           return $DEFAULT_KEYSIZE/8
2530             }
2531              
2532             # return blocksize in bytes
2533             sub blocksize {
2534 0     0 0   my $self = shift;
2535 0 0 0       if (defined $self and ref $self and defined $self->{blocksize}) {
      0        
2536 0           return $self->{blocksize}/8
2537             }
2538 0           return $DEFAULT_BLOCKSIZE/8
2539             }
2540              
2541             1; # make require happy :-)
2542              
2543             __END__