aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--checks/validate.dat3301
-rw-r--r--checks/x509.cpp10
-rw-r--r--doc/examples/ca.cpp2
-rw-r--r--doc/examples/cpuid.cpp29
-rw-r--r--doc/examples/gen_certs.cpp6
-rw-r--r--doc/examples/pkcs10.cpp2
-rw-r--r--doc/examples/self_sig.cpp3
-rw-r--r--doc/log.txt3
-rw-r--r--doc/thanks.txt7
-rw-r--r--src/block/aes/aes.cpp399
-rw-r--r--src/block/aes/aes.h5
-rw-r--r--src/block/aes/aes_tab.cpp406
-rw-r--r--src/block/aes_intel/aes_intel.cpp630
-rw-r--r--src/block/aes_intel/aes_intel.h47
-rw-r--r--src/block/mars/mars.cpp341
-rw-r--r--src/block/mars/mars.h6
-rw-r--r--src/block/mars/mars_tab.cpp100
-rw-r--r--src/block/serpent_ia32/serp_ia32_imp.S2
-rw-r--r--src/block/skipjack/skipjack.cpp175
-rw-r--r--src/block/skipjack/skipjack.h6
-rw-r--r--src/block/square/square.cpp68
-rw-r--r--src/build-data/arch/amd64.txt4
-rw-r--r--src/build-data/arch/sparc64.txt10
-rw-r--r--src/build-data/cc/gcc.txt18
-rw-r--r--src/build-data/cc/icc.txt10
-rw-r--r--src/cert/cvc/cvc_ado.h1
-rw-r--r--src/cert/cvc/cvc_key.h1
-rw-r--r--src/cert/cvc/cvc_req.h1
-rw-r--r--src/cert/cvc/eac_obj.h1
-rw-r--r--src/cert/cvc/freestore.h9
-rw-r--r--src/cert/x509/x509_ca.cpp52
-rw-r--r--src/cert/x509/x509_ca.h44
-rw-r--r--src/cert/x509/x509self.cpp6
-rw-r--r--src/cert/x509/x509self.h4
-rw-r--r--src/engine/aes_isa_eng/aes_isa_engine.cpp6
-rw-r--r--src/filters/out_buf.cpp2
-rw-r--r--src/hash/md4_ia32/md4_ia32_imp.S2
-rw-r--r--src/hash/md5_ia32/md5_ia32_imp.S2
-rw-r--r--src/hash/sha1_amd64/sha1_amd64_imp.S2
-rw-r--r--src/hash/sha1_ia32/sha1_ia32_imp.S2
-rw-r--r--src/hash/sha1_sse2/sha1_sse2.cpp4
-rw-r--r--src/hash/sha2/sha2_32.cpp6
-rw-r--r--src/math/bigint/monty_amd64/mp_monty.S2
-rw-r--r--src/math/bigint/mulop_ia32/mp_mulop.S2
-rw-r--r--src/math/gfpmath/curve_gfp.h30
-rw-r--r--src/math/gfpmath/gfp_element.cpp17
-rw-r--r--src/math/gfpmath/gfp_element.h7
-rw-r--r--src/math/gfpmath/gfp_modulus.h7
-rw-r--r--src/pubkey/ecdsa/ecdsa.h5
-rw-r--r--src/pubkey/eckaeg/eckaeg.h7
-rw-r--r--src/tss/tss.cpp2
-rw-r--r--src/tss/tss.h2
-rw-r--r--src/utils/cpuid.h13
-rw-r--r--src/utils/loadstor.h9
-rw-r--r--src/utils/simd_32/simd_altivec.h1
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
-* Christoph Ludwig
-* Falko Strenzke
+* (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 {