diff options
55 files changed, 3270 insertions, 2569 deletions
diff --git a/checks/validate.dat b/checks/validate.dat index 875177868..ff2ed2f4b 100644 --- a/checks/validate.dat +++ b/checks/validate.dat @@ -9,7 +9,118 @@ # Block cipher format is plaintext:ciphertext:key [AES] -# From the AES documentation for Rijndael +# From FIPS 197 +00112233445566778899AABBCCDDEEFF:69C4E0D86A7B0430D8CDB78070B4C55A:\ +000102030405060708090A0B0C0D0E0F +00112233445566778899AABBCCDDEEFF:DDA97CA4864CDFE06EAF70A0EC0D7191:\ +000102030405060708090A0B0C0D0E0F1011121314151617 +00112233445566778899AABBCCDDEEFF:8EA2B7CA516745BFEAFC49904B496089:\ +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F + +506812A45F08C889B97F5980038B8359:D8F532538289EF7D06B506A4FD5BE9C9:\ +00010203050607080A0B0C0D0F101112 +5C6D71CA30DE8B8B00549984D2EC7D4B:59AB30F4D4EE6E4FF9907EF65B1FB68C:\ +14151617191A1B1C1E1F202123242526 +53F3F4C64F8616E4E7C56199F48F21F6:BF1ED2FCB2AF3FD41443B56D85025CB1:\ +28292A2B2D2E2F30323334353738393A +A1EB65A3487165FB0F1C27FF9959F703:7316632D5C32233EDCB0780560EAE8B2:\ +3C3D3E3F41424344464748494B4C4D4E +3553ECF0B1739558B08E350A98A39BFA:408C073E3E2538072B72625E68B8364B:\ +50515253555657585A5B5C5D5F606162 +67429969490B9711AE2B01DC497AFDE8:E1F94DFA776597BEACA262F2F6366FEA:\ +64656667696A6B6C6E6F707173747576 +93385C1F2AEC8BED192F5A8E161DD508:F29E986C6A1C27D7B29FFD7EE92B75F1:\ +78797A7B7D7E7F80828384858788898A +3E23B3BC065BCC152407E23896D77783:1959338344E945670678A5D432C90B93:\ +54555657595A5B5C5E5F606163646566 +79F0FBA002BE1744670E7E99290D8F52:E49BDDD2369B83EE66E6C75A1161B394:\ +68696A6B6D6E6F70727374757778797A +DA23FE9D5BD63E1D72E3DAFBE21A6C2A:D3388F19057FF704B70784164A74867D:\ +7C7D7E7F81828384868788898B8C8D8E +E3F5698BA90B6A022EFD7DB2C7E6C823:23AA03E2D5E4CD24F3217E596480D1E1:\ +A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 +BDC2691D4F1B73D2700679C3BCBF9C6E:C84113D68B666AB2A50A8BDB222E91B9:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 +BA74E02093217EE1BA1B42BD5624349A:AC02403981CD4340B507963DB65CB7B6:\ +08090A0B0D0E0F10121314151718191A +B5C593B5851C57FBF8B3F57715E8F680:8D1299236223359474011F6BF5088414:\ +6C6D6E6F71727374767778797B7C7D7E + +FEC1C04F529BBD17D8CECFCC4718B17F:62564C738F3EFE186E1A127A0C4D3C61:\ +4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 +32DF99B431ED5DC5ACF8CAF6DC6CE475:07805AA043986EB23693E23BEF8F3438:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 +7FDC2B746F3F665296943B83710D1F82:DF0B4931038BADE848DEE3B4B85AA44B:\ +868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 +8FBA1510A3C5B87E2EAA3F7A91455CA2:592D5FDED76582E4143C65099309477C:\ +A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 +2C9B468B1C2EED92578D41B0716B223B:C9B8D6545580D3DFBCDD09B954ED4E92:\ +C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE +0A2BBF0EFC6BC0034F8A03433FCA1B1A:5DCCD5D6EB7C1B42ACB008201DF707A0:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC +25260E1F31F4104D387222E70632504B:A2A91682FFEB6ED1D34340946829E6F9:\ +FEFE01010304050608090A0B0D0E0F10121314151718191A +C527D25A49F08A5228D338642AE65137:E45D185B797000348D9267960A68435D:\ +1C1D1E1F21222324262728292B2C2D2E3031323335363738 +3B49FC081432F5890D0E3D87E884A69E:45E060DAE5901CDA8089E10D4F4C246B:\ +3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 +D173F9ED1E57597E166931DF2754A083:F6951AFACC0079A369C71FDCFF45DF50:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 +8C2B7CAFA5AFE7F13562DAEAE1ADEDE0:9E95E00F351D5B3AC3D0E22E626DDAD6:\ +767778797B7C7D7E80818283858687888A8B8C8D8F909192 +AAF4EC8C1A815AEB826CAB741339532C:9CB566FF26D92DAD083B51FDC18C173C:\ +94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 +40BE8C5D9108E663F38F1A2395279ECF:C9C82766176A9B228EB9A974A010B4FB:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC +0C8AD9BC32D43E04716753AA4CFBE351:D8E26AA02945881D5137F1C1E1386E88:\ +2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 +1407B1D5F87D63357C8DC7EBBAEBBFEE:C0E024CCD68FF5FFA4D139C355A77C55:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 + +E51AA0B135DBA566939C3B6359A980C5:8CD9423DFC459E547155C5D1D522E540:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 +069A007FC76A459F98BAF917FEDF9521:080E9517EB1677719ACF728086040AE3:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E +726165C1723FBCF6C026D7D00B091027:7C1700211A3991FC0ECDED0AB3E576B0:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 +D7C544DE91D55CFCDE1F84CA382200CE:DABCBCC855839251DB51E224FBE87435:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E +FED3C9A161B9B5B2BD611B41DC9DA357:68D56FAD0406947A4DD27A7448C10F1D:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 +4F634CDC6551043409F30B635832CF82:DA9A11479844D1FFEE24BBF3719A9925:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE +109CE98DB0DFB36734D9F3394711B4E6:5E4BA572F8D23E738DA9B05BA24B8D81:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 +4EA6DFABA2D8A02FFDFFA89835987242:A115A2065D667E3F0B883837A6E903F8:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 +5AE094F54AF58E6E3CDBF976DAC6D9EF:3E9E90DC33EAC2437D86AD30B137E66E:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE +764D8E8E0F29926DBE5122E66354FDBE:01CE82D8FBCDAE824CB3C48E495C3692:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 +3F0418F888CDF29A982BF6B75410D6A9:0C9CFF163CE936FAAF083CFD3DEA3117:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E +E4A3E7CB12CDD56AA4A75197A9530220:5131BA9BD48F2BBA85560680DF504B52:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 +211677684AAC1EC1A160F44C4EBF3F26:9DC503BBF09823AEC8A977A5AD26CCB2:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E +D21E439FF749AC8F18D6D4B105E03895:9A6DB0C0862E506A9E397225884041D7:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 +D9F6FF44646C4725BD4C0103FF5552A7:430BF9570804185E1AB6365FC6A6860C:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE +0B1256C2A00B976250CFC5B0C37ED382:3525EBC02F4886E6A5A3762813E8CE8A:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 +B056447FFC6DC4523A36CC2E972A3A79:07FA265C763779CCE224C7BAD671027B:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE +5E25CA78F0DE55802524D38DA3FE4456:E8B72B4E8BE243438C9FFF1F0E205872:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 +A5BCF4728FA5EAAD8567C0DC24675F83:109D4F999A0E11ACE1F05E6B22CBCB50:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E +814E59F97ED84646B78B2CA022E9CA43:45A5E8D4C3ED58403FF08D68A0CC4029:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 +15478BEEC58F4775C7A7F5D4395514D7:196865964DB3D417B6BD4D586BCB7634:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +[AES-128] 506812A45F08C889B97F5980038B8359:D8F532538289EF7D06B506A4FD5BE9C9:\ 00010203050607080A0B0C0D0F101112 @@ -394,774 +505,6 @@ C2C3C0C10A0908F754555253A1AEAFAC:86523D92BB8672CB01CF4A77FD725882:\ F5F4F7F684878689A6A7A0A1D2CDCCCF:CE52AF650D088CA559425223F4D32694:\ A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 -2D33EEF2C0430A8A9EBF45E809C40BB6:DFF4945E0336DF4C1C56BC700EFF837F:\ -00010203050607080A0B0C0D0F10111214151617191A1B1C - -6AA375D1FA155A61FB72353E0A5A8756:B6FDDEF4752765E347D5D2DC196D1252:\ -1E1F20212324252628292A2B2D2E2F30323334353738393A - -BC3736518B9490DCB8ED60EB26758ED4:D23684E3D963B3AFCF1A114ACA90CBD6:\ -3C3D3E3F41424344464748494B4C4D4E5051525355565758 - -AA214402B46CFFB9F761EC11263A311E:3A7AC027753E2A18C2CEAB9E17C11FD0:\ -5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 - -02AEA86E572EEAB66B2C3AF5E9A46FD6:8F6786BD007528BA26603C1601CDD0D8:\ -78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 - -E2AEF6ACC33B965C4FA1F91C75FF6F36:D17D073B01E71502E28B47AB551168B3:\ -969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 - -0659DF46427162B9434865DD9499F91D:A469DA517119FAB95876F41D06D40FFA:\ -B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 - -49A44239C748FEB456F59C276A5658DF:6091AA3B695C11F5C0B6AD26D3D862FF:\ -D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE - -66208F6E9D04525BDEDB2733B6A6BE37:70F9E67F9F8DF1294131662DC6E69364:\ -F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C - -3393F8DFC729C97F5480B950BC9666B0:D154DCAFAD8B207FA5CBC95E9996B559:\ -0E0F10111314151618191A1B1D1E1F20222324252728292A - -606834C8CE063F3234CF1145325DBD71:4934D541E8B46FA339C805A7AEB9E5DA:\ -2C2D2E2F31323334363738393B3C3D3E4041424345464748 - -FEC1C04F529BBD17D8CECFCC4718B17F:62564C738F3EFE186E1A127A0C4D3C61:\ -4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 - -32DF99B431ED5DC5ACF8CAF6DC6CE475:07805AA043986EB23693E23BEF8F3438:\ -68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 - -7FDC2B746F3F665296943B83710D1F82:DF0B4931038BADE848DEE3B4B85AA44B:\ -868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 - -8FBA1510A3C5B87E2EAA3F7A91455CA2:592D5FDED76582E4143C65099309477C:\ -A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 - -2C9B468B1C2EED92578D41B0716B223B:C9B8D6545580D3DFBCDD09B954ED4E92:\ -C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE - -0A2BBF0EFC6BC0034F8A03433FCA1B1A:5DCCD5D6EB7C1B42ACB008201DF707A0:\ -E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC - -25260E1F31F4104D387222E70632504B:A2A91682FFEB6ED1D34340946829E6F9:\ -FEFE01010304050608090A0B0D0E0F10121314151718191A - -C527D25A49F08A5228D338642AE65137:E45D185B797000348D9267960A68435D:\ -1C1D1E1F21222324262728292B2C2D2E3031323335363738 - -3B49FC081432F5890D0E3D87E884A69E:45E060DAE5901CDA8089E10D4F4C246B:\ -3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 - -D173F9ED1E57597E166931DF2754A083:F6951AFACC0079A369C71FDCFF45DF50:\ -58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 - -8C2B7CAFA5AFE7F13562DAEAE1ADEDE0:9E95E00F351D5B3AC3D0E22E626DDAD6:\ -767778797B7C7D7E80818283858687888A8B8C8D8F909192 - -AAF4EC8C1A815AEB826CAB741339532C:9CB566FF26D92DAD083B51FDC18C173C:\ -94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 - -40BE8C5D9108E663F38F1A2395279ECF:C9C82766176A9B228EB9A974A010B4FB:\ -D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC - -0C8AD9BC32D43E04716753AA4CFBE351:D8E26AA02945881D5137F1C1E1386E88:\ -2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 - -1407B1D5F87D63357C8DC7EBBAEBBFEE:C0E024CCD68FF5FFA4D139C355A77C55:\ -48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 - -E62734D1AE3378C4549E939E6F123416:0B18B3D16F491619DA338640DF391D43:\ -84858687898A8B8C8E8F90919394959698999A9B9D9E9FA0 - -5A752CFF2A176DB1A1DE77F2D2CDEE41:DBE09AC8F66027BF20CB6E434F252EFC:\ -A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE - -A9C8C3A4EABEDC80C64730DDD018CD88:6D04E5E43C5B9CBE05FEB9606B6480FE:\ -C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDC - -EE9B3DBBDB86180072130834D305999A:DD1D6553B96BE526D9FEE0FBD7176866:\ -1A1B1C1D1F20212224252627292A2B2C2E2F303133343536 - -A7FA8C3586B8EBDE7568EAD6F634A879:0260CA7E3F979FD015B0DD4690E16D2A:\ -38393A3B3D3E3F40424344454748494A4C4D4E4F51525354 - -37E0F4A87F127D45AC936FE7AD88C10A:9893734DE10EDCC8A67C3B110B8B8CC6:\ -929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE - -3F77D8B5D92BAC148E4E46F697A535C5:93B30B750516B2D18808D710C2EE84EF:\ -464748494B4C4D4E50515253555657585A5B5C5D5F606162 - -D25EBB686C40F7E2C4DA1014936571CA:16F65FA47BE3CB5E6DFE7C6C37016C0E:\ -828384858788898A8C8D8E8F91929394969798999B9C9D9E - -4F1C769D1E5B0552C7ECA84DEA26A549:F3847210D5391E2360608E5ACB560581:\ -A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBC - -8548E2F882D7584D0FAFC54372B6633A:8754462CD223366D0753913E6AF2643D:\ -BEBFC0C1C3C4C5C6C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA - -87D7A336CB476F177CD2A51AF2A62CDF:1EA20617468D1B806A1FD58145462017:\ -DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8 - -03B1FEAC668C4E485C1065DFC22B44EE:3B155D927355D737C6BE9DDA60136E2E:\ -FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 - -BDA15E66819FA72D653A6866AA287962:26144F7B66DAA91B6333DBD3850502B3:\ -18191A1B1D1E1F20222324252728292A2C2D2E2F31323334 - -4D0C7A0D2505B80BF8B62CEB12467F0A:E4F9A4AB52CED8134C649BF319EBCC90:\ -363738393B3C3D3E40414243454647484A4B4C4D4F505152 - -626D34C9429B37211330986466B94E5F:B9DDD29AC6128A6CAB121E34A4C62B36:\ -54555657595A5B5C5E5F60616364656668696A6B6D6E6F70 - -333C3E6BF00656B088A17E5FF0E7F60A:6FCDDAD898F2CE4EFF51294F5EAAF5C9:\ -727374757778797A7C7D7E7F81828384868788898B8C8D8E - -687ED0CDC0D2A2BC8C466D05EF9D2891:C9A6FE2BF4028080BEA6F7FC417BD7E3:\ -90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABAC - -487830E78CC56C1693E64B2A6660C7B6:6A2026846D8609D60F298A9C0673127F:\ -AEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA - -7A48D6B7B52B29392AA2072A32B66160:2CB25C005E26EFEA44336C4C97A4240B:\ -CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8 - -907320E64C8C5314D10F8D7A11C8618D:496967AB8680DDD73D09A0E4C7DCC8AA:\ -EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 - -B561F2CA2D6E65A4A98341F3ED9FF533:D5AF94DE93487D1F3A8C577CB84A66A4:\ -08090A0B0D0E0F10121314151718191A1C1D1E1F21222324 - -DF769380D212792D026F049E2E3E48EF:84BDAC569CAE2828705F267CC8376E90:\ -262728292B2C2D2E30313233353637383A3B3C3D3F404142 - -79F374BC445BDABF8FCCB8843D6054C6:F7401DDA5AD5AB712B7EB5D10C6F99B6:\ -44454647494A4B4C4E4F50515354555658595A5B5D5E5F60 - -4E02F1242FA56B05C68DBAE8FE44C9D6:1C9D54318539EBD4C3B5B7E37BF119F0:\ -626364656768696A6C6D6E6F71727374767778797B7C7D7E - -CF73C93CBFF57AC635A6F4AD2A4A1545:ACA572D65FB2764CFFD4A6ECA090EA0D:\ -80818283858687888A8B8C8D8F90919294959697999A9B9C - -9923548E2875750725B886566784C625:36D9C627B8C2A886A10CCB36EAE3DFBB:\ -9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA - -4888336B723A022C9545320F836A4207:010EDBF5981E143A81D646E597A4A568:\ -BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8 - -F84D9A5561B0608B1160DEE000C41BA8:8DB44D538DC20CC2F40F3067FD298E60:\ -DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 - -C23192A0418E30A19B45AE3E3625BF22:930EB53BC71E6AC4B82972BDCD5AAFB3:\ -F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314 - -B84E0690B28B0025381AD82A15E501A7:6C42A81EDCBC9517CCD89C30C95597B4:\ -161718191B1C1D1E20212223252627282A2B2C2D2F303132 - -ACEF5E5C108876C4F06269F865B8F0B0:DA389847AD06DF19D76EE119C71E1DD3:\ -34353637393A3B3C3E3F40414344454648494A4B4D4E4F50 - -0F1B3603E0F5DDEA4548246153A5E064:E018FDAE13D3118F9A5D1A647A3F0462:\ -525354555758595A5C5D5E5F61626364666768696B6C6D6E - -FBB63893450D42B58C6D88CD3C1809E3:2AA65DB36264239D3846180FABDFAD20:\ -70717273757677787A7B7C7D7F80818284858687898A8B8C - -4BEF736DF150259DAE0C91354E8A5F92:1472163E9A4F780F1CEB44B07ECF4FDB:\ -8E8F90919394959698999A9B9D9E9FA0A2A3A4A5A7A8A9AA - -7D2D46242056EF13D3C3FC93C128F4C7:C8273FDC8F3A9F72E91097614B62397C:\ -ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8 - -E9C1BA2DF415657A256EDB33934680FD:66C8427DCD733AAF7B3470CB7D976E3F:\ -CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 - -E23EE277B0AA0A1DFB81F7527C3514F1:146131CB17F1424D4F8DA91E6F80C1D0:\ -E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304 - -3E7445B0B63CAAF75E4A911E12106B4C:2610D0AD83659081AE085266A88770DC:\ -060708090B0C0D0E10111213151617181A1B1C1D1F202122 - -767774752023222544455A5BE6E1E0E3:38A2B5A974B0575C5D733917FB0D4570:\ -24252627292A2B2C2E2F30313334353638393A3B3D3E3F40 - -72737475717E7F7CE9E8EBEA696A6B6C:E21D401EBC60DE20D6C486E4F39A588B:\ -424344454748494A4C4D4E4F51525354565758595B5C5D5E - -DFDEDDDC25262728C9C8CFCEF1EEEFEC:E51D5F88C670B079C0CA1F0C2C4405A2:\ -60616263656667686A6B6C6D6F70717274757677797A7B7C - -FFFE0100707776755F5E5D5C7675746B:246A94788A642FB3D1B823C8762380C8:\ -7E7F80818384858688898A8B8D8E8F90929394959798999A - -E0E1E2E3424140479F9E9190292E2F2C:B80C391C5C41A4C3B30C68E0E3D7550F:\ -9C9D9E9FA1A2A3A4A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8 - -2120272690EFEEED3B3A39384E4D4C4B:B77C4754FC64EB9A1154A9AF0BB1F21C:\ -BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 - -ECEDEEEF5350516EA1A0A7A6A3ACADAE:FB554DE520D159A06BF219FC7F34A02F:\ -D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4 - -32333C3D25222320E9E8EBEACECDCCC3:A89FBA152D76B4927BEED160DDB76C57:\ -F6F7F8F9FBFCFDFE00010203050607080A0B0C0D0F101112 - -40414243626160678A8BB4B511161714:5676EAB4A98D2E8473B3F3D46424247C:\ -14151617191A1B1C1E1F20212324252628292A2B2D2E2F30 - -94959293F5FAFBF81F1E1D1C7C7F7E79:4E8F068BD7EDE52A639036EC86C33568:\ -323334353738393A3C3D3E3F41424344464748494B4C4D4E - -BEBFBCBD191A1B14CFCEC9C8546B6A69:F0193C4D7AFF1791EE4C07EB4A1824FC:\ -50515253555657585A5B5C5D5F60616264656667696A6B6C - -2C2D3233898E8F8CBBBAB9B8333031CE:AC8686EECA9BA761AFE82D67B928C33F:\ -6E6F70717374757678797A7B7D7E7F80828384858788898A - -84858687BFBCBDBA37363938FDFAFBF8:5FAF8573E33B145B6A369CD3606AB2C9:\ -8C8D8E8F91929394969798999B9C9D9EA0A1A2A3A5A6A7A8 - -828384857669686B909192930B08090E:31587E9944AB1C16B844ECAD0DF2E7DA:\ -AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 - -BEBFBCBD9695948B707176779E919093:D017FECD91148ABA37F6F3068AA67D8A:\ -C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4 - -8B8A85846067666521202322D0D3D2DD:788EF2F021A73CBA2794B616078A8500:\ -E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8FAFBFCFDFE010002 - -76777475F1F2F3F4F8F9E6E777707172:5D1EF20DCED6BCBC12131AC7C54788AA:\ -04050607090A0B0C0E0F10111314151618191A1B1D1E1F20 - -A4A5A2A34F404142B4B5B6B727242522:B3C8CF961FAF9EA05FDDE6D1E4D8F663:\ -222324252728292A2C2D2E2F31323334363738393B3C3D3E - -94959697E1E2E3EC16171011839C9D9E:143075C70605861C7FAC6526199E459F:\ -40414243454647484A4B4C4D4F50515254555657595A5B5C - -03023D3C06010003DEDFDCDDFFFCFDE2:A5AE12EADE9A87268D898BFC8FC0252A:\ -5E5F60616364656668696A6B6D6E6F70727374757778797A - -10111213F1F2F3F4CECFC0C1DBDCDDDE:0924F7CF2E877A4819F5244A360DCEA9:\ -7C7D7E7F81828384868788898B8C8D8E9091929395969798 - -67666160724D4C4F1D1C1F1E73707176:3D9E9635AFCC3E291CC7AB3F27D1C99A:\ -9A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 - -E6E7E4E5A8ABAAD584858283909F9E9D:9D80FEEBF87510E2B8FB98BB54FD788C:\ -B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4 - -71707F7E565150537D7C7F7E6162636C:5F9D1A082A1A37985F174002ECA01309:\ -D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 - -64656667212223245555AAAA03040506:A390EBB1D1403930184A44B4876646E4:\ -F4F5F6F7F9FAFBFCFEFE01010304050608090A0B0D0E0F10 - -9E9F9899ABA4A5A6CFCECDCC2B28292E:700FE918981C3195BB6C4BCB46B74E29:\ -121314151718191A1C1D1E1F21222324262728292B2C2D2E - -C7C6C5C4D1D2D3DC626364653A454447:907984406F7BF2D17FB1EB15B673D747:\ -30313233353637383A3B3C3D3F40414244454647494A4B4C - -F6F7E8E9E0E7E6E51D1C1F1E5B585966:C32A956DCFC875C2AC7C7CC8B8CC26E1:\ -4E4F50515354555658595A5B5D5E5F60626364656768696A - -BCBDBEBF5D5E5F5868696667F4F3F2F1:02646E2EBFA9B820CF8424E9B9B6EB51:\ -6C6D6E6F71727374767778797B7C7D7E8081828385868788 - -40414647B0AFAEAD9B9A99989B98999E:621FDA3A5BBD54C6D3C685816BD4EAD8:\ -8A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 - -69686B6A0201001F0F0E0908B4BBBAB9:D4E216040426DFAF18B152469BC5AC2F:\ -A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4 - -C7C6C9C8D8DFDEDD5A5B5859BEBDBCB3:9D0635B9D33B6CDBD71F5D246EA17CC8:\ -C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 - -DEDFDCDD787B7A7DFFFEE1E0B2B5B4B7:10ABAD1BD9BAE5448808765583A2CC1A:\ -E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6F8F9FAFBFDFEFE00 - -4D4C4B4A606F6E6DD0D1D2D3FBF8F9FE:6891889E16544E355FF65A793C39C9A8:\ -020304050708090A0C0D0E0F11121314161718191B1C1D1E - -B7B6B5B4D7D4D5DAE5E4E3E2E1FEFFFC:CC735582E68072C163CD9DDF46B91279:\ -20212223252627282A2B2C2D2F30313234353637393A3B3C - -CECFB0B1F7F0F1F2AEAFACAD3E3D3C23:C5C68B9AEEB7F878DF578EFA562F9574:\ -3E3F40414344454648494A4B4D4E4F50525354555758595A - -CACBC8C9CDCECFC812131C1D494E4F4C:5F4764395A667A47D73452955D0D2CE8:\ -5C5D5E5F61626364666768696B6C6D6E7071727375767778 - -9D9C9B9AD22D2C2FB1B0B3B20C0F0E09:701448331F66106CEFDDF1EB8267C357:\ -7A7B7C7D7F80818284858687898A8B8C8E8F909193949596 - -7A7B787964676659959493924F404142:CB3EE56D2E14B4E1941666F13379D657:\ -98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4 - -AAABA4A5CEC9C8CB1F1E1D1CABA8A9A6:9FE16EFD18AB6E1981191851FEDB0764:\ -B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 - -93929190282B2A2DC4C5FAFB92959497:3DC9BA24E1B223589B147ADCEB4C8E48:\ -D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6E8E9EAEBEDEEEFF0 - -EFEEE9E8DED1D0D339383B3A888B8A8D:1C333032682E7D4DE5E5AFC05C3E483C:\ -F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E - -7F7E7D7CA2A1A0AF78797E7F112E2F2C:D593CC99A95AFEF7E92038E05A59D00A:\ -10111213151617181A1B1C1D1F20212224252627292A2B2C - -84859A9B2B2C2D2E868784852625245B:51E7F96F53B4353923452C222134E1EC:\ -2E2F30313334353638393A3B3D3E3F40424344454748494A - -B0B1B2B3070405026869666710171615:4075B357A1A2B473400C3B25F32F81A4:\ -4C4D4E4F51525354565758595B5C5D5E6061626365666768 - -ACADAAABBDA2A3A00D0C0F0E595A5B5C:302E341A3EBCD74F0D55F61714570284:\ -6A6B6C6D6F70717274757677797A7B7C7E7F808183848586 - -121310115655544B5253545569666764:57ABDD8231280DA01C5042B78CF76522:\ -88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4 - -DEDFD0D166616063EAEBE8E94142434C:17F9EA7EEA17AC1ADF0E190FEF799E92:\ -A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 - -DBDAD9D81417161166677879E0E7E6E5:2E1BDD563DD87EE5C338DD6D098D0A7A:\ -C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6D8D9DADBDDDEDFE0 - -6A6B6C6DE0EFEEED2B2A2928C0C3C2C5:EB869996E6F8BFB2BFDD9E0C4504DBB2:\ -E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE - -B1B0B3B21714151A1A1B1C1D5649484B:C2E01549E9DECF317468B3E018C61BA8:\ -00010203050607080A0B0C0D0F10111214151617191A1B1C - -39380706A3A4A5A6C4C5C6C77271706F:8DA875D033C01DD463B244A1770F4A22:\ -1E1F20212324252628292A2B2D2E2F30323334353738393A - -5C5D5E5F1013121539383736E2E5E4E7:8BA0DCF3A186844F026D022F8839D696:\ -3C3D3E3F41424344464748494B4C4D4E5051525355565758 - -43424544EAD5D4D72E2F2C2D64676661:E9691FF9A6CC6970E51670A0FD5B88C1:\ -5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 - -55545756989B9A65F8F9FEFF18171615:F2BAEC06FAEED30F88EE63BA081A6E5B:\ -78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 - -05040B0A525554573C3D3E3F4A494847:9C39D4C459AE5753394D6094ADC21E78:\ -969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 - -14151617595A5B5C8584FBFA8E89888B:6345B532A11904502EA43BA99C6BD2B2:\ -B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 - -7C7D7A7BFDF2F3F029282B2A51525354:5FFAE3061A95172E4070CEDCE1E428C8:\ -D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE - -38393A3B1E1D1C1341404746C23D3C3E:0A4566BE4CDF9ADCE5DEC865B5AB34CD:\ -F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C - -8D8C939240474645818083827C7F7E41:CA17FCCE79B7404F2559B22928F126FB:\ -0E0F10111314151618191A1B1D1E1F20222324252728292A - -3B3A39381A19181F32333C3D45424340:97CA39B849ED73A6470A97C821D82F58:\ -2C2D2E2F31323334363738393B3C3D3E4041424345464748 - -F0F1F6F738272625828380817F7C7D7A:8198CB06BC684C6D3E9B7989428DCF7A:\ -4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 - -89888B8A0407061966676061141B1A19:F53C464C705EE0F28D9A4C59374928BD:\ -68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 - -D3D2DDDCAAADACAF9C9D9E9FE8EBEAE5:9ADB3D4CCA559BB98C3E2ED73DBF1154:\ -868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 - -834EADFCCAC7E1B30664B1ABA44815AB:1946DABF6A03A2A2C3D0B05080AED6FC:\ -00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 - -D9DC4DBA3021B05D67C0518F72B62BF1:5ED301D747D3CC715445EBDEC62F2FB4:\ -28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E - -A291D86301A4A739F7392173AA3C604C:6585C8F43D13A6BEAB6419FC5935B9D0:\ -50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 - -4264B2696498DE4DF79788A9F83E9390:2A5B56A596680FCC0E05F5E0F151ECAE:\ -78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E - -EE9932B3721804D5A83EF5949245B6F6:F5D6FF414FD2C6181494D20C37F2B8C4:\ -A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 - -E6248F55C5FDCBCA9CBBB01C88A2EA77:85399C01F59FFFB5204F19F8482F00B8:\ -C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE - -B8358E41B9DFF65FD461D55A99266247:92097B4C88A041DDF98144BC8D22E8E7:\ -F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 - -F0E2D72260AF58E21E015AB3A4C0D906:89BD5B73B356AB412AEF9F76CEA2D65C:\ -18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E - -475B8B823CE8893DB3C44A9F2A379FF7:2536969093C55FF9454692F2FAC2F530:\ -40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 - -688F5281945812862F5F3076CF80412F:07FC76A872843F3F6E0081EE9396D637:\ -68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E - -08D1D2BC750AF553365D35E75AFACEAA:E38BA8EC2AA741358DCC93E8F141C491:\ -90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 - -8707121F47CC3EFCECA5F9A8474950A1:D028EE23E4A89075D0B03E868D7D3A42:\ -B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE - -E51AA0B135DBA566939C3B6359A980C5:8CD9423DFC459E547155C5D1D522E540:\ -E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 - -069A007FC76A459F98BAF917FEDF9521:080E9517EB1677719ACF728086040AE3:\ -08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E - -726165C1723FBCF6C026D7D00B091027:7C1700211A3991FC0ECDED0AB3E576B0:\ -30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 - -D7C544DE91D55CFCDE1F84CA382200CE:DABCBCC855839251DB51E224FBE87435:\ -58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E - -FED3C9A161B9B5B2BD611B41DC9DA357:68D56FAD0406947A4DD27A7448C10F1D:\ -80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 - -4F634CDC6551043409F30B635832CF82:DA9A11479844D1FFEE24BBF3719A9925:\ -A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE - -109CE98DB0DFB36734D9F3394711B4E6:5E4BA572F8D23E738DA9B05BA24B8D81:\ -D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 - -4EA6DFABA2D8A02FFDFFA89835987242:A115A2065D667E3F0B883837A6E903F8:\ -70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 - -5AE094F54AF58E6E3CDBF976DAC6D9EF:3E9E90DC33EAC2437D86AD30B137E66E:\ -98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE - -764D8E8E0F29926DBE5122E66354FDBE:01CE82D8FBCDAE824CB3C48E495C3692:\ -C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 - -3F0418F888CDF29A982BF6B75410D6A9:0C9CFF163CE936FAAF083CFD3DEA3117:\ -E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E - -E4A3E7CB12CDD56AA4A75197A9530220:5131BA9BD48F2BBA85560680DF504B52:\ -10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 - -211677684AAC1EC1A160F44C4EBF3F26:9DC503BBF09823AEC8A977A5AD26CCB2:\ -38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E - -D21E439FF749AC8F18D6D4B105E03895:9A6DB0C0862E506A9E397225884041D7:\ -60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 - -D9F6FF44646C4725BD4C0103FF5552A7:430BF9570804185E1AB6365FC6A6860C:\ -88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE - -0B1256C2A00B976250CFC5B0C37ED382:3525EBC02F4886E6A5A3762813E8CE8A:\ -B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 - -B056447FFC6DC4523A36CC2E972A3A79:07FA265C763779CCE224C7BAD671027B:\ -D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE - -5E25CA78F0DE55802524D38DA3FE4456:E8B72B4E8BE243438C9FFF1F0E205872:\ -00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 - -A5BCF4728FA5EAAD8567C0DC24675F83:109D4F999A0E11ACE1F05E6B22CBCB50:\ -28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E - -814E59F97ED84646B78B2CA022E9CA43:45A5E8D4C3ED58403FF08D68A0CC4029:\ -50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 - -15478BEEC58F4775C7A7F5D4395514D7:196865964DB3D417B6BD4D586BCB7634:\ -78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E - -253548FFCA461C67C8CBC78CD59F4756:60436AD45AC7D30D99195F815D98D2AE:\ -A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 - -FD7AD8D73B9B0F8CC41600640F503D65:BB07A23F0B61014B197620C185E2CD75:\ -C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE - -06199DE52C6CBF8AF954CD65830BCD56:5BC0B2850129C854423AFF0751FE343B:\ -F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 - -F17C4FFE48E44C61BD891E257E725794:7541A78F96738E6417D2A24BD2BECA40:\ -18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E - -9A5B4A402A3E8A59BE6BF5CD8154F029:B0A303054412882E464591F1546C5B9E:\ -40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 - -79BD40B91A7E07DC939D441782AE6B17:778C06D8A355EEEE214FCEA14B4E0EEF:\ -68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E - -D8CEAAF8976E5FBE1012D8C84F323799:09614206D15CBACE63227D06DB6BEEBB:\ -90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 - -3316E2751E2E388B083DA23DD6AC3FBE:41B97FB20E427A9FDBBB358D9262255D:\ -B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE - -8B7CFBE37DE7DCA793521819242C5816:C1940F703D845F957652C2D64ABD7ADF:\ -E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 - -F23F033C0EEBF8EC55752662FD58CE68:D2D44FCDAE5332343366DB297EFCF21B:\ -08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E - -59EB34F6C8BDBACC5FC6AD73A59A1301:EA8196B79DBE167B6AA9896E287EED2B:\ -30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 - -DCDE8B6BD5CF7CC22D9505E3CE81261A:D6B0B0C4BA6C7DBE5ED467A1E3F06C2D:\ -58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E - -E33CF7E524FED781E7042FF9F4B35DC7:EC51EB295250C22C2FB01816FB72BCAE:\ -80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 - -27963C8FACDF73062867D164DF6D064C:ADED6630A07CE9C7408A155D3BD0D36F:\ -A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE - -77B1CE386B551B995F2F2A1DA994EEF8:697C9245B9937F32F5D1C82319F0363A:\ -D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 - -F083388B013679EFCF0BB9B15D52AE5C:AAD5AD50C6262AAEC30541A1B7B5B19C:\ -F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E - -C5009E0DAB55DB0ABDB636F2600290C8:7D34B893855341EC625BD6875AC18C0D:\ -20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 - -7804881E26CD532D8514D3683F00F1B9:7EF05105440F83862F5D780E88F02B41:\ -48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E - -46CDDCD73D1EB53E675CA012870A92A3:C377C06403382061AF2C9C93A8E70DF6:\ -70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 - -A9FB44062BB07FE130A8E8299EACB1AB:1DBDB3FFDC052DACC83318853ABC6DE5:\ -98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE - -2B6FF8D7A5CC3A28A22D5A6F221AF26B:69A6EAB00432517D0BF483C91C0963C7:\ -C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 - -1A9527C29B8ADD4B0E3E656DBB2AF8B4:0797F41DC217C80446E1D514BD6AB197:\ -E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E - -7F99CF2C75244DF015EB4B0C1050AEAE:9DFD76575902A637C01343C58E011A03:\ -10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 - -E84FF85B0D9454071909C1381646C4ED:ACF4328AE78F34B9FA9B459747CC2658:\ -38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E - -89AFD40F99521280D5399B12404F6DB4:B0479AEA12BAC4FE2384CF98995150C6:\ -60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 - -A09EF32DBC5119A35AB7FA38656F0329:9DD52789EFE3FFB99F33B3DA5030109A:\ -88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE - -61773457F068C376C7829B93E696E716:ABBB755E4621EF8F1214C19F649FB9FD:\ -B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 - -A34F0CAE726CCE41DD498747D891B967:DA27FB8174357BCE2BED0E7354F380F9:\ -D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE - -856F59496C7388EE2D2B1A27B7697847:C59A0663F0993838F6E5856593BDC5EF:\ -00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 - -CB090C593EF7720BD95908FB93B49DF4:ED60B264B5213E831607A99C0CE5E57E:\ -28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E - -A0AC75CD2F1923D460FC4D457AD95BAF:E50548746846F3EB77B8C520640884ED:\ -50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 - -2A2B282974777689E8E9EEEF525D5C5F:28282CC7D21D6A2923641E52D188EF0C:\ -78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E - -909192939390919E0F0E09089788898A:0DFA5B02ABB18E5A815305216D6D4F8E:\ -A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 - -777675748D8E8F907170777649464744:7359635C0EECEFE31D673395FB46FB99:\ -C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE - -717073720605040B2D2C2B2A05FAFBF9:73C679F7D5AEF2745C9737BB4C47FB36:\ -F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 - -64656667FEFDFCC31B1A1D1CA5AAABA8:B192BD472A4D2EAFB786E97458967626:\ -18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E - -DBDAD9D86A696867B5B4B3B2C8D7D6D5:0EC327F6C8A2B147598CA3FDE61DC6A4:\ -40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 - -5C5D5E5FE3E0E1FE31303736333C3D3E:FC418EB3C41B859B38D4B6F646629729:\ -68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E - -545556574B48494673727574546B6A69:30249E5AC282B1C981EA64B609F3A154:\ -90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 - -ECEDEEEFC6C5C4BB56575051F5FAFBF8:5E6E08646D12150776BB43C2D78A9703:\ -B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE - -464744452724252AC9C8CFCED2CDCCCF:FAEB3D5DE652CD3447DCEB343F30394A:\ -E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 - -E6E7E4E54142435C878681801C131211:A8E88706823F6993EF80D05C1C7B2CF0:\ -08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E - -72737071CFCCCDC2F9F8FFFE710E0F0C:8CED86677E6E00A1A1B15968F2D3CCE6:\ -30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 - -505152537370714EC3C2C5C4010E0F0C:9FC7C23858BE03BDEBB84E90DB6786A9:\ -58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E - -A8A9AAAB5C5F5E51AEAFA8A93D222320:B4FBD65B33F70D8CF7F1111AC4649C36:\ -80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 - -DEDFDCDDF6F5F4EB10111617FEF1F0F3:C5C32D5ED03C4B53CC8C1BD0EF0DBBF6:\ -A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE - -BDBCBFBE5E5D5C530B0A0D0CFAC5C4C7:D1A7F03B773E5C212464B63709C6A891:\ -D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 - -8A8B8889050606F8F4F5F2F3636C6D6E:6B7161D8745947AC6950438EA138D028:\ -F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E - -A6A7A4A54D4E4F40B2B3B4B539262724:FD47A9F7E366EE7A09BC508B00460661:\ -20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 - -9C9D9E9FE9EAEBF40E0F08099B949596:00D40B003DC3A0D9310B659B98C7E416:\ -48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E - -2D2C2F2E1013121DCCCDCACBED121310:EEA4C79DCC8E2BDA691F20AC48BE0717:\ -70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 - -F4F5F6F7EDEEEFD0EAEBECEDF7F8F9FA:E78F43B11C204403E5751F89D05A2509:\ -98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE - -3D3C3F3E282B2A2573727574150A0B08:D0F0E3D1F1244BB979931E38DD1786EF:\ -C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 - -B6B7B4B5F8FBFAE5B4B5B2B3A0AFAEAD:042E639DC4E1E4DDE7B75B749EA6F765:\ -E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E - -B7B6B5B4989B9A95878681809BA4A5A6:BC032FDD0EFE29503A980A7D07AB46A8:\ -10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 - -A8A9AAABE5E6E798E9E8EFEE4748494A:0C93AC949C0DA6446EFFB86183B6C910:\ -38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E - -ECEDEEEFD9DADBD4B9B8BFBE657A7B78:E0D343E14DA75C917B4A5CEC4810D7C2:\ -60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 - -7F7E7D7C696A6B74CACBCCCD929D9C9F:0EAFB821748408279B937B626792E619:\ -88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE - -08090A0B0605040BFFFEF9F8B9C6C7C4:FA1AC6E02D23B106A1FEF18B274A553F:\ -B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 - -08090A0BF1F2F3CCFCFDFAFB68676665:0DADFE019CD12368075507DF33C1A1E9:\ -D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE - -CACBC8C93A393837050403020D121310:3A0879B414465D9FFBAF86B33A63A1B9:\ -00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 - -E9E8EBEA8281809F8F8E8988343B3A39:62199FADC76D0BE1805D3BA0B7D914BF:\ -28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E - -515053524645444BD0D1D6D7340B0A09:1B06D6C5D333E742730130CF78E719B4:\ -50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 - -42434041ECEFEE1193929594C6C9C8CB:F1F848824C32E9DCDCBF21580F069329:\ -78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E - -EFEEEDECC2C1C0CF76777071455A5B58:1A09050CBD684F784D8E965E0782F28A:\ -A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 - -5F5E5D5C3F3C3D221D1C1B1A19161714:79C2969E7DED2BA7D088F3F320692360:\ -C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE - -000102034142434C1C1D1A1B8D727371:091A658A2F7444C16ACCB669450C7B63:\ -F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 - -8E8F8C8DB1B2B38C56575051050A0B08:97C1E3A72CCA65FA977D5ED0E8A7BBFC:\ -18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E - -A7A6A5A4E8EBEAE57F7E7978CAD5D4D7:70C430C6DB9A17828937305A2DF91A2A:\ -40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 - -8A8B888994979689454443429F909192:629553457FBE2479098571C7C903FDE8:\ -68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E - -8C8D8E8FE0E3E2ED45444342F1CECFCC:A25B25A61F612669E7D91265C7D476BA:\ -90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 - -FFFEFDFC4C4F4E31D8D9DEDFB6B9B8BB:EB7E4E49B8AE0F024570DDA293254FED:\ -B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE - -FDFCFFFECCCFCEC12F2E29286679787B:38FE15D61CCA84516E924ADCE5014F67:\ -E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 - -67666564BAB9B8A77071767719161714:3AD208492249108C9F3EBEB167AD0583:\ -08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E - -9A9B98992D2E2F2084858283245B5A59:299BA9F9BF5AB05C3580FC26EDD1ED12:\ -30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 - -A4A5A6A70B0809365C5D5A5B2C232221:19DC705B857A60FB07717B2EA5717781:\ -58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E - -464744455754555AF3F2F5F4AFB0B1B2:FFC8AEB885B5EFCAD06B6DBEBF92E76B:\ -80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 - -323330317675746B7273747549464744:F58900C5E0B385253FF2546250A0142B:\ -A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE - -A8A9AAAB181B1A15808186872B141516:2EE67B56280BC462429CEE6E3370CBC1:\ -D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 - -E7E6E5E4202323DDAAABACAD343B3A39:20DB650A9C8E9A84AB4D25F7EDC8F03F:\ -F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E - -A8A9AAAB2221202FEDECEBEA1E010003:3C36DA169525CF818843805F25B78AE5:\ -20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 - -F9F8FBFA5F5C5D42424344450E010003:9A781D960DB9E45E37779042FEA51922:\ -48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E - -57565554F5F6F7F89697909120DFDEDD:6560395EC269C672A3C288226EFDBA77:\ -70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 - -F8F9FAFBCCCFCEF1DDDCDBDA0E010003:8C772B7A189AC544453D5916EBB27B9A:\ -98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE - -D9D8DBDA7073727D80818687C2DDDCDF:77CA5468CC48E843D05F78EED9D6578F:\ -C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 - -C5C4C7C6080B0A1588898E8F68676665:72CDCC71DC82C60D4429C9E2D8195BAA:\ -E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E - -83828180DCDFDED186878081F0CFCECD:8080D68CE60E94B40B5B8B69EEB35AFA:\ -10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 - -98999A9BDDDEDFA079787F7E0A050407:44222D3CDE299C04369D58AC0EBA1E8E:\ -38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E - -CECFCCCD4F4C4D429F9E9998DFC0C1C2:9B8721B0A8DFC691C5BC5885DBFCB27A:\ -60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 - -404142436665647B29282F2EABA4A5A6:0DC015CE9A3A3414B5E62EC643384183:\ -88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE - -33323130E6E5E4EB23222524DEA1A0A3:705715448A8DA412025CE38345C2A148:\ -B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 - -CFCECDCCF6F5F4CBE6E7E0E199969794:C32B5B0B6FBAE165266C569F4B6ECF0B:\ -D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE - -BABBB8B97271707FDCDDDADB29363734:4DCA6C75192A01DDCA9476AF2A521E87:\ -00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 - -C9C8CBCA4447465926272021545B5A59:058691E627ECBC36AC07B6DB423BD698:\ -28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E - -050407067477767956575051221D1C1F:7444527095838FE080FC2BCDD30847EB:\ -50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 - 00000000000000000000000000000000:0EDD33D3C621E546455BD8BA1418BEC8:\ 80000000000000000000000000000000 @@ -1546,6 +889,775 @@ C9C8CBCA4447465926272021545B5A59:058691E627ECBC36AC07B6DB423BD698:\ 00000000000000000000000000000000:0545AAD56DA2A97C3663D1432A3D1C84:\ 00000000000000000000000000000001 +80000000000000000000000000000000:3AD78E726C1EC02B7EBFE92B23D9EC34:\ +00000000000000000000000000000000 + +40000000000000000000000000000000:45BC707D29E8204D88DFBA2F0B0CAD9B:\ +00000000000000000000000000000000 + +20000000000000000000000000000000:161556838018F52805CDBD6202002E3F:\ +00000000000000000000000000000000 + +10000000000000000000000000000000:F5569B3AB6A6D11EFDE1BF0A64C6854A:\ +00000000000000000000000000000000 + +08000000000000000000000000000000:64E82B50E501FBD7DD4116921159B83E:\ +00000000000000000000000000000000 + +04000000000000000000000000000000:BAAC12FB613A7DE11450375C74034041:\ +00000000000000000000000000000000 + +02000000000000000000000000000000:BCF176A7EAAD8085EBACEA362462A281:\ +00000000000000000000000000000000 + +01000000000000000000000000000000:47711816E91D6FF059BBBF2BF58E0FD3:\ +00000000000000000000000000000000 + +00800000000000000000000000000000:B970DFBE40698AF1638FE38BD3DF3B2F:\ +00000000000000000000000000000000 + +00400000000000000000000000000000:F95B59A44F391E14CF20B74BDC32FCFF:\ +00000000000000000000000000000000 + +00200000000000000000000000000000:720F74AE04A2A435B9A7256E49378F5B:\ +00000000000000000000000000000000 + +00100000000000000000000000000000:2A0445F61D36BFA7E277070730CF76DA:\ +00000000000000000000000000000000 + +00080000000000000000000000000000:8D0536B997AEFEC1D94011BAB6699A03:\ +00000000000000000000000000000000 + +00040000000000000000000000000000:674F002E19F6ED47EFF319E51FAD4498:\ +00000000000000000000000000000000 + +00020000000000000000000000000000:292C02C5CB9163C80AC0F6CF1DD8E92D:\ +00000000000000000000000000000000 + +00010000000000000000000000000000:FA321CF18EF5FE727DD82A5C1E945141:\ +00000000000000000000000000000000 + +00008000000000000000000000000000:A5A7AFE1034C39CCCEBE3C584BC0BE05:\ +00000000000000000000000000000000 + +00004000000000000000000000000000:4FF5A52E697E77D081205DBDB21CEA39:\ +00000000000000000000000000000000 + +00002000000000000000000000000000:209E88DC94C9003000CE0769AF7B7166:\ +00000000000000000000000000000000 + +00001000000000000000000000000000:5DEE41AF864CB4B650E5F51551824D38:\ +00000000000000000000000000000000 + +00000800000000000000000000000000:A79A63FA7E4503AE6D6E09F5F9053030:\ +00000000000000000000000000000000 + +00000400000000000000000000000000:A48316749FAE7FAC7002031A6AFD8BA7:\ +00000000000000000000000000000000 + +00000200000000000000000000000000:D6EEE8A7357A0E1D64262CA9C337AC42:\ +00000000000000000000000000000000 + +00000100000000000000000000000000:B013CA8A62A858053E9FB667ED39829E:\ +00000000000000000000000000000000 + +00000080000000000000000000000000:DF6EA9E4538A45A52D5C1A43C88F4B55:\ +00000000000000000000000000000000 + +00000040000000000000000000000000:7D03BA451371591D3FD5547D9165C73B:\ +00000000000000000000000000000000 + +00000020000000000000000000000000:0E0426281A6277E186499D365D5F49FF:\ +00000000000000000000000000000000 + +00000010000000000000000000000000:DBC02169DD2059E6CC4C57C1FEDF5AB4:\ +00000000000000000000000000000000 + +00000008000000000000000000000000:826590E05D167DA6F00DCC75E22788EB:\ +00000000000000000000000000000000 + +00000004000000000000000000000000:34A73F21A04421D9786335FAAB49423A:\ +00000000000000000000000000000000 + +00000002000000000000000000000000:ED347D0E0128EE1A7392A1D36AB78AA9:\ +00000000000000000000000000000000 + +00000001000000000000000000000000:EE944B2FE6E9FC888042608DA9615F75:\ +00000000000000000000000000000000 + +00000000800000000000000000000000:9E7C85A909EF7218BA7947CFB4718F46:\ +00000000000000000000000000000000 + +00000000400000000000000000000000:811AE07A0B2B1F816587FA73699AE77D:\ +00000000000000000000000000000000 + +00000000200000000000000000000000:68466FBF43C2FE13D4B18F7EC5EA745F:\ +00000000000000000000000000000000 + +00000000100000000000000000000000:D20B015C7191B219780956E6101F9354:\ +00000000000000000000000000000000 + +00000000080000000000000000000000:5939D5C1BBF54EE1B3E326D757BDDE25:\ +00000000000000000000000000000000 + +00000000040000000000000000000000:B1FDAFE9A0240E8FFEA19CE94B5105D3:\ +00000000000000000000000000000000 + +00000000020000000000000000000000:D62962ECE02CDD68C06BDFEFB2F9495B:\ +00000000000000000000000000000000 + +00000000010000000000000000000000:B3BB2DE6F3C26587BA8BAC4F7AD9499A:\ +00000000000000000000000000000000 + +00000000008000000000000000000000:E0B1072D6D9FF703D6FBEF77852B0A6B:\ +00000000000000000000000000000000 + +00000000004000000000000000000000:D8DD51C907F478DE0228E83E61FD1758:\ +00000000000000000000000000000000 + +00000000002000000000000000000000:A42DFFE6E7C1671C06A25236FDD10017:\ +00000000000000000000000000000000 + +00000000001000000000000000000000:25ACF141550BFAB9EF451B6C6A5B2163:\ +00000000000000000000000000000000 + +00000000000800000000000000000000:4DA7FCA3949B16E821DBC84F19581018:\ +00000000000000000000000000000000 + +00000000000400000000000000000000:7D49B6347CBCC8919C7FA96A37A7A215:\ +00000000000000000000000000000000 + +00000000000200000000000000000000:900024B29A08C6721B95BA3B753DDB4D:\ +00000000000000000000000000000000 + +00000000000100000000000000000000:6D2182FB283B6934D90BA7848CAB5E66:\ +00000000000000000000000000000000 + +00000000000080000000000000000000:F73EF01B448D23A4D90DE8B2F9666E7A:\ +00000000000000000000000000000000 + +00000000000040000000000000000000:4AD9CDA2418643E9A3D926AF5E6B0412:\ +00000000000000000000000000000000 + +00000000000020000000000000000000:7CAEC8E7E5953997D545B033201C8C5B:\ +00000000000000000000000000000000 + +00000000000010000000000000000000:3C43CA1F6B6864503E27B48D88230CF5:\ +00000000000000000000000000000000 + +00000000000008000000000000000000:44F779B93108FE9FEEC880D79BA74488:\ +00000000000000000000000000000000 + +00000000000004000000000000000000:9E50E8D9CFD3A682A78E527C9072A1CF:\ +00000000000000000000000000000000 + +00000000000002000000000000000000:68D000CBC838BBE3C505D6F814C01F28:\ +00000000000000000000000000000000 + +00000000000001000000000000000000:2CB2A9FEC1ACD1D9B0FA05205E304F57:\ +00000000000000000000000000000000 + +00000000000000800000000000000000:01EB2806606E46444520A5CC6180CD4B:\ +00000000000000000000000000000000 + +00000000000000400000000000000000:DAA9B25168CC702326F217F1A0C0B162:\ +00000000000000000000000000000000 + +00000000000000200000000000000000:3E07E648975D9578D03555B1755807ED:\ +00000000000000000000000000000000 + +00000000000000100000000000000000:0B45F52E802C8B8DE09579425B80B711:\ +00000000000000000000000000000000 + +00000000000000080000000000000000:659595DA0B68F6DF0DD6CA77202986E1:\ +00000000000000000000000000000000 + +00000000000000040000000000000000:05FF42873893536E58C8FA98A45C73C4:\ +00000000000000000000000000000000 + +00000000000000020000000000000000:B5B03421DE8BBFFC4EADEC767339A9BD:\ +00000000000000000000000000000000 + +00000000000000010000000000000000:788BCD111ECF73D4E78D2E21BEF55460:\ +00000000000000000000000000000000 + +00000000000000008000000000000000:909CD9EC6790359F982DC6F2393D5315:\ +00000000000000000000000000000000 + +00000000000000004000000000000000:332950F361535FF24EFAC8C76293F12C:\ +00000000000000000000000000000000 + +00000000000000002000000000000000:A68CCD4E330FFDA9D576DA436DB53D75:\ +00000000000000000000000000000000 + +00000000000000001000000000000000:27C8A1CCFDB0B015D1ED5B3E77143791:\ +00000000000000000000000000000000 + +00000000000000000800000000000000:D76A4B95887A77DF610DD3E1D3B20325:\ +00000000000000000000000000000000 + +00000000000000000400000000000000:C068AB0DE71C66DAE83C361EF4B2D989:\ +00000000000000000000000000000000 + +00000000000000000200000000000000:C2120BCD49EDA9A288B3B4BE79AC8158:\ +00000000000000000000000000000000 + +00000000000000000100000000000000:0C546F62BF2773CD0F564FCECA7BA688:\ +00000000000000000000000000000000 + +00000000000000000080000000000000:18F3462BEDE4920213CCB66DAB1640AA:\ +00000000000000000000000000000000 + +00000000000000000040000000000000:FE42F245EDD0E24B216AEBD8B392D690:\ +00000000000000000000000000000000 + +00000000000000000020000000000000:3D3EEBC8D3D1558A194C2D00C337FF2B:\ +00000000000000000000000000000000 + +00000000000000000010000000000000:29AAEDF043E785DB42836F79BE6CBA28:\ +00000000000000000000000000000000 + +00000000000000000008000000000000:215F90C6744E2944358E78619159A611:\ +00000000000000000000000000000000 + +00000000000000000004000000000000:8606B1AA9E1D548E5442B06551E2C6DC:\ +00000000000000000000000000000000 + +00000000000000000002000000000000:987BB4B8740EC0EDE7FEA97DF033B5B1:\ +00000000000000000000000000000000 + +00000000000000000001000000000000:C0A3500DA5B0AE07D2F450930BEEDF1B:\ +00000000000000000000000000000000 + +00000000000000000000800000000000:525FDF8312FE8F32C781481A8DAAAE37:\ +00000000000000000000000000000000 + +00000000000000000000400000000000:BFD2C56AE5FB9C9DE33A6944572A6487:\ +00000000000000000000000000000000 + +00000000000000000000200000000000:7975A57A425CDF5AA1FA929101F650B0:\ +00000000000000000000000000000000 + +00000000000000000000100000000000:BF174BC49609A8709B2CD8366DAA79FE:\ +00000000000000000000000000000000 + +00000000000000000000080000000000:06C50C43222F56C874B1704E9F44BF7D:\ +00000000000000000000000000000000 + +00000000000000000000040000000000:0CEC48CD34043EA29CA3B8ED5278721E:\ +00000000000000000000000000000000 + +00000000000000000000020000000000:9548EA34A1560197B304D0ACB8A1698D:\ +00000000000000000000000000000000 + +00000000000000000000010000000000:22F9E9B1BD73B6B5B7D3062C986272F3:\ +00000000000000000000000000000000 + +00000000000000000000008000000000:FEE8E934BD0873295059002230E298D4:\ +00000000000000000000000000000000 + +00000000000000000000004000000000:1B08E2E3EB820D139CB4ABBDBE81D00D:\ +00000000000000000000000000000000 + +00000000000000000000002000000000:0021177681E4D90CEAF69DCED0145125:\ +00000000000000000000000000000000 + +00000000000000000000001000000000:4A8E314452CA8A8A3619FC54BC423643:\ +00000000000000000000000000000000 + +00000000000000000000000800000000:65047474F7222C94C6965425FF1BFD0A:\ +00000000000000000000000000000000 + +00000000000000000000000400000000:E123F551A9C4A8489622B16F961A9AA4:\ +00000000000000000000000000000000 + +00000000000000000000000200000000:EF05530948B80915028BB2B6FE429380:\ +00000000000000000000000000000000 + +00000000000000000000000100000000:72535B7FE0F0F777CEDCD55CD77E2DDF:\ +00000000000000000000000000000000 + +00000000000000000000000080000000:3423D8EFC31FA2F4C365C77D8F3B5C63:\ +00000000000000000000000000000000 + +00000000000000000000000040000000:DE0E51C264663F3C5DBC59580A98D8E4:\ +00000000000000000000000000000000 + +00000000000000000000000020000000:B2D9391166680947AB09264156719679:\ +00000000000000000000000000000000 + +00000000000000000000000010000000:10DB79F23B06D263835C424AF749ADB7:\ +00000000000000000000000000000000 + +00000000000000000000000008000000:DDF72D27E6B01EC107EA3E005B59563B:\ +00000000000000000000000000000000 + +00000000000000000000000004000000:8266B57485A5954A4236751DE07F6694:\ +00000000000000000000000000000000 + +00000000000000000000000002000000:669A501E1F1ADE6E5523DE01D6DBC987:\ +00000000000000000000000000000000 + +00000000000000000000000001000000:C20C48F2989725D461D1DB589DC0896E:\ +00000000000000000000000000000000 + +00000000000000000000000000800000:DE35158E7810ED1191825D2AA98FA97D:\ +00000000000000000000000000000000 + +00000000000000000000000000400000:4FE294F2C0F34D0671B693A237EBDDC8:\ +00000000000000000000000000000000 + +00000000000000000000000000200000:087AE74B10CCBFDF6739FEB9559C01A4:\ +00000000000000000000000000000000 + +00000000000000000000000000100000:5DC278970B7DEF77A5536C77AB59C207:\ +00000000000000000000000000000000 + +00000000000000000000000000080000:7607F078C77085184EAA9B060C1FBFFF:\ +00000000000000000000000000000000 + +00000000000000000000000000040000:9DB841531BCBE7998DAD19993FB3CC00:\ +00000000000000000000000000000000 + +00000000000000000000000000020000:D6A089B654854A94560BAE13298835B8:\ +00000000000000000000000000000000 + +00000000000000000000000000010000:E1E223C4CF90CC5D195B370D65114622:\ +00000000000000000000000000000000 + +00000000000000000000000000008000:1CBED73C50D053BDAD372CEEE54836A1:\ +00000000000000000000000000000000 + +00000000000000000000000000004000:D309E69376D257ADF2BFDA152B26555F:\ +00000000000000000000000000000000 + +00000000000000000000000000002000:740F7649117F0DEE6EAA7789A9994C36:\ +00000000000000000000000000000000 + +00000000000000000000000000001000:76AE64417C297184D668C5FD908B3CE5:\ +00000000000000000000000000000000 + +00000000000000000000000000000800:6095FEA4AA8035591F1787A819C48787:\ +00000000000000000000000000000000 + +00000000000000000000000000000400:D1FF4E7ACD1C79967FEBAB0F7465D450:\ +00000000000000000000000000000000 + +00000000000000000000000000000200:5F5AD3C42B9489557BB63BF49ECF5F8A:\ +00000000000000000000000000000000 + +00000000000000000000000000000100:FB56CC09B680B1D07C5A52149E29F07C:\ +00000000000000000000000000000000 + +00000000000000000000000000000080:FF49B8DF4A97CBE03833E66197620DAD:\ +00000000000000000000000000000000 + +00000000000000000000000000000040:5E070ADE533D2E090ED0F5BE13BC0983:\ +00000000000000000000000000000000 + +00000000000000000000000000000020:3AB4FB1D2B7BA376590A2C241D1F508D:\ +00000000000000000000000000000000 + +00000000000000000000000000000010:58B2431BC0BEDE02550F40238969EC78:\ +00000000000000000000000000000000 + +00000000000000000000000000000008:0253786E126504F0DAB90C48A30321DE:\ +00000000000000000000000000000000 + +00000000000000000000000000000004:200211214E7394DA2089B6ACD093ABE0:\ +00000000000000000000000000000000 + +00000000000000000000000000000002:0388DACE60B6A392F328C2B971B2FE78:\ +00000000000000000000000000000000 + +00000000000000000000000000000001:58E2FCCEFA7E3061367F1D57A4E7455A:\ +00000000000000000000000000000000 + +[AES-192] +2D33EEF2C0430A8A9EBF45E809C40BB6:DFF4945E0336DF4C1C56BC700EFF837F:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C + +6AA375D1FA155A61FB72353E0A5A8756:B6FDDEF4752765E347D5D2DC196D1252:\ +1E1F20212324252628292A2B2D2E2F30323334353738393A + +BC3736518B9490DCB8ED60EB26758ED4:D23684E3D963B3AFCF1A114ACA90CBD6:\ +3C3D3E3F41424344464748494B4C4D4E5051525355565758 + +AA214402B46CFFB9F761EC11263A311E:3A7AC027753E2A18C2CEAB9E17C11FD0:\ +5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +02AEA86E572EEAB66B2C3AF5E9A46FD6:8F6786BD007528BA26603C1601CDD0D8:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 + +E2AEF6ACC33B965C4FA1F91C75FF6F36:D17D073B01E71502E28B47AB551168B3:\ +969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 + +0659DF46427162B9434865DD9499F91D:A469DA517119FAB95876F41D06D40FFA:\ +B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 + +49A44239C748FEB456F59C276A5658DF:6091AA3B695C11F5C0B6AD26D3D862FF:\ +D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +66208F6E9D04525BDEDB2733B6A6BE37:70F9E67F9F8DF1294131662DC6E69364:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C + +3393F8DFC729C97F5480B950BC9666B0:D154DCAFAD8B207FA5CBC95E9996B559:\ +0E0F10111314151618191A1B1D1E1F20222324252728292A + +606834C8CE063F3234CF1145325DBD71:4934D541E8B46FA339C805A7AEB9E5DA:\ +2C2D2E2F31323334363738393B3C3D3E4041424345464748 + +FEC1C04F529BBD17D8CECFCC4718B17F:62564C738F3EFE186E1A127A0C4D3C61:\ +4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +32DF99B431ED5DC5ACF8CAF6DC6CE475:07805AA043986EB23693E23BEF8F3438:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 + +7FDC2B746F3F665296943B83710D1F82:DF0B4931038BADE848DEE3B4B85AA44B:\ +868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 + +8FBA1510A3C5B87E2EAA3F7A91455CA2:592D5FDED76582E4143C65099309477C:\ +A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 + +2C9B468B1C2EED92578D41B0716B223B:C9B8D6545580D3DFBCDD09B954ED4E92:\ +C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +0A2BBF0EFC6BC0034F8A03433FCA1B1A:5DCCD5D6EB7C1B42ACB008201DF707A0:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC + +25260E1F31F4104D387222E70632504B:A2A91682FFEB6ED1D34340946829E6F9:\ +FEFE01010304050608090A0B0D0E0F10121314151718191A + +C527D25A49F08A5228D338642AE65137:E45D185B797000348D9267960A68435D:\ +1C1D1E1F21222324262728292B2C2D2E3031323335363738 + +3B49FC081432F5890D0E3D87E884A69E:45E060DAE5901CDA8089E10D4F4C246B:\ +3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +D173F9ED1E57597E166931DF2754A083:F6951AFACC0079A369C71FDCFF45DF50:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 + +8C2B7CAFA5AFE7F13562DAEAE1ADEDE0:9E95E00F351D5B3AC3D0E22E626DDAD6:\ +767778797B7C7D7E80818283858687888A8B8C8D8F909192 + +AAF4EC8C1A815AEB826CAB741339532C:9CB566FF26D92DAD083B51FDC18C173C:\ +94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 + +40BE8C5D9108E663F38F1A2395279ECF:C9C82766176A9B228EB9A974A010B4FB:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC + +0C8AD9BC32D43E04716753AA4CFBE351:D8E26AA02945881D5137F1C1E1386E88:\ +2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 + +1407B1D5F87D63357C8DC7EBBAEBBFEE:C0E024CCD68FF5FFA4D139C355A77C55:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 + +E62734D1AE3378C4549E939E6F123416:0B18B3D16F491619DA338640DF391D43:\ +84858687898A8B8C8E8F90919394959698999A9B9D9E9FA0 + +5A752CFF2A176DB1A1DE77F2D2CDEE41:DBE09AC8F66027BF20CB6E434F252EFC:\ +A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +A9C8C3A4EABEDC80C64730DDD018CD88:6D04E5E43C5B9CBE05FEB9606B6480FE:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDC + +EE9B3DBBDB86180072130834D305999A:DD1D6553B96BE526D9FEE0FBD7176866:\ +1A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +A7FA8C3586B8EBDE7568EAD6F634A879:0260CA7E3F979FD015B0DD4690E16D2A:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354 + +37E0F4A87F127D45AC936FE7AD88C10A:9893734DE10EDCC8A67C3B110B8B8CC6:\ +929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +3F77D8B5D92BAC148E4E46F697A535C5:93B30B750516B2D18808D710C2EE84EF:\ +464748494B4C4D4E50515253555657585A5B5C5D5F606162 + +D25EBB686C40F7E2C4DA1014936571CA:16F65FA47BE3CB5E6DFE7C6C37016C0E:\ +828384858788898A8C8D8E8F91929394969798999B9C9D9E + +4F1C769D1E5B0552C7ECA84DEA26A549:F3847210D5391E2360608E5ACB560581:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBC + +8548E2F882D7584D0FAFC54372B6633A:8754462CD223366D0753913E6AF2643D:\ +BEBFC0C1C3C4C5C6C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA + +87D7A336CB476F177CD2A51AF2A62CDF:1EA20617468D1B806A1FD58145462017:\ +DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8 + +03B1FEAC668C4E485C1065DFC22B44EE:3B155D927355D737C6BE9DDA60136E2E:\ +FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +BDA15E66819FA72D653A6866AA287962:26144F7B66DAA91B6333DBD3850502B3:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334 + +4D0C7A0D2505B80BF8B62CEB12467F0A:E4F9A4AB52CED8134C649BF319EBCC90:\ +363738393B3C3D3E40414243454647484A4B4C4D4F505152 + +626D34C9429B37211330986466B94E5F:B9DDD29AC6128A6CAB121E34A4C62B36:\ +54555657595A5B5C5E5F60616364656668696A6B6D6E6F70 + +333C3E6BF00656B088A17E5FF0E7F60A:6FCDDAD898F2CE4EFF51294F5EAAF5C9:\ +727374757778797A7C7D7E7F81828384868788898B8C8D8E + +687ED0CDC0D2A2BC8C466D05EF9D2891:C9A6FE2BF4028080BEA6F7FC417BD7E3:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABAC + +487830E78CC56C1693E64B2A6660C7B6:6A2026846D8609D60F298A9C0673127F:\ +AEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA + +7A48D6B7B52B29392AA2072A32B66160:2CB25C005E26EFEA44336C4C97A4240B:\ +CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8 + +907320E64C8C5314D10F8D7A11C8618D:496967AB8680DDD73D09A0E4C7DCC8AA:\ +EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +B561F2CA2D6E65A4A98341F3ED9FF533:D5AF94DE93487D1F3A8C577CB84A66A4:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324 + +DF769380D212792D026F049E2E3E48EF:84BDAC569CAE2828705F267CC8376E90:\ +262728292B2C2D2E30313233353637383A3B3C3D3F404142 + +79F374BC445BDABF8FCCB8843D6054C6:F7401DDA5AD5AB712B7EB5D10C6F99B6:\ +44454647494A4B4C4E4F50515354555658595A5B5D5E5F60 + +4E02F1242FA56B05C68DBAE8FE44C9D6:1C9D54318539EBD4C3B5B7E37BF119F0:\ +626364656768696A6C6D6E6F71727374767778797B7C7D7E + +CF73C93CBFF57AC635A6F4AD2A4A1545:ACA572D65FB2764CFFD4A6ECA090EA0D:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C + +9923548E2875750725B886566784C625:36D9C627B8C2A886A10CCB36EAE3DFBB:\ +9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA + +4888336B723A022C9545320F836A4207:010EDBF5981E143A81D646E597A4A568:\ +BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8 + +F84D9A5561B0608B1160DEE000C41BA8:8DB44D538DC20CC2F40F3067FD298E60:\ +DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +C23192A0418E30A19B45AE3E3625BF22:930EB53BC71E6AC4B82972BDCD5AAFB3:\ +F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314 + +B84E0690B28B0025381AD82A15E501A7:6C42A81EDCBC9517CCD89C30C95597B4:\ +161718191B1C1D1E20212223252627282A2B2C2D2F303132 + +ACEF5E5C108876C4F06269F865B8F0B0:DA389847AD06DF19D76EE119C71E1DD3:\ +34353637393A3B3C3E3F40414344454648494A4B4D4E4F50 + +0F1B3603E0F5DDEA4548246153A5E064:E018FDAE13D3118F9A5D1A647A3F0462:\ +525354555758595A5C5D5E5F61626364666768696B6C6D6E + +FBB63893450D42B58C6D88CD3C1809E3:2AA65DB36264239D3846180FABDFAD20:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C + +4BEF736DF150259DAE0C91354E8A5F92:1472163E9A4F780F1CEB44B07ECF4FDB:\ +8E8F90919394959698999A9B9D9E9FA0A2A3A4A5A7A8A9AA + +7D2D46242056EF13D3C3FC93C128F4C7:C8273FDC8F3A9F72E91097614B62397C:\ +ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8 + +E9C1BA2DF415657A256EDB33934680FD:66C8427DCD733AAF7B3470CB7D976E3F:\ +CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +E23EE277B0AA0A1DFB81F7527C3514F1:146131CB17F1424D4F8DA91E6F80C1D0:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304 + +3E7445B0B63CAAF75E4A911E12106B4C:2610D0AD83659081AE085266A88770DC:\ +060708090B0C0D0E10111213151617181A1B1C1D1F202122 + +767774752023222544455A5BE6E1E0E3:38A2B5A974B0575C5D733917FB0D4570:\ +24252627292A2B2C2E2F30313334353638393A3B3D3E3F40 + +72737475717E7F7CE9E8EBEA696A6B6C:E21D401EBC60DE20D6C486E4F39A588B:\ +424344454748494A4C4D4E4F51525354565758595B5C5D5E + +DFDEDDDC25262728C9C8CFCEF1EEEFEC:E51D5F88C670B079C0CA1F0C2C4405A2:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C + +FFFE0100707776755F5E5D5C7675746B:246A94788A642FB3D1B823C8762380C8:\ +7E7F80818384858688898A8B8D8E8F90929394959798999A + +E0E1E2E3424140479F9E9190292E2F2C:B80C391C5C41A4C3B30C68E0E3D7550F:\ +9C9D9E9FA1A2A3A4A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8 + +2120272690EFEEED3B3A39384E4D4C4B:B77C4754FC64EB9A1154A9AF0BB1F21C:\ +BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +ECEDEEEF5350516EA1A0A7A6A3ACADAE:FB554DE520D159A06BF219FC7F34A02F:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4 + +32333C3D25222320E9E8EBEACECDCCC3:A89FBA152D76B4927BEED160DDB76C57:\ +F6F7F8F9FBFCFDFE00010203050607080A0B0C0D0F101112 + +40414243626160678A8BB4B511161714:5676EAB4A98D2E8473B3F3D46424247C:\ +14151617191A1B1C1E1F20212324252628292A2B2D2E2F30 + +94959293F5FAFBF81F1E1D1C7C7F7E79:4E8F068BD7EDE52A639036EC86C33568:\ +323334353738393A3C3D3E3F41424344464748494B4C4D4E + +BEBFBCBD191A1B14CFCEC9C8546B6A69:F0193C4D7AFF1791EE4C07EB4A1824FC:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C + +2C2D3233898E8F8CBBBAB9B8333031CE:AC8686EECA9BA761AFE82D67B928C33F:\ +6E6F70717374757678797A7B7D7E7F80828384858788898A + +84858687BFBCBDBA37363938FDFAFBF8:5FAF8573E33B145B6A369CD3606AB2C9:\ +8C8D8E8F91929394969798999B9C9D9EA0A1A2A3A5A6A7A8 + +828384857669686B909192930B08090E:31587E9944AB1C16B844ECAD0DF2E7DA:\ +AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +BEBFBCBD9695948B707176779E919093:D017FECD91148ABA37F6F3068AA67D8A:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4 + +8B8A85846067666521202322D0D3D2DD:788EF2F021A73CBA2794B616078A8500:\ +E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8FAFBFCFDFE010002 + +76777475F1F2F3F4F8F9E6E777707172:5D1EF20DCED6BCBC12131AC7C54788AA:\ +04050607090A0B0C0E0F10111314151618191A1B1D1E1F20 + +A4A5A2A34F404142B4B5B6B727242522:B3C8CF961FAF9EA05FDDE6D1E4D8F663:\ +222324252728292A2C2D2E2F31323334363738393B3C3D3E + +94959697E1E2E3EC16171011839C9D9E:143075C70605861C7FAC6526199E459F:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C + +03023D3C06010003DEDFDCDDFFFCFDE2:A5AE12EADE9A87268D898BFC8FC0252A:\ +5E5F60616364656668696A6B6D6E6F70727374757778797A + +10111213F1F2F3F4CECFC0C1DBDCDDDE:0924F7CF2E877A4819F5244A360DCEA9:\ +7C7D7E7F81828384868788898B8C8D8E9091929395969798 + +67666160724D4C4F1D1C1F1E73707176:3D9E9635AFCC3E291CC7AB3F27D1C99A:\ +9A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +E6E7E4E5A8ABAAD584858283909F9E9D:9D80FEEBF87510E2B8FB98BB54FD788C:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4 + +71707F7E565150537D7C7F7E6162636C:5F9D1A082A1A37985F174002ECA01309:\ +D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 + +64656667212223245555AAAA03040506:A390EBB1D1403930184A44B4876646E4:\ +F4F5F6F7F9FAFBFCFEFE01010304050608090A0B0D0E0F10 + +9E9F9899ABA4A5A6CFCECDCC2B28292E:700FE918981C3195BB6C4BCB46B74E29:\ +121314151718191A1C1D1E1F21222324262728292B2C2D2E + +C7C6C5C4D1D2D3DC626364653A454447:907984406F7BF2D17FB1EB15B673D747:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C + +F6F7E8E9E0E7E6E51D1C1F1E5B585966:C32A956DCFC875C2AC7C7CC8B8CC26E1:\ +4E4F50515354555658595A5B5D5E5F60626364656768696A + +BCBDBEBF5D5E5F5868696667F4F3F2F1:02646E2EBFA9B820CF8424E9B9B6EB51:\ +6C6D6E6F71727374767778797B7C7D7E8081828385868788 + +40414647B0AFAEAD9B9A99989B98999E:621FDA3A5BBD54C6D3C685816BD4EAD8:\ +8A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +69686B6A0201001F0F0E0908B4BBBAB9:D4E216040426DFAF18B152469BC5AC2F:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4 + +C7C6C9C8D8DFDEDD5A5B5859BEBDBCB3:9D0635B9D33B6CDBD71F5D246EA17CC8:\ +C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 + +DEDFDCDD787B7A7DFFFEE1E0B2B5B4B7:10ABAD1BD9BAE5448808765583A2CC1A:\ +E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6F8F9FAFBFDFEFE00 + +4D4C4B4A606F6E6DD0D1D2D3FBF8F9FE:6891889E16544E355FF65A793C39C9A8:\ +020304050708090A0C0D0E0F11121314161718191B1C1D1E + +B7B6B5B4D7D4D5DAE5E4E3E2E1FEFFFC:CC735582E68072C163CD9DDF46B91279:\ +20212223252627282A2B2C2D2F30313234353637393A3B3C + +CECFB0B1F7F0F1F2AEAFACAD3E3D3C23:C5C68B9AEEB7F878DF578EFA562F9574:\ +3E3F40414344454648494A4B4D4E4F50525354555758595A + +CACBC8C9CDCECFC812131C1D494E4F4C:5F4764395A667A47D73452955D0D2CE8:\ +5C5D5E5F61626364666768696B6C6D6E7071727375767778 + +9D9C9B9AD22D2C2FB1B0B3B20C0F0E09:701448331F66106CEFDDF1EB8267C357:\ +7A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +7A7B787964676659959493924F404142:CB3EE56D2E14B4E1941666F13379D657:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4 + +AAABA4A5CEC9C8CB1F1E1D1CABA8A9A6:9FE16EFD18AB6E1981191851FEDB0764:\ +B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 + +93929190282B2A2DC4C5FAFB92959497:3DC9BA24E1B223589B147ADCEB4C8E48:\ +D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6E8E9EAEBEDEEEFF0 + +EFEEE9E8DED1D0D339383B3A888B8A8D:1C333032682E7D4DE5E5AFC05C3E483C:\ +F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +7F7E7D7CA2A1A0AF78797E7F112E2F2C:D593CC99A95AFEF7E92038E05A59D00A:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C + +84859A9B2B2C2D2E868784852625245B:51E7F96F53B4353923452C222134E1EC:\ +2E2F30313334353638393A3B3D3E3F40424344454748494A + +B0B1B2B3070405026869666710171615:4075B357A1A2B473400C3B25F32F81A4:\ +4C4D4E4F51525354565758595B5C5D5E6061626365666768 + +ACADAAABBDA2A3A00D0C0F0E595A5B5C:302E341A3EBCD74F0D55F61714570284:\ +6A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +121310115655544B5253545569666764:57ABDD8231280DA01C5042B78CF76522:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4 + +DEDFD0D166616063EAEBE8E94142434C:17F9EA7EEA17AC1ADF0E190FEF799E92:\ +A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 + +DBDAD9D81417161166677879E0E7E6E5:2E1BDD563DD87EE5C338DD6D098D0A7A:\ +C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6D8D9DADBDDDEDFE0 + +6A6B6C6DE0EFEEED2B2A2928C0C3C2C5:EB869996E6F8BFB2BFDD9E0C4504DBB2:\ +E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +B1B0B3B21714151A1A1B1C1D5649484B:C2E01549E9DECF317468B3E018C61BA8:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C + +39380706A3A4A5A6C4C5C6C77271706F:8DA875D033C01DD463B244A1770F4A22:\ +1E1F20212324252628292A2B2D2E2F30323334353738393A + +5C5D5E5F1013121539383736E2E5E4E7:8BA0DCF3A186844F026D022F8839D696:\ +3C3D3E3F41424344464748494B4C4D4E5051525355565758 + +43424544EAD5D4D72E2F2C2D64676661:E9691FF9A6CC6970E51670A0FD5B88C1:\ +5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +55545756989B9A65F8F9FEFF18171615:F2BAEC06FAEED30F88EE63BA081A6E5B:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 + +05040B0A525554573C3D3E3F4A494847:9C39D4C459AE5753394D6094ADC21E78:\ +969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 + +14151617595A5B5C8584FBFA8E89888B:6345B532A11904502EA43BA99C6BD2B2:\ +B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 + +7C7D7A7BFDF2F3F029282B2A51525354:5FFAE3061A95172E4070CEDCE1E428C8:\ +D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +38393A3B1E1D1C1341404746C23D3C3E:0A4566BE4CDF9ADCE5DEC865B5AB34CD:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C + +8D8C939240474645818083827C7F7E41:CA17FCCE79B7404F2559B22928F126FB:\ +0E0F10111314151618191A1B1D1E1F20222324252728292A + +3B3A39381A19181F32333C3D45424340:97CA39B849ED73A6470A97C821D82F58:\ +2C2D2E2F31323334363738393B3C3D3E4041424345464748 + +F0F1F6F738272625828380817F7C7D7A:8198CB06BC684C6D3E9B7989428DCF7A:\ +4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +89888B8A0407061966676061141B1A19:F53C464C705EE0F28D9A4C59374928BD:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 + +D3D2DDDCAAADACAF9C9D9E9FE8EBEAE5:9ADB3D4CCA559BB98C3E2ED73DBF1154:\ +868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 + 00000000000000000000000000000000:DE885DC87F5A92594082D02CC1E1B42C:\ 800000000000000000000000000000000000000000000000 @@ -2122,6 +2234,775 @@ C9C8CBCA4447465926272021545B5A59:058691E627ECBC36AC07B6DB423BD698:\ 00000000000000000000000000000000:8BAE4EFB70D33A9792EEA9BE70889D72:\ 000000000000000000000000000000000000000000000001 +80000000000000000000000000000000:6CD02513E8D4DC986B4AFE087A60BD0C:\ +000000000000000000000000000000000000000000000000 + +40000000000000000000000000000000:423D2772A0CA56DAABB48D2129062987:\ +000000000000000000000000000000000000000000000000 + +20000000000000000000000000000000:1021F2A8DA70EB2219DC16804445FF98:\ +000000000000000000000000000000000000000000000000 + +10000000000000000000000000000000:C636E35B402577F96974D8804295EBB8:\ +000000000000000000000000000000000000000000000000 + +08000000000000000000000000000000:1566D2E57E8393C19E29F892EA28A9A7:\ +000000000000000000000000000000000000000000000000 + +04000000000000000000000000000000:883C878FED70B36CC09D040F9619DD19:\ +000000000000000000000000000000000000000000000000 + +02000000000000000000000000000000:06734593A974965790E715594FC34AA9:\ +000000000000000000000000000000000000000000000000 + +01000000000000000000000000000000:F19B389948D9A45534E5BD36C984134A:\ +000000000000000000000000000000000000000000000000 + +00800000000000000000000000000000:D8410DFC14FA6D175EC968EA8CAC514C:\ +000000000000000000000000000000000000000000000000 + +00400000000000000000000000000000:7E6C6EBB4029A177CF7B2FDD9AC6BB7A:\ +000000000000000000000000000000000000000000000000 + +00200000000000000000000000000000:4B51DD4850DC0A6C3A46D924003D2C27:\ +000000000000000000000000000000000000000000000000 + +00100000000000000000000000000000:2E510A9D917B15BE32A192B12A668F23:\ +000000000000000000000000000000000000000000000000 + +00080000000000000000000000000000:88F6F79962B0FB77FEA8E7C632D3108E:\ +000000000000000000000000000000000000000000000000 + +00040000000000000000000000000000:A3A35AB1D88DAF07B52794A0F065383A:\ +000000000000000000000000000000000000000000000000 + +00020000000000000000000000000000:DC6CC878433E2B3BB193049A4ECBFC53:\ +000000000000000000000000000000000000000000000000 + +00010000000000000000000000000000:EFCD3763EB7B1A415938248A9A5B4FD5:\ +000000000000000000000000000000000000000000000000 + +00008000000000000000000000000000:AB7E9FB9A66DBE5BB44854F07D9015EE:\ +000000000000000000000000000000000000000000000000 + +00004000000000000000000000000000:8B8E9D3365F8F6743ECF7E33E99255A4:\ +000000000000000000000000000000000000000000000000 + +00002000000000000000000000000000:54D37B4F176FF3D8F6AFC866066D8572:\ +000000000000000000000000000000000000000000000000 + +00001000000000000000000000000000:E83310889480FBF3C00342E3126D0D02:\ +000000000000000000000000000000000000000000000000 + +00000800000000000000000000000000:D321AB2511F92F098174AA2DE6E85DA2:\ +000000000000000000000000000000000000000000000000 + +00000400000000000000000000000000:D8E3F40B1112D5149D58C481DFA9983F:\ +000000000000000000000000000000000000000000000000 + +00000200000000000000000000000000:2454C4E0806639DDF19854D6C68054AD:\ +000000000000000000000000000000000000000000000000 + +00000100000000000000000000000000:A5506D410F7CA32F3955DD79D9D09418:\ +000000000000000000000000000000000000000000000000 + +00000080000000000000000000000000:7908EE40677699568A7DC1AA317C7E4E:\ +000000000000000000000000000000000000000000000000 + +00000040000000000000000000000000:B4B7B29DD43B2F5CF765E25192273982:\ +000000000000000000000000000000000000000000000000 + +00000020000000000000000000000000:92AFE9668159BEFFE2A86F8503260164:\ +000000000000000000000000000000000000000000000000 + +00000010000000000000000000000000:5C36A232FBA6D187A84657AD4028B18F:\ +000000000000000000000000000000000000000000000000 + +00000008000000000000000000000000:A2E994DFAB3A798DF8F54F6DA87E58E2:\ +000000000000000000000000000000000000000000000000 + +00000004000000000000000000000000:6CDAB10A72ADF77D71D0765BAAE95631:\ +000000000000000000000000000000000000000000000000 + +00000002000000000000000000000000:9FE3C801BCAAF7BB800F2E6BF3278E21:\ +000000000000000000000000000000000000000000000000 + +00000001000000000000000000000000:B459D90D9A6C392E5493BC91CF5A0863:\ +000000000000000000000000000000000000000000000000 + +00000000800000000000000000000000:0518A9FA5007F6787E0FB4E5AC27D758:\ +000000000000000000000000000000000000000000000000 + +00000000400000000000000000000000:BED9795415D28599700ED7952384A963:\ +000000000000000000000000000000000000000000000000 + +00000000200000000000000000000000:F0140421173D60251EF6CAB0229B1B50:\ +000000000000000000000000000000000000000000000000 + +00000000100000000000000000000000:460EB4652B3F6779EA28CB11B37529ED:\ +000000000000000000000000000000000000000000000000 + +00000000080000000000000000000000:C4283D351C960A6AC13CD19CCF03AE38:\ +000000000000000000000000000000000000000000000000 + +00000000040000000000000000000000:6815A10047B2C834A798EBDCC6786C75:\ +000000000000000000000000000000000000000000000000 + +00000000020000000000000000000000:99BA19F0CDD5990D0386B32CE56C9C4C:\ +000000000000000000000000000000000000000000000000 + +00000000010000000000000000000000:DE76F62C61E07915162DA13E79679DEC:\ +000000000000000000000000000000000000000000000000 + +00000000008000000000000000000000:DD0325D6854803D06D1D2277D5FB8D67:\ +000000000000000000000000000000000000000000000000 + +00000000004000000000000000000000:580B71A41DE37D6FAC83CCB0B3BB1C97:\ +000000000000000000000000000000000000000000000000 + +00000000002000000000000000000000:E9B1AB470A1B02EF0FF5E6754A092C96:\ +000000000000000000000000000000000000000000000000 + +00000000001000000000000000000000:8590620F5AF5993B7410282F4126BC1F:\ +000000000000000000000000000000000000000000000000 + +00000000000800000000000000000000:8D4914D2F1B22B2E268E66E532D29D7C:\ +000000000000000000000000000000000000000000000000 + +00000000000400000000000000000000:FD826CE48E62C5E30867044B86BA4B56:\ +000000000000000000000000000000000000000000000000 + +00000000000200000000000000000000:100E7B831C9F35FA1271F5F1316C6FCF:\ +000000000000000000000000000000000000000000000000 + +00000000000100000000000000000000:0A2DD0C17F68B996AA96C007003D0B31:\ +000000000000000000000000000000000000000000000000 + +00000000000080000000000000000000:C95F68C57E06B0A2E1F623C83C5D80BF:\ +000000000000000000000000000000000000000000000000 + +00000000000040000000000000000000:571CAFC92C7C8A5EC54C0741E186905C:\ +000000000000000000000000000000000000000000000000 + +00000000000020000000000000000000:22514353E95312C112255E1EED0B2DF6:\ +000000000000000000000000000000000000000000000000 + +00000000000010000000000000000000:791A8BF462BD17580BD9152C6D11C6C5:\ +000000000000000000000000000000000000000000000000 + +00000000000008000000000000000000:5882A0178D548F84A165DB809C60DC28:\ +000000000000000000000000000000000000000000000000 + +00000000000004000000000000000000:3CE4A90EED4458CA6039E42DDADB71C3:\ +000000000000000000000000000000000000000000000000 + +00000000000002000000000000000000:D3CBAB261207A16BE2751E77044FD7C9:\ +000000000000000000000000000000000000000000000000 + +00000000000001000000000000000000:24E32B698A7B32217093628B01F424AB:\ +000000000000000000000000000000000000000000000000 + +00000000000000800000000000000000:9F6AFC0AF27CF565110C77E3C24F4F5B:\ +000000000000000000000000000000000000000000000000 + +00000000000000400000000000000000:E088AA5CDA20EF267BB039B00C72C45B:\ +000000000000000000000000000000000000000000000000 + +00000000000000200000000000000000:5CF1018B7E0BA1775601C2E279900360:\ +000000000000000000000000000000000000000000000000 + +00000000000000100000000000000000:3B1A7388B89FB9416AD8753CF5AF35D2:\ +000000000000000000000000000000000000000000000000 + +00000000000000080000000000000000:137FA4ED00AFCD9F5D8BC0D14BD5837A:\ +000000000000000000000000000000000000000000000000 + +00000000000000040000000000000000:806F5C9B663559BB56F234881E4A3E60:\ +000000000000000000000000000000000000000000000000 + +00000000000000020000000000000000:8069A449152292DF2DE8642992C632B6:\ +000000000000000000000000000000000000000000000000 + +00000000000000010000000000000000:37C6CF2A1ABD1B1F1922B46C7B4A280D:\ +000000000000000000000000000000000000000000000000 + +00000000000000008000000000000000:7A2835260E5A0AA2B5DC301800EC8438:\ +000000000000000000000000000000000000000000000000 + +00000000000000004000000000000000:EE81FAF2F9058213FFCACF281CB8509E:\ +000000000000000000000000000000000000000000000000 + +00000000000000002000000000000000:57F22D93C37129BA331FDBA38E005A1E:\ +000000000000000000000000000000000000000000000000 + +00000000000000001000000000000000:EC798782E87B7D9F780CC3C3A46519B5:\ +000000000000000000000000000000000000000000000000 + +00000000000000000800000000000000:43EA28497F5D40E3A4744FA2EDAA42DE:\ +000000000000000000000000000000000000000000000000 + +00000000000000000400000000000000:91F004E7DEBF41B3414DD8C5C317372C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000200000000000000:C249EAE54E7B4DF43B938C1B4CC28314:\ +000000000000000000000000000000000000000000000000 + +00000000000000000100000000000000:32C289D7EEFB99D2F17AD7B7D45FE1EC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000080000000000000:A675FB2E8DDBF810CEF01CF2B728CD2B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000040000000000000:A418AAAB6E6921CC731AA8A349386080:\ +000000000000000000000000000000000000000000000000 + +00000000000000000020000000000000:2E2B0F44863E67D9B0215C4ABD60417F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000010000000000000:F0AF7CB19E911D481F6426DAEFDD2240:\ +000000000000000000000000000000000000000000000000 + +00000000000000000008000000000000:CB1304DAAA2DF6878F56AC2E0F887E04:\ +000000000000000000000000000000000000000000000000 + +00000000000000000004000000000000:B1B70A7E6A0CD1916D9B78BEA19084AE:\ +000000000000000000000000000000000000000000000000 + +00000000000000000002000000000000:0CDE9F9BE646A5FCE3436B794A9CFC65:\ +000000000000000000000000000000000000000000000000 + +00000000000000000001000000000000:68C7946D476A0A36674B36AFD7E5DF33:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000800000000000:48770159A07DD8DFFF06C80105F8D57C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000400000000000:665E62801B3260E3C45BD3BE34DFDEBE:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000200000000000:4159C1F686BFBE5B0E50BDB0DA532B69:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000100000000000:6333100A5A4AD917DC2D4E78A04869A3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000080000000000:866A4519AB1D199F25886B89D0539ACC:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000040000000000:EC0CFD37E4CBC7E8BE385283F7AEA75A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000020000000000:CA2F383AACCA0810AA13F3E710621422:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000010000000000:1D0EEF6870444F950937831EC0A55D98:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000008000000000:37839B35ED6801E7670496D479A95017:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000004000000000:02317C8C7098C4F94AB867AC7A49DD8D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000002000000000:FFB4CB4E3F7F8BF3367EBD43236518B4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000001000000000:36BEDEF1E4AA3E4A40A305741713FCBF:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000800000000:B2DFE3C4870269C1E3FEEC39161540D9:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000400000000:147EF2518AD45DA0026056ECBF6A3DFA:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000200000000:027A75E4DE635790E47ACE90D7928804:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000100000000:C4CF3CCB59BF87D0AFBD629F48CFBB7B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000080000000:35165C93F564C97E1C32EF97E8151A87:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000040000000:449DE37F7D5A1BBD628ABBE7E061701D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000020000000:B1D45EAF218F1799B149BAD677FE129F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000010000000:BE08AC6DB6BD0583AA9D2ABC71C73DCD:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000008000000:BCC835BD3DF1A79E4C7C145B899A5C25:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000004000000:3D311EA611FF5AF371301C58A8E9912D:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000002000000:A5A1BEA594ACC7CA80F09EA5ADDB5C71:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000001000000:0F09492429FE7222D6CD8190D9F2FFBF:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000800000:816D2220A16B8AAEE71364FD43636C6F:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000400000:D7E8702408419ED73191B107EAF75A0B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000200000:9B170EFB1E235B433C78E276BEA082F0:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000100000:03BBECC5598AE974430F29395522F096:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000080000:DB53517766C0E8CF42059607CBA89380:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000040000:2E2AF4B7931F0AEFFAC5471148A5BB97:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000020000:C872C0408266403B984F635FF5683DE4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000010000:15DCF750B0E3A68AD1F4EFD07E8967B4:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000008000:B41092048E9E6A749F6FD8CE515A23A3:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000004000:4DA9267D62507994312BD5C99ADDE730:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000002000:9E2FCA6D1D626E9C6A924EBF7DBF618A:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000001000:E092E8D7EF2C2465AEFB2493C3063590:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000800:1C0E58DA37D1068378A88DBE2EDE4E10:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000400:19063F854232B8509A6A3A6D46809959:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000200:447FB09E54EFA285F7530F25C4EA0022:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000100:F6ABE86321BE40E1FBFDAFED37CC1D9B:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000080:4E8506CD006666341D6CF51F98B41F35:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000040:53995DE0009CA18BECAFB8307C54C14C:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000020:2006BF99F4C58B6CC2627856593FAEEA:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000010:2DA697D2737CB30B744A4644FA1CBC6E:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000008:47A22ACDB60C3A986A8F76ECD0EA3433:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000004:FDAA17C2CDE20268FE36E164EA532151:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000002:98E7247C07F0FE411C267E4384B0F600:\ +000000000000000000000000000000000000000000000000 + +00000000000000000000000000000001:CD33B28AC773F74BA00ED1F312572435:\ +000000000000000000000000000000000000000000000000 + +[AES-256] +834EADFCCAC7E1B30664B1ABA44815AB:1946DABF6A03A2A2C3D0B05080AED6FC:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +D9DC4DBA3021B05D67C0518F72B62BF1:5ED301D747D3CC715445EBDEC62F2FB4:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +A291D86301A4A739F7392173AA3C604C:6585C8F43D13A6BEAB6419FC5935B9D0:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +4264B2696498DE4DF79788A9F83E9390:2A5B56A596680FCC0E05F5E0F151ECAE:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +EE9932B3721804D5A83EF5949245B6F6:F5D6FF414FD2C6181494D20C37F2B8C4:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +E6248F55C5FDCBCA9CBBB01C88A2EA77:85399C01F59FFFB5204F19F8482F00B8:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +B8358E41B9DFF65FD461D55A99266247:92097B4C88A041DDF98144BC8D22E8E7:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +F0E2D72260AF58E21E015AB3A4C0D906:89BD5B73B356AB412AEF9F76CEA2D65C:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E + +475B8B823CE8893DB3C44A9F2A379FF7:2536969093C55FF9454692F2FAC2F530:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +688F5281945812862F5F3076CF80412F:07FC76A872843F3F6E0081EE9396D637:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E + +08D1D2BC750AF553365D35E75AFACEAA:E38BA8EC2AA741358DCC93E8F141C491:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +8707121F47CC3EFCECA5F9A8474950A1:D028EE23E4A89075D0B03E868D7D3A42:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +E51AA0B135DBA566939C3B6359A980C5:8CD9423DFC459E547155C5D1D522E540:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +069A007FC76A459F98BAF917FEDF9521:080E9517EB1677719ACF728086040AE3:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E + +726165C1723FBCF6C026D7D00B091027:7C1700211A3991FC0ECDED0AB3E576B0:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +D7C544DE91D55CFCDE1F84CA382200CE:DABCBCC855839251DB51E224FBE87435:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E + +FED3C9A161B9B5B2BD611B41DC9DA357:68D56FAD0406947A4DD27A7448C10F1D:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +4F634CDC6551043409F30B635832CF82:DA9A11479844D1FFEE24BBF3719A9925:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +109CE98DB0DFB36734D9F3394711B4E6:5E4BA572F8D23E738DA9B05BA24B8D81:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +4EA6DFABA2D8A02FFDFFA89835987242:A115A2065D667E3F0B883837A6E903F8:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +5AE094F54AF58E6E3CDBF976DAC6D9EF:3E9E90DC33EAC2437D86AD30B137E66E:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +764D8E8E0F29926DBE5122E66354FDBE:01CE82D8FBCDAE824CB3C48E495C3692:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +3F0418F888CDF29A982BF6B75410D6A9:0C9CFF163CE936FAAF083CFD3DEA3117:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +E4A3E7CB12CDD56AA4A75197A9530220:5131BA9BD48F2BBA85560680DF504B52:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +211677684AAC1EC1A160F44C4EBF3F26:9DC503BBF09823AEC8A977A5AD26CCB2:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E + +D21E439FF749AC8F18D6D4B105E03895:9A6DB0C0862E506A9E397225884041D7:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +D9F6FF44646C4725BD4C0103FF5552A7:430BF9570804185E1AB6365FC6A6860C:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +0B1256C2A00B976250CFC5B0C37ED382:3525EBC02F4886E6A5A3762813E8CE8A:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +B056447FFC6DC4523A36CC2E972A3A79:07FA265C763779CCE224C7BAD671027B:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +5E25CA78F0DE55802524D38DA3FE4456:E8B72B4E8BE243438C9FFF1F0E205872:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +A5BCF4728FA5EAAD8567C0DC24675F83:109D4F999A0E11ACE1F05E6B22CBCB50:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +814E59F97ED84646B78B2CA022E9CA43:45A5E8D4C3ED58403FF08D68A0CC4029:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +15478BEEC58F4775C7A7F5D4395514D7:196865964DB3D417B6BD4D586BCB7634:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +253548FFCA461C67C8CBC78CD59F4756:60436AD45AC7D30D99195F815D98D2AE:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +FD7AD8D73B9B0F8CC41600640F503D65:BB07A23F0B61014B197620C185E2CD75:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +06199DE52C6CBF8AF954CD65830BCD56:5BC0B2850129C854423AFF0751FE343B:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +F17C4FFE48E44C61BD891E257E725794:7541A78F96738E6417D2A24BD2BECA40:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E + +9A5B4A402A3E8A59BE6BF5CD8154F029:B0A303054412882E464591F1546C5B9E:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +79BD40B91A7E07DC939D441782AE6B17:778C06D8A355EEEE214FCEA14B4E0EEF:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E + +D8CEAAF8976E5FBE1012D8C84F323799:09614206D15CBACE63227D06DB6BEEBB:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +3316E2751E2E388B083DA23DD6AC3FBE:41B97FB20E427A9FDBBB358D9262255D:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +8B7CFBE37DE7DCA793521819242C5816:C1940F703D845F957652C2D64ABD7ADF:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +F23F033C0EEBF8EC55752662FD58CE68:D2D44FCDAE5332343366DB297EFCF21B:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E + +59EB34F6C8BDBACC5FC6AD73A59A1301:EA8196B79DBE167B6AA9896E287EED2B:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +DCDE8B6BD5CF7CC22D9505E3CE81261A:D6B0B0C4BA6C7DBE5ED467A1E3F06C2D:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E + +E33CF7E524FED781E7042FF9F4B35DC7:EC51EB295250C22C2FB01816FB72BCAE:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +27963C8FACDF73062867D164DF6D064C:ADED6630A07CE9C7408A155D3BD0D36F:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +77B1CE386B551B995F2F2A1DA994EEF8:697C9245B9937F32F5D1C82319F0363A:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +F083388B013679EFCF0BB9B15D52AE5C:AAD5AD50C6262AAEC30541A1B7B5B19C:\ +F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E + +C5009E0DAB55DB0ABDB636F2600290C8:7D34B893855341EC625BD6875AC18C0D:\ +20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 + +7804881E26CD532D8514D3683F00F1B9:7EF05105440F83862F5D780E88F02B41:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E + +46CDDCD73D1EB53E675CA012870A92A3:C377C06403382061AF2C9C93A8E70DF6:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +A9FB44062BB07FE130A8E8299EACB1AB:1DBDB3FFDC052DACC83318853ABC6DE5:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +2B6FF8D7A5CC3A28A22D5A6F221AF26B:69A6EAB00432517D0BF483C91C0963C7:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +1A9527C29B8ADD4B0E3E656DBB2AF8B4:0797F41DC217C80446E1D514BD6AB197:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +7F99CF2C75244DF015EB4B0C1050AEAE:9DFD76575902A637C01343C58E011A03:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +E84FF85B0D9454071909C1381646C4ED:ACF4328AE78F34B9FA9B459747CC2658:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E + +89AFD40F99521280D5399B12404F6DB4:B0479AEA12BAC4FE2384CF98995150C6:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +A09EF32DBC5119A35AB7FA38656F0329:9DD52789EFE3FFB99F33B3DA5030109A:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +61773457F068C376C7829B93E696E716:ABBB755E4621EF8F1214C19F649FB9FD:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +A34F0CAE726CCE41DD498747D891B967:DA27FB8174357BCE2BED0E7354F380F9:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +856F59496C7388EE2D2B1A27B7697847:C59A0663F0993838F6E5856593BDC5EF:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +CB090C593EF7720BD95908FB93B49DF4:ED60B264B5213E831607A99C0CE5E57E:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +A0AC75CD2F1923D460FC4D457AD95BAF:E50548746846F3EB77B8C520640884ED:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +2A2B282974777689E8E9EEEF525D5C5F:28282CC7D21D6A2923641E52D188EF0C:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +909192939390919E0F0E09089788898A:0DFA5B02ABB18E5A815305216D6D4F8E:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +777675748D8E8F907170777649464744:7359635C0EECEFE31D673395FB46FB99:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +717073720605040B2D2C2B2A05FAFBF9:73C679F7D5AEF2745C9737BB4C47FB36:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +64656667FEFDFCC31B1A1D1CA5AAABA8:B192BD472A4D2EAFB786E97458967626:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E + +DBDAD9D86A696867B5B4B3B2C8D7D6D5:0EC327F6C8A2B147598CA3FDE61DC6A4:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +5C5D5E5FE3E0E1FE31303736333C3D3E:FC418EB3C41B859B38D4B6F646629729:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E + +545556574B48494673727574546B6A69:30249E5AC282B1C981EA64B609F3A154:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +ECEDEEEFC6C5C4BB56575051F5FAFBF8:5E6E08646D12150776BB43C2D78A9703:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +464744452724252AC9C8CFCED2CDCCCF:FAEB3D5DE652CD3447DCEB343F30394A:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +E6E7E4E54142435C878681801C131211:A8E88706823F6993EF80D05C1C7B2CF0:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E + +72737071CFCCCDC2F9F8FFFE710E0F0C:8CED86677E6E00A1A1B15968F2D3CCE6:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +505152537370714EC3C2C5C4010E0F0C:9FC7C23858BE03BDEBB84E90DB6786A9:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E + +A8A9AAAB5C5F5E51AEAFA8A93D222320:B4FBD65B33F70D8CF7F1111AC4649C36:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +DEDFDCDDF6F5F4EB10111617FEF1F0F3:C5C32D5ED03C4B53CC8C1BD0EF0DBBF6:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +BDBCBFBE5E5D5C530B0A0D0CFAC5C4C7:D1A7F03B773E5C212464B63709C6A891:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +8A8B8889050606F8F4F5F2F3636C6D6E:6B7161D8745947AC6950438EA138D028:\ +F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E + +A6A7A4A54D4E4F40B2B3B4B539262724:FD47A9F7E366EE7A09BC508B00460661:\ +20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 + +9C9D9E9FE9EAEBF40E0F08099B949596:00D40B003DC3A0D9310B659B98C7E416:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E + +2D2C2F2E1013121DCCCDCACBED121310:EEA4C79DCC8E2BDA691F20AC48BE0717:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +F4F5F6F7EDEEEFD0EAEBECEDF7F8F9FA:E78F43B11C204403E5751F89D05A2509:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +3D3C3F3E282B2A2573727574150A0B08:D0F0E3D1F1244BB979931E38DD1786EF:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +B6B7B4B5F8FBFAE5B4B5B2B3A0AFAEAD:042E639DC4E1E4DDE7B75B749EA6F765:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +B7B6B5B4989B9A95878681809BA4A5A6:BC032FDD0EFE29503A980A7D07AB46A8:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +A8A9AAABE5E6E798E9E8EFEE4748494A:0C93AC949C0DA6446EFFB86183B6C910:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E + +ECEDEEEFD9DADBD4B9B8BFBE657A7B78:E0D343E14DA75C917B4A5CEC4810D7C2:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +7F7E7D7C696A6B74CACBCCCD929D9C9F:0EAFB821748408279B937B626792E619:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +08090A0B0605040BFFFEF9F8B9C6C7C4:FA1AC6E02D23B106A1FEF18B274A553F:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +08090A0BF1F2F3CCFCFDFAFB68676665:0DADFE019CD12368075507DF33C1A1E9:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +CACBC8C93A393837050403020D121310:3A0879B414465D9FFBAF86B33A63A1B9:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +E9E8EBEA8281809F8F8E8988343B3A39:62199FADC76D0BE1805D3BA0B7D914BF:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +515053524645444BD0D1D6D7340B0A09:1B06D6C5D333E742730130CF78E719B4:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + +42434041ECEFEE1193929594C6C9C8CB:F1F848824C32E9DCDCBF21580F069329:\ +78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E + +EFEEEDECC2C1C0CF76777071455A5B58:1A09050CBD684F784D8E965E0782F28A:\ +A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 + +5F5E5D5C3F3C3D221D1C1B1A19161714:79C2969E7DED2BA7D088F3F320692360:\ +C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE + +000102034142434C1C1D1A1B8D727371:091A658A2F7444C16ACCB669450C7B63:\ +F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 + +8E8F8C8DB1B2B38C56575051050A0B08:97C1E3A72CCA65FA977D5ED0E8A7BBFC:\ +18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E + +A7A6A5A4E8EBEAE57F7E7978CAD5D4D7:70C430C6DB9A17828937305A2DF91A2A:\ +40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 + +8A8B888994979689454443429F909192:629553457FBE2479098571C7C903FDE8:\ +68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E + +8C8D8E8FE0E3E2ED45444342F1CECFCC:A25B25A61F612669E7D91265C7D476BA:\ +90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 + +FFFEFDFC4C4F4E31D8D9DEDFB6B9B8BB:EB7E4E49B8AE0F024570DDA293254FED:\ +B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE + +FDFCFFFECCCFCEC12F2E29286679787B:38FE15D61CCA84516E924ADCE5014F67:\ +E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 + +67666564BAB9B8A77071767719161714:3AD208492249108C9F3EBEB167AD0583:\ +08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E + +9A9B98992D2E2F2084858283245B5A59:299BA9F9BF5AB05C3580FC26EDD1ED12:\ +30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 + +A4A5A6A70B0809365C5D5A5B2C232221:19DC705B857A60FB07717B2EA5717781:\ +58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E + +464744455754555AF3F2F5F4AFB0B1B2:FFC8AEB885B5EFCAD06B6DBEBF92E76B:\ +80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 + +323330317675746B7273747549464744:F58900C5E0B385253FF2546250A0142B:\ +A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE + +A8A9AAAB181B1A15808186872B141516:2EE67B56280BC462429CEE6E3370CBC1:\ +D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 + +E7E6E5E4202323DDAAABACAD343B3A39:20DB650A9C8E9A84AB4D25F7EDC8F03F:\ +F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E + +A8A9AAAB2221202FEDECEBEA1E010003:3C36DA169525CF818843805F25B78AE5:\ +20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 + +F9F8FBFA5F5C5D42424344450E010003:9A781D960DB9E45E37779042FEA51922:\ +48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E + +57565554F5F6F7F89697909120DFDEDD:6560395EC269C672A3C288226EFDBA77:\ +70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 + +F8F9FAFBCCCFCEF1DDDCDBDA0E010003:8C772B7A189AC544453D5916EBB27B9A:\ +98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE + +D9D8DBDA7073727D80818687C2DDDCDF:77CA5468CC48E843D05F78EED9D6578F:\ +C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 + +C5C4C7C6080B0A1588898E8F68676665:72CDCC71DC82C60D4429C9E2D8195BAA:\ +E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E + +83828180DCDFDED186878081F0CFCECD:8080D68CE60E94B40B5B8B69EEB35AFA:\ +10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 + +98999A9BDDDEDFA079787F7E0A050407:44222D3CDE299C04369D58AC0EBA1E8E:\ +38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E + +CECFCCCD4F4C4D429F9E9998DFC0C1C2:9B8721B0A8DFC691C5BC5885DBFCB27A:\ +60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 + +404142436665647B29282F2EABA4A5A6:0DC015CE9A3A3414B5E62EC643384183:\ +88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE + +33323130E6E5E4EB23222524DEA1A0A3:705715448A8DA412025CE38345C2A148:\ +B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 + +CFCECDCCF6F5F4CBE6E7E0E199969794:C32B5B0B6FBAE165266C569F4B6ECF0B:\ +D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE + +BABBB8B97271707FDCDDDADB29363734:4DCA6C75192A01DDCA9476AF2A521E87:\ +00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 + +C9C8CBCA4447465926272021545B5A59:058691E627ECBC36AC07B6DB423BD698:\ +28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E + +050407067477767956575051221D1C1F:7444527095838FE080FC2BCDD30847EB:\ +50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 + 00000000000000000000000000000000:E35A6DCB19B201A01EBCFA8AA22B5759:\ 8000000000000000000000000000000000000000000000000000000000000000 @@ -2890,774 +3771,6 @@ C9C8CBCA4447465926272021545B5A59:058691E627ECBC36AC07B6DB423BD698:\ 00000000000000000000000000000000:6B6CFE160A6263631B292F879EEFF926:\ 0000000000000000000000000000000000000000000000000000000000000001 -80000000000000000000000000000000:3AD78E726C1EC02B7EBFE92B23D9EC34:\ -00000000000000000000000000000000 - -40000000000000000000000000000000:45BC707D29E8204D88DFBA2F0B0CAD9B:\ -00000000000000000000000000000000 - -20000000000000000000000000000000:161556838018F52805CDBD6202002E3F:\ -00000000000000000000000000000000 - -10000000000000000000000000000000:F5569B3AB6A6D11EFDE1BF0A64C6854A:\ -00000000000000000000000000000000 - -08000000000000000000000000000000:64E82B50E501FBD7DD4116921159B83E:\ -00000000000000000000000000000000 - -04000000000000000000000000000000:BAAC12FB613A7DE11450375C74034041:\ -00000000000000000000000000000000 - -02000000000000000000000000000000:BCF176A7EAAD8085EBACEA362462A281:\ -00000000000000000000000000000000 - -01000000000000000000000000000000:47711816E91D6FF059BBBF2BF58E0FD3:\ -00000000000000000000000000000000 - -00800000000000000000000000000000:B970DFBE40698AF1638FE38BD3DF3B2F:\ -00000000000000000000000000000000 - -00400000000000000000000000000000:F95B59A44F391E14CF20B74BDC32FCFF:\ -00000000000000000000000000000000 - -00200000000000000000000000000000:720F74AE04A2A435B9A7256E49378F5B:\ -00000000000000000000000000000000 - -00100000000000000000000000000000:2A0445F61D36BFA7E277070730CF76DA:\ -00000000000000000000000000000000 - -00080000000000000000000000000000:8D0536B997AEFEC1D94011BAB6699A03:\ -00000000000000000000000000000000 - -00040000000000000000000000000000:674F002E19F6ED47EFF319E51FAD4498:\ -00000000000000000000000000000000 - -00020000000000000000000000000000:292C02C5CB9163C80AC0F6CF1DD8E92D:\ -00000000000000000000000000000000 - -00010000000000000000000000000000:FA321CF18EF5FE727DD82A5C1E945141:\ -00000000000000000000000000000000 - -00008000000000000000000000000000:A5A7AFE1034C39CCCEBE3C584BC0BE05:\ -00000000000000000000000000000000 - -00004000000000000000000000000000:4FF5A52E697E77D081205DBDB21CEA39:\ -00000000000000000000000000000000 - -00002000000000000000000000000000:209E88DC94C9003000CE0769AF7B7166:\ -00000000000000000000000000000000 - -00001000000000000000000000000000:5DEE41AF864CB4B650E5F51551824D38:\ -00000000000000000000000000000000 - -00000800000000000000000000000000:A79A63FA7E4503AE6D6E09F5F9053030:\ -00000000000000000000000000000000 - -00000400000000000000000000000000:A48316749FAE7FAC7002031A6AFD8BA7:\ -00000000000000000000000000000000 - -00000200000000000000000000000000:D6EEE8A7357A0E1D64262CA9C337AC42:\ -00000000000000000000000000000000 - -00000100000000000000000000000000:B013CA8A62A858053E9FB667ED39829E:\ -00000000000000000000000000000000 - -00000080000000000000000000000000:DF6EA9E4538A45A52D5C1A43C88F4B55:\ -00000000000000000000000000000000 - -00000040000000000000000000000000:7D03BA451371591D3FD5547D9165C73B:\ -00000000000000000000000000000000 - -00000020000000000000000000000000:0E0426281A6277E186499D365D5F49FF:\ -00000000000000000000000000000000 - -00000010000000000000000000000000:DBC02169DD2059E6CC4C57C1FEDF5AB4:\ -00000000000000000000000000000000 - -00000008000000000000000000000000:826590E05D167DA6F00DCC75E22788EB:\ -00000000000000000000000000000000 - -00000004000000000000000000000000:34A73F21A04421D9786335FAAB49423A:\ -00000000000000000000000000000000 - -00000002000000000000000000000000:ED347D0E0128EE1A7392A1D36AB78AA9:\ -00000000000000000000000000000000 - -00000001000000000000000000000000:EE944B2FE6E9FC888042608DA9615F75:\ -00000000000000000000000000000000 - -00000000800000000000000000000000:9E7C85A909EF7218BA7947CFB4718F46:\ -00000000000000000000000000000000 - -00000000400000000000000000000000:811AE07A0B2B1F816587FA73699AE77D:\ -00000000000000000000000000000000 - -00000000200000000000000000000000:68466FBF43C2FE13D4B18F7EC5EA745F:\ -00000000000000000000000000000000 - -00000000100000000000000000000000:D20B015C7191B219780956E6101F9354:\ -00000000000000000000000000000000 - -00000000080000000000000000000000:5939D5C1BBF54EE1B3E326D757BDDE25:\ -00000000000000000000000000000000 - -00000000040000000000000000000000:B1FDAFE9A0240E8FFEA19CE94B5105D3:\ -00000000000000000000000000000000 - -00000000020000000000000000000000:D62962ECE02CDD68C06BDFEFB2F9495B:\ -00000000000000000000000000000000 - -00000000010000000000000000000000:B3BB2DE6F3C26587BA8BAC4F7AD9499A:\ -00000000000000000000000000000000 - -00000000008000000000000000000000:E0B1072D6D9FF703D6FBEF77852B0A6B:\ -00000000000000000000000000000000 - -00000000004000000000000000000000:D8DD51C907F478DE0228E83E61FD1758:\ -00000000000000000000000000000000 - -00000000002000000000000000000000:A42DFFE6E7C1671C06A25236FDD10017:\ -00000000000000000000000000000000 - -00000000001000000000000000000000:25ACF141550BFAB9EF451B6C6A5B2163:\ -00000000000000000000000000000000 - -00000000000800000000000000000000:4DA7FCA3949B16E821DBC84F19581018:\ -00000000000000000000000000000000 - -00000000000400000000000000000000:7D49B6347CBCC8919C7FA96A37A7A215:\ -00000000000000000000000000000000 - -00000000000200000000000000000000:900024B29A08C6721B95BA3B753DDB4D:\ -00000000000000000000000000000000 - -00000000000100000000000000000000:6D2182FB283B6934D90BA7848CAB5E66:\ -00000000000000000000000000000000 - -00000000000080000000000000000000:F73EF01B448D23A4D90DE8B2F9666E7A:\ -00000000000000000000000000000000 - -00000000000040000000000000000000:4AD9CDA2418643E9A3D926AF5E6B0412:\ -00000000000000000000000000000000 - -00000000000020000000000000000000:7CAEC8E7E5953997D545B033201C8C5B:\ -00000000000000000000000000000000 - -00000000000010000000000000000000:3C43CA1F6B6864503E27B48D88230CF5:\ -00000000000000000000000000000000 - -00000000000008000000000000000000:44F779B93108FE9FEEC880D79BA74488:\ -00000000000000000000000000000000 - -00000000000004000000000000000000:9E50E8D9CFD3A682A78E527C9072A1CF:\ -00000000000000000000000000000000 - -00000000000002000000000000000000:68D000CBC838BBE3C505D6F814C01F28:\ -00000000000000000000000000000000 - -00000000000001000000000000000000:2CB2A9FEC1ACD1D9B0FA05205E304F57:\ -00000000000000000000000000000000 - -00000000000000800000000000000000:01EB2806606E46444520A5CC6180CD4B:\ -00000000000000000000000000000000 - -00000000000000400000000000000000:DAA9B25168CC702326F217F1A0C0B162:\ -00000000000000000000000000000000 - -00000000000000200000000000000000:3E07E648975D9578D03555B1755807ED:\ -00000000000000000000000000000000 - -00000000000000100000000000000000:0B45F52E802C8B8DE09579425B80B711:\ -00000000000000000000000000000000 - -00000000000000080000000000000000:659595DA0B68F6DF0DD6CA77202986E1:\ -00000000000000000000000000000000 - -00000000000000040000000000000000:05FF42873893536E58C8FA98A45C73C4:\ -00000000000000000000000000000000 - -00000000000000020000000000000000:B5B03421DE8BBFFC4EADEC767339A9BD:\ -00000000000000000000000000000000 - -00000000000000010000000000000000:788BCD111ECF73D4E78D2E21BEF55460:\ -00000000000000000000000000000000 - -00000000000000008000000000000000:909CD9EC6790359F982DC6F2393D5315:\ -00000000000000000000000000000000 - -00000000000000004000000000000000:332950F361535FF24EFAC8C76293F12C:\ -00000000000000000000000000000000 - -00000000000000002000000000000000:A68CCD4E330FFDA9D576DA436DB53D75:\ -00000000000000000000000000000000 - -00000000000000001000000000000000:27C8A1CCFDB0B015D1ED5B3E77143791:\ -00000000000000000000000000000000 - -00000000000000000800000000000000:D76A4B95887A77DF610DD3E1D3B20325:\ -00000000000000000000000000000000 - -00000000000000000400000000000000:C068AB0DE71C66DAE83C361EF4B2D989:\ -00000000000000000000000000000000 - -00000000000000000200000000000000:C2120BCD49EDA9A288B3B4BE79AC8158:\ -00000000000000000000000000000000 - -00000000000000000100000000000000:0C546F62BF2773CD0F564FCECA7BA688:\ -00000000000000000000000000000000 - -00000000000000000080000000000000:18F3462BEDE4920213CCB66DAB1640AA:\ -00000000000000000000000000000000 - -00000000000000000040000000000000:FE42F245EDD0E24B216AEBD8B392D690:\ -00000000000000000000000000000000 - -00000000000000000020000000000000:3D3EEBC8D3D1558A194C2D00C337FF2B:\ -00000000000000000000000000000000 - -00000000000000000010000000000000:29AAEDF043E785DB42836F79BE6CBA28:\ -00000000000000000000000000000000 - -00000000000000000008000000000000:215F90C6744E2944358E78619159A611:\ -00000000000000000000000000000000 - -00000000000000000004000000000000:8606B1AA9E1D548E5442B06551E2C6DC:\ -00000000000000000000000000000000 - -00000000000000000002000000000000:987BB4B8740EC0EDE7FEA97DF033B5B1:\ -00000000000000000000000000000000 - -00000000000000000001000000000000:C0A3500DA5B0AE07D2F450930BEEDF1B:\ -00000000000000000000000000000000 - -00000000000000000000800000000000:525FDF8312FE8F32C781481A8DAAAE37:\ -00000000000000000000000000000000 - -00000000000000000000400000000000:BFD2C56AE5FB9C9DE33A6944572A6487:\ -00000000000000000000000000000000 - -00000000000000000000200000000000:7975A57A425CDF5AA1FA929101F650B0:\ -00000000000000000000000000000000 - -00000000000000000000100000000000:BF174BC49609A8709B2CD8366DAA79FE:\ -00000000000000000000000000000000 - -00000000000000000000080000000000:06C50C43222F56C874B1704E9F44BF7D:\ -00000000000000000000000000000000 - -00000000000000000000040000000000:0CEC48CD34043EA29CA3B8ED5278721E:\ -00000000000000000000000000000000 - -00000000000000000000020000000000:9548EA34A1560197B304D0ACB8A1698D:\ -00000000000000000000000000000000 - -00000000000000000000010000000000:22F9E9B1BD73B6B5B7D3062C986272F3:\ -00000000000000000000000000000000 - -00000000000000000000008000000000:FEE8E934BD0873295059002230E298D4:\ -00000000000000000000000000000000 - -00000000000000000000004000000000:1B08E2E3EB820D139CB4ABBDBE81D00D:\ -00000000000000000000000000000000 - -00000000000000000000002000000000:0021177681E4D90CEAF69DCED0145125:\ -00000000000000000000000000000000 - -00000000000000000000001000000000:4A8E314452CA8A8A3619FC54BC423643:\ -00000000000000000000000000000000 - -00000000000000000000000800000000:65047474F7222C94C6965425FF1BFD0A:\ -00000000000000000000000000000000 - -00000000000000000000000400000000:E123F551A9C4A8489622B16F961A9AA4:\ -00000000000000000000000000000000 - -00000000000000000000000200000000:EF05530948B80915028BB2B6FE429380:\ -00000000000000000000000000000000 - -00000000000000000000000100000000:72535B7FE0F0F777CEDCD55CD77E2DDF:\ -00000000000000000000000000000000 - -00000000000000000000000080000000:3423D8EFC31FA2F4C365C77D8F3B5C63:\ -00000000000000000000000000000000 - -00000000000000000000000040000000:DE0E51C264663F3C5DBC59580A98D8E4:\ -00000000000000000000000000000000 - -00000000000000000000000020000000:B2D9391166680947AB09264156719679:\ -00000000000000000000000000000000 - -00000000000000000000000010000000:10DB79F23B06D263835C424AF749ADB7:\ -00000000000000000000000000000000 - -00000000000000000000000008000000:DDF72D27E6B01EC107EA3E005B59563B:\ -00000000000000000000000000000000 - -00000000000000000000000004000000:8266B57485A5954A4236751DE07F6694:\ -00000000000000000000000000000000 - -00000000000000000000000002000000:669A501E1F1ADE6E5523DE01D6DBC987:\ -00000000000000000000000000000000 - -00000000000000000000000001000000:C20C48F2989725D461D1DB589DC0896E:\ -00000000000000000000000000000000 - -00000000000000000000000000800000:DE35158E7810ED1191825D2AA98FA97D:\ -00000000000000000000000000000000 - -00000000000000000000000000400000:4FE294F2C0F34D0671B693A237EBDDC8:\ -00000000000000000000000000000000 - -00000000000000000000000000200000:087AE74B10CCBFDF6739FEB9559C01A4:\ -00000000000000000000000000000000 - -00000000000000000000000000100000:5DC278970B7DEF77A5536C77AB59C207:\ -00000000000000000000000000000000 - -00000000000000000000000000080000:7607F078C77085184EAA9B060C1FBFFF:\ -00000000000000000000000000000000 - -00000000000000000000000000040000:9DB841531BCBE7998DAD19993FB3CC00:\ -00000000000000000000000000000000 - -00000000000000000000000000020000:D6A089B654854A94560BAE13298835B8:\ -00000000000000000000000000000000 - -00000000000000000000000000010000:E1E223C4CF90CC5D195B370D65114622:\ -00000000000000000000000000000000 - -00000000000000000000000000008000:1CBED73C50D053BDAD372CEEE54836A1:\ -00000000000000000000000000000000 - -00000000000000000000000000004000:D309E69376D257ADF2BFDA152B26555F:\ -00000000000000000000000000000000 - -00000000000000000000000000002000:740F7649117F0DEE6EAA7789A9994C36:\ -00000000000000000000000000000000 - -00000000000000000000000000001000:76AE64417C297184D668C5FD908B3CE5:\ -00000000000000000000000000000000 - -00000000000000000000000000000800:6095FEA4AA8035591F1787A819C48787:\ -00000000000000000000000000000000 - -00000000000000000000000000000400:D1FF4E7ACD1C79967FEBAB0F7465D450:\ -00000000000000000000000000000000 - -00000000000000000000000000000200:5F5AD3C42B9489557BB63BF49ECF5F8A:\ -00000000000000000000000000000000 - -00000000000000000000000000000100:FB56CC09B680B1D07C5A52149E29F07C:\ -00000000000000000000000000000000 - -00000000000000000000000000000080:FF49B8DF4A97CBE03833E66197620DAD:\ -00000000000000000000000000000000 - -00000000000000000000000000000040:5E070ADE533D2E090ED0F5BE13BC0983:\ -00000000000000000000000000000000 - -00000000000000000000000000000020:3AB4FB1D2B7BA376590A2C241D1F508D:\ -00000000000000000000000000000000 - -00000000000000000000000000000010:58B2431BC0BEDE02550F40238969EC78:\ -00000000000000000000000000000000 - -00000000000000000000000000000008:0253786E126504F0DAB90C48A30321DE:\ -00000000000000000000000000000000 - -00000000000000000000000000000004:200211214E7394DA2089B6ACD093ABE0:\ -00000000000000000000000000000000 - -00000000000000000000000000000002:0388DACE60B6A392F328C2B971B2FE78:\ -00000000000000000000000000000000 - -00000000000000000000000000000001:58E2FCCEFA7E3061367F1D57A4E7455A:\ -00000000000000000000000000000000 - -80000000000000000000000000000000:6CD02513E8D4DC986B4AFE087A60BD0C:\ -000000000000000000000000000000000000000000000000 - -40000000000000000000000000000000:423D2772A0CA56DAABB48D2129062987:\ -000000000000000000000000000000000000000000000000 - -20000000000000000000000000000000:1021F2A8DA70EB2219DC16804445FF98:\ -000000000000000000000000000000000000000000000000 - -10000000000000000000000000000000:C636E35B402577F96974D8804295EBB8:\ -000000000000000000000000000000000000000000000000 - -08000000000000000000000000000000:1566D2E57E8393C19E29F892EA28A9A7:\ -000000000000000000000000000000000000000000000000 - -04000000000000000000000000000000:883C878FED70B36CC09D040F9619DD19:\ -000000000000000000000000000000000000000000000000 - -02000000000000000000000000000000:06734593A974965790E715594FC34AA9:\ -000000000000000000000000000000000000000000000000 - -01000000000000000000000000000000:F19B389948D9A45534E5BD36C984134A:\ -000000000000000000000000000000000000000000000000 - -00800000000000000000000000000000:D8410DFC14FA6D175EC968EA8CAC514C:\ -000000000000000000000000000000000000000000000000 - -00400000000000000000000000000000:7E6C6EBB4029A177CF7B2FDD9AC6BB7A:\ -000000000000000000000000000000000000000000000000 - -00200000000000000000000000000000:4B51DD4850DC0A6C3A46D924003D2C27:\ -000000000000000000000000000000000000000000000000 - -00100000000000000000000000000000:2E510A9D917B15BE32A192B12A668F23:\ -000000000000000000000000000000000000000000000000 - -00080000000000000000000000000000:88F6F79962B0FB77FEA8E7C632D3108E:\ -000000000000000000000000000000000000000000000000 - -00040000000000000000000000000000:A3A35AB1D88DAF07B52794A0F065383A:\ -000000000000000000000000000000000000000000000000 - -00020000000000000000000000000000:DC6CC878433E2B3BB193049A4ECBFC53:\ -000000000000000000000000000000000000000000000000 - -00010000000000000000000000000000:EFCD3763EB7B1A415938248A9A5B4FD5:\ -000000000000000000000000000000000000000000000000 - -00008000000000000000000000000000:AB7E9FB9A66DBE5BB44854F07D9015EE:\ -000000000000000000000000000000000000000000000000 - -00004000000000000000000000000000:8B8E9D3365F8F6743ECF7E33E99255A4:\ -000000000000000000000000000000000000000000000000 - -00002000000000000000000000000000:54D37B4F176FF3D8F6AFC866066D8572:\ -000000000000000000000000000000000000000000000000 - -00001000000000000000000000000000:E83310889480FBF3C00342E3126D0D02:\ -000000000000000000000000000000000000000000000000 - -00000800000000000000000000000000:D321AB2511F92F098174AA2DE6E85DA2:\ -000000000000000000000000000000000000000000000000 - -00000400000000000000000000000000:D8E3F40B1112D5149D58C481DFA9983F:\ -000000000000000000000000000000000000000000000000 - -00000200000000000000000000000000:2454C4E0806639DDF19854D6C68054AD:\ -000000000000000000000000000000000000000000000000 - -00000100000000000000000000000000:A5506D410F7CA32F3955DD79D9D09418:\ -000000000000000000000000000000000000000000000000 - -00000080000000000000000000000000:7908EE40677699568A7DC1AA317C7E4E:\ -000000000000000000000000000000000000000000000000 - -00000040000000000000000000000000:B4B7B29DD43B2F5CF765E25192273982:\ -000000000000000000000000000000000000000000000000 - -00000020000000000000000000000000:92AFE9668159BEFFE2A86F8503260164:\ -000000000000000000000000000000000000000000000000 - -00000010000000000000000000000000:5C36A232FBA6D187A84657AD4028B18F:\ -000000000000000000000000000000000000000000000000 - -00000008000000000000000000000000:A2E994DFAB3A798DF8F54F6DA87E58E2:\ -000000000000000000000000000000000000000000000000 - -00000004000000000000000000000000:6CDAB10A72ADF77D71D0765BAAE95631:\ -000000000000000000000000000000000000000000000000 - -00000002000000000000000000000000:9FE3C801BCAAF7BB800F2E6BF3278E21:\ -000000000000000000000000000000000000000000000000 - -00000001000000000000000000000000:B459D90D9A6C392E5493BC91CF5A0863:\ -000000000000000000000000000000000000000000000000 - -00000000800000000000000000000000:0518A9FA5007F6787E0FB4E5AC27D758:\ -000000000000000000000000000000000000000000000000 - -00000000400000000000000000000000:BED9795415D28599700ED7952384A963:\ -000000000000000000000000000000000000000000000000 - -00000000200000000000000000000000:F0140421173D60251EF6CAB0229B1B50:\ -000000000000000000000000000000000000000000000000 - -00000000100000000000000000000000:460EB4652B3F6779EA28CB11B37529ED:\ -000000000000000000000000000000000000000000000000 - -00000000080000000000000000000000:C4283D351C960A6AC13CD19CCF03AE38:\ -000000000000000000000000000000000000000000000000 - -00000000040000000000000000000000:6815A10047B2C834A798EBDCC6786C75:\ -000000000000000000000000000000000000000000000000 - -00000000020000000000000000000000:99BA19F0CDD5990D0386B32CE56C9C4C:\ -000000000000000000000000000000000000000000000000 - -00000000010000000000000000000000:DE76F62C61E07915162DA13E79679DEC:\ -000000000000000000000000000000000000000000000000 - -00000000008000000000000000000000:DD0325D6854803D06D1D2277D5FB8D67:\ -000000000000000000000000000000000000000000000000 - -00000000004000000000000000000000:580B71A41DE37D6FAC83CCB0B3BB1C97:\ -000000000000000000000000000000000000000000000000 - -00000000002000000000000000000000:E9B1AB470A1B02EF0FF5E6754A092C96:\ -000000000000000000000000000000000000000000000000 - -00000000001000000000000000000000:8590620F5AF5993B7410282F4126BC1F:\ -000000000000000000000000000000000000000000000000 - -00000000000800000000000000000000:8D4914D2F1B22B2E268E66E532D29D7C:\ -000000000000000000000000000000000000000000000000 - -00000000000400000000000000000000:FD826CE48E62C5E30867044B86BA4B56:\ -000000000000000000000000000000000000000000000000 - -00000000000200000000000000000000:100E7B831C9F35FA1271F5F1316C6FCF:\ -000000000000000000000000000000000000000000000000 - -00000000000100000000000000000000:0A2DD0C17F68B996AA96C007003D0B31:\ -000000000000000000000000000000000000000000000000 - -00000000000080000000000000000000:C95F68C57E06B0A2E1F623C83C5D80BF:\ -000000000000000000000000000000000000000000000000 - -00000000000040000000000000000000:571CAFC92C7C8A5EC54C0741E186905C:\ -000000000000000000000000000000000000000000000000 - -00000000000020000000000000000000:22514353E95312C112255E1EED0B2DF6:\ -000000000000000000000000000000000000000000000000 - -00000000000010000000000000000000:791A8BF462BD17580BD9152C6D11C6C5:\ -000000000000000000000000000000000000000000000000 - -00000000000008000000000000000000:5882A0178D548F84A165DB809C60DC28:\ -000000000000000000000000000000000000000000000000 - -00000000000004000000000000000000:3CE4A90EED4458CA6039E42DDADB71C3:\ -000000000000000000000000000000000000000000000000 - -00000000000002000000000000000000:D3CBAB261207A16BE2751E77044FD7C9:\ -000000000000000000000000000000000000000000000000 - -00000000000001000000000000000000:24E32B698A7B32217093628B01F424AB:\ -000000000000000000000000000000000000000000000000 - -00000000000000800000000000000000:9F6AFC0AF27CF565110C77E3C24F4F5B:\ -000000000000000000000000000000000000000000000000 - -00000000000000400000000000000000:E088AA5CDA20EF267BB039B00C72C45B:\ -000000000000000000000000000000000000000000000000 - -00000000000000200000000000000000:5CF1018B7E0BA1775601C2E279900360:\ -000000000000000000000000000000000000000000000000 - -00000000000000100000000000000000:3B1A7388B89FB9416AD8753CF5AF35D2:\ -000000000000000000000000000000000000000000000000 - -00000000000000080000000000000000:137FA4ED00AFCD9F5D8BC0D14BD5837A:\ -000000000000000000000000000000000000000000000000 - -00000000000000040000000000000000:806F5C9B663559BB56F234881E4A3E60:\ -000000000000000000000000000000000000000000000000 - -00000000000000020000000000000000:8069A449152292DF2DE8642992C632B6:\ -000000000000000000000000000000000000000000000000 - -00000000000000010000000000000000:37C6CF2A1ABD1B1F1922B46C7B4A280D:\ -000000000000000000000000000000000000000000000000 - -00000000000000008000000000000000:7A2835260E5A0AA2B5DC301800EC8438:\ -000000000000000000000000000000000000000000000000 - -00000000000000004000000000000000:EE81FAF2F9058213FFCACF281CB8509E:\ -000000000000000000000000000000000000000000000000 - -00000000000000002000000000000000:57F22D93C37129BA331FDBA38E005A1E:\ -000000000000000000000000000000000000000000000000 - -00000000000000001000000000000000:EC798782E87B7D9F780CC3C3A46519B5:\ -000000000000000000000000000000000000000000000000 - -00000000000000000800000000000000:43EA28497F5D40E3A4744FA2EDAA42DE:\ -000000000000000000000000000000000000000000000000 - -00000000000000000400000000000000:91F004E7DEBF41B3414DD8C5C317372C:\ -000000000000000000000000000000000000000000000000 - -00000000000000000200000000000000:C249EAE54E7B4DF43B938C1B4CC28314:\ -000000000000000000000000000000000000000000000000 - -00000000000000000100000000000000:32C289D7EEFB99D2F17AD7B7D45FE1EC:\ -000000000000000000000000000000000000000000000000 - -00000000000000000080000000000000:A675FB2E8DDBF810CEF01CF2B728CD2B:\ -000000000000000000000000000000000000000000000000 - -00000000000000000040000000000000:A418AAAB6E6921CC731AA8A349386080:\ -000000000000000000000000000000000000000000000000 - -00000000000000000020000000000000:2E2B0F44863E67D9B0215C4ABD60417F:\ -000000000000000000000000000000000000000000000000 - -00000000000000000010000000000000:F0AF7CB19E911D481F6426DAEFDD2240:\ -000000000000000000000000000000000000000000000000 - -00000000000000000008000000000000:CB1304DAAA2DF6878F56AC2E0F887E04:\ -000000000000000000000000000000000000000000000000 - -00000000000000000004000000000000:B1B70A7E6A0CD1916D9B78BEA19084AE:\ -000000000000000000000000000000000000000000000000 - -00000000000000000002000000000000:0CDE9F9BE646A5FCE3436B794A9CFC65:\ -000000000000000000000000000000000000000000000000 - -00000000000000000001000000000000:68C7946D476A0A36674B36AFD7E5DF33:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000800000000000:48770159A07DD8DFFF06C80105F8D57C:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000400000000000:665E62801B3260E3C45BD3BE34DFDEBE:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000200000000000:4159C1F686BFBE5B0E50BDB0DA532B69:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000100000000000:6333100A5A4AD917DC2D4E78A04869A3:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000080000000000:866A4519AB1D199F25886B89D0539ACC:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000040000000000:EC0CFD37E4CBC7E8BE385283F7AEA75A:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000020000000000:CA2F383AACCA0810AA13F3E710621422:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000010000000000:1D0EEF6870444F950937831EC0A55D98:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000008000000000:37839B35ED6801E7670496D479A95017:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000004000000000:02317C8C7098C4F94AB867AC7A49DD8D:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000002000000000:FFB4CB4E3F7F8BF3367EBD43236518B4:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000001000000000:36BEDEF1E4AA3E4A40A305741713FCBF:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000800000000:B2DFE3C4870269C1E3FEEC39161540D9:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000400000000:147EF2518AD45DA0026056ECBF6A3DFA:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000200000000:027A75E4DE635790E47ACE90D7928804:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000100000000:C4CF3CCB59BF87D0AFBD629F48CFBB7B:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000080000000:35165C93F564C97E1C32EF97E8151A87:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000040000000:449DE37F7D5A1BBD628ABBE7E061701D:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000020000000:B1D45EAF218F1799B149BAD677FE129F:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000010000000:BE08AC6DB6BD0583AA9D2ABC71C73DCD:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000008000000:BCC835BD3DF1A79E4C7C145B899A5C25:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000004000000:3D311EA611FF5AF371301C58A8E9912D:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000002000000:A5A1BEA594ACC7CA80F09EA5ADDB5C71:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000001000000:0F09492429FE7222D6CD8190D9F2FFBF:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000800000:816D2220A16B8AAEE71364FD43636C6F:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000400000:D7E8702408419ED73191B107EAF75A0B:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000200000:9B170EFB1E235B433C78E276BEA082F0:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000100000:03BBECC5598AE974430F29395522F096:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000080000:DB53517766C0E8CF42059607CBA89380:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000040000:2E2AF4B7931F0AEFFAC5471148A5BB97:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000020000:C872C0408266403B984F635FF5683DE4:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000010000:15DCF750B0E3A68AD1F4EFD07E8967B4:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000008000:B41092048E9E6A749F6FD8CE515A23A3:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000004000:4DA9267D62507994312BD5C99ADDE730:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000002000:9E2FCA6D1D626E9C6A924EBF7DBF618A:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000001000:E092E8D7EF2C2465AEFB2493C3063590:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000800:1C0E58DA37D1068378A88DBE2EDE4E10:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000400:19063F854232B8509A6A3A6D46809959:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000200:447FB09E54EFA285F7530F25C4EA0022:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000100:F6ABE86321BE40E1FBFDAFED37CC1D9B:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000080:4E8506CD006666341D6CF51F98B41F35:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000040:53995DE0009CA18BECAFB8307C54C14C:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000020:2006BF99F4C58B6CC2627856593FAEEA:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000010:2DA697D2737CB30B744A4644FA1CBC6E:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000008:47A22ACDB60C3A986A8F76ECD0EA3433:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000004:FDAA17C2CDE20268FE36E164EA532151:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000002:98E7247C07F0FE411C267E4384B0F600:\ -000000000000000000000000000000000000000000000000 - -00000000000000000000000000000001:CD33B28AC773F74BA00ED1F312572435:\ -000000000000000000000000000000000000000000000000 - 80000000000000000000000000000000:DDC6BF790C15760D8D9AEB6F9A75FD4E:\ 0000000000000000000000000000000000000000000000000000000000000000 @@ -4042,120 +4155,6 @@ C9C8CBCA4447465926272021545B5A59:058691E627ECBC36AC07B6DB423BD698:\ 00000000000000000000000000000001:530F8AFBC74536B9A963B4F1C4CB738B:\ 0000000000000000000000000000000000000000000000000000000000000000 - - - -# From FIPS 197 -00112233445566778899AABBCCDDEEFF:69C4E0D86A7B0430D8CDB78070B4C55A:\ -000102030405060708090A0B0C0D0E0F -00112233445566778899AABBCCDDEEFF:DDA97CA4864CDFE06EAF70A0EC0D7191:\ -000102030405060708090A0B0C0D0E0F1011121314151617 -00112233445566778899AABBCCDDEEFF:8EA2B7CA516745BFEAFC49904B496089:\ -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F - -506812A45F08C889B97F5980038B8359:D8F532538289EF7D06B506A4FD5BE9C9:\ -00010203050607080A0B0C0D0F101112 -5C6D71CA30DE8B8B00549984D2EC7D4B:59AB30F4D4EE6E4FF9907EF65B1FB68C:\ -14151617191A1B1C1E1F202123242526 -53F3F4C64F8616E4E7C56199F48F21F6:BF1ED2FCB2AF3FD41443B56D85025CB1:\ -28292A2B2D2E2F30323334353738393A -A1EB65A3487165FB0F1C27FF9959F703:7316632D5C32233EDCB0780560EAE8B2:\ -3C3D3E3F41424344464748494B4C4D4E -3553ECF0B1739558B08E350A98A39BFA:408C073E3E2538072B72625E68B8364B:\ -50515253555657585A5B5C5D5F606162 -67429969490B9711AE2B01DC497AFDE8:E1F94DFA776597BEACA262F2F6366FEA:\ -64656667696A6B6C6E6F707173747576 -93385C1F2AEC8BED192F5A8E161DD508:F29E986C6A1C27D7B29FFD7EE92B75F1:\ -78797A7B7D7E7F80828384858788898A -3E23B3BC065BCC152407E23896D77783:1959338344E945670678A5D432C90B93:\ -54555657595A5B5C5E5F606163646566 -79F0FBA002BE1744670E7E99290D8F52:E49BDDD2369B83EE66E6C75A1161B394:\ -68696A6B6D6E6F70727374757778797A -DA23FE9D5BD63E1D72E3DAFBE21A6C2A:D3388F19057FF704B70784164A74867D:\ -7C7D7E7F81828384868788898B8C8D8E -E3F5698BA90B6A022EFD7DB2C7E6C823:23AA03E2D5E4CD24F3217E596480D1E1:\ -A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 -BDC2691D4F1B73D2700679C3BCBF9C6E:C84113D68B666AB2A50A8BDB222E91B9:\ -E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 -BA74E02093217EE1BA1B42BD5624349A:AC02403981CD4340B507963DB65CB7B6:\ -08090A0B0D0E0F10121314151718191A -B5C593B5851C57FBF8B3F57715E8F680:8D1299236223359474011F6BF5088414:\ -6C6D6E6F71727374767778797B7C7D7E - -FEC1C04F529BBD17D8CECFCC4718B17F:62564C738F3EFE186E1A127A0C4D3C61:\ -4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 -32DF99B431ED5DC5ACF8CAF6DC6CE475:07805AA043986EB23693E23BEF8F3438:\ -68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 -7FDC2B746F3F665296943B83710D1F82:DF0B4931038BADE848DEE3B4B85AA44B:\ -868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 -8FBA1510A3C5B87E2EAA3F7A91455CA2:592D5FDED76582E4143C65099309477C:\ -A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 -2C9B468B1C2EED92578D41B0716B223B:C9B8D6545580D3DFBCDD09B954ED4E92:\ -C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE -0A2BBF0EFC6BC0034F8A03433FCA1B1A:5DCCD5D6EB7C1B42ACB008201DF707A0:\ -E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC -25260E1F31F4104D387222E70632504B:A2A91682FFEB6ED1D34340946829E6F9:\ -FEFE01010304050608090A0B0D0E0F10121314151718191A -C527D25A49F08A5228D338642AE65137:E45D185B797000348D9267960A68435D:\ -1C1D1E1F21222324262728292B2C2D2E3031323335363738 -3B49FC081432F5890D0E3D87E884A69E:45E060DAE5901CDA8089E10D4F4C246B:\ -3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 -D173F9ED1E57597E166931DF2754A083:F6951AFACC0079A369C71FDCFF45DF50:\ -58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 -8C2B7CAFA5AFE7F13562DAEAE1ADEDE0:9E95E00F351D5B3AC3D0E22E626DDAD6:\ -767778797B7C7D7E80818283858687888A8B8C8D8F909192 -AAF4EC8C1A815AEB826CAB741339532C:9CB566FF26D92DAD083B51FDC18C173C:\ -94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 -40BE8C5D9108E663F38F1A2395279ECF:C9C82766176A9B228EB9A974A010B4FB:\ -D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC -0C8AD9BC32D43E04716753AA4CFBE351:D8E26AA02945881D5137F1C1E1386E88:\ -2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 -1407B1D5F87D63357C8DC7EBBAEBBFEE:C0E024CCD68FF5FFA4D139C355A77C55:\ -48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 - -E51AA0B135DBA566939C3B6359A980C5:8CD9423DFC459E547155C5D1D522E540:\ -E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 -069A007FC76A459F98BAF917FEDF9521:080E9517EB1677719ACF728086040AE3:\ -08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E -726165C1723FBCF6C026D7D00B091027:7C1700211A3991FC0ECDED0AB3E576B0:\ -30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 -D7C544DE91D55CFCDE1F84CA382200CE:DABCBCC855839251DB51E224FBE87435:\ -58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E -FED3C9A161B9B5B2BD611B41DC9DA357:68D56FAD0406947A4DD27A7448C10F1D:\ -80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 -4F634CDC6551043409F30B635832CF82:DA9A11479844D1FFEE24BBF3719A9925:\ -A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE -109CE98DB0DFB36734D9F3394711B4E6:5E4BA572F8D23E738DA9B05BA24B8D81:\ -D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 -4EA6DFABA2D8A02FFDFFA89835987242:A115A2065D667E3F0B883837A6E903F8:\ -70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 -5AE094F54AF58E6E3CDBF976DAC6D9EF:3E9E90DC33EAC2437D86AD30B137E66E:\ -98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE -764D8E8E0F29926DBE5122E66354FDBE:01CE82D8FBCDAE824CB3C48E495C3692:\ -C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 -3F0418F888CDF29A982BF6B75410D6A9:0C9CFF163CE936FAAF083CFD3DEA3117:\ -E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E -E4A3E7CB12CDD56AA4A75197A9530220:5131BA9BD48F2BBA85560680DF504B52:\ -10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 -211677684AAC1EC1A160F44C4EBF3F26:9DC503BBF09823AEC8A977A5AD26CCB2:\ -38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E -D21E439FF749AC8F18D6D4B105E03895:9A6DB0C0862E506A9E397225884041D7:\ -60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 -D9F6FF44646C4725BD4C0103FF5552A7:430BF9570804185E1AB6365FC6A6860C:\ -88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE -0B1256C2A00B976250CFC5B0C37ED382:3525EBC02F4886E6A5A3762813E8CE8A:\ -B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 -B056447FFC6DC4523A36CC2E972A3A79:07FA265C763779CCE224C7BAD671027B:\ -D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE -5E25CA78F0DE55802524D38DA3FE4456:E8B72B4E8BE243438C9FFF1F0E205872:\ -00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 -A5BCF4728FA5EAAD8567C0DC24675F83:109D4F999A0E11ACE1F05E6B22CBCB50:\ -28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E -814E59F97ED84646B78B2CA022E9CA43:45A5E8D4C3ED58403FF08D68A0CC4029:\ -50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 -15478BEEC58F4775C7A7F5D4395514D7:196865964DB3D417B6BD4D586BCB7634:\ -78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E - # From the 'official' Blowfish vectors (mostly by SSLeay, aka OpenSSL) [Blowfish] 0000000000000000:245946885754369A:0123456789ABCDEF diff --git a/checks/x509.cpp b/checks/x509.cpp index 6f191285c..69dd29492 100644 --- a/checks/x509.cpp +++ b/checks/x509.cpp @@ -129,6 +129,8 @@ void do_x509_tests(RandomNumberGenerator& rng) { std::cout << "Testing X.509 CA/CRL/cert/cert request: " << std::flush; + std::string hash_fn = "SHA-256"; + /* Create the CA's key and self-signed cert */ std::cout << '.' << std::flush; RSA_PrivateKey ca_key(rng, 1024); @@ -136,6 +138,7 @@ void do_x509_tests(RandomNumberGenerator& rng) std::cout << '.' << std::flush; X509_Certificate ca_cert = X509::create_self_signed_cert(ca_opts(), ca_key, + hash_fn, rng); std::cout << '.' << std::flush; @@ -146,12 +149,14 @@ void do_x509_tests(RandomNumberGenerator& rng) std::cout << '.' << std::flush; PKCS10_Request user1_req = X509::create_cert_req(req_opts1(), user1_key, + "SHA-1", rng); /* Create user #2's key and cert request */ std::cout << '.' << std::flush; #if defined(BOTAN_HAS_ECDSA) - ECDSA_PrivateKey user2_key(rng, get_EC_Dom_Pars_by_oid("1.3.132.0.8")); + EC_Domain_Params ecc_domain = get_EC_Dom_Pars_by_oid("1.2.840.10045.3.1.7"); + ECDSA_PrivateKey user2_key(rng, ecc_domain); #else RSA_PrivateKey user2_key(rng, 1024); #endif @@ -159,11 +164,12 @@ void do_x509_tests(RandomNumberGenerator& rng) std::cout << '.' << std::flush; PKCS10_Request user2_req = X509::create_cert_req(req_opts2(), user2_key, + hash_fn, rng); /* Create the CA object */ std::cout << '.' << std::flush; - X509_CA ca(ca_cert, ca_key); + X509_CA ca(ca_cert, ca_key, hash_fn); std::cout << '.' << std::flush; /* Sign the requests to create the certs */ diff --git a/doc/examples/ca.cpp b/doc/examples/ca.cpp index 41dd409d5..9195be418 100644 --- a/doc/examples/ca.cpp +++ b/doc/examples/ca.cpp @@ -47,7 +47,7 @@ int main(int argc, char* argv[]) PKCS8::load_key(arg_ca_key, rng, arg_passphrase) ); - X509_CA ca(ca_cert, *privkey); + X509_CA ca(ca_cert, *privkey, "SHA-256"); // got a request PKCS10_Request req(arg_req_file); diff --git a/doc/examples/cpuid.cpp b/doc/examples/cpuid.cpp index 1bdee787c..76438783f 100644 --- a/doc/examples/cpuid.cpp +++ b/doc/examples/cpuid.cpp @@ -1,17 +1,28 @@ -#include <stdio.h> - +#include <iostream> #include <botan/cpuid.h> using namespace Botan; +void print_if_feature(const std::string& feature_name, bool exists) + { + if(exists) + std::cout << feature_name << '\n'; + else + std::cout << '[' << feature_name << ']' << '\n'; + } + int main() { - printf("Cache line size: %d\n", CPUID::cache_line_size()); - printf("RDTSC: %d\n", CPUID::has_rdtsc()); - printf("SSE2 %d\n", CPUID::has_sse2()); - printf("SSSE3 %d\n", CPUID::has_ssse3()); - printf("SSE41 %d\n", CPUID::has_sse41()); - printf("SSE42 %d\n", CPUID::has_sse42()); + std::cout << "Cache line size = " << CPUID::cache_line_size() << "\n"; + + print_if_feature("RDTSC", CPUID::has_rdtsc()); + print_if_feature("SSE2", CPUID::has_sse2()); + print_if_feature("SSSE3", CPUID::has_ssse3()); + print_if_feature("SSE4.1", CPUID::has_sse41()); + print_if_feature("SSE4.2", CPUID::has_sse42()); + + print_if_feature("AES-NI", CPUID::has_aes_intel()); + print_if_feature("AES-VIA", CPUID::has_aes_via()); - printf("AltiVec %d\n", CPUID::has_altivec()); + print_if_feature("AltiVec", CPUID::has_altivec()); } diff --git a/doc/examples/gen_certs.cpp b/doc/examples/gen_certs.cpp index f635e1ccf..90cb80038 100644 --- a/doc/examples/gen_certs.cpp +++ b/doc/examples/gen_certs.cpp @@ -34,7 +34,7 @@ X509_Certificate make_ca_cert(RandomNumberGenerator& rng, opts.end = later; opts.CA_key(); - return X509::create_self_signed_cert(opts, priv_key, rng); + return X509::create_self_signed_cert(opts, priv_key, "SHA-256", rng); } PKCS10_Request make_server_cert_req(const Private_Key& key, @@ -47,7 +47,7 @@ PKCS10_Request make_server_cert_req(const Private_Key& key, opts.add_ex_constraint("PKIX.ServerAuth"); - return X509::create_cert_req(opts, key, rng); + return X509::create_cert_req(opts, key, "SHA-1", rng); } void save_pair(const std::string& name, @@ -92,7 +92,7 @@ int main() save_pair("ca", ca_password, ca_cert, ca_key, rng); - X509_CA ca(ca_cert, ca_key); + X509_CA ca(ca_cert, ca_key, "SHA-256"); RSA_PrivateKey httpd_key(rng, 1536); X509_Certificate httpd_cert = ca.sign_request( diff --git a/doc/examples/pkcs10.cpp b/doc/examples/pkcs10.cpp index d719baf72..d9fa9accb 100644 --- a/doc/examples/pkcs10.cpp +++ b/doc/examples/pkcs10.cpp @@ -59,7 +59,7 @@ int main(int argc, char* argv[]) opts.xmpp = "[email protected]"; - PKCS10_Request req = X509::create_cert_req(opts, priv_key, rng); + PKCS10_Request req = X509::create_cert_req(opts, priv_key, "SHA-1", rng); std::ofstream req_file("req.pem"); req_file << req.PEM_encode(); diff --git a/doc/examples/self_sig.cpp b/doc/examples/self_sig.cpp index 0bf17e3bc..93161f7d2 100644 --- a/doc/examples/self_sig.cpp +++ b/doc/examples/self_sig.cpp @@ -64,7 +64,8 @@ int main(int argc, char* argv[]) if(do_CA) opts.CA_key(); - X509_Certificate cert = X509::create_self_signed_cert(opts, key, rng); + X509_Certificate cert = + X509::create_self_signed_cert(opts, key, "SHA-256", rng); std::ofstream cert_file("cert.pem"); cert_file << cert.PEM_encode(); diff --git a/doc/log.txt b/doc/log.txt index 75fde9a5f..e788aa8c9 100644 --- a/doc/log.txt +++ b/doc/log.txt @@ -1,5 +1,8 @@ * 1.9.3-dev, ????-??-?? + - Add new AES implementation using Intel's AES instruction intrinsics + - Allow use of any hash function in X.509 certificate creation + - Optimizations for MARS, Skipjack, and AES - Set macros for available SIMD instructions in build.h * 1.9.2, 2009-11-03 diff --git a/doc/thanks.txt b/doc/thanks.txt index caa2fb538..def96a16a 100644 --- a/doc/thanks.txt +++ b/doc/thanks.txt @@ -23,9 +23,10 @@ has provided financial assistance to the project. Barry Kavanagh of AEP Systems Ltd kindly provided an AEP2000 crypto card and drivers, enabling the creation of Botan's AEP engine module. -In addition, the following people have unknowingly contributed help: +In addition, the following people have unknowingly contributed help +via public domain code which has been repurposed into the library: - Dean Gaudet <[email protected]> wrote the SSE2 implementation of SHA-1 + Dean Gaudet wrote the SSE2 implementation of SHA-1 The implementation of DES is based off a public domain implementation by Phil Karn from 1994 (he, in turn, credits Richard Outerbridge and Jim Gillogly). @@ -42,7 +43,7 @@ In addition, the following people have unknowingly contributed help: Some of the hash functions (MD5, SHA-1, etc) use an optimized implementation of one of the boolean functions, which was discovered by Colin Plumb. - The design of Randpool takes some of it's design principles from those + The design of Randpool takes some of its design principles from those suggested by Eric A. Young in his SSLeay documentation, Peter Gutmann's paper "Software Generation of Practically Strong Random Numbers", and the paper "Cryptanalytic Attacks on Pseudorandom Number Generators", by Kelsey, diff --git a/src/block/aes/aes.cpp b/src/block/aes/aes.cpp index 7ba8136ec..108edd7a3 100644 --- a/src/block/aes/aes.cpp +++ b/src/block/aes/aes.cpp @@ -10,6 +10,404 @@ namespace Botan { +namespace { + +const byte SE[256] = { + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, + 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, + 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, + 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, + 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, + 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, + 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, + 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, + 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, + 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, + 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, + 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, + 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, + 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, + 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, + 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, + 0xB0, 0x54, 0xBB, 0x16 }; + +const byte SD[256] = { + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, + 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, + 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, + 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, + 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, + 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, + 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, + 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, + 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, + 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, + 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, + 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, + 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, + 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, + 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, + 0x55, 0x21, 0x0C, 0x7D }; + +const u32bit TE[1024] = { + 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, + 0xDE6F6FB1, 0x91C5C554, 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, + 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A, 0x8FCACA45, 0x1F82829D, + 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B, + 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, + 0xE4727296, 0x9BC0C05B, 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, + 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F, 0x6834345C, 0x51A5A5F4, + 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F, + 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, + 0x0A05050F, 0x2F9A9AB5, 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, + 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F, 0x1209091B, 0x1D83839E, + 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB, + 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, + 0x5E2F2F71, 0x13848497, 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, + 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED, 0xD46A6ABE, 0x8DCBCB46, + 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A, + 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, + 0x66333355, 0x11858594, 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, + 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3, 0xA25151F3, 0x5DA3A3FE, + 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504, + 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, + 0xFDF3F30E, 0xBFD2D26D, 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, + 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739, 0x93C4C457, 0x55A7A7F2, + 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395, + 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, + 0x3B9090AB, 0x0B888883, 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, + 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76, 0xDBE0E03B, 0x64323256, + 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4, + 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, + 0xD3E4E437, 0xF279798B, 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, + 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0, 0xD86C6CB4, 0xAC5656FA, + 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818, + 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, + 0x73B4B4C7, 0x97C6C651, 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, + 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85, 0xE0707090, 0x7C3E3E42, + 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12, + 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, + 0x3A1D1D27, 0x279E9EB9, 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, + 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7, 0x2D9B9BB6, 0x3C1E1E22, + 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A, + 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, + 0x844242C6, 0xD06868B8, 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, + 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A, 0xA5C66363, 0x84F87C7C, + 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5, + 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, + 0xE64DABAB, 0x9AEC7676, 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, + 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0, 0xEC41ADAD, 0x67B3D4D4, + 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0, + 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, + 0x02F5F7F7, 0x4F83CCCC, 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, + 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515, 0x0C080404, 0x5295C7C7, + 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A, + 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, + 0xCD7FB2B2, 0x9FEA7575, 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, + 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0, 0xF6A45252, 0x4D763B3B, + 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484, + 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, + 0xC879B1B1, 0xEDB65B5B, 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, + 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF, 0x6BBBD0D0, 0x2AC5EFEF, + 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585, + 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, + 0xBA259F9F, 0xE34BA8A8, 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, + 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5, 0xDF63BCBC, 0xC177B6B6, + 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2, + 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, + 0xCC884444, 0x392E1717, 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, + 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373, 0xA0C06060, 0x98198181, + 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888, + 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, + 0x1D160B0B, 0x76ADDBDB, 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, + 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C, 0x5D9FC2C2, 0x6EBDD3D3, + 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979, + 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, + 0xD29C4E4E, 0xE049A9A9, 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, + 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808, 0xD56FBABA, 0x88F07878, + 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6, + 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, + 0x860D8B8B, 0x850F8A8A, 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, + 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E, 0xA3C26161, 0x5F6A3535, + 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E, + 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, + 0x89078E8E, 0xA7339494, 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, + 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF, 0x8F038C8C, 0xF859A1A1, + 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868, + 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, + 0xD66DBBBB, 0x3A2C1616, 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, + 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5, 0x30506030, 0x01030201, + 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76, + 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, + 0x47C98E47, 0xF00BFBF0, 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, + 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0, 0xB7C275B7, 0xFD1CE1FD, + 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC, + 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, + 0x31536231, 0x153F2A15, 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, + 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A, 0x07090E07, 0x12362412, + 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75, + 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, + 0x5AEEB45A, 0xA0FB5BA0, 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, + 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384, 0x53F5A653, 0xD168B9D1, + 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B, + 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, + 0x58E8B058, 0xCF4A85CF, 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, + 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185, 0x45CF8A45, 0xF910E9F9, + 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8, + 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, + 0x38487038, 0xF504F1F5, 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, + 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2, 0xCD4C81CD, 0x0C14180C, + 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17, + 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, + 0x192B3219, 0x7395E673, 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, + 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88, 0x46CA8C46, 0xEE29C7EE, + 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB, + 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, + 0x246C4824, 0x5CE4B85C, 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, + 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279, 0xE732D5E7, 0xC8438BC8, + 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9, + 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, + 0xAEE947AE, 0x08181008, 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, + 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6, 0xE823CBE8, 0xDD7CA1DD, + 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A, + 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, + 0xF601F7F6, 0x0E121C0E, 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, + 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E, 0xE138D9E1, 0xF813EBF8, + 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394, + 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, + 0x28785028, 0xDF7AA5DF, 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, + 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068, 0x41C38241, 0x99B02999, + 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16, + 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, + 0x6F6FB1DE, 0xC5C55491, 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, + 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, 0xCACA458F, 0x82829D1F, + 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, + 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, + 0x727296E4, 0xC0C05B9B, 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, + 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, 0x34345C68, 0xA5A5F451, + 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, + 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, + 0x05050F0A, 0x9A9AB52F, 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, + 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, 0x09091B12, 0x83839E1D, + 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, + 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, + 0x2F2F715E, 0x84849713, 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, + 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, 0x6A6ABED4, 0xCBCB468D, + 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, + 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, + 0x33335566, 0x85859411, 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, + 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, 0x5151F3A2, 0xA3A3FE5D, + 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, + 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, + 0xF3F30EFD, 0xD2D26DBF, 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, + 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, 0xC4C45793, 0xA7A7F255, + 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, + 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, + 0x9090AB3B, 0x8888830B, 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, + 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, 0xE0E03BDB, 0x32325664, + 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, + 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, + 0xE4E437D3, 0x79798BF2, 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, + 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, 0x6C6CB4D8, 0x5656FAAC, + 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, + 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, + 0xB4B4C773, 0xC6C65197, 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, + 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, 0x707090E0, 0x3E3E427C, + 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, + 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, + 0x1D1D273A, 0x9E9EB927, 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, + 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, 0x9B9BB62D, 0x1E1E223C, + 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, + 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, + 0x4242C684, 0x6868B8D0, 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, + 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C }; + +const u32bit TD[1024] = { + 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, 0x1F9D45F1, + 0xACFA58AB, 0x4BE30393, 0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, + 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F, 0xDEB15A49, 0x25BA1B67, + 0x45EA0E98, 0x5DFEC0E1, 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6, + 0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, + 0x49E06929, 0x8EC9C844, 0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, + 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4, 0x63DF4A18, 0xE51A3182, + 0x97513360, 0x62537F45, 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94, + 0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, + 0xE31F8F57, 0x6655AB2A, 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, + 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C, 0x8ACF1C2B, 0xA779B492, + 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A, + 0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, + 0x5E719F06, 0xBD6E1051, 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, + 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF, 0x1998FB24, 0xD6BDE997, + 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB, + 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, 0x09808683, 0x322BED48, + 0x1E1170AC, 0x6C5A724E, 0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, + 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A, 0x0C0A67B1, 0x9357E70F, + 0xB4EE96D2, 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16, + 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, 0xF28BC7AD, + 0x2DB6A8B9, 0x141EA9C8, 0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, + 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34, 0x8B432976, 0xCB23C6DC, + 0xB6EDFC68, 0xB8E4F163, 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120, + 0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, + 0x0D8652EC, 0x77C1E3D0, 0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, + 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF, 0x87494EC7, 0xD938D1C1, + 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4, + 0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, + 0x2E39F75E, 0x82C3AFF5, 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, + 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B, 0xCD267809, 0x6E5918F4, + 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6, + 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, + 0xC6A59430, 0x35A266C0, 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, + 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F, 0x764DD68D, 0x43EFB04D, + 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F, + 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, 0xB3671D5A, 0x92DBD252, + 0xE9105633, 0x6DD64713, 0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, + 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C, 0x9CD2DF59, 0x55F2733F, + 0x1814CE79, 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86, + 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, 0xBCE2250C, + 0x283C498B, 0xFF0D9541, 0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, + 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742, 0x5051F4A7, 0x537E4165, + 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303, + 0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, + 0x80263544, 0x8FB562A3, 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, + 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9, 0xE7038F5F, 0x9515929C, + 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8, + 0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, 0xB6BEE14F, 0x17F088AD, + 0x66C920AC, 0xB47DCE3A, 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, + 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B, 0x58704868, 0x198F45FD, + 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB, + 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, 0xF2302887, 0xB223BFA5, + 0xBA02036A, 0x5CED1682, 0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, + 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE, 0x9D342E53, 0xA0A2F355, + 0x32058AE1, 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10, + 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, 0x0571C45D, + 0x6F0406D4, 0xFF605015, 0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, + 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE, 0x47A17C0A, 0xE97C420F, + 0xC9F8841E, 0x00000000, 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72, + 0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, + 0xD19B5B54, 0x3A24362E, 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, + 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A, 0x0AE293BA, 0xE5C0A02A, + 0x433C22E0, 0x1D121B17, 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9, + 0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, + 0xC544663B, 0x345BFB7E, 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, + 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611, 0x7D854A24, 0xF8D2BB3D, + 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3, + 0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, + 0xD8567D2C, 0xEF223390, 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, + 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF, 0xE42C3A9D, 0x0D507892, + 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF, + 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, 0x3BC8AC99, 0xA710187D, + 0x6EE89C63, 0x7BDB3BBB, 0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, + 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8, 0xD9BAE79B, 0xCE4A6F36, + 0xD4EA9F09, 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266, + 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, 0xF741ECDA, + 0x0E7FCD50, 0x2F1791F6, 0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, + 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551, 0x049D5EEA, 0x5D018C35, + 0x73FA8774, 0x2EFB0B41, 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647, + 0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, + 0xEDE11CE5, 0x3C7A47B1, 0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, + 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB, 0x81CAAFF3, 0x3EB968C4, + 0x2C382434, 0x5FC2A340, 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95, + 0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, + 0x74486C5C, 0x42D0B857, 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, + 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3, 0xFA552030, 0x6DF6AD76, + 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562, + 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, 0x7502C32F, 0xF012814C, + 0x97A38D46, 0xF9C66BD3, 0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, + 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9, 0x896A75C2, 0x7978F48E, + 0x3E6B9958, 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE, + 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, 0xAE84BB6B, + 0xA01CFE81, 0x2B94F908, 0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, + 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655, 0x2807B2EB, 0xC2032FB5, + 0x7B9A86C5, 0x08A5D337, 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16, + 0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, + 0x621FD134, 0xFE8AC4A6, 0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, + 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E, 0x8AF93E21, 0x063D96DD, + 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050, + 0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, + 0x5B38E719, 0xEEDB79C8, 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, + 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A, 0xFFFBFD0E, 0x38560F85, + 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436, + 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, 0xC54F80C0, 0x20A261DC, + 0x4B695A77, 0x1A161C12, 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, + 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E, 0x198557F1, 0x074CAF75, + 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB, + 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, 0xDCCAD731, 0x85104263, + 0x22401397, 0x112084C6, 0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, + 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1, 0x166C2BB3, 0xB999A970, + 0x48FA1194, 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233, + 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, 0xDE28A57A, + 0x8E26DAB7, 0xBFA43FAD, 0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, + 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3, 0x80BE9F5D, 0x937C69D0, + 0x2DA96FD5, 0x12B3CF25, 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B, + 0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, + 0xCF0821BC, 0xE8E6EF15, 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, + 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2, 0xBC37744E, 0xCAA6FC82, + 0xD0B0E090, 0xD81533A7, 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791, + 0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, + 0x1FB8C12C, 0x517F4665, 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, + 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6, 0x618C9AD7, 0x0C7A37A1, + 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47, + 0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, + 0x6F14DF3D, 0xDB867844, 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, + 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D, 0x017139A8, 0xB3DE080C, + 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8, + 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, + 0xFA58ABAC, 0xE303934B, 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, + 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, 0xB15A49DE, 0xBA1B6725, + 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, + 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, + 0xE0692949, 0xC9C8448E, 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, + 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, 0xDF4A1863, 0x1A3182E5, + 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, + 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, + 0x1F8F57E3, 0x55AB2A66, 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, + 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, 0xCF1C2B8A, 0x79B492A7, + 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, + 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, + 0x719F065E, 0x6E1051BD, 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, + 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, 0x98FB2419, 0xBDE997D6, + 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, + 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, + 0x1170AC1E, 0x5A724E6C, 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, + 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, 0x0A67B10C, 0x57E70F93, + 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, + 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, + 0xB6A8B92D, 0x1EA9C814, 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, + 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, 0x4329768B, 0x23C6DCCB, + 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, + 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, + 0x8652EC0D, 0xC1E3D077, 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, + 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, 0x494EC787, 0x38D1C1D9, + 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, + 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, + 0x39F75E2E, 0xC3AFF582, 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, + 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, 0x267809CD, 0x5918F46E, + 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, + 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, + 0xA59430C6, 0xA266C035, 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, + 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, 0x4DD68D76, 0xEFB04D43, + 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, + 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, + 0x105633E9, 0xD647136D, 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, + 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, 0xD2DF599C, 0xF2733F55, + 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, + 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, + 0x3C498B28, 0x0D9541FF, 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, + 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 }; + +} + /** * AES Encryption */ @@ -192,6 +590,7 @@ void AES::key_schedule(const byte key[], u32bit length) static const u32bit RC[10] = { 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000 }; + ROUNDS = (length / 4) + 6; SecureBuffer<u32bit, 64> XEK, XDK; diff --git a/src/block/aes/aes.h b/src/block/aes/aes.h index 229ce307c..4ff3360de 100644 --- a/src/block/aes/aes.h +++ b/src/block/aes/aes.h @@ -31,11 +31,6 @@ class BOTAN_DLL AES : public BlockCipher void key_schedule(const byte[], u32bit); static u32bit S(u32bit); - static const byte SE[256]; - static const byte SD[256]; - static const u32bit TE[1024]; - static const u32bit TD[1024]; - u32bit ROUNDS; SecureBuffer<u32bit, 56> EK; diff --git a/src/block/aes/aes_tab.cpp b/src/block/aes/aes_tab.cpp deleted file mode 100644 index d42a2cd60..000000000 --- a/src/block/aes/aes_tab.cpp +++ /dev/null @@ -1,406 +0,0 @@ -/* -* S-Box and Diffusion Tables for AES -* (C) 1999-2007 Jack Lloyd -* -* Distributed under the terms of the Botan license -*/ - -#include <botan/aes.h> - -namespace Botan { - -const byte AES::SE[256] = { - 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, - 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, - 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, - 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, - 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, - 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, - 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, - 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, - 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, - 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, - 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, - 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, - 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, - 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, - 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, - 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, - 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, - 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, - 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, - 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, - 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, - 0xB0, 0x54, 0xBB, 0x16 }; - -const byte AES::SD[256] = { - 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, - 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, - 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, - 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, - 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, - 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, - 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, - 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, - 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, - 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, - 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, - 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, - 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, - 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, - 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, - 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, - 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, - 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0C, 0x7D }; - -const u32bit AES::TE[1024] = { - 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, - 0xDE6F6FB1, 0x91C5C554, 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, - 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A, 0x8FCACA45, 0x1F82829D, - 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B, - 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, - 0xE4727296, 0x9BC0C05B, 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, - 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F, 0x6834345C, 0x51A5A5F4, - 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F, - 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, - 0x0A05050F, 0x2F9A9AB5, 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, - 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F, 0x1209091B, 0x1D83839E, - 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB, - 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, - 0x5E2F2F71, 0x13848497, 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, - 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED, 0xD46A6ABE, 0x8DCBCB46, - 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A, - 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, - 0x66333355, 0x11858594, 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, - 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3, 0xA25151F3, 0x5DA3A3FE, - 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504, - 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, - 0xFDF3F30E, 0xBFD2D26D, 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, - 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739, 0x93C4C457, 0x55A7A7F2, - 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395, - 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, - 0x3B9090AB, 0x0B888883, 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, - 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76, 0xDBE0E03B, 0x64323256, - 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4, - 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, - 0xD3E4E437, 0xF279798B, 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, - 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0, 0xD86C6CB4, 0xAC5656FA, - 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818, - 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, - 0x73B4B4C7, 0x97C6C651, 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, - 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85, 0xE0707090, 0x7C3E3E42, - 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12, - 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, - 0x3A1D1D27, 0x279E9EB9, 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, - 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7, 0x2D9B9BB6, 0x3C1E1E22, - 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A, - 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, - 0x844242C6, 0xD06868B8, 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, - 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A, 0xA5C66363, 0x84F87C7C, - 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5, - 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, - 0xE64DABAB, 0x9AEC7676, 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, - 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0, 0xEC41ADAD, 0x67B3D4D4, - 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0, - 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, - 0x02F5F7F7, 0x4F83CCCC, 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, - 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515, 0x0C080404, 0x5295C7C7, - 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A, - 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, - 0xCD7FB2B2, 0x9FEA7575, 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, - 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0, 0xF6A45252, 0x4D763B3B, - 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484, - 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, - 0xC879B1B1, 0xEDB65B5B, 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, - 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF, 0x6BBBD0D0, 0x2AC5EFEF, - 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585, - 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, - 0xBA259F9F, 0xE34BA8A8, 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, - 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5, 0xDF63BCBC, 0xC177B6B6, - 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2, - 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, - 0xCC884444, 0x392E1717, 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, - 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373, 0xA0C06060, 0x98198181, - 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888, - 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, - 0x1D160B0B, 0x76ADDBDB, 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, - 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C, 0x5D9FC2C2, 0x6EBDD3D3, - 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979, - 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, - 0xD29C4E4E, 0xE049A9A9, 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, - 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808, 0xD56FBABA, 0x88F07878, - 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6, - 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, - 0x860D8B8B, 0x850F8A8A, 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, - 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E, 0xA3C26161, 0x5F6A3535, - 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E, - 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, - 0x89078E8E, 0xA7339494, 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, - 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF, 0x8F038C8C, 0xF859A1A1, - 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868, - 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, - 0xD66DBBBB, 0x3A2C1616, 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, - 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5, 0x30506030, 0x01030201, - 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76, - 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, - 0x47C98E47, 0xF00BFBF0, 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, - 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0, 0xB7C275B7, 0xFD1CE1FD, - 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC, - 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, - 0x31536231, 0x153F2A15, 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, - 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A, 0x07090E07, 0x12362412, - 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75, - 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, - 0x5AEEB45A, 0xA0FB5BA0, 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, - 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384, 0x53F5A653, 0xD168B9D1, - 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B, - 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, - 0x58E8B058, 0xCF4A85CF, 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, - 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185, 0x45CF8A45, 0xF910E9F9, - 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8, - 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, - 0x38487038, 0xF504F1F5, 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, - 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2, 0xCD4C81CD, 0x0C14180C, - 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17, - 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, - 0x192B3219, 0x7395E673, 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, - 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88, 0x46CA8C46, 0xEE29C7EE, - 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB, - 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, - 0x246C4824, 0x5CE4B85C, 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, - 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279, 0xE732D5E7, 0xC8438BC8, - 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9, - 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, - 0xAEE947AE, 0x08181008, 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, - 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6, 0xE823CBE8, 0xDD7CA1DD, - 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A, - 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, - 0xF601F7F6, 0x0E121C0E, 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, - 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E, 0xE138D9E1, 0xF813EBF8, - 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394, - 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, - 0x28785028, 0xDF7AA5DF, 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, - 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068, 0x41C38241, 0x99B02999, - 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16, - 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, - 0x6F6FB1DE, 0xC5C55491, 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, - 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, 0xCACA458F, 0x82829D1F, - 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, - 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, - 0x727296E4, 0xC0C05B9B, 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, - 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, 0x34345C68, 0xA5A5F451, - 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, - 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, - 0x05050F0A, 0x9A9AB52F, 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, - 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, 0x09091B12, 0x83839E1D, - 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, - 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, - 0x2F2F715E, 0x84849713, 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, - 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, 0x6A6ABED4, 0xCBCB468D, - 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, - 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, - 0x33335566, 0x85859411, 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, - 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, 0x5151F3A2, 0xA3A3FE5D, - 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, - 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, - 0xF3F30EFD, 0xD2D26DBF, 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, - 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, 0xC4C45793, 0xA7A7F255, - 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, - 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, - 0x9090AB3B, 0x8888830B, 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, - 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, 0xE0E03BDB, 0x32325664, - 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, - 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, - 0xE4E437D3, 0x79798BF2, 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, - 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, 0x6C6CB4D8, 0x5656FAAC, - 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, - 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, - 0xB4B4C773, 0xC6C65197, 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, - 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, 0x707090E0, 0x3E3E427C, - 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, - 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, - 0x1D1D273A, 0x9E9EB927, 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, - 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, 0x9B9BB62D, 0x1E1E223C, - 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, - 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, - 0x4242C684, 0x6868B8D0, 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, - 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C }; - -const u32bit AES::TD[1024] = { - 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, 0x1F9D45F1, - 0xACFA58AB, 0x4BE30393, 0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, - 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F, 0xDEB15A49, 0x25BA1B67, - 0x45EA0E98, 0x5DFEC0E1, 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6, - 0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, - 0x49E06929, 0x8EC9C844, 0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, - 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4, 0x63DF4A18, 0xE51A3182, - 0x97513360, 0x62537F45, 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94, - 0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, - 0xE31F8F57, 0x6655AB2A, 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, - 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C, 0x8ACF1C2B, 0xA779B492, - 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A, - 0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, - 0x5E719F06, 0xBD6E1051, 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, - 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF, 0x1998FB24, 0xD6BDE997, - 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB, - 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, 0x09808683, 0x322BED48, - 0x1E1170AC, 0x6C5A724E, 0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, - 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A, 0x0C0A67B1, 0x9357E70F, - 0xB4EE96D2, 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16, - 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, 0xF28BC7AD, - 0x2DB6A8B9, 0x141EA9C8, 0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, - 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34, 0x8B432976, 0xCB23C6DC, - 0xB6EDFC68, 0xB8E4F163, 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120, - 0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, - 0x0D8652EC, 0x77C1E3D0, 0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, - 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF, 0x87494EC7, 0xD938D1C1, - 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4, - 0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, - 0x2E39F75E, 0x82C3AFF5, 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, - 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B, 0xCD267809, 0x6E5918F4, - 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6, - 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, - 0xC6A59430, 0x35A266C0, 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, - 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F, 0x764DD68D, 0x43EFB04D, - 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F, - 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, 0xB3671D5A, 0x92DBD252, - 0xE9105633, 0x6DD64713, 0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, - 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C, 0x9CD2DF59, 0x55F2733F, - 0x1814CE79, 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86, - 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, 0xBCE2250C, - 0x283C498B, 0xFF0D9541, 0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, - 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742, 0x5051F4A7, 0x537E4165, - 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303, - 0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, - 0x80263544, 0x8FB562A3, 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, - 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9, 0xE7038F5F, 0x9515929C, - 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8, - 0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, 0xB6BEE14F, 0x17F088AD, - 0x66C920AC, 0xB47DCE3A, 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, - 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B, 0x58704868, 0x198F45FD, - 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB, - 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, 0xF2302887, 0xB223BFA5, - 0xBA02036A, 0x5CED1682, 0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, - 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE, 0x9D342E53, 0xA0A2F355, - 0x32058AE1, 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10, - 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, 0x0571C45D, - 0x6F0406D4, 0xFF605015, 0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, - 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE, 0x47A17C0A, 0xE97C420F, - 0xC9F8841E, 0x00000000, 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72, - 0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, - 0xD19B5B54, 0x3A24362E, 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, - 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A, 0x0AE293BA, 0xE5C0A02A, - 0x433C22E0, 0x1D121B17, 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9, - 0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, - 0xC544663B, 0x345BFB7E, 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, - 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611, 0x7D854A24, 0xF8D2BB3D, - 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3, - 0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, - 0xD8567D2C, 0xEF223390, 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, - 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF, 0xE42C3A9D, 0x0D507892, - 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF, - 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, 0x3BC8AC99, 0xA710187D, - 0x6EE89C63, 0x7BDB3BBB, 0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, - 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8, 0xD9BAE79B, 0xCE4A6F36, - 0xD4EA9F09, 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266, - 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, 0xF741ECDA, - 0x0E7FCD50, 0x2F1791F6, 0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, - 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551, 0x049D5EEA, 0x5D018C35, - 0x73FA8774, 0x2EFB0B41, 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647, - 0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, - 0xEDE11CE5, 0x3C7A47B1, 0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, - 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB, 0x81CAAFF3, 0x3EB968C4, - 0x2C382434, 0x5FC2A340, 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95, - 0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, - 0x74486C5C, 0x42D0B857, 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, - 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3, 0xFA552030, 0x6DF6AD76, - 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562, - 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, 0x7502C32F, 0xF012814C, - 0x97A38D46, 0xF9C66BD3, 0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, - 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9, 0x896A75C2, 0x7978F48E, - 0x3E6B9958, 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE, - 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, 0xAE84BB6B, - 0xA01CFE81, 0x2B94F908, 0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, - 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655, 0x2807B2EB, 0xC2032FB5, - 0x7B9A86C5, 0x08A5D337, 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16, - 0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, - 0x621FD134, 0xFE8AC4A6, 0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, - 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E, 0x8AF93E21, 0x063D96DD, - 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050, - 0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, - 0x5B38E719, 0xEEDB79C8, 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, - 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A, 0xFFFBFD0E, 0x38560F85, - 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436, - 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, 0xC54F80C0, 0x20A261DC, - 0x4B695A77, 0x1A161C12, 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, - 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E, 0x198557F1, 0x074CAF75, - 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB, - 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, 0xDCCAD731, 0x85104263, - 0x22401397, 0x112084C6, 0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, - 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1, 0x166C2BB3, 0xB999A970, - 0x48FA1194, 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233, - 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, 0xDE28A57A, - 0x8E26DAB7, 0xBFA43FAD, 0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, - 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3, 0x80BE9F5D, 0x937C69D0, - 0x2DA96FD5, 0x12B3CF25, 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B, - 0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, - 0xCF0821BC, 0xE8E6EF15, 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, - 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2, 0xBC37744E, 0xCAA6FC82, - 0xD0B0E090, 0xD81533A7, 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791, - 0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, - 0x1FB8C12C, 0x517F4665, 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, - 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6, 0x618C9AD7, 0x0C7A37A1, - 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47, - 0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, - 0x6F14DF3D, 0xDB867844, 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, - 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D, 0x017139A8, 0xB3DE080C, - 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8, - 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, - 0xFA58ABAC, 0xE303934B, 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, - 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, 0xB15A49DE, 0xBA1B6725, - 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, - 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, - 0xE0692949, 0xC9C8448E, 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, - 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, 0xDF4A1863, 0x1A3182E5, - 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, - 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, - 0x1F8F57E3, 0x55AB2A66, 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, - 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, 0xCF1C2B8A, 0x79B492A7, - 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, - 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, - 0x719F065E, 0x6E1051BD, 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, - 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, 0x98FB2419, 0xBDE997D6, - 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, - 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, - 0x1170AC1E, 0x5A724E6C, 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, - 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, 0x0A67B10C, 0x57E70F93, - 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, - 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, - 0xB6A8B92D, 0x1EA9C814, 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, - 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, 0x4329768B, 0x23C6DCCB, - 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, - 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, - 0x8652EC0D, 0xC1E3D077, 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, - 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, 0x494EC787, 0x38D1C1D9, - 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, - 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, - 0x39F75E2E, 0xC3AFF582, 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, - 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, 0x267809CD, 0x5918F46E, - 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, - 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, - 0xA59430C6, 0xA266C035, 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, - 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, 0x4DD68D76, 0xEFB04D43, - 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, - 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, - 0x105633E9, 0xD647136D, 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, - 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, 0xD2DF599C, 0xF2733F55, - 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, - 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, - 0x3C498B28, 0x0D9541FF, 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, - 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 }; - -} diff --git a/src/block/aes_intel/aes_intel.cpp b/src/block/aes_intel/aes_intel.cpp index 057728e72..3d3683d7d 100644 --- a/src/block/aes_intel/aes_intel.cpp +++ b/src/block/aes_intel/aes_intel.cpp @@ -1,11 +1,12 @@ /** -* AES -* (C) 1999-2009 Jack Lloyd +* AES using Intel's AES-NI instructions +* (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include <botan/aes_intel.h> +#include <botan/loadstor.h> #include <wmmintrin.h> namespace Botan { @@ -21,10 +22,86 @@ __m128i aes_128_key_expansion(__m128i key, __m128i key_with_rcon) return _mm_xor_si128(key, key_with_rcon); } +void aes_192_key_expansion(__m128i* K1, __m128i* K2, __m128i key2_with_rcon, + u32bit out[], bool last) + { + __m128i key1 = *K1; + __m128i key2 = *K2; + + key2_with_rcon = _mm_shuffle_epi32(key2_with_rcon, _MM_SHUFFLE(1,1,1,1)); + key1 = _mm_xor_si128(key1, _mm_slli_si128(key1, 4)); + key1 = _mm_xor_si128(key1, _mm_slli_si128(key1, 4)); + key1 = _mm_xor_si128(key1, _mm_slli_si128(key1, 4)); + key1 = _mm_xor_si128(key1, key2_with_rcon); + + *K1 = key1; + _mm_storeu_si128((__m128i*)out, key1); + + if(last) + return; + + key2 = _mm_xor_si128(key2, _mm_slli_si128(key2, 4)); + key2 = _mm_xor_si128(key2, _mm_shuffle_epi32(key1, _MM_SHUFFLE(3,3,3,3))); + + *K2 = key2; + out[4] = _mm_cvtsi128_si32(key2); + out[5] = _mm_cvtsi128_si32(_mm_srli_si128(key2, 4)); + } + +/* +* The second half of the AES-256 key expansion (other half same as AES-128) +*/ +__m128i aes_256_key_expansion(__m128i key, __m128i key2) + { + __m128i key_with_rcon = _mm_aeskeygenassist_si128(key2, 0x00); + key_with_rcon = _mm_shuffle_epi32(key_with_rcon, _MM_SHUFFLE(2,2,2,2)); + + key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); + key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); + key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); + return _mm_xor_si128(key, key_with_rcon); + } + } +#define AES_ENC_4_ROUNDS(K) \ + do \ + { \ + B0 = _mm_aesenc_si128(B0, K); \ + B1 = _mm_aesenc_si128(B1, K); \ + B2 = _mm_aesenc_si128(B2, K); \ + B3 = _mm_aesenc_si128(B3, K); \ + } while(0) + +#define AES_ENC_4_LAST_ROUNDS(K) \ + do \ + { \ + B0 = _mm_aesenclast_si128(B0, K); \ + B1 = _mm_aesenclast_si128(B1, K); \ + B2 = _mm_aesenclast_si128(B2, K); \ + B3 = _mm_aesenclast_si128(B3, K); \ + } while(0) + +#define AES_DEC_4_ROUNDS(K) \ + do \ + { \ + B0 = _mm_aesdec_si128(B0, K); \ + B1 = _mm_aesdec_si128(B1, K); \ + B2 = _mm_aesdec_si128(B2, K); \ + B3 = _mm_aesdec_si128(B3, K); \ + } while(0) + +#define AES_DEC_4_LAST_ROUNDS(K) \ + do \ + { \ + B0 = _mm_aesdeclast_si128(B0, K); \ + B1 = _mm_aesdeclast_si128(B1, K); \ + B2 = _mm_aesdeclast_si128(B2, K); \ + B3 = _mm_aesdeclast_si128(B3, K); \ + } while(0) + /** -* AES Encryption +* AES-128 Encryption */ void AES_128_Intel::encrypt_n(const byte in[], byte out[], u32bit blocks) const { @@ -45,6 +122,39 @@ void AES_128_Intel::encrypt_n(const byte in[], byte out[], u32bit blocks) const __m128i K9 = _mm_loadu_si128(key_mm + 9); __m128i K10 = _mm_loadu_si128(key_mm + 10); + while(blocks >= 4) + { + __m128i B0 = _mm_loadu_si128(in_mm + 0); + __m128i B1 = _mm_loadu_si128(in_mm + 1); + __m128i B2 = _mm_loadu_si128(in_mm + 2); + __m128i B3 = _mm_loadu_si128(in_mm + 3); + + B0 = _mm_xor_si128(B0, K0); + B1 = _mm_xor_si128(B1, K0); + B2 = _mm_xor_si128(B2, K0); + B3 = _mm_xor_si128(B3, K0); + + AES_ENC_4_ROUNDS(K1); + AES_ENC_4_ROUNDS(K2); + AES_ENC_4_ROUNDS(K3); + AES_ENC_4_ROUNDS(K4); + AES_ENC_4_ROUNDS(K5); + AES_ENC_4_ROUNDS(K6); + AES_ENC_4_ROUNDS(K7); + AES_ENC_4_ROUNDS(K8); + AES_ENC_4_ROUNDS(K9); + AES_ENC_4_LAST_ROUNDS(K10); + + _mm_storeu_si128(out_mm + 0, B0); + _mm_storeu_si128(out_mm + 1, B1); + _mm_storeu_si128(out_mm + 2, B2); + _mm_storeu_si128(out_mm + 3, B3); + + blocks -= 4; + in_mm += 4; + out_mm += 4; + } + for(u32bit i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); @@ -63,14 +173,11 @@ void AES_128_Intel::encrypt_n(const byte in[], byte out[], u32bit blocks) const B = _mm_aesenclast_si128(B, K10); _mm_storeu_si128(out_mm + i, B); - - in += BLOCK_SIZE; - out += BLOCK_SIZE; } } /** -* AES Decryption +* AES-128 Decryption */ void AES_128_Intel::decrypt_n(const byte in[], byte out[], u32bit blocks) const { @@ -91,6 +198,39 @@ void AES_128_Intel::decrypt_n(const byte in[], byte out[], u32bit blocks) const __m128i K9 = _mm_loadu_si128(key_mm + 9); __m128i K10 = _mm_loadu_si128(key_mm + 10); + while(blocks >= 4) + { + __m128i B0 = _mm_loadu_si128(in_mm + 0); + __m128i B1 = _mm_loadu_si128(in_mm + 1); + __m128i B2 = _mm_loadu_si128(in_mm + 2); + __m128i B3 = _mm_loadu_si128(in_mm + 3); + + B0 = _mm_xor_si128(B0, K0); + B1 = _mm_xor_si128(B1, K0); + B2 = _mm_xor_si128(B2, K0); + B3 = _mm_xor_si128(B3, K0); + + AES_DEC_4_ROUNDS(K1); + AES_DEC_4_ROUNDS(K2); + AES_DEC_4_ROUNDS(K3); + AES_DEC_4_ROUNDS(K4); + AES_DEC_4_ROUNDS(K5); + AES_DEC_4_ROUNDS(K6); + AES_DEC_4_ROUNDS(K7); + AES_DEC_4_ROUNDS(K8); + AES_DEC_4_ROUNDS(K9); + AES_DEC_4_LAST_ROUNDS(K10); + + _mm_storeu_si128(out_mm + 0, B0); + _mm_storeu_si128(out_mm + 1, B1); + _mm_storeu_si128(out_mm + 2, B2); + _mm_storeu_si128(out_mm + 3, B3); + + blocks -= 4; + in_mm += 4; + out_mm += 4; + } + for(u32bit i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); @@ -109,22 +249,18 @@ void AES_128_Intel::decrypt_n(const byte in[], byte out[], u32bit blocks) const B = _mm_aesdeclast_si128(B, K10); _mm_storeu_si128(out_mm + i, B); - - in += BLOCK_SIZE; - out += BLOCK_SIZE; } } /** -* AES Key Schedule +* AES-128 Key Schedule */ -void AES_128_Intel::key_schedule(const byte key[], u32bit length) +void AES_128_Intel::key_schedule(const byte key[], u32bit) { - #define AES_128_key_exp(K, RCON) \ aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON)) - __m128i K0 = _mm_loadu_si128((const __m128i*)key); + __m128i K0 = _mm_loadu_si128((const __m128i*)(key)); __m128i K1 = AES_128_key_exp(K0, 0x01); __m128i K2 = AES_128_key_exp(K1, 0x02); __m128i K3 = AES_128_key_exp(K2, 0x04); @@ -174,4 +310,470 @@ void AES_128_Intel::clear() DK.clear(); } +/** +* AES-192 Encryption +*/ +void AES_192_Intel::encrypt_n(const byte in[], byte out[], u32bit blocks) const + { + const __m128i* in_mm = (const __m128i*)in; + __m128i* out_mm = (__m128i*)out; + + const __m128i* key_mm = (const __m128i*)&EK[0]; + + __m128i K0 = _mm_loadu_si128(key_mm); + __m128i K1 = _mm_loadu_si128(key_mm + 1); + __m128i K2 = _mm_loadu_si128(key_mm + 2); + __m128i K3 = _mm_loadu_si128(key_mm + 3); + __m128i K4 = _mm_loadu_si128(key_mm + 4); + __m128i K5 = _mm_loadu_si128(key_mm + 5); + __m128i K6 = _mm_loadu_si128(key_mm + 6); + __m128i K7 = _mm_loadu_si128(key_mm + 7); + __m128i K8 = _mm_loadu_si128(key_mm + 8); + __m128i K9 = _mm_loadu_si128(key_mm + 9); + __m128i K10 = _mm_loadu_si128(key_mm + 10); + __m128i K11 = _mm_loadu_si128(key_mm + 11); + __m128i K12 = _mm_loadu_si128(key_mm + 12); + + while(blocks >= 4) + { + __m128i B0 = _mm_loadu_si128(in_mm + 0); + __m128i B1 = _mm_loadu_si128(in_mm + 1); + __m128i B2 = _mm_loadu_si128(in_mm + 2); + __m128i B3 = _mm_loadu_si128(in_mm + 3); + + B0 = _mm_xor_si128(B0, K0); + B1 = _mm_xor_si128(B1, K0); + B2 = _mm_xor_si128(B2, K0); + B3 = _mm_xor_si128(B3, K0); + + AES_ENC_4_ROUNDS(K1); + AES_ENC_4_ROUNDS(K2); + AES_ENC_4_ROUNDS(K3); + AES_ENC_4_ROUNDS(K4); + AES_ENC_4_ROUNDS(K5); + AES_ENC_4_ROUNDS(K6); + AES_ENC_4_ROUNDS(K7); + AES_ENC_4_ROUNDS(K8); + AES_ENC_4_ROUNDS(K9); + AES_ENC_4_ROUNDS(K10); + AES_ENC_4_ROUNDS(K11); + AES_ENC_4_LAST_ROUNDS(K12); + + _mm_storeu_si128(out_mm + 0, B0); + _mm_storeu_si128(out_mm + 1, B1); + _mm_storeu_si128(out_mm + 2, B2); + _mm_storeu_si128(out_mm + 3, B3); + + blocks -= 4; + in_mm += 4; + out_mm += 4; + } + + for(u32bit i = 0; i != blocks; ++i) + { + __m128i B = _mm_loadu_si128(in_mm + i); + + B = _mm_xor_si128(B, K0); + + B = _mm_aesenc_si128(B, K1); + B = _mm_aesenc_si128(B, K2); + B = _mm_aesenc_si128(B, K3); + B = _mm_aesenc_si128(B, K4); + B = _mm_aesenc_si128(B, K5); + B = _mm_aesenc_si128(B, K6); + B = _mm_aesenc_si128(B, K7); + B = _mm_aesenc_si128(B, K8); + B = _mm_aesenc_si128(B, K9); + B = _mm_aesenc_si128(B, K10); + B = _mm_aesenc_si128(B, K11); + B = _mm_aesenclast_si128(B, K12); + + _mm_storeu_si128(out_mm + i, B); + } + } + +/** +* AES-192 Decryption +*/ +void AES_192_Intel::decrypt_n(const byte in[], byte out[], u32bit blocks) const + { + const __m128i* in_mm = (const __m128i*)in; + __m128i* out_mm = (__m128i*)out; + + const __m128i* key_mm = (const __m128i*)&DK[0]; + + __m128i K0 = _mm_loadu_si128(key_mm); + __m128i K1 = _mm_loadu_si128(key_mm + 1); + __m128i K2 = _mm_loadu_si128(key_mm + 2); + __m128i K3 = _mm_loadu_si128(key_mm + 3); + __m128i K4 = _mm_loadu_si128(key_mm + 4); + __m128i K5 = _mm_loadu_si128(key_mm + 5); + __m128i K6 = _mm_loadu_si128(key_mm + 6); + __m128i K7 = _mm_loadu_si128(key_mm + 7); + __m128i K8 = _mm_loadu_si128(key_mm + 8); + __m128i K9 = _mm_loadu_si128(key_mm + 9); + __m128i K10 = _mm_loadu_si128(key_mm + 10); + __m128i K11 = _mm_loadu_si128(key_mm + 11); + __m128i K12 = _mm_loadu_si128(key_mm + 12); + + while(blocks >= 4) + { + __m128i B0 = _mm_loadu_si128(in_mm + 0); + __m128i B1 = _mm_loadu_si128(in_mm + 1); + __m128i B2 = _mm_loadu_si128(in_mm + 2); + __m128i B3 = _mm_loadu_si128(in_mm + 3); + + B0 = _mm_xor_si128(B0, K0); + B1 = _mm_xor_si128(B1, K0); + B2 = _mm_xor_si128(B2, K0); + B3 = _mm_xor_si128(B3, K0); + + AES_DEC_4_ROUNDS(K1); + AES_DEC_4_ROUNDS(K2); + AES_DEC_4_ROUNDS(K3); + AES_DEC_4_ROUNDS(K4); + AES_DEC_4_ROUNDS(K5); + AES_DEC_4_ROUNDS(K6); + AES_DEC_4_ROUNDS(K7); + AES_DEC_4_ROUNDS(K8); + AES_DEC_4_ROUNDS(K9); + AES_DEC_4_ROUNDS(K10); + AES_DEC_4_ROUNDS(K11); + AES_DEC_4_LAST_ROUNDS(K12); + + _mm_storeu_si128(out_mm + 0, B0); + _mm_storeu_si128(out_mm + 1, B1); + _mm_storeu_si128(out_mm + 2, B2); + _mm_storeu_si128(out_mm + 3, B3); + + blocks -= 4; + in_mm += 4; + out_mm += 4; + } + + for(u32bit i = 0; i != blocks; ++i) + { + __m128i B = _mm_loadu_si128(in_mm + i); + + B = _mm_xor_si128(B, K0); + + B = _mm_aesdec_si128(B, K1); + B = _mm_aesdec_si128(B, K2); + B = _mm_aesdec_si128(B, K3); + B = _mm_aesdec_si128(B, K4); + B = _mm_aesdec_si128(B, K5); + B = _mm_aesdec_si128(B, K6); + B = _mm_aesdec_si128(B, K7); + B = _mm_aesdec_si128(B, K8); + B = _mm_aesdec_si128(B, K9); + B = _mm_aesdec_si128(B, K10); + B = _mm_aesdec_si128(B, K11); + B = _mm_aesdeclast_si128(B, K12); + + _mm_storeu_si128(out_mm + i, B); + } + } + +/** +* AES-192 Key Schedule +*/ +void AES_192_Intel::key_schedule(const byte key[], u32bit) + { + __m128i K0 = _mm_loadu_si128((const __m128i*)(key)); + __m128i K1 = _mm_loadu_si128((const __m128i*)(key + 8)); + K1 = _mm_srli_si128(K1, 8); + + load_le(&EK[0], key, 6); + +#define AES_192_key_exp(RCON, EK_OFF) \ + aes_192_key_expansion(&K0, &K1, \ + _mm_aeskeygenassist_si128(K1, RCON), \ + EK + EK_OFF, EK_OFF == 48) + + AES_192_key_exp(0x01, 6); + AES_192_key_exp(0x02, 12); + AES_192_key_exp(0x04, 18); + AES_192_key_exp(0x08, 24); + AES_192_key_exp(0x10, 30); + AES_192_key_exp(0x20, 36); + AES_192_key_exp(0x40, 42); + AES_192_key_exp(0x80, 48); + + // Now generate decryption keys + const __m128i* EK_mm = (const __m128i*)&EK[0]; + __m128i* DK_mm = (__m128i*)&DK[0]; + _mm_storeu_si128(DK_mm , EK_mm[12]); + _mm_storeu_si128(DK_mm + 1, _mm_aesimc_si128(EK_mm[11])); + _mm_storeu_si128(DK_mm + 2, _mm_aesimc_si128(EK_mm[10])); + _mm_storeu_si128(DK_mm + 3, _mm_aesimc_si128(EK_mm[9])); + _mm_storeu_si128(DK_mm + 4, _mm_aesimc_si128(EK_mm[8])); + _mm_storeu_si128(DK_mm + 5, _mm_aesimc_si128(EK_mm[7])); + _mm_storeu_si128(DK_mm + 6, _mm_aesimc_si128(EK_mm[6])); + _mm_storeu_si128(DK_mm + 7, _mm_aesimc_si128(EK_mm[5])); + _mm_storeu_si128(DK_mm + 8, _mm_aesimc_si128(EK_mm[4])); + _mm_storeu_si128(DK_mm + 9, _mm_aesimc_si128(EK_mm[3])); + _mm_storeu_si128(DK_mm + 10, _mm_aesimc_si128(EK_mm[2])); + _mm_storeu_si128(DK_mm + 11, _mm_aesimc_si128(EK_mm[1])); + _mm_storeu_si128(DK_mm + 12, EK_mm[0]); + } + +/** +* Clear memory of sensitive data +*/ +void AES_192_Intel::clear() + { + EK.clear(); + DK.clear(); + } + +/** +* AES-256 Encryption +*/ +void AES_256_Intel::encrypt_n(const byte in[], byte out[], u32bit blocks) const + { + const __m128i* in_mm = (const __m128i*)in; + __m128i* out_mm = (__m128i*)out; + + const __m128i* key_mm = (const __m128i*)&EK[0]; + + __m128i K0 = _mm_loadu_si128(key_mm); + __m128i K1 = _mm_loadu_si128(key_mm + 1); + __m128i K2 = _mm_loadu_si128(key_mm + 2); + __m128i K3 = _mm_loadu_si128(key_mm + 3); + __m128i K4 = _mm_loadu_si128(key_mm + 4); + __m128i K5 = _mm_loadu_si128(key_mm + 5); + __m128i K6 = _mm_loadu_si128(key_mm + 6); + __m128i K7 = _mm_loadu_si128(key_mm + 7); + __m128i K8 = _mm_loadu_si128(key_mm + 8); + __m128i K9 = _mm_loadu_si128(key_mm + 9); + __m128i K10 = _mm_loadu_si128(key_mm + 10); + __m128i K11 = _mm_loadu_si128(key_mm + 11); + __m128i K12 = _mm_loadu_si128(key_mm + 12); + __m128i K13 = _mm_loadu_si128(key_mm + 13); + __m128i K14 = _mm_loadu_si128(key_mm + 14); + + while(blocks >= 4) + { + __m128i B0 = _mm_loadu_si128(in_mm + 0); + __m128i B1 = _mm_loadu_si128(in_mm + 1); + __m128i B2 = _mm_loadu_si128(in_mm + 2); + __m128i B3 = _mm_loadu_si128(in_mm + 3); + + B0 = _mm_xor_si128(B0, K0); + B1 = _mm_xor_si128(B1, K0); + B2 = _mm_xor_si128(B2, K0); + B3 = _mm_xor_si128(B3, K0); + + AES_ENC_4_ROUNDS(K1); + AES_ENC_4_ROUNDS(K2); + AES_ENC_4_ROUNDS(K3); + AES_ENC_4_ROUNDS(K4); + AES_ENC_4_ROUNDS(K5); + AES_ENC_4_ROUNDS(K6); + AES_ENC_4_ROUNDS(K7); + AES_ENC_4_ROUNDS(K8); + AES_ENC_4_ROUNDS(K9); + AES_ENC_4_ROUNDS(K10); + AES_ENC_4_ROUNDS(K11); + AES_ENC_4_ROUNDS(K12); + AES_ENC_4_ROUNDS(K13); + AES_ENC_4_LAST_ROUNDS(K14); + + _mm_storeu_si128(out_mm + 0, B0); + _mm_storeu_si128(out_mm + 1, B1); + _mm_storeu_si128(out_mm + 2, B2); + _mm_storeu_si128(out_mm + 3, B3); + + blocks -= 4; + in_mm += 4; + out_mm += 4; + } + + for(u32bit i = 0; i != blocks; ++i) + { + __m128i B = _mm_loadu_si128(in_mm + i); + + B = _mm_xor_si128(B, K0); + + B = _mm_aesenc_si128(B, K1); + B = _mm_aesenc_si128(B, K2); + B = _mm_aesenc_si128(B, K3); + B = _mm_aesenc_si128(B, K4); + B = _mm_aesenc_si128(B, K5); + B = _mm_aesenc_si128(B, K6); + B = _mm_aesenc_si128(B, K7); + B = _mm_aesenc_si128(B, K8); + B = _mm_aesenc_si128(B, K9); + B = _mm_aesenc_si128(B, K10); + B = _mm_aesenc_si128(B, K11); + B = _mm_aesenc_si128(B, K12); + B = _mm_aesenc_si128(B, K13); + B = _mm_aesenclast_si128(B, K14); + + _mm_storeu_si128(out_mm + i, B); + } + } + +/** +* AES-256 Decryption +*/ +void AES_256_Intel::decrypt_n(const byte in[], byte out[], u32bit blocks) const + { + const __m128i* in_mm = (const __m128i*)in; + __m128i* out_mm = (__m128i*)out; + + const __m128i* key_mm = (const __m128i*)&DK[0]; + + __m128i K0 = _mm_loadu_si128(key_mm); + __m128i K1 = _mm_loadu_si128(key_mm + 1); + __m128i K2 = _mm_loadu_si128(key_mm + 2); + __m128i K3 = _mm_loadu_si128(key_mm + 3); + __m128i K4 = _mm_loadu_si128(key_mm + 4); + __m128i K5 = _mm_loadu_si128(key_mm + 5); + __m128i K6 = _mm_loadu_si128(key_mm + 6); + __m128i K7 = _mm_loadu_si128(key_mm + 7); + __m128i K8 = _mm_loadu_si128(key_mm + 8); + __m128i K9 = _mm_loadu_si128(key_mm + 9); + __m128i K10 = _mm_loadu_si128(key_mm + 10); + __m128i K11 = _mm_loadu_si128(key_mm + 11); + __m128i K12 = _mm_loadu_si128(key_mm + 12); + __m128i K13 = _mm_loadu_si128(key_mm + 13); + __m128i K14 = _mm_loadu_si128(key_mm + 14); + + while(blocks >= 4) + { + __m128i B0 = _mm_loadu_si128(in_mm + 0); + __m128i B1 = _mm_loadu_si128(in_mm + 1); + __m128i B2 = _mm_loadu_si128(in_mm + 2); + __m128i B3 = _mm_loadu_si128(in_mm + 3); + + B0 = _mm_xor_si128(B0, K0); + B1 = _mm_xor_si128(B1, K0); + B2 = _mm_xor_si128(B2, K0); + B3 = _mm_xor_si128(B3, K0); + + AES_DEC_4_ROUNDS(K1); + AES_DEC_4_ROUNDS(K2); + AES_DEC_4_ROUNDS(K3); + AES_DEC_4_ROUNDS(K4); + AES_DEC_4_ROUNDS(K5); + AES_DEC_4_ROUNDS(K6); + AES_DEC_4_ROUNDS(K7); + AES_DEC_4_ROUNDS(K8); + AES_DEC_4_ROUNDS(K9); + AES_DEC_4_ROUNDS(K10); + AES_DEC_4_ROUNDS(K11); + AES_DEC_4_ROUNDS(K12); + AES_DEC_4_ROUNDS(K13); + AES_DEC_4_LAST_ROUNDS(K14); + + _mm_storeu_si128(out_mm + 0, B0); + _mm_storeu_si128(out_mm + 1, B1); + _mm_storeu_si128(out_mm + 2, B2); + _mm_storeu_si128(out_mm + 3, B3); + + blocks -= 4; + in_mm += 4; + out_mm += 4; + } + + for(u32bit i = 0; i != blocks; ++i) + { + __m128i B = _mm_loadu_si128(in_mm + i); + + B = _mm_xor_si128(B, K0); + + B = _mm_aesdec_si128(B, K1); + B = _mm_aesdec_si128(B, K2); + B = _mm_aesdec_si128(B, K3); + B = _mm_aesdec_si128(B, K4); + B = _mm_aesdec_si128(B, K5); + B = _mm_aesdec_si128(B, K6); + B = _mm_aesdec_si128(B, K7); + B = _mm_aesdec_si128(B, K8); + B = _mm_aesdec_si128(B, K9); + B = _mm_aesdec_si128(B, K10); + B = _mm_aesdec_si128(B, K11); + B = _mm_aesdec_si128(B, K12); + B = _mm_aesdec_si128(B, K13); + B = _mm_aesdeclast_si128(B, K14); + + _mm_storeu_si128(out_mm + i, B); + } + } + +/** +* AES-256 Key Schedule +*/ +void AES_256_Intel::key_schedule(const byte key[], u32bit) + { + __m128i K0 = _mm_loadu_si128((const __m128i*)(key)); + __m128i K1 = _mm_loadu_si128((const __m128i*)(key + 16)); + + __m128i K2 = aes_128_key_expansion(K0, _mm_aeskeygenassist_si128(K1, 0x01)); + __m128i K3 = aes_256_key_expansion(K1, K2); + + __m128i K4 = aes_128_key_expansion(K2, _mm_aeskeygenassist_si128(K3, 0x02)); + __m128i K5 = aes_256_key_expansion(K3, K4); + + __m128i K6 = aes_128_key_expansion(K4, _mm_aeskeygenassist_si128(K5, 0x04)); + __m128i K7 = aes_256_key_expansion(K5, K6); + + __m128i K8 = aes_128_key_expansion(K6, _mm_aeskeygenassist_si128(K7, 0x08)); + __m128i K9 = aes_256_key_expansion(K7, K8); + + __m128i K10 = aes_128_key_expansion(K8, _mm_aeskeygenassist_si128(K9, 0x10)); + __m128i K11 = aes_256_key_expansion(K9, K10); + + __m128i K12 = aes_128_key_expansion(K10, _mm_aeskeygenassist_si128(K11, 0x20)); + __m128i K13 = aes_256_key_expansion(K11, K12); + + __m128i K14 = aes_128_key_expansion(K12, _mm_aeskeygenassist_si128(K13, 0x40)); + + __m128i* EK_mm = (__m128i*)&EK[0]; + _mm_storeu_si128(EK_mm , K0); + _mm_storeu_si128(EK_mm + 1, K1); + _mm_storeu_si128(EK_mm + 2, K2); + _mm_storeu_si128(EK_mm + 3, K3); + _mm_storeu_si128(EK_mm + 4, K4); + _mm_storeu_si128(EK_mm + 5, K5); + _mm_storeu_si128(EK_mm + 6, K6); + _mm_storeu_si128(EK_mm + 7, K7); + _mm_storeu_si128(EK_mm + 8, K8); + _mm_storeu_si128(EK_mm + 9, K9); + _mm_storeu_si128(EK_mm + 10, K10); + _mm_storeu_si128(EK_mm + 11, K11); + _mm_storeu_si128(EK_mm + 12, K12); + _mm_storeu_si128(EK_mm + 13, K13); + _mm_storeu_si128(EK_mm + 14, K14); + + // Now generate decryption keys + + __m128i* DK_mm = (__m128i*)&DK[0]; + _mm_storeu_si128(DK_mm , K14); + _mm_storeu_si128(DK_mm + 1, _mm_aesimc_si128(K13)); + _mm_storeu_si128(DK_mm + 2, _mm_aesimc_si128(K12)); + _mm_storeu_si128(DK_mm + 3, _mm_aesimc_si128(K11)); + _mm_storeu_si128(DK_mm + 4, _mm_aesimc_si128(K10)); + _mm_storeu_si128(DK_mm + 5, _mm_aesimc_si128(K9)); + _mm_storeu_si128(DK_mm + 6, _mm_aesimc_si128(K8)); + _mm_storeu_si128(DK_mm + 7, _mm_aesimc_si128(K7)); + _mm_storeu_si128(DK_mm + 8, _mm_aesimc_si128(K6)); + _mm_storeu_si128(DK_mm + 9, _mm_aesimc_si128(K5)); + _mm_storeu_si128(DK_mm + 10, _mm_aesimc_si128(K4)); + _mm_storeu_si128(DK_mm + 11, _mm_aesimc_si128(K3)); + _mm_storeu_si128(DK_mm + 12, _mm_aesimc_si128(K2)); + _mm_storeu_si128(DK_mm + 13, _mm_aesimc_si128(K1)); + _mm_storeu_si128(DK_mm + 14, K0); + } + +/** +* Clear memory of sensitive data +*/ +void AES_256_Intel::clear() + { + EK.clear(); + DK.clear(); + } + } diff --git a/src/block/aes_intel/aes_intel.h b/src/block/aes_intel/aes_intel.h index 90270939c..164655072 100644 --- a/src/block/aes_intel/aes_intel.h +++ b/src/block/aes_intel/aes_intel.h @@ -1,6 +1,6 @@ /** -* AES using Intel's AES instructions -* (C) 1999-2009 Jack Lloyd +* AES using Intel's AES-NI instructions +* (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ @@ -12,6 +12,9 @@ namespace Botan { +/** +* AES-128 using AES-NI +*/ class BOTAN_DLL AES_128_Intel : public BlockCipher { public: @@ -29,6 +32,46 @@ class BOTAN_DLL AES_128_Intel : public BlockCipher SecureBuffer<u32bit, 44> EK, DK; }; +/** +* AES-192 using AES-NI +*/ +class BOTAN_DLL AES_192_Intel : public BlockCipher + { + public: + void encrypt_n(const byte in[], byte out[], u32bit blocks) const; + void decrypt_n(const byte in[], byte out[], u32bit blocks) const; + + void clear(); + std::string name() const { return "AES-192"; } + BlockCipher* clone() const { return new AES_192_Intel; } + + AES_192_Intel() : BlockCipher(16, 24) { } + private: + void key_schedule(const byte[], u32bit); + + SecureBuffer<u32bit, 52> EK, DK; + }; + +/** +* AES-256 using AES-NI +*/ +class BOTAN_DLL AES_256_Intel : public BlockCipher + { + public: + void encrypt_n(const byte in[], byte out[], u32bit blocks) const; + void decrypt_n(const byte in[], byte out[], u32bit blocks) const; + + void clear(); + std::string name() const { return "AES-256"; } + BlockCipher* clone() const { return new AES_256_Intel; } + + AES_256_Intel() : BlockCipher(16, 32) { } + private: + void key_schedule(const byte[], u32bit); + + SecureBuffer<u32bit, 60> EK, DK; + }; + } #endif diff --git a/src/block/mars/mars.cpp b/src/block/mars/mars.cpp index 69556acb3..6b73ea054 100644 --- a/src/block/mars/mars.cpp +++ b/src/block/mars/mars.cpp @@ -13,6 +13,188 @@ namespace Botan { namespace { +/** +* The MARS sbox +*/ +const u32bit SBOX[512] = { + 0x09D0C479, 0x28C8FFE0, 0x84AA6C39, 0x9DAD7287, 0x7DFF9BE3, 0xD4268361, + 0xC96DA1D4, 0x7974CC93, 0x85D0582E, 0x2A4B5705, 0x1CA16A62, 0xC3BD279D, + 0x0F1F25E5, 0x5160372F, 0xC695C1FB, 0x4D7FF1E4, 0xAE5F6BF4, 0x0D72EE46, + 0xFF23DE8A, 0xB1CF8E83, 0xF14902E2, 0x3E981E42, 0x8BF53EB6, 0x7F4BF8AC, + 0x83631F83, 0x25970205, 0x76AFE784, 0x3A7931D4, 0x4F846450, 0x5C64C3F6, + 0x210A5F18, 0xC6986A26, 0x28F4E826, 0x3A60A81C, 0xD340A664, 0x7EA820C4, + 0x526687C5, 0x7EDDD12B, 0x32A11D1D, 0x9C9EF086, 0x80F6E831, 0xAB6F04AD, + 0x56FB9B53, 0x8B2E095C, 0xB68556AE, 0xD2250B0D, 0x294A7721, 0xE21FB253, + 0xAE136749, 0xE82AAE86, 0x93365104, 0x99404A66, 0x78A784DC, 0xB69BA84B, + 0x04046793, 0x23DB5C1E, 0x46CAE1D6, 0x2FE28134, 0x5A223942, 0x1863CD5B, + 0xC190C6E3, 0x07DFB846, 0x6EB88816, 0x2D0DCC4A, 0xA4CCAE59, 0x3798670D, + 0xCBFA9493, 0x4F481D45, 0xEAFC8CA8, 0xDB1129D6, 0xB0449E20, 0x0F5407FB, + 0x6167D9A8, 0xD1F45763, 0x4DAA96C3, 0x3BEC5958, 0xABABA014, 0xB6CCD201, + 0x38D6279F, 0x02682215, 0x8F376CD5, 0x092C237E, 0xBFC56593, 0x32889D2C, + 0x854B3E95, 0x05BB9B43, 0x7DCD5DCD, 0xA02E926C, 0xFAE527E5, 0x36A1C330, + 0x3412E1AE, 0xF257F462, 0x3C4F1D71, 0x30A2E809, 0x68E5F551, 0x9C61BA44, + 0x5DED0AB8, 0x75CE09C8, 0x9654F93E, 0x698C0CCA, 0x243CB3E4, 0x2B062B97, + 0x0F3B8D9E, 0x00E050DF, 0xFC5D6166, 0xE35F9288, 0xC079550D, 0x0591AEE8, + 0x8E531E74, 0x75FE3578, 0x2F6D829A, 0xF60B21AE, 0x95E8EB8D, 0x6699486B, + 0x901D7D9B, 0xFD6D6E31, 0x1090ACEF, 0xE0670DD8, 0xDAB2E692, 0xCD6D4365, + 0xE5393514, 0x3AF345F0, 0x6241FC4D, 0x460DA3A3, 0x7BCF3729, 0x8BF1D1E0, + 0x14AAC070, 0x1587ED55, 0x3AFD7D3E, 0xD2F29E01, 0x29A9D1F6, 0xEFB10C53, + 0xCF3B870F, 0xB414935C, 0x664465ED, 0x024ACAC7, 0x59A744C1, 0x1D2936A7, + 0xDC580AA6, 0xCF574CA8, 0x040A7A10, 0x6CD81807, 0x8A98BE4C, 0xACCEA063, + 0xC33E92B5, 0xD1E0E03D, 0xB322517E, 0x2092BD13, 0x386B2C4A, 0x52E8DD58, + 0x58656DFB, 0x50820371, 0x41811896, 0xE337EF7E, 0xD39FB119, 0xC97F0DF6, + 0x68FEA01B, 0xA150A6E5, 0x55258962, 0xEB6FF41B, 0xD7C9CD7A, 0xA619CD9E, + 0xBCF09576, 0x2672C073, 0xF003FB3C, 0x4AB7A50B, 0x1484126A, 0x487BA9B1, + 0xA64FC9C6, 0xF6957D49, 0x38B06A75, 0xDD805FCD, 0x63D094CF, 0xF51C999E, + 0x1AA4D343, 0xB8495294, 0xCE9F8E99, 0xBFFCD770, 0xC7C275CC, 0x378453A7, + 0x7B21BE33, 0x397F41BD, 0x4E94D131, 0x92CC1F98, 0x5915EA51, 0x99F861B7, + 0xC9980A88, 0x1D74FD5F, 0xB0A495F8, 0x614DEED0, 0xB5778EEA, 0x5941792D, + 0xFA90C1F8, 0x33F824B4, 0xC4965372, 0x3FF6D550, 0x4CA5FEC0, 0x8630E964, + 0x5B3FBBD6, 0x7DA26A48, 0xB203231A, 0x04297514, 0x2D639306, 0x2EB13149, + 0x16A45272, 0x532459A0, 0x8E5F4872, 0xF966C7D9, 0x07128DC0, 0x0D44DB62, + 0xAFC8D52D, 0x06316131, 0xD838E7CE, 0x1BC41D00, 0x3A2E8C0F, 0xEA83837E, + 0xB984737D, 0x13BA4891, 0xC4F8B949, 0xA6D6ACB3, 0xA215CDCE, 0x8359838B, + 0x6BD1AA31, 0xF579DD52, 0x21B93F93, 0xF5176781, 0x187DFDDE, 0xE94AEB76, + 0x2B38FD54, 0x431DE1DA, 0xAB394825, 0x9AD3048F, 0xDFEA32AA, 0x659473E3, + 0x623F7863, 0xF3346C59, 0xAB3AB685, 0x3346A90B, 0x6B56443E, 0xC6DE01F8, + 0x8D421FC0, 0x9B0ED10C, 0x88F1A1E9, 0x54C1F029, 0x7DEAD57B, 0x8D7BA426, + 0x4CF5178A, 0x551A7CCA, 0x1A9A5F08, 0xFCD651B9, 0x25605182, 0xE11FC6C3, + 0xB6FD9676, 0x337B3027, 0xB7C8EB14, 0x9E5FD030, 0x6B57E354, 0xAD913CF7, + 0x7E16688D, 0x58872A69, 0x2C2FC7DF, 0xE389CCC6, 0x30738DF1, 0x0824A734, + 0xE1797A8B, 0xA4A8D57B, 0x5B5D193B, 0xC8A8309B, 0x73F9A978, 0x73398D32, + 0x0F59573E, 0xE9DF2B03, 0xE8A5B6C8, 0x848D0704, 0x98DF93C2, 0x720A1DC3, + 0x684F259A, 0x943BA848, 0xA6370152, 0x863B5EA3, 0xD17B978B, 0x6D9B58EF, + 0x0A700DD4, 0xA73D36BF, 0x8E6A0829, 0x8695BC14, 0xE35B3447, 0x933AC568, + 0x8894B022, 0x2F511C27, 0xDDFBCC3C, 0x006662B6, 0x117C83FE, 0x4E12B414, + 0xC2BCA766, 0x3A2FEC10, 0xF4562420, 0x55792E2A, 0x46F5D857, 0xCEDA25CE, + 0xC3601D3B, 0x6C00AB46, 0xEFAC9C28, 0xB3C35047, 0x611DFEE3, 0x257C3207, + 0xFDD58482, 0x3B14D84F, 0x23BECB64, 0xA075F3A3, 0x088F8EAD, 0x07ADF158, + 0x7796943C, 0xFACABF3D, 0xC09730CD, 0xF7679969, 0xDA44E9ED, 0x2C854C12, + 0x35935FA3, 0x2F057D9F, 0x690624F8, 0x1CB0BAFD, 0x7B0DBDC6, 0x810F23BB, + 0xFA929A1A, 0x6D969A17, 0x6742979B, 0x74AC7D05, 0x010E65C4, 0x86A3D963, + 0xF907B5A0, 0xD0042BD3, 0x158D7D03, 0x287A8255, 0xBBA8366F, 0x096EDC33, + 0x21916A7B, 0x77B56B86, 0x951622F9, 0xA6C5E650, 0x8CEA17D1, 0xCD8C62BC, + 0xA3D63433, 0x358A68FD, 0x0F9B9D3C, 0xD6AA295B, 0xFE33384A, 0xC000738E, + 0xCD67EB2F, 0xE2EB6DC2, 0x97338B02, 0x06C9F246, 0x419CF1AD, 0x2B83C045, + 0x3723F18A, 0xCB5B3089, 0x160BEAD7, 0x5D494656, 0x35F8A74B, 0x1E4E6C9E, + 0x000399BD, 0x67466880, 0xB4174831, 0xACF423B2, 0xCA815AB3, 0x5A6395E7, + 0x302A67C5, 0x8BDB446B, 0x108F8FA4, 0x10223EDA, 0x92B8B48B, 0x7F38D0EE, + 0xAB2701D4, 0x0262D415, 0xAF224A30, 0xB3D88ABA, 0xF8B2C3AF, 0xDAF7EF70, + 0xCC97D3B7, 0xE9614B6C, 0x2BAEBFF4, 0x70F687CF, 0x386C9156, 0xCE092EE5, + 0x01E87DA6, 0x6CE91E6A, 0xBB7BCC84, 0xC7922C20, 0x9D3B71FD, 0x060E41C6, + 0xD7590F15, 0x4E03BB47, 0x183C198E, 0x63EEB240, 0x2DDBF49A, 0x6D5CBA54, + 0x923750AF, 0xF9E14236, 0x7838162B, 0x59726C72, 0x81B66760, 0xBB2926C1, + 0x48A0CE0D, 0xA6C0496D, 0xAD43507B, 0x718D496A, 0x9DF057AF, 0x44B1BDE6, + 0x054356DC, 0xDE7CED35, 0xD51A138B, 0x62088CC9, 0x35830311, 0xC96EFCA2, + 0x686F86EC, 0x8E77CB68, 0x63E1D6B8, 0xC80F9778, 0x79C491FD, 0x1B4C67F2, + 0x72698D7D, 0x5E368C31, 0xF7D95E2E, 0xA1D3493F, 0xDCD9433E, 0x896F1552, + 0x4BC4CA7A, 0xA6D1BAF4, 0xA5A96DCC, 0x0BEF8B46, 0xA169FDA7, 0x74DF40B7, + 0x4E208804, 0x9A756607, 0x038E87C8, 0x20211E44, 0x8B7AD4BF, 0xC6403F35, + 0x1848E36D, 0x80BDB038, 0x1E62891C, 0x643D2107, 0xBF04D6F8, 0x21092C8C, + 0xF644F389, 0x0778404E, 0x7B78ADB8, 0xA2C52D53, 0x42157ABE, 0xA2253E2E, + 0x7BF3F4AE, 0x80F594F9, 0x953194E7, 0x77EB92ED, 0xB3816930, 0xDA8D9336, + 0xBF447469, 0xF26D9483, 0xEE6FAED5, 0x71371235, 0xDE425F73, 0xB4E59F43, + 0x7DBE2D4E, 0x2D37B185, 0x49DC9A63, 0x98C39D98, 0x1301C9A2, 0x389B1BBF, + 0x0C18588D, 0xA421C1BA, 0x7AA3865C, 0x71E08558, 0x3C5CFCAA, 0x7D239CA4, + 0x0297D9DD, 0xD7DC2830, 0x4B37802B, 0x7428AB54, 0xAEEE0347, 0x4B3FBB85, + 0x692F2F08, 0x134E578E, 0x36D9E0BF, 0xAE8B5FCF, 0xEDB93ECF, 0x2B27248E, + 0x170EB1EF, 0x7DC57FD6, 0x1E760F16, 0xB1136601, 0x864E1B9B, 0xD7EA7319, + 0x3AB871BD, 0xCFA4D76F, 0xE31BD782, 0x0DBEB469, 0xABB96061, 0x5370F85D, + 0xFFB07E37, 0xDA30D0FB, 0xEBC977B6, 0x0B98B40F, 0x3A4D0FE6, 0xDF4FC26B, + 0x159CF22A, 0xC298D6E2, 0x2B78EF6A, 0x61A94AC0, 0xAB561187, 0x14EEA0F0, + 0xDF0D4164, 0x19AF70EE }; + +/* +* MARS Encryption Round +*/ +inline void encrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D, + u32bit EK1, u32bit EK2) + { + u32bit X = A + EK1; + A = rotate_left(A, 13); + u32bit Y = A * EK2; + u32bit Z = SBOX[X % 512]; + + Y = rotate_left(Y, 5); + Z ^= Y; + C += rotate_left(X, Y % 32); + Y = rotate_left(Y, 5); + Z ^= Y; + D ^= Y; + B += rotate_left(Z, Y % 32); + } + +/* +* MARS Decryption Round +*/ +inline void decrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D, + u32bit EK1, u32bit EK2) + { + u32bit Y = A * EK1; + A = rotate_right(A, 13); + u32bit X = A + EK2; + u32bit Z = SBOX[X % 512]; + + Y = rotate_left(Y, 5); + Z ^= Y; + C -= rotate_left(X, Y % 32); + Y = rotate_left(Y, 5); + Z ^= Y; + D ^= Y; + B -= rotate_left(Z, Y % 32); + } + +/* +* MARS Forward Mixing Operation +*/ +void forward_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D) + { + for(u32bit j = 0; j != 2; ++j) + { + B ^= SBOX[get_byte(3, A)]; B += SBOX[get_byte(2, A) + 256]; + C += SBOX[get_byte(1, A)]; D ^= SBOX[get_byte(0, A) + 256]; + A = rotate_right(A, 24) + D; + + C ^= SBOX[get_byte(3, B)]; C += SBOX[get_byte(2, B) + 256]; + D += SBOX[get_byte(1, B)]; A ^= SBOX[get_byte(0, B) + 256]; + B = rotate_right(B, 24) + C; + + D ^= SBOX[get_byte(3, C)]; D += SBOX[get_byte(2, C) + 256]; + A += SBOX[get_byte(1, C)]; B ^= SBOX[get_byte(0, C) + 256]; + C = rotate_right(C, 24); + + A ^= SBOX[get_byte(3, D)]; A += SBOX[get_byte(2, D) + 256]; + B += SBOX[get_byte(1, D)]; C ^= SBOX[get_byte(0, D) + 256]; + D = rotate_right(D, 24); + } + } + +/* +* MARS Reverse Mixing Operation +*/ +void reverse_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D) + { + for(u32bit j = 0; j != 2; ++j) + { + B ^= SBOX[get_byte(3, A) + 256]; C -= SBOX[get_byte(0, A)]; + D -= SBOX[get_byte(1, A) + 256]; D ^= SBOX[get_byte(2, A)]; + A = rotate_left(A, 24); + + C ^= SBOX[get_byte(3, B) + 256]; D -= SBOX[get_byte(0, B)]; + A -= SBOX[get_byte(1, B) + 256]; A ^= SBOX[get_byte(2, B)]; + C -= (B = rotate_left(B, 24)); + + D ^= SBOX[get_byte(3, C) + 256]; A -= SBOX[get_byte(0, C)]; + B -= SBOX[get_byte(1, C) + 256]; B ^= SBOX[get_byte(2, C)]; + C = rotate_left(C, 24); + D -= A; + + A ^= SBOX[get_byte(3, D) + 256]; B -= SBOX[get_byte(0, D)]; + C -= SBOX[get_byte(1, D) + 256]; C ^= SBOX[get_byte(2, D)]; + D = rotate_left(D, 24); + } + } + /* * Generate a mask for runs of bits */ @@ -61,23 +243,23 @@ void MARS::encrypt_n(const byte in[], byte out[], u32bit blocks) const forward_mix(A, B, C, D); - encrypt_round(A, B, C, D, 0); - encrypt_round(B, C, D, A, 1); - encrypt_round(C, D, A, B, 2); - encrypt_round(D, A, B, C, 3); - encrypt_round(A, B, C, D, 4); - encrypt_round(B, C, D, A, 5); - encrypt_round(C, D, A, B, 6); - encrypt_round(D, A, B, C, 7); - - encrypt_round(A, D, C, B, 8); - encrypt_round(B, A, D, C, 9); - encrypt_round(C, B, A, D, 10); - encrypt_round(D, C, B, A, 11); - encrypt_round(A, D, C, B, 12); - encrypt_round(B, A, D, C, 13); - encrypt_round(C, B, A, D, 14); - encrypt_round(D, C, B, A, 15); + encrypt_round(A, B, C, D, EK[ 4], EK[ 5]); + encrypt_round(B, C, D, A, EK[ 6], EK[ 7]); + encrypt_round(C, D, A, B, EK[ 8], EK[ 9]); + encrypt_round(D, A, B, C, EK[10], EK[11]); + encrypt_round(A, B, C, D, EK[12], EK[13]); + encrypt_round(B, C, D, A, EK[14], EK[15]); + encrypt_round(C, D, A, B, EK[16], EK[17]); + encrypt_round(D, A, B, C, EK[18], EK[19]); + + encrypt_round(A, D, C, B, EK[20], EK[21]); + encrypt_round(B, A, D, C, EK[22], EK[23]); + encrypt_round(C, B, A, D, EK[24], EK[25]); + encrypt_round(D, C, B, A, EK[26], EK[27]); + encrypt_round(A, D, C, B, EK[28], EK[29]); + encrypt_round(B, A, D, C, EK[30], EK[31]); + encrypt_round(C, B, A, D, EK[32], EK[33]); + encrypt_round(D, C, B, A, EK[34], EK[35]); reverse_mix(A, B, C, D); @@ -104,23 +286,23 @@ void MARS::decrypt_n(const byte in[], byte out[], u32bit blocks) const forward_mix(A, B, C, D); - decrypt_round(A, B, C, D, 15); - decrypt_round(B, C, D, A, 14); - decrypt_round(C, D, A, B, 13); - decrypt_round(D, A, B, C, 12); - decrypt_round(A, B, C, D, 11); - decrypt_round(B, C, D, A, 10); - decrypt_round(C, D, A, B, 9); - decrypt_round(D, A, B, C, 8); - - decrypt_round(A, D, C, B, 7); - decrypt_round(B, A, D, C, 6); - decrypt_round(C, B, A, D, 5); - decrypt_round(D, C, B, A, 4); - decrypt_round(A, D, C, B, 3); - decrypt_round(B, A, D, C, 2); - decrypt_round(C, B, A, D, 1); - decrypt_round(D, C, B, A, 0); + decrypt_round(A, B, C, D, EK[35], EK[34]); + decrypt_round(B, C, D, A, EK[33], EK[32]); + decrypt_round(C, D, A, B, EK[31], EK[30]); + decrypt_round(D, A, B, C, EK[29], EK[28]); + decrypt_round(A, B, C, D, EK[27], EK[26]); + decrypt_round(B, C, D, A, EK[25], EK[24]); + decrypt_round(C, D, A, B, EK[23], EK[22]); + decrypt_round(D, A, B, C, EK[21], EK[20]); + + decrypt_round(A, D, C, B, EK[19], EK[18]); + decrypt_round(B, A, D, C, EK[17], EK[16]); + decrypt_round(C, B, A, D, EK[15], EK[14]); + decrypt_round(D, C, B, A, EK[13], EK[12]); + decrypt_round(A, D, C, B, EK[11], EK[10]); + decrypt_round(B, A, D, C, EK[ 9], EK[ 8]); + decrypt_round(C, B, A, D, EK[ 7], EK[ 6]); + decrypt_round(D, C, B, A, EK[ 5], EK[ 4]); reverse_mix(A, B, C, D); @@ -134,97 +316,6 @@ void MARS::decrypt_n(const byte in[], byte out[], u32bit blocks) const } /* -* MARS Forward Mixing Operation -*/ -void MARS::forward_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D) - { - for(u32bit j = 0; j != 2; ++j) - { - B ^= SBOX[get_byte(3, A)]; B += SBOX[get_byte(2, A) + 256]; - C += SBOX[get_byte(1, A)]; D ^= SBOX[get_byte(0, A) + 256]; - A = rotate_right(A, 24) + D; - - C ^= SBOX[get_byte(3, B)]; C += SBOX[get_byte(2, B) + 256]; - D += SBOX[get_byte(1, B)]; A ^= SBOX[get_byte(0, B) + 256]; - B = rotate_right(B, 24) + C; - - D ^= SBOX[get_byte(3, C)]; D += SBOX[get_byte(2, C) + 256]; - A += SBOX[get_byte(1, C)]; B ^= SBOX[get_byte(0, C) + 256]; - C = rotate_right(C, 24); - - A ^= SBOX[get_byte(3, D)]; A += SBOX[get_byte(2, D) + 256]; - B += SBOX[get_byte(1, D)]; C ^= SBOX[get_byte(0, D) + 256]; - D = rotate_right(D, 24); - } - } - -/* -* MARS Reverse Mixing Operation -*/ -void MARS::reverse_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D) - { - for(u32bit j = 0; j != 2; ++j) - { - B ^= SBOX[get_byte(3, A) + 256]; C -= SBOX[get_byte(0, A)]; - D -= SBOX[get_byte(1, A) + 256]; D ^= SBOX[get_byte(2, A)]; - A = rotate_left(A, 24); - - C ^= SBOX[get_byte(3, B) + 256]; D -= SBOX[get_byte(0, B)]; - A -= SBOX[get_byte(1, B) + 256]; A ^= SBOX[get_byte(2, B)]; - C -= (B = rotate_left(B, 24)); - - D ^= SBOX[get_byte(3, C) + 256]; A -= SBOX[get_byte(0, C)]; - B -= SBOX[get_byte(1, C) + 256]; B ^= SBOX[get_byte(2, C)]; - C = rotate_left(C, 24); - D -= A; - - A ^= SBOX[get_byte(3, D) + 256]; B -= SBOX[get_byte(0, D)]; - C -= SBOX[get_byte(1, D) + 256]; C ^= SBOX[get_byte(2, D)]; - D = rotate_left(D, 24); - } - } - -/* -* MARS Encryption Round -*/ -void MARS::encrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D, - u32bit round) const - { - u32bit X, Y, Z; - X = A + EK[2*round + 4]; - A = rotate_left(A, 13); - Y = A * EK[2*round + 5]; - Z = SBOX[X % 512]; - Y = rotate_left(Y, 5); - Z ^= Y; - C += rotate_left(X, Y % 32); - Y = rotate_left(Y, 5); - Z ^= Y; - D ^= Y; - B += rotate_left(Z, Y % 32); - } - -/* -* MARS Decryption Round -*/ -void MARS::decrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D, - u32bit round) const - { - u32bit X, Y, Z; - Y = A * EK[2*round + 5]; - A = rotate_right(A, 13); - X = A + EK[2*round + 4]; - Z = SBOX[X % 512]; - Y = rotate_left(Y, 5); - Z ^= Y; - C -= rotate_left(X, Y % 32); - Y = rotate_left(Y, 5); - Z ^= Y; - D ^= Y; - B -= rotate_left(Z, Y % 32); - } - -/* * MARS Key Schedule */ void MARS::key_schedule(const byte key[], u32bit length) diff --git a/src/block/mars/mars.h b/src/block/mars/mars.h index 8173fb984..7a598d2bd 100644 --- a/src/block/mars/mars.h +++ b/src/block/mars/mars.h @@ -26,12 +26,6 @@ class BOTAN_DLL MARS : public BlockCipher private: void key_schedule(const byte[], u32bit); - void encrypt_round(u32bit&, u32bit&, u32bit&, u32bit&, u32bit) const; - void decrypt_round(u32bit&, u32bit&, u32bit&, u32bit&, u32bit) const; - static void forward_mix(u32bit&, u32bit&, u32bit&, u32bit&); - static void reverse_mix(u32bit&, u32bit&, u32bit&, u32bit&); - - static const u32bit SBOX[512]; SecureBuffer<u32bit, 40> EK; }; diff --git a/src/block/mars/mars_tab.cpp b/src/block/mars/mars_tab.cpp deleted file mode 100644 index fb8f34542..000000000 --- a/src/block/mars/mars_tab.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* -* S-Box Table for MARS -* (C) 1999-2007 Jack Lloyd -* -* Distributed under the terms of the Botan license -*/ - -#include <botan/mars.h> - -namespace Botan { - -const u32bit MARS::SBOX[512] = { - 0x09D0C479, 0x28C8FFE0, 0x84AA6C39, 0x9DAD7287, 0x7DFF9BE3, 0xD4268361, - 0xC96DA1D4, 0x7974CC93, 0x85D0582E, 0x2A4B5705, 0x1CA16A62, 0xC3BD279D, - 0x0F1F25E5, 0x5160372F, 0xC695C1FB, 0x4D7FF1E4, 0xAE5F6BF4, 0x0D72EE46, - 0xFF23DE8A, 0xB1CF8E83, 0xF14902E2, 0x3E981E42, 0x8BF53EB6, 0x7F4BF8AC, - 0x83631F83, 0x25970205, 0x76AFE784, 0x3A7931D4, 0x4F846450, 0x5C64C3F6, - 0x210A5F18, 0xC6986A26, 0x28F4E826, 0x3A60A81C, 0xD340A664, 0x7EA820C4, - 0x526687C5, 0x7EDDD12B, 0x32A11D1D, 0x9C9EF086, 0x80F6E831, 0xAB6F04AD, - 0x56FB9B53, 0x8B2E095C, 0xB68556AE, 0xD2250B0D, 0x294A7721, 0xE21FB253, - 0xAE136749, 0xE82AAE86, 0x93365104, 0x99404A66, 0x78A784DC, 0xB69BA84B, - 0x04046793, 0x23DB5C1E, 0x46CAE1D6, 0x2FE28134, 0x5A223942, 0x1863CD5B, - 0xC190C6E3, 0x07DFB846, 0x6EB88816, 0x2D0DCC4A, 0xA4CCAE59, 0x3798670D, - 0xCBFA9493, 0x4F481D45, 0xEAFC8CA8, 0xDB1129D6, 0xB0449E20, 0x0F5407FB, - 0x6167D9A8, 0xD1F45763, 0x4DAA96C3, 0x3BEC5958, 0xABABA014, 0xB6CCD201, - 0x38D6279F, 0x02682215, 0x8F376CD5, 0x092C237E, 0xBFC56593, 0x32889D2C, - 0x854B3E95, 0x05BB9B43, 0x7DCD5DCD, 0xA02E926C, 0xFAE527E5, 0x36A1C330, - 0x3412E1AE, 0xF257F462, 0x3C4F1D71, 0x30A2E809, 0x68E5F551, 0x9C61BA44, - 0x5DED0AB8, 0x75CE09C8, 0x9654F93E, 0x698C0CCA, 0x243CB3E4, 0x2B062B97, - 0x0F3B8D9E, 0x00E050DF, 0xFC5D6166, 0xE35F9288, 0xC079550D, 0x0591AEE8, - 0x8E531E74, 0x75FE3578, 0x2F6D829A, 0xF60B21AE, 0x95E8EB8D, 0x6699486B, - 0x901D7D9B, 0xFD6D6E31, 0x1090ACEF, 0xE0670DD8, 0xDAB2E692, 0xCD6D4365, - 0xE5393514, 0x3AF345F0, 0x6241FC4D, 0x460DA3A3, 0x7BCF3729, 0x8BF1D1E0, - 0x14AAC070, 0x1587ED55, 0x3AFD7D3E, 0xD2F29E01, 0x29A9D1F6, 0xEFB10C53, - 0xCF3B870F, 0xB414935C, 0x664465ED, 0x024ACAC7, 0x59A744C1, 0x1D2936A7, - 0xDC580AA6, 0xCF574CA8, 0x040A7A10, 0x6CD81807, 0x8A98BE4C, 0xACCEA063, - 0xC33E92B5, 0xD1E0E03D, 0xB322517E, 0x2092BD13, 0x386B2C4A, 0x52E8DD58, - 0x58656DFB, 0x50820371, 0x41811896, 0xE337EF7E, 0xD39FB119, 0xC97F0DF6, - 0x68FEA01B, 0xA150A6E5, 0x55258962, 0xEB6FF41B, 0xD7C9CD7A, 0xA619CD9E, - 0xBCF09576, 0x2672C073, 0xF003FB3C, 0x4AB7A50B, 0x1484126A, 0x487BA9B1, - 0xA64FC9C6, 0xF6957D49, 0x38B06A75, 0xDD805FCD, 0x63D094CF, 0xF51C999E, - 0x1AA4D343, 0xB8495294, 0xCE9F8E99, 0xBFFCD770, 0xC7C275CC, 0x378453A7, - 0x7B21BE33, 0x397F41BD, 0x4E94D131, 0x92CC1F98, 0x5915EA51, 0x99F861B7, - 0xC9980A88, 0x1D74FD5F, 0xB0A495F8, 0x614DEED0, 0xB5778EEA, 0x5941792D, - 0xFA90C1F8, 0x33F824B4, 0xC4965372, 0x3FF6D550, 0x4CA5FEC0, 0x8630E964, - 0x5B3FBBD6, 0x7DA26A48, 0xB203231A, 0x04297514, 0x2D639306, 0x2EB13149, - 0x16A45272, 0x532459A0, 0x8E5F4872, 0xF966C7D9, 0x07128DC0, 0x0D44DB62, - 0xAFC8D52D, 0x06316131, 0xD838E7CE, 0x1BC41D00, 0x3A2E8C0F, 0xEA83837E, - 0xB984737D, 0x13BA4891, 0xC4F8B949, 0xA6D6ACB3, 0xA215CDCE, 0x8359838B, - 0x6BD1AA31, 0xF579DD52, 0x21B93F93, 0xF5176781, 0x187DFDDE, 0xE94AEB76, - 0x2B38FD54, 0x431DE1DA, 0xAB394825, 0x9AD3048F, 0xDFEA32AA, 0x659473E3, - 0x623F7863, 0xF3346C59, 0xAB3AB685, 0x3346A90B, 0x6B56443E, 0xC6DE01F8, - 0x8D421FC0, 0x9B0ED10C, 0x88F1A1E9, 0x54C1F029, 0x7DEAD57B, 0x8D7BA426, - 0x4CF5178A, 0x551A7CCA, 0x1A9A5F08, 0xFCD651B9, 0x25605182, 0xE11FC6C3, - 0xB6FD9676, 0x337B3027, 0xB7C8EB14, 0x9E5FD030, 0x6B57E354, 0xAD913CF7, - 0x7E16688D, 0x58872A69, 0x2C2FC7DF, 0xE389CCC6, 0x30738DF1, 0x0824A734, - 0xE1797A8B, 0xA4A8D57B, 0x5B5D193B, 0xC8A8309B, 0x73F9A978, 0x73398D32, - 0x0F59573E, 0xE9DF2B03, 0xE8A5B6C8, 0x848D0704, 0x98DF93C2, 0x720A1DC3, - 0x684F259A, 0x943BA848, 0xA6370152, 0x863B5EA3, 0xD17B978B, 0x6D9B58EF, - 0x0A700DD4, 0xA73D36BF, 0x8E6A0829, 0x8695BC14, 0xE35B3447, 0x933AC568, - 0x8894B022, 0x2F511C27, 0xDDFBCC3C, 0x006662B6, 0x117C83FE, 0x4E12B414, - 0xC2BCA766, 0x3A2FEC10, 0xF4562420, 0x55792E2A, 0x46F5D857, 0xCEDA25CE, - 0xC3601D3B, 0x6C00AB46, 0xEFAC9C28, 0xB3C35047, 0x611DFEE3, 0x257C3207, - 0xFDD58482, 0x3B14D84F, 0x23BECB64, 0xA075F3A3, 0x088F8EAD, 0x07ADF158, - 0x7796943C, 0xFACABF3D, 0xC09730CD, 0xF7679969, 0xDA44E9ED, 0x2C854C12, - 0x35935FA3, 0x2F057D9F, 0x690624F8, 0x1CB0BAFD, 0x7B0DBDC6, 0x810F23BB, - 0xFA929A1A, 0x6D969A17, 0x6742979B, 0x74AC7D05, 0x010E65C4, 0x86A3D963, - 0xF907B5A0, 0xD0042BD3, 0x158D7D03, 0x287A8255, 0xBBA8366F, 0x096EDC33, - 0x21916A7B, 0x77B56B86, 0x951622F9, 0xA6C5E650, 0x8CEA17D1, 0xCD8C62BC, - 0xA3D63433, 0x358A68FD, 0x0F9B9D3C, 0xD6AA295B, 0xFE33384A, 0xC000738E, - 0xCD67EB2F, 0xE2EB6DC2, 0x97338B02, 0x06C9F246, 0x419CF1AD, 0x2B83C045, - 0x3723F18A, 0xCB5B3089, 0x160BEAD7, 0x5D494656, 0x35F8A74B, 0x1E4E6C9E, - 0x000399BD, 0x67466880, 0xB4174831, 0xACF423B2, 0xCA815AB3, 0x5A6395E7, - 0x302A67C5, 0x8BDB446B, 0x108F8FA4, 0x10223EDA, 0x92B8B48B, 0x7F38D0EE, - 0xAB2701D4, 0x0262D415, 0xAF224A30, 0xB3D88ABA, 0xF8B2C3AF, 0xDAF7EF70, - 0xCC97D3B7, 0xE9614B6C, 0x2BAEBFF4, 0x70F687CF, 0x386C9156, 0xCE092EE5, - 0x01E87DA6, 0x6CE91E6A, 0xBB7BCC84, 0xC7922C20, 0x9D3B71FD, 0x060E41C6, - 0xD7590F15, 0x4E03BB47, 0x183C198E, 0x63EEB240, 0x2DDBF49A, 0x6D5CBA54, - 0x923750AF, 0xF9E14236, 0x7838162B, 0x59726C72, 0x81B66760, 0xBB2926C1, - 0x48A0CE0D, 0xA6C0496D, 0xAD43507B, 0x718D496A, 0x9DF057AF, 0x44B1BDE6, - 0x054356DC, 0xDE7CED35, 0xD51A138B, 0x62088CC9, 0x35830311, 0xC96EFCA2, - 0x686F86EC, 0x8E77CB68, 0x63E1D6B8, 0xC80F9778, 0x79C491FD, 0x1B4C67F2, - 0x72698D7D, 0x5E368C31, 0xF7D95E2E, 0xA1D3493F, 0xDCD9433E, 0x896F1552, - 0x4BC4CA7A, 0xA6D1BAF4, 0xA5A96DCC, 0x0BEF8B46, 0xA169FDA7, 0x74DF40B7, - 0x4E208804, 0x9A756607, 0x038E87C8, 0x20211E44, 0x8B7AD4BF, 0xC6403F35, - 0x1848E36D, 0x80BDB038, 0x1E62891C, 0x643D2107, 0xBF04D6F8, 0x21092C8C, - 0xF644F389, 0x0778404E, 0x7B78ADB8, 0xA2C52D53, 0x42157ABE, 0xA2253E2E, - 0x7BF3F4AE, 0x80F594F9, 0x953194E7, 0x77EB92ED, 0xB3816930, 0xDA8D9336, - 0xBF447469, 0xF26D9483, 0xEE6FAED5, 0x71371235, 0xDE425F73, 0xB4E59F43, - 0x7DBE2D4E, 0x2D37B185, 0x49DC9A63, 0x98C39D98, 0x1301C9A2, 0x389B1BBF, - 0x0C18588D, 0xA421C1BA, 0x7AA3865C, 0x71E08558, 0x3C5CFCAA, 0x7D239CA4, - 0x0297D9DD, 0xD7DC2830, 0x4B37802B, 0x7428AB54, 0xAEEE0347, 0x4B3FBB85, - 0x692F2F08, 0x134E578E, 0x36D9E0BF, 0xAE8B5FCF, 0xEDB93ECF, 0x2B27248E, - 0x170EB1EF, 0x7DC57FD6, 0x1E760F16, 0xB1136601, 0x864E1B9B, 0xD7EA7319, - 0x3AB871BD, 0xCFA4D76F, 0xE31BD782, 0x0DBEB469, 0xABB96061, 0x5370F85D, - 0xFFB07E37, 0xDA30D0FB, 0xEBC977B6, 0x0B98B40F, 0x3A4D0FE6, 0xDF4FC26B, - 0x159CF22A, 0xC298D6E2, 0x2B78EF6A, 0x61A94AC0, 0xAB561187, 0x14EEA0F0, - 0xDF0D4164, 0x19AF70EE }; - -} diff --git a/src/block/serpent_ia32/serp_ia32_imp.S b/src/block/serpent_ia32/serp_ia32_imp.S index 9e50f8cdc..5ab630f43 100644 --- a/src/block/serpent_ia32/serp_ia32_imp.S +++ b/src/block/serpent_ia32/serp_ia32_imp.S @@ -1,5 +1,5 @@ /* -* Serpent Source File +* Serpent in IA-32 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license diff --git a/src/block/skipjack/skipjack.cpp b/src/block/skipjack/skipjack.cpp index e8b2cfb8d..b23d1e160 100644 --- a/src/block/skipjack/skipjack.cpp +++ b/src/block/skipjack/skipjack.cpp @@ -10,6 +10,68 @@ namespace Botan { +namespace { + +/* +* Skipjack Stepping Rule 'A' +*/ +void step_A(u16bit& W1, u16bit& W4, u32bit round, const byte FTAB[]) + { + byte G1 = get_byte(0, W1), G2 = get_byte(1, W1), G3; + + G3 = FTAB[((4*round-4)%10)*256 + G2] ^ G1; + G1 = FTAB[((4*round-3)%10)*256 + G3] ^ G2; + G2 = FTAB[((4*round-2)%10)*256 + G1] ^ G3; + G3 = FTAB[((4*round-1)%10)*256 + G2] ^ G1; + + W1 = make_u16bit(G2, G3); + W4 ^= W1 ^ round; + } + +/* +* Skipjack Stepping Rule 'B' +*/ +void step_B(u16bit& W1, u16bit& W2, u32bit round, const byte FTAB[]) + { + W2 ^= W1 ^ round; + byte G1 = get_byte(0, W1), G2 = get_byte(1, W1), G3; + G3 = FTAB[((4*round-4)%10)*256 + G2] ^ G1; + G1 = FTAB[((4*round-3)%10)*256 + G3] ^ G2; + G2 = FTAB[((4*round-2)%10)*256 + G1] ^ G3; + G3 = FTAB[((4*round-1)%10)*256 + G2] ^ G1; + W1 = make_u16bit(G2, G3); + } + +/* +* Skipjack Invserse Stepping Rule 'A' +*/ +void step_Ai(u16bit& W1, u16bit& W2, u32bit round, const byte FTAB[]) + { + W1 ^= W2 ^ round; + byte G1 = get_byte(1, W2), G2 = get_byte(0, W2), G3; + G3 = FTAB[((4 * round - 1) % 10)*256 + G2] ^ G1; + G1 = FTAB[((4 * round - 2) % 10)*256 + G3] ^ G2; + G2 = FTAB[((4 * round - 3) % 10)*256 + G1] ^ G3; + G3 = FTAB[((4 * round - 4) % 10)*256 + G2] ^ G1; + W2 = make_u16bit(G3, G2); + } + +/* +* Skipjack Invserse Stepping Rule 'B' +*/ +void step_Bi(u16bit& W2, u16bit& W3, u32bit round, const byte FTAB[]) + { + byte G1 = get_byte(1, W2), G2 = get_byte(0, W2), G3; + G3 = FTAB[((4 * round - 1) % 10)*256 + G2] ^ G1; + G1 = FTAB[((4 * round - 2) % 10)*256 + G3] ^ G2; + G2 = FTAB[((4 * round - 3) % 10)*256 + G1] ^ G3; + G3 = FTAB[((4 * round - 4) % 10)*256 + G2] ^ G1; + W2 = make_u16bit(G3, G2); + W3 ^= W2 ^ round; + } + +} + /* * Skipjack Encryption */ @@ -22,17 +84,25 @@ void Skipjack::encrypt_n(const byte in[], byte out[], u32bit blocks) const u16bit W3 = load_le<u16bit>(in, 1); u16bit W4 = load_le<u16bit>(in, 0); - step_A(W1,W4, 1); step_A(W4,W3, 2); step_A(W3,W2, 3); step_A(W2,W1, 4); - step_A(W1,W4, 5); step_A(W4,W3, 6); step_A(W3,W2, 7); step_A(W2,W1, 8); + step_A(W1, W4, 1, FTAB); step_A(W4, W3, 2, FTAB); + step_A(W3, W2, 3, FTAB); step_A(W2, W1, 4, FTAB); + step_A(W1, W4, 5, FTAB); step_A(W4, W3, 6, FTAB); + step_A(W3, W2, 7, FTAB); step_A(W2, W1, 8, FTAB); - step_B(W1,W2, 9); step_B(W4,W1,10); step_B(W3,W4,11); step_B(W2,W3,12); - step_B(W1,W2,13); step_B(W4,W1,14); step_B(W3,W4,15); step_B(W2,W3,16); + step_B(W1, W2, 9, FTAB); step_B(W4, W1, 10, FTAB); + step_B(W3, W4, 11, FTAB); step_B(W2, W3, 12, FTAB); + step_B(W1, W2, 13, FTAB); step_B(W4, W1, 14, FTAB); + step_B(W3, W4, 15, FTAB); step_B(W2, W3, 16, FTAB); - step_A(W1,W4,17); step_A(W4,W3,18); step_A(W3,W2,19); step_A(W2,W1,20); - step_A(W1,W4,21); step_A(W4,W3,22); step_A(W3,W2,23); step_A(W2,W1,24); + step_A(W1, W4, 17, FTAB); step_A(W4, W3, 18, FTAB); + step_A(W3, W2, 19, FTAB); step_A(W2, W1, 20, FTAB); + step_A(W1, W4, 21, FTAB); step_A(W4, W3, 22, FTAB); + step_A(W3, W2, 23, FTAB); step_A(W2, W1, 24, FTAB); - step_B(W1,W2,25); step_B(W4,W1,26); step_B(W3,W4,27); step_B(W2,W3,28); - step_B(W1,W2,29); step_B(W4,W1,30); step_B(W3,W4,31); step_B(W2,W3,32); + step_B(W1, W2, 25, FTAB); step_B(W4, W1, 26, FTAB); + step_B(W3, W4, 27, FTAB); step_B(W2, W3, 28, FTAB); + step_B(W1, W2, 29, FTAB); step_B(W4, W1, 30, FTAB); + step_B(W3, W4, 31, FTAB); step_B(W2, W3, 32, FTAB); store_le(out, W4, W3, W2, W1); @@ -53,17 +123,25 @@ void Skipjack::decrypt_n(const byte in[], byte out[], u32bit blocks) const u16bit W3 = load_le<u16bit>(in, 1); u16bit W4 = load_le<u16bit>(in, 0); - step_Bi(W2,W3,32); step_Bi(W3,W4,31); step_Bi(W4,W1,30); step_Bi(W1,W2,29); - step_Bi(W2,W3,28); step_Bi(W3,W4,27); step_Bi(W4,W1,26); step_Bi(W1,W2,25); + step_Bi(W2, W3, 32, FTAB); step_Bi(W3, W4, 31, FTAB); + step_Bi(W4, W1, 30, FTAB); step_Bi(W1, W2, 29, FTAB); + step_Bi(W2, W3, 28, FTAB); step_Bi(W3, W4, 27, FTAB); + step_Bi(W4, W1, 26, FTAB); step_Bi(W1, W2, 25, FTAB); - step_Ai(W1,W2,24); step_Ai(W2,W3,23); step_Ai(W3,W4,22); step_Ai(W4,W1,21); - step_Ai(W1,W2,20); step_Ai(W2,W3,19); step_Ai(W3,W4,18); step_Ai(W4,W1,17); + step_Ai(W1, W2, 24, FTAB); step_Ai(W2, W3, 23, FTAB); + step_Ai(W3, W4, 22, FTAB); step_Ai(W4, W1, 21, FTAB); + step_Ai(W1, W2, 20, FTAB); step_Ai(W2, W3, 19, FTAB); + step_Ai(W3, W4, 18, FTAB); step_Ai(W4, W1, 17, FTAB); - step_Bi(W2,W3,16); step_Bi(W3,W4,15); step_Bi(W4,W1,14); step_Bi(W1,W2,13); - step_Bi(W2,W3,12); step_Bi(W3,W4,11); step_Bi(W4,W1,10); step_Bi(W1,W2, 9); + step_Bi(W2, W3, 16, FTAB); step_Bi(W3, W4, 15, FTAB); + step_Bi(W4, W1, 14, FTAB); step_Bi(W1, W2, 13, FTAB); + step_Bi(W2, W3, 12, FTAB); step_Bi(W3, W4, 11, FTAB); + step_Bi(W4, W1, 10, FTAB); step_Bi(W1, W2, 9, FTAB); - step_Ai(W1,W2, 8); step_Ai(W2,W3, 7); step_Ai(W3,W4, 6); step_Ai(W4,W1, 5); - step_Ai(W1,W2, 4); step_Ai(W2,W3, 3); step_Ai(W3,W4, 2); step_Ai(W4,W1, 1); + step_Ai(W1, W2, 8, FTAB); step_Ai(W2, W3, 7, FTAB); + step_Ai(W3, W4, 6, FTAB); step_Ai(W4, W1, 5, FTAB); + step_Ai(W1, W2, 4, FTAB); step_Ai(W2, W3, 3, FTAB); + step_Ai(W3, W4, 2, FTAB); step_Ai(W4, W1, 1, FTAB); store_le(out, W4, W3, W2, W1); @@ -73,62 +151,6 @@ void Skipjack::decrypt_n(const byte in[], byte out[], u32bit blocks) const } /* -* Skipjack Stepping Rule 'A' -*/ -void Skipjack::step_A(u16bit& W1, u16bit& W4, u32bit round) const - { - byte G1 = get_byte(0, W1), G2 = get_byte(1, W1), G3; - G3 = FTABLE[(4 * round - 4) % 10][G2] ^ G1; - G1 = FTABLE[(4 * round - 3) % 10][G3] ^ G2; - G2 = FTABLE[(4 * round - 2) % 10][G1] ^ G3; - G3 = FTABLE[(4 * round - 1) % 10][G2] ^ G1; - W1 = make_u16bit(G2, G3); - W4 ^= W1 ^ round; - } - -/* -* Skipjack Stepping Rule 'B' -*/ -void Skipjack::step_B(u16bit& W1, u16bit& W2, u32bit round) const - { - W2 ^= W1 ^ round; - byte G1 = get_byte(0, W1), G2 = get_byte(1, W1), G3; - G3 = FTABLE[(4 * round - 4) % 10][G2] ^ G1; - G1 = FTABLE[(4 * round - 3) % 10][G3] ^ G2; - G2 = FTABLE[(4 * round - 2) % 10][G1] ^ G3; - G3 = FTABLE[(4 * round - 1) % 10][G2] ^ G1; - W1 = make_u16bit(G2, G3); - } - -/* -* Skipjack Invserse Stepping Rule 'A' -*/ -void Skipjack::step_Ai(u16bit& W1, u16bit& W2, u32bit round) const - { - W1 ^= W2 ^ round; - byte G1 = get_byte(1, W2), G2 = get_byte(0, W2), G3; - G3 = FTABLE[(4 * round - 1) % 10][G2] ^ G1; - G1 = FTABLE[(4 * round - 2) % 10][G3] ^ G2; - G2 = FTABLE[(4 * round - 3) % 10][G1] ^ G3; - G3 = FTABLE[(4 * round - 4) % 10][G2] ^ G1; - W2 = make_u16bit(G3, G2); - } - -/* -* Skipjack Invserse Stepping Rule 'B' -*/ -void Skipjack::step_Bi(u16bit& W2, u16bit& W3, u32bit round) const - { - byte G1 = get_byte(1, W2), G2 = get_byte(0, W2), G3; - G3 = FTABLE[(4 * round - 1) % 10][G2] ^ G1; - G1 = FTABLE[(4 * round - 2) % 10][G3] ^ G2; - G2 = FTABLE[(4 * round - 3) % 10][G1] ^ G3; - G3 = FTABLE[(4 * round - 4) % 10][G2] ^ G1; - W2 = make_u16bit(G3, G2); - W3 ^= W2 ^ round; - } - -/* * Skipjack Key Schedule */ void Skipjack::key_schedule(const byte key[], u32bit) @@ -157,9 +179,9 @@ void Skipjack::key_schedule(const byte key[], u32bit) 0x5E, 0x6C, 0xA9, 0x13, 0x57, 0x25, 0xB5, 0xE3, 0xBD, 0xA8, 0x3A, 0x01, 0x05, 0x59, 0x2A, 0x46 }; - for(u32bit j = 0; j != 10; ++j) - for(u32bit k = 0; k != 256; ++k) - FTABLE[j][k] = F[k ^ key[9-j]]; + for(u32bit i = 0; i != 10; ++i) + for(u32bit j = 0; j != 256; ++j) + FTAB[256*i+j] = F[j ^ key[9-i]]; } /* @@ -167,8 +189,7 @@ void Skipjack::key_schedule(const byte key[], u32bit) */ void Skipjack::clear() { - for(u32bit j = 0; j != 10; ++j) - FTABLE[j].clear(); + FTAB.clear(); } } diff --git a/src/block/skipjack/skipjack.h b/src/block/skipjack/skipjack.h index 60fad6310..b701e2091 100644 --- a/src/block/skipjack/skipjack.h +++ b/src/block/skipjack/skipjack.h @@ -28,12 +28,8 @@ class BOTAN_DLL Skipjack : public BlockCipher Skipjack() : BlockCipher(8, 10) {} private: void key_schedule(const byte[], u32bit); - void step_A(u16bit&, u16bit&, u32bit) const; - void step_B(u16bit&, u16bit&, u32bit) const; - void step_Ai(u16bit&, u16bit&, u32bit) const; - void step_Bi(u16bit&, u16bit&, u32bit) const; - SecureBuffer<byte, 256> FTABLE[10]; + SecureBuffer<byte, 2560> FTAB; }; } diff --git a/src/block/square/square.cpp b/src/block/square/square.cpp index 90f2301cf..892568655 100644 --- a/src/block/square/square.cpp +++ b/src/block/square/square.cpp @@ -18,7 +18,7 @@ void Square::encrypt_n(const byte in[], byte out[], u32bit blocks) const { for(u32bit i = 0; i != blocks; ++i) { - u32bit T0, T1, T2, T3, B0, B1, B2, B3; + u32bit B0, B1, B2, B3; B0 = TE0[in[ 0] ^ ME[ 0]] ^ TE1[in[ 4] ^ ME[ 4]] ^ TE2[in[ 8] ^ ME[ 8]] ^ TE3[in[12] ^ ME[12]] ^ EK[0]; @@ -31,6 +31,7 @@ void Square::encrypt_n(const byte in[], byte out[], u32bit blocks) const for(u32bit j = 1; j != 7; j += 2) { + u32bit T0, T1, T2, T3; T0 = TE0[get_byte(0, B0)] ^ TE1[get_byte(0, B1)] ^ TE2[get_byte(0, B2)] ^ TE3[get_byte(0, B3)] ^ EK[4*j+0]; T1 = TE0[get_byte(1, B0)] ^ TE1[get_byte(1, B1)] ^ @@ -79,7 +80,7 @@ void Square::decrypt_n(const byte in[], byte out[], u32bit blocks) const { for(u32bit i = 0; i != blocks; ++i) { - u32bit T0, T1, T2, T3, B0, B1, B2, B3; + u32bit B0, B1, B2, B3; B0 = TD0[in[ 0] ^ MD[ 0]] ^ TD1[in[ 4] ^ MD[ 4]] ^ TD2[in[ 8] ^ MD[ 8]] ^ TD3[in[12] ^ MD[12]] ^ DK[0]; @@ -92,6 +93,7 @@ void Square::decrypt_n(const byte in[], byte out[], u32bit blocks) const for(u32bit j = 1; j != 7; j += 2) { + u32bit T0, T1, T2, T3; T0 = TD0[get_byte(0, B0)] ^ TD1[get_byte(0, B1)] ^ TD2[get_byte(0, B2)] ^ TD3[get_byte(0, B3)] ^ DK[4*j+0]; T1 = TD0[get_byte(1, B0)] ^ TD1[get_byte(1, B1)] ^ @@ -139,25 +141,31 @@ void Square::decrypt_n(const byte in[], byte out[], u32bit blocks) const void Square::key_schedule(const byte key[], u32bit) { SecureBuffer<u32bit, 36> XEK, XDK; - for(u32bit j = 0; j != 4; ++j) - XEK[j] = load_be<u32bit>(key, j); - for(u32bit j = 0; j != 8; ++j) + + for(u32bit i = 0; i != 4; ++i) + XEK[i] = load_be<u32bit>(key, i); + + for(u32bit i = 0; i != 8; ++i) { - XEK[4*j+4] = XEK[4*j ] ^ rotate_left(XEK[4*j+3], 8) ^ (0x01000000 << j); - XEK[4*j+5] = XEK[4*j+1] ^ XEK[4*j+4]; - XEK[4*j+6] = XEK[4*j+2] ^ XEK[4*j+5]; - XEK[4*j+7] = XEK[4*j+3] ^ XEK[4*j+6]; - XDK.copy(28 - 4*j, XEK + 4*(j+1), 4); - transform(XEK + 4*j); + XEK[4*i+4] = XEK[4*i ] ^ rotate_left(XEK[4*i+3], 8) ^ (0x01000000 << i); + XEK[4*i+5] = XEK[4*i+1] ^ XEK[4*i+4]; + XEK[4*i+6] = XEK[4*i+2] ^ XEK[4*i+5]; + XEK[4*i+7] = XEK[4*i+3] ^ XEK[4*i+6]; + + XDK.copy(28 - 4*i, XEK + 4*(i+1), 4); + + transform(XEK + 4*i); } - for(u32bit j = 0; j != 4; ++j) - for(u32bit k = 0; k != 4; ++k) + + for(u32bit i = 0; i != 4; ++i) + for(u32bit j = 0; j != 4; ++j) { - ME[4*j+k ] = get_byte(k, XEK[j ]); - ME[4*j+k+16] = get_byte(k, XEK[j+32]); - MD[4*j+k ] = get_byte(k, XDK[j ]); - MD[4*j+k+16] = get_byte(k, XEK[j ]); + ME[4*i+j ] = get_byte(j, XEK[i ]); + ME[4*i+j+16] = get_byte(j, XEK[i+32]); + MD[4*i+j ] = get_byte(j, XDK[i ]); + MD[4*i+j+16] = get_byte(j, XEK[i ]); } + EK.copy(XEK + 4, 28); DK.copy(XDK + 4, 28); } @@ -168,28 +176,28 @@ void Square::key_schedule(const byte key[], u32bit) void Square::transform(u32bit round_key[4]) { static const byte G[4][4] = { - { 0x02, 0x01, 0x01, 0x03 }, - { 0x03, 0x02, 0x01, 0x01 }, - { 0x01, 0x03, 0x02, 0x01 }, - { 0x01, 0x01, 0x03, 0x02 } }; + { 2, 1, 1, 3 }, + { 3, 2, 1, 1 }, + { 1, 3, 2, 1 }, + { 1, 1, 3, 2 } }; - for(u32bit j = 0; j != 4; ++j) + for(u32bit i = 0; i != 4; ++i) { - SecureBuffer<byte, 4> A, B; + byte A[4] = { 0 }, B[4] = { 0 }; - store_be(round_key[j], A); + store_be(round_key[i], A); - for(u32bit k = 0; k != 4; ++k) - for(u32bit l = 0; l != 4; ++l) + for(u32bit j = 0; j != 4; ++j) + for(u32bit k = 0; k != 4; ++k) { - const byte a = A[l]; - const byte b = G[l][k]; + const byte a = A[k]; + const byte b = G[k][j]; if(a && b) - B[k] ^= ALog[(Log[a] + Log[b]) % 255]; + B[j] ^= ALog[(Log[a] + Log[b]) % 255]; } - round_key[j] = load_be<u32bit>(B.begin(), 0); + round_key[i] = load_be<u32bit>(B, 0); } } diff --git a/src/build-data/arch/amd64.txt b/src/build-data/arch/amd64.txt index 6c1c2a7e4..58d1d3fa6 100644 --- a/src/build-data/arch/amd64.txt +++ b/src/build-data/arch/amd64.txt @@ -4,12 +4,14 @@ unaligned ok <aliases> x86-64 x86_64 # for RPM +em64t +x64 </aliases> <submodels> k8 k10 -em64t +nocona core2 nehalem westmere diff --git a/src/build-data/arch/sparc64.txt b/src/build-data/arch/sparc64.txt index 8f62e66f6..a1ed16549 100644 --- a/src/build-data/arch/sparc64.txt +++ b/src/build-data/arch/sparc64.txt @@ -1,11 +1,9 @@ <submodels> -sparc64-ultra -sparc64-ultra2 -sparc64-ultra3 +ultrasparc +ultrasparc3 </submodels> <submodel_aliases> -ultrasparc -> sparc64-ultra -ultrasparc2 -> sparc64-ultra2 -ultrasparc3 -> sparc64-ultra3 +# Functionally the same for optimization purposes +ultrasparc2 -> ultrasparc </submodel_aliases> diff --git a/src/build-data/cc/gcc.txt b/src/build-data/cc/gcc.txt index f25f81048..3cb287f70 100644 --- a/src/build-data/cc/gcc.txt +++ b/src/build-data/cc/gcc.txt @@ -14,8 +14,8 @@ lang_flags "-D_REENTRANT -ansi -Wno-long-long" warning_flags "-W -Wall" #warning_flags "-Wextra -Wall -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wno-unused-parameter" -lib_opt_flags "-O2" -check_opt_flags "-O" +lib_opt_flags "-O3" +check_opt_flags "-O2" shared_flags "-fPIC" debug_flags "-g" no_debug_flags "-finline-functions" @@ -42,18 +42,14 @@ beos -> "ld -shared -h $(SONAME)" <mach_opt> # Specializations first (they don't need to be, just clearer) i386 -> "-mtune=i686 -momit-leaf-frame-pointer" -r10000 -> "-mips4" -alpha-ev67 -> "-mcpu=ev6" # FIXME: GCC 3.1 and on has -march=ev67 -alpha-ev68 -> "-mcpu=ev6" -alpha-ev7 -> "-mcpu=ev6" ppc601 -> "-mpowerpc -mcpu=601" -sparc64-ultra3 -> "-mcpu=v9 -mtune=ultrasparc3" - -em64t -> "-march=nocona -momit-leaf-frame-pointer" -cellppu -> "" +# Until GCC gets -march support for these models nehalem -> "-march=core2 -msse4.1 -msse4.2" westmere -> "-march=core2 -maes -msse4.1 -msse4.2" +cellppu -> "" +alpha-ev68 -> "-mcpu=ev6" +alpha-ev7 -> "-mcpu=ev6" # Default family options (SUBMODEL is substitued with the real submodel) # Anything after the quotes is what should be *removed* from the submodel name @@ -67,7 +63,7 @@ hppa -> "-march=SUBMODEL" hppa m68k -> "-mSUBMODEL" hitachi-sh -> "-mSUBMODEL" hitachi-sh sparc32 -> "-mcpu=SUBMODEL -Wa,-xarch=v8plus" sparc32- -sparc64 -> "-mcpu=v9 -mtune=ultrasparc" +sparc64 -> "-mcpu=v9 -mtune=SUBMODEL" mips32 -> "-mips1 -mcpu=SUBMODEL" mips32- mips64 -> "-mips3 -mcpu=SUBMODEL" mips64- ppc -> "-mcpu=SUBMODEL" ppc diff --git a/src/build-data/cc/icc.txt b/src/build-data/cc/icc.txt index 628a59e2d..b5cad542c 100644 --- a/src/build-data/cc/icc.txt +++ b/src/build-data/cc/icc.txt @@ -24,10 +24,14 @@ dll_export_flags "" makefile_style unix <mach_opt> -pentium3 -> "-march=pentium3" -pentium4 -> "-march=pentium4" +pentium3 -> "-march=pentium3" +pentium4 -> "-march=pentium4" pentium-m -> "-march=pentium3" -core2 -> "-march=core2" +core2 -> "-march=core2" + +# ICC 11.1 doesn't have native Nehalem or Westmere support +nehalem -> "-march=core2" +westmere -> "-march=core2" </mach_opt> <so_link_flags> diff --git a/src/cert/cvc/cvc_ado.h b/src/cert/cvc/cvc_ado.h index 2c4f3ce70..a0dbec2a6 100644 --- a/src/cert/cvc/cvc_ado.h +++ b/src/cert/cvc/cvc_ado.h @@ -1,7 +1,6 @@ /* * EAC1_1 CVC ADO * (C) 2008 Falko Strenzke * * Distributed under the terms of the Botan license */ diff --git a/src/cert/cvc/cvc_key.h b/src/cert/cvc/cvc_key.h index 67b6cef17..a81660597 100644 --- a/src/cert/cvc/cvc_key.h +++ b/src/cert/cvc/cvc_key.h @@ -2,7 +2,6 @@ * EAC CVC Public Key * (C) 2008 FlexSecure Gmbh * Falko Strenzke * * Distributed under the terms of the Botan license */ diff --git a/src/cert/cvc/cvc_req.h b/src/cert/cvc/cvc_req.h index 8599f539d..28f03db80 100644 --- a/src/cert/cvc/cvc_req.h +++ b/src/cert/cvc/cvc_req.h @@ -1,7 +1,6 @@ /* * EAC1_1 CVC Request * (C) 2008 Falko Strenzke * * Distributed under the terms of the Botan license */ diff --git a/src/cert/cvc/eac_obj.h b/src/cert/cvc/eac_obj.h index 04afd7e59..2c1250a9a 100644 --- a/src/cert/cvc/eac_obj.h +++ b/src/cert/cvc/eac_obj.h @@ -1,7 +1,6 @@ /* * EAC1_1 objects * (C) 2008 Falko Strenzke * * Distributed under the terms of the Botan license */ diff --git a/src/cert/cvc/freestore.h b/src/cert/cvc/freestore.h index f95afa802..7f8b85388 100644 --- a/src/cert/cvc/freestore.h +++ b/src/cert/cvc/freestore.h @@ -1,7 +1,8 @@ -/** +/* * (C) 2007 Christoph Ludwig -**/ +* +* Distributed under the terms of the Botan license +*/ #ifndef BOTAN_FREESTORE_H__ #define BOTAN_FREESTORE_H__ @@ -23,8 +24,6 @@ namespace Botan { * enables convenient automatic conversions between plain and smart * pointer types. It internally stores a SharedPointer which can be * accessed. -* -* Distributed under the terms of the Botan license */ template<typename T> class BOTAN_DLL SharedPtrConverter diff --git a/src/cert/x509/x509_ca.cpp b/src/cert/x509/x509_ca.cpp index f0eb9c3e5..48ec0bd1c 100644 --- a/src/cert/x509/x509_ca.cpp +++ b/src/cert/x509/x509_ca.cpp @@ -9,9 +9,10 @@ #include <botan/x509stor.h> #include <botan/der_enc.h> #include <botan/ber_dec.h> -#include <botan/look_pk.h> #include <botan/bigint.h> #include <botan/parsing.h> +#include <botan/lookup.h> +#include <botan/look_pk.h> #include <botan/oids.h> #include <botan/timer.h> #include <algorithm> @@ -20,22 +21,33 @@ #include <memory> #include <set> +#include <stdio.h> + namespace Botan { /* * Load the certificate and private key */ X509_CA::X509_CA(const X509_Certificate& c, - const Private_Key& key) : cert(c) + const Private_Key& key, + const std::string& hash_fn) : cert(c) { - const Private_Key* key_pointer = &key; - if(!dynamic_cast<const PK_Signing_Key*>(key_pointer)) + // Use pointer dynamic_cast to avoid exception if cast fails + if(!dynamic_cast<const PK_Signing_Key*>(&key)) throw Invalid_Argument("X509_CA: " + key.algo_name() + " cannot sign"); if(!cert.is_CA_cert()) throw Invalid_Argument("X509_CA: This certificate is not for a CA"); - signer = choose_sig_format(key, ca_sig_algo); + signer = choose_sig_format(key, hash_fn, ca_sig_algo); + } + +/* +* X509_CA Destructor +*/ +X509_CA::~X509_CA() + { + delete signer; } /* @@ -70,7 +82,8 @@ X509_Certificate X509_CA::sign_request(const PKCS10_Request& req, extensions.add( new Cert_Extension::Subject_Alternative_Name(req.subject_alt_name())); - return make_cert(signer, rng, ca_sig_algo, req.raw_public_key(), + return make_cert(signer, rng, ca_sig_algo, + req.raw_public_key(), not_before, not_after, cert.subject_dn(), req.subject_dn(), extensions); @@ -231,17 +244,10 @@ X509_Certificate X509_CA::ca_certificate() const } /* -* X509_CA Destructor -*/ -X509_CA::~X509_CA() - { - delete signer; - } - -/* * Choose a signing format for the key */ PK_Signer* choose_sig_format(const Private_Key& key, + const std::string& hash_fn, AlgorithmIdentifier& sig_algo) { std::string padding; @@ -249,24 +255,36 @@ PK_Signer* choose_sig_format(const Private_Key& key, const std::string algo_name = key.algo_name(); + const HashFunction* proto_hash = retrieve_hash(hash_fn); + if(!proto_hash) + throw Algorithm_Not_Found(hash_fn); + + if(key.max_input_bits() < proto_hash->OUTPUT_LENGTH*8) + { + printf("%d %d\n", key.max_input_bits(), proto_hash->OUTPUT_LENGTH*8); + throw Invalid_Argument("Key is too small for chosen hash function"); + } + if(algo_name == "RSA") { - padding = "EMSA3(SHA-160)"; + padding = "EMSA3"; format = IEEE_1363; } else if(algo_name == "DSA") { - padding = "EMSA1(SHA-160)"; + padding = "EMSA1"; format = DER_SEQUENCE; } else if(algo_name == "ECDSA") { - padding = "EMSA1_BSI(SHA-160)"; + padding = "EMSA1_BSI"; format = IEEE_1363; } else throw Invalid_Argument("Unknown X.509 signing key type: " + algo_name); + padding = padding + '(' + proto_hash->name() + ')'; + sig_algo.oid = OIDS::lookup(algo_name + "/" + padding); std::auto_ptr<X509_Encoder> encoding(key.x509_encoder()); diff --git a/src/cert/x509/x509_ca.h b/src/cert/x509/x509_ca.h index ef2a8d134..6eb4bbbef 100644 --- a/src/cert/x509/x509_ca.h +++ b/src/cert/x509/x509_ca.h @@ -50,7 +50,8 @@ class BOTAN_DLL X509_CA * as the offset from the current time * @return the new CRL */ - X509_CRL new_crl(RandomNumberGenerator& rng, u32bit = 0) const; + X509_CRL new_crl(RandomNumberGenerator& rng, + u32bit next_update = 0) const; /** * Create a new CRL by with additional entries. @@ -65,27 +66,45 @@ class BOTAN_DLL X509_CA RandomNumberGenerator& rng, u32bit next_update = 0) const; - static X509_Certificate make_cert(PK_Signer*, - RandomNumberGenerator&, - const AlgorithmIdentifier&, - const MemoryRegion<byte>&, - const X509_Time&, const X509_Time&, - const X509_DN&, const X509_DN&, - const Extensions&); + /** + * Interface for creating new certificates + * @param signer a signing object + * @param rng a random number generator + * @param sig_algo the signature algorithm identifier + * @param not_before the start time of the certificate + * @param not_after the end time of the certificate + * @param issuer_dn the DN of the issuer + * @param subject_dn the DN of the subject + * @param extensions an optional list of certificate extensions + * @returns newly minted certificate + */ + static X509_Certificate make_cert(PK_Signer* signer, + RandomNumberGenerator& rng, + const AlgorithmIdentifier& sig_algo, + const MemoryRegion<byte>& pub_key, + const X509_Time& not_before, + const X509_Time& not_after, + const X509_DN& issuer_dn, + const X509_DN& subject_dn, + const Extensions& extensions); /** * Create a new CA object. * @param ca_certificate the certificate of the CA * @param key the private key of the CA */ - X509_CA(const X509_Certificate& ca_certificate, const Private_Key& key); + X509_CA(const X509_Certificate& ca_certificate, + const Private_Key& key, + const std::string& hash_fn); + ~X509_CA(); private: X509_CA(const X509_CA&) {} X509_CA& operator=(const X509_CA&) { return (*this); } - X509_CRL make_crl(const std::vector<CRL_Entry>&, - u32bit, u32bit, RandomNumberGenerator&) const; + X509_CRL make_crl(const std::vector<CRL_Entry>& entries, + u32bit crl_number, u32bit next_update, + RandomNumberGenerator& rng) const; AlgorithmIdentifier ca_sig_algo; X509_Certificate cert; @@ -96,13 +115,14 @@ class BOTAN_DLL X509_CA * Choose the default signature format for a certain public key signature * scheme. * @param key will be the key to choose a padding scheme for +* @param hash_fn is the desired hash function * @param alg_id will be set to the chosen scheme * @return A PK_Signer object for generating signatures */ BOTAN_DLL PK_Signer* choose_sig_format(const Private_Key& key, + const std::string& hash_fn, AlgorithmIdentifier& alg_id); - } #endif diff --git a/src/cert/x509/x509self.cpp b/src/cert/x509/x509self.cpp index 8afb22a7e..f915c6ff5 100644 --- a/src/cert/x509/x509self.cpp +++ b/src/cert/x509/x509self.cpp @@ -65,6 +65,7 @@ namespace X509 { */ X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, const Private_Key& key, + const std::string& hash_fn, RandomNumberGenerator& rng) { AlgorithmIdentifier sig_algo; @@ -72,7 +73,7 @@ X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, AlternativeName subject_alt; MemoryVector<byte> pub_key = shared_setup(opts, key); - std::auto_ptr<PK_Signer> signer(choose_sig_format(key, sig_algo)); + std::auto_ptr<PK_Signer> signer(choose_sig_format(key, hash_fn, sig_algo)); load_info(opts, subject_dn, subject_alt); Key_Constraints constraints; @@ -103,6 +104,7 @@ X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, */ PKCS10_Request create_cert_req(const X509_Cert_Options& opts, const Private_Key& key, + const std::string& hash_fn, RandomNumberGenerator& rng) { AlgorithmIdentifier sig_algo; @@ -110,7 +112,7 @@ PKCS10_Request create_cert_req(const X509_Cert_Options& opts, AlternativeName subject_alt; MemoryVector<byte> pub_key = shared_setup(opts, key); - std::auto_ptr<PK_Signer> signer(choose_sig_format(key, sig_algo)); + std::auto_ptr<PK_Signer> signer(choose_sig_format(key, hash_fn, sig_algo)); load_info(opts, subject_dn, subject_alt); const u32bit PKCS10_VERSION = 0; diff --git a/src/cert/x509/x509self.h b/src/cert/x509/x509self.h index bd3e29179..741350067 100644 --- a/src/cert/x509/x509self.h +++ b/src/cert/x509/x509self.h @@ -172,12 +172,14 @@ namespace X509 { * @param opts the options defining the certificate to create * @param key the private key used for signing, i.e. the key * associated with this self-signed certificate +* @param hash_fn the hash function to use * @param rng the rng to use * @return the newly created self-signed certificate */ BOTAN_DLL X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, const Private_Key& key, + const std::string& hash_fn, RandomNumberGenerator& rng); /** @@ -185,10 +187,12 @@ create_self_signed_cert(const X509_Cert_Options& opts, * @param opts the options defining the request to create * @param key the key used to sign this request * @param rng the rng to use +* @param hash_fn the hash function to use * @return the newly created PKCS#10 request */ BOTAN_DLL PKCS10_Request create_cert_req(const X509_Cert_Options& opts, const Private_Key& key, + const std::string& hash_fn, RandomNumberGenerator& rng); } diff --git a/src/engine/aes_isa_eng/aes_isa_engine.cpp b/src/engine/aes_isa_eng/aes_isa_engine.cpp index fa3b4ceab..e57e4278d 100644 --- a/src/engine/aes_isa_eng/aes_isa_engine.cpp +++ b/src/engine/aes_isa_eng/aes_isa_engine.cpp @@ -23,21 +23,19 @@ AES_ISA_Engine::find_block_cipher(const SCAN_Name& request, Algorithm_Factory&) const { #if defined(BOTAN_HAS_AES_INTEL) - if(CPUID::has_intel_aes()) + if(CPUID::has_aes_intel()) { if(request.algo_name() == "AES-128") return new AES_128_Intel; - /* if(request.algo_name() == "AES-192") return new AES_192_Intel; if(request.algo_name() == "AES-256") return new AES_256_Intel; - */ } #endif #if defined(BOTAN_HAS_AES_VIA) - if(CPUID::has_via_aes()) + if(CPUID::has_aes_via()) { if(request.algo_name() == "AES-128") return new AES_128_VIA; diff --git a/src/filters/out_buf.cpp b/src/filters/out_buf.cpp index 6002f4fef..864598194 100644 --- a/src/filters/out_buf.cpp +++ b/src/filters/out_buf.cpp @@ -1,5 +1,5 @@ /* -* Pipe Output Buffer Source file +* Pipe Output Buffer * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license diff --git a/src/hash/md4_ia32/md4_ia32_imp.S b/src/hash/md4_ia32/md4_ia32_imp.S index ca04cbe4e..50f30d9b8 100644 --- a/src/hash/md4_ia32/md4_ia32_imp.S +++ b/src/hash/md4_ia32/md4_ia32_imp.S @@ -1,5 +1,5 @@ /* -* MD4 Source File +* MD4 in IA-32 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license diff --git a/src/hash/md5_ia32/md5_ia32_imp.S b/src/hash/md5_ia32/md5_ia32_imp.S index 8087bbdbc..bf85a26b6 100644 --- a/src/hash/md5_ia32/md5_ia32_imp.S +++ b/src/hash/md5_ia32/md5_ia32_imp.S @@ -1,5 +1,5 @@ /* -* MD5 Source File +* MD5 in IA-32 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license diff --git a/src/hash/sha1_amd64/sha1_amd64_imp.S b/src/hash/sha1_amd64/sha1_amd64_imp.S index ba4d4d5ef..e648453dc 100644 --- a/src/hash/sha1_amd64/sha1_amd64_imp.S +++ b/src/hash/sha1_amd64/sha1_amd64_imp.S @@ -1,5 +1,5 @@ /* -* SHA-160 Source File +* SHA-1 in x86-64 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license diff --git a/src/hash/sha1_ia32/sha1_ia32_imp.S b/src/hash/sha1_ia32/sha1_ia32_imp.S index e76b9fb76..3411313c3 100644 --- a/src/hash/sha1_ia32/sha1_ia32_imp.S +++ b/src/hash/sha1_ia32/sha1_ia32_imp.S @@ -1,5 +1,5 @@ /* -* SHA-160 Source File +* SHA-1 in IA-32 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license diff --git a/src/hash/sha1_sse2/sha1_sse2.cpp b/src/hash/sha1_sse2/sha1_sse2.cpp index fc6466dd0..9267689e7 100644 --- a/src/hash/sha1_sse2/sha1_sse2.cpp +++ b/src/hash/sha1_sse2/sha1_sse2.cpp @@ -4,8 +4,8 @@ * * Distributed under the terms of the Botan license * -* Based on public domain code by Dean Gaudet <[email protected]> -* Source - http://arctic.org/~dean/crypto/sha1.html +* Based on public domain code by Dean Gaudet +* (http://arctic.org/~dean/crypto/sha1.html) */ #include <botan/sha1_sse2.h> diff --git a/src/hash/sha2/sha2_32.cpp b/src/hash/sha2/sha2_32.cpp index 7068dd63f..91375df04 100644 --- a/src/hash/sha2/sha2_32.cpp +++ b/src/hash/sha2/sha2_32.cpp @@ -38,9 +38,9 @@ inline void F1(u32bit A, u32bit B, u32bit C, u32bit& D, u32bit E, u32bit F, u32bit G, u32bit& H, u32bit msg, u32bit magic) { - magic += rho(E, 6, 11, 25) + ((E & F) ^ (~E & G)) + msg; - D += magic + H; - H += magic + rho(A, 2, 13, 22) + ((A & B) ^ (A & C) ^ (B & C)); + H += magic + rho(E, 6, 11, 25) + ((E & F) ^ (~E & G)) + msg; + D += H; + H += rho(A, 2, 13, 22) + ((A & B) | ((A | B) & C)); } } diff --git a/src/math/bigint/monty_amd64/mp_monty.S b/src/math/bigint/monty_amd64/mp_monty.S index 22045c369..d5f97601d 100644 --- a/src/math/bigint/monty_amd64/mp_monty.S +++ b/src/math/bigint/monty_amd64/mp_monty.S @@ -1,5 +1,5 @@ /* -* Montgomery Reduction Source File +* Montgomery Reduction in x86-64 assembler * (C) 2008 Jack Lloyd * * Distributed under the terms of the Botan license diff --git a/src/math/bigint/mulop_ia32/mp_mulop.S b/src/math/bigint/mulop_ia32/mp_mulop.S index 716166fd9..988ef573c 100644 --- a/src/math/bigint/mulop_ia32/mp_mulop.S +++ b/src/math/bigint/mulop_ia32/mp_mulop.S @@ -1,5 +1,5 @@ /* -* Multiply/Add Algorithm Source File +* Multiply/Add Algorithm in IA-32 assembler * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license diff --git a/src/math/gfpmath/curve_gfp.h b/src/math/gfpmath/curve_gfp.h index 81cf6ce51..53bbc1f3c 100644 --- a/src/math/gfpmath/curve_gfp.h +++ b/src/math/gfpmath/curve_gfp.h @@ -1,13 +1,10 @@ -/****** - * Elliptic curves over GF(p) (header file) - * - * (C) 2007 Martin Doering - * Christoph Ludwig - * Falko Strenzke - ******/ +/* +* Elliptic curves over GF(p) +* +* (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke +* +* Distributed under the terms of the Botan license +*/ #ifndef BOTAN_GFP_CURVE_H__ #define BOTAN_GFP_CURVE_H__ @@ -20,8 +17,6 @@ namespace Botan { /** * This class represents an elliptic curve over GF(p) -* -* Distributed under the terms of the Botan license */ class BOTAN_DLL CurveGFp { @@ -112,11 +107,12 @@ class BOTAN_DLL CurveGFp }*/ /** - * Retrieve a shared pointer to the curves GFpModulus object for efficient storage - * and computation of montgomery multiplication related data members and functions. - * Warning: do not use this function unless you know in detail how the sharing of values - * in the various EC related objects works. - * Do NOT spread pointers to a GFpModulus over different threads! + * Retrieve a shared pointer to the curves GFpModulus object for + * efficient storage and computation of montgomery multiplication + * related data members and functions. Warning: do not use this + * function unless you know in detail how the sharing of values + * in the various EC related objects works. Do NOT spread + * pointers to a GFpModulus over different threads! * @result a shared pointer to a GFpModulus object */ inline std::tr1::shared_ptr<GFpModulus> const get_ptr_mod() const diff --git a/src/math/gfpmath/gfp_element.cpp b/src/math/gfpmath/gfp_element.cpp index 8ae9b3c3a..4b95e68ff 100644 --- a/src/math/gfpmath/gfp_element.cpp +++ b/src/math/gfpmath/gfp_element.cpp @@ -1,12 +1,7 @@ /* * Arithmetic for prime fields GF(p) * -* (C) 2007 Martin Doering -* Christoph Ludwig -* Falko Strenzke +* (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke * * Distributed under the terms of the Botan license */ @@ -24,7 +19,9 @@ namespace Botan { namespace { -void inner_montg_mult_sos(word result[], const word* a_bar, const word* b_bar, const word* n, const word* n_dash, u32bit s) +void inner_montg_mult_sos(word result[], + const word* a_bar, const word* b_bar, + const word* n, const word* n_dash, u32bit s) { SecureVector<word> t; t.grow_to(2*s+1); @@ -130,10 +127,8 @@ void montg_mult(BigInt& result, BigInt& a_bar, BigInt& b_bar, const BigInt& m, c } /** -*calculates R=b^n (here b=2) with R>m (and R beeing as small as possible) for an odd modulus m. -* no check for oddity is performed! -* -* Distributed under the terms of the Botan license +* Calculates R=b^n (here b=2) with R>m (and R beeing as small as +* possible) for an odd modulus m. No check for parity is performed! */ BigInt montgm_calc_r_oddmod(const BigInt& prime) { diff --git a/src/math/gfpmath/gfp_element.h b/src/math/gfpmath/gfp_element.h index 18d9e51f9..0fc4e0c7f 100644 --- a/src/math/gfpmath/gfp_element.h +++ b/src/math/gfpmath/gfp_element.h @@ -1,12 +1,7 @@ /* * Arithmetic for prime fields GF(p) * -* (C) 2007 Martin Doering -* Christoph Ludwig -* Falko Strenzke +* (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke * * Distributed under the terms of the Botan license */ diff --git a/src/math/gfpmath/gfp_modulus.h b/src/math/gfpmath/gfp_modulus.h index 8e37e9a73..4773a8b89 100644 --- a/src/math/gfpmath/gfp_modulus.h +++ b/src/math/gfpmath/gfp_modulus.h @@ -1,12 +1,7 @@ /* * Modulus and related data for a specific implementation of GF(p) * -* (C) 2008 Martin Döring -* <[email protected]> -* Christoph Ludwig -* <[email protected]> -* Falko Strenzke -* <[email protected]> +* (C) 2008 Martin Doering, Christoph Ludwig, Falko Strenzke * * Distributed under the terms of the Botan license */ diff --git a/src/pubkey/ecdsa/ecdsa.h b/src/pubkey/ecdsa/ecdsa.h index 379445777..a6a77f3e6 100644 --- a/src/pubkey/ecdsa/ecdsa.h +++ b/src/pubkey/ecdsa/ecdsa.h @@ -85,7 +85,7 @@ class BOTAN_DLL ECDSA_PublicKey : public virtual EC_PublicKey, protected: void X509_load_hook(); - virtual void set_all_values(const ECDSA_PublicKey& other); + void set_all_values(const ECDSA_PublicKey& other); ECDSA_Core m_ecdsa_core; }; @@ -134,9 +134,8 @@ class BOTAN_DLL ECDSA_PrivateKey : public ECDSA_PublicKey, */ virtual void affirm_init() const; - protected: - virtual void set_all_values(const ECDSA_PrivateKey& other); private: + void set_all_values(const ECDSA_PrivateKey& other); void PKCS8_load_hook(bool = false); }; diff --git a/src/pubkey/eckaeg/eckaeg.h b/src/pubkey/eckaeg/eckaeg.h index 31b65740c..7c4dfdb2d 100644 --- a/src/pubkey/eckaeg/eckaeg.h +++ b/src/pubkey/eckaeg/eckaeg.h @@ -68,9 +68,10 @@ class BOTAN_DLL ECKAEG_PublicKey : public virtual EC_PublicKey protected: void X509_load_hook(); - virtual void set_all_values(const ECKAEG_PublicKey& other); ECKAEG_Core m_eckaeg_core; + private: + void set_all_values(const ECKAEG_PublicKey& other); }; /** @@ -128,8 +129,8 @@ class BOTAN_DLL ECKAEG_PrivateKey : public ECKAEG_PublicKey, */ virtual void affirm_init() const; - protected: - virtual void set_all_values(const ECKAEG_PrivateKey& other); + private: + void set_all_values(const ECKAEG_PrivateKey& other); }; } diff --git a/src/tss/tss.cpp b/src/tss/tss.cpp index 3bd799727..0782a27d1 100644 --- a/src/tss/tss.cpp +++ b/src/tss/tss.cpp @@ -1,6 +1,6 @@ /* * RTSS (threshold secret sharing) -* (C) 2009 Jack Lloyd <[email protected]> +* (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ diff --git a/src/tss/tss.h b/src/tss/tss.h index 0b26bfdcb..6e623c193 100644 --- a/src/tss/tss.h +++ b/src/tss/tss.h @@ -1,6 +1,6 @@ /* * RTSS (threshold secret sharing) -* (C) 2009 Jack Lloyd <[email protected]> +* (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ diff --git a/src/utils/cpuid.h b/src/utils/cpuid.h index 8b8021754..455721af9 100644 --- a/src/utils/cpuid.h +++ b/src/utils/cpuid.h @@ -60,11 +60,20 @@ class CPUID { return ((x86_processor_flags() >> CPUID_SSE42_BIT) & 1); } /** - * Check if the processor supports Intel AES instructions + * Check if the processor supports Intel's AES instructions */ - static bool has_intel_aes() + static bool has_aes_intel() { return ((x86_processor_flags() >> CPUID_INTEL_AES_BIT) & 1); } + /** + * Check if the processor supports VIA's AES instructions + * (not implemented) + */ + static bool has_aes_via() { return false; } + + /** + * Check if the processor supports AltiVec/VMX + */ static bool has_altivec(); private: static u64bit x86_processor_flags(); diff --git a/src/utils/loadstor.h b/src/utils/loadstor.h index 489a789f4..b15cafd2c 100644 --- a/src/utils/loadstor.h +++ b/src/utils/loadstor.h @@ -13,6 +13,7 @@ #include <botan/bswap.h> #include <botan/rotate.h> #include <botan/prefetch.h> +#include <cstring> #if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK @@ -203,6 +204,9 @@ inline void load_le(T out[], const byte in[], u32bit count) { +#if defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) + std::memcpy(out, in, sizeof(T)*count); +#else const u32bit blocks = count - (count % 4); const u32bit left = count - blocks; @@ -219,6 +223,7 @@ inline void load_le(T out[], for(u32bit i = 0; i != left; ++i) out[i] = load_le<T>(in, i); +#endif } template<typename T> @@ -258,6 +263,9 @@ inline void load_be(T out[], const byte in[], u32bit count) { +#if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) + std::memcpy(out, in, sizeof(T)*count); +#else const u32bit blocks = count - (count % 4); const u32bit left = count - blocks; @@ -274,6 +282,7 @@ inline void load_be(T out[], for(u32bit i = 0; i != left; ++i) out[i] = load_be<T>(in, i); +#endif } /* diff --git a/src/utils/simd_32/simd_altivec.h b/src/utils/simd_32/simd_altivec.h index c6dd8a289..3e784a8c4 100644 --- a/src/utils/simd_32/simd_altivec.h +++ b/src/utils/simd_32/simd_altivec.h @@ -13,6 +13,7 @@ #include <altivec.h> #undef vector +#undef bool namespace Botan { |