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