aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
386 files changed, 2679 insertions, 2076 deletions
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