aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Attic/mutex/info.txt2
-rw-r--r--Attic/mutex/noop_mutex/info.txt2
-rw-r--r--Attic/mutex/pthreads/info.txt2
-rw-r--r--Attic/mutex/qt_mutex/info.txt2
-rw-r--r--Attic/mutex/win32_crit_section/info.txt2
-rw-r--r--Attic/timer/cpu_counter/info.txt2
-rw-r--r--Attic/timer/gettimeofday/info.txt3
-rw-r--r--Attic/timer/info.txt2
-rw-r--r--Attic/timer/posix_rt/info.txt3
-rw-r--r--Attic/timer/win32_query_perf_ctr/info.txt3
-rw-r--r--checks/validate.dat1899
-rwxr-xr-xconfigure.py40
-rw-r--r--doc/examples/GNUmakefile4
-rw-r--r--doc/examples/cms_dec.cpp2
-rw-r--r--doc/examples/cpuid.cpp2
-rw-r--r--doc/examples/package.cpp2
-rw-r--r--doc/log.txt18
-rwxr-xr-xdoc/scripts/dist.sh18
-rw-r--r--readme.txt2
-rw-r--r--src/algo_factory/info.txt2
-rw-r--r--src/algo_factory/prov_weight.cpp2
-rw-r--r--src/alloc/alloc_mmap/info.txt2
-rw-r--r--src/alloc/info.txt2
-rw-r--r--src/alloc/mem_pool/info.txt2
-rw-r--r--src/alloc/mem_pool/mem_pool.cpp6
-rw-r--r--src/alloc/mem_pool/mem_pool.h6
-rw-r--r--src/alloc/system_alloc/info.txt2
-rw-r--r--src/aont/info.txt2
-rw-r--r--src/aont/package.cpp14
-rw-r--r--src/asn1/info.txt2
-rw-r--r--src/benchmark/benchmark.cpp2
-rw-r--r--src/benchmark/info.txt2
-rw-r--r--src/block/aes/aes.cpp2
-rw-r--r--src/block/aes/aes.h2
-rw-r--r--src/block/aes/info.txt2
-rw-r--r--src/block/block_cipher.h2
-rw-r--r--src/block/blowfish/blowfish.cpp2
-rw-r--r--src/block/blowfish/blowfish.h2
-rw-r--r--src/block/blowfish/info.txt2
-rw-r--r--src/block/cast/cast128.h2
-rw-r--r--src/block/cast/cast256.h2
-rw-r--r--src/block/cast/info.txt2
-rw-r--r--src/block/des/des.h4
-rw-r--r--src/block/des/desx.h2
-rw-r--r--src/block/des/info.txt2
-rw-r--r--src/block/gost_28147/gost_28147.h2
-rw-r--r--src/block/gost_28147/info.txt2
-rw-r--r--src/block/idea/idea.h2
-rw-r--r--src/block/idea/info.txt2
-rw-r--r--src/block/info.txt2
-rw-r--r--src/block/kasumi/info.txt2
-rw-r--r--src/block/kasumi/kasumi.h2
-rw-r--r--src/block/lion/info.txt2
-rw-r--r--src/block/lion/lion.cpp10
-rw-r--r--src/block/lion/lion.h2
-rw-r--r--src/block/lubyrack/info.txt2
-rw-r--r--src/block/lubyrack/lubyrack.cpp2
-rw-r--r--src/block/lubyrack/lubyrack.h2
-rw-r--r--src/block/mars/info.txt2
-rw-r--r--src/block/mars/mars.h2
-rw-r--r--src/block/misty1/info.txt2
-rw-r--r--src/block/misty1/misty1.h2
-rw-r--r--src/block/noekeon/info.txt2
-rw-r--r--src/block/noekeon/noekeon.cpp2
-rw-r--r--src/block/noekeon/noekeon.h2
-rw-r--r--src/block/rc2/info.txt2
-rw-r--r--src/block/rc2/rc2.h2
-rw-r--r--src/block/rc5/info.txt2
-rw-r--r--src/block/rc5/rc5.h2
-rw-r--r--src/block/rc6/info.txt2
-rw-r--r--src/block/rc6/rc6.h2
-rw-r--r--src/block/safer/info.txt2
-rw-r--r--src/block/safer/safer_sk.h2
-rw-r--r--src/block/seed/info.txt2
-rw-r--r--src/block/seed/seed.h2
-rw-r--r--src/block/serpent/info.txt2
-rw-r--r--src/block/serpent/serpent.h2
-rw-r--r--src/block/serpent_ia32/info.txt2
-rw-r--r--src/block/serpent_simd/info.txt7
-rw-r--r--src/block/serpent_simd/serp_simd.cpp (renamed from src/block/serpent_sse2/serp_sse2.cpp)154
-rw-r--r--src/block/serpent_simd/serp_simd.h (renamed from src/block/serpent_sse2/serp_sse2.h)10
-rw-r--r--src/block/serpent_simd/serp_simd_sbox.h426
-rw-r--r--src/block/serpent_sse2/info.txt8
-rw-r--r--src/block/serpent_sse2/serp_sse2_sbox.h434
-rw-r--r--src/block/skipjack/info.txt2
-rw-r--r--src/block/skipjack/skipjack.cpp2
-rw-r--r--src/block/skipjack/skipjack.h2
-rw-r--r--src/block/square/info.txt2
-rw-r--r--src/block/square/square.cpp2
-rw-r--r--src/block/square/square.h2
-rw-r--r--src/block/tea/info.txt2
-rw-r--r--src/block/tea/tea.h2
-rw-r--r--src/block/twofish/info.txt2
-rw-r--r--src/block/twofish/twofish.cpp2
-rw-r--r--src/block/twofish/twofish.h2
-rw-r--r--src/block/xtea/info.txt2
-rw-r--r--src/block/xtea/xtea.cpp62
-rw-r--r--src/block/xtea/xtea.h4
-rw-r--r--src/block/xtea_simd/info.txt14
-rw-r--r--src/block/xtea_simd/xtea_simd.cpp124
-rw-r--r--src/block/xtea_simd/xtea_simd.h28
-rw-r--r--src/build-data/arch/alpha.txt2
-rw-r--r--src/build-data/arch/amd64.txt2
-rw-r--r--src/build-data/arch/arm.txt2
-rw-r--r--src/build-data/arch/hitachi-sh.txt2
-rw-r--r--src/build-data/arch/hppa.txt2
-rw-r--r--src/build-data/arch/ia32.txt2
-rw-r--r--src/build-data/arch/ia64.txt2
-rw-r--r--src/build-data/arch/m68k.txt2
-rw-r--r--src/build-data/arch/mips32.txt2
-rw-r--r--src/build-data/arch/mips64.txt2
-rw-r--r--src/build-data/arch/ppc.txt2
-rw-r--r--src/build-data/arch/ppc64.txt6
-rw-r--r--src/build-data/arch/s390.txt2
-rw-r--r--src/build-data/arch/s390x.txt2
-rw-r--r--src/build-data/arch/sparc32.txt3
-rw-r--r--src/build-data/arch/sparc64.txt2
-rw-r--r--src/build-data/cc/bcc.txt2
-rw-r--r--src/build-data/cc/clang.txt44
-rw-r--r--src/build-data/cc/compaq.txt2
-rw-r--r--src/build-data/cc/ekopath.txt2
-rw-r--r--src/build-data/cc/gcc.txt2
-rw-r--r--src/build-data/cc/hpcc.txt2
-rw-r--r--src/build-data/cc/icc.txt2
-rw-r--r--src/build-data/cc/kai.txt2
-rw-r--r--src/build-data/cc/mipspro.txt2
-rw-r--r--src/build-data/cc/msvc.txt2
-rw-r--r--src/build-data/cc/open64.txt2
-rw-r--r--src/build-data/cc/pgi.txt2
-rw-r--r--src/build-data/cc/sgipro64.txt2
-rw-r--r--src/build-data/cc/sunwspro.txt2
-rw-r--r--src/build-data/cc/xlc.txt2
-rw-r--r--src/build-data/os/aix.txt2
-rw-r--r--src/build-data/os/beos.txt2
-rw-r--r--src/build-data/os/cygwin.txt2
-rw-r--r--src/build-data/os/darwin.txt2
-rw-r--r--src/build-data/os/dragonfly.txt2
-rw-r--r--src/build-data/os/freebsd.txt2
-rw-r--r--src/build-data/os/hpux.txt2
-rw-r--r--src/build-data/os/hurd.txt (renamed from src/build-data/os/hurd)2
-rw-r--r--src/build-data/os/irix.txt2
-rw-r--r--src/build-data/os/linux.txt2
-rw-r--r--src/build-data/os/mingw.txt1
-rw-r--r--src/build-data/os/netbsd.txt2
-rw-r--r--src/build-data/os/openbsd.txt2
-rw-r--r--src/build-data/os/qnx.txt2
-rw-r--r--src/build-data/os/solaris.txt2
-rw-r--r--src/build-data/os/tru64.txt2
-rw-r--r--src/build-data/os/windows.txt2
-rw-r--r--src/cert/cvc/info.txt2
-rw-r--r--src/cert/x509/info.txt2
-rw-r--r--src/checksum/adler32/adler32.h2
-rw-r--r--src/checksum/adler32/info.txt2
-rw-r--r--src/checksum/crc24/crc24.h2
-rw-r--r--src/checksum/crc24/info.txt2
-rw-r--r--src/checksum/crc32/crc32.h2
-rw-r--r--src/checksum/crc32/info.txt2
-rw-r--r--src/cms/info.txt2
-rw-r--r--src/codec/base64/info.txt2
-rw-r--r--src/codec/bzip2/info.txt1
-rw-r--r--src/codec/hex/hex.cpp8
-rw-r--r--src/codec/hex/info.txt2
-rw-r--r--src/codec/openpgp/info.txt2
-rw-r--r--src/codec/pem/info.txt2
-rw-r--r--src/codec/zlib/info.txt3
-rw-r--r--src/cryptobox/cryptobox.cpp7
-rw-r--r--src/cryptobox/info.txt2
-rw-r--r--src/engine/amd64_eng/info.txt2
-rw-r--r--src/engine/def_engine/def_mode.cpp8
-rw-r--r--src/engine/def_engine/info.txt2
-rw-r--r--src/engine/gnump/info.txt2
-rw-r--r--src/engine/ia32_eng/info.txt2
-rw-r--r--src/engine/info.txt2
-rw-r--r--src/engine/openssl/arc4_openssl.cpp2
-rw-r--r--src/engine/openssl/info.txt2
-rw-r--r--src/engine/openssl/ossl_bc.cpp4
-rw-r--r--src/engine/openssl/ossl_md.cpp4
-rw-r--r--src/engine/simd_engine/info.txt3
-rw-r--r--src/engine/simd_engine/simd_engine.cpp54
-rw-r--r--src/engine/simd_engine/simd_engine.h (renamed from src/engine/sse2_eng/eng_sse2.h)10
-rw-r--r--src/engine/sse2_eng/eng_sse2.cpp51
-rw-r--r--src/engine/sse2_eng/info.txt23
-rw-r--r--src/entropy/beos_stats/info.txt2
-rw-r--r--src/entropy/cryptoapi_rng/info.txt2
-rw-r--r--src/entropy/dev_random/info.txt2
-rw-r--r--src/entropy/egd/info.txt2
-rw-r--r--src/entropy/info.txt2
-rw-r--r--src/entropy/proc_walk/info.txt2
-rw-r--r--src/entropy/unix_procs/info.txt2
-rw-r--r--src/entropy/win32_stats/info.txt2
-rw-r--r--src/filters/algo_filt.cpp23
-rw-r--r--src/filters/fd_unix/info.txt2
-rw-r--r--src/filters/filters.h21
-rw-r--r--src/filters/info.txt2
-rw-r--r--src/hash/bmw/bmw_512.cpp5
-rw-r--r--src/hash/bmw/bmw_512.h2
-rw-r--r--src/hash/bmw/info.txt2
-rw-r--r--src/hash/fork256/fork256.cpp2
-rw-r--r--src/hash/fork256/fork256.h2
-rw-r--r--src/hash/fork256/info.txt2
-rw-r--r--src/hash/gost_3411/gost_3411.cpp2
-rw-r--r--src/hash/gost_3411/gost_3411.h2
-rw-r--r--src/hash/gost_3411/info.txt2
-rw-r--r--src/hash/has160/has160.cpp20
-rw-r--r--src/hash/has160/has160.h2
-rw-r--r--src/hash/has160/info.txt2
-rw-r--r--src/hash/hash.h2
-rw-r--r--src/hash/info.txt2
-rw-r--r--src/hash/md2/info.txt2
-rw-r--r--src/hash/md2/md2.cpp2
-rw-r--r--src/hash/md2/md2.h2
-rw-r--r--src/hash/md4/info.txt2
-rw-r--r--src/hash/md4/md4.cpp3
-rw-r--r--src/hash/md4/md4.h2
-rw-r--r--src/hash/md4_ia32/info.txt2
-rw-r--r--src/hash/md5/info.txt2
-rw-r--r--src/hash/md5/md5.cpp8
-rw-r--r--src/hash/md5/md5.h2
-rw-r--r--src/hash/md5_ia32/info.txt2
-rw-r--r--src/hash/mdx_hash/info.txt2
-rw-r--r--src/hash/mdx_hash/mdx_hash.cpp2
-rw-r--r--src/hash/mdx_hash/mdx_hash.h2
-rw-r--r--src/hash/par_hash/info.txt2
-rw-r--r--src/hash/par_hash/par_hash.cpp2
-rw-r--r--src/hash/par_hash/par_hash.h2
-rw-r--r--src/hash/rmd128/info.txt2
-rw-r--r--src/hash/rmd128/rmd128.cpp24
-rw-r--r--src/hash/rmd128/rmd128.h2
-rw-r--r--src/hash/rmd160/info.txt2
-rw-r--r--src/hash/rmd160/rmd160.cpp8
-rw-r--r--src/hash/rmd160/rmd160.h2
-rw-r--r--src/hash/sha1/info.txt2
-rw-r--r--src/hash/sha1/sha160.cpp93
-rw-r--r--src/hash/sha1/sha160.h2
-rw-r--r--src/hash/sha1_amd64/info.txt2
-rw-r--r--src/hash/sha1_ia32/info.txt2
-rw-r--r--src/hash/sha1_sse2/info.txt17
-rw-r--r--src/hash/sha1_sse2/sha1_sse2.cpp267
-rw-r--r--src/hash/sha1_sse2/sha1_sse2_imp.cpp304
-rw-r--r--src/hash/sha2/info.txt2
-rw-r--r--src/hash/sha2/sha2_32.cpp50
-rw-r--r--src/hash/sha2/sha2_32.h6
-rw-r--r--src/hash/sha2/sha2_64.cpp20
-rw-r--r--src/hash/sha2/sha2_64.h6
-rw-r--r--src/hash/skein/info.txt2
-rw-r--r--src/hash/skein/skein_512.cpp6
-rw-r--r--src/hash/skein/skein_512.h2
-rw-r--r--src/hash/tiger/info.txt2
-rw-r--r--src/hash/tiger/tiger.cpp8
-rw-r--r--src/hash/tiger/tiger.h2
-rw-r--r--src/hash/whirlpool/info.txt2
-rw-r--r--src/hash/whirlpool/whrlpool.cpp2
-rw-r--r--src/hash/whirlpool/whrlpool.h2
-rw-r--r--src/kdf/info.txt2
-rw-r--r--src/kdf/kdf.h10
-rw-r--r--src/kdf/kdf1/info.txt2
-rw-r--r--src/kdf/kdf2/info.txt2
-rw-r--r--src/kdf/mgf1/info.txt2
-rw-r--r--src/kdf/ssl_prf/info.txt2
-rw-r--r--src/kdf/tls_prf/info.txt2
-rw-r--r--src/kdf/x942_prf/info.txt2
-rw-r--r--src/libstate/info.txt2
-rw-r--r--src/libstate/libstate.cpp8
-rw-r--r--src/libstate/oid_lookup/info.txt2
-rw-r--r--src/mac/cbc_mac/cbc_mac.cpp2
-rw-r--r--src/mac/cbc_mac/cbc_mac.h2
-rw-r--r--src/mac/cbc_mac/info.txt2
-rw-r--r--src/mac/cmac/cmac.cpp2
-rw-r--r--src/mac/cmac/cmac.h2
-rw-r--r--src/mac/cmac/info.txt2
-rw-r--r--src/mac/hmac/hmac.cpp2
-rw-r--r--src/mac/hmac/hmac.h2
-rw-r--r--src/mac/hmac/info.txt2
-rw-r--r--src/mac/info.txt2
-rw-r--r--src/mac/mac.h2
-rw-r--r--src/mac/ssl3mac/info.txt2
-rw-r--r--src/mac/ssl3mac/ssl3_mac.cpp2
-rw-r--r--src/mac/ssl3mac/ssl3_mac.h2
-rw-r--r--src/mac/x919_mac/info.txt2
-rw-r--r--src/mac/x919_mac/x919_mac.cpp2
-rw-r--r--src/mac/x919_mac/x919_mac.h2
-rw-r--r--src/math/bigint/info.txt2
-rw-r--r--src/math/bigint/monty_amd64/info.txt2
-rw-r--r--src/math/bigint/monty_generic/info.txt2
-rw-r--r--src/math/bigint/mp_amd64/info.txt2
-rw-r--r--src/math/bigint/mp_amd64/mp_asmi.h8
-rw-r--r--src/math/bigint/mp_asm64/info.txt2
-rw-r--r--src/math/bigint/mp_generic/info.txt2
-rw-r--r--src/math/bigint/mp_ia32/info.txt2
-rw-r--r--src/math/bigint/mp_ia32/mp_asmi.h8
-rw-r--r--src/math/bigint/mp_ia32_msvc/info.txt2
-rw-r--r--src/math/bigint/mulop_amd64/info.txt2
-rw-r--r--src/math/bigint/mulop_generic/info.txt2
-rw-r--r--src/math/bigint/mulop_ia32/info.txt2
-rw-r--r--src/math/gfpmath/gfp_element.cpp4
-rw-r--r--src/math/gfpmath/info.txt2
-rw-r--r--src/math/numbertheory/info.txt2
-rw-r--r--src/modes/cbc/info.txt2
-rw-r--r--src/modes/cfb/info.txt3
-rw-r--r--src/modes/ctr/ctr.cpp146
-rw-r--r--src/modes/ctr/ctr.h46
-rw-r--r--src/modes/cts/info.txt2
-rw-r--r--src/modes/eax/info.txt2
-rw-r--r--src/modes/ecb/info.txt2
-rw-r--r--src/modes/info.txt2
-rw-r--r--src/modes/mode_pad/info.txt2
-rw-r--r--src/modes/ofb/ofb.cpp66
-rw-r--r--src/modes/ofb/ofb.h33
-rw-r--r--src/modes/xts/info.txt2
-rw-r--r--src/pbe/info.txt2
-rw-r--r--src/pbe/pbes1/info.txt2
-rw-r--r--src/pbe/pbes2/info.txt2
-rw-r--r--src/pk_pad/eme1/info.txt2
-rw-r--r--src/pk_pad/eme_pkcs/info.txt2
-rw-r--r--src/pk_pad/emsa.h2
-rw-r--r--src/pk_pad/emsa1/emsa1.cpp2
-rw-r--r--src/pk_pad/emsa1/emsa1.h2
-rw-r--r--src/pk_pad/emsa1/info.txt2
-rw-r--r--src/pk_pad/emsa1_bsi/info.txt2
-rw-r--r--src/pk_pad/emsa2/emsa2.cpp2
-rw-r--r--src/pk_pad/emsa2/emsa2.h2
-rw-r--r--src/pk_pad/emsa2/info.txt2
-rw-r--r--src/pk_pad/emsa3/emsa3.cpp4
-rw-r--r--src/pk_pad/emsa3/emsa3.h4
-rw-r--r--src/pk_pad/emsa3/info.txt2
-rw-r--r--src/pk_pad/emsa4/emsa4.cpp2
-rw-r--r--src/pk_pad/emsa4/emsa4.h2
-rw-r--r--src/pk_pad/emsa4/info.txt2
-rw-r--r--src/pk_pad/emsa_raw/emsa_raw.cpp2
-rw-r--r--src/pk_pad/emsa_raw/emsa_raw.h2
-rw-r--r--src/pk_pad/emsa_raw/info.txt2
-rw-r--r--src/pk_pad/hash_id/info.txt2
-rw-r--r--src/pk_pad/info.txt2
-rw-r--r--src/pubkey/dh/info.txt2
-rw-r--r--src/pubkey/dl_algo/info.txt2
-rw-r--r--src/pubkey/dl_group/info.txt2
-rw-r--r--src/pubkey/dlies/info.txt2
-rw-r--r--src/pubkey/dsa/info.txt2
-rw-r--r--src/pubkey/ec_dompar/info.txt2
-rw-r--r--src/pubkey/ecc_key/info.txt2
-rw-r--r--src/pubkey/ecdsa/info.txt2
-rw-r--r--src/pubkey/eckaeg/info.txt2
-rw-r--r--src/pubkey/elgamal/info.txt2
-rw-r--r--src/pubkey/if_algo/info.txt2
-rw-r--r--src/pubkey/info.txt2
-rw-r--r--src/pubkey/keypair/info.txt2
-rw-r--r--src/pubkey/nr/info.txt2
-rw-r--r--src/pubkey/pk_codecs/info.txt2
-rw-r--r--src/pubkey/rsa/info.txt2
-rw-r--r--src/pubkey/rw/info.txt2
-rw-r--r--src/rng/auto_rng/auto_rng.h2
-rw-r--r--src/rng/auto_rng/info.txt2
-rw-r--r--src/rng/hmac_rng/hmac_rng.cpp2
-rw-r--r--src/rng/hmac_rng/hmac_rng.h2
-rw-r--r--src/rng/hmac_rng/info.txt2
-rw-r--r--src/rng/info.txt2
-rw-r--r--src/rng/randpool/info.txt2
-rw-r--r--src/rng/randpool/randpool.cpp2
-rw-r--r--src/rng/randpool/randpool.h2
-rw-r--r--src/rng/rng.h4
-rw-r--r--src/rng/x931_rng/info.txt2
-rw-r--r--src/rng/x931_rng/x931_rng.cpp2
-rw-r--r--src/rng/x931_rng/x931_rng.h2
-rw-r--r--src/s2k/info.txt2
-rw-r--r--src/s2k/pbkdf1/info.txt2
-rw-r--r--src/s2k/pbkdf2/info.txt2
-rw-r--r--src/s2k/pgps2k/info.txt2
-rw-r--r--src/selftest/info.txt2
-rw-r--r--src/stream/arc4/arc4.cpp2
-rw-r--r--src/stream/arc4/arc4.h7
-rw-r--r--src/stream/arc4/info.txt2
-rw-r--r--src/stream/ctr/ctr.cpp141
-rw-r--r--src/stream/ctr/ctr.h49
-rw-r--r--src/stream/ctr/info.txt (renamed from src/modes/ctr/info.txt)8
-rw-r--r--src/stream/info.txt3
-rw-r--r--src/stream/ofb/info.txt (renamed from src/modes/ofb/info.txt)3
-rw-r--r--src/stream/ofb/ofb.cpp97
-rw-r--r--src/stream/ofb/ofb.h48
-rw-r--r--src/stream/salsa20/info.txt2
-rw-r--r--src/stream/salsa20/salsa20.cpp10
-rw-r--r--src/stream/salsa20/salsa20.h14
-rw-r--r--src/stream/stream_cipher.cpp30
-rw-r--r--src/stream/stream_cipher.h69
-rw-r--r--src/stream/turing/info.txt2
-rw-r--r--src/stream/turing/turing.cpp8
-rw-r--r--src/stream/turing/turing.h10
-rw-r--r--src/stream/wid_wake/info.txt2
-rw-r--r--src/stream/wid_wake/wid_wake.cpp11
-rw-r--r--src/stream/wid_wake/wid_wake.h12
-rw-r--r--src/sym_algo/info.txt2
-rw-r--r--src/sym_algo/sym_algo.h4
-rw-r--r--src/tss/info.txt2
-rw-r--r--src/utils/asm_amd64/info.txt2
-rw-r--r--src/utils/asm_ia32/info.txt2
-rw-r--r--src/utils/buf_comp/info.txt2
-rw-r--r--src/utils/cpuid.cpp82
-rw-r--r--src/utils/cpuid.h1
-rw-r--r--src/utils/datastor/info.txt2
-rw-r--r--src/utils/info.txt2
-rw-r--r--src/utils/loadstor.h170
-rw-r--r--src/utils/simd_32/info.txt16
-rw-r--r--src/utils/simd_32/simd_32.h32
-rw-r--r--src/utils/simd_32/simd_altivec.h202
-rw-r--r--src/utils/simd_32/simd_scalar.h202
-rw-r--r--src/utils/simd_32/simd_sse.h156
405 files changed, 4631 insertions, 2134 deletions
diff --git a/Attic/mutex/info.txt b/Attic/mutex/info.txt
index ff79bf753..0f2836b64 100644
--- a/Attic/mutex/info.txt
+++ b/Attic/mutex/info.txt
@@ -1,5 +1,3 @@
-realname "Mutex Wrappers"
-
define MUTEX_WRAPPERS
load_on auto
diff --git a/Attic/mutex/noop_mutex/info.txt b/Attic/mutex/noop_mutex/info.txt
index 1f49f5e1c..6025959c2 100644
--- a/Attic/mutex/noop_mutex/info.txt
+++ b/Attic/mutex/noop_mutex/info.txt
@@ -1,5 +1,3 @@
-realname "No-Op Mutex"
-
load_on auto
define MUTEX_NOOP
diff --git a/Attic/mutex/pthreads/info.txt b/Attic/mutex/pthreads/info.txt
index f135dea48..7315c186a 100644
--- a/Attic/mutex/pthreads/info.txt
+++ b/Attic/mutex/pthreads/info.txt
@@ -1,5 +1,3 @@
-realname "Pthread Mutex"
-
define MUTEX_PTHREAD
load_on auto
diff --git a/Attic/mutex/qt_mutex/info.txt b/Attic/mutex/qt_mutex/info.txt
index a21108c79..922c38ed1 100644
--- a/Attic/mutex/qt_mutex/info.txt
+++ b/Attic/mutex/qt_mutex/info.txt
@@ -1,5 +1,3 @@
-realname "Qt Mutex"
-
define MUTEX_QT
note "You'll probably have to add -I/-L flags to the Makefile to find Qt"
diff --git a/Attic/mutex/win32_crit_section/info.txt b/Attic/mutex/win32_crit_section/info.txt
index a2d339c3b..ffa8a98e3 100644
--- a/Attic/mutex/win32_crit_section/info.txt
+++ b/Attic/mutex/win32_crit_section/info.txt
@@ -1,5 +1,3 @@
-realname "Win32 Mutex"
-
define MUTEX_WIN32
modset win32
diff --git a/Attic/timer/cpu_counter/info.txt b/Attic/timer/cpu_counter/info.txt
index 025663a84..d95e0fec5 100644
--- a/Attic/timer/cpu_counter/info.txt
+++ b/Attic/timer/cpu_counter/info.txt
@@ -1,5 +1,3 @@
-realname "Hardware Timer"
-
define TIMER_HARDWARE
load_on asm_ok
diff --git a/Attic/timer/gettimeofday/info.txt b/Attic/timer/gettimeofday/info.txt
index a58e8088d..f8b65b4ba 100644
--- a/Attic/timer/gettimeofday/info.txt
+++ b/Attic/timer/gettimeofday/info.txt
@@ -1,5 +1,3 @@
-realname "Unix Timer"
-
define TIMER_UNIX
load_on auto
@@ -30,4 +28,3 @@ tru64
<requires>
timer
</requires>
-
diff --git a/Attic/timer/info.txt b/Attic/timer/info.txt
index 6408dca45..1dff5ab6f 100644
--- a/Attic/timer/info.txt
+++ b/Attic/timer/info.txt
@@ -1,5 +1,3 @@
-realname "Timer Base Class"
-
define TIMER
load_on auto
diff --git a/Attic/timer/posix_rt/info.txt b/Attic/timer/posix_rt/info.txt
index fa530ea1a..4b23a74fc 100644
--- a/Attic/timer/posix_rt/info.txt
+++ b/Attic/timer/posix_rt/info.txt
@@ -1,5 +1,3 @@
-realname "POSIX Timer"
-
define TIMER_POSIX
load_on auto
@@ -26,4 +24,3 @@ dragonfly
<requires>
timer
</requires>
-
diff --git a/Attic/timer/win32_query_perf_ctr/info.txt b/Attic/timer/win32_query_perf_ctr/info.txt
index 4bb1ddb34..d8611027a 100644
--- a/Attic/timer/win32_query_perf_ctr/info.txt
+++ b/Attic/timer/win32_query_perf_ctr/info.txt
@@ -1,5 +1,3 @@
-realname "Win32 Timer"
-
define TIMER_WIN32
modset win32
@@ -23,4 +21,3 @@ windows -> user32.lib
<requires>
timer
</requires>
-
diff --git a/checks/validate.dat b/checks/validate.dat
index de9db0b89..875177868 100644
--- a/checks/validate.dat
+++ b/checks/validate.dat
@@ -23655,6 +23655,13 @@ DC7E84BFDA79164B7ECD8486985D38604FEBDC6740D20B3AC88F6AD82A4FB08D\
5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE:\
2B7E151628AED2A6ABF7158809CF4F3C:F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF
+# Test with 15 byte IV (last byte implicit zero)
+AE2D8A571E03AC9C9EB76FAC45AF8E51\
+30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\
+9806F66B7970FDFF8617187BB9FFFDFF\
+5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE:\
+2B7E151628AED2A6ABF7158809CF4F3C:F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF
+
6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E51\
30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710:\
1ABC932417521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E94\
@@ -25437,6 +25444,1898 @@ A09120126443E8771F9700718BC94E5070DA8DAC17BB3F73555F3942AAC1C2830371D641\
BA516D7A4B7638995562CE54FEFC84B6DFB4B8A81A03F24BB065B060E4FA2966:\
23C93FBB6EF742A576769819A5BC6AC3
+[TEA/ECB/NoPadding]
+2FA6A6449FB4F998EFA3F1679A638602:\
+4D3953E121FFDB4FD7F05FC74FC2ADFC:\
+F9506AECFD6B86C4E9D5D973B435E66B
+
+B4C8B417381DFC14CD6CFEDC0D83477F27B0B1BD842922D4:\
+7608D8A9F2BFFC14DCA6942B2867239BE3B4788D8748F314:\
+47BF1198D16C123C95496D0CCC9A5C8C
+
+18DE3130F51CD7A6172B3C79F6DF435B41F57D3B2D54DF7A436ECCE32ADB88EC:\
+58AA062B7B9EFAEA2E3ED1F9D19FA6F695B0642EA7FB6EB5C5ED914A4034134D:\
+3D8D2CFB7424BBD7B39BD9BB2C0CD794
+
+64E00DCC29A3BE3695F2198E58EA42E323E99387CE99A0543F7594331E546EADD7163E62\
+5ED6B32E:\
+EA6EF6ECA267C02C2C98D03AED4402A85B8CC02326D1FFCF169D321F675C23BF530FD4E8\
+AF7A511C:\
+C1C1384840D2B15BF8751CBDFB2607CB
+
+CF70A73AD2C4714044C8953EA103DDD2848595C182BC6A703B2E6CB90E80357120AC671F\
+10C8060EB2A14451BD69C9F4:\
+FACC24C79AD55C3E2FDB55AD21F52595452E116FC526ED3F21C4386D0400F098F86D86C4\
+E630E638A24EFF839EB8AECE:\
+25EF77ACC4435B378B0A07AF35D7A283
+
+5AAADAFF6BF18700ECF66DCDB2AA201A1B5C338422E654A9E769C0EC40982E2FD9A794E2\
+9951C6EF26AA3FBF41B29E7457B6A2BA4E39F75F:\
+260629AC2B3838BADABD4765B0BB6A65D34927FC51BD712A36C8AD74AF386422FC479EB5\
+1C5FA2072B4D4A3F259A761C4CDAC375E0FB7883:\
+B3763F385F9F53A76F59E9E9B8070886
+
+10D5908E8AB77BBC4B6A2D89A13C899C9044E2823FCBA56FBE7312A7F475E16AB3B26E74\
+FA74390B5025C2399AC84EEA37326A6F8EF8D133A3E27EC6A01F97B1:\
+1421E0144AA1061EAA75F81B44E12A8DE1ADDCF46D4E29D636F17565AC1326B8B5E1F2EF\
+097E3BC22CA2FBB5B637E17BF164DAE5B8A0D503085EFDE1E36B82CE:\
+84A6AC5EDB9A96C8BA3BFF40AAD9ADFA
+
+C65601054E837A0BBC4D0A50CAC6CDCFD7EC9879316EEE2979F6FF139D881DBF7338DDAF\
+02F3700BBCD7ED67D605030187A588775A3604FFB20A989D6893FED3814179B336111DC4:\
+7F65DA6551B8C2A677054CBFA5BAC5B8CDFFE2593F3297B3C6014D8EE83B00DB0BF063C1\
+68A4C155705A7984BD961A0278BE247FAF01E3BDC6DF3EBA4D39A0566F59DBB3F1D682CA:\
+0B666EE6C0C5FDAAB1D3C528825B8262
+
+73ABA32AA3A6D791EDF7C1FEDBDE65950ACA8E7CDA9AA303DAA259965726F7E54EE8E07B\
+6EC41EE05DF08A8030AC76CD419CAC55249E5454427C9EC1607721A0A8DFF4200175B5EA\
+B66D6A33CB1ACC08:\
+39D91242429514DB8B2715FF7CB1D12AE97AA9B31286E672DCD6D5FBF9FDF52739F50684\
+F629F7F8F47F4840E399725DB5383C4427FD920D0091B8466ADCE80AA86E945AB09F9999\
+DE7518991229A9DC:\
+6CFBA581ADFD1DEFA555D4B1F2924E67
+
+A9956670B38BD99613696110B2717482945A798817EFCB34254271251C1D7912F966F78F\
+DD0D534BAABD440A80F75FF20C5D62C21327803FD957699302328B03F12F17A9D89CCE84\
+3227D99E3F223C2E1EB8541FA4DFFDC1:\
+27F0468A37ADD1F81E6C453DB2E89A741C4949D4994ED22D4473B40FE63642B0303933F7\
+4523055F9B2614DEB0A5E4BE8067C9EAE91C573C6508610FFC6CDE32DB8C3BBA9803F9FC\
+F1A1A3C8CDAD99F945FB9912BF38BF24:\
+35927642F001AF7BBA592C573D566B04
+
+2AE6CFDEFCAB3176BB1D7C9125F75011127F87F068846B5BB17C04457AA795CAF2459C7C\
+351CCF870CDE051432CF0019A5C411A45979A3E318523366138501A8C167A05B959B4DC7\
+C8735B9B15691262F2828A22093EE2BC15BAA5CC06426663:\
+46594307F5E0E998848072D2690D97E32058FB1D4577521FE5AF518C325762D9F076B15E\
+77E04DCEA1C8A2C34A287EFC5F9A301B5FB4C75699A3DFDF7DB8B7EBD61D5BB2C1F880EF\
+CCDDA930A8478C7DD946A7BF9EA906F6C6C930DF1BCDC51F:\
+C4A3785214040158D8D9037A9D5FD25C
+
+BC139112FA244D06DF5FFFAA2E44F58F29AE8B092395B9A67ABB435610674E4FF71027FC\
+E2C3EB95F7CAF7E05DE6C095551AE224A97807297F64C87247A34BECC6ABDC900259EFD4\
+048D384AF5481DE995C8ADE6FA7F982A702A44422EC022699B783E7EA57B7A2F:\
+57D854129FB358772683BB1BA42AF91F7E945F1BFF27AC4EBE6B531A581914E8BB57834F\
+D16A9E287544CD2840475155E49B9F6859D9E3D235D56CF5E7ECFD47D43FCF50A378287F\
+9F9A33AF0E53983456D75A58FF5111E69D768F25DAF721AA9C69FBE01F2430A1:\
+4A9F7BC01C835442B5F4EAECC8FF50B5
+
+51AB05548D117A49B3C47D2BDFD681A9FA39A1D270437AF03D5557BD5945C66D44842890\
+2152A2DEC23141E4366B55DA9A5FFF68C6C67CC2A7446EB28125986E945D6B7AE587EBAD\
+8EA14B066241B54A6485A9878837571346E7C416376908B74AEB4C5D022080BB79D0DA25\
+B837D53F:\
+BCF3B29D04DE30C8EB5345C444E3FEDC5D34EEAE60EA71BC355F21F69E31F759DED7AA43\
+6EC595505E1631A52F5416A41A529F39F6958499E99EA5DAAD023593A78DFE9C443C5AFF\
+B6E4D9EEC22BBD66545A67FB8F39799149A1601DA998694D7BD65AFF19AD1326F4B988F3\
+7E555D78:\
+A076529A62A7C604739522583E1EC20C
+
+EE99893A9B1087AC531F3C5C67902E6EE086A11F6D28B3A41A0A692A15EAD2E0A43A3432\
+AE88E9EB54944F4138BA95A4E52240B3CC34E1EA6B764AE2703696493F45467041578798\
+1CBB062910A3DA1D39ECFEE971EFD945B44A5FF4C4140B5893A89F6F454F9568D83AD429\
+272832258D3D0B82B7ECD00C:\
+641C64CD007BED6BA89AA7ABB2BA478717C84844D06D0F83251B8DCFB0AA02FE8991F06C\
+DF5328B4195B272807B242A0CD51D9C9CAFDBCA8773ED2048FA25360601197C1A8AAC3BC\
+AA05B087FF38F53072755C1AECB169CA4EDDECAE1B580433DA6CB30F4A7E33D02C6E3624\
+982853DC5A77BCE8E3E9217B:\
+7D9FC06731D5D44E7D137AFE5F7CB7AB
+
+E687266A896382127FCDF60A3F271BD3BD21C0306B8206FE9D9F2B00F4201418A4DACFA6\
+53DFD029639AAE03A6675D3E2B4ABA7E46CFBE14FED665E0F520F110BDCC4E5647BC3D82\
+723FFE0F588062E56DE991922E9F23FFBF2E1BE91625A190210654E0B2476664568B44EB\
+58117317C6B61645C6907ACCCCC4BE949C9D3ED2:\
+0058B2D35FDED2CBC91D454AA55F93B0A249152B3A5C9DFBE907E639CECF1B90580907A2\
+9920901AA5278EABF189DB980372C2A804B2B301F8262840D45A668564C634191E027F69\
+1630602423B9069279FFC20B181CEEB2CA6C15B5A66B9FDBBAE3B591FDEC91D41413AF30\
+36EF4A99E9E1B728E901405E5EACBAB539BD4796:\
+3652786521A31CD6A927E608CB2A87CB
+
+6A5A797BFCDB31CA65F7A0D720B679B5C7CBAD92508E93C565E3AC94DA5B84C041D2A0A9\
+7CE0D138C2D48E8F613C36F4C9A9ADA0A32EBD5E346A0A76078D2B49E559BDE592977285\
+77714F3EF016A607D3426297B4681CE7FFE958B5750F8DB6F88916C5DD61CA30DC2CD2A2\
+4742EA7AF3886C792E1D94ACD6DAD21649A8BFA6F907121166E51D97:\
+1DAFC103EF64B21BEA443931DD0111CB06D5BF42D1824C4E3F3A7D6718F2911756D94611\
+7A12CA4974F9BDE4A99012615D6D1B78B94349216FC73CFDF7BF91126F017A9206F78310\
+6E636AA89EA986A4F4942A8820FFF0D0B151E7A74397EA186AD85899DA5AF661566A3BCB\
+3C7305DCD5113F12E3532B803E0ABA376B232EC1328F3D0F1F884835:\
+FE97F4A2874358EEDDE14C5A1DBA9731
+
+A420F0855799B02E78C5A8087857A62E10F6448E3B02257AA678A7895EB9CBDED44D0ECA\
+ADD6ECB78F06CD65ECB8ED2183F62691FB42383E4062A5EA5078F146964F1DE275CC4493\
+04D319A4EF99A07C09B35F4C59E6AE9F8799C074C42BAE060E463A25078A61CBBD1818CE\
+C67CCB08BB4CEC9A4D3B146007C990AF9E723F858F7D63B81D4536243694AAC2F4C02CCA:\
+6AA3148AA2E4676C3ABBEA8B883560168F04843310B7871174C21F906E4049752617F465\
+DAA843BDAC395FED435C32CD2B497D2A58993282E1FC36113060AE36620AD606E0A32FD9\
+E143578188FD408D98C36F2A4134B10431BC20779195F5BD01F915987C40622D6D813CC4\
+8684D043AC74994B61F2CFEC89DA1A8A8C44FA82355508605324B20346B62CBF42649803:\
+5F5B428DB8D1FF5165F7C6691BF21794
+
+50A9163557E25C824A3DB605486E137772BFB26F3D60AF6431065B11DFFB65B5F46B4978\
+6612857935365BE801D978A860463351EB37A62BB66EE43E0B348BF509C3AB450334DDEB\
+1FB04F829311998D026F7A66FC6E06795F7268D0E4B71BCF674E42E9851AD830243EF28B\
+854A2CAA00541A5AF0A3E05EA7A4B445264204516A7B824CC8FEAABA992040939E2D13CB\
+832A821267928B88:\
+E905FBFB19EA75D647CAE71A3E4AD1FD1150101614109A06C4BEE3E8CE5E677FFFDE252D\
+BD7AD0B65E9A47683D10B32E5EA1DEC50746E8ABE6B562054F1F60AEDF267308583DD209\
+157ED0013F91C76A58740CC94D46584ABF2145D441C7721E5C41A7B33CBE13A09D05A569\
+C7C0E313232282FA72B2DDF8107930C6A697D9C87EE66DA240658EC5254A4F8E4A99425B\
+A77E6D36557FD32A:\
+93BFF08E9CC32466F4436111031037A9
+
+BD4BCFC5B25FAAE48AA8F4DB7FE80F14ED076F13DED25A3EF4784882F38838EEBB4757B9\
+BFB1344D422DC20D93EF2947B5D741BF945BC679BFAD074EEA9DFF9CCA6E49B6C40EEAFA\
+40733AFD8A21E26E19E9EBF66074C1102AD6234D129B589AC7AF71096C128FD94566E1C1\
+29D07E220FBE9D4DDA25BC71112D62AE335702CAFB7B46DFAAD51F6D7B4462A86400D030\
+CE96B577F0F8C43DB342E4C700C21F89:\
+1C2FB8256D92E620276C95006DF21ECD2C0DC26BF5752369C57745A27538200A5FBA2A08\
+B3DC4C6B7037035E96A7E4F97DF66B5FFF4D0AABB520A15D83FBA17CAA84641142044A75\
+F675637143F2ABDEA9631533877D3E77CA68B615A4EB9DFC4B0C27BB777604EC60950D45\
+31D4C6DA5412661D2CFF573DB93D4D428EC974904BDC6CE92B0F137188891DCAE497084F\
+D3DD3A9BF0991E7D954C473DD7075978:\
+07EB031C2A50E81BFD6150BB8E279F6A
+
+C12B1B0A8CCFE8BB72CA3C353F855F7F226DF0F1FFA791785506E972E19D153A92DEF0D0\
+82CAC0B4318E5C0C597638EC01204BCA002AE8BE1624AA4DDBC50759B8813F6533184181\
+395AE665962CD6BA22D82C1B4CD82CC4D2DFC07884C784398D596095B4ADF4A4CB5561E5\
+2C5DD85A2EC4642EF902A91FFD4FA73094D9A10D410743B82B24FE1149A5BFDAC8469D4C\
+74282581DB20BF4DB73321184B29E08D0A3BEB0A56D12AB6:\
+06F1F55E98C7B67858AAB0EAB9ED413B2E8D7BCFDD95FBDE16151A76E3E314022918B276\
+403782EEC2810FB10B8E6742287685675C67935217023EBE32994E1B1C7FFAF3C8E18EEC\
+CCBFA47DAE25377A1D38CFCF9FAF92AC99EFCA34FC70F04B03D1A2E8685B2CB2F513EA6A\
+49130BD8F220267DA4FB22E2FA02AC9B4F2FF554395BA7E0F85C378474E185DE7B04E01C\
+8929560B399D768267B352CA4BDA75FEA3B022B2790146E7:\
+0347E502FE1FB58BCE93EBB16AF1671B
+
+7BCCB586FE4F343EB7DE9210AAF5A5F81E62CBA5ACCCD897ED221CDA61E2D4F177A25002\
+F5E12AE2AFA0B19113485EE793F3C85FF14D7BC94B23AF502ED0118E78192CB4FD680676\
+194A99157E9349353E907ED93A869A1A9BE721ECC94619E26F120A87C1E227589901C161\
+7328D76F6B1555693ABD6F847ADFAB14CC936D3DA4F8F47BC5B77E323F23BD4DD2488222\
+45213A03CE770FB50D40E174606D3318BE3F76FB07473ED7034314E16567098D:\
+B42FBD0AEC444319719ED521AF7CC522A2F1DD69ACB6C6FC08EF1AD52415DDAA4E94FDE1\
+A21BDF954DBD56681E2E3D89C6725E716414043C42B0CC842B6A326CD70770881E047D59\
+B611B6595FAE0385111BA18CB19359AA7FD318B528D48348EB51655AE17B6DF79DF383FF\
+2F3AD856BA42598DC2D94921B4A93E87BD12490DE43C454B30F4093B30878B5BDA7D6711\
+F68DCFBA6AD0AC92804E15B6DC141A0D06CB962244700554B0BA4D399BB9D935:\
+5922D69B966C705B91F8DDB19DFD15C5
+
+7D578CFBB35A1026C7AE1B82405B5F93366BF2280C6E6FB42EC515374AA2294534B1ECB6\
+7CBC925E375D4F6B2E1451CA1BA569D494FD5C0FCE09F9637C83276AE3E1249815445D60\
+E47CA8DD9EC7B846449C73F1648640299EFA82C2E696A0F9CA9738DFA459F8AE04E3431B\
+B702D4F6D41526DF1543016A8E0FB1DE5E5258FAC9DF77CFC07CB297BA2A2921EFDBB0BE\
+4F355197409CEB98BBB08BD24F48748142321E66C9791E93E8156D3FEDF7B3CABC0C4014\
+8A866D28:\
+50E48B13EDB839D430DB28787D20DDD4C070730ACF59E9B235F101557E88905B2B8766F1\
+9421718D82EBFB7FD8075D1239DB19BE2151782075A761A7A1B78B1613D95340083BFE44\
+9B502D5744512CAF2C33ACDE1F1B18CB53B152AFF2078319399858A3356DD710A1D181A6\
+EAD0EB9C1ECA868CBCE049503E372BF3B9364B275A6D68D92F2DA3396FC045A816C2E9FF\
+E3797538483CBC25A97DD93E7CC997CF7469E66FEF432B9F3C5F2ADFC55235710EADD2E8\
+FCA5AFF8:\
+E5C7B48ADB3AB291EFE88CEBFDC612D9
+
+FF2E2C4B8BF3223B6513D612666415DA018A608BEFBCE8141F40EABE933BE55782E1355B\
+5D87FD7A31374EDA7BEECD24CB798A458ACC60ED063322CBCDD796546C0D09AFC04042A3\
+48E30D83309DA1EDFC0D631F1D1264D02812AB2F1ACA5E71076FA681BEEBC71C0104CD63\
+807C1B1C5FA543A2F30D903FCA91B6E946923FD57E1F1396B33E4C44F057693AA8413917\
+002C185FE0E54C2E0FB478B324E7237C6F4A5B439C2B52E1AA4A190263F5B6941244919F\
+AA826358C3F5055A1F67AB4B:\
+44FC4977E72F10AD62AD3E3FC7D868FBB09C4B7CCAC299E9E299B3FD5DF116C837B5D985\
+7AF8F83E97699F021F673679296444F96EC481F2C71DEA77E571DDFC49D9E453235A9BC9\
+3DC7CF60B209F305A2420830777D4B3732ADAED70B55406C777EA7CBC71EE2E58F89FC1D\
+4A1AD84A80B8F57C958D887383EEC107D5EA2E8297D75D588B24C8E42C2AB11FB21322E9\
+97B11DCB9AD7C825638BCC25A04E7D9311F24638418095D28259C74E718123CE597D2204\
+1CCAAC3612D803335DB4E21B:\
+A830EC3F2B6EB4C27215F68C373D51CB
+
+796E00B9B9C314F46A6FC4D30E251CBC99C0A7EC1012D4C08B3C709F8C42A0A24B52AA86\
+A8B4EE6C0B40B9AA749751222CE2E40E97467F8E49498D3EE24BCA8C3F6271AAD7AC9F69\
+F56B6F911B8840AC28B10DD63EAB8249A85747F5B97CF2BD18CD163BAF26D57C8E5454F1\
+62BA6D9758151F53D3F45733C3464836491C28963962FEBC6985DD4BAD90418C5CC02758\
+F59E001179888D5C56310EF3BD19660C98B40F39618C12DB9DF20A1144E4D88F5849F2A6\
+19903B91A4F88EA8CB0448B2D02ED413C71619EE:\
+35D5A3EBBD297958E923D81114240262166A0E6BFC0C42EFA099C488005ED84257FB7432\
+4568308109E76AC28EC059E7F8E612C2F8639C4510F996D311581D898E13DF6031385A62\
+0C5ECE9FD0745C7E7BB28323A16186065AE236482CFC37F227C99B6EA79FDB095D2E13A0\
+0CEDF8D91648CBBCFE9A72423485899CFBFDBC2CA6AB2CFEFBEFB38522EF1CF2D07AC68F\
+29819E17E202AB863F0878713F1CE248349E4139DC8107328D9907FC8F4987FC0392B120\
+F06DB28B7767AABC735535BB9FE18178B5BB34CE:\
+201C9CFDE22F6BE8FC881A4BE6862199
+
+85BD2383419FFC58425316A0B1D0EE6DB75CEF29BCB06C55D961F1880C930C4536BBD490\
+2DC33C528957409269CBF90C28468F4260225B30C1A11611F524B4FC28FCC6B1BA85064A\
+CD5AB63686E8DA93A938081F14FF0D7BB4FCDB12B68F9A2821B397A6FEF87511FF67B8FB\
+C20D4338A00B7AFBBBFC73CB832346030920A463617A8E046E5B9BDEE2950DB7BA80BBDF\
+04230094F8357062AC03E277AA68D14AEEF8DC810F7BE6C51FB8866CC9FD24BEDE265184\
+EF7EE936EA79B68C9ACD37EFB131F2647FC501826A4F4CC5D16D4666:\
+AD7D51359CF9E854759CB435669B098EA48DD89DCDF882E2781170086EB679D6C45AC3A0\
+4583FE8BEA6A315CB59541E3753F800BFB186E9177A8E299A9F55E1D034BF8CC876C2F46\
+3D1273E320FB6B35FBE5E6DE0C3C205B6FC0EFB2A0FDED8C606E0422B0C8D72222318BF9\
+B1A3D7A0B527253BEC8C9F66115655CE3175828B6659352BBC461ADFA2133808D872BC1C\
+DC597A2EEDC72A1D2E2644275C60144F6C7EC00C43B6BFE2E4433A6F42A4CD2073528174\
+C466AA9EE0AB24429726029FF1834254B7A839A0D8D4643C131C1BB7:\
+271A2BFE528BCBE7A13214409BAA2E12
+
+89DCAACBE537D9028953B0BDD28FCFD1E745D6D457F48F9247F51A8F6E9719D85F106E8F\
+794C6CA57247966AD2F878421C35528E95CB5813413B6E8AAD530AB09168A012D0027068\
+D63ECF4D7D4783BCE8014D34852F5A52C66461E15C965B8750087C43176E70E24FD0D4FA\
+83D4B9166C6311E328E08BEDAB29DBF554AE268476E507D7791AB3475DFE90CA3F3A3B64\
+07BF67E4BFAA67292E3ABAF6967C5450E17C2CD3C096C501B0180BA891EA951E99FA418A\
+CB72BE2FCB74FF143BABE55264F6B1BCCA83B81856544B843FF59D9668BDCD7EFC2F1F0A:\
+91B44C174E57C20AFD631C5B21B329A8B438C3249B5E0A4587BB01EB3C3770BDF67C16B2\
+4DE0DE2D61A1ECF3E00094BF562A21B6E2B9DD904CED2FBBA18A18A4228B958EDB1C3FF5\
+5BDE7D544DDDE97C67C1EA5E1FA4F0B0FBD2775B93AA02F4E6E19A43ACC14D022CDA7DED\
+E8B2915D8D4D0EDAB2718E56B25A6AA3C79B63E5DC03D57F948CE7D78A15FE3C0C781B83\
+B5B116816D55D660F0B6ADDE327231069DE6015C622E456AD01DC1EBF527D05627AD3BF5\
+A09EBCAF9392BAD189B511F6E429C1052E05FDAA558CB8D720F5B08AF5C2B7E1D811DB11:\
+8588AF13229A77FB1006467AF02D6AF7
+
+A3647B24A430D05146C564F62665B74242A393B47ADBF341DD56BB1855C0DEB052A6AD5F\
+4661A45F5107EF138BF5FBCF03F2DF6CA6FBDCE61D91CC9327D476B7D96061A4EFE06D77\
+A608A78A716541A4C1B4A9D99B473295D293F37F6F3E982CC8687B67ECD9C8B999FFE97F\
+1F28F23531F600D2D91865BD7144186A53B823887FBC4E5B25A6F233386393E40D9FABF5\
+B4119E83CB614CD4D302D999AE00E85F78F22687BDC1420784374B87CC7EB772BC468B01\
+AD895259E94FE55159FB5F6EC7FB5B7B1CACCD09884327F174A60C38DB31D6A8B8925D75\
+309D2D2850FE4E8F:\
+5ED0A794F77048023665D3B9FCF108C2794D98C4472136EC491F2EEFE3A2ACB89DC6A006\
+7DCF449AF304E0A43ACD79EF1C8118DCE1A73DEAB3CA002390E2DE166F24883619491723\
+AAE01FDCC31FCAB8996779604A36F22B1C8E418054BA9164D74CA8ABFD0C39E31A0FE97B\
+C4796802957CBCDA7ABC8AAF298C007F401B56EA023D26720B5DC3C9843CA604AA6F820C\
+EFFF2A38681A2B18DD37450CB853F5A5612C3F7083C78DE65CDBAAB5983337672AC050AC\
+CC013E6DF3EE7AAE6EBD91D328FEC89407668B5BBB40A94135E071A9E20D0420D24A9E71\
+9D0FC72A3136217B:\
+BFFD749F285E2BF09E6E1CF31F485D27
+
+5A52582DAA9B17977B476F718A030152C8F4A9C8BFAC2CE9A3A78935B4B9D7DCBCE4237A\
+C8B51464E33568F6ED94CF29A2BD367D38D059116C57EC69BEEDD67858E9C06420C082C0\
+D4C18FAE8B617EFE427DE7BC07BA2BE9BC9FDD9CD15232FD9A9B8B3B9B9BDD2F801B69AC\
+5EFDA6FB9E2204FEEBC4FBEE4432407894C17DB0B8E0BBEAB451B15A3AEAD171B937E845\
+1664C3A80E9E28F8F4CFCD2F28C1B116CA3CC2775632BBB14832C36FC70073E6FF462B82\
+6F3EB092504BE6A14E78AA2E32148B2E63BB8EE4B2D7BED5E8E2E8F025852F03A65DA77D\
+3F9C6BB6B373C90F6B0D2CB5C2C1AC0A:\
+88FCDB413A956FDF038C69A5842363FC82F9D3BDF80D5574DC0C6867F7EE21EA4CF72DEC\
+9AD83D5F19F9A71B71A71EE76645A153047825B5FCE892CEFABE49F6B0D768951B2F03EC\
+A4EC7200141895AA87EBF85CC33AF12EBF0189DAE5F6218F4E485873E994BCEC2E007AB9\
+77BD2C8C77792F2DAC0F29B8F8161B2CA99C4E81DC9DA37FEA73E707200697647AB6C73E\
+0DD1D837D329801A7B5F56CB137A1C23F5FA66213E720156C9AB67398300DE5F979BF4E1\
+DB8C8DF0E927EAD3DD7F44302DC9B39AFDB4F287672114288E24BAB76CA10200DB56A428\
+A671CB66EB2E4FE80630B94152B06158:\
+C0DE2ED5FE62A1B2973360E18660DFB5
+
+BC0990F88218EDE0DE9835353BCF340C5463CFA55FC4551DE21ABFE260A8173591D44A82\
+DCC62CA063F395396040F4B09E4CE63BFBC1C1F725FBCEC1A129124B111A9D393D53AE65\
+330569846DA3FD18A682B192773A76649BFA999859B9EC844C6B4496981FA13F8F7F0575\
+30879998BDBF8D3ACF090D5CF543ABA1E9DBB72B6A48B85794BF212BF5956DFCA7714BC2\
+38E5BC3E785916DF9D27A0FB4A0A391314B072EECEACF50DC8693D5777C45E932F5C0314\
+A882ED43AFF657935AFCA0B3FBCF97ADB513C754BD0EC82482DAAA8497D26A9E7F4320AA\
+382903AEEBC83B53CC297364446664424ED246037F063BDE:\
+41E85AED70C8464E353FC6E2D5975E0FAF5DB17A8573C7DDE4BBE0E29EB71CDEB210B794\
+D0FDFBF7ED7254B1EABEBD8CE203225CC4C2EBFF3B5D5BC51E3010F9946289BA3BBDBE4B\
+E7C3FEFE7E7A390B628E29798E732382B482D84D7863CB0A85F6F3CE1072CAB120960D05\
+FAE3510D36C9718DB4CB4750565C8745A076A7BE89F52A16DDE9D32A42CD635340F9ED1A\
+A39132E30DBDE32FB28354C1DBE9BBF817481903BD6EA8CA4805D03B42F2D5000B43475F\
+CC4103717BA2BEC3E2F1542BF308EDA7E2C71956F32F50680415685E8106E701E3F5303D\
+79F03214097A4874CFC0664BE4815BAE2769BA2CE11FD663:\
+C37E924EFECE82E275AA6115E2E2EEB7
+
+C34B10E6DD28BEBD7DE1BCA43D8AAFC65917C51E848703C034284FAFDB04DB3FFC0F3059\
+9C923C6BDCF006B47786E1EC68B9D9BDE22D39294CA235E43CFD42DFDFD3D4C49FD778A4\
+F61F17198851FE3923CA6DCBC8A6215E2CD8F24E110DCBA58A63058CF169A4CA4A8EA557\
+8030CCB2EB03C95871AEDDF6A090FADF44F8D43D7FD36987F31E0409A7615687C1D3FC0F\
+25796973E96A4DE0382D0965824E9A81677D414EE29EEAE3547BCE77BF9F6D3E6ED1526C\
+F1F51130D7DF5B6B34E89EEC7D8866486E02D5E654C920BC42DA3DF7F08EAA0681F13504\
+62B29792166D951CE94E5125FACF103D591C0E819667E42082FDFB7763C8C559:\
+C2CAE1A03A0B7D37D3FB79D98E425DAFDBAA0E2BBCDBD0366690C05D495014915ACEBD34\
+D320614752D0D667BABFEB9E3D5EBF5C1501EAD8D3C9602E6D33843C18F2868E237DB697\
+6536FE28B02233BAF37E9EC308A4E163ABCD4BA5422F92F5AECC38818371FFFF5AF0FC66\
+CE57DE4E0692B1BD82AAF95CDA6FF3C3C2F85CE16C54C151E32F146FC20AEDD4985E13F6\
+8C2E2224C49226545A32EC6C47974D2778184FBE289B14DCB78CE6DE17377557B92AC2DD\
+3C1102B74B2B04EC74BDAF85D2FC8F659F4F067F6C3679709A8F2BDC2429BB7F78F5173E\
+B3026156F2EA8FC510D5AA4482E1F5639F5514EEA3B5E979A0E54324954D47C7:\
+FCE0F56F8DAE31186336ADE3B46D6FF5
+
+2112DE278B42F0E058EBE6BF868F544F740F0AB25C30459B6F198F74E8CB4E8B677F59E9\
+15CFAE5C208770C3AE03AE597D5B41C97AC6497F67837C20B5D2AC3F01FA5E831C8F240D\
+8115279D81E315060A77B5971506D7DCA40939A81E377015BD6BAE084861A9044271D2CC\
+66EAC30473931B26B5ADBB14471B32591D405B2D7C9F30A1B0280D21D5EF49A1D24F0E80\
+783D31E2A156CCA3F12C7EED45E471BA42635A04057D3BE56E31936E0BEF6E705FAE0E46\
+DAB18F9AFF3582935BDE554F650B21DF6DA8BD4C5CD75A58BC9FE50C03FA3217CE60DB9F\
+AC52A4BABAB8223A05549532ED8386F6D621E2CB97B829C0FE9886DC67CDDA9E3A0D19E8\
+70DC8E09:\
+67315AF4A1B112817E9922FB3FC8D251CE6BB7CC1CBFBFED1927A172D14B0C1D20A9E382\
+833306A08A3222FF0E11F19FDAD5FDF44911E46FFE688D0226B096BB227A0777B2C5F971\
+01A386D65CE4E71CA590BA8DF68DE85D50511FE1CC08F6F569B9D3F47D37A93BA28B301A\
+72D9AA736B464343DEC323207FFCE6AE59CF22916531B6EB6E92E5674C226E06FFF18F5E\
+9306835957E93EBAD84711E4B059A19F554E3CB0F08ED7AD6EA58730BE7BA5572BECC892\
+28FF83BC11F3036EBD8BFE370C7D74ED1FA03530E86DE89638CC7A1E79EB121F7DF32EF1\
+64AA1D0570FA6191FD88F7D09C1CFF5C55F3C62618017879DBBE422C6BD51BB320F7B5FC\
+00276019:\
+A0C7A1DD857747698B49D1E6127F564E
+
+[TEA/CTR-BE]
+0779B5A4D94C4B572257340F8F86FBDC5AE955DB72E588CB3D8298FE27ADC668:\
+6D787EAE01A5D7946C8526B75BAAF2A8D1F13CE4AF93E469A21B7C53965A1CE1:\
+F580309FD46FC90ABA15E05AD82078A4:AF4D336BEB213C0F
+
+6DC828712ECC5C470541DF1602B85F4007CF93FC070CC7762D7956B7BB549B6372DBC08B:\
+09DAE7B36CB22B70FD79C64244E6E45987B5F7EFC8CB0B8E3CA9F43764807BE1027B7BB9:\
+C86E8F484AEB12370C20A3A0EE5590BC:13DCCD64DDBC8E41
+
+5B65BD1306636A3AD2E0022E02E85269F20F76F45B136EFDF4C899F8C9656129B4CA8046\
+2AE80783:\
+E89A69E8F2D8150C05B56F2A4A944857B645B16280612F58FB89B08EE8A20EBE11C862D3\
+9A1A59A1:\
+4C55B486E92B56E40276A86483AEE6B9:3967D01A6CA67F89
+
+311BD2A8AA6E97C4E84A3C322A53181D72A6C189C7B1FE6DB283BE9EC3193EA91521C1CE\
+DE7304F0DE4995EF:\
+10C9482E1BC5FC5F3E0204D721A9840ED5921483104A783D46B376E9B74BCAD25C5C4632\
+F523CA72CC6733F6:\
+2803FC9BAF7D0373B2D479046AAAEDD9:B91B7AD2875C1EE4
+
+55243E865867E2281B3DBF43521D984804AD038D8A4D113DD1E118358EF1366AA82854D8\
+7DEC5C8051C9915F685F55AF:\
+02BEBB951E42063A106A0797227CD7CD037BDF9FCF2DB5405645B1CE17C0D6C36A361109\
+7B9D74599AA5614E90BA6046:\
+B45B330DC5589E6AFFE1A11C09C4DC30:04F4F13187E04998
+
+37B0677F9DDBD8DB1496F75439862C17100C2BC735087B9A0970DA487DFEB9520B2C5B22\
+EC089777A710FC7C5EF5B7AD83199993:\
+E8DF3BF04F4EB8209BA30532885CB16F4DC4CFCC9DAA5D195A8F92BCD9B41ADE5B7EAB7B\
+1BCEFED039E3A3F8810C2B34A3E3AB24:\
+9344248E661DDF45BCB9B6E529B39431:3444DD3711244051
+
+DB572CD1DDEBF0C06AE910471B108064A73851F460F3F79A303E463230162B99452DBC0B\
+0BE88A17765D4E317B04BAC5693A5B2E5A1AFFE8:\
+19D1415407B422F155D1E8EF9C99F2C77F68B39516D4CCD3AD020A4B01A64244FC0E3012\
+A19FEDACCDD64D948372A2D8FD2F7B7BBDBA8CD6:\
+215C4753906EE909902B163EF367BEE5:A9C40171E5946170
+
+98E56143F834948EC76D2D3651787E8B6D1959FBAA1E4A8A8917091E626D3A7FCAE23E59\
+726A9B7E6808CD6245ADAD71EC52EE49F8B6983AF90165DD:\
+A2F29D9B387237DE529BBF8FA26704D4246C68F0C71FB986A735BEFEB239DF8220B3EE66\
+F0C8BD4B764BD4C8DA951BF3F0589315F5AE3E7F172F3F17:\
+63689A7EA77EE56313EDCD9092EE74A6:4FC29C5D1A03780E
+
+05796CA4B977B4D81B3F898ADB404805F6418425C6FA44C77ED6CF8B3A5C6A4D4692A3E8\
+A1D0AA88429C73DC0931BEE46EBDF759E16C975D8528EBE66092C686:\
+B8AB041041D2E9E48909A193956F9CA68D6ADADA5C2EB9A6F6795BDB751E704B2F9F3E6B\
+5531F2A2449C7C710367B4BF7F0EB293FEAC04D3C387B5C3D4F1F2FE:\
+F6DB0F1401BF9E04BC31F0E5AAE3B6AA:FF0415F250ACEF92
+
+5456E7301B77AF7E4E571D7A542B4DA79A6C3E198E29B973DD482CE44EDAD6C8BA2A7C6C\
+044B9187C0920BF626E55E844C8746F8FA3748DA84A49D2393AB68294304CEA2:\
+86927873D7469420C6E817A1A9382FC03BA4DFECEEC08400E3B0995F1C695D2599B3612D\
+DE5017E0B2422F233C86859CBA4A038D2F9E1DD886720ED63365A9184B1EDAAB:\
+CC5B8B7E1D9877A5845D9F2C4070061F:EF786B15E7F3F602
+
+E7CE6B54133D74C1D1F6370AA96F6993354E1BA145221B91B689B5A759F808D7861A7384\
+BAD3A192FDA08A36E9287B20188DF4131BC2D47457FCD3705C0D510A565A6E7D8EF7B22A:\
+3F1DA63F3BC4BF2691FD10D71CDFEF4FEB29F9E3C918C432AA7A7BC8F804E693B0A25F2F\
+935F9F9A8009959A118884E626F23FBA1C624CF719951940690C890AA05E8C87E55E3098:\
+899D47EFFEEB386DE8342FE3A3242FEA:CE412E40677E5BF0
+
+F2369B2BEEB9FB44CA09D59D3C9A22E107E960CA7588066E9B95EE6926DAD5E91ADC1320\
+6AFEFDBE39DB95BDD77655C132FB108F4721EDF687CEE1258CF5C43D60F8EC31D5A26B02\
+2B925EB2:\
+EABC0FE834E386A647EBCACC5FE48308E475C5DBB7D18F404A83F50FC2F93CE75E4591C0\
+334479B0A9920CC3D9389CFDA9E2D532B1C491B0F1F3057C797AEDBAE51CCEDF72023556\
+D98868B2:\
+08C7C0A9B04684B49554E83499D2F277:7D16029BCE205DD1
+
+2A101F89BCCEE248AAAF5EB65D9AA97240B9644FFA73305AEE2498A085262573D23783BC\
+442D6C296F126017403421AA5AC8E4AEE44E020DA81BF52DF9D0652E42F2768F1428C43D\
+D25E63E2B2FD7344:\
+E70DC7AC1E4A4E1461F6DC51F64B0C236F3BE15D5AAFFECFC1D094A4D69063E14EB4059C\
+D14481A26FF7DBC6BA07059856C2C764338B07E1C961FA56275AA450929BF62399B42362\
+9565E3E7C1DEB293:\
+9D923AB332BA365F20DA39217C7D1650:49B9FB1F976B6EC7
+
+375D52ADA62453CC4F83B43BEC349E85119D9233ACBA7328F3009041FBB9E83DB788B79E\
+E543D93859404A91D0166397908BE510D0FCB58F0033D3884A0AAFF9348E4E3825E3D4F0\
+E8B7D592C7ACFCBA11C2D9F7:\
+27F658DDDD613482AADFD44E832C372665EC2001697602A274D84BF3C2C76A5626D84C8A\
+80306E31FD8748256FBA279732AFD0CEA0102EB103511CAB71458F881841A3D49A43D450\
+558DAE85159310F67DB2B747:\
+7BD5159E4DD63ECF90DDA801DD608104:7A60E38CEE806006
+
+F81D39C6A1A977FBEDADE7F2A1C516FEFED8621E0C3FE4CC01DDFC4035EFB3F2DFD468EB\
+8899C9368A4DD48327EBBE739E6A68B063BCD5C03A896B47C1DA723A5AF8DA8629964D43\
+73F38F297DA5FC11597E0F0AAC6A328F:\
+84DD988BEACF8442FB917A80408164008BFED0C6B66A05E5EF5F46CBF5C126108F3986F7\
+336E5BCECB7F4645FEEE00F20511C52A750029CA31D869340170F30933E92A0DCF703EAE\
+3A7F15AA004D84358F76C4D3965E67C2:\
+F0DCB57019B3CEA07D6F8B81F8A974C6:FBDD2704EA4830CD
+
+44176AC9FA9B8502B675B559FFC21164366F73BAD09982114F21D2CBDAA15F88651EDE4B\
+BE5B644EC78B375ED58DB3A4D814A6DF7563F282E8FEC7C9965668039AB4988F6E87DC94\
+13AB3367500C6AC1ED5968E5B31F44F176B02F7E:\
+DE0DC6FBA50CA8E81E265781993875746F2C30BC80F682F085C644C162AED09718D09B5B\
+FFA421F8B26FEF78F222D55C5CFC71048F805393377AFBE94775057B432D712CE65B62B2\
+E48A2F973D3882D10BA56AA3DFECD37DBCDD2D57:\
+92BEEED6E43A5D7A6F6211C85229D86A:6B0FFBA1B3FAB3D1
+
+1788E3C83C04ECE0D95D27BEAE329CB99D5E84FC3EF4A45575C630C8B946365467386261\
+CAFF1FB8C615C840E6EC28FB0A42C633B373F5AC79C32FF90F4883E0DFABF01963C78681\
+70CEA96A30B4DA4BFC1107E31AB53D63A9543373E505C779:\
+BC545A4E753BF6BB554B13DE4CD53644AA7235F2593BB0B69B11EFD66B3CEC201790271C\
+83138945C5A7347635F788CA0883CECB6BB4B53610A64E384F769F6591D962620B660CAC\
+0A587FE9212B5A247001B5439D62E144F91608CE39756FAE:\
+2A70897594FA8D00C8792ADCEB16BAFC:530C2B6E298FFD38
+
+4C8E284F44D41B80818BDB68A8D57BD63F267BC0888CDA54AA48386E32C561BF8E3B370B\
+CF9615A74659846F476DD0FA6CDEA8FF11FFD3FE7D5BA8590CCC66D419E9D96ED3CEE7A4\
+6CF559345FFE61AAFAE1ADC3868E6C9734AE56B41E35B6D8A2316E4C:\
+FD08FED590AA383CE472B91572CF6E2244A897AE7116F0821DCE23223AC1DDC28207EB5D\
+DDACA086188DC78FE5ABAE43D3FC4F0F259C521EC38B8DC0BDAAE7F80B7B27DB75B00E35\
+E8A88380FA5205B002961BC6F1A4E81BDE84F7A3079F10F8CE644588:\
+85EDC49CF905E1EE9A8205C3709E1304:82E743E483BEC9F2
+
+F33FE0DF117BA01A850C2DEB6EF8CD86CB65433ECBB079FD69831A06096DDBFFFFB1EA23\
+F18EB4B4F397F51A5662462D8DC8DA6BE49F9DA578A90E12C8CA33F4579BBA602EC4F442\
+2D93C5FA8E8EC2C9640C0D3A0F0201A5F3D57DA94A163C25E185F5F4089F68BC:\
+17297C6EAB5EF458AAA16A1F0D7A1EE3496CAABBC623F2127307EAA81A78A756E4373F39\
+1DA290357927B703EE1F0623A3FF7101CB78C3525C059BFAC4A3DF3588021953445A521E\
+415AE2576948B323F08E3CE108989BE73EEF7F00FF01C1C587B312E5D80C0D6B:\
+F207A0C6B1A66ED1D50D256693DACDDC:6171F470E638F864
+
+59170FF4B0A175B7EF8BC2B2E0AB81AF6C994FEAACDE9D255606A1DC476E89980A092763\
+2819B55DE0892DD43F0D7CBE5C4279E6251BF5296FA03C8A2F0260339BCE64DE16155F31\
+97792C2379F11D102A2F7825A97A03D6A62C85C3A1C5BDAA18E4BC25F6C0BA43595D194D:\
+64EDCCBCA6BC3C6880DFC6BBD62DA90084AD8CEC2A704A7FFBEA8751F467BFBB5DADEB43\
+039C6F17FFF1EE87844C7EFA72A2EDF1EAA332CC4F281E5E813672C7A7AF4F85FCCBCB1B\
+0AE11F869382015D7DCD676BD4B482D175A5AE61730C5A29DFE7B14F7549A7DA12579667:\
+358CAE6A62C661EB1B365BB5C37CB744:4F8E99D3BB7E3057
+
+8FDA3A1460325CF70E0DED926596E870382B6B4D99FE89E86CDB6DC1B25C82C5816DD622\
+980FFBD4148AD82196865644B90A6B282DE1B92A99CD2AE0E804FB330F95724CA5B45A2F\
+C57B0926AB998EDCBB63E61E8673FAB199C2BC83998B7F43E8307B57222C4D76CBC606B6\
+B4AE8D1B:\
+55E3B003AC093190C81300E08533A11C4C96D30E3DF4E030DFBB1D2BE741A8F30188398D\
+AB8198972D85B44948AF438D6BBD9F47CB1307389F456F35238B1901F03D8FAB0669B66B\
+F7DC10619D5DB72AFA4990F52FEF4F96576542B55251B83E7EADFD984DE5554909C89758\
+65B78A61:\
+4ED8501303B4D3F924D5C7C4097E57C0:2B3A19E6E2EB6CA9
+
+3599E1DB61A7B8E74620BE5965CB0E160A69767048BE47083BDE3FB650D0BAC5532976F2\
+5530580B7EA047A346F5E8D413B07CA19928444ABC3A94CC52C7DCFFA3CE402F395CC182\
+7B13DA3B33E4658041E2F7393D90C27D928EAF9731A5054F289F736429D6644FE7906440\
+58309B8607587B9D:\
+6AFCA1CE267A3A90C6CF0179699DCB96BE1C42F0E7985C2D4D8D725C5FBFD9F6996DFB59\
+C0A5BBD09A58418E1151C1BD847B44D58384837E9594E445CFD87F8E324A0BB938838AAB\
+D0A496DDA178C927810E674ED0E36D257EA79743261F555B0E04E1524460DED8C288D71B\
+330F5AB0A13A6FBA:\
+C8378142EA256625CDF42F9EF7DCB2BE:7E12641A0C703137
+
+7B902233AF687EB4D0B8711FAACBCD2446038DE3F41FA72805BFBE69E00DC9AC5936C848\
+1539C1E97DABB61CFFE9D492D758F8D8DDFF7AE764DB8D4D946CB3207123A1F95F7DF76C\
+F0BD8B276004C9D685C93D123B407A78BC8342FAE45D91B5DCEB7EE5A2EAB15CFA38F4FB\
+3586C45E7279DEF3A5376CB8:\
+5554A20E71F2C86C77A13DCDB065D01EEA0880BD648F3C17937623934C7EFC77B37733F2\
+D1E96BEDAC273954C3F8301A749D14CF74AE76A9CDBFE559AD9643BA818080E1D8FAC761\
+B45B48D0E19F51657115E8ACFD6E81211D890EABF55E06946CB90599005B535A6D274E22\
+1F7A697B92BCA34D1F09FAA7:\
+DCBF96AF1456108A9B9227ED94CE806B:05C03EFCE65A8210
+
+A226BAC3B9FAB88446697ABF579D5332EE60985E2EA7065AFC56FF26C16CD4B944C7BF3D\
+C3CEF4BD9AE3000F17CB304B649D3A30776EDFA7D067D439A5990F2B7BE3FA5A6447D22F\
+BAA0683E7ED683707C30557557E2291574A76C68F32BFBA14E2CDE9E1FABD5034FFA38EB\
+A9A18BA405412D3CAC48D0A6F8B5033E:\
+B22F813952B9667C95028571AD9F8731A41617A9192671573DAFEEC9821B1A82296C8BCF\
+6DFDFE16D31F2AEDD69E9B18E8B34BFEF7D08FE47466AC0299F8E08922E515307E284BCE\
+85E70C7BBD4F7783653BCCE054BB82A14EE89EEFDF53C772273442576D37F90D5E2E14C7\
+0769F2F3ACEFF8CF1E71281D4172BF65:\
+2B4B352CF67C87C3397A3CFD44E6758E:C5ACF3B41053377D
+
+C85A0F50724680DF59E0AC198F7412AEE6734C05E53F6957BDC33A89E40DDCFAA4F1E211\
+C1E3390EFE49F299478DCD9026CC2E3B49F35E893ABDF851C39F76ABCDF9B5E3E4FA2B52\
+0966A4E1AEB36E8EBD1BF5DDFFF64C9935E89B75DF0D78D1B54D9FA6F8A87A8A47215915\
+70B47E091B016A381A3E76B3AE92EA014EB03905:\
+13C3BEE2154D3C4A9109B1F3E0D1D21CF47FDC283A7ECEDF2338FADC4F893896A8EF03D9\
+98EBB98FB732FDD1B11061ED6FFCE2613DE72AA898931F4B5471BF1B96D35FA467629275\
+5C1B77AD5AB0345C6B3E8FF05F7EFACC393762A075D36E88CC5EE1AC3709DA398E21F452\
+CE9F255D93BDF03AD42444C2ABBE0211C38F9F84:\
+81BF9C41D2404B0A468380F8CEBD5996:2EC2328185E51927
+
+EA03F0920CDB09256BB8D2DCBBF5E0F9C14FBF0449BAC0AD02BBC6F3C5646FD13F2995B0\
+B6E37B8BEFC5E85DEEEA696E4DA351DB87D694AD896EEC2F810538CEDAF434931E6A69A0\
+19A2C73C3309FE7FF028D7A8D387CEFF33A63C4FA3669B41EF3DD8D7A0A923B4AF8307E9\
+072C32020B42D4CA2F6933486762E8E3286582FEE0F1636D:\
+847772497AD58F8AD957CE4B2D83D16C8F6F0E7A693DED94B7D1D11832078CBBB9783AAB\
+878CC9AAD7CD731E74D314DE0B9E9B9F65A279C05ED1382D26882F8BFBF06192E587CBBB\
+EB2167B96DFB3269B4BAC805288365849EA703E56FAC7F13805AE140E894B8E684642E73\
+BAAC18E7F0EE1637FC17C42789525AF0DA8D10DFFD7BFA53:\
+5A6F131AD458C1E9B3C004109CC78E7A:FF6CC874B337996C
+
+4A90541507A87188EB104184D464D1A04B622CD3C706B5A800B57BEEFE5AFCA521568626\
+7D2BB696F64F4311D33A83C553022C482EC939A77D6F2961D668625E214AA9081056643A\
+CCB0FB9C67892D20B674E5AE2036214C41D162C7B44E453F87659943088A8468BC127357\
+41B2F3E7F3DDED053B73377E9E9CE47EBE52A4FD503245CDCEFA4919:\
+D3489D41497715E8CA4B828E86A03903AE435C170FC4DC149D599832EA64ED7917F30E45\
+91151B08E46986FD94C2983AF9713AF602DBECBA6B9F9692AF43E53A3A04AD8B8E33E846\
+B95C8CDE80AA03D46C923137938937FD7A285CF322D23405F2FFB8C836B2CBA663C4967B\
+FE61DB36860B6B741826BA4F22E5393879AB76330545BE2B62389491:\
+B0221D669075C7DA04EA353F6712C7FE:386BC7C0AA935689
+
+8C52A4AFC465477D059AA22CE8CE343FF273987F10B249B1A19B6F95A69B0C82F122B22D\
+D4FC9AD3DA4AEDCA876DBEE1AF12101B5CF065EF20E2EFA1B50349659F77DA6928BB5108\
+BD9226424CA31C7ADF49C4F738F013AA5A55380ADD25E840A60A5113B08506D71B702A45\
+25DF234AA0BC459222879DE4EF24B305F6B6E7D5702E3EE7320D5C1FAEE2AC70:\
+B054E0553AE9BE63A3315509949DC984F145DD24B152E6FB15D712067AAFF77733F7AA8E\
+CC4D60E47E4CC1305BBEDD7D572ACEBEC9FA31F3E701E2DD5885C1C39B371B6582D14AE3\
+2D31BC04976E3805EE3BBA6C727A82C8009C1AE39F866C6C5C4333498B32337E435EDD70\
+0A48BDC28A7918B8DE08E02A6CD3BA196C7236379C12AA86FFFD0DAC3D7390AB:\
+5771D7A711C92CBB93CB776D54083382:7FC654F95497E5AB
+
+18AEB9393D3A19E52A9F83E7E419C40E533CD2547C186038B315787C3F9616CE14A5A022\
+C2718D35CF6B54227C4E496E1552D392CC060B87E843313705797996CC5E73BF43141BFC\
+11452B209BE877D7ECE2A7A4D4C02745179B90D5E6A205ACD8BB01405632D1813E31938A\
+37F43165A1F1C5AC87A1ABD8A69AE655D4FD70DB124FD3420D700726705224533C9F6713:\
+51E70E5CFD39FDB62418893CDC05469738E3E144E4915064F2ABB82F0DF1D1147AC59EC0\
+01A5EEBC6763AEA4748825814E4CB5A90B271007EB8FDFBB867A9911E9DAAABA4D692B1A\
+D9AE2465210037A18E64A742D831AF8AB925B696DC0D18F45B80C0F6A46A07E3322E26AA\
+DE193F64BC2BD998F819C440CD47781A4DC21B831476145093319BF8FF4C00FC9E33DB25:\
+CDE4F850BA8D7F1C9114149084656B49:A6250EFEB105609D
+
+9DEB4E27C4592FD5DB48D3DD21DE22342C3F6F1533F288D8BBF3FA65E67A66854479737C\
+03F2FA5C40E0001FD84D9EA4604594CF571F03BBFC06668D12DF9EE61CCC0385B4532924\
+3D5A5D06C19791389E89FB54A6B85D005B64C08EEAE5FFD7DC1C9F1DB87B5C55D06FFCEB\
+1C9BDC3F78E5CBD67E06AE24500546B17A756F9A1639DF24AA77CC53B6893A31D87435E3\
+3B1045C2:\
+44C52C48BC865C5FFBFD05C2B27C4D2B69F373CF704A2E91FB2CB0D429B957A6EB3089D7\
+9182311777705987FCB9D8539BB2CCCFA1FFC8D49EBE6820D01F10597315E46985F4B4A2\
+160FD97BDE4E5F5C7C7441E06E089540788121B761340DCC2BA676670432C0B0C712D6DC\
+3B565B25AC5C31177A50499F716522CB5ED67E9EC63C73E6FC6BC68B0C5C7B4102D4F59E\
+79439CF0:\
+44738E1E4B7A442D209F2661FBDA824F:6CEBF2964385D443
+
+15DCFFF177841397C5B02A1586B9EC69250F7C397DAA9C0C2B172234B18072B894ECEDB7\
+6F839878EBD358AD6AB62D387456AAE59D865969E9398326B140B1B16867847F0BB30FEF\
+787EFD2E7F61ADBBC9CF13A519DBA56907787269D5FEB735F88A4C6A313DEA440C4FE07F\
+C374E01C83D65CA5A26631C745F35875BD58890A066F82F4A46846937792C9E893C87856\
+AABD0DEBC110AD4E:\
+C8065C6F95C74F52907EF0E1409608E15C1D9C97980891B93AC41A6100080658C4F84FF7\
+70F0BF240B653B60A91796AE3996C449447E6E1E19FD7C48B8A6C6481C2B5F59262C895A\
+57B4C65E0549DEF9603FBECFEFE9AFA60A26A417D5523B7E47E5C04F07323A88A447803F\
+40CC46D57ED5ECF43D6F1A1BF48F03D0D56D7594B83BBE856A476E9A49ED457A1FC76314\
+0EE67FE5F77D0769:\
+7D8DA95A23D6B81028BB069A712AFE2A:278E3C3D1962967D
+
+47743B5282C40BC1D37C6842C7DAFE01D49FEEC11D27D212DB0FBD852712416CD392ACF4\
+1E1A5CAD44B82032FDAE4E94BB5F94ED0ECF20EAF9C68B49F9F0D0D3A49A377C18210130\
+44070654606CBC11E69959DFF4E975868399C4BD3A3CDA32ACAAC037A8AF3155F8D20AA2\
+B76285C6EEDB5AF9E31865BE1A86E5615F8E0CDA4F0DAA44DD3EEB1360C262429038E8C9\
+D43054EEA4C67E9C26504FDE:\
+F7081D26253675F37E0E644CF5FD2E2DF27B760A57A2C9753B2BCDBAEE6EE70DFD83680C\
+B1B4166DCE85F48E52943A3A7E83969F4D674226323C12FB306F5BEE80B96A8BF99BC497\
+9753465E587E9FBB43BAD2003C8DA5F99CE06B6D198D024E7E41576539CA2176DE8C78EB\
+4926CFA264C108A153724F49E38B2215641BF885FDB366FE4975A6AE5B5C9DE89EEBE3F3\
+6406F0169F09FEDC9D582656:\
+D798EFF93075E16619C04C27B44B7710:81D4628D9577608D
+
+440DFA2B6F45BA97928C07323E7639678ED1B247376F8B51BD5107BC66538ACAE5D9F692\
+4B9060AC5CC37D360F951D81CC2680213B48BC1FB392235D9E74076BBB1A7277E4B4CC6D\
+A3D8B011A31B92EA82DDEC54E3A982988E9823F343E6638A6C8A8B4F9FA1020A81B7B707\
+776BB4991B5C7DBCC9BB9D041154122FAE8F6690675826AA20C251B29EE5647B160041C5\
+DEEC1B90BA21207B39FD0A657527D480:\
+6253441E82759549F5791B82541649A09600395E37DA34BBC9B075E084C1C027D3A533D3\
+1187C4F0F3FC26A2DACA5F10461953F3F2D8A0C152A367C0E2B99DB3831FB9691C815290\
+2954A26C0D14AB3B8B7B5DA82450FDC4B37D6904F8835326D35ABA9431F003E867AC26F9\
+170DDA423837F657E908493CFC06944B359A42D1761DB68A6A61D9EF03DA83DBD0B4F69F\
+020FDB560C687377021C09977BC8208F:\
+831246376C66B8468E7A6E6E897878A9:9955251D87DE0D7B
+
+D2F7A97B171A9C774D0DF23173044F51282364ED0F373E86EA57C6AA726F313FBF49DA8B\
+F30411F4D85BB62CA06C577396C0CD74D8F43DDA49EC5AACF46D9D3C20F68FC8E36FE6BE\
+E147040811CF9C6EE80F3B011494C828B6822DD83F635C1AE32A115FAB35E5A7186942C3\
+D5E3A25FB2A2D18D877994DC2F2066DFE5873889978DBC5E6686F24A9D4F69AB8F7B9F19\
+FB723D39982D2C22A68E0D526B35C3782518E721:\
+4B48E6C50D37471DB4D311A3303722020E874C6A578E4CFDDE95C44507906ABC4FBA603F\
+0494AD42CE4A660BF4CA06BC7FA1084DE0315DB0C85081D8A06CB823DC876930F948D594\
+020092F3AEB703F95DF7BC94DEE275572BF9D6D6A6FC51AEBF7579F0CD49369A8047D46A\
+B9E47B8D90C4EE61A24536F638987E4D343E2D66DEA1FD670CA98AC284DEA1FC28ED522A\
+B1F5AD0581357300799413CBE6A78C9571B134C2:\
+59C571414163AC80C5856A8E8EA9A524:9A6C05BA3212D92F
+
+0DFE5D7CDEF8C0EFA80C66136189518199FAC9A459DF9FA5369D4F1AE4E3938DCF790F65\
+939A4D8E27CEEB7F7BFA098607DF2C300D61B00E4821B3A52150F5C38A9B12983E0232E3\
+05419FCF9D01628CB18D22C88E69091EFC8ED328317894145BD9C7488EBC4C7DAEB5DC9C\
+ADC240CF47B1A0A6D720A8EBABB78A2BA0193F2C1485C77DDC47258A8B9E34A4F4066C6F\
+CA22E44AEAADC6FDD6C398EFECC6014662286D3BFB339D2C:\
+248E8FED5CED6F9FE5BF2F5FE9D668757A222AD0525861FDF8DC86BD52C75AAB502F3ACE\
+EDF16448107C65CEC8C462C50D9918C7CE84CD7C1F17BC16625D4D9CBA7A335E8DDF31CD\
+F86EB9A2CAB4E6D46136F05DB0FC7E9811CFFE1DFED75A1394860731187B3F4D053BE3FE\
+A79693327F6ED98C40277D747D8601447D5F02401C0AF31DE0816310F81F83683E405AA6\
+4CC47953CD922ECDE6ABA6AF4378BE5691B78FB0C2918187:\
+B69C5FBC4525445638D618F669F82347:346955985318F429
+
+4A25E4F0F608CB42CE5E8EC7B48A822918236B42D074D0D7C8D1209E4F68E4DDC9F90B25\
+4BF967FAE9058DE032C1084A1BD9645B7647774FDE927DDF1776D5F829CA436C9E8F5D6B\
+4689B592E7EE0ED9F88C12D1C6F30165406BCB2177859523855BE160E7CB477EC73AE50C\
+66F827563B4173EDEEB4AA6DB82B3AFFD9E719BB0701AC3DF37AAE2992348F33BE426B85\
+151D7581F1553A0E99C339BC407CBBCD3EC9D603D3F9E7110CEC5A50:\
+89A0DDA3BA5012B8D10F97F1546BB16AD2123FB97A8DE83EDFD42222EF62A07920C93B8B\
+3A123F5CE5EAFE1F9645975DDBBF031AFA61166C90E2A5677A07590B483CF6FA9D1597CE\
+FF8734A3D9554AC4C946A4551EF8698CCCEC3AE7142595D3130AB2712719595A6A143856\
+53DB4B52FA784D75869926237F43C8077732A4DEE1C66220226815E0E77F868C68AF4268\
+BDD89ABD6DCCBE42CD2CD16617467E188D200517FDE85989BFF9A751:\
+14388CE990670FBE1D821E677B829621:E13F97C3B492F94E
+
+E0592FD880C54A90F4A3FC3F1057712CEBDED7CFCBDC017C9ADDFB9714C044F1A5AA11E9\
+300F9DE1C15F8368B5DAD6DDB87BE1B6B2D3A32EE21DDE6C1098D2B84787E12366B8734B\
+37130D010A91A76CB6CB153EEE3AB7736A2D6EA3F6FC6072870F5EF351FEE32777CDA4B7\
+936A1062CFA69CB94405E1624E2D56FA06CFF4D31616B20FEECC2D2CEE58C81E3DD0EB56\
+3EA825C87914C1F38FB9AC35C04812041F2D81A32A9C8546ABA9BD5AB6E71942:\
+003770A75B796934A5C6C8362381B47E9DD791DD860AADBF9F71D4F76D648D210EA1F16F\
+513FE403B0FC39EB84354F585756E95E9C114679A1FF6F90A98434110CB1EF5FE540280A\
+6A82C56855E3A0C83FEA2815C4BDCC22308DF7769A22033F6B2C91ABA1F6BA83D03CA788\
+2EA584E2C2183A1E74A75F1E934E3E0ABFFEE26515528704B669802FD6CDE0811B98BDE7\
+120BE82828E0E67837EBEE0DFC30FECFDFD5B4D5A251571DDD8A42E46583CAF0:\
+8E0E06D39EA04A2ED224FAB12F875169:4687DD18DF082821
+
+01A8E66CFBC585451DDC5BE634C7C80DA329D3DF16239DE9EDE1B6EA4EC912B5106999EB\
+348DF1009AFD0ECB16FF5A7EE023BC8C4963D52FBD8BBBA5D99B0512D772608746FBBF36\
+A362761CDFD5DBA5A0AE5100D0FE1AF4EFF576CB1370A4B403DF7B06E22DFC37B1E1AB6E\
+1152E0DED0F1B5867CE72F924EB3D5A122EAD315C7EF570DB199DAF3042937205CA05E22\
+C101527F9B9187DBA80461DF3A0855CE0D32A80255DB81327849901FF16061A52BFF8410:\
+0FA83C7A283B563AD3A1D91FD96E5033EE3BD79C786E6398504D2B152E8174BB1F743D2B\
+5F209A7792E89D24B0E91F9A8B19FFB2AF659F0826C743E85F469E31BAFC645EF27DF183\
+CD7AE419ED8D83AD229D9CAC3C67E8C6F3B722215D24793B3AF04283A17DE3B36E34BD48\
+309B2C8DFC5A4B55C0DAFB7EF0E40355485B89C381E9227A7080C2353D05E2E97F58EA41\
+A72E3DABA27753D44EACF8B9C03F21FBBD96D5DE4D36EF0EE7F8E554E1B468126F5F3AC8:\
+282452A3EDEC7BA6850A6DBB481F18F0:AC2FC317AE3C2DE7
+
+525585F116281D04FD8C06E92EFC21C91E936913C1247CEE67727653974C09F768F31F07\
+ED1F3FDBD6A21194846E9C7E96E94728D640639C77B299102A8D7F6CB35904B00DB8455F\
+1AF65B05DE83ADB6F2759BDFF79CBEE13FC46669771CBA432E6F777FD5D9C879C5B891BB\
+ABB568BB541CFC1A8E567D718DAF292697370206F4B69541F9F44DCE287FF966B62431BE\
+A035BEB6C13573E32233A9ED5C50A0D71457FD8B99390FF345D22AD61B23DCD0A0464B95\
+310097A2:\
+CD13EC2531031AFD1B215EDCE6B60C6F1E9E8FB13D83B9DC28EE9F586C3C82AB7FB3359B\
+6C2354703093C883C489AC1AA24D21255E2BDE7BECC0F77B55E23090B18129701553A908\
+ABF324C917EFF7CAB5B12D6FD4CCD0928748A223DB90F66B48D79333968EF22502A5EA9C\
+CCF588FF9FE70AC2DB669C2A56905EBEA7AF56BCF42031F3866C77E1D62A793F39827458\
+AB46132868CFB8D72216BD41327B8473F24F68FEF8D0F46F339D533949B609FC2723D953\
+C5F2BC6C:\
+A36BEA2CD9E5D98B4B63A2EED52F8C1B:C2BCD83BF070721C
+
+47A0196C08AE929B236B36A04B7441FA40E69EACAF3F087F160709AF390C5769E1452EA4\
+1F4325EEED011D33B82454C7B6CDF6775E0809BE8068772E66EC81CC0319A7D27BBB50C2\
+B7D0DCAA8040FAC70BF3947B6E57127422E979242ED79608566A4CE9C8E0EF3589249996\
+601013B4A32D3784403D52F6E0467FFFBED8AC31E2C200F169AF68ECEDAE791AD6D4E518\
+624D9BFF90116F154686DA7342B071E9A9435FC4AE2F42536FC93D98D6DA6697AEBEB47C\
+94451522116467E3:\
+A14B00431D6BB8042C402005AF87709D098F6366527099B8044FEA9C173323FFBE5F53C3\
+013DECC92616652FC26B8E46E0FE4116F3A44D8C2E5F08B0D2B0EFA3B42CDD4809D2B8BE\
+DC6940DDA928B58D7ABC1A7E753AD1DE54273C87FB18E77D58C4AA1867C7B01A6F8C291C\
+3EEC5DDCE8CD3722749F3DA01C9DCB4E7B62F220697B5EB47538FF8FFD78E4CE949A0265\
+E8346D2ABB62F5537789236072548D8588FFF3D8DABB7AA51634CE7051E824EB4BF7415A\
+2DE90CCC264E2917:\
+52874F3F111082522E9EF5ADED117EDA:2455286EA57BEB7E
+
+D32975CF8583D36F57C092295D8FBA7C44722ED0F385C102EF12E5BDBAE80037C5FF0725\
+E6B950EEC1413E628EA8088B9ADDF2CEA379235CD62FC01762AF3BE11DC766A17FC10F85\
+BAD826E94147DB78EF4E0974D4566900D87643370A8C88F42471C2479B7686FE97332D3F\
+014809711124619D13644E5C95FD083212F580F9FA3E2CCDDC0DC33D782C1D103093B9CD\
+54E4A3113B6C75A7822ED24D9A422D719B26C21F4FE73D74012E81D9FF58F13BF1B681C2\
+9A94068A47FF18B9610DDF80:\
+C8D6A2E21C15290F42BACC559380F1ECB797306B7B59EE22E452F971D049D24FC7C21BE4\
+DA40A91BC91A2FE47E35CDA7C6A63BA7F0F38D038002093FB5E83CF52D197B9DBD0160EE\
+6CD4BC690E0BAD9379352400453E85424E2583B9FB7502F2918C60E0976722395BD8FADA\
+4C1726B249E4E8BBEAB59AEA3EB8B0D833FDD9A934D43542404633299FCF6163A4327820\
+2CCAF90CEE44FF094FEEAAA88EB085606A50E96C447234CD2F4A6602C18F71522D58BCD8\
+02DD3B97D5247F61AF099FB1:\
+1CCD49253B736228C454B8331631042C:43666BD9D4555CB5
+
+BD15B15611F5D38034351F16A47A50C53F9952D35B0C888663EE6164F5F228584F25536D\
+8EFC04FC9BB0CB228857440875E320CE25534AFED42F830F7BE88AAED5D91C128EFD7067\
+A30088B1A3AB3C00FCC3C658262230AE7541DB9ABD0E1288EC7B2091050FF3935575FD32\
+D7CFAC6D599655307F530304FBE4E16E647AFAA0EDFA51F4CD075182F2B6D1E8B2F15211\
+CD52A996430CB634B099965A37B442B1E1B8104AE9DA9978412F53FD9FB1F24E5AD0A2D7\
+BADA6011C87593392A629E1E916CF28D:\
+BA61E2BFF557EFD75AA4E9DCBDC95E3D02C4870AC3604E5DB01C38C5E489254CF4B4D062\
+FEFBB3CCB044B488909AF465ED13785E5034DC62F65DA7E7CD0B53E625D9090123E8DD54\
+8E377C4B9AB085A4AC083A2EF1815F115C08CD8AFB8B814C17B2DB422AF48EB71566F8D7\
+246C2001795FA20AFA9DC6F76519CBF7378267A1262B87A98E6773E61FF3211A5994E2D3\
+FE2E06AB52BA830CADA7EFD02A36A66F2D4C559CCEE4769C0339E56EF3946E736B048A39\
+F41C0FAE0C7650B3486DA5A2349624E1:\
+A9AB5A6AD1CFC14030B05F52CC27D166:81F7271353D4D8FC
+
+2AFE5901D507A488E8729205EABCB8158347BE7FCB6C4FBC5F20EB471F00AEF1FCD46892\
+E679EA9838E22882B80B1D68258D24392C219F9106EA1175D54F5AA495B6B3E0E60CE6EB\
+6E1E892F2CED18DFC18D62012A4328923FAD58CC04EC70F832E3E1B8B2F1327414C5EF9A\
+57DDA4D40C63289A5346520B7CF4909B41A8190B668EB9E5BE78F55155945936DB2C20E4\
+C184BD2D3F6DF976168373A1E465E89B0C2ED18E750643932EF45DB0661ABB74088AA216\
+3C06A19E917D7B6F513FD1DB784534D624EE5575:\
+4DDCA5CC4014C19993D857ED57876B384E8E06523066A86A4A4EE4EC597CCD3F1619D4C5\
+124C088B1E89E969335BDEF659CD3E2DBB2FE26079EF7F5352991D26B89CB324234E2608\
+A77BA1B66BB194D4CBAE3DFD6B80359ACCB81C3E69CE2BD30BF991930AA22FF0A2D02A0F\
+460951DC829FFD8F095CB245AD84A152BC59DF1925B0F1BCA25FC2355AD25B25D821B22D\
+C0AB2749AB7EC0442AE798674D8E11A87257AAA2767894914056C8287B139751DA5CB49E\
+8DBACE28E2D9DE52C508089F8DCA82C7386619B4:\
+E3D2CAB6F748F35DD4E72335A0241476:D97CFD5DEE5CAA6E
+
+4541B90A451368513D4A09BCBE2CD48155E512FDF240E76795905DAC75CA9BE0264E5A7F\
+924C4706925C7CD35392FF441031EECDF0D9EFCE0E6135E3F4C1CAE57286552C4AA4D407\
+4C9F7C922B53D0F4CAAF6914F81123EABF9B012AB45C9AB989AD979A197D7094AF9A0EBE\
+F2DA9AD8E32E5FF16E14475F0694A79346231E532660E0176224F21676E304A32405775A\
+937E26FD3C9AF3A4DA27F2FC131717805CBACFB554AD1ED56036C18456B5C8211F2CB2E9\
+E34AA5706E439D1FD5DF049FD63CF2490B74998AEEF3D63A:\
+37BE67361D55FDF19B8AD1A39BA3DD47210DA5B83614B00A72120BA2D9E5CD65890C58D8\
+1A3060A39A4E8CDABE0D2862419BDAEC7695B87E2894FA5A5B05E0E1D1E6B35D5369CE74\
+1BFE4EC755DE0BCAFCC1FC160A6260561AF899A735817258BA86062AC698CD50913E0043\
+AFA85640C52BD8F1B979011EC8A20A5A0C52BD73552B2E1DF1481C62F2BC74E8150943FF\
+4E888D944B253D0CC82848DFDC709792A2FD987EC564FA6D47AC98C3B271CC0A6ED3FA4E\
+DD159715AB1972E45D51926E42E88C309A95494AF55C9E7C:\
+801D788845FC6152E33E6A2CB42A2A22:5F5FC8B7D6B6C3A5
+
+9550E29D3D0E9483B8746D24A72396DD16DD31F7538548C6090950908C51E4AA9250B171\
+3685E1A7337A1D917D197B72EE8A0969D58CAD94C73A9B24A63620BE8152013669BA44DA\
+A9652C99787B338FF96C6FC00ABD13561045A1C25214695C990360F505D83E9FF3FB3711\
+535164E06FFEA4A0050A09D7134FF72A98C67F3BD73BF90E2CCAC943DB049A788E7B62E9\
+2C9178E433255A5644DC67B17CBC87AF2AA145B3E4B657F31D28B9282B0E6B343C8759C5\
+1457D48EB5880CF255B2058A30388D306D896AAD42EDB05158223FBB:\
+22473327F8358F22AAC1473C942B78067FEA10319F52A6969A889AB87A09FB2A21878B30\
+8627C0FAB3C1358C5C30F198FD5EC27B9FFF78F4C4BB97ED9804443C18C01470CAC1D730\
+95E8B9E2CE4E6766EB4DBE31DB528CAA80B01AE979A3FB32F056F54B93704DE4E45D0EC1\
+9FC8E571294C279CE3C1DAB74DE63C741EDC1AA7C60A8DC1EEDEB738FD415F22F9E42A22\
+19A1BE56404E8921D95DB53F7B2873908C9A7E09A7B80EB40968319CAD1FEF85D31B916C\
+2F0810CFCEAC1E77976D0DD2105F71E9625209ABB16E7CCD3171AF38:\
+540E936A8F7DFA7E1069D1ECB6DA529F:7DD8BE5EED8A3B91
+
+ED1ED1768831FE993379B5EA6091A5CECECAA6A1E4218F13755A75CE982B5901191B3F6F\
+EFAC14A3D68190F66D759389A4B72FC1965516E16412E1DAFAD962A23420E3D108738D6B\
+F1B7D8FD2B6DDDBD590E88EFE3353664085D1BFB7B8E2FF4169ADA322530724388BA3784\
+64B2DF93893FF936274E53916490A4917CBA6997BDCBB9A84ED1E7543B89B64AB70F8CF9\
+3713FF08A5E8EF164E33A6C85205173E9D2E3B0D31E565CBFEDE77FBDE48CF47E742F56B\
+A466AA124B725840B56A69F2F46543C31C5DB8E926A7FD968B94606B77CF9820:\
+6F5F24233FCF42897405065C047A15EDB1BD4AC5824498D186E76D44A01636E3BFA6FD96\
+B0FF5112FECC0F7D5E754505AF90F25F91FC121E5729D77E569744FA7095BE9C15216DA3\
+53AAF508D7A0BE30C64549A1D2F092FA65DF3C29144030A0B3407DF0C80D29A82CAFCB3A\
+FC106FDD282E3E3792D034262EEC388134F0A0ED182D29AD8EE98FFC3FC18256DAB7D237\
+4A31F293F88812AE33758A35521093334BD204CD2F01BCA1F914B9C1FEC402AD226102ED\
+6C77459CE4D20EBC89CFDAF01334AE4DCC07D48ABAC694B86A90A5DF236BCF06:\
+C3CCC1F40F2234124E8E44BE4D230D51:7BB01E9C965EEAB0
+
+A9CA7C9133827D9AF63A9A2D98F12E96708714F3DBA3F887C044EE50BF508A4759124EE3\
+748CFF9E3F47976EFEF9E9E91DB6ADF75F2702C277D87E7EF2DECBC60E861FEAF695E93D\
+F183AFC6548AB8F5BFF6C12A25E62C81196F3AD2392FC77326DD521D374F54865532157C\
+75F1B77AA93EB2178F6117AF2AF8ABEAD69C2F4B3FCD3F0BCF24CA460FB596E47C4AC6D2\
+873A96C90788A425400D8CF579733E553B9C38E538F2B1C762D6201EFC132E92ABB69121\
+30F22547BAA1E44FF487D1C4B2B06B3A4768A1220716C44657F679E1F200164046325346:\
+1F1B86628E58A2F6220B26B25DC7723D22B02F2E5E011672C354C6D1CBF272100F066893\
+EE1A9E353E841AC24D0AEF62BBB5480ED978C84BD5B052F1424D6238641C9F11E5787D3B\
+94CD7D866FEA1D2DBACB58DE1B6A0582B6C103926953B3203C94CC8B87F0630E77650E85\
+1449A3BEDE5B2C1678A5F17F920234238C0C57C51181E5D1E7B1082EA9D4781F825574B9\
+3B69FFB03BE688210B74B0A6338370340C90442709591671D19FED7D44795B97409119B4\
+CAD30C84B296C7CD76C3C3B8ADB8B273A35AE34EF402D4B22458EEBB1992C7A32919D2C5:\
+A8E311DC7544747FA09537683A4979FA:F010A1D16F896398
+
+CEF68DB7976679BD69BC5819CDBEA5749593FC2754D2B0860A87A3B16A680E9B634C7A23\
+EEB7ECACDBFCA2FBF26AD3AFDBF29E98230B43D410F27777010F09ABF76C69E0864BA2C3\
+7ED9BE1C0E812154E570509F0C8F07C45A52E5FBB3DF015FD54BE20D8DEE69FFDE644EFA\
+4DD93E7C8A7582DC19B5E1C69FBF190E43C7EAFA92C67083DAFB3890C25324E3590479D6\
+BAE27E8E90B6F28EC39BFD46A73CE92F17609B596CD2BE34700E37E423CC9B9160304198\
+D917357347E414627D7BD9D36ABB5BA07BEA6C9302F73F370D2DA6393F3CF310B65BBD45\
+374EC60D:\
+C8848BBA822123ACEF694A77E942F57FF02BCDAF6E6540FEF7A075B890A8CF32B9372A95\
+53B501526455EFF2B764B5C3E8C3BB08085074B4EA0FDE7D4CE94BF284603423068E8FB5\
+E9252C73DE7DB341AB624D1C44E79ECBC22874A73743004B99BD6316BD7C92415C1F2A54\
+675FC2D26B0EAEF760B329A1BC24D140BA8F28000649F1FF43F586E2899FE63C133A67FB\
+C542C87A4369539D8254DED0EF157425B379CF6F10BB0DDB7937441E3C091602C76424AD\
+5E856550CEA7FECB24D54333C437251122C72E4D21DF23371B01D05E32FE1907F198F18B\
+DBF68351:\
+6CEA1E32C1732B9AAF2F9A85A9022895:FCF3906F4227113E
+
+A7A87EEF419C8600662C5CBA01DA56DF0CE6977991502A27F5FEDAF68AC26AA89FADBD15\
+63ECF3810643174D9A2B6E940E65ECD0FC120281BF9F52C0AF2F768924111941FF1D8424\
+788E75CAF63FE7389ED1C736504F99BF1590C5B970DBD7E0D13C283209435EDE2360146F\
+4F734A06F1ED649324985857FD3CD80C82E896C368E44B52C35C958D5CDB1DE800BA7343\
+412CD66274A97037667767FB7C7E4B95C261106FF3D34A209B998C38F2639F74631D1BCE\
+BA04A436D8DDE90C2A1A38CB44EFA7AC782BD5EAD9F3A5FAC879AA63F6FEA44FF967D709\
+92533375BF94C2EE:\
+2F7335F36D102EABA78F04185805AB6F88BEFAF2ADC84DD6DE9629E34A00D934FF017D7E\
+C8195B8B7D380FAB765646FCEAACAC912EFCF6E522052531D04255964ADC147ED533AE5D\
+5917ED43F7E21BA784B121DEEB879B41B2D00C8A18FF075CD810F8C5DE84B8E3A137E9D1\
+911BAEAB91402AD0461E58A58F45AC901B0B741C63A78C13C82B4709B14F7DB1B3896206\
+7F5A08DE2FA8BCD91CD6BF3FC17950693D0DFAC9CB1680E68D9C9823AC12B1F37E4B6C16\
+63F5BBE7D8DAF7961C3D7B37C34FD2CB02918785E8B7B6777704AA4F11CD974EABCCD678\
+4504A583C56CFDA7:\
+808372C49B7BBBF65386566C6973A76F:805EC1D405B86CED
+
+4F25B31BA0783DD6842D607CEE8FCACF6ECD2D5D6D885A230874782F2441ED47DAEF2138\
+E6EC20333CFF9671E008481F80986EB91A46C08C9D22D2B6335F8E6BD10144324726FD7E\
+A311573B1A03E6E6262B89D145B01BFEEF14D7904E0C53966747316842DEF71AD1144CE3\
+B8C08C16980A2EBABE9A5501C89CF0B6F610808112123A56FE7F726639A20EDF2C531D8B\
+DD30D9F4032C9C3F9C165634A898442C3EDDB0D8A63A855CE44E650E428B60C536918BE0\
+45A902B0346F232545B27A0C5EB15F79BBD1190552A68EE7C1D29D04DF1C70A7CA254A6C\
+D47BCCECE1082A20F35E7E46:\
+AAA603EC1AAF270AAFC06A43317B6FEB2398633A9D1C130F2C67B6C19E9C391C9396914A\
+BD907B1419551202E6228FC7E06FB78FF669A2597AEA85DD4A372FDA60ED0E3C30E872E2\
+AF2A250DBC6972CBBE00A5F1B5BCB7353175B5D528E32CB035460E12C8A3DAF3D1D4B25D\
+0CE9CA5AE3F8250548EF24AF92F4346A0C5716619A640100922AAE13C7824341A938E14F\
+E9D51AD691932421669D958C252DBAAF943C5AAF64C89AC8B381602D3AD0937D8B8ED413\
+2803C2C9F40838CF1A2064D269A9CA2266DBB642852DEA101E4E6CCB40C377F17D195FED\
+673F030484DA66428B3C7D03:\
+299F9BF1E1B34A0D39E6D49B67DF754D:A4C997CF160DCAF7
+
+3B0CA636F9F507E2D9CFDF06B3D69B44A3647FC9D6C824C3C1FF9F31162E7A40394D9558\
+9123310056EF2B668F59B93EA71CA45434D104A91878A6DD3C4349D374E39B7A4635FA0F\
+0841824D02BC92EA6EFDEC08BF8566CCA111E478C569A96B9F7A2306A2CD5464EC4EB0FD\
+642E91A01EFC0CBBD08EB28B34D99989BC3D55DBB5BF32FC8C0CFBC3E5B89DF3B01EC4EC\
+8FF3553DA1714004AC52A2F14EA090B3DBFACA8A7664053DE14A905339D2952964DD501B\
+638EADC396DC05814203C4568D5469D7E3FADE0302C14BED2FEEBBEE5A78ACD17D0D4425\
+9D4A47BEA7C4935967125BC0F0E228A2:\
+253D1DC003D0BA2B60422354551E3684951A5B77C142061BF86EB95DCAA1FA06E2E047F8\
+DD94D3080BA6345E2F72478110899AB51D5BCBC6E16E564C407AC37A08F34108FD9EBFAE\
+560FB59A6A37DDDE8F014EB525AE9F5F63046C263721E72B6E94151A129A3BD446D9AC21\
+602FE0D150251754B4334462A99B7C5792B901E03AF71FAB991AAC8B9A75C29B2FAF3517\
+8946735608DF583B27C80661A53FAA4AA581B5AAB2F7F034707C9B812C9A22FEBBBD21E1\
+BD4821C4E45E3A072F8301435E238C7489B23646CDF37800C9D40CE69BF17ADE4992F733\
+F71C2273B37D1F17B68D15FE61163E84:\
+CCDDD91BCCA1490EF312ABF7D7EB545B:B091FE75641EF510
+
+74CF8F2B03009D38E874C23AC4A01855EC591D2014AC96C5F6C4D0BBA42C8C3764A3554B\
+9D5D44D9FFC259E266DD0A2649B5D299139F2ECDC1CF7E286C183F74051B150674E9407E\
+C8A6E151E174EE66012DA6E2303AAF3AE7F677C17BDFD546589F52756CC02ED3BF4483D1\
+B4BF49FFEA82F0A9111BCA3C2B5DE08FF67E5BEA7D2E74564D686D554DD9C31C291ACCDF\
+76A0AE0ECDBB17A427D4223BB53592EE37E398707CCDD0AA70F815AC3EF6585F35A5E1AC\
+D44C511CCB79CD85B5D1CFF534B0CC7F89C41CB4BBD351D8FBA99EC6717A98BCABDEB16D\
+242F4DE41CF5BEBA4BFFFFBE600386FE55CE9F0F:\
+2747D5D76CC1A15D8D410C081DFA56049B7421A90B01EBCDBE9E31B70C61A58E0D2D5985\
+596520528D6C0F64063C3F2386F4ACF2FFF68CBFB8A7C78B97A573FADA6AB69EC728CE77\
+666C89250F9942F80FA653CE60ED9B65949D491A38953C688821A1C4B39F88A72AD5F454\
+4D002456990F1C4F3CE293BDC8DD68BF8E13818A05454565D9B87AA9F4FC906E4AC61A52\
+3C1C65EE7467B498B5A06AF633A37B5287854365DF96A2675A3A454A25A345BC1F9A0375\
+E091C6BC55054E2FCA011B1E3BA1C964A3470DFCAE1A937F1286031FB8435FD7487768DA\
+018E69AD3029A1C6EF4EAFC302EACDCE8A02CC23:\
+80EB0BB542D844F4768820077D8B81C6:E6936F2688231B9B
+
+44F6EF40CB3EEDE73D0BCDEF4009F48EFE4045B1422ACDA5111D1BAAD4827B33B37911FC\
+BB51A9AF5E6E4D675A968F119DE1A64075DC4670B92FB83AD3B44796522B0D8187EDFF98\
+2D38C7E8EB63AD3B838FF50662685D4106BB1E0424B5631ECF069D988C446CD2E97CEFE1\
+A2C3194681873266F5E02C7018715A3DA9CD927FAECB6B8AE6366998141ACF652B49353A\
+8D6B9A6238C331138CDC90659BCADCE15CED1615B96D050250E5196F88F5601F6B538226\
+45825C88580AC543DF13FB4403BD895000A2CAAD12DDEB584D70A0CBB8C029573F5A530F\
+9E5BE2359E6011DDD4FC25E32397CACDE24178D0E0AB186E:\
+3AFAABBA1BA4E009171471B45D465F449D2F0DFE600893F2D60F9BD653B092C7CA980C4A\
+BA1F15C08028835A341C5E59423AF6BA5E6F5B3C34E69CB2CAAB42EE3DF6B1FA10F2A611\
+FB4871AF01815135426D60EB540D13B9058F154D6643FDB28542A079DA0549E9C62BFB6D\
+CF3F6FD40175C86B2CAF712E42538F3B6C5C57024D36AEE3FC93B5E70CACD49776302E51\
+CE84B4075BDA7B37FCD1968A6F561F625B1D32F3652D8A7BEEC11A11CD8737A9C9F87D1A\
+4CCC3F24D201BC8C1CE24589313CB0387C3911C924A572237705774C89840DB93D5BEAC4\
+7F75E04A10839355A775A02FD417FCC2A0BD104E81E3CA40:\
+89D3696A74D8D4A751C1219C3D742DA8:BCA7BD8D3A8B2682
+
+950F2F4CD525EEC6CB634DEE121B847F35D083523526D9E20E329C263EB892E5FF2ED907\
+B354B057101C73C094476768A225268BCAE04C564EEE9EC9D855E478E192A9FC22F12D44\
+0803BC49C5F20683DA0CBB09CF704E4938AD0620A4C40CDA769EA03C236B0DAAAD30B432\
+84486A8D2619E94BD1B79F01B3AD9E70874BD6B929BAB1121FBD585CA2C0D25B799AA487\
+7FDF222097CF0B8CE95593D0CDDACC418FB1734ACC19D365B410DCB94C3E64B11B5E1C61\
+DB6B4BF2E291FE653E2EAA266C3CE7FA16857001FB6C2259BE0A9157F629B6E37BA037EC\
+3A716293AD59C1A254EA4FC60DE1B875F40BB328B5B6CC148D5FF5AF:\
+34E2E8205BC53EDB71913053F33227BD0CE67F1D509A0FFC5F70AE3B59A7226811821797\
+26A242F1AADA28E15C3B04589D5847C762A36A73B7D0696C7393D5AC73DFE5DBA39752C8\
+A06BC4DF90FB52372598B43726849B0907DD640C9D0D4C9990D5F2FDC9F1535400DBB392\
+1C046556B0F8DDF88C46D8D7924E954B177B936EBE1961C89D5616761C51D576D60C22FF\
+8973FD324DD7340B76D11F6612D80AE53CD3E5702AEA0EEEACB6FD21861B68CEF12AB12C\
+AB6BF023D6F6F3771B237A9F68D5516EB85BC0907E947D702AEBF2FD72C196A087EB38AA\
+F77E04BEA1F6798F6EC164BEAFAD1BDD2955B8721AA6717505EAB952:\
+F544BFEBA760D22BBF72BABC88528618:869958C2FDFA5C52
+
+3F20E497CC4C46C5C0B145DC2D1208627A07F0426608F4C240CB2C0E1B78858FA22280BE\
+9DB77EA591738F57ECBB4F242386CDA36E926FDA022400566C2AA3AA885B5AC734DE191B\
+61B66817B9A81D9F9FA9AA5F061E85B75DEED7A7C8E4C047923C6BB484747C0447381452\
+444FDE4658AD1FD3FA214798B4119D0133DA8EEB08E4104F84B4485047E9E48195F4408E\
+3473565036388A53FB9D657A7166DB7FE8F0978F01FC8DB66DFAFFD2E9B9FCFAD241E05F\
+856A512BB70DDF8CB32B34F00A06F7A5547BA92DD905DED80937E3A1478142A549A34B19\
+05A2C0183975E4DE684458DB2F80F39138ADA478D425453909AE585EFA7A91E0:\
+AEB26738E31E6C09771AED38B68F236CC9B3B7C512B16DAE7BB44F2F8ED5BB38FA0FAA8F\
+B4F8C9E3BF003CC4342BCEDB7F978F0383C7677622468E5A4C76F9A91CE4F3C2B26B9547\
+E6384EE50BCA15D22A7EFF7BC69E749AFDF6F0BE7DA7E60BA86C399C34C580E18E5FB35B\
+2D52ABD64A31F508711C5AD753FCC47D38933C581AB33C6F57E90090C7824A345046492A\
+6A94293040ADF91673D8FF6FB1B6C989D0C0A962931504ED2E1E056FAE8EADE632D27B39\
+8D893F2D3B420AAAFCAE4EA0688AB45335BE5E8D5E1A7D70A4C6EF1EDA6BE64AA0CDE393\
+9230E8B027B400CBA2615525C0377E22D5DB9EF150C316680E545B28D5AB02BD:\
+CD3603440E0D4ABFB32196ABAEA29DBD:47D173BB5D14232E
+
+9FF2357073EA8FEB5696460CA5570F82A65C9C8B23CBBDB54161EDF09BBB952A57F9E02A\
+0E60B53B9B29E47F64982A9D3AAF92CECA9B1B4F899C37EC998679E1C6E608FFE780EC78\
+0517AE6EAFE48474BBDBC2F59FE732779AA27380BD7B003F1D9D9977DA835C52A6D67429\
+14276C92689190A1DCE67F31A165A08053063F08C01A5C25B5666540F0802C7F79E64DA6\
+A2E8EE51888918CFA3C5437891E1F7186ACD7B48CC2B7C6E961C95A10121D4B2F20D737F\
+74FE62D4401ABE8EE6EF748D646B02B117885D6F9F7BA65A01307454094C66AF68D25740\
+EE9F45D7B9E12D9FBE44C13D98BBB59FFBBDE75E4E217F9BF794968A4B55F2B16DF6DD40:\
+30E20775061AC476109DEBEEC9CA69882E3F6FF8D05B913CE1ACCCBFADEA87B15AEAB81A\
+8414EEFC3938D0149A0DEBC42E1B3E4CD4D6FA0CA171F7CA194A5F57BC2BA3221E43DE68\
+A269714F5BEDF0F12FA33C456F839D30C4A9C7667273350CAE1E25BF98CDE73BC10FC5B2\
+02F88C7477B2973A077C567DE8408C3FDE4EA6722056D7AA0AABA3E332D53B686423ECC8\
+D8C69524D3E94AE42FE6C70CDFE611C7DA0E300BD81FED416CC0952F008A9F4CC6795D85\
+DD0732228628A8A3266782BFD7E041D6D135C329BF7C02F209EA97C288C613049ADAA270\
+2F654FB81166C23F2EA91FB969679917CDCF22CD878AAFE6E2CD8BCA63468AB745762E7D:\
+7ECC2FA94DB28B0C4CD002EA020B6111:00519E7C6392488A
+
+7E508A73B21580529EF3C160A981240BA4A83989EC072F7F8296DC7DA3B9F785D11FA67D\
+A1843A31BEEDD09919738D6E98AC7F37402FA60968E0EA3890CD0A0238B31AE3A26EF28B\
+AE750FF2451D98D8B405FEC83672C3A531CDEE25AE5566EA23C51CE747CB44092B82AB89\
+D0C3D0731DE92D1C862E50DA27A7024338FD62311DBB7BD2029713263EE16F9FF37EACE7\
+1EE5F25AD185A9E0327173F4287A93BAF814ADAF5AF869F2436BAAD8D8D3EA4908A816FA\
+DEE43AAC1B7E408BC049D2383F91D25D4CFC3537784E0071B5BB1614CE40C8E1EB9FCEF2\
+99C8C10DF96597B10BFF0606CA3CDD6AB72BBF8D4341222E36675360FA3193A0E275C955\
+90056585:\
+A5B2EC64C27DDC68D99C9F82F0833898B11B2355DF8F1CAFA49C4B3D67327A2367AED1C8\
+330F5A700C788529F78AC260E0DB5231DF15E01BB616566CF4E3A64F1F42B503E4240386\
+7EA24A5DBB80E5B6403BAF272BB480E0B39C77E4D092FB8ED54360912930F36B91C94F39\
+689F6571D948D9660CE319E1D72EECC0AF93072417F4A65F0F1823581B9DCF874094E327\
+41BBA233F5A998C1CAEEE53C331BA9F9D437DDBA066160137AC5E7D006DE9EF709B1D033\
+145CE09F1FDDE0C5B278201665BB835726314E1B76E8DE23E4FBE36C22F5D7009E6B7DB7\
+F151DB23CD520666101F7D3F699016CDC3F286402EBAE4F59ABCCC3A86502112935EA87E\
+1A993F6C:\
+0C8D98BEA46840B22546EE369F77CFFB:4FD1822D02B9C1A3
+
+[XTEA/ECB/NoPadding]
+E197D59E064818B7C8AD72C29E227E09:\
+04CD161E422154E5BCA5249582B9D4C0:\
+DD0C8719A8DA117DD9D1DAA189E65654
+
+AE53AA320088B4042EAAEE3649FE6E36445696F01CA40D3C:\
+A3B303C42178F97F719449529D51511491B41EB70E6101C6:\
+D8C8ACF6B4B68A837639320798994979
+
+655A6B1D6970ABA078819E5AE1D08471A0E01E0A5C64E612504F4BD9BE4A8AE8:\
+7DB966E1A2B7C0E8EAA9D308EF89652A5857461D100DD0CEF9C6FE7BB4DFE33A:\
+24059EA6D8A9F0CA678ED6680362596F
+
+F3B1BB81C053DB02A8515885CA6DF124AB04927D2AAF6F0032BF17B4B437E1F2C7D82F89\
+BAD898DF:\
+215D5ABF53C4AA0D7571A0D9D05C3B6D33D65BF35EFFA4778FF59DEE90900ACDD4FC6645\
+368A294F:\
+2434D48F17E0A7D91F255FCE60F3D6EA
+
+06F0A1AD9F9EAA665044D0A2EFA10ABC30F7FBA3FC47C6AE1947B7E9B47733547E5C843D\
+AC59D09393835061D834971E:\
+066309B116A6692F279F2526FD284E75479BF7FB5F63096AD7108CFB0DB39062A2627594\
+F098F0BF5A3B4C67CF29E993:\
+18C1E1EB3925EEC61559DB74EC99491B
+
+2FA1106E95056E070352666F059A72DF6CC949BB3161D5FFD8FE46451444D096BBD606B0\
+BD443189AF001E5BBBA134DB1FEA7AE9B4587438:\
+1DF05B34A733F83B7DA1F194507904CDA99C374174AAB472CC598E06960263BD9DD0EFA2\
+F4C14CC8AF4039A55EC00125766D25FBB7139081:\
+5258617DB39A2968B1EB02565A2BDD1D
+
+E6ABE28FD1E9392CFC65978D586D31D344140673E345D6AA06C75E1C03E4E314831EB94A\
+BCAF6B23F2C34670A79500C6142EE722FD7E408D751DCB30E5C63F5D:\
+3EC6FE802F4EAA740DDF34EB79798F458049FE09190D12455EDD6129BAE85D22FF4E96AE\
+B59DB9413DC24D41730454F65C443C819265B4CDBFB87F5ADDE7F4EA:\
+C4A02982C1291093144C64DA1E7E3D67
+
+213595590E62A55F241E3D4CFCA65C1BA23BF801ED05D25A8FD0A06A9846BE3C28B9BA45\
+A2B32BE80ED468E007EB6EFF0EECDA4460A700977B84464631B642135BAB8519248CA0E0:\
+5A6D52C19193A6C002D58C15BD2490CAA36550B684A726C33F1A12DFA2D4764FB75EA336\
+823833637765F37547103691B852FAB81BBD74EF6C20BB885AC42946998E74D2B8C2BB75:\
+58B61987700468A366178595E20A365A
+
+7DE080A1683521CEAF78AB4C3160D326A07FF4C6F446A94FEADFC0BC8464EB781D743694\
+734C5938F7D2DE4822EFFF34A82EF0C2E11F92CF1E0B2989786FA990DA3AAEC7FC647675\
+024BDB47F20C67A7:\
+1A5002651E1686F56A6BFDD8DC40DA9DCAE7E4773237720BAC8962DC2FEBCAAD885C4A62\
+F13476B303B2700150F5CBA1CA976A753E6971095F175E8BA2D97E1F1C18FEBB0F8658DC\
+E957E65DA18D38D8:\
+75E691CF7E511D4B1A114C0E80BC7C7E
+
+739D59F39F57C04D1450926AD161AE7CF1522C4929CB299C2EE03842E3DA7AFD54AF4DEF\
+19867E278678222C85D8901526E62A008D449478FE4249173B6E80980B9F91D09F7F5CA8\
+A174EC73A57AA878E74F0315B6F3E15C:\
+59E210F2DF601ECB05F4FBAED1077A9AE1B783526DABCB881881BCD103658E03FD6C1D12\
+2508DD039470226BA0AA50AA087D40732D77D137DD2CC96824E24C44BA8955D250297C02\
+E3D444F4F1E78F5A02C50C7314CE356C:\
+5161285DC54A3D9ECB691C0CDF987D33
+
+3A483364A30C28F9B932A11152D741304802030C60453D1E9433823A21F033DF5A6FB43F\
+E9CCB423946DD363F9EEA9F0E60898652E8E4C4B6AB6410B468861CDCE22B3043BBF7252\
+0232EB34D1685274A3FDCBFD9753DAD0AE467CF7EE661145:\
+11AB2B4CC8CC30311EE2B979C6AF90C5EDF073CA2E483C2F0207E8E95AACC55F0120C9B0\
+DC689A2B645EA1560FEBF3D027F0F24E551205091D04A72657209E814A9DAF3457ED9653\
+9FC1CC8937D76E2EB4854313E2C067F86EF889757E014B35:\
+19B8DF4B8C9BEBE46AE4F71FDB4EF5D4
+
+A9E72827F67035507B5F0747149A73AC2763000470087FD6F8F165FCB872AE7BA58CF568\
+E1D70D28891881F0464207E5FF67CD2A707B71286DA7635085B3B68F9228A646A186C8D0\
+9D3E31B56562ACABD0D5AA32F608C54086642AEBB72767643C90B7DC02FF772F:\
+5AC440B8C9AF2D5843B125711F519D34DACF4D86CDBC856933C96D5B3CEA980E9DEC2F0E\
+2BF6E8EEF38214D59B5562324C009953DCCC4ED2D6C6B55211AC5E0EDC7C8AD3F8760823\
+D55365D84525E09DD3145DB6D700D9BAA4A92F38EAAD8CE33000A0ED72A1FEAF:\
+3D29E84526A1D60D177C03632DBF1E96
+
+D24A21AB1ECBCF2EF83A1FCBC1032EED930FE269AFF8EDCFEE26FB1A2DA9D063EAE522E8\
+41024B7FDEDCDD6BAA1126834C996B9FD09654901FA8830C64AB1F5CA3BE896D5E60BE29\
+D08C9E0A4F07956551E618F1FBF46DC8255A4E2F4DC8DE5729CCBB39FAECEA0A4C45F53F\
+CF5C3973:\
+2A2A34F1EB3F99FAFADAE4A68CC85799D9EB7B1F0277E71D56FBC395E3A93980B670D36B\
+87153B90B8154EA962C39A049088665EBFE6D43A5E9A04A93F4D683DD509E27BD3AC659E\
+5AEEE8B62EC3037C425EFEC0E726E8E572017940725A794E58817914308832AB59644B03\
+D1155D33:\
+10E1FEA37BE818FD0CC1421E16A3151F
+
+9CF0C3E72880B2C3FEB787D84866DB80D4B4EFA60E3708CE6FAF0ECC29EDED0C8D9EB269\
+57F1DF63FD39EB11158DD089B9622D161AA83E0BB921067F77D6F4479B17FB9C9F30C4F5\
+6A86EEF38733C8D557053BD4978E41B965CF1F2025402836AC90935E9564BF23F5FC76F2\
+9DDBA491446695A82D54514C:\
+3A8E38AC17AD900742F711491153A7FB93C04F981CF75FB34FC9B28A2C24A81C60AC4585\
+DFE04FC026B6731A8C2404E65DE9FDAFDD32685A3863EC4CC77490F8E0D3ED234152FAEF\
+3C8E1BCE7E4BAFD1171141D5ACE23BB3E5EAB0F20D000371DEF9E831BF716B6AC5EC2313\
+F013766071F3AAD4492FD780:\
+80477A99D76ADDF3DEBEF9E8FF185DFD
+
+C1BB0B801F25223FCDF8CF13251877AA8472CA6924C0F51F1C968E981CFEF665F99EC57E\
+4C33C3B083D7DC62DC0096B062CBB6DDF4D39DC28843A74E81A5F9558FD9F5F74D3857BF\
+01A341BA443A2440C85CF069A757AA0E1ADD2B67860F3BEA805EAE1316BFD5638C312E96\
+614607B5BD816B55FA16C301B71212B5B1203F2B:\
+D481D95387B075DDB6771A669D3E11AC591A629B53405802F016E710D5E919E195A4553C\
+F83337ABBBD506131F363D2BB5A8D3B542AE8A99B4D4641C373BABFE737C14AC6612FE46\
+6D2A83C867F42D4004685B230D3FC1C23D3410D767353A5C523B0B36E0D35D9B3D9605AE\
+9C8402D0F7679A3573F3354E6BE0F2D173355B6B:\
+978393BF38701AE612953AE4C060B632
+
+0C0627A330788002C9DCDFBBF23F46ECFF4CF793D93D934CC553A64ABAD1DEA3710F775C\
+71D54412BB3B6361B54C5E2DE7244CED9B546D146F20D8730FDD8AA155EAFFBEF34C70BE\
+1F6199F67D88186ED039E00BB88B7DD13F071AA4C309CF92C10DE3882674B5C5C5EDB457\
+F826C2D62724E1AD328CC09FB4113E083E4C4D31717FFA66914890CC:\
+5AAE35C53504B9DB9CBD7C00B01AF71772BE3E911DC6EBE45C1EBD331DD81CAAE710F963\
+7B2B22C12BD16B0D84F0B41A59BF169938475F56B57347362C7E6EF4F9ABAEC9F44C3BF1\
+1BC2D02DD0DB00A8DB780A1D1B399C11485EAAE96E1AF12EDF48B4CF6FCCD343F16CD056\
+5E843EB4FE1DFFC1EE2FA8E0F73839D6F6E131442154A4972F552DC4:\
+9A4972A00B5C1B22AA07DA8C1C8B8FF9
+
+F2DF92A7AF36169DF9F2CE6DAAB0788284FEFC9D1C43619FAE6CB75576EE173DA697A01D\
+96835B357C89B737794D0E5B2C7F02F8E5DB968E2D000AFCFDF9B17BFC8383832A2CA177\
+CBE99385C9314F94977350C2D4B4AC6D37E0EC8F36E666C54011B2ABAD25CA922946A7B0\
+C9FB5AAF54D618BBFE59C1751404200BA90051B5E54F64C7045B72B01681FCC6E7763F8B:\
+F090795579AE3AFE49B96ECD3A8C01D449DA8AD81AEABAC135EB9CBB904647D5B1522B20\
+8F325C0597A2294CC1A10164551549B69E96F5AE72DDE9A4656AA533FBD7E98A6E66BE29\
+663176D5621CD21F29494D1CF6D784432B1524BA56BC3E67E9FB4378190268B4DE6BA74B\
+8B2B0E1EA52B75C45FCEA715B8A00B7D2456BCE2B45B192EDC10FE777FE53260F8E25397:\
+8EBCF7F6F9025BD94D2985A4D3982A84
+
+EE4C225C44528549B4F609723FB33467DBF135FAAB3F6C82DD9E3383714F39EBB31FA595\
+850389D1BB1C1E9DDC3D1E0439F21B819B3D294B15EF81EA1E95C36E75D20B4C0D7C3765\
+E97E9A2B9E03B5F5D5705DBB35C241779E232B0781EF9A3F371D89E451DC68F6F7E0AC8A\
+EB7F8E41DEE6A0A86ED9195CCF12BDBD820243865FDD31B8D0F33418023E2089BF65A5C9\
+D20E03DD7D4C8287:\
+355BDD01480727A7496347973315434AFD0D75AC1AAF3869A461F78EF5E5923A7C4F749F\
+7929C497CDCA398F4CA868A860E0296A952BC115C07B38D5460753D134E8111C0C108136\
+154EBC7A386921F754D1F116F474C4B7DC8B5515ECA301E30D1D4661FF2814621C0CE1CE\
+812B317C94EE900FD23FC2D941504B345B5BCB4DF7CC3A01BD3D759E4A7C4C4FA893B6B2\
+30D21FEFFB69C0E4:\
+C2A7EAFAE3BAD26025FBC1EC1F3B1342
+
+FC2B09E77FD6C0DFAFA0EBA6AA058D2357A620E4EFE70E52E8136B5294EBCF97E3DB642E\
+3062EDA1DD93DAF24E97FB14F41C53D38729105BB46DB59507B6152CBF7747537F9FC8A8\
+CDAB5028AEBB26FA8B5E020D7E1D110C159425ADA07B6E2526106DB5C1B4E2F62B5FFDD3\
+98EF3581EEA831FC686389C19E679B394A79D24AA34403BAB37A8B313F82878605E027EE\
+D34926D390BCFBB1E786153B0379C382:\
+F330598D81495B8AEFCBEF71B791A872B394E7A472E4E9E4D4C4DAABF7C2EDA0AF52CC16\
+2FF5001DF22EB012792A509C25566AD0BEBA50529F015CF3C4E6139C80373604EABA6F75\
+93AF87B31E300A3A2C5B9DC10EB36DE921BDF7E5569BFE8A4155F6F5F272846194E0178B\
+228E15DF6787AD158F0907205FA941D76BA4A4F2C121652806B463CC1DB8BDDE50776BBF\
+19577A25A66B4DC3230870963E53A137:\
+86014B66CAE76E61371F64A580B3A3F7
+
+2642676CAE2461ADAADCE76CB12F9BE1A85DA497B5B6FA3FFFDA136E5ED6E53ABE52AA96\
+1D3D12EDA92644D9CCF6EE1C0023744BE75786CE57FCA3102D0E4AEFB3F6CF7E0FC1C74D\
+37DDC4CBF3CD59560DE06209006A55E8C463156B8F1D81C7C9FDC270A39FDBD67F53A196\
+73514569BD75BD747076C2CDBCF51C98995EDFE830CA8372279EA41819DC68ECA82B2476\
+53BA8EB10A8F909A762B74D9D46D7BB3E29C725C74504D0D:\
+20401A5F52C04821DB0609B9113ECE78977DB9A614CAEF283062D84985985C50090D64F5\
+BE66BB90E68D75801900FEBFFEA8BD5790337BB0ED215011E541AE1285FB3B305E05F4A2\
+4E2CD6D3A62EE76CA4DDDD2E371A67E36DEA94EA5C26CA1D1B322F249DAD9C5DE435D770\
+4B4F29A7D960EB9582316EC193C97BB5B64BBB2ADE27F250C2BFBDD48D660825EBE99E75\
+C0E4354E0E5B84338E6361A5C9C368F095D3630C3E9878AD:\
+372ADAC63D66E934514CB2E26B388F25
+
+26BA6EF5054908E2CE4618CFABAF79F8D87DA4605B7F33EFA1C6AA0F039E138CCA821C75\
+F0B2D17E52932B25CDCDE78DA2BC77432786E865CB153E0A0C637E9691D08679075095EA\
+47DC18F40435B2DDD071D066F3B2B792FA528C0A64725F2B07981A2FD91F658C49B75317\
+FB963B2BB68430EC9FAAE98963A8EA85F62AD4F77E115D3FD979DB421A773F2454E6AF49\
+BD950550B126921E2FA581EEDB2387EA285D652DA362BBABE6F7D8454074B6C9:\
+9CD37096F29ED2C56C7D2842883A79D712F6AB9F5F08AED655CFECAA2F482FF470D74597\
+188C280E8FAA0B19B51B56A4A8B2B8E3ACE48927A61787341F5DC153621C14110710895E\
+4AD3886ACE7599919C985C70A8B9A7891FA43D1CDDB30726A2D5027D77386E5E8B80BD7C\
+BCBAA250269C250A8F2276E052A88997182528B947751DECC3E8555A8D4C6D6C223F7B6D\
+431AE2C7931DB88200DA4D987FA0ADDF0C0C8997B7224E06F9701BFAAB2E99CB:\
+B4BB2D7C1DCCF12BF555DFBFF33BFA09
+
+C1EFE0B080811DBEAB17EB4C00E62F695BA71BB8E27006187F6F224F29D83820BEF01EF2\
+6D3CD5FF85CD5B005FF0DE9A8795B20F31E4D98A3BAE15B7BFB60FB8642D77C12E488652\
+A26B5E32116AA0F7177D1E3F46C31DFDF212683B08E84C0EE72A15466974FC5024F3A0FA\
+2061F53AAA86B3A29114D165C150D6FBBF0F07645C91CB5C9EFBCB292ACCF7159203BF83\
+A28FD040E92711854CDB4679A6D885FBADD29438BA11E9ECBA68F8BCD4433F7DCC6C263E\
+41C3E64D:\
+781D45863F3047C63BDB423712F166E4E5D018A6CD05B70E1131622E93BD6E0CB56735B5\
+335001B9B971A671475DF0EDBEC0FAB32DDFD422504A941860C223D86B77EE2A4F7CBC44\
+34738CF7F59059EFC0CFE4693FA9BD553B5EF3C1F311FDB66C8B4117620126768A742278\
+74D9BC89FECA06CEBCEE39528378B1B5915543453E667860D94C0406543B341175650D86\
+5D245225B0964BE723516490D8F908DA7B73A72C790A5B6CD6B980D0FF8DEFE9BE085916\
+3D3527D5:\
+FB8C5F864EAD033E0F3D427E76B5C9F5
+
+B863168DAF023E33D00F90F5BD076FA62F3BFADC93F0A1EE0E1466DC87507BE3E0420F88\
+4D40511F5C1A6DC912E70F33EC90D52E2F98FBE89EF076E3A95CF011F6ABA8A946B409C1\
+96ED86094597D35C548EF84ACAD0CB3E292CFC4D43183F4D97C43BFC5445A5DDF396159F\
+9662D0D844391075E5A209A00CFD49AA86519F7C3DE285D9DD02F3924D0836C725AA0669\
+F3B98C4B42AC893B90F55D4F07B83CAD7F693BF49D72423A369E7FC563D44229CBFB5F7A\
+25EEBB50DBDCA0852851D417:\
+3F22A08DF104CB891887000C0B975296A0A736B7D074739DBB7B16100EC96EA30F84438E\
+3C9B6F38063C2C4FD8B39262D828F000B8176D6793F8537598DA976A29228966AF45F698\
+BE394FD0FBFED864BB1B81BCEF8D9FED2BC7FBECEFC31D319D6C54648C9C0ADBB83B18A5\
+6E8C1D72DB37FD24EABA87F6C9767E3B3FA4566DA71D03539EB8E558390EFB8B1839AFEB\
+E11FCD2F81774674228FB965D4A78164E57F5348DB47E06C0D2507B9738F3750D1780D49\
+E485B9CF89A7C716F9A628AF:\
+4ABBB43F2BF9C69B02AED5D4D82310F2
+
+FB669C4A5B01B8808E3A7A08E47D2ECE63202C4F896402163D88BDE3FA02A0C7EA924B80\
+8AC430A3A157B09FDA1991A18DE25F842E2DD3A221AD2804660791AE592E60D9991C59D6\
+D0E50CA49F1F4FF5AABA0C81DA2C36EC169B420745357B82201009C2E2EF15853C65647F\
+C93B587E25415AAABB8AAA7B441F8E1616A1DDBA24C83935C5A4755C19719837AC1EFC72\
+75B37E264B1AF004513D53BC94BFF7D6763AB8AEA592FFCE8725BF2CC06C711AA2691475\
+CDCDB82A28ABFBB1D166A20D3563B66060699F16:\
+EF73A9BB5596BC30BAF024316E5085A71F83CA9C8BBEBA4C0F5EACE57BD0F19A9688590B\
+4F255E048E90EE2F8316885ABBC82BD6F15FD6AD56C3C58D5FE6BF3BBBC6795E4E9D424E\
+B570CA5775B39EF117F4D0337F88E6B3096F0206F89D01F1EEB39A388F42C44CB03AD06A\
+6A4E914D545499852E2EC5F1F35556515FC7D04E884D48D92BB1ED179C485EE5E5B136F8\
+1BEDF14ABB843AC9292B80440FDB5CDD50EB573C744AF2444BDFFFD785FE3535F698F446\
+B533FECEFC1ADF7752916B2B77C68F1AD08A77B5:\
+8C366409428A56AD49CF09F5C790325F
+
+379AC957E6721F2C33CFA9C8E8FAA85B3AE28E346E99FAFE06C5F2497724D800C332A3DE\
+25424523CBDEBB0EA95AA31C88B8A00ED3CF0E90B42BC1CF690618CC15796E1966AA5706\
+7D5B7E172A1F818C1C7EAF58C27E6EB3F647879E9785FC8362210C8E8C458A60AF1CFDBE\
+F698869E3347645C6D9AE7407F8DC7A1F84B20C1CEB17E33320F9BECC4B3E8E450BE9F59\
+56F74CF33F764526F097DFCB63C57C9798F791B471C494062BB6675C374EA7273E69C12B\
+5349172AEED9C66AF0380490B74F2293AA22DA87976580994A5109B5:\
+7AE8556DD6A8EE6E86499658479AE39CC400452F06071044CD165FF5C2B85FD59DE4BFEC\
+7FBFE20F578C1E21A53BC896D3FE5D77C7F908FA96A68FADA439645F621ACDDD9E2F351F\
+1E4D87BE5BCA2D6C93584DC331DD623925B630EC01C296F64F71DF0DD92232C7B0A0DB82\
+1B1761A442CA73EC3FCBAB386B0FFA35754ED91B113D51CD9239DF73ED46BBE1485075BA\
+AAFAC363F541870AA96EE7F21C4ECDBC0DA9F309B2CAB1C77D6220B2BC9EF5F2319607D7\
+C3D32C9F007C21CCA676872818085C971FFB778138C5398EE372DEC9:\
+0D852CA9C6CB0FA6A95F2B0D414A6F19
+
+84B35BBFE1FFE781B931EEA1556DBA23D38673BB229EDBAAEA95A93736104DF3805D4968\
+95F105FC5433F698CAC70526A74EB67935788C35D87E6ACB63A285999CB981173BA6EB6F\
+8402F89D4D2DBF0A5DE904D5BDFC4864C6E48B906090DC418E9A91BDA8BE63E3CB341B57\
+0EBA6C5095A478C0FF43C062E12FB180D0B74DA39F7B562FFE9F652B3FF4356BA024777A\
+C34D7F84C45FEA5EC21BBAB205C6FF43EC92782BEEFD471DD8703FBD5DE167A829443F5F\
+1EE398475A40049C2AB577B5A6BF2581420F38D22F46142B59C92ED80F44A22A49644843:\
+17B0379B31BE60CD613289C2176135F971DDAAC953B76C8B48BA9FFCA0A040EF00E97A32\
+0FD19C9D4CB269AC205DCEDA98DB7390992FA4FC567DE5A39ACF08DACE83858E03E3BDE0\
+7B75AB74CF4D90DA3FF2B95476F9A81853BFFEBD91450E71E4D5BB5291BEA641F8773611\
+12D65E7578390A71CA8778CFACD4D25F71C90D289AD29045358D1DC8E14983E75CCA03F1\
+2521969916432CB967202086B62B33AFE1FA5B5A68BD4BF19888922F814577ED0E4F09C5\
+0D884A7DAE5B08B2AABFA8FA159BEA131841CB0F3B63F826E36682208F78839D9E84D917:\
+C071C64B7DBA548A42CF9656521425FB
+
+AC1211AABCB5E081D8C95FDD138A42FD6F1D808E37077D65D8FEAC80791E5D169A32B2F3\
+33CED7B84CFA383B430BD7611726230664C2471C0413CE30006872B0707DBDA38F9640D5\
+E376D050DDD5526A3313AD1247B6CE98F1484D9FF0169B7190F8D4CBE10BC03234E3CA25\
+81EEB98DC5969E2EB57A4C5A10DD5B5619D80D5A9B9C3595EAD7E0B5B622A5A2F685D70C\
+D687BEA1876C74A29DE026C1F8F673D66F1171B1633A05393A9896705A8E504BC474083D\
+B285BF8DD893D3D699505345EB97985948DA52A17AEABF279CC28E9793D360E8D707D5C3\
+6C0047BDC6ABE83E:\
+40BF0E1D3B5D92417849BBAE059D7EA6F22D409F5563957BAD0A4398F963AC823AE33A6F\
+6E908AC004E94A5AB9E3E7C4184C94FC90EBFAC6CC70C60FE939453507BB65913FC9A977\
+21A730880EFE22439DF0C516009A06FAE30F6CED63D9CEB707C331D0EDC2945EE3561EDA\
+E176E525E66EEF01E4FE4880F8F7D79A32E45CF71300A262A5F78079C20D7A9EB543D226\
+9579EC077A33EBCFB9289EB85C979951923ED96ADAA2984D6DEB1F5B3FA9CDD859EF877B\
+7594E84B99E3A9D2C8B8F984428D18A1B59EBFB851CB8EF0B4719725CF07D73E580C18B5\
+37BE3AFB34186668:\
+BC12C0EA9A1D8C2F0CA4F4683EFB8E38
+
+2D2E50EFC0C6378E1D6BF584C498600F883CB10A49E27325E20A018B0BB3F192C7462F1C\
+F76636CB86F3CE38DBE3A70502A7A6F72EEFB76990773407DA628C11FBEC2E8478EF2F98\
+F0BEDB6733F695CF0158B8CF5AF6097F84116CDF8B973F3B0A6BC863B12EFCEDF0AD18F4\
+755974E9A05E554654115EA2B309DC37D41B7C1C6686C6470A7A528BFD2E8ECA7E28657A\
+BB5BC34532C38365FA1BA9DAA3CEBC85A9F30195E6D4EB52EF8CD243AE7DB1D082501FCA\
+2A93A4A81C4E1DEF5F4E0625BB088D0B2F4C31DC26561179DC3B46DFCACE0E82CA9A0505\
+8E2118194F6021CFDBE0D8C1D7B6D41B:\
+A6A0348A6F587D6664381AE45F8A0BC69C51F7BF6C26755452CDDB4F1F101EA2224F61BC\
+DBA8E97067DA55F4BF59A5D7CF12ABCF4DF18B92E4B6921569051F5E70F25698FE0D6C19\
+B891B48A3E03EBD7FE4A79A250A8B5FE6662D4430725AC447B55BBDAFB259B323872B4EF\
+BB452FB968E979006EA49A789F4C3743DBC1306AFBF5A4B1F421C99A3AA07A2E98A47B4D\
+AF2204CECB2AA86FB9AB60125AD0CD94C799CF3EBEC65C6F4F2B864C11F513CEA9D6280C\
+DF16B1F0E1F943A444786E1DCB1851681572ACA9571699B82CE9E5275E6999A1EEB599CC\
+8A0583D11D47938324E95B67407A0D68:\
+A114856E299B436E09F437C57B15109B
+
+AFC793265B90D53B647275124998999B3D8C91440541DB7E8CB0E8837AEB4653FC35361B\
+55D659148D9F25E3C109B1BB92C037397DA8F91CD5AF0B6EDE7667BFCF1DDCEE76AE83F1\
+67D937EB67005D48A9503315476A43A45001F621444C562563DE6901E969F6662249A6BD\
+AB7A638405EA3AC01304FD2DB772CC7AC122CD3D65B749A3F31704910950B642C8E5654D\
+C10B07C614C65A07BDE2AB52196999066284CF0F6EB66CD1A62C29B683A436C5BBC15704\
+688BAB92972421903D53F2072F7B8D53B02B70F63E7A7503207360A4872E04CBADBFEB32\
+1BCDDEA5E89419FEDED04000065DF73BE58A79AB5BDF885E:\
+6CAE06C13E54BB2375E3D3C741E9C61D3813AB63CB157E54FAFD28E9A4D935E57D74032E\
+5E669844D277F211B480F0E54E4F0B09C2242FE1D5EEFF32E1313759A47E7450B55E09C4\
+37D1EF3F60A0572134C2D9B5258414BA5D84774D65FE545F1B80E7FC06BD7669D05AFAA2\
+271AEE74F8E0C247070CBA2FFCA62B6CE5BFB0B6E75055F099939AC44FEC6E9A3615FD57\
+B3723119FF14C927BA06DFFA36E91744E035AE7A9F21625D74BB62C41802782201D1043E\
+5B9AE266997FABBB42ED800EA1E2F2A4E78C265E3CBAA9979ED89A8FC6C9F16BC6802A5E\
+7D2D819A7D8357B9C40B5BCC50726EBA3DD0791E11489771:\
+C722C9F2A15369264DB7F54FEB0207B8
+
+936C9695CF82D4241CAEDA1E8C80DA52CA4837BBDD2158E2CCDAA99EFEC6F1FA29D6ADDD\
+6FE3A660F50FC6C2AE456BF742081FB471A317707C523638AA27DD85621CDED72631C469\
+0A857512265A11C283193BE33BBA6E77EACD56E9DF9541BDC3567814E98F0E6D57D9B254\
+40FB7AB62AD9375B2A96F60C4E4B57AD02F62EAA06793D0C5761369447B9A0621EC2F9AF\
+BE8F52E8720CCF67E4A1BC7285463E8DEAADC248CD8207739F04FD13F72E0A7A0CDDD5EA\
+0B7111582A389C21F499BB4349E8BDFAB0925E4C299773A9A546913D37B7951C9052EE94\
+55391880A77CC66F133FB8AF5CBDDB2433F3F9D52F94A15D8A9143D0729F6D60:\
+8144D92331D338C920C0BA0C6B32C6EE28BBCE148F6B56B5D2A12D029734A41B8B4071E4\
+A7601A88E8CEB031DDD38E4588CCAA900E8E23AA1C3D4AAD39FB75B90A8C47ABE3641FC6\
+B04EA1E74FD4B4B9E72310F79D25509B3DCA63BEB093A08F7149A23E0D548DD5C20449C9\
+0FB41C88CBB6D1D51D35DE46D4112090926A7948563487E34E7507CCBA9825BB48EA8709\
+239CB49CBC0FC09447570E1FDE99E1316BC24A5CD38E53F613152BA9BAFEB065AE30CD73\
+DADEF90E4E907C0E55EA0488B9CDD20926B3893D8429E4C9FCEA17087B6933064976F250\
+3ACD2D8D0DF4CF6F10BFEC0C914B0C46E6FF575464FCEB1EDC01AFBE446F77AC:\
+BEF7E425E917D067300D40D19AE12ADE
+
+23D35E037CBBA0A76A46DD433B547E17B54A81782A51D13829BA301250ECBEB0EB598F76\
+BE470D8411E7E58516873B4C9BB87E4B41C4DA3BB941C3F8A9EEFAA507D30948692ADD5E\
+53AF8EF3CE42D6944D8E2994F45F4090B8934BCB09B94B3BF04726F42B00ECF9D9893BAA\
+ABFAF712E022F82317CFEC8AAEB7242BAADEF7526833C2EA481816856BD423CC652CC043\
+01C7212BBE69F251BEBFCACAF0F12A19F99EC4A88E4381403B24322133373ABE881C0F97\
+D706EE4CBF3F5F7E69B8624F50270E508ED0487B0B8116BE1AF904C23B4F704BCB8AF92B\
+118A912B5CD0D759C3F73A6331E1337B693B7EA65A017CB62C51A4E4AC7C6AB9530DE747\
+FFCEF27C:\
+D968A79959F5DCB6486FE846504AC0E8753E56410795AB9637BA84EDD9AFD692DA253ACF\
+DE1FCEF40280D30BAD93AF2386B755835AD1CB18D472DAF37D7C69109DE9898E09C69DD8\
+D5DAD6D6640246B28F905FC0B1329D44E9AD2DD4D5D467862AE364CE7A81D5433B00CAF1\
+1B9A1D7D54910CB2B01888348ED423A2BB40CE0CC23210CE10CB9B123AAA8F41A3B25114\
+398160C0E9241CEF67F52CC419AD31E5E04C4CE91716ED99702AE69E7A1D501C47A53F81\
+E611827C7694E9B4B9446F263FF1170F4CD70B432EFEF97F0916CC6BA81A8E11EC996526\
+E9202F6910FE8A427CD0BC8C7BFA23D0DCE30FDD6C2F36B582A3C9B698BC5CC6CEB3F951\
+B26D586B:\
+19796BDCABF22920277106075D0E0EB0
+
+[XTEA/CTR-BE]
+ABA78D16A7A85065A61F31B9C9CD4053444BA2A36C80E97C4C7BD0956676FA39:\
+4B33050781F6003A1A4CAD8B188DA93FAB60C28BBC1E5D822CF7551986E2A5C2:\
+EC1147D3A4CB70A20AA8664E88E60985:7A38520947DD623F
+
+14E75459D23667074E7A7373034443BB4B2C7CBF90EA1A18D59A93598090D92CAB4F8F15:\
+7C2E05A9570504B7751E4614FECEC7F7449FA1B25895C4435A29AD9DA8AB41A8CF06048A:\
+2FEBE8549A5DDDA945398955CBD4D3E9:2A95AD603EC4B59D
+
+9388E427E80A52FE5EB761560A2494526DDD7B4729FAD683E6C8B57FB46782B9D016AA0D\
+DFC9C313:\
+8020D203BE99C6EA448C64EC4CFC2F02AA220CC6194EAF81D938467E8BB69200B2F67AB6\
+D6CFF596:\
+62F04E49D6CC94750FA5CFC871DBDCCD:25723E1410D2EABC
+
+AE15285DF8745CF588C3D075C545591CE8C87E0840CD8EDC9336ED08E42D2A4A6BA0B7D6\
+045AAB25645208BB:\
+82777E8462001C6BE7990AD149ED8AA462CEF8FAA7F3377CDDF07BC89F0A2EB39439756C\
+31D21E932FEB672A:\
+F7E815767C7D7542BD8F0DB41C8C0E95:8FE94927EEB3ED8F
+
+94E0F6198EC8C7C7DF35262ED38CDFF2D5BC48A1FCA450D250345996EB01BFF3965F221A\
+F4EC43D8CB7FB89ACEB01B1A:\
+8468BE0862149C3CA03983C7AFFF1D61C33FAD83477714CC51D40C6F1F045530E9651757\
+DFFA70BB1C4780D6F44A0E9C:\
+B64DCBD21A7CB07620DEE39C74BD598F:74DFAD2D6C7375BB
+
+FDEBCC1AC9107EDAF4AF10F34B6E1C8EE15797901F35840504754EAB53BE680F30BDD571\
+E9B50289987C6292BF2CA838D932DE34:\
+76F9EC52A2E6C5EB209E7CFB4BD40EA0CAB974068A0CB4C3490349D3024CDC522D11FED4\
+D91D32223FFA8916B39D458999FFF43D:\
+728984B99C7E92CDEB49DE0B3FE42AA8:888F01082B9D2103
+
+9B0E0711E375D8EA9735F98F38C58E9184E66EE71DD12B9E14F80095FFE53C6461A3A362\
+650D150C2FBB6F84DCB0789D6E7CF63D8DA9CD6F:\
+EC83CD5B6D2DD5B438CCFDE65580F1A45053D01E15370119219B39C124A4D99F8EFA44F5\
+001BE7F18C7E0033CB1411AAB97E104196434346:\
+E55ED01805B70BA13D785D8D859F15D8:5C8907CD33AFF98B
+
+22E53F89A5E86CD4A874D5CF372E51362E8F71728FD855730CC87BE1F57EF26577689C1F\
+5390C158B6E1ACDBFF1B5BA5D90D6B4F0C2D484D9F0F513E:\
+33F1FC8F0B7B13EA9F2676597870D55E285F7692B5F89CFCAC80127E5E85D1D3C5D624E2\
+2A4C36066F7EB9AF665AA1C7799863FF3F5EFA3FF027CB9D:\
+1D22726357C301EDA933D7910D3135B4:E046855FFD91DF19
+
+C1EAE81700F699ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212\
+CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC:\
+25226E84529A261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A7\
+2372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D:\
+065EC565D8BC713866CFF86B0ABC2BB1:27100BF3F22105DA
+
+325748DA5C629AFC738D34BF32C84DEB40543C276A3A2C13C6A4BF23B885B6AC348D2746\
+7BA3714BE4FB1B764B81FAD7EE2D062277B4EC428F0A6E6CADAF5EA55860F8AE:\
+A0FD6A60A1B8A729CC52D41FBDB2E5E7896EE8C9944E6E63CD1A769BF278AE2E8CF48115\
+ADEA864B00DC65B950C68D09079CD81D35459F5F483F9040FC38AD50778B4217:\
+6AA995999C4EA6C83070988AC0A795F7:01B5B1C6E92BBEE6
+
+23019A5A7C61262EA124DAB215A517423781B9C1BE56B63E794BE6836026F7CD55531BFC\
+08665896FCC7CCDFDCEA09207A8785C8DCE932A00A5D105A2D6682A32604D1292207F195:\
+47CDB6D6BC25AEBAD70E99524CB0EBCDEB48E0531A35E505FFDA421A1F27ADD6BB9ADC57\
+C3525B989C0C1DCE37577877CE328E6D317D0655DFA80AA8B62273C7AE8DDDE05EECD178:\
+E6D35BBAC75EFAB74AB954C8C2D0D1C7:6582E6C1B4A47B2E
+
+9F8B703434DA473871B05A0D83EC424FFBB0DA17224C95D33178FD28641C1ADE87559E7D\
+ACD11F819CAED832B095F6F804FF63D4E239D620B8E6CE8DF1799D028926A3FFE28BF433\
+664B166A:\
+8E1F3C026E4885E3693FEEFAD56DB8A898269D61CC92CBFA0DE1DA833586619AE9D0B98E\
+54028A2AED24BF2878B1894F4BFE090CF0A7F2627106DC0700F43D31914586DD1A1CD7A1\
+A7F5D82A:\
+3145D3926C22A5AB4BBDCC163CE93E0B:CB8BEA9267176935
+
+4592FFC1D25A2ADCC9FD5DE77DB143AA6E17934FF882E2F8E2BF0D8BFE6DFE10AA33D124\
+199BFAE8D3C2BC2B4B9EB37FC6289C0ED2A6CDDE407F78C035CAAB36653FF686FAC37E51\
+76B3A821E21CF7B1:\
+ADE67B169947C994E246676FB301C44204D8817BC3291DE6F35552E1E8BEFA5763F1C605\
+E2CA7442847030793EF1CD830F7103ECC9928FC98EE4B346872ADADF439464BA40CA0D78\
+63C4C9946E723E71:\
+353358DD5493234F6BE6E3AA3AA4D393:A17467FA740E2541
+
+E3100B239057B16CE51A754047F20D6537DE016ADA61056761C1D9DF3939AC8C0AB155B4\
+2C9C3BCFF3B63BDADD21954C328B4CCA4F1EA6A57EA8B7A99BFCE72E57CA2C87C4ADF0C8\
+44CB76A4B8DA35BD0A3952AA:\
+AEBEC1E382AD5129278CB4C5A67EF92E64BAE93C1F4266FBD40AEEE0E28D5048E81B0CDD\
+2EB7851B7A3CA43BFAB751C54217DE5315D9EBCF94238FBA5A8114C28F1AF6B9110DBC84\
+EF13F621B8690AD7480E9E90:\
+C313724761DEC636790E38D93F299530:90C5A696C66726F2
+
+6FEEE7F77DAE629397B0EEBCE6A4E7CD4FCB4F14EBC408A6798475F3EE5C560F0C38FB0F\
+9D2334E85B75C36632EB4C9ECF80F02B47EC1D589720C104B111197E5CCE4D08441FD98B\
+9D67E108BD5AE4313B5725F7B86BA4E6:\
+F73ED0FABED7812409A04F100F1523DA22E013055537803A3F6B2ABE9479A199B2DF80F3\
+F379640228C47C0475A68A86A455B4E53D2CC078A9EBB04F37764714EE9F0202BF15C393\
+CE87A6E339CD0EA52DA997091383D151:\
+3ED02192D605AB5AAE56CC630BE39141:09808B88D15118CD
+
+CC1B18F695290A169D5DAF220622250E4C3383C871CED8648365EC2DEC9A14D5A522441B\
+35B8AAA51FD6D06EF8E5C8F6A12F8EF068882B826E1B97844F0F088C1214DD1769E6F1B3\
+29CC62FEAE91D1AE9CA752AF80A966AFF9495BD6:\
+D86A1A79CE209972F3F5DCAB0389DBA578CB0EA6FF657E889CF6CF7C30C746131E71927A\
+3CB2DA42A823A19E176510CEFD9AEC30D7F648097AAB847840ED396FDFE4CD1EE0C131C7\
+63C17F551457E5D0D933EC1CD30ADABE4E69298F:\
+E53B03BD00F9E5817BBE38EB1760F950:D559750E3DC7CC19
+
+D150BC8369DC06BA57F7CC241766549A52F2D49D7AAF9CF7D6BE0334FAE2327FCC76104D\
+E5EDF782E32B8CCF92669B62B25FC619DDAB77BF9AEBB2D175530AE97B56BE01065B9532\
+4EAF86AFDDED0C93DE01F139E6B0302DE8F59954F0B20793:\
+16DCB3F6A247FCECB4B5C7790796166540892230E00AACEF9EACE255ADF579F6BBAB2F2C\
+92E8389EC54A6F039963E980550B073C0CEC4FE554B2A23C69776D35AFCD128559104141\
+5CC9A15BD1A4A89AF43F702B06F1807FEA53490B80686A52:\
+48E7EF6FED168BCEC4069E3E622530BF:7C8A47B36E7EC263
+
+1B1508A165845B4EA7692CD8BE5A38B42AB114B9A63E3243D3DC1AEA8D279E2A12BFFED8\
+88B7E4702CD51CE577E04B9E401C1D6ADAC4222FB87A5BC81CA331DE77BE79D3C9287839\
+8752DC9678D5ED422E40B469515A64D1E561DEC0D3599CBB88AD71FB:\
+AD25FC4AACEB3BF13B5620DD0437C0E5EC62869F5C0296C7A0666CFE974603D9509E2980\
+4075560D1674EC8DF26BB7FD8F9438731927DF583D8DEFC45E960F0F03CC71539E56F6F3\
+3FF324F265D4E3596F97630FEA0521C29210830BD5514E8DC390573D:\
+F931CF1396F15FE1FBED7A230961C729:5DC1DA62482AA6EC
+
+969875002E0CF955F29EC9651D8AC98B667A8700E96EAFB42AFEC3EFFC9A219B614BCBF0\
+C32028EA2ADBDDA5D0E3444E1658C7E0CE20362E00EA73B2428027FCA2061CF6B492DECC\
+FCBF06E519D05BCA2282342DED05B0CF2E1E25639F58DCD220922B690C5B5E23:\
+4A1A307B23136A6C15065ABE453209D1B87413260BE453F7231629F99709CC9F56D25FE6\
+D2976B2EB968B83C4F58DD21DDCC0DDB4434633181E4384EFB89EA93B679AFE93C77E477\
+6B28F504514DA0471C49F6E5E40BA90BF167B3849AC6D7D1C05460EB0D262936:\
+238F54FD6D70A8E8E03F305A8136A4C2:9C764FCE696A60F5
+
+0116DE193FF6B1F703B18EDF87610137D14EBC3119A979CECDD460C38A38817CC12FE56D\
+2110442A56A1BFBBBF4A1CF701B502C6D37AD1A6269546E07539FB4EE8612216FD3E69CE\
+47513CDE9AEEA674D6DC1719EB4A08A513DA5CF063CC9C6C037425DF4A44766516E41FAD:\
+05CB3542A26697484D30EE15EAD8DDF8B5D940F5BEC00878DB6FA73D1015B758DA221815\
+AA1FE5F237AC3F9D6A24E946097A9B1F8DB04D5AC68B0B6F164596FD087E06649F05E750\
+3617BBDE7868085FA3053C79A1C878C8FB46CFFF98F782FEECCAADBD93A087497A9355AE:\
+84BFCFD08B09C9515D703EE5F629242E:8B22EEDB409EBD8D
+
+F8810BD894C82BA767986F98DE5CD7E7F9ABF6E82D88AFE84A6735547CBF1E13F285C35F\
+8C5B3DBDCD89D9DDA3AA4CC4C153426E573A585C9A21A77CDC1EC886F64874ECC2482458\
+706366950A1650A30BDDB73F9A619CEDA1B806CED6E1ED00F63650C09490CE87112F1319\
+431FA016:\
+8D2769AC11176C15B77F0CB8A72B34160A1E3939EFFA43E098B50271D9B031FB9F52E6D9\
+49B150AC630B2CFA85072F797C9AEAD9F15735C69274A9BFBFA4BE9E759552B8E02CDF6B\
+F07DDCBD6C5BEE9C01568D6129676D20DE0762C5D466252CB286E0A1B7C1CE6E4BB3FA4D\
+9B56761A:\
+EA279EDFB80A909C95158D9107E7BAB4:3D899C4A9C64C494
+
+E1959869B615E838C4362ABDEB51A3D0BFF2CAC32AF78E27106B1161C5D6A893A5A31B78\
+FA92AC70DC3A9CF68DC62280D963BEE9C04CEA5F1FB32B15582B37FCDAEBA18DA3B22278\
+3D2E7484256508F26BA549AD56AFBA3F5B0161AB6A4A6EFEC326477E92B025FBFD29498D\
+DCE8B9D274DDE71C:\
+95936503497BB10E8C110CF1A819FBB13DB05DA88723055D8CBCFF2B15C8DCDF12BC7810\
+ADD4A82AE8A85DFD6D906B5936189B6F0B18B9979A0C55C08E53BDF37BE251AB364D85D9\
+E94F6AE957131AF7CA475BE7F19954B45CC3C00867B9EB574B614CAD4A66BB505EC9996B\
+7DF9467A39096CC3:\
+09EBFB4079E906C5F8BE9B2041A32305:998215883ADB9F54
+
+8B2999AACD2CA034908EF05C394CCEF00F816E57FCA840C6010760EFCD6E3F3AA088784D\
+530AF024FD9E3BB2B4EBC5223FD3DB3493EB6E2E1876EBBFD4BD0090004ACCEFBF3756BB\
+82CD18EE4CEEF6FBBF09AB0DB0465134E848672FBCA3BBD6CF8AEB684C4A82244D7A5D44\
+468E0F31C41B908989B7EC26:\
+51BF0E20F1FDE6F5B7FD1B72749709999147D80866C7D12E8D37CA2896D67F889FD5510C\
+8F74C62B8D044F552EE7B009F943110CD3EEDACF20DB04F3522434D5BA4E0CCAA29DAE39\
+F18CCA49EE1CBB9515C13FBC38142775ECECD778BE72497487D5A0763F20A6F84BFEA19D\
+4674066E934D8D73ECA96C28:\
+809C0B33709493BA086F146697A9DCD5:F263A312E9A219B9
+
+60C66BE7E8951C3E406F5635AA22FA1869BFC560F337DEB230EC6FBEAF805A778421CFBA\
+07166136F1C1F3AE674F895CE24BEED79C81BED23C320B12C45894AF037CDF91BD540563\
+7772D4BE4B06E72181286194BDA09BA7FE682972E1D8972A09096612114DAA9CABD80816\
+B5C50B2C1644FD6ED8521E7F82540F15:\
+64A20C4BD5F7949AD3583B00651404AAD4496D5C3C39A7D463CE22238A741DE32083AAA2\
+38E3320DE7FE007968BA55B1F14AB1E88064F2C112A0E97C37CDFA9D97355692E0E9552E\
+2A71D22DC2B5866902221B7AF4BA94810E74CD4D6FAA8E57263EA721C2959A240FB33634\
+6C602C177F95B40B11E0DE004CCDF6E8:\
+A794395BE934B5BF5FB38EBA5E0D5406:4ADDE2D9335FFEEB
+
+C37A738A4E6144F1E5EC5B8E1E61C71AA0449D83E3D207136CD63D1A8F978D8D0B00462F\
+3A10B193B2F5445D2BB8F0C71605F277388A23677CCAEF508041C406219D8FFF569E44F2\
+4D4DFD9216D261E244DB588FEDA33EC4B87A5114378984559004ACEE5DDC6C16C2A25D5A\
+FE42C961CD5C418B44E218A749A357351131CCE4:\
+64646829143CB4A25661723F772932F14BF4898344F70EEF3186889849AD9D1D98CB4805\
+26FFE8E7B6AA15F3A9346D10111E79C809FF435EB8851907A90530F2B96A2C0E1E1A2587\
+C8AE735222967BC82A8106C604C9F2FB15E4D7EF3D8F9806455ECA090A0027BA5D2D5228\
+7E0831422377336450F45D268A6D2BDDD474FD84:\
+D9653B71A3003270F83DFC49AA48C8EA:40E4D61971A2D857
+
+2E3ACE745E2D36728751E0A18448971BEDA6F21A742E21DEEE68922E89E85747EA4BCA5A\
+BD903FDD7EF705359E847687C5C132BB2556634DE165F00BA0E4693CF364CB1DC100A073\
+253732050AAF7AD77C2983532908E888A8DAD84E43A4ED29335A5515940177F8325E5D36\
+C6892E42665EEB814E6689F0E06A3C5A69D042F50EAAC4DD:\
+287F31451FB5E6769B3EAAA58506EA403BC6F47DE662BC5BDB558523706DAA72B16174CB\
+F0DAA28C5ECA6EAF37EA0866467A8860ECE342104E63687A2191F2927A0FAA1624BAFFDB\
+8660DB0FA50627509D9AB5AC422ACD521436355FCE9DA020C11D402A02EBB46DA363A799\
+9F348DD815CF60B115166BA82581CC01358B5C7F52401E98:\
+F546A2AD3A1F291A995F4C058D9C9F78:7F993DF4D373BA6F
+
+F51E1F304ACBAA9CA94555934652761CEC135E591492912468C7FBDA2807A61EDABF838F\
+0EB47B99DD441C54A03C65AE73B2343A9E12C6B1B7474BA6E88755C90333110861AECF6E\
+EFE5CBEE18ECF2631FEDDABB3AC0FE36DC66B1E78D8FF5162BC5323F85932B2154089975\
+01E3FC0DAAD12A51AE1F1387C8ED8B132DEF421D0727AFE59788F4D3:\
+BED9B697D1DC34037DFD5245FB74D684103E9F6B649024911976336DF5451443FD4B32A9\
+AD91B2679BC138066DC9BA6C367277EB7A7AC67C505CDDEC6300D26FF5C9E5825420F356\
+532D78080459362399FB9F08684EC2693AACB90382E326431B1AE0822BC6E3C4D67DC93C\
+301951E8635E3A19A71F0EDB63D44E53951B097B5A0FE3681E2A472A:\
+B8A2DACE13F418A8C576AF7F5DC03E79:00C100EEA0489AE9
+
+DD2B20530B72F4E675F1FD7AE4FA8B0EA84B2946F1ADAEBAC8DAE5D1168C4084744F879E\
+EB9507B340EACF728D0D10786A6E8A4408908A6ED0E6198D8D1675C918462B82EA0F544B\
+DB3E194ABDFC9B40E2AC4BE61E907A70352532648C1EB6D72FC114544DB439516DF681F6\
+42D487924ABF0524C068EE4B9E45009BB8E99DE5CA73372A2F7DE78439150ACD:\
+4A4EF7F6C0933D12A4825EF1C293FEE5F95DBC69521323B6BCF527437513B878D0DCC039\
+0708B64CCBB8C3D7D1D1FC574DE35C45C2D48770DA757A65A177F8AC25C3F1F59A848E5F\
+DEDC9ED2801300F1A3ED44EE8A9F5A79924BE7E9FEFBAF6836CF18E6F28DA81F87DD2ECD\
+B48CB009A448172B556D977315F798218EFA44A794F257D250CE73AF151F74B5:\
+3EC3D092356A5B6874DEE6031785E19C:96F16B8BBCECE7FA
+
+5BC87836612D3D7FCBAF662B16924062C237658471CEECC0F1300C84531215406420D7C2\
+02922DF63F6864345581EB8C3345BF47D5FD9769563EAABA49A042A21E1CB39F51165BC8\
+AF5418169C8A0A9222C4A333559CA6F3DAB374D6A342D8AE24E41C51424585520415590D\
+2874F93A7919F2BE0F25438F0953FD3F8FD2804435DBE1190660227330D5B0FB3BBBDDC8:\
+077DFDB7F6E7EDD024C475FD57BFAD68BEDDF0737C1A460A589A8647212A61B33827D953\
+A2FEFC7F48E2979C4DFBD4285D747C52E3CE232FBF2307FF9F04E39C3D817B7402FCE656\
+08E599E37F208BA8684611C8859B2DA1F7F6797DBE58132E0BB143BF990D1D3D8226C2B9\
+F6BC50E8A03DB6C6560582C03A3D68F48E781B054DD69615B5A63B6136F2AB75BB9585F7:\
+11132C6E22979CB5C213191045E750FD:ABDC21EA87125B00
+
+673436400DC4FB49950303A83E0BDF18E477F638B5E768172D86C2223861A86E73A5C423\
+9FF593B84BC3B98B67C56897B6417C9E5BE8ABA361E4EDBFD95DC3B15FE96E51BA717742\
+C449F635C645CC3830CC7EDD36D1D34A1F09C46C33700BBABA29EE856A86BF6D146166CA\
+975B2BCAF3C7E3C6614A03FF47BDB498BF3BDFC328C79228303AFE01BD80FAB8D54A0F2B\
+E38FE911:\
+34723A46EED388E0A273E9DE120946892EEC04EA668325C654F43800D300970DB9009E29\
+9963EB08BDE37E4AAE1B3E540EA2BABE50534B93D3988DD1F93F0E49761D83C3F95EEA97\
+9241A22A80D969ED22D826686BEFF174896D74A1F7000CBD164DFC07B92EB66EDDAD1194\
+309CA143605094BB8C330F31F5232A0A24936594DD4E7BA41E6039A3CAA6205074656CD4\
+ACBEEFBB:\
+6A0DA91DBCA54101F99ACB1362CB882E:7ECFD1F603D67C77
+
+B5FDD61F8E6110D7AF03DBA5AC5342F9119F2CC317F1985CB3305E7DECD07A1787EDBA37\
+BC47AD1329D0752F4400E506A098CC71B83ED798CA67A01863FDDB8BC2952C951B46BE9F\
+8D9F83B7E0FE32F8FF69FAEECD49D2ADFD62C405104DEC61B4C3AFB6088B5369E88D11C4\
+9E7B5F4DBA284CA2BF5846275C5C2DBDFF8EFCB4AEEF12E215AD6423E9D5E6213382D75C\
+27D0E6D14C78FC36:\
+E42423B8CE44B0C3F7BADCC2E0EC469969E9531CDD4A0B7DB8646014A5D4BDAAAE109619\
+8860270A1283724DCE0E886AC9489593FFDB00B478E8D6BEF839DE633D678BA945F26D5E\
+FADD08297AEF5D3618645D200C627D6B6097BE81248B23F825FA4442C34C2F25A1E41D44\
+5E283CA3BB723681E654DCD7932A637834958D0C80DE6AE92D298B72396BBA5119DCD873\
+A403358ED479D453:\
+08AFB509E7385CE045789878C4B13D46:A3E66AF196BDBAE9
+
+CDD81737DA50063D7581BC6FC8918B542E0F161D0D4BA408B5890196320C71DA508651AB\
+850C565105C854872ECD8A336CDDB5511399219D1E15387F21ECE4CE0FD896508D041C3F\
+AAFA75EE42E24B6C5FB45BC7B98FBF17E734FFD7C9E7160571FED42DA5CCE42750D46989\
+CEBC803002B72C14390087AAD352BDA885B771AFF5EAE3E6CF1428AB628F2E792A92DE72\
+C5E0234BF0AE05599A15F829:\
+B492AA4DC9B8C4CB3CE1AE1FB256D0455444D5BA7495BA36D8EA9B6BDC89881C9AE6044E\
+FE078AA9525B71FA983D3DADC6A03B5B1E327262B21718CB7EC11F46E9CD18DD6D94A9C9\
+EA923A459DBC518578D17184C6B19647C6F6FD3A99CD1EA09B97508DDB6B7439FD6308FF\
+E609A7B1660B1399B07F637D7C20B8990A652177A3E634092784A6499A994F7B2644FC1E\
+A597EFB4A4E15F08749E5186:\
+178178B147A4454EBC944527EB05FE22:B3C0BCCC0FC8C398
+
+45A13F4D44F679618C049E0F6451C1DF764CD6975A08ED9FC21B7F60938FAE7EFB90D9C1\
+FC9F6EE0653319532D6E5EF4C91415360C42B13F3E9C4467FB910D617AC9A73EF44AF243\
+75B1E8A7F5A5275E18024276DB173D723B9A834E4549980CCC09D5DC7D9AC3B6967C1127\
+9C3E3847C3D1E9BA98E7F9F577E322C1985E06ABF75557540E676ADC9741DB1C4B078814\
+A62E001C3F98B116E91A6E4601CA5F90:\
+59A7C4B96EE561294D33E83DBBD876250CFDFB91AD6A1F76E112DB95D9F0A2DC1C5BB58C\
+01F650C933C9948A18C879E2115DDCF59499DA33169481A521576695AE9A248A8078F5AD\
+D5DC1E63AD39A001346BA3E3B541A9FB101B327B0DE2363BF17FFDA8CBB33142B58484C9\
+C7D888E0CD7B4482CA3A883930E35D581C755537AD4A7876E1F028C8344BC76ECBBE2AD2\
+5BDE23FE9F5293C414D2FEB1FE94DC1F:\
+0A0035EE3EC39ABDD835B30D054E63CE:6345FFDCAEC79C12
+
+36144BE61EC490E90F95D38A8FA17A2A9C00B4843AA12D8030D01536C349585814E7D280\
+F292BF5C8CF2F4F2E68CB991AB0253045626AF958C5F591FE34515B29694AF39899DC4EA\
+A1B526C3AB2BDFAF51378D0ABE33EC6892EF01D281CD2817112D1FC685C86693A2734C5B\
+5CFCF6C8145C990CAECC9B318EF7F5BE8B6740B280A39FBD8B9ABEC947277779ED62229D\
+2E67EDB26F34A9A72806FE1E93A4E2E2E5D119E1:\
+FFC4706302E667EC36B915B4298BB11B0D2D1FBCB0DA35A12D1255AD4048FF593B880E96\
+C2F9451C8AD38D304148E2DC920E9B26ABA72CC05603C6DFC21CBF7B528142422537CD56\
+4E0877FBABAFDA326B196814DDF9FA8515C91CBA0D45EA8D9550C6B95D8FF35DA3F3A1B3\
+CCA42FEFC562177FAC15DB5279CA50D6A7D342EBA98A426BC7943133F71A97E074AB87F5\
+B30F8F23CD26A8309D78F69D8B39FF2DCC3152F8:\
+EAD6297D0A3A3A8612A17C4C336E19D6:66B556952B67E560
+
+9B46EF1D1046A03836BA53F6EC68FA57B382FAF02606B4F272404C754F368DFFB1225CA6\
+F9A26F22B0554818BB9F784F2AA5368B42E82A4C2C1052F656BD2C0272EDF95D997833EF\
+7D1547E08E407CFBE1C996E9DE05EA5166E1236FD6FBC70A494FCA1A6A17BF4B3AB12E92\
+A78939BDD5A538E55D39E789DCF2F4DF7A8F79452FB4ACEEC4FE364B973357518A79D761\
+10353CE90D48BAB713D7B7D63AE14AFD7913F4EE74F02B51:\
+6E9151C9F82CF529E7A2B63C97E451ACF59CF00971B9789FEA5E8B1FD3071A64B312FA65\
+65A89E42DAD21C9D6BB5197C7C944C69AD6071809316E8BE5B67A775916A7E8B633BE189\
+00DD59D26612FA4624D12AFEC3C1BC39D1C9146761E0B3815889D0B3C37B860D4D56DE04\
+2D163D9F7236D1293B42822870E4797EF63FC00D3A8900E85F5BE156EBF2D97A5B71B56F\
+B0AB95FBA03C4671CBF97B300D4E90569EE9D586A4305533:\
+4E7FC8BD2DCF8D0A6ED122C394D6464F:CE96ED105D3C7931
+
+DD3C2F94FCFD7C101022B328D3F11A81E8A47A9CF36AB9C03AE81433B18581E5B1512417\
+BCE9AE91DFCFDDBC5BD6957FA2602E12223E98122BDF22F0DBBCBBDD4E88CD2A87C0334A\
+B108845CB44ED56BF25FE3C8AF0C1463D2A0C6E149C218B9942C20C4FA5F42CAAE9E0FE1\
+36B238B495FE1BB33EE712CD11FC78E2536D7DA293D5E624BFF86EFFDCBDEB7CCE8B05D7\
+FD4D6D4B926C6234E602D84B3E93FA5078EEA598C3E8CE3CD9BA61C8:\
+C749DB2D42DE856439612BFB902897122B6B57B6E5B3DBE2844312CF131DB3B7B65B4096\
+D1ADA9C665C95ABA1AF299385E8401310FE9A43DCF1D0239F4C88493827F7EAE7FF5B8AA\
+2F7A1F8E42F9D3B90EE84E92B4F136ADFB4D459B22195562AD525F0FF12E64C9072DEFEB\
+31CC0331B7AD8A78DAD43E18BF84A1AC2CEFA4858BA1895A15CD29F4AA29CED0B5D5590B\
+D1AE2DE335E795CF5645FE9F9253077144F30EDEDFBFD93F47DCA24C:\
+911E1A315CD2C8126019607442FD4279:CE1FB0B32F6FB617
+
+FBE74B418AB2B39F83383824C6909FBF0750738CF218EBFE913492E6B458CD25BC79CF2D\
+1BBA62CD4EA9924F13E9BE3CAAE81F9393E1B01C213D13EC7B32D42C4B896614397EBD25\
+960F2543AEB59DAF8E061F80B2D34212202A91D35AB9E9E15F26A8BB1E20E9C8645EF0A4\
+0727C705EA03600CF88F58E2065E920DAAF41779281D02BA70DF465DEC7D34669F6D0D8C\
+527AC7BD9A0EC3519C8DF317A697D4745ED94B13FED3FC8ABCA76D6B4FFC1390:\
+79E20320F675AEDA7E1D50A32C6B6C17F1BE8FE14CA9818C30AE46830A41569059926D7A\
+1C238F7AF469C19705C5EDC127EAFFA45026A39F49A5E71E3034CF4EB738775CCE69ECAF\
+62CE39CEB45D1204709B26F809B53255D1513F3F8100DCE3EC915E162AB17C62EF70D804\
+8C24E2CA11D3958CA9D06A1F16E571CB5BB39B0F28478A68BA51AB7A5C14611DB5781C2F\
+3302A15A7635B60A849D9C0080C62D244FB03670EEC92A4FB403A7BD089027B3:\
+5283BDDEC2CFCE31E61A003516C9D151:7A2E404FB6C3B6BB
+
+5D22783F9FF3BBB0BD89621E7C18E4647BABA0C76563CE14EB2AD5C4F6F51A49C513A4F9\
+C12CEA6B8C24D27BFED626824109E9B39B7468F39FB856D6C3946AC95C1A211FAFB4F767\
+3717EC97182CB9EA000BDE3F2905439EA5F6579FB7E6A0E8BB33D2FA3F02A5D678F1002B\
+4F95B2FD4E1C2559BECFAAF1D712AD4E37F6EB9088F81484ABE54B3A959550A2B41F041D\
+AF19167E394FFB9410D71C2CD90682D0AA6CD22D8244B6C025B1F5E877DE97372286C835:\
+811F5009DE77855B575D9BE64ACD8272699862AEAFC0B6284F4481CFC5FC1D028BA072F6\
+A2398D1DD99A731261C5E4543A0FEB7E089DBC6FA7AE9DA555D0B92A58A4D8B16A39777D\
+3368B6F698144B3E5773EF0501A41EFBFB30A1FFED14E11CAF106AAA515AB9FFF8AD9AD4\
+917155083754A44FAAFE449205D47F5D7296CA3917C575FD3ED10B26FA6A218B00374DFE\
+8EB43AACFC5E7DA3B514CE47AD69016EEBEE87CA8AAD668CA270D6328F7BAF60B0647CAB:\
+D2EE5AD0C6B1277836223D2B8999EF6C:CE3B759B6881D0F0
+
+87719A3ED11A24F7EB0AFCF7743456648E1E6F170A4C98AD8296CCE7DBC9C59F761CF8AE\
+0B7719E42798C45DB57477F8D6640B5BB5A07352DDCF46FAD9CC19FE8304C1000E2B177E\
+A8BB610BDCC989D34BE946F9F37C71BEC8922BB1B067EB8F6FC6295392DAFDCE5CA39419\
+87CF2072853297020A2397A0E1F71FDA7FA381196C942B01A8A3F82874AB7D6AA1BE59A5\
+B9B1FFA357F17302A8E717E0A664400505A183F5D1D89C1E7EDF87713C5C114E10D17412\
+C28AB68E:\
+1E52C0BE4B78C8B45805586FFD14DF7740DE330877913156D11D9185A2414BC5E1317CFF\
+85B416F2882E769B74F974F0161BF7D582D25FAD24820A08A4E1D43D214E8AE6B4EE382D\
+52C4754430628B26A4E5EC17FFD939A45C7C1EDB55329A20B3BDBDE7B62746D04A07CE7E\
+2F28BE210B6B188492719B6044ACDD221A12FE6977369FF0FA5D12E2A5F492A594992BDC\
+E86A62FF3CE6E5A42897830CA156E630EF707705D6BF171C250C965F5563E235E898BA0D\
+B9A30FAF:\
+B793A8EB1336E6F82E4CCBC6A2BABE79:B573079D57C8FEAD
+
+BC5477DFF13EC99549F3DBA37E83231F9182CEC72D1314BD587383E6585BF97CA9FC86BB\
+A7797EA49CEC4C09433946B82962FEEBFBA4DFDEC0BC60B38A9E142C92C0B3906B461D2A\
+AB94321860DF947F584E810D502F84097ACFF6223CF77801C59495ABB52EE88CB775DB7D\
+39D566B9C13DC47127A64A325D7AA12D9B7D63A272B92D2FCA91DF310CC58FFB5CB8B80C\
+F44B5F376AD8D06EB87C262456C10E3091ED47F85F6336F3FCE3BF04C2DB9DC0F622C158\
+0DFB14C9040DE592:\
+F2A1C03F2728F33CC8745FD021011F74D89F8EA351101CDCC26D5B164032E83BC7936562\
+88E124D597BADB78E0A1EE1DA1F2805ACEC4C6F5C45616465735362045C72650E48FE70D\
+8685A2B1F982C059FA7FA04E6FF22AE885BECC2D14F8540884AB6E0C438459E89AC8D4EA\
+C698FC0C516E59ADFE79800C3F49DE880C43E3745F9F3892E9808E24CC65DF92BCFB04EA\
+A60B37D752B73C5DF02EDD4805E5CB14398F2BFC0F15ED5556E653A4FE7643CB609AA7AF\
+839DDBB2772CB327:\
+639366B19DF1C6C56B84341ECF8DC970:874E59C9D25196C8
+
+C55BA1C5035F6D543A356D3FAAE8E8227D29F3D5EE065592F980B8424CED3DEE76749570\
+8C0C720FE6EAC681146ADE443AF03055294294F138275D519E3466D698D8B48AC20164D3\
+9587DD97B26C1B6853B5B274183FC73A810F00F3D748B1E96E0E7B10DA3147DD917B314B\
+8DB75EAE7DAE87210D320BF5BB3E1A44A66761F91235BEED601C87EF419A4F18EBA54CD6\
+634454A5BA0675EF68F22A7DE5592D396A9BCC181AE411E9452F9973E4CC612F72F38CC1\
+0659E477E4293A46A4FD65D6:\
+66F3195F85BB50C69719AB217566E65C682D5571AA5A6A964FC013FCD12C0462124980D7\
+C8E423A9848BC784261924A4B76B8D3D56F2B0E5EA6BABED53C45FC11BD34B32C0AD7219\
+77FA61D896275584EA4AE3587101A5CE90DA4B9E874C1EB239FAFC0DA27487ADD0473591\
+5FAD188519B7C0451BE0CD042944F3E1BDA69C4617A6CA98D22A62DC6F1581983EC1A124\
+E76CF2AD611D7697C8EB76259C679917BF3535A1C04F53082003634F09111FA8467512D1\
+D69840BDA1A1A808B8664A85:\
+AF36BB2B821552C3949B694C33A04716:BCBD3B723C5FAF64
+
+F8F640858D8A5169CFFE6F222302138E35DADF658FA53F9610C4A115F0460E9F44CF0259\
+AAF63714277B493E94FABD920F22E2585D0A3AE55812751A54D3E194E733FB14C6260677\
+E1D8B46F94B69E31B83F6826A93B6821C3F3CC6B64138650CAC4500447083D66422EA346\
+2D978FAA70A5D6369DE9FF066FCCC8AEAAF7C39705A3432C8F69D67179D92893CA230E8C\
+B0FC559E0CBDFF0AFB3108603C2A9786E2E7F6BD965F1098236D9910BF228FC8733F1687\
+27A209F57E7E4C6AF7EF620BB158C864:\
+4CB818690D084522ADD573C3ADCE75D50A65342D16C2BAB23153503E1D163B17E085EE92\
+80DC5C1D19B041B1D9ADC43D2426FDAD9B11B21CAB5E3AFE0FEC9CF3A9117C47F39066D0\
+041A1B7282E10F2F1791E7EEAC1DE2AC70A1A12BE2C646B2113F41216B5DCF6474B9ED8C\
+3AB2D1BE23A5AB533699D876DFD512661D6B18E9F29376AC0A0B12D7B6B2231EAB5D61E7\
+F7ACDA7503FF8E58E320980E83E877738B749C89C626FE24DF12089B973E50815EDB143F\
+21DFBA48C0B70DA7C1DDC43233AEEE35:\
+1CC4ADA25984BFF53CC86C7364278440:C9CB2BDB19911DBD
+
+BB97677E03C9259E9096A6B03EDFF049EF942C5FFEADD4C59B8FCC713E2F42BB547D58D9\
+487FACA73248BE2C38DCEDE9310B7844D68F3D0EFE4E1925433476D1618769306A571E2D\
+4768715398CD560B52CC492213F8BE3DBFFFBF35877061BEE5CEF46A8B8D43FAE2E41623\
+F0DED34DFB8DDE42D7492E75F2329CD4C17A8B86D60AEA10A8C68078955004B8CBE4BD80\
+E61FE9B01B9CA83EB5D902819D4A6D8997B75A7F1E86CABF7A5D7C8C44B93B66F8C80D32\
+A7438900740BDC2F7DEDF4B6E729FD5B8A1C8D5F:\
+B20E712CC5B0041E191ADDC5083A6014104E8DC5021B477CAA5AFA6395B7606E68640FB9\
+EF5E208FCF0515575BEA9C49FEB32749FEF89EB579A869DA3213F5DC86A4AE12CB02BAE9\
+D2F45AAD2B5FDFF1FAFC57AF290B70E47CD00648ADA75BC476D7E048DDE9D138133F081E\
+AA0C1475E0D1260AC0184CEAF6F99CDF5140CBBC282009F72272374E946A26BB2F0214C8\
+D7DB0BF7676CC582C8DB8D14048B99F7C99F550A4B6EC89D1B1D4A067591FD411D206878\
+A5F413F0A3E67671F0FE340811D6A77D55B6096D:\
+37910B573950EFE3AD2AC0F3229F34B8:6DC3FCC797E8B292
+
+0BDF3471B6A535F918863F7C902519F33BF9A613CD5B265C20A4DA957AE43DABA8185A51\
+2C7215D58CE22B24567A986455AF60FF075232B9E540C6ECBFA71BEF3CBA65B275AA1A74\
+C91396CFEDDB7E39D2EB07C407C070CEB3486AD025295BE09FF74DDE2F1DD062EDBC294C\
+CFF0B0B3DA798E435EC727AA17E1088B6F9E2AE415A19F88A87F38B366EA6F3DD01BB05F\
+D65F73F8F97474EE5985400C25CECCBEA9D4F0118F81264933F6A61C307D148C43853C0A\
+5D93DF6EEF2A2206079850A05E08EA9876BA4F6B202E810A:\
+5D5C57860E0F0AF71142FED28B1FC0CEC703D8746AFDF5F93BC9B80F4D0A358A3B74EAF0\
+E128BD14A14A4F85BCF2FB40ECA5083D60473FFF6396C8C718EA44C5E64091F6C268CEE4\
+33D81B139E0532E7684CE4D2392B32383731C04829916A2B73F9FFB7D4BA1B9BC95E9D5B\
+BA4112FD0ABBF2BB0A3C5CD06FBF52CA87E91EF399E051309230BF61F84CAF9476787B59\
+10EC491855020A2838D19313FCCE4893030988162A8873A559522F1D4FA7BCC82183350F\
+31D0BD8CB4C846C72AACDA246330FD4E869D900004A5D655:\
+31AB675C93F77A7F5FE7A829DACD46E4:9200A442F4CFEA07
+
+04DF7F049025BCBD7206B4A12F7E8B599C74A616A91A7B7A10F148DFA5DE56AAD4DA35DC\
+9F7580151EEF0F87FC3E630136AF059FC49AE77AA9809F7019ABC9A409E8EA5801F50671\
+672FB20D5CFB2ACF5B86C7FCA4805AD6864FA0062DBA39CCDB369FC7FC5F19047206A4E0\
+CBA96D0202AEDBBCADF69DFDAB7328FC40DA82491F429AA770E177D775F728FA32AD548E\
+4614162F84FD2EE5B8BEDA5BE1EF85460C4665782F44939DEB7571B6E2598EF78BF0661E\
+5D4E6DA2F493C1D0F2E6073302A19C26F2707BDE2D5A6936CB4F9F6B:\
+1111C0D8F2C9577D3707BC247D460104ADA84F30DFD8A8EDF6478092832F2E35200445B0\
+13BF16A419C6D231A66F34C76C4037C62C377654CACCF9B770F7339CCEA0DACAFF7DFC39\
+3535293E8B347DA29FB207C369853A9E3CD444C67CAECB7AE4DC42B60F3BF0EB2ECEC7A6\
+482F1BB767300C539E8FB9046B31A267D1C9ECBE997EDFEF4B46A0DB501F4FED4F81C99D\
+C15FEF56D4A7ADCAD808F8C6B16A4F62CC0A4C39F57BAEB0914F829E1D4E4B72D93D8167\
+BC3CAC068C327AF3D7C887B65B3400FC4C6E6400326945F7079C6EF5:\
+EB2BC3806990CEC6A01D863E1AA28056:7056216A1187E1C8
+
+963524B3D92412DF49F8DF7CA10032FE6C56ABD03866ACCAFA9E45FDBA070FF683A52960\
+6900F1C7ECD437B56A74390858E4D3276DC8DCD04215470C0AC21611D8EC1EA9EF8E5120\
+06D876420F139007ABEE1397247BEB37DC37CD237E3909C75D576D8D37B5FF9F7B078D62\
+79A3B0500F308F991256394F78B7616B28CC6A622A98B43A9531BA25917F6D7BDFCA5FA1\
+9DA4F372AA871C7F253C065A4F923E734740A5534474B5B661164B00605430FD112B197B\
+8570D27A3B44A4C367471FC58F533146305CAE20D15DFD9539FA4C6920F09F73:\
+36FA83EAE79BCF08ED631AFA6C0619ABBC6731051763B61D2EA51B5D859E5069B0FFB480\
+1EFE8DC3EA79D9AAB849B98F0DC180C3A7BE4237A0283372B235553692A926F8C20B9466\
+935B5CF7254496FEE811BE2406563345C16ED4D37A1609683B3216DA5D01CEF1E2C0CC30\
+537AC8A9ADB668C0A8D7DE1EA14AD9619A064B1D9C11B8A224D76ED68838EBCA0D323D80\
+1E293EB2AB9D2F64F3C1B4588CBE074446A0EFE77C5E58F3715691FF50056B047444784C\
+154E230AB3C27A36DA7E61DB7774C9B402536013DF4DA7895E51AF1933A458E1:\
+7FD1AB8DDB8343643C4DB7D90BE1F9C1:F6CD6CE2D5F1DB56
+
+C1EA094DE4B8DF3E530F4E75E08DC4793EB744FADB50E94D0C360CA08FD184E5B6E8B685\
+489335C6173CA117F2CF638CDCFF0F0E3329C36125D8780F4589EB76EF76AD722A359C84\
+632865A5ABC386F838EE6DA8E6DD96B6DD53C3AF3EF08315B71E53E442893EAEEF6D0022\
+AFC7D08DAD0DB051CD709608ADF4CE94988476CA95EEDF3CA63328B0EAB1211082655417\
+2E3F2ECE07C25C62992E81985B9B1D9E3186AC83B167D206EA7B180A656BB4A8C5F09DE3\
+9B2ECDBA96E1354706449717BF720E9F756FDF4074FA9F5B3C0016E32B94AAAB9484295E:\
+E66888E7F4A179F83B178AB7409D2C82E014922644F2276D4C308EAEB9A9F42F4062EB1B\
+DB77EDA72C4EE499CD970F1583F284523D375C33D5AFE5264220339604B46FEC19BF61C0\
+E7B07F7B710815801B02A4CAE2BF77F28A0EAAA026D1136580FE1B8AD1B1C40DB1A23FF7\
+878531DFE96B18EFB5CDC34198D23A22F005DD7DFEB91359DBC3BCB1E840A71EBF85DD94\
+663A906C315A1EAEA2E5FD673BB56B23B98D2F54AAF3E82370D75417DAA68C05CDFD15C9\
+592FB9BE87B5C37476A2559E56C4D95834C48ED6B6B0E4661A6F8017A358D0DDC9FF3080:\
+F674FCB74F8175532C3B888AA1F685A1:FD402E1071C463B0
+
+47F823E98A8F3DC6E872A177EEEF167E82D23862AD0C28E8C2172EE541F28863A5530EC4\
+2EE5E6462A467BAB8372BE75990369F8FC299C13729CB508332906671E0F8BF40A82E865\
+51E9CA7FEB3E0FCF8BDD5EA5539756802A450D09637978E91A2DD4843DDCCA8C63EDCAD0\
+2B3AA18744FEF1C78D9618686E4B5A84E00069328F1988CE852AC7B17E2DC24280502154\
+D9B1604654CB54EA5E4D069643D6A43D988555AE9CCDF057F896CDB600ECA135406B5115\
+8694ED6C8BCC898E2E4335A9432157D306E12C77059CD3B296FD9C9A225719861D042ED7\
+26BE7302:\
+42300596CBD9EC098AAC697D227058DF9A88051904604063E95C509F9F03869C68AAEC10\
+63701259BD652E9AB275F07BFE164057367A74EED02C72A96B3673ED0510B782E6F4603B\
+ADA717221EDF098D13EFC76A41CF6261D36C64D7B747303B601B3114EA603F9BA42C12C3\
+B89642DF4AE2797569B8798604FCE8BC7906F09310858209A4F678748610DB9DFF24BE79\
+D3D5D41A4F0A449A7EA03628959E5D44B801048BD685A7541D57E9AEFD215D45227276BA\
+6B737908C2AB5066CD3FD555A69729B711ABC683E7236B3D0D82F112888006D30CB1DDC9\
+FD680FDC:\
+68101E5C1C4C16FBD08F90DD040E222A:F2B05714F3B87180
+
+1D4C4CF8F819F57243A3CED7F2D8A284AF2588B0C808141A698C1C2C6B7470659344245A\
+D162D527A3E221AC8822668541D10A536B015E8AA35268321144D6D84A199FC147E12028\
+A3DA9171E8705CD65A54210ED4EAE211AB1F864383A2A9AA014E62ED69C60DC32B540126\
+71313B45319CAD64B0B26DDF9AA48E5D0AFBEA3EE2821459CBA5F4FCD798A8647526CF36\
+55E0421EAB46B558B57646C56DF3F6C62B92E8BA3D818811CE7BFF4975AE434B23E095F5\
+942827ECFDE9954C6823FD5198E0002E189C63006914672B08A61012FA7A37A800BCFB3E\
+C845D179DC210044:\
+1B98BAFD01369C2CDB5004819CA0E2075860A4543B1A6564B32F097C382F944436065859\
+9A71C29CE4791683E436DB052DAB361A68D6DBBE3587AB2F6AF60A102B59FB62DE152DCE\
+0737B968750174D95854AF51C95473D17060082051DCEC1766DCEFAEB2B0754D9B95980F\
+143DE1D6676DEB9FD6EEBD01652B4166072974DEB8F26CEE33D918CCCCFB915253797984\
+5E86428145E9225F69BFA8FDFCFFC80CDB0274B48522195CFA77F33328E472FD767B6C3F\
+F39B66CC42363018E38CFE221039EE5065B7A64FEFFAA441B6E87003DF7C60790B9CC46B\
+A6ACC7557609BD9D:\
+CE1972241FA1F27CF1AEE36A51432732:4DEDE955E0196744
+
+2089A7FDB2728AEE9D176E603055E77ADBF6861C98A185B642BF02C04DAB8226570F746B\
+66C1AB8271FF590CC51A89E93F9C6108EA593F9135AE64CA62C11E165924C4734332BC34\
+C090E7383E7E1108392CBDC103C4BB847C443F7951F17AF7C610CA07889FFCB27B40AC17\
+F8E0594D6DEB391E3D6132C3998CF6F707CDABC13CB702F7F0E97F266175F0C1282682EC\
+FAC95C8A709CC3092010D48F58DF41DB72E04013C5B5323155CD2D9720E0D40B13BEBB08\
+1F97310FDEE5D00FCD7B5E5C7FEAA2A4FB756916FEFE38DC0025CE7381D83E52DE05B09B\
+1273FE3B16BE372DF94FDA35:\
+7DEC8416E69DCED8D5B6CC3B831307AFC33FECE9A0567DEE0A5999C804CF01FBC19AC1B8\
+555223D3DBE6CA50BB096A7A87ACAB5A5F0ABEB3111E98FBC09897708A18481B51EA78BF\
+E3CCB5AFFBA10F4B980E313E3ABE98EA7E13E38282778514F70D16F7940B6E382AA77BFB\
+4044D6F8EB9D95DA97A142DFC876746FB8338200787D3FA27905E57FCF861BFC8478745C\
+7C2DACC162115E5AFBC80917ABC5358957ECBB65B593010177CB1CE947235A94721541F9\
+0349011188A860D1D23CDD64C3B8D101A87114803690788337CC075B1D37DD21097FC730\
+E528D94FCDD4BE1E9D8FF00F:\
+17192110F1F1B1279CD586D5FAE45F4A:A01800F5D6B63103
+
+6AB1E72EE86035D1E1E92B3E79DCE8E72C77E3AE2C4C17A345CE25C373C5B95833DF02C1\
+F34ED2FAC60F6EA77762C8F01AB976DCD2F24BD46136314AFC6F1336032ADCBEB1642A7B\
+46C8CC6B122D67C1EF3E578B6B4AADD9CC655FF37C2D7B5CD3878C32C3D5B0455A2C1DC9\
+FF743EF2ABBEFE2D8214D48413032133D821AB161F300CBEFFF376EEC0051D4A769F5203\
+E87B99DE52EB687EC12D747F2E55B84FF377F88E3F9B72900BD7A8B18E970FFD41BEECE4\
+D1978F25411B7EF8991122C4B4444F1FEB3E88A89E48B3CB721A62EAF0784CA549445852\
+10A91A593E2E3A02063D1F76BA62B997:\
+0D6121F6EC196C1AC20C818918A2F2683877EEE0189D94511CDEB2755D203F75851FBE49\
+8818C6013098FF6200E2262328B8084144CD2782DB5BD5C51E64B3FCC2F2D789B9CE3899\
+29E72BB65A264EB554213AB772140D7BBDAFFC818B2D6D0BF4ECBAD5E984BC17C1E7EB6B\
+1D435B92B2E1C5A8867233DD9534F3898C7F64E1DF8828BB765E382F9E2A46B5FC9C3802\
+2E1E5C7D09E791E187073DDB688921D22172AE4C972B1B6F802D4FD75A997803B9B87E9D\
+F2CBAE978C3E6E1FF18AC8D56CDEA3B9B1E9DAA74EF3FEFB018EBD9902AD4ADDC67BF010\
+0D9335569D6499563010DD12DD3E23C6:\
+190834E408E085E8CC3793E57146FEC8:1DD4835D46E42E15
+
+12025BA46EB9326EB77DD3729B51E1A2E845C031B89DA66B8D73C02AD33263522AF4B92C\
+B5CB4BB254057012033B4D8A147AF3DDE90B7951DC0FBAF0C98D4530A367E945D6BA4C54\
+F57E9986A2452AFDDC8D64550823487168529B5D970A6CA0FB5A8B73D4E9576EA334E418\
+75DDB2955C1E81A8DBCFEAFE660C9A594AA169FDC78AB03783738175B4C974E28F8DC593\
+782C9AB44DBD49934C3AFA35E12A8ACE7F02A469B1A7847461D00B85D34BA01858B624B2\
+A50F192DBF4B7ACE9082FB2BD4B9E4C39CA49300FA69D3C1755B839C90184F7BFD322CEC\
+78F8221B0A9BAF3845AFE7447477EE4B1623B384:\
+6BF880E9AC252DA1FD73270B64018ECCEB005CCC89AC7D48B48A5E61F15D21F5524B0057\
+136BB21FBF084BB16B1E5D09C8BF6082AC285120945B63522255C943D137F76804F5B6B5\
+26459E9FA64B3B5CE1B2AEE7BBF621B864F42556E0251FC8829B536F565E929B5C61CB72\
+EEE11961B52A956E4B2D3BA81124952F6FD8B4EAB170544D0ACDD2D97977328549F851E8\
+9EFFDA3057D193189EFA71B60100C4719CF0D83132327828C48E452ED59EF0709F295349\
+E1141B003BC688800C86F3B778A18678403BA35309373967AD8B6F5B225B85D2F0C16C1D\
+5A155023A0010BD0FE1EF31139F18FF8CD9606C5:\
+B7029C1C72337170854CAEE83C38A031:DF167881D0D693C5
+
+79E97D129AD18FC0B12C3CB00C872794D8AA7647BD743E507E0A67C0434BC32E58AF6F72\
+0668DC6FBB1CA58A0774F01AD16AD46A83A6A493719DE8D88B709632DD1BE56238F6C95A\
+599CC92B9B84EC18C43E2598C752BB9E2DD1AC58395A8278876AFE7F152F72934B903FD2\
+3BC1F76718A3518DB74DD8CE3E41918E62133B99742A5869450B09854ABA3E9466B7C44C\
+ADF80E126CBA30CD6117755701F6F5FAD161159425B197C4B9804B5A7940627D2A2257CC\
+D7645512002C4C5B09BC0DD4919AE3C96F70FAEEDD4E48CBBFAA2791109F2288B641F3AD\
+145B37EE68EA0CDE249F1669604E8B717A5D247A8BB25AEE:\
+7C5B40D0A68AFF288C04331EE8EDC20CCDC98512858E54C8888DBFD550231D7463F1BC49\
+3C23C9FCB93EE65F025ED0A0F470DA7E15A97B900F64D225B71D7C8CE6511A4B74EB0A7A\
+FE7E4EAD04517198635BEB48FE2C41D6552AD5DD48936CBDFBC9CDFC35248AF5BD85360D\
+D8A3BBF4CA4E87D6E345094CF9AC5725E32736B2AD12C0FDB4E9382372FEB011F6F7D222\
+175A92698D1D74B3795EA05C99DB64FD6E439B5DCF85859CB4D9398072C8843BA1D1F650\
+D5F2E2E2BAF2F1C3A66A10BFA879FFBF6203118771CF893982AA710C67C2347A8ABFD74E\
+B814400C306BB95458FF3EF850DA5E0300A1ED39A1B5611C:\
+F7430DF9CCACB9230AD4BC7AC46B52F0:F9059FC6D69FE7A7
+
+57097A044B43E7A3E111EA95D9111CB2B7440A54A834416FE02A4F34C4C8C34741CB340C\
+F66750A9683E23DADFA23320EC4E0A0BBE692A8A2F816863BB078D7FCF6C056D5F2E8169\
+CD639B148A779618C32901CF37B85DEEE483DC0F30B522504070602CF032EB17CC48232F\
+86FECA67B63D06F0B25C717A62676B26DE840AEE70D39432567EA2868ABBE2EFEAED6E41\
+7BB02E0A2E9C30D7FF850503380343838E7EB155E1901547BCE29254F27DD1979C2608AF\
+0EE05696D5F3D3F678FD457AFB048E41CA852129B5D78A619231B60DE4E19B60E2F699CF\
+09E832CE02EB63543C02523C092B34FCFA10BF9BFD9E32766E412A27:\
+BEDB29A971B27E7959B48857AD56DC1FF2776EC258646F26C935928D4B1F0B874F0F34B1\
+6C5E1936D6F5E2263119EA967A9C441F016431059CF8B54CB1AF52A7BBD1D5F9C378E302\
+FB9C9910742D7E5FE8777F2F5D976A569D54CD54F37524A0FB9CB5BF5EA17763171F52D2\
+C823C1E12A99C2196C45FCB1AE3FF170B05D5EBF8EDAD51D7FAB7B6357B84AFFA19DF67A\
+DAE39C964CAA610889E1C79218C38762B7A4B522132D9F9235CCF8F8D810BC9D7EA44C77\
+599DCFD1404EC6BB219D1F1916C0685B23D79E57A280A1D3FF5356F948F15889527C4235\
+8A137CBDAF7ACD8750D5D317F295B821E450C7114279FEFFAB4121A7:\
+500E05FC7472AE721E0B9DF4629EE350:A791B3A28B063D6D
+
+AF72E9E989D375EF3D4B16E56B025B0B5E3732337894E5E5AA08D9763E905C625B782AF0\
+530E2E3C8BF1D3F336BD13208FC0A1D7F0A8BB91E3FCD7C9E45541C29809C8F7589042CB\
+AF994C56F5F96F10E2140AF452D376B5DBBA2C72542E1E59D63C99E08334ED6A82605737\
+236D4AABBD45A92610AF0C2852B2A63CE0A0C8D1D281D1002C8C37942791684475B10C1B\
+B81E8CC3E7CA9CA1BE881113AEE41857F25E5C6D404F903E93F16BF912D767ED6AD2604A\
+C8AA5937303699168D8B034DE7B15F25DD25002E22E7DF90B636457FD62E83731675E32F\
+6052BF1BEEADC5E65F1B2831A2702B0377816792EE9DFE04BC6410E9C597B633:\
+936EDF889D6629BC65F387545190C03C4AEF91B9A8A13E4E51B02A9DCAFE990CA303DD9F\
+F81EF1C83754657D4C2CD8A89BB5345DD280376FF8996F2204BF1ECADF126D992172CF45\
+2A5999C1CAA455A0AF9EAE12D8B5B8CB4992F215707542625DACB4C460ABE2A97B804ABA\
+14F365C4A99EBB92FE4174A59D74C0D942D75F920E46264D3FB929C60ACE11F4982F6E5C\
+DFC8AE73DCA838021D898E22916333075268A29D8BABC2A78AE5E54BC51791679203B812\
+C4CAC0A4251224C4E509F6677FB140B557665BD85AC3B3EF2D204129A84344654D6AEC97\
+A27C8FBE1D5FBFA272AB20615D2B97A31AD82D92F6457BD8B7A35A98CF8D8384:\
+19740BD949A0AAF7A2908411B588E75D:D0CB88F836751471
+
+5C679ED0A8FA89F7763427FCEABFF3640D680E74B633889AF857418D8142B83322A084AA\
+E7521A5DFFF2C8F05A345D05359BFA873E24CE2259F98B9F40615F3CFAE9736629C988BE\
+0949924060A5A85A59BA733FD75F53F991EA3D37D9C53C58C4999F380DE813B73342F427\
+39B169AA3568834F3D3A8AC0912AF8E3F116B602DE32760D5F1A4DBF7F71F783E41A3AD2\
+73E54B76E4A6439C9739210F5A2B5FAE2806AB5811D22B8F5B5CF68E80B2921F2980C285\
+8861A66619CDBE4BA9A3B2F6094C9774B5F9C07D8B99BEE0E4FE02E0082ECD24497236C8\
+621A413E2F3DEE93F38E98DE28B95B621E8DA964C7419AB2DB4FBB5ECF3A9637697D35AF:\
+C5C9D588A11FC4EE03A6C8AC33064C73DCA48BF7C3813EDB9495FE0DEA94FE7F60B5E491\
+E802A06CD0593FB8169230144BED6A76CB353C564DFFEEC8793F28E659127CC9F4C25D33\
+1A0718AA2A91B463A3A686DA4A037C4217EAF907B70916A70229EFF66118D932F1EDAE98\
+7CAF21EA174582ECD8CBEFE7A3CE1F2683B408F56A6855A56BB9C8CA9F8B334F1C9F03D6\
+8D69CF500C0AAA729D0E7D8C40B9199D9A8484EA45F7A483E8052DF531541DD3E354A31D\
+7B2AC271A045A72AF306163DF714438930D6B16D15A1E0132804DF1A94C2CCE769FE37B2\
+0E84E147748653A2F4F6EB228AE7C1AD6BAEEC853F17C1AEF07756C42E2C09AD84538D26:\
+8CBEA7813B209C17DE9441053D8CF013:DB8858BD18B36B06
+
+CBCB57CFD5F6E8E9FD5F987FB13C1ED23EDF09C2929F7C01FF6D4B0AE61E4F1B3A5CED6A\
+CBEEDF34831C96B9CAF72C2551BF6011A432DD25540EDD5C75E1018F34846404A912F23F\
+580BFFFFAF8CEB875E7274021B5E2B47F794ADB79699D3D1C6D26E0BF46203C3D4422754\
+6056CC2708224FF3FF9C5463733F41E10804A4F05F8DB4B2FF72B96BB4CF240A2EF2FBDA\
+20E7C91BD7D4E1F7F322533A03F3368A88DD08C36F21EB76CD59AA5C0C3E2537F7283B6D\
+42F6D24B8979246FB8970B6705B755D5EDEE4D7F71DF1595F9953E954D0775DAE56F1840\
+09764B5DF00C136920F887F4D78E8932E671455F98280317FAC41C0F5050E4A1CBB7CE46\
+0FE75EF9:\
+E5F790088393EC494F34AF1B4BE73B63666874BF31D74D64C749A0DD067F6BEC681AA339\
+6CCFFEB2E30572C7F9975727EF566827E98CBA94093499E4F666DF3BE4CECBB861AE5BBA\
+78D67B6686690A5A5069D47B1D3757F6BFD28F734A06F9E37980C574D2975F0A9925CA94\
+88A11926DB59F3B00639DF25C3FEC100688AA640AC67C9788103A9BB85D53E2420AB3374\
+953F00D49217A1AB8883B71D46D361E245C6F0A5F68A6154DD94D8380FA853F6517B7162\
+78F3CE4C75ADBB27B9F774C2FB749DA9FF98E1E52FA2C0B4746502BF360E77B56E623667\
+395A59F4FCC2EFF4D1C2476B014785404F62AC1570C464BB0DBDB3A767A2D8105BEB8955\
+1356289B:\
+281866EA198A1CEAD6E334039B2CA436:F8E76A4A26185CE7
+
# MARKER: Stream Ciphers
# Stream cipher format is plaintext:ciphertext:key
diff --git a/configure.py b/configure.py
index 1d7e1451d..be5cf7ad2 100755
--- a/configure.py
+++ b/configure.py
@@ -37,9 +37,9 @@ class BuildConfigurationInformation(object):
"""
version_major = 1
version_minor = 9
- version_patch = 1
- version_so_patch = 1
- version_suffix = '-rc1'
+ version_patch = 2
+ version_so_patch = 2
+ version_suffix = '-dev'
version_string = '%d.%d.%d%s' % (
version_major, version_minor, version_patch, version_suffix)
@@ -357,8 +357,7 @@ class ModuleInfo(object):
lex_me_harder(infofile, self,
['add', 'requires', 'os', 'arch', 'cc', 'libs'],
- { 'realname': '<UNKNOWN>',
- 'load_on': 'auto',
+ { 'load_on': 'auto',
'define': None,
'modset': None,
'uses_tr1': 'false',
@@ -425,8 +424,7 @@ class ArchInfo(object):
def __init__(self, infofile):
lex_me_harder(infofile, self,
['aliases', 'submodels', 'submodel_aliases'],
- { 'realname': '<UNKNOWN>',
- 'default_submodel': None,
+ { 'default_submodel': None,
'endian': None,
'unaligned': 'no'
})
@@ -471,8 +469,7 @@ class CompilerInfo(object):
def __init__(self, infofile):
lex_me_harder(infofile, self,
['so_link_flags', 'mach_opt', 'mach_abi_linking'],
- { 'realname': '<UNKNOWN>',
- 'binary_name': None,
+ { 'binary_name': None,
'macro_name': None,
'compile_option': '-c ',
'output_to_option': '-o ',
@@ -572,8 +569,7 @@ class OsInfo(object):
def __init__(self, infofile):
lex_me_harder(infofile, self,
['aliases', 'target_features', 'supports_shared'],
- { 'realname': '<UNKNOWN>',
- 'os_type': None,
+ { 'os_type': None,
'obj_suffix': 'o',
'so_suffix': 'so',
'static_suffix': 'a',
@@ -600,7 +596,15 @@ class OsInfo(object):
['TARGET_OS_HAS_' + feat.upper()
for feat in self.target_features]
+def fixup_proc_name(proc):
+ proc = proc.lower().replace(' ', '')
+ for junk in ['(tm)', '(r)']:
+ proc = proc.replace(junk, '')
+ return proc
+
def canon_processor(archinfo, proc):
+ proc = fixup_proc_name(proc)
+
for ainfo in archinfo.values():
if ainfo.basename == proc or proc in ainfo.aliases:
return (ainfo.basename, ainfo.basename)
@@ -617,12 +621,7 @@ def guess_processor(archinfo):
if base_proc == '':
raise Exception('Could not determine target CPU; set with --cpu')
- full_proc = platform.processor().lower().replace(' ', '')
- for junk in ['(tm)', '(r)']:
- full_proc = full_proc.replace(junk, '')
-
- if full_proc == '':
- full_proc = base_proc
+ full_proc = fixup_proc_name(platform.processor()) or base_proc
for ainfo in archinfo.values():
if ainfo.basename == base_proc or base_proc in ainfo.aliases:
@@ -830,8 +829,7 @@ def create_template_vars(build_config, options, modules, cc, arch, osinfo):
'doc_files': makefile_list(build_config.doc_files()),
- 'mod_list': '\n'.join(['%s (%s)' % (m.basename, m.realname)
- for m in sorted(modules)]),
+ 'mod_list': '\n'.join(sorted([m.basename for m in modules])),
'python_version': '.'.join(map(str, sys.version_info[0:2]))
}
@@ -1186,7 +1184,7 @@ if __name__ == '__main__':
main()
except Exception, e:
print >>sys.stderr, e
- import traceback
- traceback.print_exc(file=sys.stderr)
+ #import traceback
+ #traceback.print_exc(file=sys.stderr)
sys.exit(1)
sys.exit(0)
diff --git a/doc/examples/GNUmakefile b/doc/examples/GNUmakefile
index d854c81d8..44fcfeea5 100644
--- a/doc/examples/GNUmakefile
+++ b/doc/examples/GNUmakefile
@@ -2,8 +2,8 @@
BOTAN_CONFIG = botan-config
CXX = g++
-CFLAGS = -O2 -ansi -W -Wall $(shell $(BOTAN_CONFIG) --cflags)
-LIBS = $(shell $(BOTAN_CONFIG) --libs)
+CFLAGS = -O2 -ansi -W -Wall -I../../build/include
+LIBS = -L../.. -lbotan
SRCS=$(wildcard *.cpp)
diff --git a/doc/examples/cms_dec.cpp b/doc/examples/cms_dec.cpp
index 3fa285395..de4d732f0 100644
--- a/doc/examples/cms_dec.cpp
+++ b/doc/examples/cms_dec.cpp
@@ -10,7 +10,7 @@ int main(int argc, char* argv[])
{
if(argc != 2)
{
- printf("Usage: %s <filename>\n", argv[0]);
+ std::cout << "Usage: " << argv[0] << " <filename>\n";
return 1;
}
diff --git a/doc/examples/cpuid.cpp b/doc/examples/cpuid.cpp
index 59940b500..1bdee787c 100644
--- a/doc/examples/cpuid.cpp
+++ b/doc/examples/cpuid.cpp
@@ -12,4 +12,6 @@ int main()
printf("SSSE3 %d\n", CPUID::has_ssse3());
printf("SSE41 %d\n", CPUID::has_sse41());
printf("SSE42 %d\n", CPUID::has_sse42());
+
+ printf("AltiVec %d\n", CPUID::has_altivec());
}
diff --git a/doc/examples/package.cpp b/doc/examples/package.cpp
index 981abaa31..866dd7e96 100644
--- a/doc/examples/package.cpp
+++ b/doc/examples/package.cpp
@@ -55,7 +55,7 @@ int main(int argc, char* argv[])
&unpackage_output[0]);
if(unpackage_output == input)
- std::cout << Package/unpackage worked\n";
+ std::cout << "Package/unpackage worked\n";
else
std::cout << "Something went wrong :(\n";
}
diff --git a/doc/log.txt b/doc/log.txt
index 9ebf3a2ad..c2728e8db 100644
--- a/doc/log.txt
+++ b/doc/log.txt
@@ -1,14 +1,24 @@
-* 1.9.1-rc1, 2009-10-09
+* 1.9.2-dev, ????-??-??
+ - Add SIMD version of XTEA
+ - Support both SSE2 and AltiVec SIMD for Serpent and XTEA
+ - Optimizations for SHA-1 and SHA-2
+ - Add AltiVec runtime detection
+ - Fix x86 CPU identification with Intel C++ and Visual C++
+
+* 1.9.1, 2009-10-23
- Better support for Python and Perl wrappers
- Add an implementation of Blue Midnight Wish (Round 2 tweak version)
+ - Modify Skein-512 to match the tweaked 1.2 specification
- Add threshold secret sharing (draft-mcgrew-tss-02)
- Add runtime cpu feature detection for x86/x86-64
- Add code for general runtime self testing for hashes, MACs, and ciphers
- - Add support for GNU/Hurd
+ - Optimize XTEA; twice as fast as before on Core2 and Opteron
+ - Convert CTR_BE and OFB from filters to stream ciphers
- New parsing code for SCAN algorithm names
- - Alter Skein-512 to match the tweaked 1.2 specification
- Enable SSE2 optimizations under Visual C++
+ - Remove all use of C++ exception specifications
+ - Add support for GNU/Hurd and Clang/LLVM
* 1.9.0, 2009-09-09
- Add support for parallel invocation of block ciphers where possible
@@ -21,6 +31,8 @@
* 1.8.8-dev, 2009-??-??
- Alter Skein-512 to match the tweaked 1.2 specification
+ - Fix use of inline asm for access to x86 bswap function
+ - Allow building the library without AES enabled
* 1.8.7, 2009-09-09
- Fix processing multiple messages in XTS mode
diff --git a/doc/scripts/dist.sh b/doc/scripts/dist.sh
index 9629446cf..2b03b1a71 100755
--- a/doc/scripts/dist.sh
+++ b/doc/scripts/dist.sh
@@ -3,10 +3,16 @@
# This is probably only useful if run on my machine, which is not
# exactly ideal
-SELECTOR=h:net.randombit.botan.1_8
+# Make that limitation explicit
+if [ $(hostname -s) != 'chihiro' ]; then
+ echo "This script probably won't work on this machine without fixes"
+ exit 1
+fi
+
+SELECTOR=h:net.randombit.botan
KEY_ID=EFBADFBC
-MTN_DB=/storage/mtn/botan.mtn
-WEB_DIR=~/projects/www
+MTN_DB=$HOME/var/mtn/botan.mtn
+WEB_DIR=/var/www/randombit.net/files/botan/v1.9
DIST_DIR=~/Botan-dist
# You shouldn't have to change anything after this
@@ -26,7 +32,7 @@ rm -f .mtn-ignore
# Build docs
cd doc
-for doc in api tutorial building
+for doc in api tutorial building python
do
latex $doc.tex
latex $doc.tex
@@ -60,5 +66,5 @@ read -a PASSWORD -p "Enter PGP password (or ^C to skip signatures): "
echo $PASSWORD | gpg --batch --armor -b --passphrase-fd 0 -u $KEY_ID Botan-$VERSION.tgz
echo $PASSWORD | gpg --batch --armor -b --passphrase-fd 0 -u $KEY_ID Botan-$VERSION.tbz
-mv Botan-$VERSION.tgz* $WEB_DIR/files/botan/v1.8
-mv Botan-$VERSION.tbz* $WEB_DIR/files/botan/v1.8
+mv Botan-$VERSION.tgz* $WEB_DIR
+mv Botan-$VERSION.tbz* $WEB_DIR
diff --git a/readme.txt b/readme.txt
index b592da41d..644c6a4a8 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
-Botan 1.9.1-rc1 2009-10-09
+Botan 1.9.2-dev, ????-??-??
Botan is a C++ class library for performing a wide variety of
cryptographic operations.
diff --git a/src/algo_factory/info.txt b/src/algo_factory/info.txt
index fc248523d..afd350bdb 100644
--- a/src/algo_factory/info.txt
+++ b/src/algo_factory/info.txt
@@ -1,5 +1,3 @@
-realname "Algorithm Factory"
-
load_on auto
define ALGORITHM_FACTORY
diff --git a/src/algo_factory/prov_weight.cpp b/src/algo_factory/prov_weight.cpp
index a55a8b1e6..d7e84a323 100644
--- a/src/algo_factory/prov_weight.cpp
+++ b/src/algo_factory/prov_weight.cpp
@@ -22,7 +22,7 @@ u32bit static_provider_weight(const std::string& prov_name)
if(prov_name == "core") return 5;
if(prov_name == "ia32") return 6;
if(prov_name == "amd64") return 7;
- if(prov_name == "sse2") return 8;
+ if(prov_name == "simd") return 8;
if(prov_name == "openssl") return 2;
if(prov_name == "gmp") return 1;
diff --git a/src/alloc/alloc_mmap/info.txt b/src/alloc/alloc_mmap/info.txt
index 65d9b2977..e6bded3fb 100644
--- a/src/alloc/alloc_mmap/info.txt
+++ b/src/alloc/alloc_mmap/info.txt
@@ -1,5 +1,3 @@
-realname "Disk Based Allocation System"
-
define ALLOC_MMAP
modset unix
diff --git a/src/alloc/info.txt b/src/alloc/info.txt
index fa50aa09f..99dbe3a4d 100644
--- a/src/alloc/info.txt
+++ b/src/alloc/info.txt
@@ -1,5 +1,3 @@
-realname "Allocator"
-
load_on auto
<add>
diff --git a/src/alloc/mem_pool/info.txt b/src/alloc/mem_pool/info.txt
index b1c7a091f..b57a8b647 100644
--- a/src/alloc/mem_pool/info.txt
+++ b/src/alloc/mem_pool/info.txt
@@ -1,5 +1,3 @@
-realname "Memory Pool Allocator"
-
load_on auto
<add>
diff --git a/src/alloc/mem_pool/mem_pool.cpp b/src/alloc/mem_pool/mem_pool.cpp
index 9917793e5..02a12d6a5 100644
--- a/src/alloc/mem_pool/mem_pool.cpp
+++ b/src/alloc/mem_pool/mem_pool.cpp
@@ -42,7 +42,7 @@ Pooling_Allocator::Memory_Block::Memory_Block(void* buf)
* See if ptr is contained by this block
*/
bool Pooling_Allocator::Memory_Block::contains(void* ptr,
- u32bit length) const throw()
+ u32bit length) const
{
return ((buffer <= ptr) &&
(buffer_end >= static_cast<byte*>(ptr) + length * BLOCK_SIZE));
@@ -51,7 +51,7 @@ bool Pooling_Allocator::Memory_Block::contains(void* ptr,
/*
* Allocate some memory, if possible
*/
-byte* Pooling_Allocator::Memory_Block::alloc(u32bit n) throw()
+byte* Pooling_Allocator::Memory_Block::alloc(u32bit n)
{
if(n == 0 || n > BITMAP_SIZE)
return 0;
@@ -91,7 +91,7 @@ byte* Pooling_Allocator::Memory_Block::alloc(u32bit n) throw()
/*
* Mark this memory as free, if we own it
*/
-void Pooling_Allocator::Memory_Block::free(void* ptr, u32bit blocks) throw()
+void Pooling_Allocator::Memory_Block::free(void* ptr, u32bit blocks)
{
clear_mem(static_cast<byte*>(ptr), blocks * BLOCK_SIZE);
diff --git a/src/alloc/mem_pool/mem_pool.h b/src/alloc/mem_pool/mem_pool.h
index 871f135bd..dd463d908 100644
--- a/src/alloc/mem_pool/mem_pool.h
+++ b/src/alloc/mem_pool/mem_pool.h
@@ -44,9 +44,9 @@ class BOTAN_DLL Pooling_Allocator : public Allocator
static u32bit bitmap_size() { return BITMAP_SIZE; }
static u32bit block_size() { return BLOCK_SIZE; }
- bool contains(void*, u32bit) const throw();
- byte* alloc(u32bit) throw();
- void free(void*, u32bit) throw();
+ bool contains(void*, u32bit) const;
+ byte* alloc(u32bit);
+ void free(void*, u32bit);
bool operator<(const Memory_Block& other) const
{
diff --git a/src/alloc/system_alloc/info.txt b/src/alloc/system_alloc/info.txt
index 5fade38cf..8b9a2f067 100644
--- a/src/alloc/system_alloc/info.txt
+++ b/src/alloc/system_alloc/info.txt
@@ -1,5 +1,3 @@
-realname "Default (Malloc) Allocators"
-
load_on auto
<add>
diff --git a/src/aont/info.txt b/src/aont/info.txt
index a0387f358..533b70eb5 100644
--- a/src/aont/info.txt
+++ b/src/aont/info.txt
@@ -1,5 +1,3 @@
-realname "All or Nothing Transforms"
-
define PACKAGE_TRANSFORM
load_on auto
diff --git a/src/aont/package.cpp b/src/aont/package.cpp
index 6c6b56865..37bad46c8 100644
--- a/src/aont/package.cpp
+++ b/src/aont/package.cpp
@@ -7,7 +7,7 @@
*/
#include <botan/package.h>
-#include <botan/pipe.h>
+#include <botan/filters.h>
#include <botan/ctr.h>
#include <botan/loadstor.h>
#include <botan/xor_buf.h>
@@ -29,12 +29,7 @@ void package(RandomNumberGenerator& rng,
SymmetricKey package_key(rng, cipher->BLOCK_SIZE);
- // takes ownership of cipher object
- Keyed_Filter* ctr_mode = new CTR_BE(cipher,
- package_key,
- InitializationVector(all_zeros));
-
- Pipe pipe(ctr_mode);
+ Pipe pipe(new StreamCipher_Filter(new CTR_BE(cipher), package_key));
pipe.process_msg(input, input_len);
pipe.read(output, pipe.remaining());
@@ -113,10 +108,7 @@ void unpackage(BlockCipher* cipher,
xor_buf(&package_key[0], buf, cipher->BLOCK_SIZE);
}
- // takes ownership of cipher object
- Pipe pipe(new CTR_BE(cipher,
- SymmetricKey(package_key),
- InitializationVector(all_zeros)));
+ Pipe pipe(new StreamCipher_Filter(new CTR_BE(cipher), package_key));
pipe.process_msg(input, input_len - cipher->BLOCK_SIZE);
diff --git a/src/asn1/info.txt b/src/asn1/info.txt
index 7b8110c10..d836b4c0b 100644
--- a/src/asn1/info.txt
+++ b/src/asn1/info.txt
@@ -1,5 +1,3 @@
-realname "ASN.1/BER/DER module"
-
define ASN1
load_on auto
diff --git a/src/benchmark/benchmark.cpp b/src/benchmark/benchmark.cpp
index 0fe9a7c9b..5c812d732 100644
--- a/src/benchmark/benchmark.cpp
+++ b/src/benchmark/benchmark.cpp
@@ -100,7 +100,7 @@ bench_stream_cipher(StreamCipher* stream_cipher,
while(time_used < max_time)
{
- stream_cipher->encrypt(buf, buf_len);
+ stream_cipher->cipher1(buf, buf_len);
++reps;
time_used = benchmark_clock::now() - start;
}
diff --git a/src/benchmark/info.txt b/src/benchmark/info.txt
index 03d5aac50..0210971f7 100644
--- a/src/benchmark/info.txt
+++ b/src/benchmark/info.txt
@@ -1,5 +1,3 @@
-realname "Benchmarking"
-
define RUNTIME_BENCHMARKING
load_on auto
diff --git a/src/block/aes/aes.cpp b/src/block/aes/aes.cpp
index 34698ae7f..7ba8136ec 100644
--- a/src/block/aes/aes.cpp
+++ b/src/block/aes/aes.cpp
@@ -258,7 +258,7 @@ AES::AES(u32bit key_size) : BlockCipher(16, key_size)
/**
* Clear memory of sensitive data
*/
-void AES::clear() throw()
+void AES::clear()
{
EK.clear();
DK.clear();
diff --git a/src/block/aes/aes.h b/src/block/aes/aes.h
index 768bb09e7..229ce307c 100644
--- a/src/block/aes/aes.h
+++ b/src/block/aes/aes.h
@@ -21,7 +21,7 @@ class BOTAN_DLL AES : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw();
+ void clear();
std::string name() const { return "AES"; }
BlockCipher* clone() const { return new AES; }
diff --git a/src/block/aes/info.txt b/src/block/aes/info.txt
index 0e11603bb..480973100 100644
--- a/src/block/aes/info.txt
+++ b/src/block/aes/info.txt
@@ -1,3 +1 @@
-realname "AES"
-
define AES
diff --git a/src/block/block_cipher.h b/src/block/block_cipher.h
index a27609171..1dcdde7c7 100644
--- a/src/block/block_cipher.h
+++ b/src/block/block_cipher.h
@@ -87,7 +87,7 @@ class BOTAN_DLL BlockCipher : public SymmetricAlgorithm
/**
* Zeroize internal state
*/
- virtual void clear() throw() = 0;
+ virtual void clear() = 0;
BlockCipher(u32bit block_size,
u32bit key_min,
diff --git a/src/block/blowfish/blowfish.cpp b/src/block/blowfish/blowfish.cpp
index 312603c3a..d0b182a84 100644
--- a/src/block/blowfish/blowfish.cpp
+++ b/src/block/blowfish/blowfish.cpp
@@ -128,7 +128,7 @@ void Blowfish::generate_sbox(u32bit Box[], u32bit size,
/*
* Clear memory of sensitive data
*/
-void Blowfish::clear() throw()
+void Blowfish::clear()
{
P.copy(P_INIT, 18);
S.copy(S_INIT, 1024);
diff --git a/src/block/blowfish/blowfish.h b/src/block/blowfish/blowfish.h
index 345c1ce49..5419308ca 100644
--- a/src/block/blowfish/blowfish.h
+++ b/src/block/blowfish/blowfish.h
@@ -21,7 +21,7 @@ class BOTAN_DLL Blowfish : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw();
+ void clear();
std::string name() const { return "Blowfish"; }
BlockCipher* clone() const { return new Blowfish; }
diff --git a/src/block/blowfish/info.txt b/src/block/blowfish/info.txt
index c63560989..c935fb3ab 100644
--- a/src/block/blowfish/info.txt
+++ b/src/block/blowfish/info.txt
@@ -1,3 +1 @@
-realname "Blowfish"
-
define BLOWFISH
diff --git a/src/block/cast/cast128.h b/src/block/cast/cast128.h
index 864a4e47e..caffb97ea 100644
--- a/src/block/cast/cast128.h
+++ b/src/block/cast/cast128.h
@@ -21,7 +21,7 @@ class BOTAN_DLL CAST_128 : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { MK.clear(); RK.clear(); }
+ void clear() { MK.clear(); RK.clear(); }
std::string name() const { return "CAST-128"; }
BlockCipher* clone() const { return new CAST_128; }
diff --git a/src/block/cast/cast256.h b/src/block/cast/cast256.h
index 1be7fa9cf..0db3682ba 100644
--- a/src/block/cast/cast256.h
+++ b/src/block/cast/cast256.h
@@ -21,7 +21,7 @@ class BOTAN_DLL CAST_256 : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { MK.clear(); RK.clear(); }
+ void clear() { MK.clear(); RK.clear(); }
std::string name() const { return "CAST-256"; }
BlockCipher* clone() const { return new CAST_256; }
diff --git a/src/block/cast/info.txt b/src/block/cast/info.txt
index b9259042d..faba491c2 100644
--- a/src/block/cast/info.txt
+++ b/src/block/cast/info.txt
@@ -1,3 +1 @@
-realname "CAST"
-
define CAST
diff --git a/src/block/des/des.h b/src/block/des/des.h
index 856aaf60c..b28990178 100644
--- a/src/block/des/des.h
+++ b/src/block/des/des.h
@@ -21,7 +21,7 @@ class BOTAN_DLL DES : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { round_key.clear(); }
+ void clear() { round_key.clear(); }
std::string name() const { return "DES"; }
BlockCipher* clone() const { return new DES; }
@@ -41,7 +41,7 @@ class BOTAN_DLL TripleDES : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { round_key.clear(); }
+ void clear() { round_key.clear(); }
std::string name() const { return "TripleDES"; }
BlockCipher* clone() const { return new TripleDES; }
diff --git a/src/block/des/desx.h b/src/block/des/desx.h
index d22895296..89664d064 100644
--- a/src/block/des/desx.h
+++ b/src/block/des/desx.h
@@ -21,7 +21,7 @@ class BOTAN_DLL DESX : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { des.clear(); K1.clear(); K2.clear(); }
+ void clear() { des.clear(); K1.clear(); K2.clear(); }
std::string name() const { return "DESX"; }
BlockCipher* clone() const { return new DESX; }
diff --git a/src/block/des/info.txt b/src/block/des/info.txt
index 6eec591a0..8e4f4e82d 100644
--- a/src/block/des/info.txt
+++ b/src/block/des/info.txt
@@ -1,3 +1 @@
-realname "DES"
-
define DES
diff --git a/src/block/gost_28147/gost_28147.h b/src/block/gost_28147/gost_28147.h
index 18c1d0a29..bf6f8178b 100644
--- a/src/block/gost_28147/gost_28147.h
+++ b/src/block/gost_28147/gost_28147.h
@@ -47,7 +47,7 @@ class BOTAN_DLL GOST_28147_89 : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { EK.clear(); }
+ void clear() { EK.clear(); }
std::string name() const { return "GOST-28147-89"; }
BlockCipher* clone() const { return new GOST_28147_89(SBOX); }
diff --git a/src/block/gost_28147/info.txt b/src/block/gost_28147/info.txt
index 9b24d1e22..530f147e5 100644
--- a/src/block/gost_28147/info.txt
+++ b/src/block/gost_28147/info.txt
@@ -1,3 +1 @@
-realname "GOST 28147-89"
-
define GOST_28147_89
diff --git a/src/block/idea/idea.h b/src/block/idea/idea.h
index 59484531b..c1a79f423 100644
--- a/src/block/idea/idea.h
+++ b/src/block/idea/idea.h
@@ -21,7 +21,7 @@ class BOTAN_DLL IDEA : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { EK.clear(); DK.clear(); }
+ void clear() { EK.clear(); DK.clear(); }
std::string name() const { return "IDEA"; }
BlockCipher* clone() const { return new IDEA; }
diff --git a/src/block/idea/info.txt b/src/block/idea/info.txt
index f11b3d224..a868d7cc7 100644
--- a/src/block/idea/info.txt
+++ b/src/block/idea/info.txt
@@ -1,3 +1 @@
-realname "IDEA"
-
define IDEA
diff --git a/src/block/info.txt b/src/block/info.txt
index f5840bf79..b4302a6d8 100644
--- a/src/block/info.txt
+++ b/src/block/info.txt
@@ -1,5 +1,3 @@
-realname "Block Ciphers"
-
define BLOCK_CIPHER
<requires>
diff --git a/src/block/kasumi/info.txt b/src/block/kasumi/info.txt
index e310488b3..cb8340fad 100644
--- a/src/block/kasumi/info.txt
+++ b/src/block/kasumi/info.txt
@@ -1,3 +1 @@
-realname "Kasumi"
-
define KASUMI
diff --git a/src/block/kasumi/kasumi.h b/src/block/kasumi/kasumi.h
index 0f5a5d182..c3db1cb05 100644
--- a/src/block/kasumi/kasumi.h
+++ b/src/block/kasumi/kasumi.h
@@ -21,7 +21,7 @@ class BOTAN_DLL KASUMI : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { EK.clear(); }
+ void clear() { EK.clear(); }
std::string name() const { return "KASUMI"; }
BlockCipher* clone() const { return new KASUMI; }
diff --git a/src/block/lion/info.txt b/src/block/lion/info.txt
index 64f2989b1..9562be1d0 100644
--- a/src/block/lion/info.txt
+++ b/src/block/lion/info.txt
@@ -1,5 +1,3 @@
-realname "Lion"
-
define LION
<requires>
diff --git a/src/block/lion/lion.cpp b/src/block/lion/lion.cpp
index 83c1e3aa3..e71091258 100644
--- a/src/block/lion/lion.cpp
+++ b/src/block/lion/lion.cpp
@@ -22,7 +22,7 @@ void Lion::encrypt_n(const byte in[], byte out[], u32bit blocks) const
{
xor_buf(buffer, in, key1, LEFT_SIZE);
cipher->set_key(buffer, LEFT_SIZE);
- cipher->encrypt(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE);
+ cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE);
hash->update(out + LEFT_SIZE, RIGHT_SIZE);
hash->final(buffer);
@@ -30,7 +30,7 @@ void Lion::encrypt_n(const byte in[], byte out[], u32bit blocks) const
xor_buf(buffer, out, key2, LEFT_SIZE);
cipher->set_key(buffer, LEFT_SIZE);
- cipher->encrypt(out + LEFT_SIZE, RIGHT_SIZE);
+ cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE);
in += BLOCK_SIZE;
out += BLOCK_SIZE;
@@ -48,7 +48,7 @@ void Lion::decrypt_n(const byte in[], byte out[], u32bit blocks) const
{
xor_buf(buffer, in, key2, LEFT_SIZE);
cipher->set_key(buffer, LEFT_SIZE);
- cipher->encrypt(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE);
+ cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE);
hash->update(out + LEFT_SIZE, RIGHT_SIZE);
hash->final(buffer);
@@ -56,7 +56,7 @@ void Lion::decrypt_n(const byte in[], byte out[], u32bit blocks) const
xor_buf(buffer, out, key1, LEFT_SIZE);
cipher->set_key(buffer, LEFT_SIZE);
- cipher->encrypt(out + LEFT_SIZE, RIGHT_SIZE);
+ cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE);
in += BLOCK_SIZE;
out += BLOCK_SIZE;
@@ -95,7 +95,7 @@ BlockCipher* Lion::clone() const
/*
* Clear memory of sensitive data
*/
-void Lion::clear() throw()
+void Lion::clear()
{
hash->clear();
cipher->clear();
diff --git a/src/block/lion/lion.h b/src/block/lion/lion.h
index d421771d6..f24acdb72 100644
--- a/src/block/lion/lion.h
+++ b/src/block/lion/lion.h
@@ -23,7 +23,7 @@ class BOTAN_DLL Lion : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw();
+ void clear();
std::string name() const;
BlockCipher* clone() const;
diff --git a/src/block/lubyrack/info.txt b/src/block/lubyrack/info.txt
index d915781d8..41c395097 100644
--- a/src/block/lubyrack/info.txt
+++ b/src/block/lubyrack/info.txt
@@ -1,5 +1,3 @@
-realname "Luby-Rackoff"
-
define LUBY_RACKOFF
<requires>
diff --git a/src/block/lubyrack/lubyrack.cpp b/src/block/lubyrack/lubyrack.cpp
index 6ad64f2b0..2003d2a89 100644
--- a/src/block/lubyrack/lubyrack.cpp
+++ b/src/block/lubyrack/lubyrack.cpp
@@ -92,7 +92,7 @@ void LubyRackoff::key_schedule(const byte key[], u32bit length)
/*
* Clear memory of sensitive data
*/
-void LubyRackoff::clear() throw()
+void LubyRackoff::clear()
{
K1.clear();
K2.clear();
diff --git a/src/block/lubyrack/lubyrack.h b/src/block/lubyrack/lubyrack.h
index 940b34603..7249cf157 100644
--- a/src/block/lubyrack/lubyrack.h
+++ b/src/block/lubyrack/lubyrack.h
@@ -22,7 +22,7 @@ class BOTAN_DLL LubyRackoff : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw();
+ void clear();
std::string name() const;
BlockCipher* clone() const;
diff --git a/src/block/mars/info.txt b/src/block/mars/info.txt
index ec958eaf5..afdcebe67 100644
--- a/src/block/mars/info.txt
+++ b/src/block/mars/info.txt
@@ -1,3 +1 @@
-realname "MARS"
-
define MARS
diff --git a/src/block/mars/mars.h b/src/block/mars/mars.h
index 7d0bfe4fa..8173fb984 100644
--- a/src/block/mars/mars.h
+++ b/src/block/mars/mars.h
@@ -18,7 +18,7 @@ class BOTAN_DLL MARS : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { EK.clear(); }
+ void clear() { EK.clear(); }
std::string name() const { return "MARS"; }
BlockCipher* clone() const { return new MARS; }
diff --git a/src/block/misty1/info.txt b/src/block/misty1/info.txt
index 38087c83d..290b8b1d7 100644
--- a/src/block/misty1/info.txt
+++ b/src/block/misty1/info.txt
@@ -1,3 +1 @@
-realname "MISTY-1"
-
define MISTY1
diff --git a/src/block/misty1/misty1.h b/src/block/misty1/misty1.h
index 8db6881de..000830915 100644
--- a/src/block/misty1/misty1.h
+++ b/src/block/misty1/misty1.h
@@ -21,7 +21,7 @@ class BOTAN_DLL MISTY1 : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { EK.clear(); DK.clear(); }
+ void clear() { EK.clear(); DK.clear(); }
std::string name() const { return "MISTY1"; }
BlockCipher* clone() const { return new MISTY1; }
diff --git a/src/block/noekeon/info.txt b/src/block/noekeon/info.txt
index 6e940bb62..31f7e7de3 100644
--- a/src/block/noekeon/info.txt
+++ b/src/block/noekeon/info.txt
@@ -1,3 +1 @@
-realname "Noekeon"
-
define NOEKEON
diff --git a/src/block/noekeon/noekeon.cpp b/src/block/noekeon/noekeon.cpp
index 1b327aa47..0bfce1882 100644
--- a/src/block/noekeon/noekeon.cpp
+++ b/src/block/noekeon/noekeon.cpp
@@ -201,7 +201,7 @@ void Noekeon::key_schedule(const byte key[], u32bit)
/*
* Clear memory of sensitive data
*/
-void Noekeon::clear() throw()
+void Noekeon::clear()
{
EK.clear();
DK.clear();
diff --git a/src/block/noekeon/noekeon.h b/src/block/noekeon/noekeon.h
index 37b24fb7d..4532c1be2 100644
--- a/src/block/noekeon/noekeon.h
+++ b/src/block/noekeon/noekeon.h
@@ -21,7 +21,7 @@ class BOTAN_DLL Noekeon : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw();
+ void clear();
std::string name() const { return "Noekeon"; }
BlockCipher* clone() const { return new Noekeon; }
diff --git a/src/block/rc2/info.txt b/src/block/rc2/info.txt
index 7ec018422..7eee38d6b 100644
--- a/src/block/rc2/info.txt
+++ b/src/block/rc2/info.txt
@@ -1,3 +1 @@
-realname "RC2"
-
define RC2
diff --git a/src/block/rc2/rc2.h b/src/block/rc2/rc2.h
index db623b385..c6e4946f9 100644
--- a/src/block/rc2/rc2.h
+++ b/src/block/rc2/rc2.h
@@ -23,7 +23,7 @@ class BOTAN_DLL RC2 : public BlockCipher
static byte EKB_code(u32bit);
- void clear() throw() { K.clear(); }
+ void clear() { K.clear(); }
std::string name() const { return "RC2"; }
BlockCipher* clone() const { return new RC2; }
diff --git a/src/block/rc5/info.txt b/src/block/rc5/info.txt
index 2032b406f..3da32710d 100644
--- a/src/block/rc5/info.txt
+++ b/src/block/rc5/info.txt
@@ -1,3 +1 @@
-realname "RC5"
-
define RC5
diff --git a/src/block/rc5/rc5.h b/src/block/rc5/rc5.h
index ff9204710..82931c1d2 100644
--- a/src/block/rc5/rc5.h
+++ b/src/block/rc5/rc5.h
@@ -21,7 +21,7 @@ class BOTAN_DLL RC5 : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { S.clear(); }
+ void clear() { S.clear(); }
std::string name() const;
BlockCipher* clone() const { return new RC5(ROUNDS); }
diff --git a/src/block/rc6/info.txt b/src/block/rc6/info.txt
index 2897bc1f3..fc7d2acb4 100644
--- a/src/block/rc6/info.txt
+++ b/src/block/rc6/info.txt
@@ -1,3 +1 @@
-realname "RC6"
-
define RC6
diff --git a/src/block/rc6/rc6.h b/src/block/rc6/rc6.h
index 5171006f5..6cd0f54db 100644
--- a/src/block/rc6/rc6.h
+++ b/src/block/rc6/rc6.h
@@ -21,7 +21,7 @@ class BOTAN_DLL RC6 : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { S.clear(); }
+ void clear() { S.clear(); }
std::string name() const { return "RC6"; }
BlockCipher* clone() const { return new RC6; }
diff --git a/src/block/safer/info.txt b/src/block/safer/info.txt
index 7c8067472..0ca49602d 100644
--- a/src/block/safer/info.txt
+++ b/src/block/safer/info.txt
@@ -1,3 +1 @@
-realname "SAFER"
-
define SAFER
diff --git a/src/block/safer/safer_sk.h b/src/block/safer/safer_sk.h
index 4d17bba51..80d2dc069 100644
--- a/src/block/safer/safer_sk.h
+++ b/src/block/safer/safer_sk.h
@@ -21,7 +21,7 @@ class BOTAN_DLL SAFER_SK : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { EK.clear(); }
+ void clear() { EK.clear(); }
std::string name() const;
BlockCipher* clone() const;
diff --git a/src/block/seed/info.txt b/src/block/seed/info.txt
index c66e0c2cd..96f4b75f2 100644
--- a/src/block/seed/info.txt
+++ b/src/block/seed/info.txt
@@ -1,3 +1 @@
-realname "SEED"
-
define SEED
diff --git a/src/block/seed/seed.h b/src/block/seed/seed.h
index 5a5a512e7..5a4b44057 100644
--- a/src/block/seed/seed.h
+++ b/src/block/seed/seed.h
@@ -21,7 +21,7 @@ class BOTAN_DLL SEED : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { K.clear(); }
+ void clear() { K.clear(); }
std::string name() const { return "SEED"; }
BlockCipher* clone() const { return new SEED; }
diff --git a/src/block/serpent/info.txt b/src/block/serpent/info.txt
index 4031a3f5f..5fcc14f74 100644
--- a/src/block/serpent/info.txt
+++ b/src/block/serpent/info.txt
@@ -1,3 +1 @@
-realname "Serpent"
-
define SERPENT
diff --git a/src/block/serpent/serpent.h b/src/block/serpent/serpent.h
index d919c3008..4fa7451b9 100644
--- a/src/block/serpent/serpent.h
+++ b/src/block/serpent/serpent.h
@@ -21,7 +21,7 @@ class BOTAN_DLL Serpent : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { round_key.clear(); }
+ void clear() { round_key.clear(); }
std::string name() const { return "Serpent"; }
BlockCipher* clone() const { return new Serpent; }
Serpent() : BlockCipher(16, 16, 32, 8) {}
diff --git a/src/block/serpent_ia32/info.txt b/src/block/serpent_ia32/info.txt
index 48d589724..fa6d9b9d9 100644
--- a/src/block/serpent_ia32/info.txt
+++ b/src/block/serpent_ia32/info.txt
@@ -1,5 +1,3 @@
-realname "Serpent (IA-32)"
-
define SERPENT_IA32
load_on asm_ok
diff --git a/src/block/serpent_simd/info.txt b/src/block/serpent_simd/info.txt
new file mode 100644
index 000000000..d65b41235
--- /dev/null
+++ b/src/block/serpent_simd/info.txt
@@ -0,0 +1,7 @@
+define SERPENT_SIMD
+
+<requires>
+serpent
+simd_32
+simd_engine
+</requires>
diff --git a/src/block/serpent_sse2/serp_sse2.cpp b/src/block/serpent_simd/serp_simd.cpp
index c51bb69ab..b394b0c26 100644
--- a/src/block/serpent_sse2/serp_sse2.cpp
+++ b/src/block/serpent_simd/serp_simd.cpp
@@ -1,99 +1,71 @@
/*
-* Serpent (SSE2)
+* Serpent (SIMD)
* (C) 2009 Jack Lloyd
*
* Distributed under the terms of the Botan license
*/
-#include <botan/serp_sse2.h>
-#include <botan/serp_sse2_sbox.h>
+#include <botan/serp_simd.h>
+#include <botan/serp_simd_sbox.h>
+#include <botan/simd_32.h>
#include <botan/loadstor.h>
-#include <emmintrin.h>
namespace Botan {
namespace {
-#define key_xor(round, B0, B1, B2, B3) \
- do { \
- __m128i key = _mm_loadu_si128(keys + round); \
- B0 = _mm_xor_si128(B0, _mm_shuffle_epi32(key, _MM_SHUFFLE(0,0,0,0))); \
- B1 = _mm_xor_si128(B1, _mm_shuffle_epi32(key, _MM_SHUFFLE(1,1,1,1))); \
- B2 = _mm_xor_si128(B2, _mm_shuffle_epi32(key, _MM_SHUFFLE(2,2,2,2))); \
- B3 = _mm_xor_si128(B3, _mm_shuffle_epi32(key, _MM_SHUFFLE(3,3,3,3))); \
+#define key_xor(round, B0, B1, B2, B3) \
+ do { \
+ B0 ^= SIMD_32(keys[4*round ]); \
+ B1 ^= SIMD_32(keys[4*round+1]); \
+ B2 ^= SIMD_32(keys[4*round+2]); \
+ B3 ^= SIMD_32(keys[4*round+3]); \
} while(0);
/*
* Serpent's linear transformations
*/
-#define rotate_left_m128(vec, rot) \
- _mm_or_si128(_mm_slli_epi32(vec, rot), _mm_srli_epi32(vec, 32-rot))
-
-#define rotate_right_m128(vec, rot) \
- _mm_or_si128(_mm_srli_epi32(vec, rot), _mm_slli_epi32(vec, 32-rot))
-
-#define transform(B0, B1, B2, B3) \
- do { \
- B0 = rotate_left_m128(B0, 13); \
- B2 = rotate_left_m128(B2, 3); \
- B1 = _mm_xor_si128(B1, _mm_xor_si128(B0, B2)); \
- B3 = _mm_xor_si128(B3, _mm_xor_si128(B2, _mm_slli_epi32(B0, 3))); \
- B1 = rotate_left_m128(B1, 1); \
- B3 = rotate_left_m128(B3, 7); \
- B0 = _mm_xor_si128(B0, _mm_xor_si128(B1, B3)); \
- B2 = _mm_xor_si128(B2, _mm_xor_si128(B3, _mm_slli_epi32(B1, 7))); \
- B0 = rotate_left_m128(B0, 5); \
- B2 = rotate_left_m128(B2, 22); \
+#define transform(B0, B1, B2, B3) \
+ do { \
+ B0.rotate_left(13); \
+ B2.rotate_left(3); \
+ B1 ^= B0 ^ B2; \
+ B3 ^= B2 ^ (B0 << 3); \
+ B1.rotate_left(1); \
+ B3.rotate_left(7); \
+ B0 ^= B1 ^ B3; \
+ B2 ^= B3 ^ (B1 << 7); \
+ B0.rotate_left(5); \
+ B2.rotate_left(22); \
} while(0);
-#define i_transform(B0, B1, B2, B3) \
- do { \
- B2 = rotate_right_m128(B2, 22); \
- B0 = rotate_right_m128(B0, 5); \
- B2 = _mm_xor_si128(B2, _mm_xor_si128(B3, _mm_slli_epi32(B1, 7))); \
- B0 = _mm_xor_si128(B0, _mm_xor_si128(B1, B3)); \
- B3 = rotate_right_m128(B3, 7); \
- B1 = rotate_right_m128(B1, 1); \
- B3 = _mm_xor_si128(B3, _mm_xor_si128(B2, _mm_slli_epi32(B0, 3))); \
- B1 = _mm_xor_si128(B1, _mm_xor_si128(B0, B2)); \
- B2 = rotate_right_m128(B2, 3); \
- B0 = rotate_right_m128(B0, 13); \
+#define i_transform(B0, B1, B2, B3) \
+ do { \
+ B2.rotate_right(22); \
+ B0.rotate_right(5); \
+ B2 ^= B3 ^ (B1 << 7); \
+ B0 ^= B1 ^ B3; \
+ B3.rotate_right(7); \
+ B1.rotate_right(1); \
+ B3 ^= B2 ^ (B0 << 3); \
+ B1 ^= B0 ^ B2; \
+ B2.rotate_right(3); \
+ B0.rotate_right(13); \
} while(0);
/*
-* 4x4 SSE2 integer matrix transpose
-*/
-#define transpose(B0, B1, B2, B3) \
- do { \
- __m128i T0 = _mm_unpacklo_epi32(B0, B1); \
- __m128i T1 = _mm_unpacklo_epi32(B2, B3); \
- __m128i T2 = _mm_unpackhi_epi32(B0, B1); \
- __m128i T3 = _mm_unpackhi_epi32(B2, B3); \
- B0 = _mm_unpacklo_epi64(T0, T1); \
- B1 = _mm_unpackhi_epi64(T0, T1); \
- B2 = _mm_unpacklo_epi64(T2, T3); \
- B3 = _mm_unpackhi_epi64(T2, T3); \
- } while(0);
-
-/*
-* SSE2 Serpent Encryption of 4 blocks in parallel
+* SIMD Serpent Encryption of 4 blocks in parallel
*/
void serpent_encrypt_4(const byte in[64],
byte out[64],
- const u32bit keys_32[132])
+ const u32bit keys[132])
{
- const __m128i all_ones = _mm_set1_epi8(0xFF);
+ SIMD_32 B0 = SIMD_32::load_le(in);
+ SIMD_32 B1 = SIMD_32::load_le(in + 16);
+ SIMD_32 B2 = SIMD_32::load_le(in + 32);
+ SIMD_32 B3 = SIMD_32::load_le(in + 48);
- const __m128i* keys = (const __m128i*)(keys_32);
- __m128i* out_mm = (__m128i*)(out);
- __m128i* in_mm = (__m128i*)(in);
-
- __m128i B0 = _mm_loadu_si128(in_mm);
- __m128i B1 = _mm_loadu_si128(in_mm + 1);
- __m128i B2 = _mm_loadu_si128(in_mm + 2);
- __m128i B3 = _mm_loadu_si128(in_mm + 3);
-
- transpose(B0, B1, B2, B3);
+ SIMD_32::transpose(B0, B1, B2, B3);
key_xor( 0,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3);
key_xor( 1,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3);
@@ -131,33 +103,27 @@ void serpent_encrypt_4(const byte in[64],
key_xor(30,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3);
key_xor(31,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); key_xor(32,B0,B1,B2,B3);
- transpose(B0, B1, B2, B3);
+ SIMD_32::transpose(B0, B1, B2, B3);
- _mm_storeu_si128(out_mm , B0);
- _mm_storeu_si128(out_mm + 1, B1);
- _mm_storeu_si128(out_mm + 2, B2);
- _mm_storeu_si128(out_mm + 3, B3);
+ B0.store_le(out);
+ B1.store_le(out + 16);
+ B2.store_le(out + 32);
+ B3.store_le(out + 48);
}
/*
-* SSE2 Serpent Decryption of 4 blocks in parallel
+* SIMD Serpent Decryption of 4 blocks in parallel
*/
void serpent_decrypt_4(const byte in[64],
byte out[64],
- const u32bit keys_32[132])
+ const u32bit keys[132])
{
- const __m128i all_ones = _mm_set1_epi8(0xFF);
-
- const __m128i* keys = (const __m128i*)(keys_32);
- __m128i* out_mm = (__m128i*)(out);
- __m128i* in_mm = (__m128i*)(in);
-
- __m128i B0 = _mm_loadu_si128(in_mm);
- __m128i B1 = _mm_loadu_si128(in_mm + 1);
- __m128i B2 = _mm_loadu_si128(in_mm + 2);
- __m128i B3 = _mm_loadu_si128(in_mm + 3);
+ SIMD_32 B0 = SIMD_32::load_le(in);
+ SIMD_32 B1 = SIMD_32::load_le(in + 16);
+ SIMD_32 B2 = SIMD_32::load_le(in + 32);
+ SIMD_32 B3 = SIMD_32::load_le(in + 48);
- transpose(B0, B1, B2, B3);
+ SIMD_32::transpose(B0, B1, B2, B3);
key_xor(32,B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3);
i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3);
@@ -195,12 +161,12 @@ void serpent_decrypt_4(const byte in[64],
i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3);
i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 0,B0,B1,B2,B3);
- transpose(B0, B1, B2, B3);
+ SIMD_32::transpose(B0, B1, B2, B3);
- _mm_storeu_si128(out_mm , B0);
- _mm_storeu_si128(out_mm + 1, B1);
- _mm_storeu_si128(out_mm + 2, B2);
- _mm_storeu_si128(out_mm + 3, B3);
+ B0.store_le(out);
+ B1.store_le(out + 16);
+ B2.store_le(out + 32);
+ B3.store_le(out + 48);
}
}
@@ -208,7 +174,7 @@ void serpent_decrypt_4(const byte in[64],
/*
* Serpent Encryption
*/
-void Serpent_SSE2::encrypt_n(const byte in[], byte out[], u32bit blocks) const
+void Serpent_SIMD::encrypt_n(const byte in[], byte out[], u32bit blocks) const
{
while(blocks >= 4)
{
@@ -224,7 +190,7 @@ void Serpent_SSE2::encrypt_n(const byte in[], byte out[], u32bit blocks) const
/*
* Serpent Decryption
*/
-void Serpent_SSE2::decrypt_n(const byte in[], byte out[], u32bit blocks) const
+void Serpent_SIMD::decrypt_n(const byte in[], byte out[], u32bit blocks) const
{
while(blocks >= 4)
{
diff --git a/src/block/serpent_sse2/serp_sse2.h b/src/block/serpent_simd/serp_simd.h
index f1e5c2028..1ecb70159 100644
--- a/src/block/serpent_sse2/serp_sse2.h
+++ b/src/block/serpent_simd/serp_simd.h
@@ -1,12 +1,12 @@
/*
-* Serpent (SSE2)
+* Serpent (SIMD)
* (C) 2009 Jack Lloyd
*
* Distributed under the terms of the Botan license
*/
-#ifndef BOTAN_SERPENT_SSE2_H__
-#define BOTAN_SERPENT_SSE2_H__
+#ifndef BOTAN_SERPENT_SIMD_H__
+#define BOTAN_SERPENT_SIMD_H__
#include <botan/serpent.h>
@@ -15,13 +15,13 @@ namespace Botan {
/*
* Serpent
*/
-class BOTAN_DLL Serpent_SSE2 : public Serpent
+class BOTAN_DLL Serpent_SIMD : public Serpent
{
public:
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- BlockCipher* clone() const { return new Serpent_SSE2; }
+ BlockCipher* clone() const { return new Serpent_SIMD; }
};
}
diff --git a/src/block/serpent_simd/serp_simd_sbox.h b/src/block/serpent_simd/serp_simd_sbox.h
new file mode 100644
index 000000000..6e3da7359
--- /dev/null
+++ b/src/block/serpent_simd/serp_simd_sbox.h
@@ -0,0 +1,426 @@
+/*
+* Serpent Sboxes in SIMD form
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef SERPENT_SIMD_SBOXES_H__
+#define SERPENT_SIMD_SBOXES_H__
+
+#define SBoxE1(B0, B1, B2, B3) \
+ do { \
+ B3 ^= B0; \
+ SIMD_32 B4 = B1; \
+ B1 &= B3; \
+ B4 ^= B2; \
+ B1 ^= B0; \
+ B0 |= B3; \
+ B0 ^= B4; \
+ B4 ^= B3; \
+ B3 ^= B2; \
+ B2 |= B1; \
+ B2 ^= B4; \
+ B4 = ~B4; \
+ B4 |= B1; \
+ B1 ^= B3; \
+ B1 ^= B4; \
+ B3 |= B0; \
+ B1 ^= B3; \
+ B4 ^= B3; \
+ B3 = B0; \
+ B0 = B1; \
+ B1 = B4; \
+ } while(0);
+
+#define SBoxE2(B0, B1, B2, B3) \
+ do { \
+ B0 = ~B0; \
+ B2 = ~B2; \
+ SIMD_32 B4 = B0; \
+ B0 &= B1; \
+ B2 ^= B0; \
+ B0 |= B3; \
+ B3 ^= B2; \
+ B1 ^= B0; \
+ B0 ^= B4; \
+ B4 |= B1; \
+ B1 ^= B3; \
+ B2 |= B0; \
+ B2 &= B4; \
+ B0 ^= B1; \
+ B1 &= B2; \
+ B1 ^= B0; \
+ B0 &= B2; \
+ B4 ^= B0; \
+ B0 = B2; \
+ B2 = B3; \
+ B3 = B1; \
+ B1 = B4; \
+ } while(0);
+
+#define SBoxE3(B0, B1, B2, B3) \
+ do { \
+ SIMD_32 B4 = B0; \
+ B0 &= B2; \
+ B0 ^= B3; \
+ B2 ^= B1; \
+ B2 ^= B0; \
+ B3 |= B4; \
+ B3 ^= B1; \
+ B4 ^= B2; \
+ B1 = B3; \
+ B3 |= B4; \
+ B3 ^= B0; \
+ B0 &= B1; \
+ B4 ^= B0; \
+ B1 ^= B3; \
+ B1 ^= B4; \
+ B4 = ~B4; \
+ B0 = B2; \
+ B2 = B1; \
+ B1 = B3; \
+ B3 = B4; \
+ } while(0);
+
+#define SBoxE4(B0, B1, B2, B3) \
+ do { \
+ SIMD_32 B4 = B0; \
+ B0 |= B3; \
+ B3 ^= B1; \
+ B1 &= B4; \
+ B4 ^= B2; \
+ B2 ^= B3; \
+ B3 &= B0; \
+ B4 |= B1; \
+ B3 ^= B4; \
+ B0 ^= B1; \
+ B4 &= B0; \
+ B1 ^= B3; \
+ B4 ^= B2; \
+ B1 |= B0; \
+ B1 ^= B2; \
+ B0 ^= B3; \
+ B2 = B1; \
+ B1 |= B3; \
+ B0 ^= B1; \
+ B1 = B2; \
+ B2 = B3; \
+ B3 = B4; \
+ } while(0);
+
+#define SBoxE5(B0, B1, B2, B3) \
+ do { \
+ B1 ^= B3; \
+ B3 = ~B3; \
+ B2 ^= B3; \
+ B3 ^= B0; \
+ SIMD_32 B4 = B1; \
+ B1 &= B3; \
+ B1 ^= B2; \
+ B4 ^= B3; \
+ B0 ^= B4; \
+ B2 &= B4; \
+ B2 ^= B0; \
+ B0 &= B1; \
+ B3 ^= B0; \
+ B4 |= B1; \
+ B4 ^= B0; \
+ B0 |= B3; \
+ B0 ^= B2; \
+ B2 &= B3; \
+ B0 = ~B0; \
+ B4 ^= B2; \
+ B2 = B0; \
+ B0 = B1; \
+ B1 = B4; \
+ } while(0);
+
+#define SBoxE6(B0, B1, B2, B3) \
+ do { \
+ B0 ^= B1; \
+ B1 ^= B3; \
+ B3 = ~B3; \
+ SIMD_32 B4 = B1; \
+ B1 &= B0; \
+ B2 ^= B3; \
+ B1 ^= B2; \
+ B2 |= B4; \
+ B4 ^= B3; \
+ B3 &= B1; \
+ B3 ^= B0; \
+ B4 ^= B1; \
+ B4 ^= B2; \
+ B2 ^= B0; \
+ B0 &= B3; \
+ B2 = ~B2; \
+ B0 ^= B4; \
+ B4 |= B3; \
+ B4 ^= B2; \
+ B2 = B0; \
+ B0 = B1; \
+ B1 = B3; \
+ B3 = B4; \
+ } while(0);
+
+#define SBoxE7(B0, B1, B2, B3) \
+ do { \
+ B2 = ~B2; \
+ SIMD_32 B4 = B3; \
+ B3 &= B0; \
+ B0 ^= B4; \
+ B3 ^= B2; \
+ B2 |= B4; \
+ B1 ^= B3; \
+ B2 ^= B0; \
+ B0 |= B1; \
+ B2 ^= B1; \
+ B4 ^= B0; \
+ B0 |= B3; \
+ B0 ^= B2; \
+ B4 ^= B3; \
+ B4 ^= B0; \
+ B3 = ~B3; \
+ B2 &= B4; \
+ B3 ^= B2; \
+ B2 = B4; \
+ } while(0);
+
+#define SBoxE8(B0, B1, B2, B3) \
+ do { \
+ SIMD_32 B4 = B1; \
+ B1 |= B2; \
+ B1 ^= B3; \
+ B4 ^= B2; \
+ B2 ^= B1; \
+ B3 |= B4; \
+ B3 &= B0; \
+ B4 ^= B2; \
+ B3 ^= B1; \
+ B1 |= B4; \
+ B1 ^= B0; \
+ B0 |= B4; \
+ B0 ^= B2; \
+ B1 ^= B4; \
+ B2 ^= B1; \
+ B1 &= B0; \
+ B1 ^= B4; \
+ B2 = ~B2; \
+ B2 |= B0; \
+ B4 ^= B2; \
+ B2 = B1; \
+ B1 = B3; \
+ B3 = B0; \
+ B0 = B4; \
+ } while(0);
+
+#define SBoxD1(B0, B1, B2, B3) \
+ do { \
+ B2 = ~B2; \
+ SIMD_32 B4 = B1; \
+ B1 |= B0; \
+ B4 = ~B4; \
+ B1 ^= B2; \
+ B2 |= B4; \
+ B1 ^= B3; \
+ B0 ^= B4; \
+ B2 ^= B0; \
+ B0 &= B3; \
+ B4 ^= B0; \
+ B0 |= B1; \
+ B0 ^= B2; \
+ B3 ^= B4; \
+ B2 ^= B1; \
+ B3 ^= B0; \
+ B3 ^= B1; \
+ B2 &= B3; \
+ B4 ^= B2; \
+ B2 = B1; \
+ B1 = B4; \
+ } while(0);
+
+#define SBoxD2(B0, B1, B2, B3) \
+ do { \
+ SIMD_32 B4 = B1; \
+ B1 ^= B3; \
+ B3 &= B1; \
+ B4 ^= B2; \
+ B3 ^= B0; \
+ B0 |= B1; \
+ B2 ^= B3; \
+ B0 ^= B4; \
+ B0 |= B2; \
+ B1 ^= B3; \
+ B0 ^= B1; \
+ B1 |= B3; \
+ B1 ^= B0; \
+ B4 = ~B4; \
+ B4 ^= B1; \
+ B1 |= B0; \
+ B1 ^= B0; \
+ B1 |= B4; \
+ B3 ^= B1; \
+ B1 = B0; \
+ B0 = B4; \
+ B4 = B2; \
+ B2 = B3; \
+ B3 = B4; \
+ } while(0);
+
+#define SBoxD3(B0, B1, B2, B3) \
+ do { \
+ B2 ^= B3; \
+ B3 ^= B0; \
+ SIMD_32 B4 = B3; \
+ B3 &= B2; \
+ B3 ^= B1; \
+ B1 |= B2; \
+ B1 ^= B4; \
+ B4 &= B3; \
+ B2 ^= B3; \
+ B4 &= B0; \
+ B4 ^= B2; \
+ B2 &= B1; \
+ B2 |= B0; \
+ B3 = ~B3; \
+ B2 ^= B3; \
+ B0 ^= B3; \
+ B0 &= B1; \
+ B3 ^= B4; \
+ B3 ^= B0; \
+ B0 = B1; \
+ B1 = B4; \
+ } while(0);
+
+#define SBoxD4(B0, B1, B2, B3) \
+ do { \
+ SIMD_32 B4 = B2; \
+ B2 ^= B1; \
+ B0 ^= B2; \
+ B4 &= B2; \
+ B4 ^= B0; \
+ B0 &= B1; \
+ B1 ^= B3; \
+ B3 |= B4; \
+ B2 ^= B3; \
+ B0 ^= B3; \
+ B1 ^= B4; \
+ B3 &= B2; \
+ B3 ^= B1; \
+ B1 ^= B0; \
+ B1 |= B2; \
+ B0 ^= B3; \
+ B1 ^= B4; \
+ B0 ^= B1; \
+ B4 = B0; \
+ B0 = B2; \
+ B2 = B3; \
+ B3 = B4; \
+ } while(0);
+
+#define SBoxD5(B0, B1, B2, B3) \
+ do { \
+ SIMD_32 B4 = B2; \
+ B2 &= B3; \
+ B2 ^= B1; \
+ B1 |= B3; \
+ B1 &= B0; \
+ B4 ^= B2; \
+ B4 ^= B1; \
+ B1 &= B2; \
+ B0 = ~B0; \
+ B3 ^= B4; \
+ B1 ^= B3; \
+ B3 &= B0; \
+ B3 ^= B2; \
+ B0 ^= B1; \
+ B2 &= B0; \
+ B3 ^= B0; \
+ B2 ^= B4; \
+ B2 |= B3; \
+ B3 ^= B0; \
+ B2 ^= B1; \
+ B1 = B3; \
+ B3 = B4; \
+ } while(0);
+
+#define SBoxD6(B0, B1, B2, B3) \
+ do { \
+ B1 = ~B1; \
+ SIMD_32 B4 = B3; \
+ B2 ^= B1; \
+ B3 |= B0; \
+ B3 ^= B2; \
+ B2 |= B1; \
+ B2 &= B0; \
+ B4 ^= B3; \
+ B2 ^= B4; \
+ B4 |= B0; \
+ B4 ^= B1; \
+ B1 &= B2; \
+ B1 ^= B3; \
+ B4 ^= B2; \
+ B3 &= B4; \
+ B4 ^= B1; \
+ B3 ^= B4; \
+ B4 = ~B4; \
+ B3 ^= B0; \
+ B0 = B1; \
+ B1 = B4; \
+ B4 = B3; \
+ B3 = B2; \
+ B2 = B4; \
+ } while(0);
+
+#define SBoxD7(B0, B1, B2, B3) \
+ do { \
+ B0 ^= B2; \
+ SIMD_32 B4 = B2; \
+ B2 &= B0; \
+ B4 ^= B3; \
+ B2 = ~B2; \
+ B3 ^= B1; \
+ B2 ^= B3; \
+ B4 |= B0; \
+ B0 ^= B2; \
+ B3 ^= B4; \
+ B4 ^= B1; \
+ B1 &= B3; \
+ B1 ^= B0; \
+ B0 ^= B3; \
+ B0 |= B2; \
+ B3 ^= B1; \
+ B4 ^= B0; \
+ B0 = B1; \
+ B1 = B2; \
+ B2 = B4; \
+ } while(0);
+
+#define SBoxD8(B0, B1, B2, B3) \
+ do { \
+ SIMD_32 B4 = B2; \
+ B2 ^= B0; \
+ B0 &= B3; \
+ B4 |= B3; \
+ B2 = ~B2; \
+ B3 ^= B1; \
+ B1 |= B0; \
+ B0 ^= B2; \
+ B2 &= B4; \
+ B3 &= B4; \
+ B1 ^= B2; \
+ B2 ^= B0; \
+ B0 |= B2; \
+ B4 ^= B1; \
+ B0 ^= B3; \
+ B3 ^= B4; \
+ B4 |= B0; \
+ B3 ^= B2; \
+ B4 ^= B2; \
+ B2 = B1; \
+ B1 = B0; \
+ B0 = B3; \
+ B3 = B4; \
+ } while(0);
+
+#endif
diff --git a/src/block/serpent_sse2/info.txt b/src/block/serpent_sse2/info.txt
deleted file mode 100644
index da7eef6bc..000000000
--- a/src/block/serpent_sse2/info.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-realname "Serpent (SSE2)"
-
-define SERPENT_SSE2
-
-<requires>
-serpent
-sse2_eng
-</requires>
diff --git a/src/block/serpent_sse2/serp_sse2_sbox.h b/src/block/serpent_sse2/serp_sse2_sbox.h
deleted file mode 100644
index 40c552e87..000000000
--- a/src/block/serpent_sse2/serp_sse2_sbox.h
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
-* Serpent Sboxes in SSE2 form
-* (C) 2009 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#ifndef SERPENT_SSE2_SBOXES_H__
-#define SERPENT_SSE2_SBOXES_H__
-
-#define SBoxE1(B0, B1, B2, B3) \
- do { \
- B3 = _mm_xor_si128(B3, B0); \
- __m128i B4 = B1; \
- B1 = _mm_and_si128(B1, B3); \
- B4 = _mm_xor_si128(B4, B2); \
- B1 = _mm_xor_si128(B1, B0); \
- B0 = _mm_or_si128(B0, B3); \
- B0 = _mm_xor_si128(B0, B4); \
- B4 = _mm_xor_si128(B4, B3); \
- B3 = _mm_xor_si128(B3, B2); \
- B2 = _mm_or_si128(B2, B1); \
- B2 = _mm_xor_si128(B2, B4); \
- B4 = _mm_xor_si128(B4, all_ones); \
- B4 = _mm_or_si128(B4, B1); \
- B1 = _mm_xor_si128(B1, B3); \
- B1 = _mm_xor_si128(B1, B4); \
- B3 = _mm_or_si128(B3, B0); \
- B1 = _mm_xor_si128(B1, B3); \
- B4 = _mm_xor_si128(B4, B3); \
- B3 = B0; \
- B0 = B1; \
- B1 = B4; \
- } while(0);
-
-#define SBoxE2(B0, B1, B2, B3) \
- do { \
- B0 = _mm_xor_si128(B0, all_ones); \
- B2 = _mm_xor_si128(B2, all_ones); \
- __m128i B4 = B0; \
- B0 = _mm_and_si128(B0, B1); \
- B2 = _mm_xor_si128(B2, B0); \
- B0 = _mm_or_si128(B0, B3); \
- B3 = _mm_xor_si128(B3, B2); \
- B1 = _mm_xor_si128(B1, B0); \
- B0 = _mm_xor_si128(B0, B4); \
- B4 = _mm_or_si128(B4, B1); \
- B1 = _mm_xor_si128(B1, B3); \
- B2 = _mm_or_si128(B2, B0); \
- B2 = _mm_and_si128(B2, B4); \
- B0 = _mm_xor_si128(B0, B1); \
- B1 = _mm_and_si128(B1, B2); \
- B1 = _mm_xor_si128(B1, B0); \
- B0 = _mm_and_si128(B0, B2); \
- B4 = _mm_xor_si128(B4, B0); \
- B0 = B2; \
- B2 = B3; \
- B3 = B1; \
- B1 = B4; \
- } while(0);
-
-#define SBoxE3(B0, B1, B2, B3) \
- do { \
- __m128i B4 = B0; \
- B0 = _mm_and_si128(B0, B2); \
- B0 = _mm_xor_si128(B0, B3); \
- B2 = _mm_xor_si128(B2, B1); \
- B2 = _mm_xor_si128(B2, B0); \
- B3 = _mm_or_si128(B3, B4); \
- B3 = _mm_xor_si128(B3, B1); \
- B4 = _mm_xor_si128(B4, B2); \
- B1 = B3; \
- B3 = _mm_or_si128(B3, B4); \
- B3 = _mm_xor_si128(B3, B0); \
- B0 = _mm_and_si128(B0, B1); \
- B4 = _mm_xor_si128(B4, B0); \
- B1 = _mm_xor_si128(B1, B3); \
- B1 = _mm_xor_si128(B1, B4); \
- B4 = _mm_xor_si128(B4, all_ones); \
- B0 = B2; \
- B2 = B1; \
- B1 = B3; \
- B3 = B4; \
- } while(0);
-
-#define SBoxE4(B0, B1, B2, B3) \
- do { \
- __m128i B4 = B0; \
- B0 = _mm_or_si128(B0, B3); \
- B3 = _mm_xor_si128(B3, B1); \
- B1 = _mm_and_si128(B1, B4); \
- B4 = _mm_xor_si128(B4, B2); \
- B2 = _mm_xor_si128(B2, B3); \
- B3 = _mm_and_si128(B3, B0); \
- B4 = _mm_or_si128(B4, B1); \
- B3 = _mm_xor_si128(B3, B4); \
- B0 = _mm_xor_si128(B0, B1); \
- B4 = _mm_and_si128(B4, B0); \
- B1 = _mm_xor_si128(B1, B3); \
- B4 = _mm_xor_si128(B4, B2); \
- B1 = _mm_or_si128(B1, B0); \
- B1 = _mm_xor_si128(B1, B2); \
- B0 = _mm_xor_si128(B0, B3); \
- B2 = B1; \
- B1 = _mm_or_si128(B1, B3); \
- B0 = _mm_xor_si128(B0, B1); \
- B1 = B2; \
- B2 = B3; \
- B3 = B4; \
- } while(0);
-
-#define SBoxE5(B0, B1, B2, B3) \
- do { \
- B1 = _mm_xor_si128(B1, B3); \
- B3 = _mm_xor_si128(B3, all_ones); \
- B2 = _mm_xor_si128(B2, B3); \
- B3 = _mm_xor_si128(B3, B0); \
- __m128i B4 = B1; \
- B1 = _mm_and_si128(B1, B3); \
- B1 = _mm_xor_si128(B1, B2); \
- B4 = _mm_xor_si128(B4, B3); \
- B0 = _mm_xor_si128(B0, B4); \
- B2 = _mm_and_si128(B2, B4); \
- B2 = _mm_xor_si128(B2, B0); \
- B0 = _mm_and_si128(B0, B1); \
- B3 = _mm_xor_si128(B3, B0); \
- B4 = _mm_or_si128(B4, B1); \
- B4 = _mm_xor_si128(B4, B0); \
- B0 = _mm_or_si128(B0, B3); \
- B0 = _mm_xor_si128(B0, B2); \
- B2 = _mm_and_si128(B2, B3); \
- B0 = _mm_xor_si128(B0, all_ones); \
- B4 = _mm_xor_si128(B4, B2); \
- B2 = B0; \
- B0 = B1; \
- B1 = B4; \
- } while(0);
-
-#define SBoxE6(B0, B1, B2, B3) \
- do { \
- B0 = _mm_xor_si128(B0, B1); \
- B1 = _mm_xor_si128(B1, B3); \
- B3 = _mm_xor_si128(B3, all_ones); \
- __m128i B4 = B1; \
- B1 = _mm_and_si128(B1, B0); \
- B2 = _mm_xor_si128(B2, B3); \
- B1 = _mm_xor_si128(B1, B2); \
- B2 = _mm_or_si128(B2, B4); \
- B4 = _mm_xor_si128(B4, B3); \
- B3 = _mm_and_si128(B3, B1); \
- B3 = _mm_xor_si128(B3, B0); \
- B4 = _mm_xor_si128(B4, B1); \
- B4 = _mm_xor_si128(B4, B2); \
- B2 = _mm_xor_si128(B2, B0); \
- B0 = _mm_and_si128(B0, B3); \
- B2 = _mm_xor_si128(B2, all_ones); \
- B0 = _mm_xor_si128(B0, B4); \
- B4 = _mm_or_si128(B4, B3); \
- B4 = _mm_xor_si128(B4, B2); \
- B2 = B0; \
- B0 = B1; \
- B1 = B3; \
- B3 = B4; \
- } while(0);
-
-#define SBoxE7(B0, B1, B2, B3) \
- do { \
- B2 = _mm_xor_si128(B2, all_ones); \
- __m128i B4 = B3; \
- B3 = _mm_and_si128(B3, B0); \
- B0 = _mm_xor_si128(B0, B4); \
- B3 = _mm_xor_si128(B3, B2); \
- B2 = _mm_or_si128(B2, B4); \
- B1 = _mm_xor_si128(B1, B3); \
- B2 = _mm_xor_si128(B2, B0); \
- B0 = _mm_or_si128(B0, B1); \
- B2 = _mm_xor_si128(B2, B1); \
- B4 = _mm_xor_si128(B4, B0); \
- B0 = _mm_or_si128(B0, B3); \
- B0 = _mm_xor_si128(B0, B2); \
- B4 = _mm_xor_si128(B4, B3); \
- B4 = _mm_xor_si128(B4, B0); \
- B3 = _mm_xor_si128(B3, all_ones); \
- B2 = _mm_and_si128(B2, B4); \
- B3 = _mm_xor_si128(B3, B2); \
- B2 = B4; \
- } while(0);
-
-#define SBoxE8(B0, B1, B2, B3) \
- do { \
- __m128i B4 = B1; \
- B1 = _mm_or_si128(B1, B2); \
- B1 = _mm_xor_si128(B1, B3); \
- B4 = _mm_xor_si128(B4, B2); \
- B2 = _mm_xor_si128(B2, B1); \
- B3 = _mm_or_si128(B3, B4); \
- B3 = _mm_and_si128(B3, B0); \
- B4 = _mm_xor_si128(B4, B2); \
- B3 = _mm_xor_si128(B3, B1); \
- B1 = _mm_or_si128(B1, B4); \
- B1 = _mm_xor_si128(B1, B0); \
- B0 = _mm_or_si128(B0, B4); \
- B0 = _mm_xor_si128(B0, B2); \
- B1 = _mm_xor_si128(B1, B4); \
- B2 = _mm_xor_si128(B2, B1); \
- B1 = _mm_and_si128(B1, B0); \
- B1 = _mm_xor_si128(B1, B4); \
- B2 = _mm_xor_si128(B2, all_ones); \
- B2 = _mm_or_si128(B2, B0); \
- B4 = _mm_xor_si128(B4, B2); \
- B2 = B1; \
- B1 = B3; \
- B3 = B0; \
- B0 = B4; \
- } while(0);
-
-#define SBoxD1(B0, B1, B2, B3) \
- do \
- { \
- B2 = _mm_xor_si128(B2, all_ones); \
- __m128i B4 = B1; \
- B1 = _mm_or_si128(B1, B0); \
- B4 = _mm_xor_si128(B4, all_ones); \
- B1 = _mm_xor_si128(B1, B2); \
- B2 = _mm_or_si128(B2, B4); \
- B1 = _mm_xor_si128(B1, B3); \
- B0 = _mm_xor_si128(B0, B4); \
- B2 = _mm_xor_si128(B2, B0); \
- B0 = _mm_and_si128(B0, B3); \
- B4 = _mm_xor_si128(B4, B0); \
- B0 = _mm_or_si128(B0, B1); \
- B0 = _mm_xor_si128(B0, B2); \
- B3 = _mm_xor_si128(B3, B4); \
- B2 = _mm_xor_si128(B2, B1); \
- B3 = _mm_xor_si128(B3, B0); \
- B3 = _mm_xor_si128(B3, B1); \
- B2 = _mm_and_si128(B2, B3); \
- B4 = _mm_xor_si128(B4, B2); \
- B2 = B1; \
- B1 = B4; \
- } while(0);
-
-#define SBoxD2(B0, B1, B2, B3) \
- do \
- { \
- __m128i B4 = B1; \
- B1 = _mm_xor_si128(B1, B3); \
- B3 = _mm_and_si128(B3, B1); \
- B4 = _mm_xor_si128(B4, B2); \
- B3 = _mm_xor_si128(B3, B0); \
- B0 = _mm_or_si128(B0, B1); \
- B2 = _mm_xor_si128(B2, B3); \
- B0 = _mm_xor_si128(B0, B4); \
- B0 = _mm_or_si128(B0, B2); \
- B1 = _mm_xor_si128(B1, B3); \
- B0 = _mm_xor_si128(B0, B1); \
- B1 = _mm_or_si128(B1, B3); \
- B1 = _mm_xor_si128(B1, B0); \
- B4 = _mm_xor_si128(B4, all_ones); \
- B4 = _mm_xor_si128(B4, B1); \
- B1 = _mm_or_si128(B1, B0); \
- B1 = _mm_xor_si128(B1, B0); \
- B1 = _mm_or_si128(B1, B4); \
- B3 = _mm_xor_si128(B3, B1); \
- B1 = B0; \
- B0 = B4; \
- B4 = B2; \
- B2 = B3; \
- B3 = B4; \
- } while(0);
-
-#define SBoxD3(B0, B1, B2, B3) \
- do \
- { \
- B2 = _mm_xor_si128(B2, B3); \
- B3 = _mm_xor_si128(B3, B0); \
- __m128i B4 = B3; \
- B3 = _mm_and_si128(B3, B2); \
- B3 = _mm_xor_si128(B3, B1); \
- B1 = _mm_or_si128(B1, B2); \
- B1 = _mm_xor_si128(B1, B4); \
- B4 = _mm_and_si128(B4, B3); \
- B2 = _mm_xor_si128(B2, B3); \
- B4 = _mm_and_si128(B4, B0); \
- B4 = _mm_xor_si128(B4, B2); \
- B2 = _mm_and_si128(B2, B1); \
- B2 = _mm_or_si128(B2, B0); \
- B3 = _mm_xor_si128(B3, all_ones); \
- B2 = _mm_xor_si128(B2, B3); \
- B0 = _mm_xor_si128(B0, B3); \
- B0 = _mm_and_si128(B0, B1); \
- B3 = _mm_xor_si128(B3, B4); \
- B3 = _mm_xor_si128(B3, B0); \
- B0 = B1; \
- B1 = B4; \
- } while(0);
-
-#define SBoxD4(B0, B1, B2, B3) \
- do \
- { \
- __m128i B4 = B2; \
- B2 = _mm_xor_si128(B2, B1); \
- B0 = _mm_xor_si128(B0, B2); \
- B4 = _mm_and_si128(B4, B2); \
- B4 = _mm_xor_si128(B4, B0); \
- B0 = _mm_and_si128(B0, B1); \
- B1 = _mm_xor_si128(B1, B3); \
- B3 = _mm_or_si128(B3, B4); \
- B2 = _mm_xor_si128(B2, B3); \
- B0 = _mm_xor_si128(B0, B3); \
- B1 = _mm_xor_si128(B1, B4); \
- B3 = _mm_and_si128(B3, B2); \
- B3 = _mm_xor_si128(B3, B1); \
- B1 = _mm_xor_si128(B1, B0); \
- B1 = _mm_or_si128(B1, B2); \
- B0 = _mm_xor_si128(B0, B3); \
- B1 = _mm_xor_si128(B1, B4); \
- B0 = _mm_xor_si128(B0, B1); \
- B4 = B0; \
- B0 = B2; \
- B2 = B3; \
- B3 = B4; \
- } while(0);
-
-#define SBoxD5(B0, B1, B2, B3) \
- do \
- { \
- __m128i B4 = B2; \
- B2 = _mm_and_si128(B2, B3); \
- B2 = _mm_xor_si128(B2, B1); \
- B1 = _mm_or_si128(B1, B3); \
- B1 = _mm_and_si128(B1, B0); \
- B4 = _mm_xor_si128(B4, B2); \
- B4 = _mm_xor_si128(B4, B1); \
- B1 = _mm_and_si128(B1, B2); \
- B0 = _mm_xor_si128(B0, all_ones); \
- B3 = _mm_xor_si128(B3, B4); \
- B1 = _mm_xor_si128(B1, B3); \
- B3 = _mm_and_si128(B3, B0); \
- B3 = _mm_xor_si128(B3, B2); \
- B0 = _mm_xor_si128(B0, B1); \
- B2 = _mm_and_si128(B2, B0); \
- B3 = _mm_xor_si128(B3, B0); \
- B2 = _mm_xor_si128(B2, B4); \
- B2 = _mm_or_si128(B2, B3); \
- B3 = _mm_xor_si128(B3, B0); \
- B2 = _mm_xor_si128(B2, B1); \
- B1 = B3; \
- B3 = B4; \
- } while(0);
-
-#define SBoxD6(B0, B1, B2, B3) \
- do \
- { \
- B1 = _mm_xor_si128(B1, all_ones); \
- __m128i B4 = B3; \
- B2 = _mm_xor_si128(B2, B1); \
- B3 = _mm_or_si128(B3, B0); \
- B3 = _mm_xor_si128(B3, B2); \
- B2 = _mm_or_si128(B2, B1); \
- B2 = _mm_and_si128(B2, B0); \
- B4 = _mm_xor_si128(B4, B3); \
- B2 = _mm_xor_si128(B2, B4); \
- B4 = _mm_or_si128(B4, B0); \
- B4 = _mm_xor_si128(B4, B1); \
- B1 = _mm_and_si128(B1, B2); \
- B1 = _mm_xor_si128(B1, B3); \
- B4 = _mm_xor_si128(B4, B2); \
- B3 = _mm_and_si128(B3, B4); \
- B4 = _mm_xor_si128(B4, B1); \
- B3 = _mm_xor_si128(B3, B4); \
- B4 = _mm_xor_si128(B4, all_ones); \
- B3 = _mm_xor_si128(B3, B0); \
- B0 = B1; \
- B1 = B4; \
- B4 = B3; \
- B3 = B2; \
- B2 = B4; \
- } while(0);
-
-#define SBoxD7(B0, B1, B2, B3) \
- do \
- { \
- B0 = _mm_xor_si128(B0, B2); \
- __m128i B4 = B2; \
- B2 = _mm_and_si128(B2, B0); \
- B4 = _mm_xor_si128(B4, B3); \
- B2 = _mm_xor_si128(B2, all_ones); \
- B3 = _mm_xor_si128(B3, B1); \
- B2 = _mm_xor_si128(B2, B3); \
- B4 = _mm_or_si128(B4, B0); \
- B0 = _mm_xor_si128(B0, B2); \
- B3 = _mm_xor_si128(B3, B4); \
- B4 = _mm_xor_si128(B4, B1); \
- B1 = _mm_and_si128(B1, B3); \
- B1 = _mm_xor_si128(B1, B0); \
- B0 = _mm_xor_si128(B0, B3); \
- B0 = _mm_or_si128(B0, B2); \
- B3 = _mm_xor_si128(B3, B1); \
- B4 = _mm_xor_si128(B4, B0); \
- B0 = B1; \
- B1 = B2; \
- B2 = B4; \
- } while(0);
-
-#define SBoxD8(B0, B1, B2, B3) \
- do \
- { \
- __m128i B4 = B2; \
- B2 = _mm_xor_si128(B2, B0); \
- B0 = _mm_and_si128(B0, B3); \
- B4 = _mm_or_si128(B4, B3); \
- B2 = _mm_xor_si128(B2, all_ones); \
- B3 = _mm_xor_si128(B3, B1); \
- B1 = _mm_or_si128(B1, B0); \
- B0 = _mm_xor_si128(B0, B2); \
- B2 = _mm_and_si128(B2, B4); \
- B3 = _mm_and_si128(B3, B4); \
- B1 = _mm_xor_si128(B1, B2); \
- B2 = _mm_xor_si128(B2, B0); \
- B0 = _mm_or_si128(B0, B2); \
- B4 = _mm_xor_si128(B4, B1); \
- B0 = _mm_xor_si128(B0, B3); \
- B3 = _mm_xor_si128(B3, B4); \
- B4 = _mm_or_si128(B4, B0); \
- B3 = _mm_xor_si128(B3, B2); \
- B4 = _mm_xor_si128(B4, B2); \
- B2 = B1; \
- B1 = B0; \
- B0 = B3; \
- B3 = B4; \
- } while(0);
-
-#endif
diff --git a/src/block/skipjack/info.txt b/src/block/skipjack/info.txt
index 9cdddfe6b..7dfffda4e 100644
--- a/src/block/skipjack/info.txt
+++ b/src/block/skipjack/info.txt
@@ -1,3 +1 @@
-realname "Skipjack"
-
define SKIPJACK
diff --git a/src/block/skipjack/skipjack.cpp b/src/block/skipjack/skipjack.cpp
index 6c308c0f8..e8b2cfb8d 100644
--- a/src/block/skipjack/skipjack.cpp
+++ b/src/block/skipjack/skipjack.cpp
@@ -165,7 +165,7 @@ void Skipjack::key_schedule(const byte key[], u32bit)
/*
* Clear memory of sensitive data
*/
-void Skipjack::clear() throw()
+void Skipjack::clear()
{
for(u32bit j = 0; j != 10; ++j)
FTABLE[j].clear();
diff --git a/src/block/skipjack/skipjack.h b/src/block/skipjack/skipjack.h
index f12032f36..60fad6310 100644
--- a/src/block/skipjack/skipjack.h
+++ b/src/block/skipjack/skipjack.h
@@ -21,7 +21,7 @@ class BOTAN_DLL Skipjack : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw();
+ void clear();
std::string name() const { return "Skipjack"; }
BlockCipher* clone() const { return new Skipjack; }
diff --git a/src/block/square/info.txt b/src/block/square/info.txt
index 7c517be71..d33379815 100644
--- a/src/block/square/info.txt
+++ b/src/block/square/info.txt
@@ -1,3 +1 @@
-realname "Square"
-
define SQUARE
diff --git a/src/block/square/square.cpp b/src/block/square/square.cpp
index fdd47d3b2..90f2301cf 100644
--- a/src/block/square/square.cpp
+++ b/src/block/square/square.cpp
@@ -196,7 +196,7 @@ void Square::transform(u32bit round_key[4])
/*
* Clear memory of sensitive data
*/
-void Square::clear() throw()
+void Square::clear()
{
EK.clear();
DK.clear();
diff --git a/src/block/square/square.h b/src/block/square/square.h
index 5d9cfc78c..088122181 100644
--- a/src/block/square/square.h
+++ b/src/block/square/square.h
@@ -21,7 +21,7 @@ class BOTAN_DLL Square : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw();
+ void clear();
std::string name() const { return "Square"; }
BlockCipher* clone() const { return new Square; }
diff --git a/src/block/tea/info.txt b/src/block/tea/info.txt
index 85a19ee4c..67ed5a656 100644
--- a/src/block/tea/info.txt
+++ b/src/block/tea/info.txt
@@ -1,3 +1 @@
-realname "TEA"
-
define TEA
diff --git a/src/block/tea/tea.h b/src/block/tea/tea.h
index 825a051aa..c19f272a6 100644
--- a/src/block/tea/tea.h
+++ b/src/block/tea/tea.h
@@ -21,7 +21,7 @@ class BOTAN_DLL TEA : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { K.clear(); }
+ void clear() { K.clear(); }
std::string name() const { return "TEA"; }
BlockCipher* clone() const { return new TEA; }
diff --git a/src/block/twofish/info.txt b/src/block/twofish/info.txt
index 319da6e6e..88eae9ce7 100644
--- a/src/block/twofish/info.txt
+++ b/src/block/twofish/info.txt
@@ -1,3 +1 @@
-realname "Twofish"
-
define TWOFISH
diff --git a/src/block/twofish/twofish.cpp b/src/block/twofish/twofish.cpp
index 6a482a8f3..3136837aa 100644
--- a/src/block/twofish/twofish.cpp
+++ b/src/block/twofish/twofish.cpp
@@ -218,7 +218,7 @@ void Twofish::rs_mul(byte S[4], byte key, u32bit offset)
/*
* Clear memory of sensitive data
*/
-void Twofish::clear() throw()
+void Twofish::clear()
{
SBox0.clear();
SBox1.clear();
diff --git a/src/block/twofish/twofish.h b/src/block/twofish/twofish.h
index 87b9aa626..71a1e8781 100644
--- a/src/block/twofish/twofish.h
+++ b/src/block/twofish/twofish.h
@@ -21,7 +21,7 @@ class BOTAN_DLL Twofish : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw();
+ void clear();
std::string name() const { return "Twofish"; }
BlockCipher* clone() const { return new Twofish; }
diff --git a/src/block/xtea/info.txt b/src/block/xtea/info.txt
index 1887e6673..d9d37607c 100644
--- a/src/block/xtea/info.txt
+++ b/src/block/xtea/info.txt
@@ -1,3 +1 @@
-realname "XTEA"
-
define XTEA
diff --git a/src/block/xtea/xtea.cpp b/src/block/xtea/xtea.cpp
index 77543e1e8..fc14c0a57 100644
--- a/src/block/xtea/xtea.cpp
+++ b/src/block/xtea/xtea.cpp
@@ -10,11 +10,65 @@
namespace Botan {
+namespace {
+
+void xtea_encrypt_4(const byte in[32], byte out[32], const u32bit EK[64])
+ {
+ u32bit L0, R0, L1, R1, L2, R2, L3, R3;
+ load_be(in, L0, R0, L1, R1, L2, R2, L3, R3);
+
+ for(u32bit i = 0; i != 32; ++i)
+ {
+ L0 += (((R0 << 4) ^ (R0 >> 5)) + R0) ^ EK[2*i];
+ L1 += (((R1 << 4) ^ (R1 >> 5)) + R1) ^ EK[2*i];
+ L2 += (((R2 << 4) ^ (R2 >> 5)) + R2) ^ EK[2*i];
+ L3 += (((R3 << 4) ^ (R3 >> 5)) + R3) ^ EK[2*i];
+
+ R0 += (((L0 << 4) ^ (L0 >> 5)) + L0) ^ EK[2*i+1];
+ R1 += (((L1 << 4) ^ (L1 >> 5)) + L1) ^ EK[2*i+1];
+ R2 += (((L2 << 4) ^ (L2 >> 5)) + L2) ^ EK[2*i+1];
+ R3 += (((L3 << 4) ^ (L3 >> 5)) + L3) ^ EK[2*i+1];
+ }
+
+ store_be(out, L0, R0, L1, R1, L2, R2, L3, R3);
+ }
+
+void xtea_decrypt_4(const byte in[32], byte out[32], const u32bit EK[64])
+ {
+ u32bit L0, R0, L1, R1, L2, R2, L3, R3;
+ load_be(in, L0, R0, L1, R1, L2, R2, L3, R3);
+
+ for(u32bit i = 0; i != 32; ++i)
+ {
+ R0 -= (((L0 << 4) ^ (L0 >> 5)) + L0) ^ EK[63 - 2*i];
+ R1 -= (((L1 << 4) ^ (L1 >> 5)) + L1) ^ EK[63 - 2*i];
+ R2 -= (((L2 << 4) ^ (L2 >> 5)) + L2) ^ EK[63 - 2*i];
+ R3 -= (((L3 << 4) ^ (L3 >> 5)) + L3) ^ EK[63 - 2*i];
+
+ L0 -= (((R0 << 4) ^ (R0 >> 5)) + R0) ^ EK[62 - 2*i];
+ L1 -= (((R1 << 4) ^ (R1 >> 5)) + R1) ^ EK[62 - 2*i];
+ L2 -= (((R2 << 4) ^ (R2 >> 5)) + R2) ^ EK[62 - 2*i];
+ L3 -= (((R3 << 4) ^ (R3 >> 5)) + R3) ^ EK[62 - 2*i];
+ }
+
+ store_be(out, L0, R0, L1, R1, L2, R2, L3, R3);
+ }
+
+}
+
/*
* XTEA Encryption
*/
void XTEA::encrypt_n(const byte in[], byte out[], u32bit blocks) const
{
+ while(blocks >= 4)
+ {
+ xtea_encrypt_4(in, out, this->EK);
+ in += 4 * BLOCK_SIZE;
+ out += 4 * BLOCK_SIZE;
+ blocks -= 4;
+ }
+
for(u32bit i = 0; i != blocks; ++i)
{
u32bit L = load_be<u32bit>(in, 0), R = load_be<u32bit>(in, 1);
@@ -37,6 +91,14 @@ void XTEA::encrypt_n(const byte in[], byte out[], u32bit blocks) const
*/
void XTEA::decrypt_n(const byte in[], byte out[], u32bit blocks) const
{
+ while(blocks >= 4)
+ {
+ xtea_decrypt_4(in, out, this->EK);
+ in += 4 * BLOCK_SIZE;
+ out += 4 * BLOCK_SIZE;
+ blocks -= 4;
+ }
+
for(u32bit i = 0; i != blocks; ++i)
{
u32bit L = load_be<u32bit>(in, 0), R = load_be<u32bit>(in, 1);
diff --git a/src/block/xtea/xtea.h b/src/block/xtea/xtea.h
index de265818d..9982d0712 100644
--- a/src/block/xtea/xtea.h
+++ b/src/block/xtea/xtea.h
@@ -21,12 +21,12 @@ class BOTAN_DLL XTEA : public BlockCipher
void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
- void clear() throw() { EK.clear(); }
+ void clear() { EK.clear(); }
std::string name() const { return "XTEA"; }
BlockCipher* clone() const { return new XTEA; }
XTEA() : BlockCipher(8, 16) {}
- private:
+ protected:
void key_schedule(const byte[], u32bit);
SecureBuffer<u32bit, 64> EK;
};
diff --git a/src/block/xtea_simd/info.txt b/src/block/xtea_simd/info.txt
new file mode 100644
index 000000000..98a6e941f
--- /dev/null
+++ b/src/block/xtea_simd/info.txt
@@ -0,0 +1,14 @@
+define XTEA_SIMD
+
+load_on auto
+
+<add>
+xtea_simd.cpp
+xtea_simd.h
+</add>
+
+<requires>
+xtea
+simd_32
+simd_engine
+</requires>
diff --git a/src/block/xtea_simd/xtea_simd.cpp b/src/block/xtea_simd/xtea_simd.cpp
new file mode 100644
index 000000000..6151c355c
--- /dev/null
+++ b/src/block/xtea_simd/xtea_simd.cpp
@@ -0,0 +1,124 @@
+/*
+* XTEA in SIMD
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/xtea_simd.h>
+#include <botan/loadstor.h>
+#include <botan/simd_32.h>
+
+namespace Botan {
+
+namespace {
+
+void xtea_encrypt_8(const byte in[64], byte out[64], const u32bit EK[64])
+ {
+ SIMD_32 L0 = SIMD_32::load_be(in );
+ SIMD_32 R0 = SIMD_32::load_be(in + 16);
+ SIMD_32 L1 = SIMD_32::load_be(in + 32);
+ SIMD_32 R1 = SIMD_32::load_be(in + 48);
+
+ SIMD_32::transpose(L0, R0, L1, R1);
+
+ for(u32bit i = 0; i != 32; i += 2)
+ {
+ SIMD_32 K0(EK[2*i ]);
+ SIMD_32 K1(EK[2*i+1]);
+ SIMD_32 K2(EK[2*i+2]);
+ SIMD_32 K3(EK[2*i+3]);
+
+ L0 += (((R0 << 4) ^ (R0 >> 5)) + R0) ^ K0;
+ L1 += (((R1 << 4) ^ (R1 >> 5)) + R1) ^ K0;
+
+ R0 += (((L0 << 4) ^ (L0 >> 5)) + L0) ^ K1;
+ R1 += (((L1 << 4) ^ (L1 >> 5)) + L1) ^ K1;
+
+ L0 += (((R0 << 4) ^ (R0 >> 5)) + R0) ^ K2;
+ L1 += (((R1 << 4) ^ (R1 >> 5)) + R1) ^ K2;
+
+ R0 += (((L0 << 4) ^ (L0 >> 5)) + L0) ^ K3;
+ R1 += (((L1 << 4) ^ (L1 >> 5)) + L1) ^ K3;
+ }
+
+ SIMD_32::transpose(L0, R0, L1, R1);
+
+ L0.store_be(out);
+ R0.store_be(out + 16);
+ L1.store_be(out + 32);
+ R1.store_be(out + 48);
+ }
+
+void xtea_decrypt_8(const byte in[64], byte out[64], const u32bit EK[64])
+ {
+ SIMD_32 L0 = SIMD_32::load_be(in );
+ SIMD_32 R0 = SIMD_32::load_be(in + 16);
+ SIMD_32 L1 = SIMD_32::load_be(in + 32);
+ SIMD_32 R1 = SIMD_32::load_be(in + 48);
+
+ SIMD_32::transpose(L0, R0, L1, R1);
+
+ for(u32bit i = 0; i != 32; i += 2)
+ {
+ SIMD_32 K0(EK[63 - 2*i]);
+ SIMD_32 K1(EK[62 - 2*i]);
+ SIMD_32 K2(EK[61 - 2*i]);
+ SIMD_32 K3(EK[60 - 2*i]);
+
+ R0 -= (((L0 << 4) ^ (L0 >> 5)) + L0) ^ K0;
+ R1 -= (((L1 << 4) ^ (L1 >> 5)) + L1) ^ K0;
+
+ L0 -= (((R0 << 4) ^ (R0 >> 5)) + R0) ^ K1;
+ L1 -= (((R1 << 4) ^ (R1 >> 5)) + R1) ^ K1;
+
+ R0 -= (((L0 << 4) ^ (L0 >> 5)) + L0) ^ K2;
+ R1 -= (((L1 << 4) ^ (L1 >> 5)) + L1) ^ K2;
+
+ L0 -= (((R0 << 4) ^ (R0 >> 5)) + R0) ^ K3;
+ L1 -= (((R1 << 4) ^ (R1 >> 5)) + R1) ^ K3;
+ }
+
+ SIMD_32::transpose(L0, R0, L1, R1);
+
+ L0.store_be(out);
+ R0.store_be(out + 16);
+ L1.store_be(out + 32);
+ R1.store_be(out + 48);
+ }
+
+}
+
+/*
+* XTEA Encryption
+*/
+void XTEA_SIMD::encrypt_n(const byte in[], byte out[], u32bit blocks) const
+ {
+ while(blocks >= 8)
+ {
+ xtea_encrypt_8(in, out, this->EK);
+ in += 8 * BLOCK_SIZE;
+ out += 8 * BLOCK_SIZE;
+ blocks -= 8;
+ }
+
+ XTEA::encrypt_n(in, out, blocks);
+ }
+
+/*
+* XTEA Decryption
+*/
+void XTEA_SIMD::decrypt_n(const byte in[], byte out[], u32bit blocks) const
+ {
+ while(blocks >= 8)
+ {
+ xtea_decrypt_8(in, out, this->EK);
+ in += 8 * BLOCK_SIZE;
+ out += 8 * BLOCK_SIZE;
+ blocks -= 8;
+ }
+
+ XTEA::decrypt_n(in, out, blocks);
+ }
+
+}
diff --git a/src/block/xtea_simd/xtea_simd.h b/src/block/xtea_simd/xtea_simd.h
new file mode 100644
index 000000000..e4ce734ed
--- /dev/null
+++ b/src/block/xtea_simd/xtea_simd.h
@@ -0,0 +1,28 @@
+/*
+* XTEA in SIMD
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_XTEA_SIMD_H__
+#define BOTAN_XTEA_SIMD_H__
+
+#include <botan/xtea.h>
+
+namespace Botan {
+
+/*
+* XTEA (SIMD variant)
+*/
+class BOTAN_DLL XTEA_SIMD : public XTEA
+ {
+ public:
+ void encrypt_n(const byte in[], byte out[], u32bit blocks) const;
+ void decrypt_n(const byte in[], byte out[], u32bit blocks) const;
+ BlockCipher* clone() const { return new XTEA_SIMD; }
+ };
+
+}
+
+#endif
diff --git a/src/build-data/arch/alpha.txt b/src/build-data/arch/alpha.txt
index 60b264396..b1d939ed1 100644
--- a/src/build-data/arch/alpha.txt
+++ b/src/build-data/arch/alpha.txt
@@ -1,5 +1,3 @@
-realname "DEC Alpha"
-
default_submodel alpha-ev4
endian little
diff --git a/src/build-data/arch/amd64.txt b/src/build-data/arch/amd64.txt
index 216588e7b..96da0e3a9 100644
--- a/src/build-data/arch/amd64.txt
+++ b/src/build-data/arch/amd64.txt
@@ -1,5 +1,3 @@
-realname "x86-64"
-
default_submodel opteron
endian little
diff --git a/src/build-data/arch/arm.txt b/src/build-data/arch/arm.txt
index c6be4ad46..5f05d4cad 100644
--- a/src/build-data/arch/arm.txt
+++ b/src/build-data/arch/arm.txt
@@ -1,5 +1,3 @@
-realname "ARM"
-
default_submodel arm2
<submodels>
diff --git a/src/build-data/arch/hitachi-sh.txt b/src/build-data/arch/hitachi-sh.txt
index 8e9f7eee3..85a741f59 100644
--- a/src/build-data/arch/hitachi-sh.txt
+++ b/src/build-data/arch/hitachi-sh.txt
@@ -1,5 +1,3 @@
-realname "Hitachi SH"
-
default_submodel hitachi-sh1
<submodels>
diff --git a/src/build-data/arch/hppa.txt b/src/build-data/arch/hppa.txt
index 4cdd40889..67bca263d 100644
--- a/src/build-data/arch/hppa.txt
+++ b/src/build-data/arch/hppa.txt
@@ -1,5 +1,3 @@
-realname "HP-PA"
-
default_submodel hppa1.0
<aliases>
diff --git a/src/build-data/arch/ia32.txt b/src/build-data/arch/ia32.txt
index aafcf9a77..0fe665e68 100644
--- a/src/build-data/arch/ia32.txt
+++ b/src/build-data/arch/ia32.txt
@@ -1,5 +1,3 @@
-realname "IA-32"
-
default_submodel i386
endian little
diff --git a/src/build-data/arch/ia64.txt b/src/build-data/arch/ia64.txt
index 7ca84c007..65309f0ff 100644
--- a/src/build-data/arch/ia64.txt
+++ b/src/build-data/arch/ia64.txt
@@ -1,5 +1,3 @@
-realname "IA-64"
-
# This is safe: only affects tuning, not ISA
default_submodel itanium2
diff --git a/src/build-data/arch/m68k.txt b/src/build-data/arch/m68k.txt
index 759a3dac1..3a8b5e8b3 100644
--- a/src/build-data/arch/m68k.txt
+++ b/src/build-data/arch/m68k.txt
@@ -1,5 +1,3 @@
-realname "Motorola 680x0"
-
default_submodel 68020
endian big
diff --git a/src/build-data/arch/mips32.txt b/src/build-data/arch/mips32.txt
index 9846c8fb2..ec9d4b5bf 100644
--- a/src/build-data/arch/mips32.txt
+++ b/src/build-data/arch/mips32.txt
@@ -1,5 +1,3 @@
-realname "MIPS"
-
default_submodel r3000
<aliases>
diff --git a/src/build-data/arch/mips64.txt b/src/build-data/arch/mips64.txt
index dbb49d028..666ba7e18 100644
--- a/src/build-data/arch/mips64.txt
+++ b/src/build-data/arch/mips64.txt
@@ -1,5 +1,3 @@
-realname "MIPS64"
-
default_submodel r4400
<submodels>
diff --git a/src/build-data/arch/ppc.txt b/src/build-data/arch/ppc.txt
index e2dfa6ea2..254643fdd 100644
--- a/src/build-data/arch/ppc.txt
+++ b/src/build-data/arch/ppc.txt
@@ -1,5 +1,3 @@
-realname "PowerPC"
-
endian big
unaligned ok
diff --git a/src/build-data/arch/ppc64.txt b/src/build-data/arch/ppc64.txt
index 6d5eb7ad2..f044ba98d 100644
--- a/src/build-data/arch/ppc64.txt
+++ b/src/build-data/arch/ppc64.txt
@@ -1,9 +1,11 @@
-realname "PowerPC 64"
-
endian big
default_submodel power4
+<aliases>
+powerpc64
+</aliases>
+
<submodel_aliases>
g5 -> ppc970
</submodel_aliases>
diff --git a/src/build-data/arch/s390.txt b/src/build-data/arch/s390.txt
index 312b262c4..8024a4315 100644
--- a/src/build-data/arch/s390.txt
+++ b/src/build-data/arch/s390.txt
@@ -1,5 +1,3 @@
-realname "S/390 31-bit"
-
default_submodel s390
endian big
diff --git a/src/build-data/arch/s390x.txt b/src/build-data/arch/s390x.txt
index 9fe6bd615..00daab8b4 100644
--- a/src/build-data/arch/s390x.txt
+++ b/src/build-data/arch/s390x.txt
@@ -1,5 +1,3 @@
-realname "S/390 64-bit"
-
default_submodel s390x
endian big
diff --git a/src/build-data/arch/sparc32.txt b/src/build-data/arch/sparc32.txt
index 6b752df87..57b19c519 100644
--- a/src/build-data/arch/sparc32.txt
+++ b/src/build-data/arch/sparc32.txt
@@ -1,5 +1,3 @@
-realname "SPARC"
-
# V7 doesn't have integer multiply, so it will be bitterly slow for some things
# (especially BigInt). Also, it's fairly rare nowadays, so we default to V8.
default_submodel sparc32-v8
@@ -31,4 +29,3 @@ sparc-v7 -> sparc32-v7
sparc-v8 -> sparc32-v8
sparc-v9 -> sparc32-v9
</submodel_aliases>
-
diff --git a/src/build-data/arch/sparc64.txt b/src/build-data/arch/sparc64.txt
index c0575efc4..e308055fa 100644
--- a/src/build-data/arch/sparc64.txt
+++ b/src/build-data/arch/sparc64.txt
@@ -1,5 +1,3 @@
-realname "SPARC64"
-
default_submodel sparc64-ultra
<submodels>
diff --git a/src/build-data/cc/bcc.txt b/src/build-data/cc/bcc.txt
index fe88c270e..4315c379f 100644
--- a/src/build-data/cc/bcc.txt
+++ b/src/build-data/cc/bcc.txt
@@ -1,5 +1,3 @@
-realname "Borland C++"
-
macro_name "BORLAND"
binary_name "bcc32"
diff --git a/src/build-data/cc/clang.txt b/src/build-data/cc/clang.txt
new file mode 100644
index 000000000..18f3580ce
--- /dev/null
+++ b/src/build-data/cc/clang.txt
@@ -0,0 +1,44 @@
+# Largely copied from the gcc config
+
+macro_name "CLANG"
+
+binary_name clang
+
+compile_option "-c "
+output_to_option "-o "
+add_include_dir_option "-I"
+add_lib_dir_option "-L"
+add_lib_option "-l"
+
+lang_flags "-D_REENTRANT -ansi -Wno-long-long"
+warning_flags "-W -Wall"
+
+makefile_style unix
+
+lib_opt_flags "-O2"
+check_opt_flags "-O2"
+shared_flags "-fPIC"
+debug_flags "-g"
+no_debug_flags "-finline-functions"
+
+<so_link_flags>
+# The default works for GNU ld and several other Unix linkers
+default -> "$(CXX) -shared -fPIC -Wl,-soname,$(SONAME)"
+</so_link_flags>
+
+<mach_abi_linking>
+amd64 -> "-m64"
+mips64 -> "-mabi=64"
+s390 -> "-m31"
+s390x -> "-m64"
+sparc32 -> "-m32 -mno-app-regs"
+sparc64 -> "-m64 -mno-app-regs"
+ppc64 -> "-m64"
+
+# This should probably be used on most/all targets, but the docs are incomplete
+openbsd -> "-pthread"
+freebsd -> "-pthread"
+dragonfly -> "-pthread"
+netbsd -> "-pthread -D_NETBSD_SOURCE"
+qnx -> "-fexceptions -D_QNX_SOURCE"
+</mach_abi_linking>
diff --git a/src/build-data/cc/compaq.txt b/src/build-data/cc/compaq.txt
index 94075e888..9ad6514ab 100644
--- a/src/build-data/cc/compaq.txt
+++ b/src/build-data/cc/compaq.txt
@@ -1,5 +1,3 @@
-realname "Compaq C++"
-
macro_name "COMPAQ"
binary_name "cxx"
diff --git a/src/build-data/cc/ekopath.txt b/src/build-data/cc/ekopath.txt
index 38516e2f3..ecd813629 100644
--- a/src/build-data/cc/ekopath.txt
+++ b/src/build-data/cc/ekopath.txt
@@ -1,5 +1,3 @@
-realname "PathScale EKOPath C++"
-
macro_name "PATHSCALE"
binary_name "pathCC"
diff --git a/src/build-data/cc/gcc.txt b/src/build-data/cc/gcc.txt
index 47b0390f6..724316690 100644
--- a/src/build-data/cc/gcc.txt
+++ b/src/build-data/cc/gcc.txt
@@ -1,5 +1,3 @@
-realname "GNU C++"
-
macro_name "GCC"
binary_name "g++-4.4.1"
diff --git a/src/build-data/cc/hpcc.txt b/src/build-data/cc/hpcc.txt
index 9c0d4a784..5bde87de9 100644
--- a/src/build-data/cc/hpcc.txt
+++ b/src/build-data/cc/hpcc.txt
@@ -1,5 +1,3 @@
-realname "HP-UX C++"
-
macro_name "HP_ACC"
binary_name "aCC"
diff --git a/src/build-data/cc/icc.txt b/src/build-data/cc/icc.txt
index 9595714f6..628a59e2d 100644
--- a/src/build-data/cc/icc.txt
+++ b/src/build-data/cc/icc.txt
@@ -1,5 +1,3 @@
-realname "Intel C++"
-
macro_name "INTEL"
binary_name "icpc"
diff --git a/src/build-data/cc/kai.txt b/src/build-data/cc/kai.txt
index 52ddba4ab..d0ff1c28a 100644
--- a/src/build-data/cc/kai.txt
+++ b/src/build-data/cc/kai.txt
@@ -1,5 +1,3 @@
-realname "KAI C++"
-
macro_name "KAI"
binary_name "KCC"
diff --git a/src/build-data/cc/mipspro.txt b/src/build-data/cc/mipspro.txt
index a4cfbd1ee..c518f4c26 100644
--- a/src/build-data/cc/mipspro.txt
+++ b/src/build-data/cc/mipspro.txt
@@ -1,5 +1,3 @@
-realname "SGI MIPSPro C++"
-
macro_name "MIPSPRO"
binary_name "CC"
diff --git a/src/build-data/cc/msvc.txt b/src/build-data/cc/msvc.txt
index c19d93e2b..603ea449b 100644
--- a/src/build-data/cc/msvc.txt
+++ b/src/build-data/cc/msvc.txt
@@ -1,5 +1,3 @@
-realname "Visual C++"
-
macro_name "MSVC"
binary_name "cl.exe"
diff --git a/src/build-data/cc/open64.txt b/src/build-data/cc/open64.txt
index 0157440cf..e794c755e 100644
--- a/src/build-data/cc/open64.txt
+++ b/src/build-data/cc/open64.txt
@@ -1,5 +1,3 @@
-realname "Open64"
-
macro_name "OPEN64"
binary_name "openCC"
diff --git a/src/build-data/cc/pgi.txt b/src/build-data/cc/pgi.txt
index c4fdb9e70..a6d2416ab 100644
--- a/src/build-data/cc/pgi.txt
+++ b/src/build-data/cc/pgi.txt
@@ -1,5 +1,3 @@
-realname "Portland Group C++"
-
macro_name "PORTLAND_GROUP"
binary_name "pgCC"
diff --git a/src/build-data/cc/sgipro64.txt b/src/build-data/cc/sgipro64.txt
index be91ac69a..073f2fec0 100644
--- a/src/build-data/cc/sgipro64.txt
+++ b/src/build-data/cc/sgipro64.txt
@@ -1,5 +1,3 @@
-realname "SGI Pro64"
-
macro_name "SGI_PRO64"
binary_name "sgiCC"
diff --git a/src/build-data/cc/sunwspro.txt b/src/build-data/cc/sunwspro.txt
index 9756f8538..7065d4129 100644
--- a/src/build-data/cc/sunwspro.txt
+++ b/src/build-data/cc/sunwspro.txt
@@ -1,5 +1,3 @@
-realname "Sun Workshop Pro C++"
-
macro_name "SUN_WORKSHOP"
binary_name "CC"
diff --git a/src/build-data/cc/xlc.txt b/src/build-data/cc/xlc.txt
index 6d06b4c43..521624395 100644
--- a/src/build-data/cc/xlc.txt
+++ b/src/build-data/cc/xlc.txt
@@ -1,5 +1,3 @@
-realname "IBM XL C/C++"
-
macro_name "IBM_XLC"
binary_name "xlC"
diff --git a/src/build-data/os/aix.txt b/src/build-data/os/aix.txt
index cec818580..0063948c7 100644
--- a/src/build-data/os/aix.txt
+++ b/src/build-data/os/aix.txt
@@ -1,5 +1,3 @@
-realname "AIX"
-
os_type unix
<supports_shared>
diff --git a/src/build-data/os/beos.txt b/src/build-data/os/beos.txt
index 2b12792bb..b843bd525 100644
--- a/src/build-data/os/beos.txt
+++ b/src/build-data/os/beos.txt
@@ -1,5 +1,3 @@
-realname "BeOS"
-
os_type beos
install_root /boot/beos
diff --git a/src/build-data/os/cygwin.txt b/src/build-data/os/cygwin.txt
index c2aadea98..7290648c2 100644
--- a/src/build-data/os/cygwin.txt
+++ b/src/build-data/os/cygwin.txt
@@ -1,5 +1,3 @@
-realname "Cygwin"
-
os_type unix
install_root c:\Botan
diff --git a/src/build-data/os/darwin.txt b/src/build-data/os/darwin.txt
index 298621216..fb18ee191 100644
--- a/src/build-data/os/darwin.txt
+++ b/src/build-data/os/darwin.txt
@@ -1,5 +1,3 @@
-realname "Darwin / MacOS X"
-
os_type unix
so_suffix dylib
diff --git a/src/build-data/os/dragonfly.txt b/src/build-data/os/dragonfly.txt
index 7e3663435..6823de5b6 100644
--- a/src/build-data/os/dragonfly.txt
+++ b/src/build-data/os/dragonfly.txt
@@ -1,5 +1,3 @@
-realname "DragonFly"
-
os_type unix
<target_features>
diff --git a/src/build-data/os/freebsd.txt b/src/build-data/os/freebsd.txt
index ea96b0c88..6823de5b6 100644
--- a/src/build-data/os/freebsd.txt
+++ b/src/build-data/os/freebsd.txt
@@ -1,5 +1,3 @@
-realname "FreeBSD"
-
os_type unix
<target_features>
diff --git a/src/build-data/os/hpux.txt b/src/build-data/os/hpux.txt
index 6e17d3b73..9ff0f7f62 100644
--- a/src/build-data/os/hpux.txt
+++ b/src/build-data/os/hpux.txt
@@ -1,5 +1,3 @@
-realname "HP-UX"
-
os_type unix
so_suffix sl
diff --git a/src/build-data/os/hurd b/src/build-data/os/hurd.txt
index ed56dad75..f0ab18a98 100644
--- a/src/build-data/os/hurd
+++ b/src/build-data/os/hurd.txt
@@ -1,5 +1,3 @@
-realname "Hurd"
-
os_type unix
<target_features>
diff --git a/src/build-data/os/irix.txt b/src/build-data/os/irix.txt
index fd8b43287..0063948c7 100644
--- a/src/build-data/os/irix.txt
+++ b/src/build-data/os/irix.txt
@@ -1,5 +1,3 @@
-realname "IRIX"
-
os_type unix
<supports_shared>
diff --git a/src/build-data/os/linux.txt b/src/build-data/os/linux.txt
index 53528511a..3a92f9dd7 100644
--- a/src/build-data/os/linux.txt
+++ b/src/build-data/os/linux.txt
@@ -1,5 +1,3 @@
-realname "Linux"
-
os_type unix
<target_features>
diff --git a/src/build-data/os/mingw.txt b/src/build-data/os/mingw.txt
index eb25017fc..2b7a16cf7 100644
--- a/src/build-data/os/mingw.txt
+++ b/src/build-data/os/mingw.txt
@@ -1,4 +1,3 @@
-realname "MS Windows (MinGW)"
os_type windows
obj_suffix o
diff --git a/src/build-data/os/netbsd.txt b/src/build-data/os/netbsd.txt
index 435d8f5e8..0063948c7 100644
--- a/src/build-data/os/netbsd.txt
+++ b/src/build-data/os/netbsd.txt
@@ -1,5 +1,3 @@
-realname "NetBSD"
-
os_type unix
<supports_shared>
diff --git a/src/build-data/os/openbsd.txt b/src/build-data/os/openbsd.txt
index cb44bd115..0063948c7 100644
--- a/src/build-data/os/openbsd.txt
+++ b/src/build-data/os/openbsd.txt
@@ -1,5 +1,3 @@
-realname "OpenBSD"
-
os_type unix
<supports_shared>
diff --git a/src/build-data/os/qnx.txt b/src/build-data/os/qnx.txt
index 28bc8dea9..0063948c7 100644
--- a/src/build-data/os/qnx.txt
+++ b/src/build-data/os/qnx.txt
@@ -1,5 +1,3 @@
-realname "QNX"
-
os_type unix
<supports_shared>
diff --git a/src/build-data/os/solaris.txt b/src/build-data/os/solaris.txt
index 8610b4898..47b06dcc4 100644
--- a/src/build-data/os/solaris.txt
+++ b/src/build-data/os/solaris.txt
@@ -1,5 +1,3 @@
-realname "Solaris"
-
os_type unix
<target_features>
diff --git a/src/build-data/os/tru64.txt b/src/build-data/os/tru64.txt
index e320c1df4..8fc301d79 100644
--- a/src/build-data/os/tru64.txt
+++ b/src/build-data/os/tru64.txt
@@ -1,5 +1,3 @@
-realname "Tru64"
-
os_type unix
<supports_shared>
diff --git a/src/build-data/os/windows.txt b/src/build-data/os/windows.txt
index a04d609b8..e2e8bb665 100644
--- a/src/build-data/os/windows.txt
+++ b/src/build-data/os/windows.txt
@@ -1,5 +1,3 @@
-realname "MS Windows"
-
os_type windows
obj_suffix obj
diff --git a/src/cert/cvc/info.txt b/src/cert/cvc/info.txt
index e3e11f5fe..bdd496614 100644
--- a/src/cert/cvc/info.txt
+++ b/src/cert/cvc/info.txt
@@ -1,5 +1,3 @@
-realname "Card Verifiable Certificates"
-
define CARD_VERIFIABLE_CERTIFICATES
uses_tr1 yes
diff --git a/src/cert/x509/info.txt b/src/cert/x509/info.txt
index 552e2aacb..37faea9fa 100644
--- a/src/cert/x509/info.txt
+++ b/src/cert/x509/info.txt
@@ -1,5 +1,3 @@
-realname "X.509"
-
define X509
load_on auto
diff --git a/src/checksum/adler32/adler32.h b/src/checksum/adler32/adler32.h
index 98a28bc81..79804a842 100644
--- a/src/checksum/adler32/adler32.h
+++ b/src/checksum/adler32/adler32.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL Adler32 : public HashFunction
{
public:
- void clear() throw() { S1 = 1; S2 = 0; }
+ void clear() { S1 = 1; S2 = 0; }
std::string name() const { return "Adler32"; }
HashFunction* clone() const { return new Adler32; }
Adler32() : HashFunction(4) { clear(); }
diff --git a/src/checksum/adler32/info.txt b/src/checksum/adler32/info.txt
index 76662cdec..53bc66354 100644
--- a/src/checksum/adler32/info.txt
+++ b/src/checksum/adler32/info.txt
@@ -1,5 +1,3 @@
-realname "Adler32"
-
define ADLER32
load_on auto
diff --git a/src/checksum/crc24/crc24.h b/src/checksum/crc24/crc24.h
index bca4d0e89..f59ac4a45 100644
--- a/src/checksum/crc24/crc24.h
+++ b/src/checksum/crc24/crc24.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL CRC24 : public HashFunction
{
public:
- void clear() throw() { crc = 0xB704CE; }
+ void clear() { crc = 0xB704CE; }
std::string name() const { return "CRC24"; }
HashFunction* clone() const { return new CRC24; }
CRC24() : HashFunction(3) { clear(); }
diff --git a/src/checksum/crc24/info.txt b/src/checksum/crc24/info.txt
index 33b86a9da..8c61aa58b 100644
--- a/src/checksum/crc24/info.txt
+++ b/src/checksum/crc24/info.txt
@@ -1,5 +1,3 @@
-realname "CRC-24"
-
define CRC24
load_on auto
diff --git a/src/checksum/crc32/crc32.h b/src/checksum/crc32/crc32.h
index 390fb100e..998e8489e 100644
--- a/src/checksum/crc32/crc32.h
+++ b/src/checksum/crc32/crc32.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL CRC32 : public HashFunction
{
public:
- void clear() throw() { crc = 0xFFFFFFFF; }
+ void clear() { crc = 0xFFFFFFFF; }
std::string name() const { return "CRC32"; }
HashFunction* clone() const { return new CRC32; }
CRC32() : HashFunction(4) { clear(); }
diff --git a/src/checksum/crc32/info.txt b/src/checksum/crc32/info.txt
index 15933b375..d86848cf4 100644
--- a/src/checksum/crc32/info.txt
+++ b/src/checksum/crc32/info.txt
@@ -1,5 +1,3 @@
-realname "CRC-32"
-
define CRC32
load_on auto
diff --git a/src/cms/info.txt b/src/cms/info.txt
index 82c31b564..55d559f83 100644
--- a/src/cms/info.txt
+++ b/src/cms/info.txt
@@ -1,5 +1,3 @@
-realname "CMS"
-
define CMS
load_on auto
diff --git a/src/codec/base64/info.txt b/src/codec/base64/info.txt
index d4ed80976..1d36b948e 100644
--- a/src/codec/base64/info.txt
+++ b/src/codec/base64/info.txt
@@ -1,5 +1,3 @@
-realname "Base64 Codec"
-
define BASE64_CODEC
load_on auto
diff --git a/src/codec/bzip2/info.txt b/src/codec/bzip2/info.txt
index 1be84e405..7fd426f90 100644
--- a/src/codec/bzip2/info.txt
+++ b/src/codec/bzip2/info.txt
@@ -1,6 +1,5 @@
# This module was written by Peter J. Jones
-realname "Bzip2 Compressor"
define COMPRESSOR_BZIP2
modset compression
diff --git a/src/codec/hex/hex.cpp b/src/codec/hex/hex.cpp
index fbacc278b..201c9bfdf 100644
--- a/src/codec/hex/hex.cpp
+++ b/src/codec/hex/hex.cpp
@@ -13,13 +13,15 @@
namespace Botan {
+const u32bit HEX_CODEC_BUFFER_SIZE = 256;
+
/*
* Hex_Encoder Constructor
*/
Hex_Encoder::Hex_Encoder(bool breaks, u32bit length, Case c) :
casing(c), line_length(breaks ? length : 0)
{
- in.create(64);
+ in.create(HEX_CODEC_BUFFER_SIZE);
out.create(2*in.size());
counter = position = 0;
}
@@ -29,7 +31,7 @@ Hex_Encoder::Hex_Encoder(bool breaks, u32bit length, Case c) :
*/
Hex_Encoder::Hex_Encoder(Case c) : casing(c), line_length(0)
{
- in.create(64);
+ in.create(HEX_CODEC_BUFFER_SIZE);
out.create(2*in.size());
counter = position = 0;
}
@@ -114,7 +116,7 @@ void Hex_Encoder::end_msg()
*/
Hex_Decoder::Hex_Decoder(Decoder_Checking c) : checking(c)
{
- in.create(64);
+ in.create(HEX_CODEC_BUFFER_SIZE);
out.create(in.size() / 2);
position = 0;
}
diff --git a/src/codec/hex/info.txt b/src/codec/hex/info.txt
index 512a5de8b..817ff1a00 100644
--- a/src/codec/hex/info.txt
+++ b/src/codec/hex/info.txt
@@ -1,5 +1,3 @@
-realname "Hex Codec"
-
define HEX_CODEC
load_on auto
diff --git a/src/codec/openpgp/info.txt b/src/codec/openpgp/info.txt
index 6b30850d0..f7774b147 100644
--- a/src/codec/openpgp/info.txt
+++ b/src/codec/openpgp/info.txt
@@ -1,5 +1,3 @@
-realname "OpenPGP Codec"
-
define OPENPGP_CODEC
load_on auto
diff --git a/src/codec/pem/info.txt b/src/codec/pem/info.txt
index bbe8d4c70..5544e1bb0 100644
--- a/src/codec/pem/info.txt
+++ b/src/codec/pem/info.txt
@@ -1,5 +1,3 @@
-realname "PEM Codec"
-
define PEM_CODEC
load_on auto
diff --git a/src/codec/zlib/info.txt b/src/codec/zlib/info.txt
index 9b1c35d84..6556359a8 100644
--- a/src/codec/zlib/info.txt
+++ b/src/codec/zlib/info.txt
@@ -1,6 +1,3 @@
-realname "Zlib Compressor"
-#realname "Zlib/Gzip Compressor"
-
define COMPRESSOR_ZLIB
#define COMPRESSOR_ZLIB,COMPRESSOR_GZIP
diff --git a/src/cryptobox/cryptobox.cpp b/src/cryptobox/cryptobox.cpp
index c27bbaffa..ba7553c55 100644
--- a/src/cryptobox/cryptobox.cpp
+++ b/src/cryptobox/cryptobox.cpp
@@ -8,9 +8,8 @@
#include <botan/cryptobox.h>
#include <botan/filters.h>
#include <botan/pipe.h>
-#include <botan/serpent.h>
+#include <botan/lookup.h>
#include <botan/sha2_64.h>
-#include <botan/ctr.h>
#include <botan/hmac.h>
#include <botan/pbkdf2.h>
#include <botan/pem.h>
@@ -59,7 +58,7 @@ std::string encrypt(const byte input[], u32bit input_len,
InitializationVector iv(mk.begin() + CIPHER_KEY_LEN + MAC_KEY_LEN,
CIPHER_IV_LEN);
- Pipe pipe(new CTR_BE(new Serpent, cipher_key, iv),
+ Pipe pipe(get_cipher("Serpent/CTR-BE", cipher_key, iv, ENCRYPTION),
new Fork(
0,
new MAC_Filter(new HMAC(new SHA_512),
@@ -121,7 +120,7 @@ std::string decrypt(const byte input[], u32bit input_len,
CIPHER_IV_LEN);
Pipe pipe(new Fork(
- new CTR_BE(new Serpent, cipher_key, iv),
+ get_cipher("Serpent/CTR-BE", cipher_key, iv, ENCRYPTION),
new MAC_Filter(new HMAC(new SHA_512),
mac_key, MAC_OUTPUT_LEN)));
diff --git a/src/cryptobox/info.txt b/src/cryptobox/info.txt
index b9b98060f..0780f55aa 100644
--- a/src/cryptobox/info.txt
+++ b/src/cryptobox/info.txt
@@ -1,5 +1,3 @@
-realname "Crypto Box"
-
load_on auto
define CRYPTO_BOX
diff --git a/src/engine/amd64_eng/info.txt b/src/engine/amd64_eng/info.txt
index 47f891445..03baf76ee 100644
--- a/src/engine/amd64_eng/info.txt
+++ b/src/engine/amd64_eng/info.txt
@@ -1,5 +1,3 @@
-realname "AMD64 Assembler Engine"
-
define ENGINE_AMD64_ASSEMBLER
load_on dep
diff --git a/src/engine/def_engine/def_mode.cpp b/src/engine/def_engine/def_mode.cpp
index 0c7a1a2e2..b7373ef84 100644
--- a/src/engine/def_engine/def_mode.cpp
+++ b/src/engine/def_engine/def_mode.cpp
@@ -32,7 +32,7 @@
#include <botan/ofb.h>
#endif
-#if defined(BOTAN_HAS_CTR)
+#if defined(BOTAN_HAS_CTR_BE)
#include <botan/ctr.h>
#endif
@@ -81,12 +81,12 @@ Keyed_Filter* get_cipher_mode(const BlockCipher* block_cipher,
{
#if defined(BOTAN_HAS_OFB)
if(mode == "OFB")
- return new OFB(block_cipher->clone());
+ return new StreamCipher_Filter(new OFB(block_cipher->clone()));
#endif
-#if defined(BOTAN_HAS_CTR)
+#if defined(BOTAN_HAS_CTR_BE)
if(mode == "CTR-BE")
- return new CTR_BE(block_cipher->clone());
+ return new StreamCipher_Filter(new CTR_BE(block_cipher->clone()));
#endif
#if defined(BOTAN_HAS_ECB)
diff --git a/src/engine/def_engine/info.txt b/src/engine/def_engine/info.txt
index fd31ee2d0..e307fbf8e 100644
--- a/src/engine/def_engine/info.txt
+++ b/src/engine/def_engine/info.txt
@@ -1,5 +1,3 @@
-realname "Default Engine"
-
define DEFAULT_ENGINE
load_on auto
diff --git a/src/engine/gnump/info.txt b/src/engine/gnump/info.txt
index 67a9bcd70..0805c1ba8 100644
--- a/src/engine/gnump/info.txt
+++ b/src/engine/gnump/info.txt
@@ -1,5 +1,3 @@
-realname "GMP Engine"
-
define ENGINE_GNU_MP
load_on request
diff --git a/src/engine/ia32_eng/info.txt b/src/engine/ia32_eng/info.txt
index 3bf2a7f2b..98fd1f2cc 100644
--- a/src/engine/ia32_eng/info.txt
+++ b/src/engine/ia32_eng/info.txt
@@ -1,5 +1,3 @@
-realname "IA32 Assembler Engine"
-
define ENGINE_IA32_ASSEMBLER
load_on dep
diff --git a/src/engine/info.txt b/src/engine/info.txt
index eef3c03b6..dcb26d9d6 100644
--- a/src/engine/info.txt
+++ b/src/engine/info.txt
@@ -1,5 +1,3 @@
-realname "Engines"
-
define ENGINES
load_on auto
diff --git a/src/engine/openssl/arc4_openssl.cpp b/src/engine/openssl/arc4_openssl.cpp
index 08ed3eb10..793e1faff 100644
--- a/src/engine/openssl/arc4_openssl.cpp
+++ b/src/engine/openssl/arc4_openssl.cpp
@@ -19,7 +19,7 @@ namespace {
class ARC4_OpenSSL : public StreamCipher
{
public:
- void clear() throw() { std::memset(&state, 0, sizeof(state)); }
+ void clear() { std::memset(&state, 0, sizeof(state)); }
std::string name() const;
StreamCipher* clone() const { return new ARC4_OpenSSL(SKIP); }
diff --git a/src/engine/openssl/info.txt b/src/engine/openssl/info.txt
index 3f2f1ab14..9f8c84b31 100644
--- a/src/engine/openssl/info.txt
+++ b/src/engine/openssl/info.txt
@@ -1,5 +1,3 @@
-realname "OpenSSL Engine"
-
define ENGINE_OPENSSL
load_on request
diff --git a/src/engine/openssl/ossl_bc.cpp b/src/engine/openssl/ossl_bc.cpp
index 9c85439ca..7fdf54e42 100644
--- a/src/engine/openssl/ossl_bc.cpp
+++ b/src/engine/openssl/ossl_bc.cpp
@@ -18,7 +18,7 @@ namespace {
class EVP_BlockCipher : public BlockCipher
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return cipher_name; }
BlockCipher* clone() const;
EVP_BlockCipher(const EVP_CIPHER*, const std::string&);
@@ -145,7 +145,7 @@ BlockCipher* EVP_BlockCipher::clone() const
/*
* Clear memory of sensitive data
*/
-void EVP_BlockCipher::clear() throw()
+void EVP_BlockCipher::clear()
{
const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(&encrypt);
diff --git a/src/engine/openssl/ossl_md.cpp b/src/engine/openssl/ossl_md.cpp
index 42975c8a3..1e01a6f25 100644
--- a/src/engine/openssl/ossl_md.cpp
+++ b/src/engine/openssl/ossl_md.cpp
@@ -18,7 +18,7 @@ namespace {
class EVP_HashFunction : public HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return algo_name; }
HashFunction* clone() const;
EVP_HashFunction(const EVP_MD*, const std::string&);
@@ -52,7 +52,7 @@ void EVP_HashFunction::final_result(byte output[])
/*
* Clear memory of sensitive data
*/
-void EVP_HashFunction::clear() throw()
+void EVP_HashFunction::clear()
{
const EVP_MD* algo = EVP_MD_CTX_md(&md);
EVP_DigestInit_ex(&md, algo, 0);
diff --git a/src/engine/simd_engine/info.txt b/src/engine/simd_engine/info.txt
new file mode 100644
index 000000000..b0523285f
--- /dev/null
+++ b/src/engine/simd_engine/info.txt
@@ -0,0 +1,3 @@
+define ENGINE_SIMD
+
+load_on dep
diff --git a/src/engine/simd_engine/simd_engine.cpp b/src/engine/simd_engine/simd_engine.cpp
new file mode 100644
index 000000000..7e15f9ec1
--- /dev/null
+++ b/src/engine/simd_engine/simd_engine.cpp
@@ -0,0 +1,54 @@
+/**
+* SIMD Engine
+* (C) 1999-2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/simd_engine.h>
+#include <botan/cpuid.h>
+
+#if defined(BOTAN_HAS_SERPENT_SIMD)
+ #include <botan/serp_simd.h>
+#endif
+
+#if defined(BOTAN_HAS_XTEA_SIMD)
+ #include <botan/xtea_simd.h>
+#endif
+
+#if defined(BOTAN_HAS_SHA1_SSE2)
+ #include <botan/sha1_sse2.h>
+#endif
+
+namespace Botan {
+
+BlockCipher*
+SIMD_Engine::find_block_cipher(const SCAN_Name& request,
+ Algorithm_Factory&) const
+ {
+#if defined(BOTAN_HAS_SERPENT_SIMD)
+ if(request.algo_name() == "Serpent")
+ return new Serpent_SIMD;
+#endif
+
+#if defined(BOTAN_HAS_XTEA_SIMD)
+ if(request.algo_name() == "XTEA")
+ return new XTEA_SIMD;
+#endif
+
+ return 0;
+ }
+
+HashFunction*
+SIMD_Engine::find_hash(const SCAN_Name& request,
+ Algorithm_Factory&) const
+ {
+#if defined(BOTAN_HAS_SHA1_SSE2)
+ if(request.algo_name() == "SHA-160" && CPUID::has_sse2())
+ return new SHA_160_SSE2;
+#endif
+
+ return 0;
+ }
+
+}
diff --git a/src/engine/sse2_eng/eng_sse2.h b/src/engine/simd_engine/simd_engine.h
index c6b0ce889..22a58e203 100644
--- a/src/engine/sse2_eng/eng_sse2.h
+++ b/src/engine/simd_engine/simd_engine.h
@@ -1,21 +1,21 @@
/**
-* SSE2 Assembly Engine
+* SIMD Assembly Engine
* (C) 1999-2009 Jack Lloyd
*
* Distributed under the terms of the Botan license
*/
-#ifndef BOTAN_SSE2_ASM_ENGINE_H__
-#define BOTAN_SSE2_ASM_ENGINE_H__
+#ifndef BOTAN_SIMD_ENGINE_H__
+#define BOTAN_SIMD_ENGINE_H__
#include <botan/engine.h>
namespace Botan {
-class BOTAN_DLL SSE2_Assembler_Engine : public Engine
+class BOTAN_DLL SIMD_Engine : public Engine
{
public:
- std::string provider_name() const { return "sse2"; }
+ std::string provider_name() const { return "simd"; }
private:
BlockCipher* find_block_cipher(const SCAN_Name&,
Algorithm_Factory&) const;
diff --git a/src/engine/sse2_eng/eng_sse2.cpp b/src/engine/sse2_eng/eng_sse2.cpp
deleted file mode 100644
index 07c625c7c..000000000
--- a/src/engine/sse2_eng/eng_sse2.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
-* SSE2 Assembly Engine
-* (C) 1999-2009 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#include <botan/eng_sse2.h>
-#include <botan/cpuid.h>
-
-#if defined(BOTAN_HAS_SHA1_SSE2)
- #include <botan/sha1_sse2.h>
-#endif
-
-#if defined(BOTAN_HAS_SERPENT_SSE2)
- #include <botan/serp_sse2.h>
-#endif
-
-namespace Botan {
-
-BlockCipher*
-SSE2_Assembler_Engine::find_block_cipher(const SCAN_Name& request,
- Algorithm_Factory&) const
- {
- if(!CPUID::has_sse2())
- return 0;
-
-#if defined(BOTAN_HAS_SERPENT_SSE2)
- if(request.algo_name() == "Serpent")
- return new Serpent_SSE2;
-#endif
-
- return 0;
- }
-
-HashFunction*
-SSE2_Assembler_Engine::find_hash(const SCAN_Name& request,
- Algorithm_Factory&) const
- {
- if(!CPUID::has_sse2())
- return 0;
-
-#if defined(BOTAN_HAS_SHA1_SSE2)
- if(request.algo_name() == "SHA-160")
- return new SHA_160_SSE2;
-#endif
-
- return 0;
- }
-
-}
diff --git a/src/engine/sse2_eng/info.txt b/src/engine/sse2_eng/info.txt
deleted file mode 100644
index 7508b9874..000000000
--- a/src/engine/sse2_eng/info.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-realname "SSE2 Assembler Engine"
-
-define ENGINE_SSE2_ASSEMBLER
-
-load_on dep
-
-<add>
-eng_sse2.cpp
-eng_sse2.h
-</add>
-
-<arch>
-pentium-m
-pentium4
-prescott
-amd64
-</arch>
-
-<cc>
-gcc
-icc
-msvc
-</cc>
diff --git a/src/entropy/beos_stats/info.txt b/src/entropy/beos_stats/info.txt
index a7e62cfb3..84ecf601d 100644
--- a/src/entropy/beos_stats/info.txt
+++ b/src/entropy/beos_stats/info.txt
@@ -1,5 +1,3 @@
-realname "BeOS Entropy Source"
-
define ENTROPY_SRC_BEOS
modset beos
diff --git a/src/entropy/cryptoapi_rng/info.txt b/src/entropy/cryptoapi_rng/info.txt
index 643c67d2e..d7a5dbca0 100644
--- a/src/entropy/cryptoapi_rng/info.txt
+++ b/src/entropy/cryptoapi_rng/info.txt
@@ -1,5 +1,3 @@
-realname "Win32 CryptoAPI Entropy Source"
-
define ENTROPY_SRC_CAPI
load_on auto
modset win32
diff --git a/src/entropy/dev_random/info.txt b/src/entropy/dev_random/info.txt
index 5231b2901..376f3b4ba 100644
--- a/src/entropy/dev_random/info.txt
+++ b/src/entropy/dev_random/info.txt
@@ -1,5 +1,3 @@
-realname "RNG Device Reader"
-
define ENTROPY_SRC_DEVICE
load_on auto
diff --git a/src/entropy/egd/info.txt b/src/entropy/egd/info.txt
index 85ba86c00..77e7197dc 100644
--- a/src/entropy/egd/info.txt
+++ b/src/entropy/egd/info.txt
@@ -1,5 +1,3 @@
-realname "EGD Entropy Source"
-
define ENTROPY_SRC_EGD
load_on auto
diff --git a/src/entropy/info.txt b/src/entropy/info.txt
index ec3be5f58..5f3d39dd5 100644
--- a/src/entropy/info.txt
+++ b/src/entropy/info.txt
@@ -1,5 +1,3 @@
-realname "Entropy Sources"
-
load_on auto
<add>
diff --git a/src/entropy/proc_walk/info.txt b/src/entropy/proc_walk/info.txt
index b82929a73..f6302df1a 100644
--- a/src/entropy/proc_walk/info.txt
+++ b/src/entropy/proc_walk/info.txt
@@ -1,5 +1,3 @@
-realname "File Tree Walking Entropy Source"
-
define ENTROPY_SRC_FTW
load_on auto
diff --git a/src/entropy/unix_procs/info.txt b/src/entropy/unix_procs/info.txt
index 928ec13b3..de88cc1b8 100644
--- a/src/entropy/unix_procs/info.txt
+++ b/src/entropy/unix_procs/info.txt
@@ -1,5 +1,3 @@
-realname "Generic Unix Entropy Source"
-
define ENTROPY_SRC_UNIX
modset unix,beos
diff --git a/src/entropy/win32_stats/info.txt b/src/entropy/win32_stats/info.txt
index ca7100923..da8ea72ff 100644
--- a/src/entropy/win32_stats/info.txt
+++ b/src/entropy/win32_stats/info.txt
@@ -1,5 +1,3 @@
-realname "Win32 Entropy Source"
-
# Probably not much of an issue anymore
#note "This module will not run under NT4"
diff --git a/src/filters/algo_filt.cpp b/src/filters/algo_filt.cpp
index 3268276a6..51bf92380 100644
--- a/src/filters/algo_filt.cpp
+++ b/src/filters/algo_filt.cpp
@@ -14,20 +14,31 @@ namespace Botan {
/*
* StreamCipher_Filter Constructor
*/
-StreamCipher_Filter::StreamCipher_Filter(const std::string& sc_name) :
+StreamCipher_Filter::StreamCipher_Filter(StreamCipher* stream_cipher) :
buffer(DEFAULT_BUFFERSIZE)
{
- Algorithm_Factory& af = global_state().algorithm_factory();
- cipher = af.make_stream_cipher(sc_name);
+ cipher = stream_cipher;
}
/*
* StreamCipher_Filter Constructor
*/
-StreamCipher_Filter::StreamCipher_Filter(StreamCipher* stream_cipher) :
+StreamCipher_Filter::StreamCipher_Filter(StreamCipher* stream_cipher,
+ const SymmetricKey& key) :
buffer(DEFAULT_BUFFERSIZE)
{
cipher = stream_cipher;
+ cipher->set_key(key);
+ }
+
+/*
+* StreamCipher_Filter Constructor
+*/
+StreamCipher_Filter::StreamCipher_Filter(const std::string& sc_name) :
+ buffer(DEFAULT_BUFFERSIZE)
+ {
+ Algorithm_Factory& af = global_state().algorithm_factory();
+ cipher = af.make_stream_cipher(sc_name);
}
/*
@@ -47,7 +58,7 @@ StreamCipher_Filter::StreamCipher_Filter(const std::string& sc_name,
*/
void StreamCipher_Filter::set_iv(const InitializationVector& iv)
{
- cipher->resync(iv.begin(), iv.length());
+ cipher->set_iv(iv.begin(), iv.length());
}
/*
@@ -58,7 +69,7 @@ void StreamCipher_Filter::write(const byte input[], u32bit length)
while(length)
{
u32bit copied = std::min(length, buffer.size());
- cipher->encrypt(input, buffer, copied);
+ cipher->cipher(input, buffer, copied);
send(buffer, copied);
input += copied;
length -= copied;
diff --git a/src/filters/fd_unix/info.txt b/src/filters/fd_unix/info.txt
index d87978cb0..bdd9b957f 100644
--- a/src/filters/fd_unix/info.txt
+++ b/src/filters/fd_unix/info.txt
@@ -1,5 +1,3 @@
-realname "Unix I/O support for Pipe"
-
define PIPE_UNIXFD_IO
modset unix,beos
diff --git a/src/filters/filters.h b/src/filters/filters.h
index 964be0bd8..208332a56 100644
--- a/src/filters/filters.h
+++ b/src/filters/filters.h
@@ -44,18 +44,8 @@ class BOTAN_DLL StreamCipher_Filter : public Keyed_Filter
*/
void write(const byte input[], u32bit input_len);
- /**
- * Seek in the stream.
- * @param position the position to seek ahead
- */
- void seek(u32bit position) { cipher->seek(position); }
-
- /**
- * Find out whether the cipher underlying this filter supports
- * resyncing.
- * @return true if the cipher supports resyncing
- */
- bool supports_resync() const { return (cipher->IV_LENGTH != 0); }
+ bool valid_iv_length(u32bit iv_len)
+ { return cipher->valid_iv_length(iv_len); }
/**
* Set the initialization vector for this filter.
@@ -85,6 +75,13 @@ class BOTAN_DLL StreamCipher_Filter : public Keyed_Filter
/**
* Construct a stream cipher filter.
+ * @param cipher_obj a cipher object to use
+ * @param key the key to use inside this filter
+ */
+ StreamCipher_Filter(StreamCipher* cipher_obj, const SymmetricKey& key);
+
+ /**
+ * Construct a stream cipher filter.
* @param cipher the name of the desired cipher
*/
StreamCipher_Filter(const std::string& cipher);
diff --git a/src/filters/info.txt b/src/filters/info.txt
index fb8108659..a76b6b4fe 100644
--- a/src/filters/info.txt
+++ b/src/filters/info.txt
@@ -1,5 +1,3 @@
-realname "Pipe/Filter"
-
load_on auto
define FILTERS
diff --git a/src/hash/bmw/bmw_512.cpp b/src/hash/bmw/bmw_512.cpp
index ad3826351..5ccb09579 100644
--- a/src/hash/bmw/bmw_512.cpp
+++ b/src/hash/bmw/bmw_512.cpp
@@ -143,8 +143,7 @@ void BMW_512::compress_n(const byte input[], u32bit blocks)
{
for(u32bit i = 0; i != blocks; ++i)
{
- for(u32bit j = 0; j != 16; ++j)
- M[j] = load_le<u64bit>(input, j);
+ load_le(M.begin(), input, M.size());
BMW_512_compress(H, M, Q);
@@ -176,7 +175,7 @@ void BMW_512::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void BMW_512::clear() throw()
+void BMW_512::clear()
{
MDx_HashFunction::clear();
M.clear();
diff --git a/src/hash/bmw/bmw_512.h b/src/hash/bmw/bmw_512.h
index d1f2539e9..55cd761a9 100644
--- a/src/hash/bmw/bmw_512.h
+++ b/src/hash/bmw/bmw_512.h
@@ -15,7 +15,7 @@ namespace Botan {
class BMW_512 : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "BMW512"; }
HashFunction* clone() const { return new BMW_512; }
BMW_512() : MDx_HashFunction(64, 128, false, true) { clear(); }
diff --git a/src/hash/bmw/info.txt b/src/hash/bmw/info.txt
index 27e069c0a..7170223d7 100644
--- a/src/hash/bmw/info.txt
+++ b/src/hash/bmw/info.txt
@@ -1,5 +1,3 @@
-realname "Blue Midnight Wish"
-
define BMW_512
<requires>
diff --git a/src/hash/fork256/fork256.cpp b/src/hash/fork256/fork256.cpp
index f80bff43a..6718f9f97 100644
--- a/src/hash/fork256/fork256.cpp
+++ b/src/hash/fork256/fork256.cpp
@@ -133,7 +133,7 @@ void FORK_256::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void FORK_256::clear() throw()
+void FORK_256::clear()
{
MDx_HashFunction::clear();
digest[0] = 0x6A09E667;
diff --git a/src/hash/fork256/fork256.h b/src/hash/fork256/fork256.h
index 70d336cc9..f535370e6 100644
--- a/src/hash/fork256/fork256.h
+++ b/src/hash/fork256/fork256.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL FORK_256 : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "FORK-256"; }
HashFunction* clone() const { return new FORK_256; }
FORK_256() : MDx_HashFunction(32, 64, true, true) { clear(); }
diff --git a/src/hash/fork256/info.txt b/src/hash/fork256/info.txt
index 7c3c5bb94..c2f8c47f2 100644
--- a/src/hash/fork256/info.txt
+++ b/src/hash/fork256/info.txt
@@ -1,5 +1,3 @@
-realname "FORK-256"
-
define FORK_256
<requires>
diff --git a/src/hash/gost_3411/gost_3411.cpp b/src/hash/gost_3411/gost_3411.cpp
index 8f3982fca..90ef3e805 100644
--- a/src/hash/gost_3411/gost_3411.cpp
+++ b/src/hash/gost_3411/gost_3411.cpp
@@ -23,7 +23,7 @@ GOST_34_11::GOST_34_11() :
position = 0;
}
-void GOST_34_11::clear() throw()
+void GOST_34_11::clear()
{
cipher.clear();
sum.clear();
diff --git a/src/hash/gost_3411/gost_3411.h b/src/hash/gost_3411/gost_3411.h
index 960adaa44..7b17bdc1f 100644
--- a/src/hash/gost_3411/gost_3411.h
+++ b/src/hash/gost_3411/gost_3411.h
@@ -19,7 +19,7 @@ namespace Botan {
class BOTAN_DLL GOST_34_11 : public HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "GOST-R-34.11-94" ; }
HashFunction* clone() const { return new GOST_34_11; }
diff --git a/src/hash/gost_3411/info.txt b/src/hash/gost_3411/info.txt
index 353ceb3e5..c4cb4e1a5 100644
--- a/src/hash/gost_3411/info.txt
+++ b/src/hash/gost_3411/info.txt
@@ -1,5 +1,3 @@
-realname "GOST 34.11"
-
define GOST_34_11
<requires>
diff --git a/src/hash/has160/has160.cpp b/src/hash/has160/has160.cpp
index 9a505d31d..ae45418ce 100644
--- a/src/hash/has160/has160.cpp
+++ b/src/hash/has160/has160.cpp
@@ -60,13 +60,12 @@ inline void F4(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E,
*/
void HAS_160::compress_n(const byte input[], u32bit blocks)
{
+ u32bit A = digest[0], B = digest[1], C = digest[2],
+ D = digest[3], E = digest[4];
+
for(u32bit i = 0; i != blocks; ++i)
{
- for(u32bit j = 0; j != 16; ++j)
- X[j] = load_le<u32bit>(input, j);
-
- u32bit A = digest[0], B = digest[1], C = digest[2],
- D = digest[3], E = digest[4];
+ load_le(X.begin(), input, 16);
X[16] = X[ 0] ^ X[ 1] ^ X[ 2] ^ X[ 3];
X[17] = X[ 4] ^ X[ 5] ^ X[ 6] ^ X[ 7];
@@ -128,8 +127,13 @@ void HAS_160::compress_n(const byte input[], u32bit blocks)
F4(E,A,B,C,D,X[11], 9); F4(D,E,A,B,C,X[ 6],14);
F4(C,D,E,A,B,X[ 1], 5); F4(B,C,D,E,A,X[12],13);
- digest[0] += A; digest[1] += B; digest[2] += C;
- digest[3] += D; digest[4] += E;
+ A = (digest[0] += A);
+ B = (digest[1] += B);
+ C = (digest[2] += C);
+ D = (digest[3] += D);
+ E = (digest[4] += E);
+
+ input += HASH_BLOCK_SIZE;
}
}
@@ -145,7 +149,7 @@ void HAS_160::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void HAS_160::clear() throw()
+void HAS_160::clear()
{
MDx_HashFunction::clear();
X.clear();
diff --git a/src/hash/has160/has160.h b/src/hash/has160/has160.h
index 44bb63b9d..cae66c93a 100644
--- a/src/hash/has160/has160.h
+++ b/src/hash/has160/has160.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL HAS_160 : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "HAS-160"; }
HashFunction* clone() const { return new HAS_160; }
HAS_160() : MDx_HashFunction(20, 64, false, true) { clear(); }
diff --git a/src/hash/has160/info.txt b/src/hash/has160/info.txt
index 98cbc5155..f862bdb20 100644
--- a/src/hash/has160/info.txt
+++ b/src/hash/has160/info.txt
@@ -1,5 +1,3 @@
-realname "HAS-160"
-
define HAS_160
<requires>
diff --git a/src/hash/hash.h b/src/hash/hash.h
index a30234be0..1098951d8 100644
--- a/src/hash/hash.h
+++ b/src/hash/hash.h
@@ -38,7 +38,7 @@ class BOTAN_DLL HashFunction : public BufferedComputation
/**
* Reset the internal state of this object.
*/
- virtual void clear() throw() = 0;
+ virtual void clear() = 0;
HashFunction(u32bit hash_len, u32bit block_len = 0) :
BufferedComputation(hash_len), HASH_BLOCK_SIZE(block_len) {}
diff --git a/src/hash/info.txt b/src/hash/info.txt
index ce55f7ddc..0e45806f8 100644
--- a/src/hash/info.txt
+++ b/src/hash/info.txt
@@ -1,5 +1,3 @@
-realname "Hash Functions"
-
load_on auto
<add>
diff --git a/src/hash/md2/info.txt b/src/hash/md2/info.txt
index 4428584fd..2359c5df7 100644
--- a/src/hash/md2/info.txt
+++ b/src/hash/md2/info.txt
@@ -1,3 +1 @@
-realname "MD2"
-
define MD2
diff --git a/src/hash/md2/md2.cpp b/src/hash/md2/md2.cpp
index c67e72b5a..f03518ec0 100644
--- a/src/hash/md2/md2.cpp
+++ b/src/hash/md2/md2.cpp
@@ -97,7 +97,7 @@ void MD2::final_result(byte output[])
/**
* Clear memory of sensitive data
*/
-void MD2::clear() throw()
+void MD2::clear()
{
X.clear();
checksum.clear();
diff --git a/src/hash/md2/md2.h b/src/hash/md2/md2.h
index 9337c43f4..0a7125759 100644
--- a/src/hash/md2/md2.h
+++ b/src/hash/md2/md2.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL MD2 : public HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "MD2"; }
HashFunction* clone() const { return new MD2; }
MD2() : HashFunction(16, 16) { clear(); }
diff --git a/src/hash/md4/info.txt b/src/hash/md4/info.txt
index 6aa4a5d59..2b276e168 100644
--- a/src/hash/md4/info.txt
+++ b/src/hash/md4/info.txt
@@ -1,5 +1,3 @@
-realname "MD4"
-
define MD4
<requires>
diff --git a/src/hash/md4/md4.cpp b/src/hash/md4/md4.cpp
index 39e3c8c41..c50c73a8d 100644
--- a/src/hash/md4/md4.cpp
+++ b/src/hash/md4/md4.cpp
@@ -51,6 +51,7 @@ void MD4::compress_n(const byte input[], u32bit blocks)
for(u32bit i = 0; i != blocks; ++i)
{
+ //load_le(M.begin(), input, M.size());
for(u32bit j = 0; j != 16; ++j)
M[j] = load_le<u32bit>(input, j);
input += HASH_BLOCK_SIZE;
@@ -95,7 +96,7 @@ void MD4::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void MD4::clear() throw()
+void MD4::clear()
{
MDx_HashFunction::clear();
M.clear();
diff --git a/src/hash/md4/md4.h b/src/hash/md4/md4.h
index df6f2292d..0b76a70e4 100644
--- a/src/hash/md4/md4.h
+++ b/src/hash/md4/md4.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL MD4 : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "MD4"; }
HashFunction* clone() const { return new MD4; }
MD4() : MDx_HashFunction(16, 64, false, true) { clear(); }
diff --git a/src/hash/md4_ia32/info.txt b/src/hash/md4_ia32/info.txt
index 217c3fc21..732285c56 100644
--- a/src/hash/md4_ia32/info.txt
+++ b/src/hash/md4_ia32/info.txt
@@ -1,5 +1,3 @@
-realname "MD4 (IA-32)"
-
define MD4_IA32
load_on asm_ok
diff --git a/src/hash/md5/info.txt b/src/hash/md5/info.txt
index 14861d635..a4ad1462c 100644
--- a/src/hash/md5/info.txt
+++ b/src/hash/md5/info.txt
@@ -1,5 +1,3 @@
-realname "MD5"
-
define MD5
<requires>
diff --git a/src/hash/md5/md5.cpp b/src/hash/md5/md5.cpp
index 7c280aab7..8c1e5a8e1 100644
--- a/src/hash/md5/md5.cpp
+++ b/src/hash/md5/md5.cpp
@@ -64,9 +64,7 @@ void MD5::compress_n(const byte input[], u32bit blocks)
for(u32bit i = 0; i != blocks; ++i)
{
- for(u32bit j = 0; j != 16; ++j)
- M[j] = load_le<u32bit>(input, j);
- input += HASH_BLOCK_SIZE;
+ load_le(M.begin(), input, M.size());
FF(A,B,C,D,M[ 0], 7,0xD76AA478); FF(D,A,B,C,M[ 1],12,0xE8C7B756);
FF(C,D,A,B,M[ 2],17,0x242070DB); FF(B,C,D,A,M[ 3],22,0xC1BDCEEE);
@@ -108,6 +106,8 @@ void MD5::compress_n(const byte input[], u32bit blocks)
B = (digest[1] += B);
C = (digest[2] += C);
D = (digest[3] += D);
+
+ input += HASH_BLOCK_SIZE;
}
}
@@ -123,7 +123,7 @@ void MD5::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void MD5::clear() throw()
+void MD5::clear()
{
MDx_HashFunction::clear();
M.clear();
diff --git a/src/hash/md5/md5.h b/src/hash/md5/md5.h
index 85f684d8b..456a02c28 100644
--- a/src/hash/md5/md5.h
+++ b/src/hash/md5/md5.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL MD5 : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "MD5"; }
HashFunction* clone() const { return new MD5; }
MD5() : MDx_HashFunction(16, 64, false, true) { clear(); }
diff --git a/src/hash/md5_ia32/info.txt b/src/hash/md5_ia32/info.txt
index d298f2005..48a8b4a10 100644
--- a/src/hash/md5_ia32/info.txt
+++ b/src/hash/md5_ia32/info.txt
@@ -1,5 +1,3 @@
-realname "MD5 (IA-32)"
-
define MD5_IA32
load_on asm_ok
diff --git a/src/hash/mdx_hash/info.txt b/src/hash/mdx_hash/info.txt
index ee4ccd6da..0c30a1a54 100644
--- a/src/hash/mdx_hash/info.txt
+++ b/src/hash/mdx_hash/info.txt
@@ -1,5 +1,3 @@
-realname "MDx Hash Base"
-
define MDX_HASH_FUNCTION
load_on dep
diff --git a/src/hash/mdx_hash/mdx_hash.cpp b/src/hash/mdx_hash/mdx_hash.cpp
index b630ec227..28402c2c5 100644
--- a/src/hash/mdx_hash/mdx_hash.cpp
+++ b/src/hash/mdx_hash/mdx_hash.cpp
@@ -28,7 +28,7 @@ MDx_HashFunction::MDx_HashFunction(u32bit hash_len, u32bit block_len,
/**
* Clear memory of sensitive data
*/
-void MDx_HashFunction::clear() throw()
+void MDx_HashFunction::clear()
{
buffer.clear();
count = position = 0;
diff --git a/src/hash/mdx_hash/mdx_hash.h b/src/hash/mdx_hash/mdx_hash.h
index 0c3aa7806..2d70deed3 100644
--- a/src/hash/mdx_hash/mdx_hash.h
+++ b/src/hash/mdx_hash/mdx_hash.h
@@ -25,7 +25,7 @@ class BOTAN_DLL MDx_HashFunction : public HashFunction
void final_result(byte output[]);
virtual void compress_n(const byte block[], u32bit block_n) = 0;
- void clear() throw();
+ void clear();
virtual void copy_out(byte[]) = 0;
virtual void write_count(byte[]);
private:
diff --git a/src/hash/par_hash/info.txt b/src/hash/par_hash/info.txt
index 029939cb5..d641a9cee 100644
--- a/src/hash/par_hash/info.txt
+++ b/src/hash/par_hash/info.txt
@@ -1,3 +1 @@
-realname "Parallel Hash"
-
define PARALLEL_HASH
diff --git a/src/hash/par_hash/par_hash.cpp b/src/hash/par_hash/par_hash.cpp
index 789238647..fdd028f58 100644
--- a/src/hash/par_hash/par_hash.cpp
+++ b/src/hash/par_hash/par_hash.cpp
@@ -82,7 +82,7 @@ HashFunction* Parallel::clone() const
/*
* Clear memory of sensitive data
*/
-void Parallel::clear() throw()
+void Parallel::clear()
{
for(auto hash = hashes.begin(); hash != hashes.end(); ++hash)
(*hash)->clear();
diff --git a/src/hash/par_hash/par_hash.h b/src/hash/par_hash/par_hash.h
index 7e75c27be..874e491b1 100644
--- a/src/hash/par_hash/par_hash.h
+++ b/src/hash/par_hash/par_hash.h
@@ -19,7 +19,7 @@ namespace Botan {
class BOTAN_DLL Parallel : public HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const;
HashFunction* clone() const;
diff --git a/src/hash/rmd128/info.txt b/src/hash/rmd128/info.txt
index 0a1ef2c74..11e4181f4 100644
--- a/src/hash/rmd128/info.txt
+++ b/src/hash/rmd128/info.txt
@@ -1,5 +1,3 @@
-realname "RIPEMD-128"
-
define RIPEMD_128
<requires>
diff --git a/src/hash/rmd128/rmd128.cpp b/src/hash/rmd128/rmd128.cpp
index 8b2c0ccf8..7e9da3bdd 100644
--- a/src/hash/rmd128/rmd128.cpp
+++ b/src/hash/rmd128/rmd128.cpp
@@ -60,18 +60,16 @@ inline void F4(u32bit& A, u32bit B, u32bit C, u32bit D,
*/
void RIPEMD_128::compress_n(const byte input[], u32bit blocks)
{
+ const u32bit MAGIC2 = 0x5A827999, MAGIC3 = 0x6ED9EBA1,
+ MAGIC4 = 0x8F1BBCDC, MAGIC5 = 0x50A28BE6,
+ MAGIC6 = 0x5C4DD124, MAGIC7 = 0x6D703EF3;
+
for(u32bit i = 0; i != blocks; ++i)
{
- for(u32bit j = 0; j != 16; ++j)
- M[j] = load_le<u32bit>(input, j);
- input += HASH_BLOCK_SIZE;
+ load_le(M.begin(), input, M.size());
u32bit A1 = digest[0], A2 = A1, B1 = digest[1], B2 = B1,
- C1 = digest[2], C2 = C1, D1 = digest[3], D2 = D1;
-
- const u32bit MAGIC2 = 0x5A827999, MAGIC3 = 0x6ED9EBA1,
- MAGIC4 = 0x8F1BBCDC, MAGIC5 = 0x50A28BE6,
- MAGIC6 = 0x5C4DD124, MAGIC7 = 0x6D703EF3;
+ C1 = digest[2], C2 = C1, D1 = digest[3], D2 = D1;
F1(A1,B1,C1,D1,M[ 0],11 ); F4(A2,B2,C2,D2,M[ 5], 8,MAGIC5);
F1(D1,A1,B1,C1,M[ 1],14 ); F4(D2,A2,B2,C2,M[14], 9,MAGIC5);
@@ -141,9 +139,13 @@ void RIPEMD_128::compress_n(const byte input[], u32bit blocks)
F4(C1,D1,A1,B1,M[ 6], 5,MAGIC4); F1(C2,D2,A2,B2,M[10],15 );
F4(B1,C1,D1,A1,M[ 2],12,MAGIC4); F1(B2,C2,D2,A2,M[14], 8 );
- D2 = digest[1] + C1 + D2; digest[1] = digest[2] + D1 + A2;
- digest[2] = digest[3] + A1 + B2; digest[3] = digest[0] + B1 + C2;
+ D2 = digest[1] + C1 + D2;
+ digest[1] = digest[2] + D1 + A2;
+ digest[2] = digest[3] + A1 + B2;
+ digest[3] = digest[0] + B1 + C2;
digest[0] = D2;
+
+ input += HASH_BLOCK_SIZE;
}
}
@@ -159,7 +161,7 @@ void RIPEMD_128::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void RIPEMD_128::clear() throw()
+void RIPEMD_128::clear()
{
MDx_HashFunction::clear();
M.clear();
diff --git a/src/hash/rmd128/rmd128.h b/src/hash/rmd128/rmd128.h
index 031ae5746..d9cb4ebb4 100644
--- a/src/hash/rmd128/rmd128.h
+++ b/src/hash/rmd128/rmd128.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL RIPEMD_128 : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "RIPEMD-128"; }
HashFunction* clone() const { return new RIPEMD_128; }
RIPEMD_128() : MDx_HashFunction(16, 64, false, true) { clear(); }
diff --git a/src/hash/rmd160/info.txt b/src/hash/rmd160/info.txt
index 225106afc..28be6854d 100644
--- a/src/hash/rmd160/info.txt
+++ b/src/hash/rmd160/info.txt
@@ -1,5 +1,3 @@
-realname "RIPEMD-160"
-
define RIPEMD_160
<requires>
diff --git a/src/hash/rmd160/rmd160.cpp b/src/hash/rmd160/rmd160.cpp
index 863de8487..5237f1e12 100644
--- a/src/hash/rmd160/rmd160.cpp
+++ b/src/hash/rmd160/rmd160.cpp
@@ -82,9 +82,7 @@ void RIPEMD_160::compress_n(const byte input[], u32bit blocks)
for(u32bit i = 0; i != blocks; ++i)
{
- for(u32bit j = 0; j != 16; ++j)
- M[j] = load_le<u32bit>(input, j);
- input += HASH_BLOCK_SIZE;
+ load_le(M.begin(), input, M.size());
u32bit A1 = digest[0], A2 = A1, B1 = digest[1], B2 = B1,
C1 = digest[2], C2 = C1, D1 = digest[3], D2 = D1,
@@ -181,6 +179,8 @@ void RIPEMD_160::compress_n(const byte input[], u32bit blocks)
digest[3] = digest[4] + A1 + B2;
digest[4] = digest[0] + B1 + C2;
digest[0] = C1;
+
+ input += HASH_BLOCK_SIZE;
}
}
@@ -196,7 +196,7 @@ void RIPEMD_160::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void RIPEMD_160::clear() throw()
+void RIPEMD_160::clear()
{
MDx_HashFunction::clear();
M.clear();
diff --git a/src/hash/rmd160/rmd160.h b/src/hash/rmd160/rmd160.h
index f2babc582..aee007b98 100644
--- a/src/hash/rmd160/rmd160.h
+++ b/src/hash/rmd160/rmd160.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL RIPEMD_160 : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "RIPEMD-160"; }
HashFunction* clone() const { return new RIPEMD_160; }
RIPEMD_160() : MDx_HashFunction(20, 64, false, true) { clear(); }
diff --git a/src/hash/sha1/info.txt b/src/hash/sha1/info.txt
index 8915f9ebd..56403db21 100644
--- a/src/hash/sha1/info.txt
+++ b/src/hash/sha1/info.txt
@@ -1,5 +1,3 @@
-realname "SHA-1"
-
define SHA1
<requires>
diff --git a/src/hash/sha1/sha160.cpp b/src/hash/sha1/sha160.cpp
index 45323a11b..ff44593f6 100644
--- a/src/hash/sha1/sha160.cpp
+++ b/src/hash/sha1/sha160.cpp
@@ -61,60 +61,71 @@ void SHA_160::compress_n(const byte input[], u32bit blocks)
for(u32bit i = 0; i != blocks; ++i)
{
- for(u32bit j = 0; j != 16; j += 4)
- {
- W[j ] = load_be<u32bit>(input, j);
- W[j+1] = load_be<u32bit>(input, j+1);
- W[j+2] = load_be<u32bit>(input, j+2);
- W[j+3] = load_be<u32bit>(input, j+3);
- }
- input += HASH_BLOCK_SIZE;
+ load_be(W.begin(), input, 16);
- for(u32bit j = 16; j != 80; j += 4)
+ for(u32bit j = 16; j != 80; j += 8)
{
W[j ] = rotate_left((W[j-3] ^ W[j-8] ^ W[j-14] ^ W[j-16]), 1);
W[j+1] = rotate_left((W[j-2] ^ W[j-7] ^ W[j-13] ^ W[j-15]), 1);
W[j+2] = rotate_left((W[j-1] ^ W[j-6] ^ W[j-12] ^ W[j-14]), 1);
W[j+3] = rotate_left((W[j ] ^ W[j-5] ^ W[j-11] ^ W[j-13]), 1);
+ W[j+4] = rotate_left((W[j+1] ^ W[j-4] ^ W[j-10] ^ W[j-12]), 1);
+ W[j+5] = rotate_left((W[j+2] ^ W[j-3] ^ W[j- 9] ^ W[j-11]), 1);
+ W[j+6] = rotate_left((W[j+3] ^ W[j-2] ^ W[j- 8] ^ W[j-10]), 1);
+ W[j+7] = rotate_left((W[j+4] ^ W[j-1] ^ W[j- 7] ^ W[j- 9]), 1);
}
- F1(A,B,C,D,E,W[ 0]); F1(E,A,B,C,D,W[ 1]); F1(D,E,A,B,C,W[ 2]);
- F1(C,D,E,A,B,W[ 3]); F1(B,C,D,E,A,W[ 4]); F1(A,B,C,D,E,W[ 5]);
- F1(E,A,B,C,D,W[ 6]); F1(D,E,A,B,C,W[ 7]); F1(C,D,E,A,B,W[ 8]);
- F1(B,C,D,E,A,W[ 9]); F1(A,B,C,D,E,W[10]); F1(E,A,B,C,D,W[11]);
- F1(D,E,A,B,C,W[12]); F1(C,D,E,A,B,W[13]); F1(B,C,D,E,A,W[14]);
- F1(A,B,C,D,E,W[15]); F1(E,A,B,C,D,W[16]); F1(D,E,A,B,C,W[17]);
- F1(C,D,E,A,B,W[18]); F1(B,C,D,E,A,W[19]);
-
- F2(A,B,C,D,E,W[20]); F2(E,A,B,C,D,W[21]); F2(D,E,A,B,C,W[22]);
- F2(C,D,E,A,B,W[23]); F2(B,C,D,E,A,W[24]); F2(A,B,C,D,E,W[25]);
- F2(E,A,B,C,D,W[26]); F2(D,E,A,B,C,W[27]); F2(C,D,E,A,B,W[28]);
- F2(B,C,D,E,A,W[29]); F2(A,B,C,D,E,W[30]); F2(E,A,B,C,D,W[31]);
- F2(D,E,A,B,C,W[32]); F2(C,D,E,A,B,W[33]); F2(B,C,D,E,A,W[34]);
- F2(A,B,C,D,E,W[35]); F2(E,A,B,C,D,W[36]); F2(D,E,A,B,C,W[37]);
- F2(C,D,E,A,B,W[38]); F2(B,C,D,E,A,W[39]);
-
- F3(A,B,C,D,E,W[40]); F3(E,A,B,C,D,W[41]); F3(D,E,A,B,C,W[42]);
- F3(C,D,E,A,B,W[43]); F3(B,C,D,E,A,W[44]); F3(A,B,C,D,E,W[45]);
- F3(E,A,B,C,D,W[46]); F3(D,E,A,B,C,W[47]); F3(C,D,E,A,B,W[48]);
- F3(B,C,D,E,A,W[49]); F3(A,B,C,D,E,W[50]); F3(E,A,B,C,D,W[51]);
- F3(D,E,A,B,C,W[52]); F3(C,D,E,A,B,W[53]); F3(B,C,D,E,A,W[54]);
- F3(A,B,C,D,E,W[55]); F3(E,A,B,C,D,W[56]); F3(D,E,A,B,C,W[57]);
- F3(C,D,E,A,B,W[58]); F3(B,C,D,E,A,W[59]);
-
- F4(A,B,C,D,E,W[60]); F4(E,A,B,C,D,W[61]); F4(D,E,A,B,C,W[62]);
- F4(C,D,E,A,B,W[63]); F4(B,C,D,E,A,W[64]); F4(A,B,C,D,E,W[65]);
- F4(E,A,B,C,D,W[66]); F4(D,E,A,B,C,W[67]); F4(C,D,E,A,B,W[68]);
- F4(B,C,D,E,A,W[69]); F4(A,B,C,D,E,W[70]); F4(E,A,B,C,D,W[71]);
- F4(D,E,A,B,C,W[72]); F4(C,D,E,A,B,W[73]); F4(B,C,D,E,A,W[74]);
- F4(A,B,C,D,E,W[75]); F4(E,A,B,C,D,W[76]); F4(D,E,A,B,C,W[77]);
- F4(C,D,E,A,B,W[78]); F4(B,C,D,E,A,W[79]);
+ F1(A, B, C, D, E, W[ 0]); F1(E, A, B, C, D, W[ 1]);
+ F1(D, E, A, B, C, W[ 2]); F1(C, D, E, A, B, W[ 3]);
+ F1(B, C, D, E, A, W[ 4]); F1(A, B, C, D, E, W[ 5]);
+ F1(E, A, B, C, D, W[ 6]); F1(D, E, A, B, C, W[ 7]);
+ F1(C, D, E, A, B, W[ 8]); F1(B, C, D, E, A, W[ 9]);
+ F1(A, B, C, D, E, W[10]); F1(E, A, B, C, D, W[11]);
+ F1(D, E, A, B, C, W[12]); F1(C, D, E, A, B, W[13]);
+ F1(B, C, D, E, A, W[14]); F1(A, B, C, D, E, W[15]);
+ F1(E, A, B, C, D, W[16]); F1(D, E, A, B, C, W[17]);
+ F1(C, D, E, A, B, W[18]); F1(B, C, D, E, A, W[19]);
+
+ F2(A, B, C, D, E, W[20]); F2(E, A, B, C, D, W[21]);
+ F2(D, E, A, B, C, W[22]); F2(C, D, E, A, B, W[23]);
+ F2(B, C, D, E, A, W[24]); F2(A, B, C, D, E, W[25]);
+ F2(E, A, B, C, D, W[26]); F2(D, E, A, B, C, W[27]);
+ F2(C, D, E, A, B, W[28]); F2(B, C, D, E, A, W[29]);
+ F2(A, B, C, D, E, W[30]); F2(E, A, B, C, D, W[31]);
+ F2(D, E, A, B, C, W[32]); F2(C, D, E, A, B, W[33]);
+ F2(B, C, D, E, A, W[34]); F2(A, B, C, D, E, W[35]);
+ F2(E, A, B, C, D, W[36]); F2(D, E, A, B, C, W[37]);
+ F2(C, D, E, A, B, W[38]); F2(B, C, D, E, A, W[39]);
+
+ F3(A, B, C, D, E, W[40]); F3(E, A, B, C, D, W[41]);
+ F3(D, E, A, B, C, W[42]); F3(C, D, E, A, B, W[43]);
+ F3(B, C, D, E, A, W[44]); F3(A, B, C, D, E, W[45]);
+ F3(E, A, B, C, D, W[46]); F3(D, E, A, B, C, W[47]);
+ F3(C, D, E, A, B, W[48]); F3(B, C, D, E, A, W[49]);
+ F3(A, B, C, D, E, W[50]); F3(E, A, B, C, D, W[51]);
+ F3(D, E, A, B, C, W[52]); F3(C, D, E, A, B, W[53]);
+ F3(B, C, D, E, A, W[54]); F3(A, B, C, D, E, W[55]);
+ F3(E, A, B, C, D, W[56]); F3(D, E, A, B, C, W[57]);
+ F3(C, D, E, A, B, W[58]); F3(B, C, D, E, A, W[59]);
+
+ F4(A, B, C, D, E, W[60]); F4(E, A, B, C, D, W[61]);
+ F4(D, E, A, B, C, W[62]); F4(C, D, E, A, B, W[63]);
+ F4(B, C, D, E, A, W[64]); F4(A, B, C, D, E, W[65]);
+ F4(E, A, B, C, D, W[66]); F4(D, E, A, B, C, W[67]);
+ F4(C, D, E, A, B, W[68]); F4(B, C, D, E, A, W[69]);
+ F4(A, B, C, D, E, W[70]); F4(E, A, B, C, D, W[71]);
+ F4(D, E, A, B, C, W[72]); F4(C, D, E, A, B, W[73]);
+ F4(B, C, D, E, A, W[74]); F4(A, B, C, D, E, W[75]);
+ F4(E, A, B, C, D, W[76]); F4(D, E, A, B, C, W[77]);
+ F4(C, D, E, A, B, W[78]); F4(B, C, D, E, A, W[79]);
A = (digest[0] += A);
B = (digest[1] += B);
C = (digest[2] += C);
D = (digest[3] += D);
E = (digest[4] += E);
+
+ input += HASH_BLOCK_SIZE;
}
}
@@ -130,7 +141,7 @@ void SHA_160::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void SHA_160::clear() throw()
+void SHA_160::clear()
{
MDx_HashFunction::clear();
W.clear();
diff --git a/src/hash/sha1/sha160.h b/src/hash/sha1/sha160.h
index 232cf0322..142c6bf17 100644
--- a/src/hash/sha1/sha160.h
+++ b/src/hash/sha1/sha160.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL SHA_160 : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "SHA-160"; }
HashFunction* clone() const { return new SHA_160; }
SHA_160();
diff --git a/src/hash/sha1_amd64/info.txt b/src/hash/sha1_amd64/info.txt
index 183658ac7..e54b032ca 100644
--- a/src/hash/sha1_amd64/info.txt
+++ b/src/hash/sha1_amd64/info.txt
@@ -1,5 +1,3 @@
-realname "SHA-1 (x86-64 assembler)"
-
define SHA1_AMD64
load_on asm_ok
diff --git a/src/hash/sha1_ia32/info.txt b/src/hash/sha1_ia32/info.txt
index e7709454f..0361395fe 100644
--- a/src/hash/sha1_ia32/info.txt
+++ b/src/hash/sha1_ia32/info.txt
@@ -1,5 +1,3 @@
-realname "SHA-1 (IA-32)"
-
define SHA1_IA32
load_on asm_ok
diff --git a/src/hash/sha1_sse2/info.txt b/src/hash/sha1_sse2/info.txt
index 4a7a1b5e9..ee61076b4 100644
--- a/src/hash/sha1_sse2/info.txt
+++ b/src/hash/sha1_sse2/info.txt
@@ -1,8 +1,19 @@
-realname "SHA-1 (SSE2)"
-
define SHA1_SSE2
<requires>
sha1
-sse2_eng
+simd_engine
</requires>
+
+<arch>
+pentium-m
+pentium4
+prescott
+amd64
+</arch>
+
+<cc>
+gcc
+icc
+msvc
+</cc>
diff --git a/src/hash/sha1_sse2/sha1_sse2.cpp b/src/hash/sha1_sse2/sha1_sse2.cpp
index dddc06b7b..fc6466dd0 100644
--- a/src/hash/sha1_sse2/sha1_sse2.cpp
+++ b/src/hash/sha1_sse2/sha1_sse2.cpp
@@ -1,23 +1,278 @@
/*
-* SHA-160 (SSE2)
-* (C) 1999-2007 Jack Lloyd
+* SHA-1 using SSE2
+* (C) 2009 Jack Lloyd
*
* 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
*/
#include <botan/sha1_sse2.h>
+#include <botan/rotate.h>
+#include <emmintrin.h>
namespace Botan {
+namespace {
+
+/*
+First 16 bytes just need byte swapping. Preparing just means
+adding in the round constants.
+*/
+
+#define prep00_15(P, W) \
+ do { \
+ W = _mm_shufflehi_epi16(W, _MM_SHUFFLE(2, 3, 0, 1)); \
+ W = _mm_shufflelo_epi16(W, _MM_SHUFFLE(2, 3, 0, 1)); \
+ W = _mm_or_si128(_mm_slli_epi16(W, 8), \
+ _mm_srli_epi16(W, 8)); \
+ P.u128 = _mm_add_epi32(W, K00_19); \
+ } while(0)
+
+/*
+for each multiple of 4, t, we want to calculate this:
+
+W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);
+W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1);
+W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1);
+W[t+3] = rol(W[t] ^ W[t-5] ^ W[t-11] ^ W[t-13], 1);
+
+we'll actually calculate this:
+
+W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);
+W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1);
+W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1);
+W[t+3] = rol( 0 ^ W[t-5] ^ W[t-11] ^ W[t-13], 1);
+W[t+3] ^= rol(W[t+0], 1);
+
+the parameters are:
+
+W0 = &W[t-16];
+W1 = &W[t-12];
+W2 = &W[t- 8];
+W3 = &W[t- 4];
+
+and on output:
+prepared = W0 + K
+W0 = W[t]..W[t+3]
+*/
+
+/* note that there is a step here where i want to do a rol by 1, which
+* normally would look like this:
+*
+* r1 = psrld r0,$31
+* r0 = pslld r0,$1
+* r0 = por r0,r1
+*
+* but instead i do this:
+*
+* r1 = pcmpltd r0,zero
+* r0 = paddd r0,r0
+* r0 = psub r0,r1
+*
+* because pcmpltd and paddd are availabe in both MMX units on
+* efficeon, pentium-m, and opteron but shifts are available in
+* only one unit.
+*/
+#define prep(prep, XW0, XW1, XW2, XW3, K) \
+ do { \
+ __m128i r0, r1, r2, r3; \
+ \
+ /* load W[t-4] 16-byte aligned, and shift */ \
+ r3 = _mm_srli_si128((XW3), 4); \
+ r0 = (XW0); \
+ /* get high 64-bits of XW0 into low 64-bits */ \
+ r1 = _mm_shuffle_epi32((XW0), _MM_SHUFFLE(1,0,3,2)); \
+ /* load high 64-bits of r1 */ \
+ r1 = _mm_unpacklo_epi64(r1, (XW1)); \
+ r2 = (XW2); \
+ \
+ r0 = _mm_xor_si128(r1, r0); \
+ r2 = _mm_xor_si128(r3, r2); \
+ r0 = _mm_xor_si128(r2, r0); \
+ /* unrotated W[t]..W[t+2] in r0 ... still need W[t+3] */ \
+ \
+ r2 = _mm_slli_si128(r0, 12); \
+ r1 = _mm_cmplt_epi32(r0, _mm_setzero_si128()); \
+ r0 = _mm_add_epi32(r0, r0); /* shift left by 1 */ \
+ r0 = _mm_sub_epi32(r0, r1); /* r0 has W[t]..W[t+2] */ \
+ \
+ r3 = _mm_srli_epi32(r2, 30); \
+ r2 = _mm_slli_epi32(r2, 2); \
+ \
+ r0 = _mm_xor_si128(r0, r3); \
+ r0 = _mm_xor_si128(r0, r2); /* r0 now has W[t+3] */ \
+ \
+ (XW0) = r0; \
+ (prep).u128 = _mm_add_epi32(r0, K); \
+ } while(0)
+
+/*
+* SHA-160 F1 Function
+*/
+inline void F1(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg)
+ {
+ E += (D ^ (B & (C ^ D))) + msg + rotate_left(A, 5);
+ B = rotate_left(B, 30);
+ }
+
/*
-* SHA-160 Compression Function
+* SHA-160 F2 Function
*/
-void SHA_160_SSE2::compress_n(const byte input[], u32bit blocks)
+inline void F2(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg)
{
+ E += (B ^ C ^ D) + msg + rotate_left(A, 5);
+ B = rotate_left(B, 30);
+ }
+
+/*
+* SHA-160 F3 Function
+*/
+inline void F3(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg)
+ {
+ E += ((B & C) | ((B | C) & D)) + msg + rotate_left(A, 5);
+ B = rotate_left(B, 30);
+ }
+
+/*
+* SHA-160 F4 Function
+*/
+inline void F4(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E, u32bit msg)
+ {
+ E += (B ^ C ^ D) + msg + rotate_left(A, 5);
+ B = rotate_left(B, 30);
+ }
+
+}
+
+/*
+* SHA-160 Compression Function using SSE for message expansion
+*/
+void SHA_160_SSE2::compress_n(const byte input_bytes[], u32bit blocks)
+ {
+ const __m128i K00_19 = _mm_set1_epi32(0x5A827999);
+ const __m128i K20_39 = _mm_set1_epi32(0x6ED9EBA1);
+ const __m128i K40_59 = _mm_set1_epi32(0x8F1BBCDC);
+ const __m128i K60_79 = _mm_set1_epi32(0xCA62C1D6);
+
+ u32bit A = digest[0], B = digest[1], C = digest[2],
+ D = digest[3], E = digest[4];
+
+ const __m128i* input = (const __m128i *)input_bytes;
+
for(u32bit i = 0; i != blocks; ++i)
{
- botan_sha1_sse2_compress(digest, reinterpret_cast<const u32bit*>(input));
- input += HASH_BLOCK_SIZE;
+
+ /* I've tried arranging the SSE2 code to be 4, 8, 12, and 16
+ * steps ahead of the integer code. 12 steps ahead seems to
+ * produce the best performance. -dean
+ *
+ * Todo: check this is still true on Barcelona and Core2 -Jack
+ */
+
+ union v4si {
+ u32bit u32[4];
+ __m128i u128;
+ };
+
+ v4si P0, P1, P2;
+
+ __m128i W0 = _mm_loadu_si128(&input[0]);
+ prep00_15(P0, W0);
+
+ __m128i W1 = _mm_loadu_si128(&input[1]);
+ prep00_15(P1, W1);
+
+ __m128i W2 = _mm_loadu_si128(&input[2]);
+ prep00_15(P2, W2);
+
+ __m128i W3 = _mm_loadu_si128(&input[3]);
+
+ F1(A, B, C, D, E, P0.u32[0]); F1(E, A, B, C, D, P0.u32[1]);
+ F1(D, E, A, B, C, P0.u32[2]); F1(C, D, E, A, B, P0.u32[3]);
+ prep00_15(P0, W3);
+
+ F1(B, C, D, E, A, P1.u32[0]); F1(A, B, C, D, E, P1.u32[1]);
+ F1(E, A, B, C, D, P1.u32[2]); F1(D, E, A, B, C, P1.u32[3]);
+ prep(P1, W0, W1, W2, W3, K00_19);
+
+ F1(C, D, E, A, B, P2.u32[0]); F1(B, C, D, E, A, P2.u32[1]);
+ F1(A, B, C, D, E, P2.u32[2]); F1(E, A, B, C, D, P2.u32[3]);
+ prep(P2, W1, W2, W3, W0, K20_39);
+
+ F1(D, E, A, B, C, P0.u32[0]); F1(C, D, E, A, B, P0.u32[1]);
+ F1(B, C, D, E, A, P0.u32[2]); F1(A, B, C, D, E, P0.u32[3]);
+ prep(P0, W2, W3, W0, W1, K20_39);
+
+ F1(E, A, B, C, D, P1.u32[0]); F1(D, E, A, B, C, P1.u32[1]);
+ F1(C, D, E, A, B, P1.u32[2]); F1(B, C, D, E, A, P1.u32[3]);
+ prep(P1, W3, W0, W1, W2, K20_39);
+
+ F2(A, B, C, D, E, P2.u32[0]); F2(E, A, B, C, D, P2.u32[1]);
+ F2(D, E, A, B, C, P2.u32[2]); F2(C, D, E, A, B, P2.u32[3]);
+ prep(P2, W0, W1, W2, W3, K20_39);
+
+ F2(B, C, D, E, A, P0.u32[0]); F2(A, B, C, D, E, P0.u32[1]);
+ F2(E, A, B, C, D, P0.u32[2]); F2(D, E, A, B, C, P0.u32[3]);
+ prep(P0, W1, W2, W3, W0, K20_39);
+
+ F2(C, D, E, A, B, P1.u32[0]); F2(B, C, D, E, A, P1.u32[1]);
+ F2(A, B, C, D, E, P1.u32[2]); F2(E, A, B, C, D, P1.u32[3]);
+ prep(P1, W2, W3, W0, W1, K40_59);
+
+ F2(D, E, A, B, C, P2.u32[0]); F2(C, D, E, A, B, P2.u32[1]);
+ F2(B, C, D, E, A, P2.u32[2]); F2(A, B, C, D, E, P2.u32[3]);
+ prep(P2, W3, W0, W1, W2, K40_59);
+
+ F2(E, A, B, C, D, P0.u32[0]); F2(D, E, A, B, C, P0.u32[1]);
+ F2(C, D, E, A, B, P0.u32[2]); F2(B, C, D, E, A, P0.u32[3]);
+ prep(P0, W0, W1, W2, W3, K40_59);
+
+ F3(A, B, C, D, E, P1.u32[0]); F3(E, A, B, C, D, P1.u32[1]);
+ F3(D, E, A, B, C, P1.u32[2]); F3(C, D, E, A, B, P1.u32[3]);
+ prep(P1, W1, W2, W3, W0, K40_59);
+
+ F3(B, C, D, E, A, P2.u32[0]); F3(A, B, C, D, E, P2.u32[1]);
+ F3(E, A, B, C, D, P2.u32[2]); F3(D, E, A, B, C, P2.u32[3]);
+ prep(P2, W2, W3, W0, W1, K40_59);
+
+ F3(C, D, E, A, B, P0.u32[0]); F3(B, C, D, E, A, P0.u32[1]);
+ F3(A, B, C, D, E, P0.u32[2]); F3(E, A, B, C, D, P0.u32[3]);
+ prep(P0, W3, W0, W1, W2, K60_79);
+
+ F3(D, E, A, B, C, P1.u32[0]); F3(C, D, E, A, B, P1.u32[1]);
+ F3(B, C, D, E, A, P1.u32[2]); F3(A, B, C, D, E, P1.u32[3]);
+ prep(P1, W0, W1, W2, W3, K60_79);
+
+ F3(E, A, B, C, D, P2.u32[0]); F3(D, E, A, B, C, P2.u32[1]);
+ F3(C, D, E, A, B, P2.u32[2]); F3(B, C, D, E, A, P2.u32[3]);
+ prep(P2, W1, W2, W3, W0, K60_79);
+
+ F4(A, B, C, D, E, P0.u32[0]); F4(E, A, B, C, D, P0.u32[1]);
+ F4(D, E, A, B, C, P0.u32[2]); F4(C, D, E, A, B, P0.u32[3]);
+ prep(P0, W2, W3, W0, W1, K60_79);
+
+ F4(B, C, D, E, A, P1.u32[0]); F4(A, B, C, D, E, P1.u32[1]);
+ F4(E, A, B, C, D, P1.u32[2]); F4(D, E, A, B, C, P1.u32[3]);
+ prep(P1, W3, W0, W1, W2, K60_79);
+
+ F4(C, D, E, A, B, P2.u32[0]); F4(B, C, D, E, A, P2.u32[1]);
+ F4(A, B, C, D, E, P2.u32[2]); F4(E, A, B, C, D, P2.u32[3]);
+
+ F4(D, E, A, B, C, P0.u32[0]); F4(C, D, E, A, B, P0.u32[1]);
+ F4(B, C, D, E, A, P0.u32[2]); F4(A, B, C, D, E, P0.u32[3]);
+
+ F4(E, A, B, C, D, P1.u32[0]); F4(D, E, A, B, C, P1.u32[1]);
+ F4(C, D, E, A, B, P1.u32[2]); F4(B, C, D, E, A, P1.u32[3]);
+
+ A = (digest[0] += A);
+ B = (digest[1] += B);
+ C = (digest[2] += C);
+ D = (digest[3] += D);
+ E = (digest[4] += E);
+
+ input += (HASH_BLOCK_SIZE / 16);
}
}
diff --git a/src/hash/sha1_sse2/sha1_sse2_imp.cpp b/src/hash/sha1_sse2/sha1_sse2_imp.cpp
deleted file mode 100644
index 5ee222cca..000000000
--- a/src/hash/sha1_sse2/sha1_sse2_imp.cpp
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
-* SHA-1 using SSE2
-* (C) 2009 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-/*
-* Based on public domain code by Dean Gaudet <[email protected]>
-* http://arctic.org/~dean/crypto/sha1.html
-*/
-
-#include <botan/sha1_sse2.h>
-#include <botan/rotate.h>
-#include <emmintrin.h>
-
-namespace Botan {
-
-namespace {
-
-typedef union {
- u32bit u32[4];
- __m128i u128;
- } v4si;
-
-static const v4si K00_19 = { { 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999 } };
-static const v4si K20_39 = { { 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1 } };
-static const v4si K40_59 = { { 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc } };
-static const v4si K60_79 = { { 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6 } };
-
-/*
-the first 16 bytes only need byte swapping
-
-prepared points to 4x u32bit, 16-byte aligned
-
-W points to the 4 dwords which need preparing --
-and is overwritten with the swapped bytes
-*/
-#define prep00_15(prep, W) do { \
- __m128i r1, r2; \
- \
- r1 = (W); \
- r1 = _mm_shufflehi_epi16(r1, _MM_SHUFFLE(2, 3, 0, 1)); \
- r1 = _mm_shufflelo_epi16(r1, _MM_SHUFFLE(2, 3, 0, 1)); \
- r2 = _mm_slli_epi16(r1, 8); \
- r1 = _mm_srli_epi16(r1, 8); \
- r1 = _mm_or_si128(r1, r2); \
- (W) = r1; \
- (prep).u128 = _mm_add_epi32(K00_19.u128, r1); \
- } while(0)
-
-/*
-for each multiple of 4, t, we want to calculate this:
-
-W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);
-W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1);
-W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1);
-W[t+3] = rol(W[t] ^ W[t-5] ^ W[t-11] ^ W[t-13], 1);
-
-we'll actually calculate this:
-
-W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);
-W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1);
-W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1);
-W[t+3] = rol( 0 ^ W[t-5] ^ W[t-11] ^ W[t-13], 1);
-W[t+3] ^= rol(W[t+0], 1);
-
-the parameters are:
-
-W0 = &W[t-16];
-W1 = &W[t-12];
-W2 = &W[t- 8];
-W3 = &W[t- 4];
-
-and on output:
-prepared = W0 + K
-W0 = W[t]..W[t+3]
-*/
-
-/* note that there is a step here where i want to do a rol by 1, which
-* normally would look like this:
-*
-* r1 = psrld r0,$31
-* r0 = pslld r0,$1
-* r0 = por r0,r1
-*
-* but instead i do this:
-*
-* r1 = pcmpltd r0,zero
-* r0 = paddd r0,r0
-* r0 = psub r0,r1
-*
-* because pcmpltd and paddd are availabe in both MMX units on
-* efficeon, pentium-m, and opteron but shifts are available in
-* only one unit.
-*/
-#define prep(prep, XW0, XW1, XW2, XW3, K) \
- do { \
- __m128i r0, r1, r2, r3; \
- \
- /* load W[t-4] 16-byte aligned, and shift */ \
- r3 = _mm_srli_si128((XW3), 4); \
- r0 = (XW0); \
- /* get high 64-bits of XW0 into low 64-bits */ \
- r1 = _mm_shuffle_epi32((XW0), _MM_SHUFFLE(1,0,3,2)); \
- /* load high 64-bits of r1 */ \
- r1 = _mm_unpacklo_epi64(r1, (XW1)); \
- r2 = (XW2); \
- \
- r0 = _mm_xor_si128(r1, r0); \
- r2 = _mm_xor_si128(r3, r2); \
- r0 = _mm_xor_si128(r2, r0); \
- /* unrotated W[t]..W[t+2] in r0 ... still need W[t+3] */ \
- \
- r2 = _mm_slli_si128(r0, 12); \
- r1 = _mm_cmplt_epi32(r0, _mm_setzero_si128()); \
- r0 = _mm_add_epi32(r0, r0); /* shift left by 1 */ \
- r0 = _mm_sub_epi32(r0, r1); /* r0 has W[t]..W[t+2] */ \
- \
- r3 = _mm_srli_epi32(r2, 30); \
- r2 = _mm_slli_epi32(r2, 2); \
- \
- r0 = _mm_xor_si128(r0, r3); \
- r0 = _mm_xor_si128(r0, r2); /* r0 now has W[t+3] */ \
- \
- (XW0) = r0; \
- (prep).u128 = _mm_add_epi32(r0, (K).u128); \
- } while(0)
-
-static inline u32bit f00_19(u32bit x, u32bit y, u32bit z)
- {
- /* FIPS 180-2 says this: (x & y) ^ (~x & z)
- * but we can calculate it in fewer steps.
- */
- return ((y ^ z) & x) ^ z;
- }
-
-
-static inline u32bit f20_39(u32bit x, u32bit y, u32bit z)
- {
- return (x ^ z) ^ y;
- }
-
-
-static inline u32bit f40_59(u32bit x, u32bit y, u32bit z)
- {
- /* FIPS 180-2 says this: (x & y) ^ (x & z) ^ (y & z)
- * but we can calculate it in fewer steps.
- */
- return (x & z) | ((x | z) & y);
- }
-
-
-static inline u32bit f60_79(u32bit x, u32bit y, u32bit z)
- {
- return f20_39(x, y, z);
- }
-
-#define step(nn_mm, xa, xb, xc, xd, xe, xt, input) \
- do { \
- (xt) = (input) + f##nn_mm((xb), (xc), (xd)); \
- (xb) = rotate_left((xb), 30); \
- (xt) += ((xe) + rotate_left((xa), 5)); \
- } while(0)
-
-}
-
-extern "C" void botan_sha1_sse2_compress(u32bit H[5],
- const u32bit* inputu)
- {
- const __m128i * input = (const __m128i *)inputu;
- __m128i W0, W1, W2, W3;
- v4si prep0, prep1, prep2;
- u32bit a, b, c, d, e, t;
-
- a = H[0];
- b = H[1];
- c = H[2];
- d = H[3];
- e = H[4];
-
- /* i've tried arranging the SSE2 code to be 4, 8, 12, and 16
- * steps ahead of the integer code. 12 steps ahead seems
- * to produce the best performance. -dean
- */
- W0 = _mm_loadu_si128(&input[0]);
- prep00_15(prep0, W0); /* prepare for 00 through 03 */
- W1 = _mm_loadu_si128(&input[1]);
- prep00_15(prep1, W1); /* prepare for 04 through 07 */
- W2 = _mm_loadu_si128(&input[2]);
- prep00_15(prep2, W2); /* prepare for 08 through 11 */
-
- W3 = _mm_loadu_si128(&input[3]);
- step(00_19, a, b, c, d, e, t, prep0.u32[0]); /* 00 */
- step(00_19, t, a, b, c, d, e, prep0.u32[1]); /* 01 */
- step(00_19, e, t, a, b, c, d, prep0.u32[2]); /* 02 */
- step(00_19, d, e, t, a, b, c, prep0.u32[3]); /* 03 */
- prep00_15(prep0, W3);
- step(00_19, c, d, e, t, a, b, prep1.u32[0]); /* 04 */
- step(00_19, b, c, d, e, t, a, prep1.u32[1]); /* 05 */
- step(00_19, a, b, c, d, e, t, prep1.u32[2]); /* 06 */
- step(00_19, t, a, b, c, d, e, prep1.u32[3]); /* 07 */
- prep(prep1, W0, W1, W2, W3, K00_19); /* prepare for 16 through 19 */
- step(00_19, e, t, a, b, c, d, prep2.u32[0]); /* 08 */
- step(00_19, d, e, t, a, b, c, prep2.u32[1]); /* 09 */
- step(00_19, c, d, e, t, a, b, prep2.u32[2]); /* 10 */
- step(00_19, b, c, d, e, t, a, prep2.u32[3]); /* 11 */
- prep(prep2, W1, W2, W3, W0, K20_39); /* prepare for 20 through 23 */
- step(00_19, a, b, c, d, e, t, prep0.u32[0]); /* 12 */
- step(00_19, t, a, b, c, d, e, prep0.u32[1]); /* 13 */
- step(00_19, e, t, a, b, c, d, prep0.u32[2]); /* 14 */
- step(00_19, d, e, t, a, b, c, prep0.u32[3]); /* 15 */
- prep(prep0, W2, W3, W0, W1, K20_39);
- step(00_19, c, d, e, t, a, b, prep1.u32[0]); /* 16 */
- step(00_19, b, c, d, e, t, a, prep1.u32[1]); /* 17 */
- step(00_19, a, b, c, d, e, t, prep1.u32[2]); /* 18 */
- step(00_19, t, a, b, c, d, e, prep1.u32[3]); /* 19 */
-
- prep(prep1, W3, W0, W1, W2, K20_39);
- step(20_39, e, t, a, b, c, d, prep2.u32[0]); /* 20 */
- step(20_39, d, e, t, a, b, c, prep2.u32[1]); /* 21 */
- step(20_39, c, d, e, t, a, b, prep2.u32[2]); /* 22 */
- step(20_39, b, c, d, e, t, a, prep2.u32[3]); /* 23 */
- prep(prep2, W0, W1, W2, W3, K20_39);
- step(20_39, a, b, c, d, e, t, prep0.u32[0]); /* 24 */
- step(20_39, t, a, b, c, d, e, prep0.u32[1]); /* 25 */
- step(20_39, e, t, a, b, c, d, prep0.u32[2]); /* 26 */
- step(20_39, d, e, t, a, b, c, prep0.u32[3]); /* 27 */
- prep(prep0, W1, W2, W3, W0, K20_39);
- step(20_39, c, d, e, t, a, b, prep1.u32[0]); /* 28 */
- step(20_39, b, c, d, e, t, a, prep1.u32[1]); /* 29 */
- step(20_39, a, b, c, d, e, t, prep1.u32[2]); /* 30 */
- step(20_39, t, a, b, c, d, e, prep1.u32[3]); /* 31 */
- prep(prep1, W2, W3, W0, W1, K40_59);
- step(20_39, e, t, a, b, c, d, prep2.u32[0]); /* 32 */
- step(20_39, d, e, t, a, b, c, prep2.u32[1]); /* 33 */
- step(20_39, c, d, e, t, a, b, prep2.u32[2]); /* 34 */
- step(20_39, b, c, d, e, t, a, prep2.u32[3]); /* 35 */
- prep(prep2, W3, W0, W1, W2, K40_59);
- step(20_39, a, b, c, d, e, t, prep0.u32[0]); /* 36 */
- step(20_39, t, a, b, c, d, e, prep0.u32[1]); /* 37 */
- step(20_39, e, t, a, b, c, d, prep0.u32[2]); /* 38 */
- step(20_39, d, e, t, a, b, c, prep0.u32[3]); /* 39 */
-
- prep(prep0, W0, W1, W2, W3, K40_59);
- step(40_59, c, d, e, t, a, b, prep1.u32[0]); /* 40 */
- step(40_59, b, c, d, e, t, a, prep1.u32[1]); /* 41 */
- step(40_59, a, b, c, d, e, t, prep1.u32[2]); /* 42 */
- step(40_59, t, a, b, c, d, e, prep1.u32[3]); /* 43 */
- prep(prep1, W1, W2, W3, W0, K40_59);
- step(40_59, e, t, a, b, c, d, prep2.u32[0]); /* 44 */
- step(40_59, d, e, t, a, b, c, prep2.u32[1]); /* 45 */
- step(40_59, c, d, e, t, a, b, prep2.u32[2]); /* 46 */
- step(40_59, b, c, d, e, t, a, prep2.u32[3]); /* 47 */
- prep(prep2, W2, W3, W0, W1, K40_59);
- step(40_59, a, b, c, d, e, t, prep0.u32[0]); /* 48 */
- step(40_59, t, a, b, c, d, e, prep0.u32[1]); /* 49 */
- step(40_59, e, t, a, b, c, d, prep0.u32[2]); /* 50 */
- step(40_59, d, e, t, a, b, c, prep0.u32[3]); /* 51 */
- prep(prep0, W3, W0, W1, W2, K60_79);
- step(40_59, c, d, e, t, a, b, prep1.u32[0]); /* 52 */
- step(40_59, b, c, d, e, t, a, prep1.u32[1]); /* 53 */
- step(40_59, a, b, c, d, e, t, prep1.u32[2]); /* 54 */
- step(40_59, t, a, b, c, d, e, prep1.u32[3]); /* 55 */
- prep(prep1, W0, W1, W2, W3, K60_79);
- step(40_59, e, t, a, b, c, d, prep2.u32[0]); /* 56 */
- step(40_59, d, e, t, a, b, c, prep2.u32[1]); /* 57 */
- step(40_59, c, d, e, t, a, b, prep2.u32[2]); /* 58 */
- step(40_59, b, c, d, e, t, a, prep2.u32[3]); /* 59 */
-
- prep(prep2, W1, W2, W3, W0, K60_79);
- step(60_79, a, b, c, d, e, t, prep0.u32[0]); /* 60 */
- step(60_79, t, a, b, c, d, e, prep0.u32[1]); /* 61 */
- step(60_79, e, t, a, b, c, d, prep0.u32[2]); /* 62 */
- step(60_79, d, e, t, a, b, c, prep0.u32[3]); /* 63 */
- prep(prep0, W2, W3, W0, W1, K60_79);
- step(60_79, c, d, e, t, a, b, prep1.u32[0]); /* 64 */
- step(60_79, b, c, d, e, t, a, prep1.u32[1]); /* 65 */
- step(60_79, a, b, c, d, e, t, prep1.u32[2]); /* 66 */
- step(60_79, t, a, b, c, d, e, prep1.u32[3]); /* 67 */
- prep(prep1, W3, W0, W1, W2, K60_79);
- step(60_79, e, t, a, b, c, d, prep2.u32[0]); /* 68 */
- step(60_79, d, e, t, a, b, c, prep2.u32[1]); /* 69 */
- step(60_79, c, d, e, t, a, b, prep2.u32[2]); /* 70 */
- step(60_79, b, c, d, e, t, a, prep2.u32[3]); /* 71 */
-
- step(60_79, a, b, c, d, e, t, prep0.u32[0]); /* 72 */
- step(60_79, t, a, b, c, d, e, prep0.u32[1]); /* 73 */
- step(60_79, e, t, a, b, c, d, prep0.u32[2]); /* 74 */
- step(60_79, d, e, t, a, b, c, prep0.u32[3]); /* 75 */
- /* no more input to prepare */
- step(60_79, c, d, e, t, a, b, prep1.u32[0]); /* 76 */
- step(60_79, b, c, d, e, t, a, prep1.u32[1]); /* 77 */
- step(60_79, a, b, c, d, e, t, prep1.u32[2]); /* 78 */
- step(60_79, t, a, b, c, d, e, prep1.u32[3]); /* 79 */
- /* e, t, a, b, c, d */
- H[0] += e;
- H[1] += t;
- H[2] += a;
- H[3] += b;
- H[4] += c;
- }
-
-}
diff --git a/src/hash/sha2/info.txt b/src/hash/sha2/info.txt
index 8cc50fa41..e12f2b694 100644
--- a/src/hash/sha2/info.txt
+++ b/src/hash/sha2/info.txt
@@ -1,5 +1,3 @@
-realname "SHA-2 (224, 256, 384, 512)"
-
define SHA2
<requires>
diff --git a/src/hash/sha2/sha2_32.cpp b/src/hash/sha2/sha2_32.cpp
index 9da2ec23f..7068dd63f 100644
--- a/src/hash/sha2/sha2_32.cpp
+++ b/src/hash/sha2/sha2_32.cpp
@@ -56,13 +56,27 @@ void SHA_224_256_BASE::compress_n(const byte input[], u32bit blocks)
for(u32bit i = 0; i != blocks; ++i)
{
- for(u32bit j = 0; j != 16; ++j)
- W[j] = load_be<u32bit>(input, j);
- input += HASH_BLOCK_SIZE;
-
- for(u32bit j = 16; j != 64; ++j)
- W[j] = sigma(W[j- 2], 17, 19, 10) + W[j- 7] +
- sigma(W[j-15], 7, 18, 3) + W[j-16];
+ load_be(W.begin(), input, 16);
+
+ for(u32bit j = 16; j != 64; j += 8)
+ {
+ W[j ] = sigma(W[j- 2], 17, 19, 10) + W[j-7] +
+ sigma(W[j-15], 7, 18, 3) + W[j-16];
+ W[j+1] = sigma(W[j- 1], 17, 19, 10) + W[j-6] +
+ sigma(W[j-14], 7, 18, 3) + W[j-15];
+ W[j+2] = sigma(W[j ], 17, 19, 10) + W[j-5] +
+ sigma(W[j-13], 7, 18, 3) + W[j-14];
+ W[j+3] = sigma(W[j+ 1], 17, 19, 10) + W[j-4] +
+ sigma(W[j-12], 7, 18, 3) + W[j-13];
+ W[j+4] = sigma(W[j+ 2], 17, 19, 10) + W[j-3] +
+ sigma(W[j-11], 7, 18, 3) + W[j-12];
+ W[j+5] = sigma(W[j+ 3], 17, 19, 10) + W[j-2] +
+ sigma(W[j-10], 7, 18, 3) + W[j-11];
+ W[j+6] = sigma(W[j+ 4], 17, 19, 10) + W[j-1] +
+ sigma(W[j- 9], 7, 18, 3) + W[j-10];
+ W[j+7] = sigma(W[j+ 5], 17, 19, 10) + W[j ] +
+ sigma(W[j- 8], 7, 18, 3) + W[j- 9];
+ }
F1(A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98);
F1(H, A, B, C, D, E, F, G, W[ 1], 0x71374491);
@@ -137,6 +151,8 @@ void SHA_224_256_BASE::compress_n(const byte input[], u32bit blocks)
F = (digest[5] += F);
G = (digest[6] += G);
H = (digest[7] += H);
+
+ input += HASH_BLOCK_SIZE;
}
}
@@ -152,7 +168,7 @@ void SHA_224_256_BASE::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void SHA_224_256_BASE::clear() throw()
+void SHA_224_256_BASE::clear()
{
MDx_HashFunction::clear();
W.clear();
@@ -161,23 +177,23 @@ void SHA_224_256_BASE::clear() throw()
/*
* Clear memory of sensitive data
*/
-void SHA_224::clear() throw()
+void SHA_224::clear()
{
SHA_224_256_BASE::clear();
- digest[0] = 0xc1059ed8;
- digest[1] = 0x367cd507;
- digest[2] = 0x3070dd17;
- digest[3] = 0xf70e5939;
- digest[4] = 0xffc00b31;
+ digest[0] = 0xC1059ED8;
+ digest[1] = 0x367CD507;
+ digest[2] = 0x3070DD17;
+ digest[3] = 0xF70E5939;
+ digest[4] = 0xFFC00B31;
digest[5] = 0x68581511;
- digest[6] = 0x64f98fa7;
- digest[7] = 0xbefa4fa4;
+ digest[6] = 0x64F98FA7;
+ digest[7] = 0xBEFA4FA4;
}
/*
* Clear memory of sensitive data
*/
-void SHA_256::clear() throw()
+void SHA_256::clear()
{
SHA_224_256_BASE::clear();
digest[0] = 0x6A09E667;
diff --git a/src/hash/sha2/sha2_32.h b/src/hash/sha2/sha2_32.h
index 05083d19d..313eec676 100644
--- a/src/hash/sha2/sha2_32.h
+++ b/src/hash/sha2/sha2_32.h
@@ -19,7 +19,7 @@ namespace Botan {
class BOTAN_DLL SHA_224_256_BASE : public MDx_HashFunction
{
protected:
- void clear() throw();
+ void clear();
SHA_224_256_BASE(u32bit out) :
MDx_HashFunction(out, 64, true, true) { clear(); }
@@ -36,7 +36,7 @@ class BOTAN_DLL SHA_224_256_BASE : public MDx_HashFunction
class BOTAN_DLL SHA_224 : public SHA_224_256_BASE
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "SHA-224"; }
HashFunction* clone() const { return new SHA_224; }
SHA_224() : SHA_224_256_BASE(28) { clear(); }
@@ -48,7 +48,7 @@ class BOTAN_DLL SHA_224 : public SHA_224_256_BASE
class BOTAN_DLL SHA_256 : public SHA_224_256_BASE
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "SHA-256"; }
HashFunction* clone() const { return new SHA_256; }
SHA_256() : SHA_224_256_BASE(32) { clear (); }
diff --git a/src/hash/sha2/sha2_64.cpp b/src/hash/sha2/sha2_64.cpp
index e9b4c2e5a..e260d8338 100644
--- a/src/hash/sha2/sha2_64.cpp
+++ b/src/hash/sha2/sha2_64.cpp
@@ -59,9 +59,17 @@ void SHA_384_512_BASE::compress_n(const byte input[], u32bit blocks)
W[j] = load_be<u64bit>(input, j);
input += HASH_BLOCK_SIZE;
- for(u32bit j = 16; j != 80; ++j)
- W[j] = sigma(W[j- 2], 19, 61, 6) + W[j- 7] +
- sigma(W[j-15], 1, 8, 7) + W[j-16];
+ for(u32bit j = 16; j != 80; j += 8)
+ {
+ W[j ] = sigma(W[j-2], 19, 61, 6) + W[j-7] + sigma(W[j-15], 1, 8, 7) + W[j-16];
+ W[j+1] = sigma(W[j-1], 19, 61, 6) + W[j-6] + sigma(W[j-14], 1, 8, 7) + W[j-15];
+ W[j+2] = sigma(W[j ], 19, 61, 6) + W[j-5] + sigma(W[j-13], 1, 8, 7) + W[j-14];
+ W[j+3] = sigma(W[j+1], 19, 61, 6) + W[j-4] + sigma(W[j-12], 1, 8, 7) + W[j-13];
+ W[j+4] = sigma(W[j+2], 19, 61, 6) + W[j-3] + sigma(W[j-11], 1, 8, 7) + W[j-12];
+ W[j+5] = sigma(W[j+3], 19, 61, 6) + W[j-2] + sigma(W[j-10], 1, 8, 7) + W[j-11];
+ W[j+6] = sigma(W[j+4], 19, 61, 6) + W[j-1] + sigma(W[j- 9], 1, 8, 7) + W[j-10];
+ W[j+7] = sigma(W[j+5], 19, 61, 6) + W[j ] + sigma(W[j- 8], 1, 8, 7) + W[j- 9];
+ }
F1(A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98D728AE22);
F1(H, A, B, C, D, E, F, G, W[ 1], 0x7137449123EF65CD);
@@ -167,7 +175,7 @@ void SHA_384_512_BASE::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void SHA_384_512_BASE::clear() throw()
+void SHA_384_512_BASE::clear()
{
MDx_HashFunction::clear();
W.clear();
@@ -176,7 +184,7 @@ void SHA_384_512_BASE::clear() throw()
/*
* Clear memory of sensitive data
*/
-void SHA_384::clear() throw()
+void SHA_384::clear()
{
SHA_384_512_BASE::clear();
digest[0] = 0xCBBB9D5DC1059ED8;
@@ -192,7 +200,7 @@ void SHA_384::clear() throw()
/*
* Clear memory of sensitive data
*/
-void SHA_512::clear() throw()
+void SHA_512::clear()
{
SHA_384_512_BASE::clear();
digest[0] = 0x6A09E667F3BCC908;
diff --git a/src/hash/sha2/sha2_64.h b/src/hash/sha2/sha2_64.h
index dcc6dc83b..8e4d171f8 100644
--- a/src/hash/sha2/sha2_64.h
+++ b/src/hash/sha2/sha2_64.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL SHA_384_512_BASE : public MDx_HashFunction
{
protected:
- void clear() throw();
+ void clear();
SHA_384_512_BASE(u32bit out) :
MDx_HashFunction(out, 128, true, true, 16) {}
@@ -37,7 +37,7 @@ class BOTAN_DLL SHA_384_512_BASE : public MDx_HashFunction
class BOTAN_DLL SHA_384 : public SHA_384_512_BASE
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "SHA-384"; }
HashFunction* clone() const { return new SHA_384; }
SHA_384() : SHA_384_512_BASE(48) { clear(); }
@@ -49,7 +49,7 @@ class BOTAN_DLL SHA_384 : public SHA_384_512_BASE
class BOTAN_DLL SHA_512 : public SHA_384_512_BASE
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "SHA-512"; }
HashFunction* clone() const { return new SHA_512; }
SHA_512() : SHA_384_512_BASE(64) { clear(); }
diff --git a/src/hash/skein/info.txt b/src/hash/skein/info.txt
index 908033852..427f59121 100644
--- a/src/hash/skein/info.txt
+++ b/src/hash/skein/info.txt
@@ -1,5 +1,3 @@
-realname "Skein"
-
define SKEIN_512
<requires>
diff --git a/src/hash/skein/skein_512.cpp b/src/hash/skein/skein_512.cpp
index a48cfc186..e1ca08c15 100644
--- a/src/hash/skein/skein_512.cpp
+++ b/src/hash/skein/skein_512.cpp
@@ -34,8 +34,8 @@ void ubi_512(u64bit H[9], u64bit T[], const byte msg[], u64bit msg_len)
T[0] += to_proc;
u64bit M[8] = { 0 };
- for(u32bit j = 0; j != to_proc / 8; ++j)
- M[j] = load_le<u64bit>(msg, j);
+
+ load_le(M, msg, to_proc / 8);
if(to_proc % 8)
{
@@ -183,7 +183,7 @@ HashFunction* Skein_512::clone() const
return new Skein_512(output_bits, personalization);
}
-void Skein_512::clear() throw()
+void Skein_512::clear()
{
H.clear();
T.clear();
diff --git a/src/hash/skein/skein_512.h b/src/hash/skein/skein_512.h
index fa558fc0d..db8d3c8b7 100644
--- a/src/hash/skein/skein_512.h
+++ b/src/hash/skein/skein_512.h
@@ -22,7 +22,7 @@ class BOTAN_DLL Skein_512 : public HashFunction
HashFunction* clone() const;
std::string name() const;
- void clear() throw();
+ void clear();
private:
void add_data(const byte input[], u32bit length);
void final_result(byte out[]);
diff --git a/src/hash/tiger/info.txt b/src/hash/tiger/info.txt
index 92b5519c0..b50b745e3 100644
--- a/src/hash/tiger/info.txt
+++ b/src/hash/tiger/info.txt
@@ -1,5 +1,3 @@
-realname "Tiger"
-
define TIGER
<requires>
diff --git a/src/hash/tiger/tiger.cpp b/src/hash/tiger/tiger.cpp
index e46f2cb77..4f4d4dc83 100644
--- a/src/hash/tiger/tiger.cpp
+++ b/src/hash/tiger/tiger.cpp
@@ -21,9 +21,7 @@ void Tiger::compress_n(const byte input[], u32bit blocks)
for(u32bit i = 0; i != blocks; ++i)
{
- for(u32bit j = 0; j != 8; ++j)
- X[j] = load_le<u64bit>(input, j);
- input += HASH_BLOCK_SIZE;
+ load_le(X.begin(), input, X.size());
pass(A, B, C, X, 5); mix(X);
pass(C, A, B, X, 7); mix(X);
@@ -39,6 +37,8 @@ void Tiger::compress_n(const byte input[], u32bit blocks)
A = (digest[0] ^= A);
B = digest[1] = B - digest[1];
C = (digest[2] += C);
+
+ input += HASH_BLOCK_SIZE;
}
}
@@ -129,7 +129,7 @@ void Tiger::mix(u64bit X[8])
/*
* Clear memory of sensitive data
*/
-void Tiger::clear() throw()
+void Tiger::clear()
{
MDx_HashFunction::clear();
X.clear();
diff --git a/src/hash/tiger/tiger.h b/src/hash/tiger/tiger.h
index 63184a938..86ddcd270 100644
--- a/src/hash/tiger/tiger.h
+++ b/src/hash/tiger/tiger.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL Tiger : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const;
HashFunction* clone() const { return new Tiger(OUTPUT_LENGTH); }
Tiger(u32bit = 24, u32bit = 3);
diff --git a/src/hash/whirlpool/info.txt b/src/hash/whirlpool/info.txt
index 4fe4b2b25..7bec0c6cf 100644
--- a/src/hash/whirlpool/info.txt
+++ b/src/hash/whirlpool/info.txt
@@ -1,5 +1,3 @@
-realname "Whirlpool"
-
define WHIRLPOOL
<requires>
diff --git a/src/hash/whirlpool/whrlpool.cpp b/src/hash/whirlpool/whrlpool.cpp
index 8548d6192..b7a02a9b6 100644
--- a/src/hash/whirlpool/whrlpool.cpp
+++ b/src/hash/whirlpool/whrlpool.cpp
@@ -136,7 +136,7 @@ void Whirlpool::copy_out(byte output[])
/*
* Clear memory of sensitive data
*/
-void Whirlpool::clear() throw()
+void Whirlpool::clear()
{
MDx_HashFunction::clear();
M.clear();
diff --git a/src/hash/whirlpool/whrlpool.h b/src/hash/whirlpool/whrlpool.h
index b72ff609f..34b4d2302 100644
--- a/src/hash/whirlpool/whrlpool.h
+++ b/src/hash/whirlpool/whrlpool.h
@@ -18,7 +18,7 @@ namespace Botan {
class BOTAN_DLL Whirlpool : public MDx_HashFunction
{
public:
- void clear() throw();
+ void clear();
std::string name() const { return "Whirlpool"; }
HashFunction* clone() const { return new Whirlpool; }
Whirlpool() : MDx_HashFunction(64, 64, true, true, 32) { clear(); }
diff --git a/src/kdf/info.txt b/src/kdf/info.txt
index 1965a2098..8eb4fc6e9 100644
--- a/src/kdf/info.txt
+++ b/src/kdf/info.txt
@@ -1,5 +1,3 @@
-realname "KDF Base Class"
-
define KDF_BASE
load_on auto
diff --git a/src/kdf/kdf.h b/src/kdf/kdf.h
index 70f636b6c..67078218f 100644
--- a/src/kdf/kdf.h
+++ b/src/kdf/kdf.h
@@ -22,6 +22,7 @@ class BOTAN_DLL KDF
SecureVector<byte> derive_key(u32bit key_len,
const MemoryRegion<byte>& secret,
const std::string& salt = "") const;
+
SecureVector<byte> derive_key(u32bit key_len,
const MemoryRegion<byte>& secret,
const MemoryRegion<byte>& salt) const;
@@ -33,14 +34,17 @@ class BOTAN_DLL KDF
SecureVector<byte> derive_key(u32bit key_len,
const byte secret[], u32bit secret_len,
const std::string& salt = "") const;
+
SecureVector<byte> derive_key(u32bit key_len,
const byte secret[], u32bit secret_len,
const byte salt[], u32bit salt_len) const;
virtual ~KDF() {}
private:
- virtual SecureVector<byte> derive(u32bit, const byte[], u32bit,
- const byte[], u32bit) const = 0;
+ virtual SecureVector<byte>
+ derive(u32bit key_len,
+ const byte secret[], u32bit secret_len,
+ const byte salt[], u32bit salt_len) const = 0;
};
/*
@@ -50,7 +54,7 @@ class BOTAN_DLL MGF
{
public:
virtual void mask(const byte in[], u32bit in_len,
- byte out[], u32bit out_len) const = 0;
+ byte out[], u32bit out_len) const = 0;
virtual ~MGF() {}
};
diff --git a/src/kdf/kdf1/info.txt b/src/kdf/kdf1/info.txt
index ede10017e..2557f9472 100644
--- a/src/kdf/kdf1/info.txt
+++ b/src/kdf/kdf1/info.txt
@@ -1,5 +1,3 @@
-realname "KDF1"
-
define KDF1
load_on auto
diff --git a/src/kdf/kdf2/info.txt b/src/kdf/kdf2/info.txt
index 1858f8929..b71595449 100644
--- a/src/kdf/kdf2/info.txt
+++ b/src/kdf/kdf2/info.txt
@@ -1,5 +1,3 @@
-realname "KDF2"
-
define KDF2
load_on auto
diff --git a/src/kdf/mgf1/info.txt b/src/kdf/mgf1/info.txt
index f9e952f82..0f104c3b3 100644
--- a/src/kdf/mgf1/info.txt
+++ b/src/kdf/mgf1/info.txt
@@ -1,5 +1,3 @@
-realname "MGF1"
-
define MGF1
load_on dep
diff --git a/src/kdf/ssl_prf/info.txt b/src/kdf/ssl_prf/info.txt
index f862905a2..b306721b9 100644
--- a/src/kdf/ssl_prf/info.txt
+++ b/src/kdf/ssl_prf/info.txt
@@ -1,5 +1,3 @@
-realname "SSLv3 PRF"
-
define SSL_V3_PRF
load_on auto
diff --git a/src/kdf/tls_prf/info.txt b/src/kdf/tls_prf/info.txt
index f95ef9c24..11a0d44f5 100644
--- a/src/kdf/tls_prf/info.txt
+++ b/src/kdf/tls_prf/info.txt
@@ -1,5 +1,3 @@
-realname "TLS v1.0 PRF"
-
define TLS_V10_PRF
load_on auto
diff --git a/src/kdf/x942_prf/info.txt b/src/kdf/x942_prf/info.txt
index 295c2cde6..e38b2aac1 100644
--- a/src/kdf/x942_prf/info.txt
+++ b/src/kdf/x942_prf/info.txt
@@ -1,5 +1,3 @@
-realname "X942 PRF"
-
define X942_PRF
load_on auto
diff --git a/src/libstate/info.txt b/src/libstate/info.txt
index fcf386e6d..aa74e6573 100644
--- a/src/libstate/info.txt
+++ b/src/libstate/info.txt
@@ -1,5 +1,3 @@
-realname "Botan Libstate Module"
-
load_on always
define LIBSTATE_MODULE
diff --git a/src/libstate/libstate.cpp b/src/libstate/libstate.cpp
index 66e606880..54de93f1a 100644
--- a/src/libstate/libstate.cpp
+++ b/src/libstate/libstate.cpp
@@ -27,8 +27,8 @@
#include <botan/eng_amd64.h>
#endif
-#if defined(BOTAN_HAS_ENGINE_SSE2_ASSEMBLER)
- #include <botan/eng_sse2.h>
+#if defined(BOTAN_HAS_ENGINE_SIMD)
+ #include <botan/simd_engine.h>
#endif
#if defined(BOTAN_HAS_ENGINE_GNU_MP)
@@ -250,8 +250,8 @@ void Library_State::initialize()
new OpenSSL_Engine,
#endif
-#if defined(BOTAN_HAS_ENGINE_SSE2_ASSEMBLER)
- new SSE2_Assembler_Engine,
+#if defined(BOTAN_HAS_ENGINE_SIMD)
+ new SIMD_Engine,
#endif
#if defined(BOTAN_HAS_ENGINE_AMD64_ASSEMBLER)
diff --git a/src/libstate/oid_lookup/info.txt b/src/libstate/oid_lookup/info.txt
index 609eb9199..e0f6f099c 100644
--- a/src/libstate/oid_lookup/info.txt
+++ b/src/libstate/oid_lookup/info.txt
@@ -1,5 +1,3 @@
-realname "OID Lookup"
-
load_on dep
define OID_LOOKUP
diff --git a/src/mac/cbc_mac/cbc_mac.cpp b/src/mac/cbc_mac/cbc_mac.cpp
index f5d9e1567..0617e3e90 100644
--- a/src/mac/cbc_mac/cbc_mac.cpp
+++ b/src/mac/cbc_mac/cbc_mac.cpp
@@ -62,7 +62,7 @@ void CBC_MAC::key_schedule(const byte key[], u32bit length)
/*
* Clear memory of sensitive data
*/
-void CBC_MAC::clear() throw()
+void CBC_MAC::clear()
{
e->clear();
state.clear();
diff --git a/src/mac/cbc_mac/cbc_mac.h b/src/mac/cbc_mac/cbc_mac.h
index d17d792d3..15026c0a9 100644
--- a/src/mac/cbc_mac/cbc_mac.h
+++ b/src/mac/cbc_mac/cbc_mac.h
@@ -19,7 +19,7 @@ namespace Botan {
class BOTAN_DLL CBC_MAC : public MessageAuthenticationCode
{
public:
- void clear() throw();
+ void clear();
std::string name() const;
MessageAuthenticationCode* clone() const;
diff --git a/src/mac/cbc_mac/info.txt b/src/mac/cbc_mac/info.txt
index 3a5434974..80adc5fd0 100644
--- a/src/mac/cbc_mac/info.txt
+++ b/src/mac/cbc_mac/info.txt
@@ -1,5 +1,3 @@
-realname "CBC-MAC"
-
define CBC_MAC
load_on auto
diff --git a/src/mac/cmac/cmac.cpp b/src/mac/cmac/cmac.cpp
index 84aa61e03..58923138b 100644
--- a/src/mac/cmac/cmac.cpp
+++ b/src/mac/cmac/cmac.cpp
@@ -101,7 +101,7 @@ void CMAC::key_schedule(const byte key[], u32bit length)
/*
* Clear memory of sensitive data
*/
-void CMAC::clear() throw()
+void CMAC::clear()
{
e->clear();
state.clear();
diff --git a/src/mac/cmac/cmac.h b/src/mac/cmac/cmac.h
index 5a6deb7b0..8297e5ea1 100644
--- a/src/mac/cmac/cmac.h
+++ b/src/mac/cmac/cmac.h
@@ -19,7 +19,7 @@ namespace Botan {
class BOTAN_DLL CMAC : public MessageAuthenticationCode
{
public:
- void clear() throw();
+ void clear();
std::string name() const;
MessageAuthenticationCode* clone() const;
diff --git a/src/mac/cmac/info.txt b/src/mac/cmac/info.txt
index b593c9d38..5dad789de 100644
--- a/src/mac/cmac/info.txt
+++ b/src/mac/cmac/info.txt
@@ -1,5 +1,3 @@
-realname "CMAC"
-
define CMAC
load_on auto
diff --git a/src/mac/hmac/hmac.cpp b/src/mac/hmac/hmac.cpp
index 717e2640c..99be479fa 100644
--- a/src/mac/hmac/hmac.cpp
+++ b/src/mac/hmac/hmac.cpp
@@ -58,7 +58,7 @@ void HMAC::key_schedule(const byte key[], u32bit length)
/*
* Clear memory of sensitive data
*/
-void HMAC::clear() throw()
+void HMAC::clear()
{
hash->clear();
i_key.clear();
diff --git a/src/mac/hmac/hmac.h b/src/mac/hmac/hmac.h
index 932af71fc..62bb69853 100644
--- a/src/mac/hmac/hmac.h
+++ b/src/mac/hmac/hmac.h
@@ -19,7 +19,7 @@ namespace Botan {
class BOTAN_DLL HMAC : public MessageAuthenticationCode
{
public:
- void clear() throw();
+ void clear();
std::string name() const;
MessageAuthenticationCode* clone() const;
diff --git a/src/mac/hmac/info.txt b/src/mac/hmac/info.txt
index cdf2e67ab..26da83533 100644
--- a/src/mac/hmac/info.txt
+++ b/src/mac/hmac/info.txt
@@ -1,5 +1,3 @@
-realname "HMAC"
-
define HMAC
load_on auto
diff --git a/src/mac/info.txt b/src/mac/info.txt
index 239eb633f..9a839d04d 100644
--- a/src/mac/info.txt
+++ b/src/mac/info.txt
@@ -1,5 +1,3 @@
-realname "Message Authentication Codes"
-
load_on auto
<add>
diff --git a/src/mac/mac.h b/src/mac/mac.h
index 3ec5fff5f..7c73a2900 100644
--- a/src/mac/mac.h
+++ b/src/mac/mac.h
@@ -43,7 +43,7 @@ class BOTAN_DLL MessageAuthenticationCode : public BufferedComputation,
/**
* Reset the internal state of this object.
*/
- virtual void clear() throw() = 0;
+ virtual void clear() = 0;
MessageAuthenticationCode(u32bit mac_len,
u32bit key_min,
diff --git a/src/mac/ssl3mac/info.txt b/src/mac/ssl3mac/info.txt
index f8791169c..c4ef54629 100644
--- a/src/mac/ssl3mac/info.txt
+++ b/src/mac/ssl3mac/info.txt
@@ -1,5 +1,3 @@
-realname "SSLv3 MAC"
-
define SSL3_MAC
load_on auto
diff --git a/src/mac/ssl3mac/ssl3_mac.cpp b/src/mac/ssl3mac/ssl3_mac.cpp
index c29296ced..23a636424 100644
--- a/src/mac/ssl3mac/ssl3_mac.cpp
+++ b/src/mac/ssl3mac/ssl3_mac.cpp
@@ -46,7 +46,7 @@ void SSL3_MAC::key_schedule(const byte key[], u32bit length)
/*
* Clear memory of sensitive data
*/
-void SSL3_MAC::clear() throw()
+void SSL3_MAC::clear()
{
hash->clear();
i_key.clear();
diff --git a/src/mac/ssl3mac/ssl3_mac.h b/src/mac/ssl3mac/ssl3_mac.h
index dcaf7f404..828b072ed 100644
--- a/src/mac/ssl3mac/ssl3_mac.h
+++ b/src/mac/ssl3mac/ssl3_mac.h
@@ -19,7 +19,7 @@ namespace Botan {
class BOTAN_DLL SSL3_MAC : public MessageAuthenticationCode
{
public:
- void clear() throw();
+ void clear();
std::string name() const;
MessageAuthenticationCode* clone() const;
diff --git a/src/mac/x919_mac/info.txt b/src/mac/x919_mac/info.txt
index f2ebd5b35..16955816c 100644
--- a/src/mac/x919_mac/info.txt
+++ b/src/mac/x919_mac/info.txt
@@ -1,5 +1,3 @@
-realname "ANSI X9.19 MAC"
-
define ANSI_X919_MAC
load_on auto
diff --git a/src/mac/x919_mac/x919_mac.cpp b/src/mac/x919_mac/x919_mac.cpp
index ef89cac9c..52260494a 100644
--- a/src/mac/x919_mac/x919_mac.cpp
+++ b/src/mac/x919_mac/x919_mac.cpp
@@ -63,7 +63,7 @@ void ANSI_X919_MAC::key_schedule(const byte key[], u32bit length)
/*
* Clear memory of sensitive data
*/
-void ANSI_X919_MAC::clear() throw()
+void ANSI_X919_MAC::clear()
{
e->clear();
d->clear();
diff --git a/src/mac/x919_mac/x919_mac.h b/src/mac/x919_mac/x919_mac.h
index 1c2a06bee..a4690fdcd 100644
--- a/src/mac/x919_mac/x919_mac.h
+++ b/src/mac/x919_mac/x919_mac.h
@@ -19,7 +19,7 @@ namespace Botan {
class BOTAN_DLL ANSI_X919_MAC : public MessageAuthenticationCode
{
public:
- void clear() throw();
+ void clear();
std::string name() const;
MessageAuthenticationCode* clone() const;
diff --git a/src/math/bigint/info.txt b/src/math/bigint/info.txt
index 513703deb..30018b795 100644
--- a/src/math/bigint/info.txt
+++ b/src/math/bigint/info.txt
@@ -1,5 +1,3 @@
-realname "BigInt"
-
load_on auto
define BIGINT
diff --git a/src/math/bigint/monty_amd64/info.txt b/src/math/bigint/monty_amd64/info.txt
index a897045b2..657cd0353 100644
--- a/src/math/bigint/monty_amd64/info.txt
+++ b/src/math/bigint/monty_amd64/info.txt
@@ -1,5 +1,3 @@
-realname "Montgomery Reduction (x86-64)"
-
mp_bits 64
load_on never
diff --git a/src/math/bigint/monty_generic/info.txt b/src/math/bigint/monty_generic/info.txt
index 6f5f0e722..c709229e6 100644
--- a/src/math/bigint/monty_generic/info.txt
+++ b/src/math/bigint/monty_generic/info.txt
@@ -1,5 +1,3 @@
-realname "Montgomery Reduction"
-
load_on dep
<add>
diff --git a/src/math/bigint/mp_amd64/info.txt b/src/math/bigint/mp_amd64/info.txt
index 84a5bcf53..a7da8806e 100644
--- a/src/math/bigint/mp_amd64/info.txt
+++ b/src/math/bigint/mp_amd64/info.txt
@@ -1,5 +1,3 @@
-realname "MPI Core (x86-64)"
-
mp_bits 64
load_on dep
diff --git a/src/math/bigint/mp_amd64/mp_asmi.h b/src/math/bigint/mp_amd64/mp_asmi.h
index 8bccbaaf4..1a3ac1aaa 100644
--- a/src/math/bigint/mp_amd64/mp_asmi.h
+++ b/src/math/bigint/mp_amd64/mp_asmi.h
@@ -70,20 +70,12 @@ extern "C" {
*/
inline word word_add(word x, word y, word* carry)
{
-#if 0
asm(
ADD_OR_SUBTRACT(ASM("adcq %[y],%[x]"))
: [x]"=r"(x), [carry]"=r"(*carry)
: "0"(x), [y]"rm"(y), "1"(*carry)
: "cc");
return x;
-#else
- word z = x + y;
- word c1 = (z < x);
- z += *carry;
- *carry = c1 | (z < *carry);
- return z;
-#endif
}
/*
diff --git a/src/math/bigint/mp_asm64/info.txt b/src/math/bigint/mp_asm64/info.txt
index 5c112c490..7bdbffb2c 100644
--- a/src/math/bigint/mp_asm64/info.txt
+++ b/src/math/bigint/mp_asm64/info.txt
@@ -1,5 +1,3 @@
-realname "MPI Core (Alpha/IA-64/MIPS64/PowerPC-64/SPARC64)"
-
mp_bits 64
load_on dep
diff --git a/src/math/bigint/mp_generic/info.txt b/src/math/bigint/mp_generic/info.txt
index 8bf75fec3..28f258ebb 100644
--- a/src/math/bigint/mp_generic/info.txt
+++ b/src/math/bigint/mp_generic/info.txt
@@ -1,5 +1,3 @@
-realname "MPI Core (C++)"
-
load_on dep
<add>
diff --git a/src/math/bigint/mp_ia32/info.txt b/src/math/bigint/mp_ia32/info.txt
index 51f98fda8..6e093a7e5 100644
--- a/src/math/bigint/mp_ia32/info.txt
+++ b/src/math/bigint/mp_ia32/info.txt
@@ -1,5 +1,3 @@
-realname "MPI Core (IA-32)"
-
mp_bits 32
load_on asm_ok
diff --git a/src/math/bigint/mp_ia32/mp_asmi.h b/src/math/bigint/mp_ia32/mp_asmi.h
index 28b99abcc..46bf302d5 100644
--- a/src/math/bigint/mp_ia32/mp_asmi.h
+++ b/src/math/bigint/mp_ia32/mp_asmi.h
@@ -70,20 +70,12 @@ extern "C" {
*/
inline word word_add(word x, word y, word* carry)
{
-#if 0
asm(
ADD_OR_SUBTRACT(ASM("adcl %[y],%[x]"))
: [x]"=r"(x), [carry]"=r"(*carry)
: "0"(x), [y]"rm"(y), "1"(*carry)
: "cc");
return x;
-#else
- word z = x + y;
- word c1 = (z < x);
- z += *carry;
- *carry = c1 | (z < *carry);
- return z;
-#endif
}
/*
diff --git a/src/math/bigint/mp_ia32_msvc/info.txt b/src/math/bigint/mp_ia32_msvc/info.txt
index 9c7ac9b43..52839d89b 100644
--- a/src/math/bigint/mp_ia32_msvc/info.txt
+++ b/src/math/bigint/mp_ia32_msvc/info.txt
@@ -1,5 +1,3 @@
-realname "x86 MPI Assembler Core (MSVC)"
-
mp_bits 32
load_on dep
diff --git a/src/math/bigint/mulop_amd64/info.txt b/src/math/bigint/mulop_amd64/info.txt
index 77990df80..704e4dad8 100644
--- a/src/math/bigint/mulop_amd64/info.txt
+++ b/src/math/bigint/mulop_amd64/info.txt
@@ -1,5 +1,3 @@
-realname "BigInt Multiply-Add (x86-64)"
-
mp_bits 64
load_on never
diff --git a/src/math/bigint/mulop_generic/info.txt b/src/math/bigint/mulop_generic/info.txt
index 28ebe41eb..8fa2a40c9 100644
--- a/src/math/bigint/mulop_generic/info.txt
+++ b/src/math/bigint/mulop_generic/info.txt
@@ -1,5 +1,3 @@
-realname "BigInt Multiply-Add"
-
load_on dep
<add>
diff --git a/src/math/bigint/mulop_ia32/info.txt b/src/math/bigint/mulop_ia32/info.txt
index b995dd8d7..dd554773f 100644
--- a/src/math/bigint/mulop_ia32/info.txt
+++ b/src/math/bigint/mulop_ia32/info.txt
@@ -1,5 +1,3 @@
-realname "BigInt Multiply-Add (IA-32)"
-
mp_bits 32
# Out of date, still implements bigint_mul_add_words
diff --git a/src/math/gfpmath/gfp_element.cpp b/src/math/gfpmath/gfp_element.cpp
index 5b1d562c3..55a8a1dd3 100644
--- a/src/math/gfpmath/gfp_element.cpp
+++ b/src/math/gfpmath/gfp_element.cpp
@@ -68,7 +68,9 @@ void inner_montg_mult_sos(word result[], const word* a_bar, const word* b_bar, c
while (C > 0)
{
// we need not worry here about C > 1, because the other operand is zero
- word tmp = word_add(t[i+s+cnt], 0, &C);
+
+ word tmp = t[i+s+cnt] + C;
+ C = (tmp < t[i+s+cnt]);
t[i+s+cnt] = tmp;
cnt++;
}
diff --git a/src/math/gfpmath/info.txt b/src/math/gfpmath/info.txt
index 1a52144b7..abbdb0a47 100644
--- a/src/math/gfpmath/info.txt
+++ b/src/math/gfpmath/info.txt
@@ -1,5 +1,3 @@
-realname "GF(p) Math"
-
uses_tr1 yes
load_on auto
diff --git a/src/math/numbertheory/info.txt b/src/math/numbertheory/info.txt
index 1595c7305..527f4fa29 100644
--- a/src/math/numbertheory/info.txt
+++ b/src/math/numbertheory/info.txt
@@ -1,5 +1,3 @@
-realname "Math Functions"
-
load_on auto
define BIGINT_MATH
diff --git a/src/modes/cbc/info.txt b/src/modes/cbc/info.txt
index de81dcb8c..9b4be1b58 100644
--- a/src/modes/cbc/info.txt
+++ b/src/modes/cbc/info.txt
@@ -1,5 +1,3 @@
-realname "CBC block cipher mode"
-
define CBC
load_on auto
diff --git a/src/modes/cfb/info.txt b/src/modes/cfb/info.txt
index d66df1ee7..b68afc7d0 100644
--- a/src/modes/cfb/info.txt
+++ b/src/modes/cfb/info.txt
@@ -1,5 +1,3 @@
-realname "CFB block cipher mode"
-
define CFB
load_on auto
@@ -12,4 +10,3 @@ cfb.h
<requires>
modes
</requires>
-
diff --git a/src/modes/ctr/ctr.cpp b/src/modes/ctr/ctr.cpp
deleted file mode 100644
index d458d7848..000000000
--- a/src/modes/ctr/ctr.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
-* CTR Mode
-* (C) 1999-2009 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#include <botan/ctr.h>
-#include <botan/xor_buf.h>
-#include <algorithm>
-
-namespace Botan {
-
-namespace {
-
-const u32bit PARALLEL_BLOCKS = BOTAN_PARALLEL_BLOCKS_CTR;
-
-}
-
-/*
-* CTR-BE Constructor
-*/
-CTR_BE::CTR_BE(BlockCipher* ciph) : cipher(ciph)
- {
- position = 0;
-
- counter.create(ciph->BLOCK_SIZE * PARALLEL_BLOCKS);
- enc_buffer.create(ciph->BLOCK_SIZE * PARALLEL_BLOCKS);
- }
-
-/*
-* CTR-BE Constructor
-*/
-CTR_BE::CTR_BE(BlockCipher* ciph, const SymmetricKey& key,
- const InitializationVector& iv) :
- cipher(ciph)
- {
- position = 0;
-
- counter.create(ciph->BLOCK_SIZE * PARALLEL_BLOCKS);
- enc_buffer.create(ciph->BLOCK_SIZE * PARALLEL_BLOCKS);
-
- cipher->set_key(key);
- set_iv(iv);
- }
-
-/*
-* CTR_BE Destructor
-*/
-CTR_BE::~CTR_BE()
- {
- delete cipher;
- }
-
-/*
-* Return the name of this type
-*/
-std::string CTR_BE::name() const
- {
- return ("CTR-BE/" + cipher->name());
- }
-
-/*
-* Set CTR-BE IV
-*/
-void CTR_BE::set_iv(const InitializationVector& iv)
- {
- const u32bit BLOCK_SIZE = cipher->BLOCK_SIZE;
-
- if(iv.length() != BLOCK_SIZE)
- throw Invalid_IV_Length(name(), iv.length());
-
- enc_buffer.clear();
- position = 0;
-
- counter.copy(0, iv.begin(), iv.length());
-
- for(u32bit i = 1; i != PARALLEL_BLOCKS; ++i)
- {
- counter.copy(i*BLOCK_SIZE,
- counter.begin() + (i-1)*BLOCK_SIZE, BLOCK_SIZE);
-
- for(s32bit j = BLOCK_SIZE - 1; j >= 0; --j)
- if(++counter[i*BLOCK_SIZE+j])
- break;
- }
-
- cipher->encrypt_n(counter, enc_buffer, PARALLEL_BLOCKS);
- }
-
-/*
-* CTR-BE Encryption/Decryption
-*/
-void CTR_BE::write(const byte input[], u32bit length)
- {
- u32bit copied = std::min(enc_buffer.size() - position, length);
- xor_buf(enc_buffer + position, input, copied);
- send(enc_buffer + position, copied);
- input += copied;
- length -= copied;
- position += copied;
-
- if(position == enc_buffer.size())
- increment_counter();
-
- while(length >= enc_buffer.size())
- {
- xor_buf(enc_buffer, input, enc_buffer.size());
- send(enc_buffer, enc_buffer.size());
-
- input += enc_buffer.size();
- length -= enc_buffer.size();
- increment_counter();
- }
-
- xor_buf(enc_buffer + position, input, length);
- send(enc_buffer + position, length);
- position += length;
- }
-
-/*
-* Increment the counter and update the buffer
-*/
-void CTR_BE::increment_counter()
- {
- for(u32bit i = 0; i != PARALLEL_BLOCKS; ++i)
- {
- byte* this_ctr = counter + i*cipher->BLOCK_SIZE;
-
- byte last_byte = this_ctr[cipher->BLOCK_SIZE-1];
- last_byte += PARALLEL_BLOCKS;
-
- if(this_ctr[cipher->BLOCK_SIZE-1] > last_byte)
- for(s32bit j = cipher->BLOCK_SIZE - 2; j >= 0; --j)
- if(++this_ctr[j])
- break;
-
- this_ctr[cipher->BLOCK_SIZE-1] = last_byte;
- }
-
- cipher->encrypt_n(counter, enc_buffer, PARALLEL_BLOCKS);
-
- position = 0;
- }
-
-}
diff --git a/src/modes/ctr/ctr.h b/src/modes/ctr/ctr.h
deleted file mode 100644
index 1948ffe48..000000000
--- a/src/modes/ctr/ctr.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-* CTR Mode
-* (C) 1999-2007 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#ifndef BOTAN_COUNTER_MODE_H__
-#define BOTAN_COUNTER_MODE_H__
-
-#include <botan/key_filt.h>
-#include <botan/block_cipher.h>
-
-namespace Botan {
-
-/*
-* CTR-BE Mode
-*/
-class BOTAN_DLL CTR_BE : public Keyed_Filter
- {
- public:
- std::string name() const;
-
- void set_iv(const InitializationVector&);
-
- void set_key(const SymmetricKey& key) { cipher->set_key(key); }
-
- bool valid_keylength(u32bit key_len) const
- { return cipher->valid_keylength(key_len); }
-
- CTR_BE(BlockCipher*);
- CTR_BE(BlockCipher*, const SymmetricKey&, const InitializationVector&);
-
- ~CTR_BE();
- private:
- void write(const byte[], u32bit);
- void increment_counter();
-
- BlockCipher* cipher;
- SecureVector<byte> counter, enc_buffer;
- u32bit position;
- };
-
-}
-
-#endif
diff --git a/src/modes/cts/info.txt b/src/modes/cts/info.txt
index 9eb16add5..773254a30 100644
--- a/src/modes/cts/info.txt
+++ b/src/modes/cts/info.txt
@@ -1,5 +1,3 @@
-realname "CTS block cipher mode"
-
define CTS
load_on auto
diff --git a/src/modes/eax/info.txt b/src/modes/eax/info.txt
index d1fc7e0e3..143944f03 100644
--- a/src/modes/eax/info.txt
+++ b/src/modes/eax/info.txt
@@ -1,5 +1,3 @@
-realname "EAX block cipher mode"
-
define EAX
load_on auto
diff --git a/src/modes/ecb/info.txt b/src/modes/ecb/info.txt
index 06b7b4fd2..f5c831169 100644
--- a/src/modes/ecb/info.txt
+++ b/src/modes/ecb/info.txt
@@ -1,5 +1,3 @@
-realname "ECB block cipher mode"
-
define ECB
load_on auto
diff --git a/src/modes/info.txt b/src/modes/info.txt
index e089e74a9..420233b46 100644
--- a/src/modes/info.txt
+++ b/src/modes/info.txt
@@ -1,5 +1,3 @@
-realname "Cipher Mode Base Class"
-
define CIPHER_MODEBASE
load_on auto
diff --git a/src/modes/mode_pad/info.txt b/src/modes/mode_pad/info.txt
index f22cf7411..9629a7202 100644
--- a/src/modes/mode_pad/info.txt
+++ b/src/modes/mode_pad/info.txt
@@ -1,5 +1,3 @@
-realname "Cipher Mode Padding Method"
-
define CIPHER_MODE_PADDING
load_on auto
diff --git a/src/modes/ofb/ofb.cpp b/src/modes/ofb/ofb.cpp
deleted file mode 100644
index cb40fdeaa..000000000
--- a/src/modes/ofb/ofb.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-* OFB Mode
-* (C) 1999-2007 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#include <botan/ofb.h>
-#include <botan/xor_buf.h>
-#include <algorithm>
-
-namespace Botan {
-
-/*
-* OFB Constructor
-*/
-OFB::OFB(BlockCipher* ciph) :
- BlockCipherMode(ciph, "OFB", ciph->BLOCK_SIZE, 2)
- {
- }
-
-/*
-* OFB Constructor
-*/
-OFB::OFB(BlockCipher* ciph, const SymmetricKey& key,
- const InitializationVector& iv) :
- BlockCipherMode(ciph, "OFB", ciph->BLOCK_SIZE, 2)
- {
- set_key(key);
- set_iv(iv);
- }
-
-/*
-* OFB Encryption/Decryption
-*/
-void OFB::write(const byte input[], u32bit length)
- {
- u32bit copied = std::min(BLOCK_SIZE - position, length);
- xor_buf(buffer, input, state + position, copied);
- send(buffer, copied);
- input += copied;
- length -= copied;
- position += copied;
-
- if(position == BLOCK_SIZE)
- {
- cipher->encrypt(state);
- position = 0;
- }
-
- while(length >= BLOCK_SIZE)
- {
- xor_buf(buffer, input, state, BLOCK_SIZE);
- send(buffer, BLOCK_SIZE);
-
- input += BLOCK_SIZE;
- length -= BLOCK_SIZE;
- cipher->encrypt(state);
- }
-
- xor_buf(buffer, input, state + position, length);
- send(buffer, length);
- position += length;
- }
-
-}
diff --git a/src/modes/ofb/ofb.h b/src/modes/ofb/ofb.h
deleted file mode 100644
index a3aadc137..000000000
--- a/src/modes/ofb/ofb.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-* OFB Mode
-* (C) 1999-2007 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#ifndef BOTAN_OUTPUT_FEEDBACK_MODE_H__
-#define BOTAN_OUTPUT_FEEDBACK_MODE_H__
-
-#include <botan/modebase.h>
-#include <botan/block_cipher.h>
-
-namespace Botan {
-
-/*
-* OFB Mode
-*/
-class BOTAN_DLL OFB : public BlockCipherMode
- {
- public:
- OFB(BlockCipher* cipher);
-
- OFB(BlockCipher* cipher,
- const SymmetricKey& key,
- const InitializationVector& iv);
- private:
- void write(const byte[], u32bit);
- };
-
-}
-
-#endif
diff --git a/src/modes/xts/info.txt b/src/modes/xts/info.txt
index 65c7df2f8..871bb987a 100644
--- a/src/modes/xts/info.txt
+++ b/src/modes/xts/info.txt
@@ -1,5 +1,3 @@
-realname "XTS block cipher mode"
-
define XTS
load_on auto
diff --git a/src/pbe/info.txt b/src/pbe/info.txt
index c4210b2a7..f58ed1da4 100644
--- a/src/pbe/info.txt
+++ b/src/pbe/info.txt
@@ -1,5 +1,3 @@
-realname "PBE Base"
-
load_on dep
define PASSWORD_BASED_ENCRYPTION
diff --git a/src/pbe/pbes1/info.txt b/src/pbe/pbes1/info.txt
index 70c6baeee..5dcbf9510 100644
--- a/src/pbe/pbes1/info.txt
+++ b/src/pbe/pbes1/info.txt
@@ -1,5 +1,3 @@
-realname "PKCS5 v1.5 PBE"
-
define PBE_PKCS_V15
load_on auto
diff --git a/src/pbe/pbes2/info.txt b/src/pbe/pbes2/info.txt
index cd37b1e69..71fb6ea72 100644
--- a/src/pbe/pbes2/info.txt
+++ b/src/pbe/pbes2/info.txt
@@ -1,5 +1,3 @@
-realname "PKCS5 v2.0 PBE"
-
define PBE_PKCS_V20
load_on auto
diff --git a/src/pk_pad/eme1/info.txt b/src/pk_pad/eme1/info.txt
index 2f61265e2..794254e8e 100644
--- a/src/pk_pad/eme1/info.txt
+++ b/src/pk_pad/eme1/info.txt
@@ -1,5 +1,3 @@
-realname "EME1"
-
define EME1
load_on auto
diff --git a/src/pk_pad/eme_pkcs/info.txt b/src/pk_pad/eme_pkcs/info.txt
index 88d9caf17..95c568452 100644
--- a/src/pk_pad/eme_pkcs/info.txt
+++ b/src/pk_pad/eme_pkcs/info.txt
@@ -1,5 +1,3 @@
-realname "PKCSv1 v1.5 EME"
-
define EME_PKCS1v15
load_on auto
diff --git a/src/pk_pad/emsa.h b/src/pk_pad/emsa.h
index e2491e40f..8b19d3cb2 100644
--- a/src/pk_pad/emsa.h
+++ b/src/pk_pad/emsa.h
@@ -27,7 +27,7 @@ class BOTAN_DLL EMSA
RandomNumberGenerator& rng) = 0;
virtual bool verify(const MemoryRegion<byte>&, const MemoryRegion<byte>&,
- u32bit) throw() = 0;
+ u32bit) = 0;
virtual ~EMSA() {}
};
diff --git a/src/pk_pad/emsa1/emsa1.cpp b/src/pk_pad/emsa1/emsa1.cpp
index 26d709c28..0ae7e8d2d 100644
--- a/src/pk_pad/emsa1/emsa1.cpp
+++ b/src/pk_pad/emsa1/emsa1.cpp
@@ -72,7 +72,7 @@ SecureVector<byte> EMSA1::encoding_of(const MemoryRegion<byte>& msg,
* EMSA1 Decode/Verify Operation
*/
bool EMSA1::verify(const MemoryRegion<byte>& coded,
- const MemoryRegion<byte>& raw, u32bit key_bits) throw()
+ const MemoryRegion<byte>& raw, u32bit key_bits)
{
try {
if(raw.size() != hash->OUTPUT_LENGTH)
diff --git a/src/pk_pad/emsa1/emsa1.h b/src/pk_pad/emsa1/emsa1.h
index a5dac07e2..d86020966 100644
--- a/src/pk_pad/emsa1/emsa1.h
+++ b/src/pk_pad/emsa1/emsa1.h
@@ -31,7 +31,7 @@ class BOTAN_DLL EMSA1 : public EMSA
RandomNumberGenerator& rng);
bool verify(const MemoryRegion<byte>&, const MemoryRegion<byte>&,
- u32bit) throw();
+ u32bit);
HashFunction* hash;
};
diff --git a/src/pk_pad/emsa1/info.txt b/src/pk_pad/emsa1/info.txt
index 086270b96..55832307b 100644
--- a/src/pk_pad/emsa1/info.txt
+++ b/src/pk_pad/emsa1/info.txt
@@ -1,5 +1,3 @@
-realname "EMSA1"
-
define EMSA1
load_on auto
diff --git a/src/pk_pad/emsa1_bsi/info.txt b/src/pk_pad/emsa1_bsi/info.txt
index 14a9fd396..5e8fe09ca 100644
--- a/src/pk_pad/emsa1_bsi/info.txt
+++ b/src/pk_pad/emsa1_bsi/info.txt
@@ -1,5 +1,3 @@
-realname "EMSA1 (BSI variant)"
-
define EMSA1_BSI
load_on auto
diff --git a/src/pk_pad/emsa2/emsa2.cpp b/src/pk_pad/emsa2/emsa2.cpp
index 168f9209e..74a045931 100644
--- a/src/pk_pad/emsa2/emsa2.cpp
+++ b/src/pk_pad/emsa2/emsa2.cpp
@@ -79,7 +79,7 @@ SecureVector<byte> EMSA2::encoding_of(const MemoryRegion<byte>& msg,
*/
bool EMSA2::verify(const MemoryRegion<byte>& coded,
const MemoryRegion<byte>& raw,
- u32bit key_bits) throw()
+ u32bit key_bits)
{
try
{
diff --git a/src/pk_pad/emsa2/emsa2.h b/src/pk_pad/emsa2/emsa2.h
index 76888d1f6..7efc80873 100644
--- a/src/pk_pad/emsa2/emsa2.h
+++ b/src/pk_pad/emsa2/emsa2.h
@@ -29,7 +29,7 @@ class BOTAN_DLL EMSA2 : public EMSA
RandomNumberGenerator& rng);
bool verify(const MemoryRegion<byte>&, const MemoryRegion<byte>&,
- u32bit) throw();
+ u32bit);
SecureVector<byte> empty_hash;
HashFunction* hash;
diff --git a/src/pk_pad/emsa2/info.txt b/src/pk_pad/emsa2/info.txt
index 1c8161c5e..a6fff2a02 100644
--- a/src/pk_pad/emsa2/info.txt
+++ b/src/pk_pad/emsa2/info.txt
@@ -1,5 +1,3 @@
-realname "EMSA2"
-
define EMSA2
load_on auto
diff --git a/src/pk_pad/emsa3/emsa3.cpp b/src/pk_pad/emsa3/emsa3.cpp
index 4d50abd84..dc905a464 100644
--- a/src/pk_pad/emsa3/emsa3.cpp
+++ b/src/pk_pad/emsa3/emsa3.cpp
@@ -72,7 +72,7 @@ SecureVector<byte> EMSA3::encoding_of(const MemoryRegion<byte>& msg,
*/
bool EMSA3::verify(const MemoryRegion<byte>& coded,
const MemoryRegion<byte>& raw,
- u32bit key_bits) throw()
+ u32bit key_bits)
{
if(raw.size() != hash->OUTPUT_LENGTH)
return false;
@@ -137,7 +137,7 @@ SecureVector<byte> EMSA3_Raw::encoding_of(const MemoryRegion<byte>& msg,
*/
bool EMSA3_Raw::verify(const MemoryRegion<byte>& coded,
const MemoryRegion<byte>& raw,
- u32bit key_bits) throw()
+ u32bit key_bits)
{
try
{
diff --git a/src/pk_pad/emsa3/emsa3.h b/src/pk_pad/emsa3/emsa3.h
index 301f2142a..c4a3d658b 100644
--- a/src/pk_pad/emsa3/emsa3.h
+++ b/src/pk_pad/emsa3/emsa3.h
@@ -32,7 +32,7 @@ class BOTAN_DLL EMSA3 : public EMSA
RandomNumberGenerator& rng);
bool verify(const MemoryRegion<byte>&, const MemoryRegion<byte>&,
- u32bit) throw();
+ u32bit);
private:
HashFunction* hash;
SecureVector<byte> hash_id;
@@ -54,7 +54,7 @@ class BOTAN_DLL EMSA3_Raw : public EMSA
RandomNumberGenerator& rng);
bool verify(const MemoryRegion<byte>&, const MemoryRegion<byte>&,
- u32bit) throw();
+ u32bit);
private:
SecureVector<byte> message;
diff --git a/src/pk_pad/emsa3/info.txt b/src/pk_pad/emsa3/info.txt
index 90e4b9bfc..babd98711 100644
--- a/src/pk_pad/emsa3/info.txt
+++ b/src/pk_pad/emsa3/info.txt
@@ -1,5 +1,3 @@
-realname "EMSA3"
-
define EMSA3
load_on auto
diff --git a/src/pk_pad/emsa4/emsa4.cpp b/src/pk_pad/emsa4/emsa4.cpp
index cff9a1537..dba248662 100644
--- a/src/pk_pad/emsa4/emsa4.cpp
+++ b/src/pk_pad/emsa4/emsa4.cpp
@@ -68,7 +68,7 @@ SecureVector<byte> EMSA4::encoding_of(const MemoryRegion<byte>& msg,
* EMSA4 Decode/Verify Operation
*/
bool EMSA4::verify(const MemoryRegion<byte>& const_coded,
- const MemoryRegion<byte>& raw, u32bit key_bits) throw()
+ const MemoryRegion<byte>& raw, u32bit key_bits)
{
const u32bit HASH_SIZE = hash->OUTPUT_LENGTH;
const u32bit KEY_BYTES = (key_bits + 7) / 8;
diff --git a/src/pk_pad/emsa4/emsa4.h b/src/pk_pad/emsa4/emsa4.h
index b716178a9..9e37684f5 100644
--- a/src/pk_pad/emsa4/emsa4.h
+++ b/src/pk_pad/emsa4/emsa4.h
@@ -31,7 +31,7 @@ class BOTAN_DLL EMSA4 : public EMSA
SecureVector<byte> encoding_of(const MemoryRegion<byte>&, u32bit,
RandomNumberGenerator& rng);
bool verify(const MemoryRegion<byte>&, const MemoryRegion<byte>&,
- u32bit) throw();
+ u32bit);
u32bit SALT_SIZE;
HashFunction* hash;
diff --git a/src/pk_pad/emsa4/info.txt b/src/pk_pad/emsa4/info.txt
index 29ef4e0cf..ea1db30a1 100644
--- a/src/pk_pad/emsa4/info.txt
+++ b/src/pk_pad/emsa4/info.txt
@@ -1,5 +1,3 @@
-realname "EMSA4"
-
define EMSA4
load_on auto
diff --git a/src/pk_pad/emsa_raw/emsa_raw.cpp b/src/pk_pad/emsa_raw/emsa_raw.cpp
index d5973ee55..5dfe20a50 100644
--- a/src/pk_pad/emsa_raw/emsa_raw.cpp
+++ b/src/pk_pad/emsa_raw/emsa_raw.cpp
@@ -42,7 +42,7 @@ SecureVector<byte> EMSA_Raw::encoding_of(const MemoryRegion<byte>& msg,
*/
bool EMSA_Raw::verify(const MemoryRegion<byte>& coded,
const MemoryRegion<byte>& raw,
- u32bit) throw()
+ u32bit)
{
return (coded == raw);
}
diff --git a/src/pk_pad/emsa_raw/emsa_raw.h b/src/pk_pad/emsa_raw/emsa_raw.h
index 1b0ad516e..5f2eaa2fe 100644
--- a/src/pk_pad/emsa_raw/emsa_raw.h
+++ b/src/pk_pad/emsa_raw/emsa_raw.h
@@ -24,7 +24,7 @@ class BOTAN_DLL EMSA_Raw : public EMSA
SecureVector<byte> encoding_of(const MemoryRegion<byte>&, u32bit,
RandomNumberGenerator&);
bool verify(const MemoryRegion<byte>&, const MemoryRegion<byte>&,
- u32bit) throw();
+ u32bit);
SecureVector<byte> message;
};
diff --git a/src/pk_pad/emsa_raw/info.txt b/src/pk_pad/emsa_raw/info.txt
index 2a88d10fa..4bd850e11 100644
--- a/src/pk_pad/emsa_raw/info.txt
+++ b/src/pk_pad/emsa_raw/info.txt
@@ -1,5 +1,3 @@
-realname "EMSA-Raw"
-
define EMSA_RAW
load_on auto
diff --git a/src/pk_pad/hash_id/info.txt b/src/pk_pad/hash_id/info.txt
index 935432588..af9f5cd4f 100644
--- a/src/pk_pad/hash_id/info.txt
+++ b/src/pk_pad/hash_id/info.txt
@@ -1,5 +1,3 @@
-realname "Hash Function Identifiers"
-
define HASH_ID
load_on auto
diff --git a/src/pk_pad/info.txt b/src/pk_pad/info.txt
index c281b1563..14b05f458 100644
--- a/src/pk_pad/info.txt
+++ b/src/pk_pad/info.txt
@@ -1,5 +1,3 @@
-realname "Public Key EME/EMSA Padding Modes"
-
define PK_PADDING
load_on auto
diff --git a/src/pubkey/dh/info.txt b/src/pubkey/dh/info.txt
index 33af9a8e5..8295a74f4 100644
--- a/src/pubkey/dh/info.txt
+++ b/src/pubkey/dh/info.txt
@@ -1,5 +1,3 @@
-realname "Diffie-Hellman Key Agreement"
-
define DIFFIE_HELLMAN
load_on auto
diff --git a/src/pubkey/dl_algo/info.txt b/src/pubkey/dl_algo/info.txt
index 15a77516b..0ac91c887 100644
--- a/src/pubkey/dl_algo/info.txt
+++ b/src/pubkey/dl_algo/info.txt
@@ -1,5 +1,3 @@
-realname "Discrete Logarithm PK Algorithms"
-
define DL_PUBLIC_KEY_FAMILY
load_on auto
diff --git a/src/pubkey/dl_group/info.txt b/src/pubkey/dl_group/info.txt
index 6b9884a4d..2e5273ac4 100644
--- a/src/pubkey/dl_group/info.txt
+++ b/src/pubkey/dl_group/info.txt
@@ -1,5 +1,3 @@
-realname "DL Group"
-
load_on auto
define DL_GROUP
diff --git a/src/pubkey/dlies/info.txt b/src/pubkey/dlies/info.txt
index 5138aafc5..d3e950427 100644
--- a/src/pubkey/dlies/info.txt
+++ b/src/pubkey/dlies/info.txt
@@ -1,5 +1,3 @@
-realname "DLIES"
-
define DLIES
load_on auto
diff --git a/src/pubkey/dsa/info.txt b/src/pubkey/dsa/info.txt
index c70e02d90..776a5da28 100644
--- a/src/pubkey/dsa/info.txt
+++ b/src/pubkey/dsa/info.txt
@@ -1,5 +1,3 @@
-realname "DSA"
-
define DSA
load_on auto
diff --git a/src/pubkey/ec_dompar/info.txt b/src/pubkey/ec_dompar/info.txt
index 212783725..f32e4fc2f 100644
--- a/src/pubkey/ec_dompar/info.txt
+++ b/src/pubkey/ec_dompar/info.txt
@@ -1,5 +1,3 @@
-realname "ECC Domain Parameters"
-
define ECC_DOMAIN_PARAMATERS
load_on auto
diff --git a/src/pubkey/ecc_key/info.txt b/src/pubkey/ecc_key/info.txt
index 2a3c9a3b2..f45533129 100644
--- a/src/pubkey/ecc_key/info.txt
+++ b/src/pubkey/ecc_key/info.txt
@@ -1,5 +1,3 @@
-realname "ECC Public Key"
-
define ECC_PUBLIC_KEY_CRYPTO
load_on auto
diff --git a/src/pubkey/ecdsa/info.txt b/src/pubkey/ecdsa/info.txt
index 743440f8f..3da73dd34 100644
--- a/src/pubkey/ecdsa/info.txt
+++ b/src/pubkey/ecdsa/info.txt
@@ -1,5 +1,3 @@
-realname "ECDSA"
-
define ECDSA
load_on auto
diff --git a/src/pubkey/eckaeg/info.txt b/src/pubkey/eckaeg/info.txt
index 6b78f7de5..3a9768df1 100644
--- a/src/pubkey/eckaeg/info.txt
+++ b/src/pubkey/eckaeg/info.txt
@@ -1,5 +1,3 @@
-realname "ECKAEG"
-
define ECKAEG
load_on auto
diff --git a/src/pubkey/elgamal/info.txt b/src/pubkey/elgamal/info.txt
index d7ae614ea..8c55eb909 100644
--- a/src/pubkey/elgamal/info.txt
+++ b/src/pubkey/elgamal/info.txt
@@ -1,5 +1,3 @@
-realname "ElGamal"
-
define ELGAMAL
load_on auto
diff --git a/src/pubkey/if_algo/info.txt b/src/pubkey/if_algo/info.txt
index d2142f42f..ec948aec3 100644
--- a/src/pubkey/if_algo/info.txt
+++ b/src/pubkey/if_algo/info.txt
@@ -1,5 +1,3 @@
-realname "Integer Factorization Algorithms"
-
define IF_PUBLIC_KEY_FAMILY
load_on dep
diff --git a/src/pubkey/info.txt b/src/pubkey/info.txt
index 63af86c47..13cac9ca0 100644
--- a/src/pubkey/info.txt
+++ b/src/pubkey/info.txt
@@ -1,5 +1,3 @@
-realname "Public Key Base"
-
define PUBLIC_KEY_CRYPTO
load_on auto
diff --git a/src/pubkey/keypair/info.txt b/src/pubkey/keypair/info.txt
index 9e758643f..360d317c5 100644
--- a/src/pubkey/keypair/info.txt
+++ b/src/pubkey/keypair/info.txt
@@ -1,5 +1,3 @@
-realname "Keypair Testing"
-
define KEYPAIR_TESTING
load_on auto
diff --git a/src/pubkey/nr/info.txt b/src/pubkey/nr/info.txt
index c89820aeb..dcf22033e 100644
--- a/src/pubkey/nr/info.txt
+++ b/src/pubkey/nr/info.txt
@@ -1,5 +1,3 @@
-realname "Nyberg-Rueppel"
-
define NYBERG_RUEPPEL
load_on auto
diff --git a/src/pubkey/pk_codecs/info.txt b/src/pubkey/pk_codecs/info.txt
index 96511a663..55c71b0c9 100644
--- a/src/pubkey/pk_codecs/info.txt
+++ b/src/pubkey/pk_codecs/info.txt
@@ -1,5 +1,3 @@
-realname "PK codecs (PKCS8, X.509)"
-
load_on auto
<add>
diff --git a/src/pubkey/rsa/info.txt b/src/pubkey/rsa/info.txt
index 7729fd83d..c8bde68d0 100644
--- a/src/pubkey/rsa/info.txt
+++ b/src/pubkey/rsa/info.txt
@@ -1,5 +1,3 @@
-realname "RSA"
-
define RSA
load_on auto
diff --git a/src/pubkey/rw/info.txt b/src/pubkey/rw/info.txt
index ada6c37d6..39857bccc 100644
--- a/src/pubkey/rw/info.txt
+++ b/src/pubkey/rw/info.txt
@@ -1,5 +1,3 @@
-realname "Rabin-Williams"
-
define RW
load_on auto
diff --git a/src/rng/auto_rng/auto_rng.h b/src/rng/auto_rng/auto_rng.h
index f18f8e5cd..a15b11b13 100644
--- a/src/rng/auto_rng/auto_rng.h
+++ b/src/rng/auto_rng/auto_rng.h
@@ -23,7 +23,7 @@ class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator
{ rng->randomize(out, len); }
bool is_seeded() const
{ return rng->is_seeded(); }
- void clear() throw() { rng->clear(); }
+ void clear() { rng->clear(); }
std::string name() const
{ return "AutoSeeded(" + rng->name() + ")"; }
diff --git a/src/rng/auto_rng/info.txt b/src/rng/auto_rng/info.txt
index 3c83bfb5e..357dc17ad 100644
--- a/src/rng/auto_rng/info.txt
+++ b/src/rng/auto_rng/info.txt
@@ -1,5 +1,3 @@
-realname "Auto-seeded Random Number Generator"
-
define AUTO_SEEDING_RNG
load_on auto
diff --git a/src/rng/hmac_rng/hmac_rng.cpp b/src/rng/hmac_rng/hmac_rng.cpp
index 8444b1083..9d5ee97e4 100644
--- a/src/rng/hmac_rng/hmac_rng.cpp
+++ b/src/rng/hmac_rng/hmac_rng.cpp
@@ -147,7 +147,7 @@ void HMAC_RNG::add_entropy_source(EntropySource* src)
/*
* Clear memory of sensitive data
*/
-void HMAC_RNG::clear() throw()
+void HMAC_RNG::clear()
{
extractor->clear();
prf->clear();
diff --git a/src/rng/hmac_rng/hmac_rng.h b/src/rng/hmac_rng/hmac_rng.h
index 318e2a931..97b0baf15 100644
--- a/src/rng/hmac_rng/hmac_rng.h
+++ b/src/rng/hmac_rng/hmac_rng.h
@@ -29,7 +29,7 @@ class BOTAN_DLL HMAC_RNG : public RandomNumberGenerator
public:
void randomize(byte buf[], u32bit len);
bool is_seeded() const { return seeded; }
- void clear() throw();
+ void clear();
std::string name() const;
void reseed(u32bit poll_bits);
diff --git a/src/rng/hmac_rng/info.txt b/src/rng/hmac_rng/info.txt
index 2c7f13e0a..f6135ee5a 100644
--- a/src/rng/hmac_rng/info.txt
+++ b/src/rng/hmac_rng/info.txt
@@ -1,5 +1,3 @@
-realname "HMAC RNG"
-
define HMAC_RNG
load_on auto
diff --git a/src/rng/info.txt b/src/rng/info.txt
index 44a41665d..eea122cf9 100644
--- a/src/rng/info.txt
+++ b/src/rng/info.txt
@@ -1,5 +1,3 @@
-realname "Random Number Generators"
-
load_on auto
<add>
diff --git a/src/rng/randpool/info.txt b/src/rng/randpool/info.txt
index cc7f61552..cab276e15 100644
--- a/src/rng/randpool/info.txt
+++ b/src/rng/randpool/info.txt
@@ -1,5 +1,3 @@
-realname "Randpool RNG"
-
define RANDPOOL
load_on auto
diff --git a/src/rng/randpool/randpool.cpp b/src/rng/randpool/randpool.cpp
index b018a0d17..af1706466 100644
--- a/src/rng/randpool/randpool.cpp
+++ b/src/rng/randpool/randpool.cpp
@@ -151,7 +151,7 @@ void Randpool::add_entropy_source(EntropySource* src)
/**
* Clear memory of sensitive data
*/
-void Randpool::clear() throw()
+void Randpool::clear()
{
cipher->clear();
mac->clear();
diff --git a/src/rng/randpool/randpool.h b/src/rng/randpool/randpool.h
index b6a3adda4..ab6ed6748 100644
--- a/src/rng/randpool/randpool.h
+++ b/src/rng/randpool/randpool.h
@@ -23,7 +23,7 @@ class BOTAN_DLL Randpool : public RandomNumberGenerator
public:
void randomize(byte[], u32bit);
bool is_seeded() const { return seeded; }
- void clear() throw();
+ void clear();
std::string name() const;
void reseed(u32bit bits_to_collect);
diff --git a/src/rng/rng.h b/src/rng/rng.h
index 41904dbef..c53d8e22d 100644
--- a/src/rng/rng.h
+++ b/src/rng/rng.h
@@ -47,7 +47,7 @@ class BOTAN_DLL RandomNumberGenerator
/**
* Clear all internally held values of this RNG.
*/
- virtual void clear() throw() = 0;
+ virtual void clear() = 0;
/**
* Return the name of this object
@@ -89,7 +89,7 @@ class BOTAN_DLL Null_RNG : public RandomNumberGenerator
{
public:
void randomize(byte[], u32bit) { throw PRNG_Unseeded("Null_RNG"); }
- void clear() throw() {}
+ void clear() {}
std::string name() const { return "Null_RNG"; }
void reseed(u32bit) {}
diff --git a/src/rng/x931_rng/info.txt b/src/rng/x931_rng/info.txt
index 633eb0268..35836b33b 100644
--- a/src/rng/x931_rng/info.txt
+++ b/src/rng/x931_rng/info.txt
@@ -1,5 +1,3 @@
-realname "ANSI X9.31 PRNG"
-
define X931_RNG
load_on auto
diff --git a/src/rng/x931_rng/x931_rng.cpp b/src/rng/x931_rng/x931_rng.cpp
index e239bce84..64d57ac1c 100644
--- a/src/rng/x931_rng/x931_rng.cpp
+++ b/src/rng/x931_rng/x931_rng.cpp
@@ -108,7 +108,7 @@ bool ANSI_X931_RNG::is_seeded() const
/**
* Clear memory of sensitive data
*/
-void ANSI_X931_RNG::clear() throw()
+void ANSI_X931_RNG::clear()
{
cipher->clear();
prng->clear();
diff --git a/src/rng/x931_rng/x931_rng.h b/src/rng/x931_rng/x931_rng.h
index 44e9b4428..d5ba2e9eb 100644
--- a/src/rng/x931_rng/x931_rng.h
+++ b/src/rng/x931_rng/x931_rng.h
@@ -21,7 +21,7 @@ class BOTAN_DLL ANSI_X931_RNG : public RandomNumberGenerator
public:
void randomize(byte[], u32bit);
bool is_seeded() const;
- void clear() throw();
+ void clear();
std::string name() const;
void reseed(u32bit poll_bits);
diff --git a/src/s2k/info.txt b/src/s2k/info.txt
index e603fd937..17f2a8c42 100644
--- a/src/s2k/info.txt
+++ b/src/s2k/info.txt
@@ -1,5 +1,3 @@
-realname "String to Key Functions"
-
load_on auto
<add>
diff --git a/src/s2k/pbkdf1/info.txt b/src/s2k/pbkdf1/info.txt
index 4c5b27546..387043f1b 100644
--- a/src/s2k/pbkdf1/info.txt
+++ b/src/s2k/pbkdf1/info.txt
@@ -1,5 +1,3 @@
-realname "Pbkdf1"
-
define PBKDF1
load_on auto
diff --git a/src/s2k/pbkdf2/info.txt b/src/s2k/pbkdf2/info.txt
index 921aeb1ab..56359d13d 100644
--- a/src/s2k/pbkdf2/info.txt
+++ b/src/s2k/pbkdf2/info.txt
@@ -1,5 +1,3 @@
-realname "Pbkdf2"
-
define PBKDF2
load_on auto
diff --git a/src/s2k/pgps2k/info.txt b/src/s2k/pgps2k/info.txt
index 14b75a02b..a1f5b3dfd 100644
--- a/src/s2k/pgps2k/info.txt
+++ b/src/s2k/pgps2k/info.txt
@@ -1,5 +1,3 @@
-realname "Pgps2k"
-
define PGPS2K
load_on auto
diff --git a/src/selftest/info.txt b/src/selftest/info.txt
index c4b61bb99..079fd5030 100644
--- a/src/selftest/info.txt
+++ b/src/selftest/info.txt
@@ -1,5 +1,3 @@
-realname "Selftests"
-
define SELFTESTS
load_on auto
diff --git a/src/stream/arc4/arc4.cpp b/src/stream/arc4/arc4.cpp
index 0f78f7362..293a0a336 100644
--- a/src/stream/arc4/arc4.cpp
+++ b/src/stream/arc4/arc4.cpp
@@ -87,7 +87,7 @@ std::string ARC4::name() const
/*
* Clear memory of sensitive data
*/
-void ARC4::clear() throw()
+void ARC4::clear()
{
state.clear();
buffer.clear();
diff --git a/src/stream/arc4/arc4.h b/src/stream/arc4/arc4.h
index aa2cea7fe..ae37cb165 100644
--- a/src/stream/arc4/arc4.h
+++ b/src/stream/arc4/arc4.h
@@ -19,13 +19,16 @@ namespace Botan {
class BOTAN_DLL ARC4 : public StreamCipher
{
public:
- void clear() throw();
+ void cipher(const byte in[], byte out[], u32bit length);
+
+ void clear();
std::string name() const;
+
StreamCipher* clone() const { return new ARC4(SKIP); }
+
ARC4(u32bit = 0);
~ARC4() { clear(); }
private:
- void cipher(const byte[], byte[], u32bit);
void key_schedule(const byte[], u32bit);
void generate();
diff --git a/src/stream/arc4/info.txt b/src/stream/arc4/info.txt
index e4689cf69..bb373dbc5 100644
--- a/src/stream/arc4/info.txt
+++ b/src/stream/arc4/info.txt
@@ -1,5 +1,3 @@
-realname "ARC4"
-
define ARC4
load_on auto
diff --git a/src/stream/ctr/ctr.cpp b/src/stream/ctr/ctr.cpp
new file mode 100644
index 000000000..5f0880fa5
--- /dev/null
+++ b/src/stream/ctr/ctr.cpp
@@ -0,0 +1,141 @@
+/*
+* CTR-BE Mode Cipher
+* (C) 1999-2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/ctr.h>
+#include <botan/xor_buf.h>
+
+namespace Botan {
+
+/*
+* CTR-BE Constructor
+*/
+
+CTR_BE::CTR_BE(BlockCipher* ciph) :
+ StreamCipher(ciph->MINIMUM_KEYLENGTH,
+ ciph->MAXIMUM_KEYLENGTH,
+ ciph->KEYLENGTH_MULTIPLE),
+ permutation(ciph)
+ {
+ position = 0;
+
+ counter.create(permutation->BLOCK_SIZE * BOTAN_PARALLEL_BLOCKS_CTR);
+ buffer.create(permutation->BLOCK_SIZE * BOTAN_PARALLEL_BLOCKS_CTR);
+ }
+
+/*
+* CTR_BE Destructor
+*/
+CTR_BE::~CTR_BE()
+ {
+ delete permutation;
+ }
+
+/*
+* Zeroize
+*/
+void CTR_BE::clear()
+ {
+ permutation->clear();
+ buffer.clear();
+ counter.clear();
+ position = 0;
+ }
+
+/*
+* Set the key
+*/
+void CTR_BE::key_schedule(const byte key[], u32bit key_len)
+ {
+ permutation->set_key(key, key_len);
+
+ // Set a default all-zeros IV
+ set_iv(0, 0);
+ }
+
+/*
+* Return the name of this type
+*/
+std::string CTR_BE::name() const
+ {
+ return ("CTR-BE(" + permutation->name() + ")");
+ }
+
+/*
+* CTR-BE Encryption/Decryption
+*/
+void CTR_BE::cipher(const byte in[], byte out[], u32bit length)
+ {
+ while(length >= buffer.size() - position)
+ {
+ xor_buf(out, in, buffer.begin() + position, buffer.size() - position);
+ length -= (buffer.size() - position);
+ in += (buffer.size() - position);
+ out += (buffer.size() - position);
+ increment_counter();
+ }
+ xor_buf(out, in, buffer.begin() + position, length);
+ position += length;
+ }
+
+/*
+* Set CTR-BE IV
+*/
+void CTR_BE::set_iv(const byte iv[], u32bit iv_len)
+ {
+ if(!valid_iv_length(iv_len))
+ throw Invalid_IV_Length(name(), iv_len);
+
+ const u32bit BLOCK_SIZE = permutation->BLOCK_SIZE;
+
+ counter.clear();
+
+ counter.copy(0, iv, iv_len);
+
+ const u32bit PARALLEL_BLOCKS = counter.size() / BLOCK_SIZE;
+
+ for(u32bit i = 1; i != PARALLEL_BLOCKS; ++i)
+ {
+ counter.copy(i*BLOCK_SIZE,
+ counter.begin() + (i-1)*BLOCK_SIZE, BLOCK_SIZE);
+
+ for(s32bit j = BLOCK_SIZE - 1; j >= 0; --j)
+ if(++counter[i*BLOCK_SIZE+j])
+ break;
+ }
+
+ permutation->encrypt_n(counter, buffer, PARALLEL_BLOCKS);
+ position = 0;
+ }
+
+/*
+* Increment the counter and update the buffer
+*/
+void CTR_BE::increment_counter()
+ {
+ const u32bit PARALLEL_BLOCKS = counter.size() / permutation->BLOCK_SIZE;
+
+ for(u32bit i = 0; i != PARALLEL_BLOCKS; ++i)
+ {
+ byte* this_ctr = counter + i*permutation->BLOCK_SIZE;
+
+ byte last_byte = this_ctr[permutation->BLOCK_SIZE-1];
+ last_byte += PARALLEL_BLOCKS;
+
+ if(this_ctr[permutation->BLOCK_SIZE-1] > last_byte)
+ for(s32bit j = permutation->BLOCK_SIZE - 2; j >= 0; --j)
+ if(++this_ctr[j])
+ break;
+
+ this_ctr[permutation->BLOCK_SIZE-1] = last_byte;
+ }
+
+ permutation->encrypt_n(counter, buffer, PARALLEL_BLOCKS);
+
+ position = 0;
+ }
+
+}
diff --git a/src/stream/ctr/ctr.h b/src/stream/ctr/ctr.h
new file mode 100644
index 000000000..5f94170cc
--- /dev/null
+++ b/src/stream/ctr/ctr.h
@@ -0,0 +1,49 @@
+/*
+* CTR-BE Mode
+* (C) 1999-2007 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_CTR_BE_H__
+#define BOTAN_CTR_BE_H__
+
+#include <botan/block_cipher.h>
+#include <botan/stream_cipher.h>
+
+namespace Botan {
+
+/*
+* CTR-BE (Counter, big-endian)
+*/
+class BOTAN_DLL CTR_BE : public StreamCipher
+ {
+ public:
+ void cipher(const byte in[], byte out[], u32bit length);
+
+ void set_iv(const byte iv[], u32bit iv_len);
+
+ bool valid_iv_length(u32bit iv_len) const
+ { return (iv_len <= permutation->BLOCK_SIZE); }
+
+ std::string name() const;
+
+ CTR_BE* clone() const
+ { return new CTR_BE(permutation->clone()); }
+
+ void clear();
+
+ CTR_BE(BlockCipher*);
+ ~CTR_BE();
+ private:
+ void key_schedule(const byte key[], u32bit key_len);
+ void increment_counter();
+
+ BlockCipher* permutation;
+ SecureVector<byte> counter, buffer;
+ u32bit position;
+ };
+
+}
+
+#endif
diff --git a/src/modes/ctr/info.txt b/src/stream/ctr/info.txt
index cb291a2c1..ac4f3f710 100644
--- a/src/modes/ctr/info.txt
+++ b/src/stream/ctr/info.txt
@@ -1,6 +1,4 @@
-realname "CTR block cipher mode"
-
-define CTR
+define CTR_BE
load_on auto
@@ -10,6 +8,6 @@ ctr.h
</add>
<requires>
-modes
+block
+stream
</requires>
-
diff --git a/src/stream/info.txt b/src/stream/info.txt
index 295c73708..213c42137 100644
--- a/src/stream/info.txt
+++ b/src/stream/info.txt
@@ -1,12 +1,9 @@
-realname "Stream Ciphers"
-
load_on auto
define STREAM_CIPHER
<add>
stream_cipher.h
-stream_cipher.cpp
</add>
<requires>
diff --git a/src/modes/ofb/info.txt b/src/stream/ofb/info.txt
index 3cba4151e..a01e9e1a6 100644
--- a/src/modes/ofb/info.txt
+++ b/src/stream/ofb/info.txt
@@ -1,5 +1,3 @@
-realname "OFB block cipher mode"
-
define OFB
load_on auto
@@ -11,4 +9,5 @@ ofb.h
<requires>
block
+stream
</requires>
diff --git a/src/stream/ofb/ofb.cpp b/src/stream/ofb/ofb.cpp
new file mode 100644
index 000000000..0d12d23bd
--- /dev/null
+++ b/src/stream/ofb/ofb.cpp
@@ -0,0 +1,97 @@
+/*
+* OFB Mode
+* (C) 1999-2007 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/ofb.h>
+#include <botan/xor_buf.h>
+#include <algorithm>
+
+namespace Botan {
+
+/*
+* OFB Constructor
+*/
+OFB::OFB(BlockCipher* ciph) :
+ StreamCipher(ciph->MINIMUM_KEYLENGTH,
+ ciph->MAXIMUM_KEYLENGTH,
+ ciph->KEYLENGTH_MULTIPLE),
+ permutation(ciph)
+ {
+ position = 0;
+ buffer.create(permutation->BLOCK_SIZE);
+ }
+
+/*
+* OFB Destructor
+*/
+OFB::~OFB()
+ {
+ delete permutation;
+ }
+
+/*
+* Zeroize
+*/
+void OFB::clear()
+ {
+ permutation->clear();
+ buffer.clear();
+ position = 0;
+ }
+
+/*
+* Set the key
+*/
+void OFB::key_schedule(const byte key[], u32bit key_len)
+ {
+ permutation->set_key(key, key_len);
+
+ // Set a default all-zeros IV
+ set_iv(0, 0);
+ }
+
+/*
+* Return the name of this type
+*/
+std::string OFB::name() const
+ {
+ return ("OFB(" + permutation->name() + ")");
+ }
+
+/*
+* CTR-BE Encryption/Decryption
+*/
+void OFB::cipher(const byte in[], byte out[], u32bit length)
+ {
+ while(length >= buffer.size() - position)
+ {
+ xor_buf(out, in, buffer.begin() + position, buffer.size() - position);
+ length -= (buffer.size() - position);
+ in += (buffer.size() - position);
+ out += (buffer.size() - position);
+ permutation->encrypt(buffer);
+ position = 0;
+ }
+ xor_buf(out, in, buffer.begin() + position, length);
+ position += length;
+ }
+
+/*
+* Set CTR-BE IV
+*/
+void OFB::set_iv(const byte iv[], u32bit iv_len)
+ {
+ if(!valid_iv_length(iv_len))
+ throw Invalid_IV_Length(name(), iv_len);
+
+ buffer.clear();
+ buffer.copy(0, iv, iv_len);
+
+ permutation->encrypt(buffer);
+ position = 0;
+ }
+
+}
diff --git a/src/stream/ofb/ofb.h b/src/stream/ofb/ofb.h
new file mode 100644
index 000000000..1985ae5a9
--- /dev/null
+++ b/src/stream/ofb/ofb.h
@@ -0,0 +1,48 @@
+/*
+* OFB Mode
+* (C) 1999-2007 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_OUTPUT_FEEDBACK_MODE_H__
+#define BOTAN_OUTPUT_FEEDBACK_MODE_H__
+
+#include <botan/stream_cipher.h>
+#include <botan/block_cipher.h>
+
+namespace Botan {
+
+/*
+* OFB Mode
+*/
+class BOTAN_DLL OFB : public StreamCipher
+ {
+ public:
+ void cipher(const byte in[], byte out[], u32bit length);
+
+ void set_iv(const byte iv[], u32bit iv_len);
+
+ bool valid_iv_length(u32bit iv_len) const
+ { return (iv_len <= permutation->BLOCK_SIZE); }
+
+ std::string name() const;
+
+ OFB* clone() const
+ { return new OFB(permutation->clone()); }
+
+ void clear();
+
+ OFB(BlockCipher*);
+ ~OFB();
+ private:
+ void key_schedule(const byte key[], u32bit key_len);
+
+ BlockCipher* permutation;
+ SecureVector<byte> buffer;
+ u32bit position;
+ };
+
+}
+
+#endif
diff --git a/src/stream/salsa20/info.txt b/src/stream/salsa20/info.txt
index db938307b..8171708b0 100644
--- a/src/stream/salsa20/info.txt
+++ b/src/stream/salsa20/info.txt
@@ -1,5 +1,3 @@
-realname "Salsa20"
-
define SALSA20
load_on auto
diff --git a/src/stream/salsa20/salsa20.cpp b/src/stream/salsa20/salsa20.cpp
index 9c7c811f0..3aae64eae 100644
--- a/src/stream/salsa20/salsa20.cpp
+++ b/src/stream/salsa20/salsa20.cpp
@@ -162,15 +162,15 @@ void Salsa20::key_schedule(const byte key[], u32bit length)
}
const byte ZERO[8] = { 0 };
- resync(ZERO, sizeof(ZERO));
+ set_iv(ZERO, sizeof(ZERO));
}
/*
* Return the name of this type
*/
-void Salsa20::resync(const byte iv[], u32bit length)
+void Salsa20::set_iv(const byte iv[], u32bit length)
{
- if(length != IV_LENGTH)
+ if(!valid_iv_length(length))
throw Invalid_IV_Length(name(), length);
state[6] = load_le<u32bit>(iv, 0);
@@ -197,7 +197,7 @@ std::string Salsa20::name() const
/*
* Clear memory of sensitive data
*/
-void Salsa20::clear() throw()
+void Salsa20::clear()
{
state.clear();
buffer.clear();
@@ -207,7 +207,7 @@ void Salsa20::clear() throw()
/*
* Salsa20 Constructor
*/
-Salsa20::Salsa20() : StreamCipher(16, 32, 16, 8)
+Salsa20::Salsa20() : StreamCipher(16, 32, 16)
{
clear();
}
diff --git a/src/stream/salsa20/salsa20.h b/src/stream/salsa20/salsa20.h
index 3dbfddb50..3ca781ea2 100644
--- a/src/stream/salsa20/salsa20.h
+++ b/src/stream/salsa20/salsa20.h
@@ -18,17 +18,21 @@ namespace Botan {
class BOTAN_DLL Salsa20 : public StreamCipher
{
public:
- void clear() throw();
+ void cipher(const byte in[], byte out[], u32bit length);
+
+ void set_iv(const byte iv[], u32bit iv_len);
+
+ bool valid_iv_length(u32bit iv_len) const
+ { return (iv_len == 8); }
+
+ void clear();
std::string name() const;
StreamCipher* clone() const { return new Salsa20; }
- void resync(const byte[], u32bit);
-
Salsa20();
~Salsa20() { clear(); }
private:
- void cipher(const byte[], byte[], u32bit);
- void key_schedule(const byte[], u32bit);
+ void key_schedule(const byte key[], u32bit key_len);
SecureBuffer<u32bit, 16> state;
diff --git a/src/stream/stream_cipher.cpp b/src/stream/stream_cipher.cpp
deleted file mode 100644
index 68bb5d4f0..000000000
--- a/src/stream/stream_cipher.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
-* Stream Cipher Default Implementation for IV and Seek
-* (C) 1999-2007 Jack Lloyd
-*
-* Distributed under the terms of the Botan license
-*/
-
-#include <botan/stream_cipher.h>
-
-namespace Botan {
-
-/*
-* Default StreamCipher Resync Operation
-*/
-void StreamCipher::resync(const byte[], u32bit length)
- {
- if(length)
- throw Exception("The stream cipher " + name() +
- " does not support resyncronization");
- }
-
-/*
-* Default StreamCipher Seek Operation
-*/
-void StreamCipher::seek(u32bit)
- {
- throw Exception("The stream cipher " + name() + " does not support seek()");
- }
-
-}
diff --git a/src/stream/stream_cipher.h b/src/stream/stream_cipher.h
index 8ea359131..29c16c8b5 100644
--- a/src/stream/stream_cipher.h
+++ b/src/stream/stream_cipher.h
@@ -18,53 +18,40 @@ namespace Botan {
class BOTAN_DLL StreamCipher : public SymmetricAlgorithm
{
public:
- const u32bit IV_LENGTH;
-
- /**
- * Encrypt a message.
- * @param i the plaintext
- * @param o the byte array to hold the output, i.e. the ciphertext
- * @param len the length of both i and o
- */
- void encrypt(const byte i[], byte o[], u32bit len) { cipher(i, o, len); }
-
/**
- * Decrypt a message.
- * @param i the ciphertext to decrypt
- * @param o the byte array to hold the output, i.e. the plaintext
- * @param len the length of both i and o
+ * Encrypt or decrypt a message
+ * @param in the plaintext
+ * @param out the byte array to hold the output, i.e. the ciphertext
+ * @param len the length of both in and out in bytes
*/
- void decrypt(const byte i[], byte o[], u32bit len) { cipher(i, o, len); }
+ virtual void cipher(const byte in[], byte out[], u32bit len) = 0;
/**
- * Encrypt a message.
- * @param in the plaintext as input, after the function has
- * returned it will hold the ciphertext
-
- * @param len the length of in
+ * Encrypt or decrypt a message
+ * @param buf the plaintext / ciphertext
+ * @param len the length of buf in bytes
*/
- void encrypt(byte in[], u32bit len) { cipher(in, in, len); }
-
- /**
- * Decrypt a message.
- * @param in the ciphertext as input, after the function has
- * returned it will hold the plaintext
- * @param len the length of in
- */
- void decrypt(byte in[], u32bit len) { cipher(in, in, len); }
+ void cipher1(byte buf[], u32bit len)
+ { cipher(buf, buf, len); }
/**
* Resync the cipher using the IV
* @param iv the initialization vector
* @param iv_len the length of the IV in bytes
*/
- virtual void resync(const byte iv[], u32bit iv_len);
+ virtual void set_iv(const byte[], u32bit iv_len)
+ {
+ if(iv_len)
+ throw Exception("The stream cipher " + name() +
+ " does not support resyncronization");
+ }
/**
- * Seek ahead in the stream.
- * @param len the length to seek ahead.
+ * @param iv_len the length of the IV in bytes
+ * @return if the length is valid for this algorithm
*/
- virtual void seek(u32bit len);
+ virtual bool valid_iv_length(u32bit iv_len) const
+ { return (iv_len == 0); }
/**
* Get a new object representing the same algorithm as *this
@@ -74,17 +61,17 @@ class BOTAN_DLL StreamCipher : public SymmetricAlgorithm
/**
* Zeroize internal state
*/
- virtual void clear() throw() = 0;
+ virtual void clear() = 0;
- StreamCipher(u32bit key_min, u32bit key_max = 0,
- u32bit key_mod = 1,
- u32bit iv_len = 0) :
- SymmetricAlgorithm(key_min, key_max, key_mod),
- IV_LENGTH(iv_len) {}
+ /**
+ * StreamCipher constructor
+ */
+ StreamCipher(u32bit key_min,
+ u32bit key_max = 0,
+ u32bit key_mod = 1) :
+ SymmetricAlgorithm(key_min, key_max, key_mod) {}
virtual ~StreamCipher() {}
- private:
- virtual void cipher(const byte[], byte[], u32bit) = 0;
};
}
diff --git a/src/stream/turing/info.txt b/src/stream/turing/info.txt
index c251a0a30..dede0dd39 100644
--- a/src/stream/turing/info.txt
+++ b/src/stream/turing/info.txt
@@ -1,5 +1,3 @@
-realname "Turing"
-
define TURING
load_on auto
diff --git a/src/stream/turing/turing.cpp b/src/stream/turing/turing.cpp
index 1e2203480..810f65ca4 100644
--- a/src/stream/turing/turing.cpp
+++ b/src/stream/turing/turing.cpp
@@ -257,15 +257,15 @@ void Turing::key_schedule(const byte key[], u32bit length)
S3[i] = (W3 & 0xFFFFFF00) | C3;
}
- resync(0, 0);
+ set_iv(0, 0);
}
/*
* Resynchronization
*/
-void Turing::resync(const byte iv[], u32bit length)
+void Turing::set_iv(const byte iv[], u32bit length)
{
- if(length % 4 != 0 || length > 16)
+ if(!valid_iv_length(length))
throw Invalid_IV_Length(name(), length);
SecureVector<u32bit> IV(length / 4);
@@ -295,7 +295,7 @@ void Turing::resync(const byte iv[], u32bit length)
/*
* Clear memory of sensitive data
*/
-void Turing::clear() throw()
+void Turing::clear()
{
S0.clear();
S1.clear();
diff --git a/src/stream/turing/turing.h b/src/stream/turing/turing.h
index 455d3c612..7291647ea 100644
--- a/src/stream/turing/turing.h
+++ b/src/stream/turing/turing.h
@@ -18,14 +18,18 @@ namespace Botan {
class BOTAN_DLL Turing : public StreamCipher
{
public:
- void clear() throw();
+ void cipher(const byte in[], byte out[], u32bit length);
+ void set_iv(const byte[], u32bit);
+
+ bool valid_iv_length(u32bit iv_len) const
+ { return (iv_len % 4 == 0 && iv_len <= 16); }
+
+ void clear();
std::string name() const { return "Turing"; }
StreamCipher* clone() const { return new Turing; }
Turing() : StreamCipher(4, 32, 4) { position = 0; }
private:
- void cipher(const byte[], byte[], u32bit);
void key_schedule(const byte[], u32bit);
- void resync(const byte[], u32bit);
void generate();
static u32bit fixedS(u32bit);
diff --git a/src/stream/wid_wake/info.txt b/src/stream/wid_wake/info.txt
index 94416417e..6289e0369 100644
--- a/src/stream/wid_wake/info.txt
+++ b/src/stream/wid_wake/info.txt
@@ -1,5 +1,3 @@
-realname "WiderWake"
-
define WID_WAKE
load_on auto
diff --git a/src/stream/wid_wake/wid_wake.cpp b/src/stream/wid_wake/wid_wake.cpp
index 1dc0fd7f9..2a8946649 100644
--- a/src/stream/wid_wake/wid_wake.cpp
+++ b/src/stream/wid_wake/wid_wake.cpp
@@ -110,16 +110,17 @@ void WiderWake_41_BE::key_schedule(const byte key[], u32bit)
T[X] = Z;
position = 0;
- const byte iv[8] = { 0 };
- resync(iv, 8);
+
+ const byte ZEROS[8] = { 0 };
+ set_iv(ZEROS, sizeof(ZEROS));
}
/*
* Resynchronization
*/
-void WiderWake_41_BE::resync(const byte iv[], u32bit length)
+void WiderWake_41_BE::set_iv(const byte iv[], u32bit length)
{
- if(length != 8)
+ if(!valid_iv_length(length))
throw Invalid_IV_Length(name(), length);
for(u32bit j = 0; j != 4; ++j)
@@ -135,7 +136,7 @@ void WiderWake_41_BE::resync(const byte iv[], u32bit length)
/*
* Clear memory of sensitive data
*/
-void WiderWake_41_BE::clear() throw()
+void WiderWake_41_BE::clear()
{
position = 0;
t_key.clear();
diff --git a/src/stream/wid_wake/wid_wake.h b/src/stream/wid_wake/wid_wake.h
index 4720afdb2..23e1eacab 100644
--- a/src/stream/wid_wake/wid_wake.h
+++ b/src/stream/wid_wake/wid_wake.h
@@ -18,14 +18,18 @@ namespace Botan {
class BOTAN_DLL WiderWake_41_BE : public StreamCipher
{
public:
- void clear() throw();
+ void cipher(const byte[], byte[], u32bit);
+ void set_iv(const byte[], u32bit);
+
+ bool valid_iv_length(u32bit iv_len) const
+ { return (iv_len == 8); }
+
+ void clear();
std::string name() const { return "WiderWake4+1-BE"; }
StreamCipher* clone() const { return new WiderWake_41_BE; }
- WiderWake_41_BE() : StreamCipher(16, 16, 1, 8) {}
+ WiderWake_41_BE() : StreamCipher(16, 16, 1) {}
private:
- void cipher(const byte[], byte[], u32bit);
void key_schedule(const byte[], u32bit);
- void resync(const byte[], u32bit);
void generate(u32bit);
diff --git a/src/sym_algo/info.txt b/src/sym_algo/info.txt
index 03804a92d..fab46270e 100644
--- a/src/sym_algo/info.txt
+++ b/src/sym_algo/info.txt
@@ -1,5 +1,3 @@
-realname "Symmetric Algorithms"
-
load_on auto
<add>
diff --git a/src/sym_algo/sym_algo.h b/src/sym_algo/sym_algo.h
index 1c8b816fd..929f2a6f0 100644
--- a/src/sym_algo/sym_algo.h
+++ b/src/sym_algo/sym_algo.h
@@ -46,7 +46,7 @@ class BOTAN_DLL SymmetricAlgorithm
* Set the symmetric key of this object.
* @param key the SymmetricKey to be set.
*/
- void set_key(const SymmetricKey& key) throw(Invalid_Key_Length)
+ void set_key(const SymmetricKey& key)
{ set_key(key.begin(), key.length()); }
/**
@@ -54,7 +54,7 @@ class BOTAN_DLL SymmetricAlgorithm
* @param key the to be set as a byte array.
* @param the length of the byte array.
*/
- void set_key(const byte key[], u32bit length) throw(Invalid_Key_Length)
+ void set_key(const byte key[], u32bit length)
{
if(!valid_keylength(length))
throw Invalid_Key_Length(name(), length);
diff --git a/src/tss/info.txt b/src/tss/info.txt
index af4e0b930..11cc471d2 100644
--- a/src/tss/info.txt
+++ b/src/tss/info.txt
@@ -1,5 +1,3 @@
-realname "Threshold Secret Sharing"
-
<requires>
hash
rng
diff --git a/src/utils/asm_amd64/info.txt b/src/utils/asm_amd64/info.txt
index 6fa4d1de5..a5588669c 100644
--- a/src/utils/asm_amd64/info.txt
+++ b/src/utils/asm_amd64/info.txt
@@ -1,5 +1,3 @@
-realname "Assembler Macros (x86-64)"
-
load_on dep
<add>
diff --git a/src/utils/asm_ia32/info.txt b/src/utils/asm_ia32/info.txt
index 8485d33b9..63b57e0f8 100644
--- a/src/utils/asm_ia32/info.txt
+++ b/src/utils/asm_ia32/info.txt
@@ -1,5 +1,3 @@
-realname "Assembler Macros (IA-32)"
-
load_on dep
<add>
diff --git a/src/utils/buf_comp/info.txt b/src/utils/buf_comp/info.txt
index bcbbc23e2..7aea580ce 100644
--- a/src/utils/buf_comp/info.txt
+++ b/src/utils/buf_comp/info.txt
@@ -1,5 +1,3 @@
-realname "Buffered Computation"
-
load_on auto
<add>
diff --git a/src/utils/cpuid.cpp b/src/utils/cpuid.cpp
index ae82bdac8..2ba7f9b77 100644
--- a/src/utils/cpuid.cpp
+++ b/src/utils/cpuid.cpp
@@ -10,17 +10,17 @@
#include <botan/loadstor.h>
#include <botan/mem_ops.h>
-#if defined(BOTAN_TARGET_ARCH_IS_X86) || defined(BOTAN_TARGET_ARCH_IS_AMD64)
+#if defined(BOTAN_TARGET_ARCH_IS_IA32) || defined(BOTAN_TARGET_ARCH_IS_AMD64)
#if defined(BOTAN_BUILD_COMPILER_IS_MSVC)
#include <intrin.h>
- #define CALL_CPUID(type, out) do { __cpuid(out, type) } while(0)
+ #define CALL_CPUID(type, out) do { __cpuid((int*)out, type); } while(0)
-#elif defined(BOTAN_BUILD_COMPILER_IS_ICC)
+#elif defined(BOTAN_BUILD_COMPILER_IS_INTEL)
#include <ia32intrin.h>
- #define CALL_CPUID(type, out) do { __cpuid(out, type) } while(0);
+ #define CALL_CPUID(type, out) do { __cpuid(out, type); } while(0);
#elif defined(BOTAN_BUILD_COMPILER_IS_GCC)
@@ -30,9 +30,12 @@
#endif
-#else
+#endif
+
+#ifndef CALL_CPUID
// In all other cases, just zeroize the supposed cpuid output
- #define CALL_CPUID(type, out) out[0] = out[1] = out[2] = out[3] = 0;
+ #define CALL_CPUID(type, out) \
+ do { out[0] = out[1] = out[2] = out[3] = 0; } while(0);
#endif
namespace Botan {
@@ -95,4 +98,71 @@ u32bit CPUID::cache_line_size()
return cl_size;
}
+bool CPUID::has_altivec()
+ {
+ static bool first_time = true;
+ static bool altivec_capable = false;
+
+ if(first_time)
+ {
+#if defined(BOTAN_TARGET_ARCH_IS_PPC) || defined(BOTAN_TARGET_ARCH_IS_PPC64)
+
+ /*
+ PVR identifiers for various AltiVec enabled CPUs. Taken from
+ PearPC and Linux sources, mostly.
+ */
+ const u16bit PVR_G4_7400 = 0x000C;
+ const u16bit PVR_G5_970 = 0x0039;
+ const u16bit PVR_G5_970FX = 0x003C;
+ const u16bit PVR_G5_970MP = 0x0044;
+ const u16bit PVR_G5_970GX = 0x0045;
+ const u16bit PVR_POWER6 = 0x003E;
+ const u16bit PVR_CELL_PPU = 0x0070;
+
+ // Motorola produced G4s with PVR 0x800[0123C] (at least)
+ const u16bit PVR_G4_74xx_24 = 0x800;
+
+ /*
+ On PowerPC, MSR 287 is PVR, the Processor Version Number
+
+ Normally it is only accessible to ring 0, but Linux and NetBSD
+ (at least) will trap and emulate it for us. This is roughly 20x
+ saner than every other approach I've seen for AltiVec detection
+ (all of which are entirely OS specific, to boot).
+
+ Apparently OS X doesn't support this, but then again OS X
+ doesn't really support PPC anymore, so I'm not worrying about it.
+
+ For OSes that aren't (known to) support the emulation, skip the
+ call, leaving pvr as 0 which will cause all subsequent model
+ number checks to fail (and we'll assume no AltiVec)
+ */
+
+#if defined(BOTAN_TARGET_OS_IS_LINUX) || defined(BOTAN_TARGET_OS_IS_NETBSD)
+ #define BOTAN_TARGET_OS_SUPPORTS_MFSPR_EMUL
+#endif
+
+ u32bit pvr = 0;
+
+#if defined(BOTAN_TARGET_OS_SUPPORTS_MFSPR_EMUL)
+ asm volatile("mfspr %0, 287" : "=r" (pvr));
+#endif
+ // Top 16 bit suffice to identify model
+ pvr >>= 16;
+
+ altivec_capable |= (pvr == PVR_G4_7400);
+ altivec_capable |= ((pvr >> 8) == PVR_G4_74xx_24);
+ altivec_capable |= (pvr == PVR_G5_970);
+ altivec_capable |= (pvr == PVR_G5_970FX);
+ altivec_capable |= (pvr == PVR_G5_970MP);
+ altivec_capable |= (pvr == PVR_G5_970GX);
+ altivec_capable |= (pvr == PVR_CELL_PPU);
+#endif
+
+ first_time = false;
+ }
+
+ return altivec_capable;
+ }
+
}
diff --git a/src/utils/cpuid.h b/src/utils/cpuid.h
index 0b210768a..8b8021754 100644
--- a/src/utils/cpuid.h
+++ b/src/utils/cpuid.h
@@ -65,6 +65,7 @@ class CPUID
static bool has_intel_aes()
{ return ((x86_processor_flags() >> CPUID_INTEL_AES_BIT) & 1); }
+ static bool has_altivec();
private:
static u64bit x86_processor_flags();
};
diff --git a/src/utils/datastor/info.txt b/src/utils/datastor/info.txt
index 8c38a3ac8..9c995adaf 100644
--- a/src/utils/datastor/info.txt
+++ b/src/utils/datastor/info.txt
@@ -1,5 +1,3 @@
-realname "Datastore"
-
load_on auto
<add>
diff --git a/src/utils/info.txt b/src/utils/info.txt
index 6380fd6c2..3d024fa09 100644
--- a/src/utils/info.txt
+++ b/src/utils/info.txt
@@ -1,5 +1,3 @@
-realname "Utility Functions"
-
define UTIL_FUNCTIONS
load_on always
diff --git a/src/utils/loadstor.h b/src/utils/loadstor.h
index 8c64deaee..8f430f36c 100644
--- a/src/utils/loadstor.h
+++ b/src/utils/loadstor.h
@@ -166,6 +166,116 @@ inline u64bit load_le<u64bit>(const byte in[], u32bit off)
#endif
}
+template<typename T>
+inline void load_le(const byte in[], T& x0, T& x1)
+ {
+ x0 = load_le<T>(in, 0);
+ x1 = load_le<T>(in, 1);
+ }
+
+template<typename T>
+inline void load_le(const byte in[],
+ T& x0, T& x1, T& x2, T& x3)
+ {
+ x0 = load_le<T>(in, 0);
+ x1 = load_le<T>(in, 1);
+ x2 = load_le<T>(in, 2);
+ x3 = load_le<T>(in, 3);
+ }
+
+template<typename T>
+inline void load_le(const byte in[],
+ T& x0, T& x1, T& x2, T& x3,
+ T& x4, T& x5, T& x6, T& x7)
+ {
+ x0 = load_le<T>(in, 0);
+ x1 = load_le<T>(in, 1);
+ x2 = load_le<T>(in, 2);
+ x3 = load_le<T>(in, 3);
+ x4 = load_le<T>(in, 4);
+ x5 = load_le<T>(in, 5);
+ x6 = load_le<T>(in, 6);
+ x7 = load_le<T>(in, 7);
+ }
+
+template<typename T>
+inline void load_le(T out[],
+ const byte in[],
+ u32bit count)
+ {
+ const u32bit blocks = count - (count % 4);
+ const u32bit left = count - blocks;
+
+ for(u32bit i = 0; i != blocks; i += 4)
+ {
+ out[0] = load_le<T>(in, 0);
+ out[1] = load_le<T>(in, 1);
+ out[2] = load_le<T>(in, 2);
+ out[3] = load_le<T>(in, 3);
+
+ out += 4;
+ in += 4*sizeof(T);
+ }
+
+ for(u32bit i = 0; i != left; ++i)
+ out[i] = load_le<T>(in, i);
+ }
+
+template<typename T>
+inline void load_be(const byte in[], T& x0, T& x1)
+ {
+ x0 = load_be<T>(in, 0);
+ x1 = load_be<T>(in, 1);
+ }
+
+template<typename T>
+inline void load_be(const byte in[],
+ T& x0, T& x1, T& x2, T& x3)
+ {
+ x0 = load_be<T>(in, 0);
+ x1 = load_be<T>(in, 1);
+ x2 = load_be<T>(in, 2);
+ x3 = load_be<T>(in, 3);
+ }
+
+template<typename T>
+inline void load_be(const byte in[],
+ T& x0, T& x1, T& x2, T& x3,
+ T& x4, T& x5, T& x6, T& x7)
+ {
+ x0 = load_be<T>(in, 0);
+ x1 = load_be<T>(in, 1);
+ x2 = load_be<T>(in, 2);
+ x3 = load_be<T>(in, 3);
+ x4 = load_be<T>(in, 4);
+ x5 = load_be<T>(in, 5);
+ x6 = load_be<T>(in, 6);
+ x7 = load_be<T>(in, 7);
+ }
+
+template<typename T>
+inline void load_be(T out[],
+ const byte in[],
+ u32bit count)
+ {
+ const u32bit blocks = count - (count % 4);
+ const u32bit left = count - blocks;
+
+ for(u32bit i = 0; i != blocks; i += 4)
+ {
+ out[0] = load_be<T>(in, 0);
+ out[1] = load_be<T>(in, 1);
+ out[2] = load_be<T>(in, 2);
+ out[3] = load_be<T>(in, 3);
+
+ out += 4;
+ in += 4*sizeof(T);
+ }
+
+ for(u32bit i = 0; i != left; ++i)
+ out[i] = load_be<T>(in, i);
+ }
+
/*
* Endian-Specific Word Storing Operations
*/
@@ -246,35 +356,63 @@ inline void store_le(u64bit in, byte out[8])
}
template<typename T>
-inline void store_le(byte out[], T a, T b)
+inline void store_le(byte out[], T x0, T x1)
+ {
+ store_le(x0, out + (0 * sizeof(T)));
+ store_le(x1, out + (1 * sizeof(T)));
+ }
+
+template<typename T>
+inline void store_be(byte out[], T x0, T x1)
+ {
+ store_be(x0, out + (0 * sizeof(T)));
+ store_be(x1, out + (1 * sizeof(T)));
+ }
+
+template<typename T>
+inline void store_le(byte out[], T x0, T x1, T x2, T x3)
{
- store_le(a, out + (0 * sizeof(T)));
- store_le(b, out + (1 * sizeof(T)));
+ store_le(x0, out + (0 * sizeof(T)));
+ store_le(x1, out + (1 * sizeof(T)));
+ store_le(x2, out + (2 * sizeof(T)));
+ store_le(x3, out + (3 * sizeof(T)));
}
template<typename T>
-inline void store_be(byte out[], T a, T b)
+inline void store_be(byte out[], T x0, T x1, T x2, T x3)
{
- store_be(a, out + (0 * sizeof(T)));
- store_be(b, out + (1 * sizeof(T)));
+ store_be(x0, out + (0 * sizeof(T)));
+ store_be(x1, out + (1 * sizeof(T)));
+ store_be(x2, out + (2 * sizeof(T)));
+ store_be(x3, out + (3 * sizeof(T)));
}
template<typename T>
-inline void store_le(byte out[], T a, T b, T c, T d)
+inline void store_le(byte out[], T x0, T x1, T x2, T x3,
+ T x4, T x5, T x6, T x7)
{
- store_le(a, out + (0 * sizeof(T)));
- store_le(b, out + (1 * sizeof(T)));
- store_le(c, out + (2 * sizeof(T)));
- store_le(d, out + (3 * sizeof(T)));
+ store_le(x0, out + (0 * sizeof(T)));
+ store_le(x1, out + (1 * sizeof(T)));
+ store_le(x2, out + (2 * sizeof(T)));
+ store_le(x3, out + (3 * sizeof(T)));
+ store_le(x4, out + (4 * sizeof(T)));
+ store_le(x5, out + (5 * sizeof(T)));
+ store_le(x6, out + (6 * sizeof(T)));
+ store_le(x7, out + (7 * sizeof(T)));
}
template<typename T>
-inline void store_be(byte out[], T a, T b, T c, T d)
+inline void store_be(byte out[], T x0, T x1, T x2, T x3,
+ T x4, T x5, T x6, T x7)
{
- store_be(a, out + (0 * sizeof(T)));
- store_be(b, out + (1 * sizeof(T)));
- store_be(c, out + (2 * sizeof(T)));
- store_be(d, out + (3 * sizeof(T)));
+ store_be(x0, out + (0 * sizeof(T)));
+ store_be(x1, out + (1 * sizeof(T)));
+ store_be(x2, out + (2 * sizeof(T)));
+ store_be(x3, out + (3 * sizeof(T)));
+ store_be(x4, out + (4 * sizeof(T)));
+ store_be(x5, out + (5 * sizeof(T)));
+ store_be(x6, out + (6 * sizeof(T)));
+ store_be(x7, out + (7 * sizeof(T)));
}
}
diff --git a/src/utils/simd_32/info.txt b/src/utils/simd_32/info.txt
new file mode 100644
index 000000000..64707c1e4
--- /dev/null
+++ b/src/utils/simd_32/info.txt
@@ -0,0 +1,16 @@
+define SIMD_32
+
+load_on always
+
+<arch>
+pentium-m
+pentium4
+prescott
+amd64
+</arch>
+
+<cc>
+gcc
+icc
+msvc
+</cc>
diff --git a/src/utils/simd_32/simd_32.h b/src/utils/simd_32/simd_32.h
new file mode 100644
index 000000000..be426efd6
--- /dev/null
+++ b/src/utils/simd_32/simd_32.h
@@ -0,0 +1,32 @@
+/**
+* Lightweight wrappers for SIMD operations
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_SIMD_32_H__
+#define BOTAN_SIMD_32_H__
+
+#include <botan/types.h>
+
+//#define BOTAN_TARGET_CPU_HAS_SSE2
+
+#if defined(BOTAN_TARGET_CPU_HAS_SSE2)
+
+ #include <botan/simd_sse.h>
+ namespace Botan { typedef SIMD_SSE2 SIMD_32; }
+
+#elif defined(BOTAN_TARGET_CPU_HAS_ALTIVEC)
+
+ #include <botan/simd_altivec.h>
+ namespace Botan { typedef SIMD_Altivec SIMD_32; }
+
+#else
+
+ #include <botan/simd_scalar.h>
+ namespace Botan { typedef SIMD_Scalar SIMD_32; }
+
+#endif
+
+#endif
diff --git a/src/utils/simd_32/simd_altivec.h b/src/utils/simd_32/simd_altivec.h
new file mode 100644
index 000000000..e1aa62002
--- /dev/null
+++ b/src/utils/simd_32/simd_altivec.h
@@ -0,0 +1,202 @@
+/**
+* Lightweight wrappers around AltiVec for 32-bit operations
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_SIMD_ALTIVEC_H__
+#define BOTAN_SIMD_ALTIVEC_H__
+
+#include <botan/loadstor.h>
+#include <botan/cpuid.h>
+
+#include <altivec.h>
+#undef vector
+
+namespace Botan {
+
+class SIMD_Altivec
+ {
+ public:
+ bool enabled() const { return CPUID::has_altivec(); }
+
+ SIMD_Altivec(const u32bit B[4])
+ {
+ reg = (__vector unsigned int){B[0], B[1], B[2], B[3]};
+ }
+
+ SIMD_Altivec(u32bit B0, u32bit B1, u32bit B2, u32bit B3)
+ {
+ reg = (__vector unsigned int){B0, B1, B2, B3};
+ }
+
+ SIMD_Altivec(u32bit B)
+ {
+ reg = (__vector unsigned int){B, B, B, B};
+ }
+
+ static SIMD_Altivec load_le(const void* in)
+ {
+ const u32bit* in_32 = static_cast<const u32bit*>(in);
+
+ __vector unsigned int R0 = vec_ld(0, in_32);
+ __vector unsigned int R1 = vec_ld(12, in_32);
+
+ __vector unsigned char perm = vec_lvsl(0, in_32);
+
+ perm = vec_xor(perm, vec_splat_u8(3));
+
+ R0 = vec_perm(R0, R1, perm);
+
+ return SIMD_Altivec(R0);
+ }
+
+ static SIMD_Altivec load_be(const void* in)
+ {
+ const u32bit* in_32 = static_cast<const u32bit*>(in);
+
+ __vector unsigned int R0 = vec_ld(0, in_32);
+ __vector unsigned int R1 = vec_ld(12, in_32);
+
+ __vector unsigned char perm = vec_lvsl(0, in_32);
+
+ R0 = vec_perm(R0, R1, perm);
+
+ return SIMD_Altivec(R0);
+ }
+
+ void store_le(byte out[]) const
+ {
+ __vector unsigned char perm = vec_lvsl(0, (u32bit*)0);
+
+ perm = vec_xor(perm, vec_splat_u8(3));
+
+ union {
+ __vector unsigned int V;
+ u32bit R[4];
+ } vec;
+
+ vec.V = vec_perm(reg, reg, perm);
+
+ Botan::store_be(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]);
+ }
+
+ void store_be(byte out[]) const
+ {
+ union {
+ __vector unsigned int V;
+ u32bit R[4];
+ } vec;
+
+ vec.V = reg;
+
+ Botan::store_be(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]);
+ }
+
+ void rotate_left(u32bit rot)
+ {
+ __vector unsigned int rot_vec =
+ (__vector unsigned int){rot, rot, rot, rot};
+
+ reg = vec_rl(reg, rot_vec);
+ }
+
+ void rotate_right(u32bit rot)
+ {
+ rotate_left(32 - rot);
+ }
+
+ void operator+=(const SIMD_Altivec& other)
+ {
+ reg = vec_add(reg, other.reg);
+ }
+
+ SIMD_Altivec operator+(const SIMD_Altivec& other) const
+ {
+ return vec_add(reg, other.reg);
+ }
+
+ void operator-=(const SIMD_Altivec& other)
+ {
+ reg = vec_sub(reg, other.reg);
+ }
+
+ SIMD_Altivec operator-(const SIMD_Altivec& other) const
+ {
+ return vec_sub(reg, other.reg);
+ }
+
+ void operator^=(const SIMD_Altivec& other)
+ {
+ reg = vec_xor(reg, other.reg);
+ }
+
+ SIMD_Altivec operator^(const SIMD_Altivec& other) const
+ {
+ return vec_xor(reg, other.reg);
+ }
+
+ void operator|=(const SIMD_Altivec& other)
+ {
+ reg = vec_or(reg, other.reg);
+ }
+
+ void operator&=(const SIMD_Altivec& other)
+ {
+ reg = vec_and(reg, other.reg);
+ }
+
+ SIMD_Altivec operator<<(u32bit shift) const
+ {
+ __vector unsigned int shift_vec =
+ (__vector unsigned int){shift, shift, shift, shift};
+
+ return vec_sl(reg, shift_vec);
+ }
+
+ SIMD_Altivec operator>>(u32bit shift) const
+ {
+ __vector unsigned int shift_vec =
+ (__vector unsigned int){shift, shift, shift, shift};
+
+ return vec_sr(reg, shift_vec);
+ }
+
+ SIMD_Altivec operator~() const
+ {
+ return vec_nor(reg, reg);
+ }
+
+ SIMD_Altivec bswap() const
+ {
+ __vector unsigned char perm = vec_lvsl(0, (u32bit*)0);
+
+ perm = vec_xor(perm, vec_splat_u8(3));
+
+ return SIMD_Altivec(vec_perm(reg, reg, perm));
+ }
+
+ static void transpose(SIMD_Altivec& B0, SIMD_Altivec& B1,
+ SIMD_Altivec& B2, SIMD_Altivec& B3)
+ {
+ __vector unsigned int T0 = vec_mergeh(B0.reg, B2.reg);
+ __vector unsigned int T1 = vec_mergel(B0.reg, B2.reg);
+ __vector unsigned int T2 = vec_mergeh(B1.reg, B3.reg);
+ __vector unsigned int T3 = vec_mergel(B1.reg, B3.reg);
+
+ B0.reg = vec_mergeh(T0, T2);
+ B1.reg = vec_mergel(T0, T2);
+ B2.reg = vec_mergeh(T1, T3);
+ B3.reg = vec_mergel(T1, T3);
+ }
+
+ private:
+ SIMD_Altivec(__vector unsigned int input) { reg = input; }
+
+ __vector unsigned int reg;
+ };
+
+}
+
+#endif
diff --git a/src/utils/simd_32/simd_scalar.h b/src/utils/simd_32/simd_scalar.h
new file mode 100644
index 000000000..5fc20b462
--- /dev/null
+++ b/src/utils/simd_32/simd_scalar.h
@@ -0,0 +1,202 @@
+/**
+* Scalar emulation of SIMD 32-bit operations
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_SIMD_SCALAR_H__
+#define BOTAN_SIMD_SCALAR_H__
+
+#include <botan/loadstor.h>
+#include <botan/bswap.h>
+
+namespace Botan {
+
+class SIMD_Scalar
+ {
+ public:
+ bool enabled() const { return true; }
+
+ SIMD_Scalar(const u32bit B[4])
+ {
+ R0 = B[0];
+ R1 = B[1];
+ R2 = B[2];
+ R3 = B[3];
+ }
+
+ SIMD_Scalar(u32bit B0, u32bit B1, u32bit B2, u32bit B3)
+ {
+ R0 = B0;
+ R1 = B1;
+ R2 = B2;
+ R3 = B3;
+ }
+
+ SIMD_Scalar(u32bit B)
+ {
+ R0 = B;
+ R1 = B;
+ R2 = B;
+ R3 = B;
+ }
+
+ static SIMD_Scalar load_le(const void* in)
+ {
+ const byte* in_b = static_cast<const byte*>(in);
+ return SIMD_Scalar(Botan::load_le<u32bit>(in_b, 0),
+ Botan::load_le<u32bit>(in_b, 1),
+ Botan::load_le<u32bit>(in_b, 2),
+ Botan::load_le<u32bit>(in_b, 3));
+ }
+
+ static SIMD_Scalar load_be(const void* in)
+ {
+ const byte* in_b = static_cast<const byte*>(in);
+ return SIMD_Scalar(Botan::load_be<u32bit>(in_b, 0),
+ Botan::load_be<u32bit>(in_b, 1),
+ Botan::load_be<u32bit>(in_b, 2),
+ Botan::load_be<u32bit>(in_b, 3));
+ }
+
+ void store_le(byte out[]) const
+ {
+ Botan::store_le(out, R0, R1, R2, R3);
+ }
+
+ void store_be(byte out[]) const
+ {
+ Botan::store_be(out, R0, R1, R2, R3);
+ }
+
+ void rotate_left(u32bit rot)
+ {
+ R0 = Botan::rotate_left(R0, rot);
+ R1 = Botan::rotate_left(R1, rot);
+ R2 = Botan::rotate_left(R2, rot);
+ R3 = Botan::rotate_left(R3, rot);
+ }
+
+ void rotate_right(u32bit rot)
+ {
+ R0 = Botan::rotate_right(R0, rot);
+ R1 = Botan::rotate_right(R1, rot);
+ R2 = Botan::rotate_right(R2, rot);
+ R3 = Botan::rotate_right(R3, rot);
+ }
+
+ void operator+=(const SIMD_Scalar& other)
+ {
+ R0 += other.R0;
+ R1 += other.R1;
+ R2 += other.R2;
+ R3 += other.R3;
+ }
+
+ SIMD_Scalar operator+(const SIMD_Scalar& other) const
+ {
+ return SIMD_Scalar(R0 + other.R0,
+ R1 + other.R1,
+ R2 + other.R2,
+ R3 + other.R3);
+ }
+
+ void operator-=(const SIMD_Scalar& other)
+ {
+ R0 -= other.R0;
+ R1 -= other.R1;
+ R2 -= other.R2;
+ R3 -= other.R3;
+ }
+
+ SIMD_Scalar operator-(const SIMD_Scalar& other) const
+ {
+ return SIMD_Scalar(R0 - other.R0,
+ R1 - other.R1,
+ R2 - other.R2,
+ R3 - other.R3);
+ }
+
+ void operator^=(const SIMD_Scalar& other)
+ {
+ R0 ^= other.R0;
+ R1 ^= other.R1;
+ R2 ^= other.R2;
+ R3 ^= other.R3;
+ }
+
+ SIMD_Scalar operator^(const SIMD_Scalar& other) const
+ {
+ return SIMD_Scalar(R0 ^ other.R0,
+ R1 ^ other.R1,
+ R2 ^ other.R2,
+ R3 ^ other.R3);
+ }
+
+ void operator|=(const SIMD_Scalar& other)
+ {
+ R0 |= other.R0;
+ R1 |= other.R1;
+ R2 |= other.R2;
+ R3 |= other.R3;
+ }
+
+ void operator&=(const SIMD_Scalar& other)
+ {
+ R0 &= other.R0;
+ R1 &= other.R1;
+ R2 &= other.R2;
+ R3 &= other.R3;
+ }
+
+ SIMD_Scalar operator<<(u32bit shift) const
+ {
+ return SIMD_Scalar(R0 << shift,
+ R1 << shift,
+ R2 << shift,
+ R3 << shift);
+ }
+
+ SIMD_Scalar operator>>(u32bit shift) const
+ {
+ return SIMD_Scalar(R0 >> shift,
+ R1 >> shift,
+ R2 >> shift,
+ R3 >> shift);
+ }
+
+ SIMD_Scalar operator~() const
+ {
+ return SIMD_Scalar(~R0, ~R1, ~R2, ~R3);
+ }
+
+ SIMD_Scalar bswap() const
+ {
+ return SIMD_Scalar(reverse_bytes(R0),
+ reverse_bytes(R1),
+ reverse_bytes(R2),
+ reverse_bytes(R3));
+ }
+
+ static void transpose(SIMD_Scalar& B0, SIMD_Scalar& B1,
+ SIMD_Scalar& B2, SIMD_Scalar& B3)
+ {
+ SIMD_Scalar T0(B0.R0, B1.R0, B2.R0, B3.R0);
+ SIMD_Scalar T1(B0.R1, B1.R1, B2.R1, B3.R1);
+ SIMD_Scalar T2(B0.R2, B1.R2, B2.R2, B3.R2);
+ SIMD_Scalar T3(B0.R3, B1.R3, B2.R3, B3.R3);
+
+ B0 = T0;
+ B1 = T1;
+ B2 = T2;
+ B3 = T3;
+ }
+
+ private:
+ u32bit R0, R1, R2, R3;
+ };
+
+}
+
+#endif
diff --git a/src/utils/simd_32/simd_sse.h b/src/utils/simd_32/simd_sse.h
new file mode 100644
index 000000000..c45d8032f
--- /dev/null
+++ b/src/utils/simd_32/simd_sse.h
@@ -0,0 +1,156 @@
+/**
+* Lightweight wrappers for SSE2 intrinsics for 32-bit operations
+* (C) 2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_SIMD_SSE_H__
+#define BOTAN_SIMD_SSE_H__
+
+#include <botan/cpuid.h>
+
+#include <emmintrin.h>
+
+namespace Botan {
+
+class SIMD_SSE2
+ {
+ public:
+ bool enabled() const { return CPUID::has_sse2(); }
+
+ SIMD_SSE2(const u32bit B[4])
+ {
+ reg = _mm_loadu_si128((const __m128i*)B);
+ }
+
+ SIMD_SSE2(u32bit B0, u32bit B1, u32bit B2, u32bit B3)
+ {
+ reg = _mm_set_epi32(B0, B1, B2, B3);
+ }
+
+ SIMD_SSE2(u32bit B)
+ {
+ reg = _mm_set1_epi32(B);
+ }
+
+ static SIMD_SSE2 load_le(const void* in)
+ {
+ return _mm_loadu_si128((const __m128i*)in);
+ }
+
+ static SIMD_SSE2 load_be(const void* in)
+ {
+ return load_le(in).bswap();
+ }
+
+ void store_le(byte out[]) const
+ {
+ _mm_storeu_si128((__m128i*)out, reg);
+ }
+
+ void store_be(byte out[]) const
+ {
+ bswap().store_le(out);
+ }
+
+ void rotate_left(u32bit rot)
+ {
+ reg = _mm_or_si128(_mm_slli_epi32(reg, rot),
+ _mm_srli_epi32(reg, 32-rot));
+ }
+
+ void rotate_right(u32bit rot)
+ {
+ rotate_left(32 - rot);
+ }
+
+ void operator+=(const SIMD_SSE2& other)
+ {
+ reg = _mm_add_epi32(reg, other.reg);
+ }
+
+ SIMD_SSE2 operator+(const SIMD_SSE2& other) const
+ {
+ return _mm_add_epi32(reg, other.reg);
+ }
+
+ void operator-=(const SIMD_SSE2& other)
+ {
+ reg = _mm_sub_epi32(reg, other.reg);
+ }
+
+ SIMD_SSE2 operator-(const SIMD_SSE2& other) const
+ {
+ return _mm_sub_epi32(reg, other.reg);
+ }
+
+ void operator^=(const SIMD_SSE2& other)
+ {
+ reg = _mm_xor_si128(reg, other.reg);
+ }
+
+ SIMD_SSE2 operator^(const SIMD_SSE2& other) const
+ {
+ return _mm_xor_si128(reg, other.reg);
+ }
+
+ void operator|=(const SIMD_SSE2& other)
+ {
+ reg = _mm_or_si128(reg, other.reg);
+ }
+
+ void operator&=(const SIMD_SSE2& other)
+ {
+ reg = _mm_and_si128(reg, other.reg);
+ }
+
+ SIMD_SSE2 operator<<(u32bit shift) const
+ {
+ return _mm_slli_epi32(reg, shift);
+ }
+
+ SIMD_SSE2 operator>>(u32bit shift) const
+ {
+ return _mm_srli_epi32(reg, shift);
+ }
+
+ SIMD_SSE2 operator~() const
+ {
+ static const __m128i all_ones = _mm_set1_epi32(0xFFFFFFFF);
+ return _mm_xor_si128(reg, all_ones);
+ }
+
+ SIMD_SSE2 bswap() const
+ {
+ __m128i T = reg;
+
+ T = _mm_shufflehi_epi16(T, _MM_SHUFFLE(2, 3, 0, 1));
+ T = _mm_shufflelo_epi16(T, _MM_SHUFFLE(2, 3, 0, 1));
+
+ return _mm_or_si128(_mm_srli_epi16(T, 8),
+ _mm_slli_epi16(T, 8));
+ }
+
+ static void transpose(SIMD_SSE2& B0, SIMD_SSE2& B1,
+ SIMD_SSE2& B2, SIMD_SSE2& B3)
+ {
+ __m128i T0 = _mm_unpacklo_epi32(B0.reg, B1.reg);
+ __m128i T1 = _mm_unpacklo_epi32(B2.reg, B3.reg);
+ __m128i T2 = _mm_unpackhi_epi32(B0.reg, B1.reg);
+ __m128i T3 = _mm_unpackhi_epi32(B2.reg, B3.reg);
+ B0.reg = _mm_unpacklo_epi64(T0, T1);
+ B1.reg = _mm_unpackhi_epi64(T0, T1);
+ B2.reg = _mm_unpacklo_epi64(T2, T3);
+ B3.reg = _mm_unpackhi_epi64(T2, T3);
+ }
+
+ private:
+ SIMD_SSE2(__m128i in) { reg = in; }
+
+ __m128i reg;
+ };
+
+}
+
+#endif