aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--botan_version.py2
-rwxr-xr-xconfigure.py42
-rw-r--r--doc/deprecated.txt12
-rw-r--r--doc/license.txt2
-rw-r--r--doc/manual/tls.rst174
-rw-r--r--doc/news.rst29
-rw-r--r--doc/security.rst18
-rw-r--r--doc/todo.rst5
-rw-r--r--readme.rst14
-rw-r--r--src/build-data/cc/clang.txt2
-rw-r--r--src/build-data/cc/gcc.txt2
-rw-r--r--src/build-data/policy/bsi.txt18
-rw-r--r--src/build-data/policy/modern.txt18
-rw-r--r--src/cli/credentials.h2
-rw-r--r--src/cli/pubkey.cpp2
-rw-r--r--src/cli/speed.cpp5
-rw-r--r--src/cli/tls_client.cpp38
-rw-r--r--src/cli/tls_proxy.cpp18
-rw-r--r--src/cli/tls_server.cpp23
-rw-r--r--src/cli/utils.cpp2
-rw-r--r--src/lib/asn1/oid_lookup/default.cpp24
-rw-r--r--src/lib/block/block_cipher.cpp60
-rw-r--r--src/lib/block/mars/info.txt1
-rw-r--r--src/lib/block/mars/mars.cpp392
-rw-r--r--src/lib/block/mars/mars.h35
-rw-r--r--src/lib/block/rc2/info.txt1
-rw-r--r--src/lib/block/rc2/rc2.cpp181
-rw-r--r--src/lib/block/rc2/rc2.h42
-rw-r--r--src/lib/block/rc5/info.txt1
-rw-r--r--src/lib/block/rc5/rc5.cpp133
-rw-r--r--src/lib/block/rc5/rc5.h42
-rw-r--r--src/lib/block/rc6/info.txt1
-rw-r--r--src/lib/block/rc6/rc6.cpp143
-rw-r--r--src/lib/block/rc6/rc6.h35
-rw-r--r--src/lib/block/safer/info.txt1
-rw-r--r--src/lib/block/safer/safer_sk.cpp255
-rw-r--r--src/lib/block/safer/safer_sk.h42
-rw-r--r--src/lib/block/tea/info.txt1
-rw-r--r--src/lib/block/tea/tea.cpp78
-rw-r--r--src/lib/block/tea/tea.h34
-rw-r--r--src/lib/block/xtea_simd/info.txt6
-rw-r--r--src/lib/block/xtea_simd/xtea_simd.cpp129
-rw-r--r--src/lib/block/xtea_simd/xtea_simd.h30
-rw-r--r--src/lib/cert/x509/key_constraint.cpp3
-rw-r--r--src/lib/cert/x509/x509_ca.h1
-rw-r--r--src/lib/cert/x509/x509cert.cpp32
-rw-r--r--src/lib/cert/x509/x509cert.h4
-rw-r--r--src/lib/hash/has160/has160.cpp162
-rw-r--r--src/lib/hash/has160/has160.h39
-rw-r--r--src/lib/hash/has160/info.txt5
-rw-r--r--src/lib/hash/hash.cpp24
-rw-r--r--src/lib/hash/md2/info.txt1
-rw-r--r--src/lib/hash/md2/md2.cpp112
-rw-r--r--src/lib/hash/md2/md2.h41
-rw-r--r--src/lib/hash/rmd128/info.txt5
-rw-r--r--src/lib/hash/rmd128/rmd128.cpp173
-rw-r--r--src/lib/hash/rmd128/rmd128.h38
-rw-r--r--src/lib/math/bigint/big_ops2.cpp6
-rw-r--r--src/lib/math/bigint/big_ops3.cpp5
-rw-r--r--src/lib/math/ec_gfp/curve_gfp.cpp19
-rw-r--r--src/lib/math/mp/mp_core.h13
-rw-r--r--src/lib/math/mp/mp_karat.cpp58
-rw-r--r--src/lib/math/mp/mp_monty.cpp25
-rw-r--r--src/lib/math/numbertheory/mp_numth.cpp16
-rw-r--r--src/lib/math/numbertheory/powm_mnt.cpp28
-rw-r--r--src/lib/pk_pad/hash_id/hash_id.cpp17
-rw-r--r--src/lib/prov/openssl/openssl_hash.cpp4
-rw-r--r--src/lib/pubkey/curve25519/donna.cpp76
-rw-r--r--src/lib/pubkey/if_algo/if_algo.cpp140
-rw-r--r--src/lib/pubkey/if_algo/if_algo.h107
-rw-r--r--src/lib/pubkey/if_algo/info.txt9
-rw-r--r--src/lib/pubkey/nr/info.txt8
-rw-r--r--src/lib/pubkey/nr/nr.cpp192
-rw-r--r--src/lib/pubkey/nr/nr.h57
-rw-r--r--src/lib/pubkey/pk_algs.cpp28
-rw-r--r--src/lib/pubkey/rsa/info.txt3
-rw-r--r--src/lib/pubkey/rsa/rsa.cpp130
-rw-r--r--src/lib/pubkey/rsa/rsa.h80
-rw-r--r--src/lib/pubkey/rw/info.txt7
-rw-r--r--src/lib/pubkey/rw/rw.cpp182
-rw-r--r--src/lib/pubkey/rw/rw.h61
-rw-r--r--src/lib/rng/hmac_rng/hmac_rng.cpp2
-rw-r--r--src/lib/stream/chacha/chacha.cpp160
-rw-r--r--src/lib/stream/chacha/chacha.h8
-rw-r--r--src/lib/stream/chacha/chacha_sse2/chacha_sse2.cpp259
-rw-r--r--src/lib/stream/chacha/chacha_sse2/info.txt3
-rw-r--r--src/lib/tls/info.txt1
-rw-r--r--src/lib/tls/msg_cert_verify.cpp2
-rw-r--r--src/lib/tls/msg_certificate.cpp2
-rw-r--r--src/lib/tls/msg_client_hello.cpp29
-rw-r--r--src/lib/tls/msg_client_kex.cpp11
-rw-r--r--src/lib/tls/msg_server_hello.cpp33
-rw-r--r--src/lib/tls/msg_server_kex.cpp2
-rw-r--r--src/lib/tls/tls_blocking.cpp14
-rw-r--r--src/lib/tls/tls_blocking.h5
-rw-r--r--src/lib/tls/tls_callbacks.h203
-rw-r--r--src/lib/tls/tls_channel.cpp278
-rw-r--r--src/lib/tls/tls_channel.h40
-rw-r--r--src/lib/tls/tls_ciphersuite.cpp7
-rw-r--r--src/lib/tls/tls_ciphersuite.h5
-rw-r--r--src/lib/tls/tls_client.cpp56
-rw-r--r--src/lib/tls/tls_client.h53
-rw-r--r--src/lib/tls/tls_extensions.cpp16
-rw-r--r--src/lib/tls/tls_extensions.h24
-rw-r--r--src/lib/tls/tls_handshake_msg.h4
-rw-r--r--src/lib/tls/tls_handshake_state.cpp10
-rw-r--r--src/lib/tls/tls_handshake_state.h14
-rw-r--r--src/lib/tls/tls_messages.h76
-rw-r--r--src/lib/tls/tls_policy.cpp103
-rw-r--r--src/lib/tls/tls_policy.h121
-rw-r--r--src/lib/tls/tls_record.cpp411
-rw-r--r--src/lib/tls/tls_record.h94
-rw-r--r--src/lib/tls/tls_server.cpp838
-rw-r--r--src/lib/tls/tls_server.h73
-rw-r--r--src/lib/tls/tls_session.cpp4
-rw-r--r--src/lib/tls/tls_session.h9
-rw-r--r--src/lib/utils/os_utils.cpp75
-rw-r--r--src/lib/utils/simd/simd_32.h10
-rwxr-xr-xsrc/scripts/ci/travis/after_success.sh6
-rw-r--r--src/tests/data/aead/eax.vec512
-rw-r--r--src/tests/data/block/mars.vec4337
-rw-r--r--src/tests/data/block/rc2.vec117
-rw-r--r--src/tests/data/block/rc5.vec350
-rw-r--r--src/tests/data/block/rc6.vec4877
-rw-r--r--src/tests/data/block/safer.vec49
-rw-r--r--src/tests/data/block/tea.vec153
-rw-r--r--src/tests/data/hash/has160.vec22
-rw-r--r--src/tests/data/hash/md2.vec226
-rw-r--r--src/tests/data/hash/parallel.vec3
-rw-r--r--src/tests/data/hash/ripemd128.vec24
-rw-r--r--src/tests/data/mac/hmac.vec42
-rw-r--r--src/tests/data/modes/cbc.vec13
-rw-r--r--src/tests/data/modes/ecb.vec156
-rw-r--r--src/tests/data/pbkdf/pbkdf1.vec25
-rw-r--r--src/tests/data/pubkey/nr.vec108
-rw-r--r--src/tests/data/pubkey/rsa_sig.vec35
-rw-r--r--src/tests/data/pubkey/rw_sig.vec114
-rw-r--r--src/tests/data/pubkey/rw_verify.vec45
-rw-r--r--src/tests/data/stream/chacha.vec100
-rw-r--r--src/tests/data/stream/ctr.vec286
-rw-r--r--src/tests/data/stream/salsa20.vec3
-rw-r--r--src/tests/test_nr.cpp69
-rw-r--r--src/tests/test_rw.cpp74
-rw-r--r--src/tests/test_stream.cpp7
-rw-r--r--src/tests/unit_tls.cpp635
-rw-r--r--src/tests/unit_x509.cpp4
-rw-r--r--tls-policy/BSI_TR-02102-2.txt19
147 files changed, 3172 insertions, 16300 deletions
diff --git a/botan_version.py b/botan_version.py
index c737e21a0..06fc6cf5c 100644
--- a/botan_version.py
+++ b/botan_version.py
@@ -1,7 +1,7 @@
release_major = 1
release_minor = 11
-release_patch = 31
+release_patch = 32
release_so_abi_rev = release_patch
# These are set by the distribution script
diff --git a/configure.py b/configure.py
index 82f30cd47..037d47d54 100755
--- a/configure.py
+++ b/configure.py
@@ -289,11 +289,15 @@ def process_command_line(args):
build_group.add_option('--gen-amalgamation', dest='gen_amalgamation',
default=False, action='store_true',
- help='generate amalgamation files')
+ help='generate amalgamation files and build without amalgamation (removed)')
build_group.add_option('--via-amalgamation', dest='via_amalgamation',
default=False, action='store_true',
- help='build via amalgamation')
+ help='build via amalgamation (deprecated, use --amalgamation)')
+
+ build_group.add_option('--amalgamation', dest='amalgamation',
+ default=False, action='store_true',
+ help='generate amalgamation files and build via amalgamation')
build_group.add_option('--single-amalgamation-file',
default=False, action='store_true',
@@ -478,6 +482,8 @@ Generic lexer function for info.txt and src/build-data files
"""
def lex_me_harder(infofile, to_obj, allowed_groups, name_val_pairs):
+ to_obj.infofile = infofile
+
# Format as a nameable Python variable
def py_var(group):
return group.replace(':', '_')
@@ -733,6 +739,19 @@ class ModulePolicyInfo(object):
lex_me_harder(infofile, self,
['required', 'if_available', 'prohibited'], {})
+ def cross_check(self, modules):
+
+ def check(tp, lst):
+ for mod in lst:
+ if mod not in modules:
+ logging.error("Module policy %s includes non-existent module %s in <%s>" % (
+ self.infofile, mod, tp))
+
+ check('required', self.required)
+ check('if_available', self.if_available)
+ check('prohibited', self.prohibited)
+
+
class ArchInfo(object):
def __init__(self, infofile):
lex_me_harder(infofile, self,
@@ -838,7 +857,6 @@ class CompilerInfo(object):
self.mach_abi_linking = force_to_dict(self.mach_abi_linking)
self.isa_flags = force_to_dict(self.isa_flags)
- self.infofile = infofile
self.mach_opt_flags = {}
while self.mach_opt != []:
@@ -1887,6 +1905,9 @@ def main(argv = None):
module_policies = load_build_data('module policy', 'policy', ModulePolicyInfo)
+ for policy in module_policies.values():
+ policy.cross_check(modules)
+
if options.list_modules:
for k in sorted(modules.keys()):
print(k)
@@ -1984,8 +2005,12 @@ def main(argv = None):
logging.info('Found sphinx-build (use --without-sphinx to disable)')
options.with_sphinx = True
+ if options.gen_amalgamation:
+ raise Exception("--gen-amalgamation was removed. Migrate to --amalgamation.")
+
if options.via_amalgamation:
- options.gen_amalgamation = True
+ logging.warn("--via-amalgamation is deprecated. Use --amalgamation.")
+ options.amalgamation = True
if options.build_shared_lib and not osinfo.building_shared_supported:
raise Exception('Botan does not support building as shared library on the target os. '
@@ -2095,11 +2120,10 @@ def main(argv = None):
with open(os.path.join(build_config.build_dir, 'build_config.py'), 'w') as f:
f.write(str(template_vars))
- if options.gen_amalgamation:
- fs = generate_amalgamation(build_config, options)
- if options.via_amalgamation:
- build_config.build_sources = fs
- gen_makefile_lists(template_vars, build_config, options, using_mods, cc, arch, osinfo)
+ if options.amalgamation:
+ amalgamation_cpp_files = generate_amalgamation(build_config, options)
+ build_config.build_sources = amalgamation_cpp_files
+ gen_makefile_lists(template_vars, build_config, options, using_mods, cc, arch, osinfo)
write_template(template_vars['makefile_path'], makefile_template)
diff --git a/doc/deprecated.txt b/doc/deprecated.txt
index d62954d1d..ff89a85d2 100644
--- a/doc/deprecated.txt
+++ b/doc/deprecated.txt
@@ -3,17 +3,7 @@ Currently deprecated:
- PRNGs X9.31 (no longer approved) and HMAC_RNG (non-standard)
Use HMAC_DRBG
-- ECB mode for block ciphers
-
-- Rabin-Williams signatures
-
-- Nyberg-Rueppel signatures
-
-- MARS, RC2, RC5, RC6, SAFER, TEA
-
-- ECB Cipher_Mode
-
-- MD2, HAS-160, RIPEMD-128
+- ECB Cipher_Mode for block ciphers
- 3DES and SEED ciphersuites in TLS
diff --git a/doc/license.txt b/doc/license.txt
index b097646e8..88b16651c 100644
--- a/doc/license.txt
+++ b/doc/license.txt
@@ -31,6 +31,8 @@ Copyright (C) 1999-2013,2014,2015,2016 Jack Lloyd
2015,2016 Kai Michaelis
2016 Simon Cogliani
2015,2016 Rohde & Schwarz Cybersecurity
+ 2016 Juraj Somorovsky
+ 2016 Christian Mainka
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/manual/tls.rst b/doc/manual/tls.rst
index a10a4280c..6c1ca42f2 100644
--- a/doc/manual/tls.rst
+++ b/doc/manual/tls.rst
@@ -22,44 +22,62 @@ instance, by reading from a network socket) it passes that information
to TLS using :cpp:func:`TLS::Channel::received_data`. If the data
passed in results in some change in the state, such as a handshake
completing, or some data or an alert being received from the other
-side, then a user provided callback will be invoked. If the reader is
-familiar with OpenSSL's BIO layer, it might be analagous to saying the
-only way of interacting with Botan's TLS is via a `BIO_mem` I/O
+side, then the appropriate user provided callback will be invoked.
+
+If the reader is familiar with OpenSSL's BIO layer, it might be analagous
+to saying the only way of interacting with Botan's TLS is via a `BIO_mem` I/O
abstraction. This makes the library completely agnostic to how you
write your network layer, be it blocking sockets, libevent, asio, a
-message queue, etc.
+message queue, lwIP on RTOS, some carrier pidgeons, etc.
-The callbacks for TLS have the signatures
+Starting in 1.11.31, the application callbacks are encapsulated as the class
+``TLS::Callbacks`` with the following members. The first four (``tls_emit_data``,
+``tls_record_received``, ``tls_alert``, and ``tls_session_established``) are
+mandatory for using TLS, all others are optional and provide additional
+information about the connection.
- .. cpp:function:: void output_fn(const byte data[], size_t data_len)
+ .. cpp:function:: void tls_emit_data(const byte data[], size_t data_len)
- TLS requests that all bytes of *data* be queued up to send to the
- counterparty. After this function returns, *data* will be
- overwritten, so a copy of the input must be made if the callback
+ Mandatory. The TLS stack requests that all bytes of *data* be queued up to send to the
+ counterparty. After this function returns, the buffer containing *data* will
+ be overwritten, so a copy of the input must be made if the callback
cannot send the data immediately.
- .. cpp:function:: void data_cb(const byte data[], size_t data_len)
+ As an example you could ``send`` to perform a blocking write on a socket,
+ or append the data to a queue managed by your application, and initiate
+ an asyncronous write.
+
+ For TLS all writes must occur *in the order requested*.
+ For DTLS this ordering is not strictly required, but is still recommended.
+
+ .. cpp:function:: void tls_record_received(uint64_t rec_no, const byte data[], size_t data_len)
+
+ Mandatory. Called once for each application_data record which is received, with the
+ matching (TLS level) record sequence number.
+
+ Currently empty records are ignored and do not instigate a callback,
+ but this may change in a future release.
+
+ As with ``tls_emit_data``, the array will be overwritten sometime after
+ the callback returns, so a copy should be made if needed.
- Called whenever application data is received from the other side
- of the connection, in which case *data* and *data_len* specify
- the data received. This array will be overwritten sometime after
- the callback returns, so again a copy should be made if need be.
+ For TLS the record number will always increase.
- .. cpp:function:: void alert_cb(Alert alert, const byte data[], size_t data_len)
+ For DTLS, it is possible to receive records with the `rec_no` field
+ field out of order or repeated. It is even possible (from a malicious or
+ faulty peer) to receive multiple copies of a single record with differing plaintexts.
- Called when an alert is received. Normally, data is null and
- data_len is 0, as most alerts have no associated data. However,
- if TLS heartbeats (see :rfc:`6520`) were negotiated, and we
- initiated a heartbeat, then if/when the other party responds,
- ``alert_cb`` will be called with whatever data was included in
- the heartbeat response (if any) along with a psuedo-alert value
- of ``HEARTBEAT_PAYLOAD``.
+ .. cpp:function:: void tls_alert(Alert alert)
- .. cpp:function:: bool handshake_cb(const TLS::Session& session)
+ Mandatory. Called when an alert is received from the peer. Note that alerts
+ received before the handshake is complete are not authenticated and
+ could have been inserted by a MITM attacker.
+
+ .. cpp:function:: bool tls_session_established(const TLS::Session& session)
- Called whenever a negotiation completes. This can happen more
- than once on any connection. The *session* parameter provides
- information about the session which was established.
+ Mandatory. Called whenever a negotiation completes. This can happen more
+ than once on any connection, if renegotiation occurs. The *session* parameter
+ provides information about the session which was just established.
If this function returns false, the session will not be cached
for later resumption.
@@ -68,8 +86,29 @@ The callbacks for TLS have the signatures
exception which will send a close message to the counterparty and
reset the connection state.
-You can of course use tools like ``std::bind`` to bind additional
-parameters to your callback functions.
+ .. cpp:function:: std::string tls_server_choose_app_protocol(const std::vector<std::string>& client_protos)
+
+ Optional. Called by the server when a client includes a list of protocols in the ALPN extension.
+ The server then choose which protocol to use, or "" to disable sending any ALPN response.
+ The default implementation returns the empty string all of the time, effectively disabling
+ ALPN responses.
+
+ .. cpp:function:: void tls_inspect_handshake_msg(const Handshake_Message&)
+
+ This callback is optional, and can be used to inspect all handshake messages
+ while the session establishment occurs.
+
+ .. cpp:function:: void tls_log_debug(const char*)
+
+ This callback is for exerimental purposes and currently unused. It may be
+ removed or modified in a future release.
+
+Versions from 1.11.0 to 1.11.30 did not have ``TLS::Callbacks` and instead
+used independent std::functions to pass the various callback functions.
+This interface is currently still included but is deprecated and will be removed
+in a future release. For the documentation for this interface, please check
+the docs for 1.11.30. This version of the manual only documents the new interface
+added in 1.11.31.
TLS Channels
----------------------------------------
@@ -80,16 +119,6 @@ available:
.. cpp:class:: TLS::Channel
- .. cpp:type:: std::function<void (const byte[], size_t)> output_fn
-
- .. cpp:type:: std::function<void (const byte[], size_t)> data_cb
-
- .. cpp:type:: std::function<void (Alert, const byte[], size_t)> alert_cb
-
- .. cpp:type:: std::function<bool (const Session&)> handshake_cb
-
- Typedefs used in the code for the functions described above
-
.. cpp:function:: size_t received_data(const byte buf[], size_t buf_size)
.. cpp:function:: size_t received_data(const std::vector<byte>& buf)
@@ -194,10 +223,7 @@ TLS Clients
.. cpp:class:: TLS::Client
.. cpp:function:: Client( \
- output_fn out, \
- data_cb app_data_cb, \
- alert_cb alert_cb, \
- handshake_cb hs_cb, \
+ Callbacks& callbacks,
Session_Manager& session_manager, \
Credentials_Manager& creds, \
const Policy& policy, \
@@ -211,29 +237,8 @@ TLS Clients
Initialize a new TLS client. The constructor will immediately
initiate a new session.
- The *output_fn* callback will be called with output that
- should be sent to the counterparty. For instance this will be
- called immediately from the constructor after the client hello
- message is constructed. An implementation of *output_fn* is
- allowed to defer the write (for instance if writing when the
- callback occurs would block), but should eventually write the data
- to the counterparty *in order*.
-
- The *data_cb* will be called with data sent by the counterparty
- after it has been processed. The byte array and size_t represent
- the plaintext value and size.
-
- The *alert_cb* will be called when a protocol alert is received,
- commonly with a close alert during connection teardown.
-
- The *handshake_cb* function is called when a handshake
- (either initial or renegotiation) is completed. The return value of
- the callback specifies if the session should be cached for later
- resumption. If the function for some reason desires to prevent the
- connection from completing, it should throw an exception
- (preferably a TLS::Exception, which can provide more specific alert
- information to the counterparty). The :cpp:class:`TLS::Session`
- provides information about the session that was just established.
+ The *callbacks* parameter specifies the various application callbacks
+ which pertain to this particular client connection.
The *session_manager* is an interface for storing TLS sessions,
which allows for session resumption upon reconnecting to a server.
@@ -285,34 +290,30 @@ TLS Servers
.. cpp:class:: TLS::Server
.. cpp:function:: Server( \
- output_fn output, \
- data_cb data_cb, \
- alert_cb alert_cb, \
- handshake_cb handshake_cb, \
+ Callbacks& callbacks,
Session_Manager& session_manager, \
Credentials_Manager& creds, \
const Policy& policy, \
RandomNumberGenerator& rng, \
- next_protocol_fn next_proto = next_protocol_fn(), \
bool is_datagram = false, \
size_t reserved_io_buffer_size = 16*1024 \
)
-The first 8 arguments as well as the final argument
+The first 5 arguments as well as the final argument
*reserved_io_buffer_size*, are treated similiarly to the :ref:`client
<tls_client>`.
-The (optional) argument, *proto_chooser*, is a function called if the
-client sent the ALPN extension to negotiate an application
-protocol. In that case, the function should choose a protocol to use
-and return it. Alternately it can throw an exception to abort the
-exchange; the ALPN specification says that if this occurs the alert
-should be of type `NO_APPLICATION_PROTOCOL`.
+If a client sends the ALPN extension, the ``callbacks`` function
+``tls_server_choose_app_protocol`` will be called and the result
+sent back to the client. If the empty string is returned, the server
+will not send an ALPN response. The function can also throw an exception
+to abort the handshake entirely, the ALPN specification says that if this
+occurs the alert should be of type `NO_APPLICATION_PROTOCOL`.
The optional argument *is_datagram* specifies if this is a TLS or DTLS
server; unlike clients, which know what type of protocol (TLS vs DTLS)
they are negotiating from the start via the *offer_version*, servers
-would not until they actually received a hello without this parameter.
+would not until they actually received a client hello.
Code for a TLS server using asio is in `src/cli/tls_proxy.cpp`.
@@ -516,7 +517,7 @@ policy settings from a file.
Values without an explicit mode use old-style CBC with HMAC encryption.
Default value: "AES-256/GCM", "AES-128/GCM", "ChaCha20Poly1305",
- "AES-256/CCM", "AES-128/CCM", "AES-256/CCM-8", "AES-128/CCM-8",
+ "AES-256/CCM", "AES-128/CCM", "AES-256/CCM(8)", "AES-128/CCM(8)",
"AES-256", "AES-128"
Also allowed: "Camellia-256/GCM", "Camellia-128/GCM",
@@ -529,15 +530,18 @@ policy settings from a file.
.. note::
- The current ChaCha20Poly1305 ciphersuites are non-standard but
- as of 2015 were implemented and deployed by Google and
- elsewhere. Support will be changed to using IETF standard
- ChaCha20Poly1305 ciphersuites when those are defined.
+ Before 1.11.30 only the non-standard ChaCha20Poly1305 ciphersuite
+ was implemented. The RFC 7905 ciphersuites are supported in 1.11.30
+ onwards.
.. note::
Support for the broken RC4 cipher was removed in 1.11.17
+ .. note::
+
+ SEED and 3DES are deprecated and will be removed in a future release.
+
.. cpp:function:: std::vector<std::string> allowed_macs() const
Returns the list of algorithms we are willing to use for
@@ -577,6 +581,10 @@ policy settings from a file.
Also allowed (disabled by default): "" (meaning anonymous)
+ .. note::
+
+ DSA authentication is deprecated and will be removed in a future release.
+
.. cpp:function:: std::vector<std::string> allowed_ecc_curves() const
Return a list of ECC curves we are willing to use, in order of preference.
diff --git a/doc/news.rst b/doc/news.rst
index 5837a8af9..d4f1f090b 100644
--- a/doc/news.rst
+++ b/doc/news.rst
@@ -1,7 +1,28 @@
Release Notes
========================================
-Version 1.11.31, Not Yet Released
+Version 1.11.32, Not Yet Released
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+* Add support for TLS Encrypt-then-MAC extension (GH #492 and #578)
+ which fixes the known issues in the TLS CBC-HMAC construction.
+
+* Add a new TLS Callbacks interface. Compatability with previous
+ versions is maintained. GH #457 and #567
+
+* The deprecated algorithms Rabin-Williams, Nyberg-Rueppel, MARS, RC2,
+ RC5, RC6, SAFER-SK, TEA, MD2, HAS-160, and RIPEMD-128 have been
+ removed. GH #580
+
+* The HMAC_RNG constructor added in 1.11.31 that took both an RNG and an
+ entropy source list ignored the entropy sources.
+
+* The configure option ``--via-algamation`` was renamed to ``--amalgamation``.
+ The configure option ``--gen-algamation`` was removed. It did generate
+ amalgamations but build Botan without amalgamation. Users should migrate to
+ ``--amalgamation``. GH #621
+
+Version 1.11.31, 2016-08-30
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Fix undefined behavior in Curve25519 on platforms without a native 128-bit
@@ -23,13 +44,15 @@ Version 1.11.31, Not Yet Released
XOR-encrypion/decryption mode it's now possible to use DLIES with a
block cipher. Furthermore the order of the output was changed from
{public key, tag, ciphertext} to {public key, ciphertext, tag}. Both
- modes are compatible with bouncycastle.
+ modes are compatible with BouncyCastle.
* Add initial PKCS #11 support (GH #507). Currently includes a low level
wrapper to all of PKCS #11 (p11.h) and high level code for RSA and ECDSA
signatures and hardware RNG access.
-* Add ECKCDSA signature algorithm (#504)
+* Add ECIES encryption scheme, compatible with BouncyCastle (GH #483)
+
+* Add ECKCDSA signature algorithm (GH #504)
* Add KDF1 from ISO 18033 (GH #483)
diff --git a/doc/security.rst b/doc/security.rst
index 23b46f30d..6223943e0 100644
--- a/doc/security.rst
+++ b/doc/security.rst
@@ -19,6 +19,24 @@ Advisories
2016
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+* 2016-08-30 (CVE-2016-6878) Undefined behavior in Curve25519
+
+ On systems without a native 128-bit integer type, the Curve25519 code invoked
+ undefined behavior. This was known to produce incorrect results on 32-bit ARM
+ when compiled by Clang.
+
+ Introduced in 1.11.12, fixed in 1.11.31
+
+* 2016-08-30 (CVE-2016-6879) Bad result from X509_Certificate::allowed_usage
+
+ If allowed_usage was called with more than one Key_Usage set in the enum
+ value, the function would return true if *any* of the allowed usages were set,
+ instead of if *all* of the allowed usages are set. This could be used to
+ bypass an application key usage check. Credit to Daniel Neus of Rohde &
+ Schwarz Cybersecurity for finding this issue.
+
+ Introduced in 1.11.0, fixed in 1.11.31
+
* 2016-03-17 (CVE-2016-2849): ECDSA side channel
ECDSA (and DSA) signature algorithms perform a modular inverse on the
diff --git a/doc/todo.rst b/doc/todo.rst
index b6c55a898..f4720f3ba 100644
--- a/doc/todo.rst
+++ b/doc/todo.rst
@@ -22,7 +22,6 @@ CLI
for an example
* `encrypt` / `decrypt` tools providing password and/or public key
based file encryption
-* `bcrypt` cmdlet
* Make help output more helpful
* More microbenchmarks in `speed`: modular exponentiation, ECC point
multiplication, other BigInt operations
@@ -33,7 +32,9 @@ TLS
* Make DTLS support optional at build time
* Make TLS v1.0 and v1.1 optional at build time
+* Make finite field DH optional at build time
* Curve25519 key exchange
+* NEWHOPE (CECPQ1) key exchange (GH #613)
* TLS OCSP stapling (RFC 6066)
* Encrypt-then-MAC extension (RFC 7366)
* Authentication using TOFU (sqlite3 storage)
@@ -47,6 +48,7 @@ TLS
PKIX
----------------------------------------
+* Test suite for validation of 'real world' cert chains (GH #611)
* Support multiple DNS names in certificates
* X.509 policy constraints
* OCSP responder logic
@@ -109,7 +111,6 @@ Public Key Crypto, Math
* XMSS (draft-irtf-cfrg-xmss-hash-based-signatures)
* SPHINCS-256
-* NEWHOPE RLWE scheme + BoringSSL compatible TLS cipher suites
* EdDSA (GH #283)
* Ed448-Goldilocks
* FHMQV
diff --git a/readme.rst b/readme.rst
index 2f6134ba8..29547a098 100644
--- a/readme.rst
+++ b/readme.rst
@@ -100,9 +100,9 @@ Versions 1.11 and later require a working C++11 compiler; GCC 4.8 and
later, Clang 3.4 and later, and MSVC 2013 are regularly tested.
The latest development release is
-`1.11.30 <http://botan.randombit.net/releases/Botan-1.11.30.tgz>`_
-`(sig) <http://botan.randombit.net/releases/Botan-1.11.30.tgz.asc>`_
-released on 2016-06-19
+`1.11.31 <http://botan.randombit.net/releases/Botan-1.11.31.tgz>`_
+`(sig) <http://botan.randombit.net/releases/Botan-1.11.31.tgz.asc>`_
+released on 2016-08-30
Old Stable Series (1.10)
----------------------------------------
@@ -169,8 +169,6 @@ Public Key Cryptography
* Quantum computer resistant McEliece KEM scheme
* GOST-34.10-2001
* ElGamal encryption
-* Rabin-Williams signatures (deprecated)
-* Nyberg-Rueppel signatures (deprecated)
* Padding schemes OAEP, PSS, PKCS #1 v1.5, X9.31
Ciphers and cipher modes
@@ -179,13 +177,12 @@ Ciphers and cipher modes
* Authenticated cipher modes EAX, OCB, GCM, SIV, CCM, and ChaCha20Poly1305
* Unauthenticated cipher modes CTR, CBC, XTS, CFB, OFB, and ECB
* AES (including constant time SSSE3 and AES-NI versions)
-* AES candidates Serpent, Twofish, MARS, CAST-256, RC6
+* AES candidates Serpent, Twofish, CAST-256
* Stream ciphers Salsa20/XSalsa20, ChaCha20, and RC4
* DES, 3DES and DESX
-* Threefish-512, Noekeon, Blowfish, CAST-128, IDEA
+* Threefish-512, Noekeon, Blowfish, CAST-128, IDEA, XTEA
* National/telecom block ciphers SEED, KASUMI, MISTY1, GOST 28147
* Large block cipher construction Lion
-* Deprecated ciphers TEA, XTEA, RC2, RC5, SAFER-SK
Hash functions and MACs
----------------------------------------
@@ -198,7 +195,6 @@ Hash functions and MACs
* Hash function combiners (Parallel and Comb4P)
* Non-cryptographic checksums Adler32, CRC24, CRC32
* Obsolete algorithms MD5, MD4, CBC-MAC, X9.19 DES-MAC
-* Deprecated hashes MD2, HAS-160, RIPEMD-128
Other Useful Things
----------------------------------------
diff --git a/src/build-data/cc/clang.txt b/src/build-data/cc/clang.txt
index d6e3ecfe3..8c5baf7ca 100644
--- a/src/build-data/cc/clang.txt
+++ b/src/build-data/cc/clang.txt
@@ -11,7 +11,7 @@ add_framework_option "-framework "
lang_flags "-std=c++11 -D_REENTRANT -fstack-protector"
warning_flags "-Wall -Wextra -Wpedantic -Wshadow -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual -Wunreachable-code"
-maintainer_warning_flags "-Qunused-arguments -Werror -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=unreachable-code"
+maintainer_warning_flags "-Qunused-arguments -Werror -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=unreachable-code -Wno-error=deprecated-declarations"
compile_flags "-c"
debug_info_flags "-g"
diff --git a/src/build-data/cc/gcc.txt b/src/build-data/cc/gcc.txt
index d3473454b..7d795d4e1 100644
--- a/src/build-data/cc/gcc.txt
+++ b/src/build-data/cc/gcc.txt
@@ -12,7 +12,7 @@ lang_flags "-std=c++11 -D_REENTRANT"
# This should only contain flags which are included in GCC 4.8
warning_flags "-Wall -Wextra -Wpedantic -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual -Wzero-as-null-pointer-constant -Wnon-virtual-dtor"
-maintainer_warning_flags "-Wold-style-cast -Wsuggest-override -Wshadow -Werror -Wno-error=old-style-cast -Wno-error=zero-as-null-pointer-constant -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=strict-overflow"
+maintainer_warning_flags "-Wold-style-cast -Wsuggest-override -Wshadow -Werror -Wno-error=old-style-cast -Wno-error=zero-as-null-pointer-constant -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=strict-overflow -Wno-error=deprecated-declarations"
compile_flags "-c"
debug_info_flags "-g"
diff --git a/src/build-data/policy/bsi.txt b/src/build-data/policy/bsi.txt
index 048f63892..16671fd13 100644
--- a/src/build-data/policy/bsi.txt
+++ b/src/build-data/policy/bsi.txt
@@ -58,7 +58,6 @@ beos_stats
cryptoapi_rng
darwin_secrandom
dev_random
-hres_timer
proc_walk
rdrand
rdseed
@@ -70,9 +69,7 @@ system_rng
# utils
locking_allocator
-simd_altivec
-simd_scalar
-simd_sse2
+simd
</if_available>
<prohibited>
@@ -86,23 +83,16 @@ idea
idea_sse2
kasumi
lion
-mars
misty1
noekeon
noekeon_simd
-rc2
-rc5
-rc6
-safer
seed
serpent
serpent_simd
-tea
threefish
threefish_avx2
twofish
xtea
-xtea_simd
# modes
ccm
@@ -130,9 +120,7 @@ elgamal
gost_3410
mce
mceies
-nr
rfc6979
-rw
# pk_pad
#eme_pkcs1 // needed for tls
@@ -140,17 +128,13 @@ eme_raw
#emsa_pkcs1 // needed for tls
emsa_raw
emsa_x931
-emsa1_bsi
# hash
blake2
comb4p
gost_3411
-has160
-md2
md4
#md5 // needed for tls
-rmd128
rmd160
#sha1 // needed for tls
#sha1_sse2 // needed for tls
diff --git a/src/build-data/policy/modern.txt b/src/build-data/policy/modern.txt
index a98ec5077..2bcd64066 100644
--- a/src/build-data/policy/modern.txt
+++ b/src/build-data/policy/modern.txt
@@ -56,9 +56,7 @@ aes_ssse3
serpent_simd
threefish_avx2
-simd_scalar
-simd_sse2
-simd_altivec
+simd
rdrand_rng
system_rng
@@ -68,7 +66,6 @@ beos_stats
cryptoapi_rng
darwin_secrandom
dev_random
-hres_timer
proc_walk
rdrand
rdseed
@@ -83,27 +80,17 @@ idea
idea_sse2
kasumi
lion
-mars
misty1
-rc2
rc4
-rc5
-rc6
-safer
seed
-tea
xtea
-xtea_simd
cbc_mac
x919_mac
# MD5 and SHA1 are broken but not prohibited. They are widely in use
# in non-crypto contexts and are required by TLS currently
-md2
md4
-rmd128
-has160
gost_3411
cfb
@@ -111,8 +98,6 @@ ecb
ofb
elgamal
-rw
-nr
gost_3410
emsa_x931
@@ -127,4 +112,3 @@ cryptobox
egd
unix_procs
</prohibited>
-
diff --git a/src/cli/credentials.h b/src/cli/credentials.h
index 11bfd3de1..95bbd5aa4 100644
--- a/src/cli/credentials.h
+++ b/src/cli/credentials.h
@@ -62,7 +62,7 @@ class Basic_Credentials_Manager : public Botan::Credentials_Manager
try
{
// TODO: make path configurable
- const std::vector<std::string> paths = { "/usr/share/ca-certificates" };
+ const std::vector<std::string> paths = { "/etc/ssl/certs", "/usr/share/ca-certificates" };
for(auto&& path : paths)
{
diff --git a/src/cli/pubkey.cpp b/src/cli/pubkey.cpp
index a482b6e46..456ebbc8b 100644
--- a/src/cli/pubkey.cpp
+++ b/src/cli/pubkey.cpp
@@ -156,8 +156,6 @@ std::string algo_default_emsa(const std::string& key)
return "EMSA4"; // PSS
else if(key == "ECDSA" || key == "DSA")
return "EMSA1";
- else if(key == "RW")
- return "EMSA2";
else
return "EMSA1";
}
diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp
index 10408a5ae..f1c193ba6 100644
--- a/src/cli/speed.cpp
+++ b/src/cli/speed.cpp
@@ -533,10 +533,11 @@ class Speed final : public Command
Timer encrypt_timer(cipher.name(), provider, "encrypt", buffer.size());
+ const Botan::SymmetricKey key(rng(), cipher.maximum_keylength());
+ cipher.set_key(key);
+
while(encrypt_timer.under(runtime))
{
- const Botan::SymmetricKey key(rng(), cipher.maximum_keylength());
- cipher.set_key(key);
encrypt_timer.run([&] { cipher.encipher(buffer); });
}
diff --git a/src/cli/tls_client.cpp b/src/cli/tls_client.cpp
index 6af2f56f8..caf7d4a1f 100644
--- a/src/cli/tls_client.cpp
+++ b/src/cli/tls_client.cpp
@@ -1,5 +1,6 @@
/*
* (C) 2014,2015 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -35,7 +36,7 @@
namespace Botan_CLI {
-class TLS_Client final : public Command
+class TLS_Client final : public Command, public Botan::TLS::Callbacks
{
public:
TLS_Client() : Command("tls_client host --port=443 --print-certs --policy= "
@@ -98,15 +99,10 @@ class TLS_Client final : public Command
const std::vector<std::string> protocols_to_offer = Botan::split_on("next-protocols", ',');
- int sockfd = connect_to_host(host, port, use_tcp);
+ m_sockfd = connect_to_host(host, port, use_tcp);
using namespace std::placeholders;
- auto socket_write =
- use_tcp ?
- std::bind(stream_socket_write, sockfd, _1, _2) :
- std::bind(dgram_socket_write, sockfd, _1, _2);
-
auto version = policy->latest_supported_version(!use_tcp);
if(flag_set("tls1.0"))
@@ -118,10 +114,7 @@ class TLS_Client final : public Command
version = Botan::TLS::Protocol_Version::TLS_V11;
}
- Botan::TLS::Client client(socket_write,
- std::bind(&TLS_Client::process_data, this, _1, _2),
- std::bind(&TLS_Client::alert_received, this, _1, _2, _3),
- std::bind(&TLS_Client::handshake_complete, this, _1),
+ Botan::TLS::Client client(*this,
*session_mgr,
creds,
*policy,
@@ -136,7 +129,7 @@ class TLS_Client final : public Command
{
fd_set readfds;
FD_ZERO(&readfds);
- FD_SET(sockfd, &readfds);
+ FD_SET(m_sockfd, &readfds);
if(client.is_active())
{
@@ -152,13 +145,13 @@ class TLS_Client final : public Command
struct timeval timeout = { 1, 0 };
- ::select(sockfd + 1, &readfds, nullptr, nullptr, &timeout);
+ ::select(m_sockfd + 1, &readfds, nullptr, nullptr, &timeout);
- if(FD_ISSET(sockfd, &readfds))
+ if(FD_ISSET(m_sockfd, &readfds))
{
uint8_t buf[4*1024] = { 0 };
- ssize_t got = ::read(sockfd, buf, sizeof(buf));
+ ssize_t got = ::read(m_sockfd, buf, sizeof(buf));
if(got == 0)
{
@@ -216,7 +209,7 @@ class TLS_Client final : public Command
}
}
- ::close(sockfd);
+ ::close(m_sockfd);
}
private:
@@ -256,7 +249,7 @@ class TLS_Client final : public Command
return fd;
}
- bool handshake_complete(const Botan::TLS::Session& session)
+ bool tls_session_established(const Botan::TLS::Session& session) override
{
output() << "Handshake complete, " << session.version().to_string()
<< " using " << session.ciphersuite().to_string() << "\n";
@@ -290,13 +283,13 @@ class TLS_Client final : public Command
throw CLI_Error("Socket write failed errno=" + std::to_string(errno));
}
- static void stream_socket_write(int sockfd, const uint8_t buf[], size_t length)
+ void tls_emit_data(const uint8_t buf[], size_t length) override
{
size_t offset = 0;
while(length)
{
- ssize_t sent = ::send(sockfd, (const char*)buf + offset,
+ ssize_t sent = ::send(m_sockfd, (const char*)buf + offset,
length, MSG_NOSIGNAL);
if(sent == -1)
@@ -312,16 +305,19 @@ class TLS_Client final : public Command
}
}
- void alert_received(Botan::TLS::Alert alert, const uint8_t [], size_t )
+ void tls_alert(Botan::TLS::Alert alert) override
{
output() << "Alert: " << alert.type_string() << "\n";
}
- void process_data(const uint8_t buf[], size_t buf_size)
+ void tls_record_received(uint64_t /*seq_no*/, const uint8_t buf[], size_t buf_size) override
{
for(size_t i = 0; i != buf_size; ++i)
output() << buf[i];
}
+
+ private:
+ int m_sockfd;
};
BOTAN_REGISTER_COMMAND("tls_client", TLS_Client);
diff --git a/src/cli/tls_proxy.cpp b/src/cli/tls_proxy.cpp
index 2929e473d..5140654de 100644
--- a/src/cli/tls_proxy.cpp
+++ b/src/cli/tls_proxy.cpp
@@ -1,6 +1,7 @@
/*
* TLS Server Proxy
* (C) 2014,2015 Jack Lloyd
+* (C) 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -59,7 +60,7 @@ void log_text_message(const char* where, const uint8_t buf[], size_t buf_len)
//std::cout << where << ' ' << std::string(c, c + buf_len) << std::endl;
}
-class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_session>
+class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_session>, public Botan::TLS::Callbacks
{
public:
enum { readbuf_size = 4 * 1024 };
@@ -111,10 +112,7 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio
m_server_endpoints(endpoints),
m_client_socket(io),
m_server_socket(io),
- m_tls(boost::bind(&tls_proxy_session::tls_proxy_write_to_client, this, _1, _2),
- boost::bind(&tls_proxy_session::tls_client_write_to_proxy, this, _1, _2),
- boost::bind(&tls_proxy_session::tls_alert_cb, this, _1, _2, _3),
- boost::bind(&tls_proxy_session::tls_handshake_complete, this, _1),
+ m_tls(*this,
session_manager,
credentials,
policy,
@@ -167,7 +165,7 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio
{
m_client_socket.close();
}
- tls_proxy_write_to_client(nullptr, 0); // initiate another write if needed
+ tls_emit_data(nullptr, 0); // initiate another write if needed
}
void handle_server_write_completion(const boost::system::error_code& error)
@@ -183,13 +181,13 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio
proxy_write_to_server(nullptr, 0); // initiate another write if needed
}
- void tls_client_write_to_proxy(const uint8_t buf[], size_t buf_len)
+ void tls_record_received(uint64_t /*rec_no*/, const uint8_t buf[], size_t buf_len) override
{
// Immediately bounce message to server
proxy_write_to_server(buf, buf_len);
}
- void tls_proxy_write_to_client(const uint8_t buf[], size_t buf_len)
+ void tls_emit_data(const uint8_t buf[], size_t buf_len) override
{
if(buf_len > 0)
m_p2c_pending.insert(m_p2c_pending.end(), buf, buf + buf_len);
@@ -268,7 +266,7 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio
boost::asio::placeholders::bytes_transferred)));
}
- bool tls_handshake_complete(const Botan::TLS::Session& session)
+ bool tls_session_established(const Botan::TLS::Session& session) override
{
//std::cout << "Handshake from client complete" << std::endl;
@@ -292,7 +290,7 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio
return true;
}
- void tls_alert_cb(Botan::TLS::Alert alert, const uint8_t[], size_t)
+ void tls_alert(Botan::TLS::Alert alert) override
{
if(alert.type() == Botan::TLS::Alert::CLOSE_NOTIFY)
{
diff --git a/src/cli/tls_server.cpp b/src/cli/tls_server.cpp
index 2496f5508..7fc38cf31 100644
--- a/src/cli/tls_server.cpp
+++ b/src/cli/tls_server.cpp
@@ -33,7 +33,7 @@ namespace Botan_CLI {
class TLS_Server final : public Command
{
public:
- TLS_Server() : Command("tls_server cert key --port=443 --type=tcp") {}
+ TLS_Server() : Command("tls_server cert key --port=443 --type=tcp --policy=") {}
void go() override
{
@@ -47,7 +47,24 @@ class TLS_Server final : public Command
const bool is_tcp = (transport == "tcp");
- Botan::TLS::Policy policy; // TODO read policy from file
+ std::unique_ptr<Botan::TLS::Policy> policy;
+ const std::string policy_file = get_arg("policy");
+ std::filebuf fb;
+ if(policy_file.size() > 0)
+ {
+ std::ifstream policy_stream(policy_file);
+ if(!policy_stream.good())
+ {
+ error_output() << "Failed reading policy file\n";
+ return;
+ }
+ policy.reset(new Botan::TLS::Text_Policy(policy_stream));
+ }
+
+ if(!policy)
+ {
+ policy.reset(new Botan::TLS::Policy);
+ }
Botan::TLS::Session_Manager_In_Memory session_manager(rng()); // TODO sqlite3
@@ -112,7 +129,7 @@ class TLS_Server final : public Command
std::bind(&TLS_Server::handshake_complete, this, _1),
session_manager,
creds,
- policy,
+ *policy,
rng(),
protocol_chooser,
!is_tcp);
diff --git a/src/cli/utils.cpp b/src/cli/utils.cpp
index 610a14dc1..5ec8f295e 100644
--- a/src/cli/utils.cpp
+++ b/src/cli/utils.cpp
@@ -266,7 +266,7 @@ class Generate_Bcrypt final : public Command
void go() override
{
const std::string password = get_arg("password");
- const size_t wf = get_arg_sz("work_factor");
+ const size_t wf = get_arg_sz("work-factor");
output() << Botan::generate_bcrypt(password, rng(), wf) << "\n";
}
diff --git a/src/lib/asn1/oid_lookup/default.cpp b/src/lib/asn1/oid_lookup/default.cpp
index 0d64a8bef..6527b3b25 100644
--- a/src/lib/asn1/oid_lookup/default.cpp
+++ b/src/lib/asn1/oid_lookup/default.cpp
@@ -21,8 +21,6 @@ const char* default_oid_list()
"1.2.840.10040.4.1 = DSA" "\n"
"1.2.840.10046.2.1 = DH" "\n"
"1.3.6.1.4.1.3029.1.2.1 = ElGamal" "\n"
- "1.3.6.1.4.1.25258.1.1 = RW" "\n"
- "1.3.6.1.4.1.25258.1.2 = NR" "\n"
"1.3.6.1.4.1.25258.1.3 = McEliece" "\n"
"1.3.6.1.4.1.25258.1.4 = Curve25519" "\n"
@@ -93,7 +91,6 @@ const char* default_oid_list()
"1.2.840.113549.1.9.16.3.8 = Compression.Zlib" "\n"
"1.2.840.113549.1.1.1 = RSA/EME-PKCS1-v1_5" "\n"
- "1.2.840.113549.1.1.2 = RSA/EMSA3(MD2)" "\n"
"1.2.840.113549.1.1.4 = RSA/EMSA3(MD5)" "\n"
"1.2.840.113549.1.1.5 = RSA/EMSA3(SHA-160)" "\n"
"1.2.840.113549.1.1.11 = RSA/EMSA3(SHA-256)" "\n"
@@ -124,27 +121,6 @@ const char* default_oid_list()
"1.2.643.2.2.3 = GOST-34.10/EMSA1(GOST-R-34.11-94)" "\n"
- "1.3.6.1.4.1.25258.2.1.1.1 = RW/EMSA2(RIPEMD-160)" "\n"
- "1.3.6.1.4.1.25258.2.1.1.2 = RW/EMSA2(SHA-160)" "\n"
- "1.3.6.1.4.1.25258.2.1.1.3 = RW/EMSA2(SHA-224)" "\n"
- "1.3.6.1.4.1.25258.2.1.1.4 = RW/EMSA2(SHA-256)" "\n"
- "1.3.6.1.4.1.25258.2.1.1.5 = RW/EMSA2(SHA-384)" "\n"
- "1.3.6.1.4.1.25258.2.1.1.6 = RW/EMSA2(SHA-512)" "\n"
-
- "1.3.6.1.4.1.25258.2.1.2.1 = RW/EMSA4(RIPEMD-160)" "\n"
- "1.3.6.1.4.1.25258.2.1.2.2 = RW/EMSA4(SHA-160)" "\n"
- "1.3.6.1.4.1.25258.2.1.2.3 = RW/EMSA4(SHA-224)" "\n"
- "1.3.6.1.4.1.25258.2.1.2.4 = RW/EMSA4(SHA-256)" "\n"
- "1.3.6.1.4.1.25258.2.1.2.5 = RW/EMSA4(SHA-384)" "\n"
- "1.3.6.1.4.1.25258.2.1.2.6 = RW/EMSA4(SHA-512)" "\n"
-
- "1.3.6.1.4.1.25258.2.2.1.1 = NR/EMSA2(RIPEMD-160)" "\n"
- "1.3.6.1.4.1.25258.2.2.1.2 = NR/EMSA2(SHA-160)" "\n"
- "1.3.6.1.4.1.25258.2.2.1.3 = NR/EMSA2(SHA-224)" "\n"
- "1.3.6.1.4.1.25258.2.2.1.4 = NR/EMSA2(SHA-256)" "\n"
- "1.3.6.1.4.1.25258.2.2.1.5 = NR/EMSA2(SHA-384)" "\n"
- "1.3.6.1.4.1.25258.2.2.1.6 = NR/EMSA2(SHA-512)" "\n"
-
"2.5.4.3 = X520.CommonName" "\n"
"2.5.4.4 = X520.Surname" "\n"
"2.5.4.5 = X520.SerialNumber" "\n"
diff --git a/src/lib/block/block_cipher.cpp b/src/lib/block/block_cipher.cpp
index c70ba229d..230d9e3a0 100644
--- a/src/lib/block/block_cipher.cpp
+++ b/src/lib/block/block_cipher.cpp
@@ -63,14 +63,6 @@
#include <botan/lion.h>
#endif
-#if defined(BOTAN_HAS_LUBY_RACKOFF)
- #include <botan/lubyrack.h>
-#endif
-
-#if defined(BOTAN_HAS_MARS)
- #include <botan/mars.h>
-#endif
-
#if defined(BOTAN_HAS_MISTY1)
#include <botan/misty1.h>
#endif
@@ -83,22 +75,6 @@
#include <botan/noekeon_simd.h>
#endif
-#if defined(BOTAN_HAS_RC2)
- #include <botan/rc2.h>
-#endif
-
-#if defined(BOTAN_HAS_RC5)
- #include <botan/rc5.h>
-#endif
-
-#if defined(BOTAN_HAS_RC6)
- #include <botan/rc6.h>
-#endif
-
-#if defined(BOTAN_HAS_SAFER)
- #include <botan/safer_sk.h>
-#endif
-
#if defined(BOTAN_HAS_SEED)
#include <botan/seed.h>
#endif
@@ -111,18 +87,6 @@
#include <botan/serp_simd.h>
#endif
-#if defined(BOTAN_HAS_SKIPJACK)
- #include <botan/skipjack.h>
-#endif
-
-#if defined(BOTAN_HAS_SQUARE)
- #include <botan/square.h>
-#endif
-
-#if defined(BOTAN_HAS_TEA)
- #include <botan/tea.h>
-#endif
-
#if defined(BOTAN_HAS_TWOFISH)
#include <botan/twofish.h>
#endif
@@ -232,10 +196,6 @@ BOTAN_REGISTER_BLOCK_CIPHER_NOARGS_IF(CPUID::has_sse2(), IDEA_SSE2, "IDEA",
BOTAN_REGISTER_BLOCK_CIPHER_NOARGS(KASUMI);
#endif
-#if defined(BOTAN_HAS_MARS)
-BOTAN_REGISTER_BLOCK_CIPHER_NOARGS(MARS);
-#endif
-
#if defined(BOTAN_HAS_MISTY1)
BOTAN_REGISTER_BLOCK_CIPHER_NOARGS(MISTY1);
#endif
@@ -249,22 +209,6 @@ BOTAN_REGISTER_BLOCK_CIPHER_NOARGS_IF(CPUID::has_simd_32(), Noekeon_SIMD, "Noeke
"simd32", BOTAN_SIMD_ALGORITHM_PRIO);
#endif
-#if defined(BOTAN_HAS_RC2)
-BOTAN_REGISTER_BLOCK_CIPHER_NOARGS(RC2);
-#endif
-
-#if defined(BOTAN_HAS_RC5)
-BOTAN_REGISTER_BLOCK_CIPHER_1LEN(RC5, 12);
-#endif
-
-#if defined(BOTAN_HAS_RC6)
-BOTAN_REGISTER_BLOCK_CIPHER_NOARGS(RC6);
-#endif
-
-#if defined(BOTAN_HAS_SAFER)
-BOTAN_REGISTER_BLOCK_CIPHER_NAMED_1LEN(SAFER_SK, "SAFER-SK", 10);
-#endif
-
#if defined(BOTAN_HAS_SEED)
BOTAN_REGISTER_BLOCK_CIPHER_NOARGS(SEED);
#endif
@@ -278,10 +222,6 @@ BOTAN_REGISTER_BLOCK_CIPHER_NOARGS_IF(CPUID::has_simd_32(), Serpent_SIMD, "Serpe
"simd32", BOTAN_SIMD_ALGORITHM_PRIO);
#endif
-#if defined(BOTAN_HAS_TEA)
-BOTAN_REGISTER_BLOCK_CIPHER_NOARGS(TEA);
-#endif
-
#if defined(BOTAN_HAS_TWOFISH)
BOTAN_REGISTER_BLOCK_CIPHER_NOARGS(Twofish);
#endif
diff --git a/src/lib/block/mars/info.txt b/src/lib/block/mars/info.txt
deleted file mode 100644
index 0af3d7955..000000000
--- a/src/lib/block/mars/info.txt
+++ /dev/null
@@ -1 +0,0 @@
-define MARS 20131128
diff --git a/src/lib/block/mars/mars.cpp b/src/lib/block/mars/mars.cpp
deleted file mode 100644
index 4605be415..000000000
--- a/src/lib/block/mars/mars.cpp
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
-* MARS
-* (C) 1999-2009 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/mars.h>
-#include <botan/loadstor.h>
-
-namespace Botan {
-
-namespace {
-
-/**
-* The MARS sbox
-*/
-const u32bit SBOX[512] = {
- 0x09D0C479, 0x28C8FFE0, 0x84AA6C39, 0x9DAD7287, 0x7DFF9BE3, 0xD4268361,
- 0xC96DA1D4, 0x7974CC93, 0x85D0582E, 0x2A4B5705, 0x1CA16A62, 0xC3BD279D,
- 0x0F1F25E5, 0x5160372F, 0xC695C1FB, 0x4D7FF1E4, 0xAE5F6BF4, 0x0D72EE46,
- 0xFF23DE8A, 0xB1CF8E83, 0xF14902E2, 0x3E981E42, 0x8BF53EB6, 0x7F4BF8AC,
- 0x83631F83, 0x25970205, 0x76AFE784, 0x3A7931D4, 0x4F846450, 0x5C64C3F6,
- 0x210A5F18, 0xC6986A26, 0x28F4E826, 0x3A60A81C, 0xD340A664, 0x7EA820C4,
- 0x526687C5, 0x7EDDD12B, 0x32A11D1D, 0x9C9EF086, 0x80F6E831, 0xAB6F04AD,
- 0x56FB9B53, 0x8B2E095C, 0xB68556AE, 0xD2250B0D, 0x294A7721, 0xE21FB253,
- 0xAE136749, 0xE82AAE86, 0x93365104, 0x99404A66, 0x78A784DC, 0xB69BA84B,
- 0x04046793, 0x23DB5C1E, 0x46CAE1D6, 0x2FE28134, 0x5A223942, 0x1863CD5B,
- 0xC190C6E3, 0x07DFB846, 0x6EB88816, 0x2D0DCC4A, 0xA4CCAE59, 0x3798670D,
- 0xCBFA9493, 0x4F481D45, 0xEAFC8CA8, 0xDB1129D6, 0xB0449E20, 0x0F5407FB,
- 0x6167D9A8, 0xD1F45763, 0x4DAA96C3, 0x3BEC5958, 0xABABA014, 0xB6CCD201,
- 0x38D6279F, 0x02682215, 0x8F376CD5, 0x092C237E, 0xBFC56593, 0x32889D2C,
- 0x854B3E95, 0x05BB9B43, 0x7DCD5DCD, 0xA02E926C, 0xFAE527E5, 0x36A1C330,
- 0x3412E1AE, 0xF257F462, 0x3C4F1D71, 0x30A2E809, 0x68E5F551, 0x9C61BA44,
- 0x5DED0AB8, 0x75CE09C8, 0x9654F93E, 0x698C0CCA, 0x243CB3E4, 0x2B062B97,
- 0x0F3B8D9E, 0x00E050DF, 0xFC5D6166, 0xE35F9288, 0xC079550D, 0x0591AEE8,
- 0x8E531E74, 0x75FE3578, 0x2F6D829A, 0xF60B21AE, 0x95E8EB8D, 0x6699486B,
- 0x901D7D9B, 0xFD6D6E31, 0x1090ACEF, 0xE0670DD8, 0xDAB2E692, 0xCD6D4365,
- 0xE5393514, 0x3AF345F0, 0x6241FC4D, 0x460DA3A3, 0x7BCF3729, 0x8BF1D1E0,
- 0x14AAC070, 0x1587ED55, 0x3AFD7D3E, 0xD2F29E01, 0x29A9D1F6, 0xEFB10C53,
- 0xCF3B870F, 0xB414935C, 0x664465ED, 0x024ACAC7, 0x59A744C1, 0x1D2936A7,
- 0xDC580AA6, 0xCF574CA8, 0x040A7A10, 0x6CD81807, 0x8A98BE4C, 0xACCEA063,
- 0xC33E92B5, 0xD1E0E03D, 0xB322517E, 0x2092BD13, 0x386B2C4A, 0x52E8DD58,
- 0x58656DFB, 0x50820371, 0x41811896, 0xE337EF7E, 0xD39FB119, 0xC97F0DF6,
- 0x68FEA01B, 0xA150A6E5, 0x55258962, 0xEB6FF41B, 0xD7C9CD7A, 0xA619CD9E,
- 0xBCF09576, 0x2672C073, 0xF003FB3C, 0x4AB7A50B, 0x1484126A, 0x487BA9B1,
- 0xA64FC9C6, 0xF6957D49, 0x38B06A75, 0xDD805FCD, 0x63D094CF, 0xF51C999E,
- 0x1AA4D343, 0xB8495294, 0xCE9F8E99, 0xBFFCD770, 0xC7C275CC, 0x378453A7,
- 0x7B21BE33, 0x397F41BD, 0x4E94D131, 0x92CC1F98, 0x5915EA51, 0x99F861B7,
- 0xC9980A88, 0x1D74FD5F, 0xB0A495F8, 0x614DEED0, 0xB5778EEA, 0x5941792D,
- 0xFA90C1F8, 0x33F824B4, 0xC4965372, 0x3FF6D550, 0x4CA5FEC0, 0x8630E964,
- 0x5B3FBBD6, 0x7DA26A48, 0xB203231A, 0x04297514, 0x2D639306, 0x2EB13149,
- 0x16A45272, 0x532459A0, 0x8E5F4872, 0xF966C7D9, 0x07128DC0, 0x0D44DB62,
- 0xAFC8D52D, 0x06316131, 0xD838E7CE, 0x1BC41D00, 0x3A2E8C0F, 0xEA83837E,
- 0xB984737D, 0x13BA4891, 0xC4F8B949, 0xA6D6ACB3, 0xA215CDCE, 0x8359838B,
- 0x6BD1AA31, 0xF579DD52, 0x21B93F93, 0xF5176781, 0x187DFDDE, 0xE94AEB76,
- 0x2B38FD54, 0x431DE1DA, 0xAB394825, 0x9AD3048F, 0xDFEA32AA, 0x659473E3,
- 0x623F7863, 0xF3346C59, 0xAB3AB685, 0x3346A90B, 0x6B56443E, 0xC6DE01F8,
- 0x8D421FC0, 0x9B0ED10C, 0x88F1A1E9, 0x54C1F029, 0x7DEAD57B, 0x8D7BA426,
- 0x4CF5178A, 0x551A7CCA, 0x1A9A5F08, 0xFCD651B9, 0x25605182, 0xE11FC6C3,
- 0xB6FD9676, 0x337B3027, 0xB7C8EB14, 0x9E5FD030, 0x6B57E354, 0xAD913CF7,
- 0x7E16688D, 0x58872A69, 0x2C2FC7DF, 0xE389CCC6, 0x30738DF1, 0x0824A734,
- 0xE1797A8B, 0xA4A8D57B, 0x5B5D193B, 0xC8A8309B, 0x73F9A978, 0x73398D32,
- 0x0F59573E, 0xE9DF2B03, 0xE8A5B6C8, 0x848D0704, 0x98DF93C2, 0x720A1DC3,
- 0x684F259A, 0x943BA848, 0xA6370152, 0x863B5EA3, 0xD17B978B, 0x6D9B58EF,
- 0x0A700DD4, 0xA73D36BF, 0x8E6A0829, 0x8695BC14, 0xE35B3447, 0x933AC568,
- 0x8894B022, 0x2F511C27, 0xDDFBCC3C, 0x006662B6, 0x117C83FE, 0x4E12B414,
- 0xC2BCA766, 0x3A2FEC10, 0xF4562420, 0x55792E2A, 0x46F5D857, 0xCEDA25CE,
- 0xC3601D3B, 0x6C00AB46, 0xEFAC9C28, 0xB3C35047, 0x611DFEE3, 0x257C3207,
- 0xFDD58482, 0x3B14D84F, 0x23BECB64, 0xA075F3A3, 0x088F8EAD, 0x07ADF158,
- 0x7796943C, 0xFACABF3D, 0xC09730CD, 0xF7679969, 0xDA44E9ED, 0x2C854C12,
- 0x35935FA3, 0x2F057D9F, 0x690624F8, 0x1CB0BAFD, 0x7B0DBDC6, 0x810F23BB,
- 0xFA929A1A, 0x6D969A17, 0x6742979B, 0x74AC7D05, 0x010E65C4, 0x86A3D963,
- 0xF907B5A0, 0xD0042BD3, 0x158D7D03, 0x287A8255, 0xBBA8366F, 0x096EDC33,
- 0x21916A7B, 0x77B56B86, 0x951622F9, 0xA6C5E650, 0x8CEA17D1, 0xCD8C62BC,
- 0xA3D63433, 0x358A68FD, 0x0F9B9D3C, 0xD6AA295B, 0xFE33384A, 0xC000738E,
- 0xCD67EB2F, 0xE2EB6DC2, 0x97338B02, 0x06C9F246, 0x419CF1AD, 0x2B83C045,
- 0x3723F18A, 0xCB5B3089, 0x160BEAD7, 0x5D494656, 0x35F8A74B, 0x1E4E6C9E,
- 0x000399BD, 0x67466880, 0xB4174831, 0xACF423B2, 0xCA815AB3, 0x5A6395E7,
- 0x302A67C5, 0x8BDB446B, 0x108F8FA4, 0x10223EDA, 0x92B8B48B, 0x7F38D0EE,
- 0xAB2701D4, 0x0262D415, 0xAF224A30, 0xB3D88ABA, 0xF8B2C3AF, 0xDAF7EF70,
- 0xCC97D3B7, 0xE9614B6C, 0x2BAEBFF4, 0x70F687CF, 0x386C9156, 0xCE092EE5,
- 0x01E87DA6, 0x6CE91E6A, 0xBB7BCC84, 0xC7922C20, 0x9D3B71FD, 0x060E41C6,
- 0xD7590F15, 0x4E03BB47, 0x183C198E, 0x63EEB240, 0x2DDBF49A, 0x6D5CBA54,
- 0x923750AF, 0xF9E14236, 0x7838162B, 0x59726C72, 0x81B66760, 0xBB2926C1,
- 0x48A0CE0D, 0xA6C0496D, 0xAD43507B, 0x718D496A, 0x9DF057AF, 0x44B1BDE6,
- 0x054356DC, 0xDE7CED35, 0xD51A138B, 0x62088CC9, 0x35830311, 0xC96EFCA2,
- 0x686F86EC, 0x8E77CB68, 0x63E1D6B8, 0xC80F9778, 0x79C491FD, 0x1B4C67F2,
- 0x72698D7D, 0x5E368C31, 0xF7D95E2E, 0xA1D3493F, 0xDCD9433E, 0x896F1552,
- 0x4BC4CA7A, 0xA6D1BAF4, 0xA5A96DCC, 0x0BEF8B46, 0xA169FDA7, 0x74DF40B7,
- 0x4E208804, 0x9A756607, 0x038E87C8, 0x20211E44, 0x8B7AD4BF, 0xC6403F35,
- 0x1848E36D, 0x80BDB038, 0x1E62891C, 0x643D2107, 0xBF04D6F8, 0x21092C8C,
- 0xF644F389, 0x0778404E, 0x7B78ADB8, 0xA2C52D53, 0x42157ABE, 0xA2253E2E,
- 0x7BF3F4AE, 0x80F594F9, 0x953194E7, 0x77EB92ED, 0xB3816930, 0xDA8D9336,
- 0xBF447469, 0xF26D9483, 0xEE6FAED5, 0x71371235, 0xDE425F73, 0xB4E59F43,
- 0x7DBE2D4E, 0x2D37B185, 0x49DC9A63, 0x98C39D98, 0x1301C9A2, 0x389B1BBF,
- 0x0C18588D, 0xA421C1BA, 0x7AA3865C, 0x71E08558, 0x3C5CFCAA, 0x7D239CA4,
- 0x0297D9DD, 0xD7DC2830, 0x4B37802B, 0x7428AB54, 0xAEEE0347, 0x4B3FBB85,
- 0x692F2F08, 0x134E578E, 0x36D9E0BF, 0xAE8B5FCF, 0xEDB93ECF, 0x2B27248E,
- 0x170EB1EF, 0x7DC57FD6, 0x1E760F16, 0xB1136601, 0x864E1B9B, 0xD7EA7319,
- 0x3AB871BD, 0xCFA4D76F, 0xE31BD782, 0x0DBEB469, 0xABB96061, 0x5370F85D,
- 0xFFB07E37, 0xDA30D0FB, 0xEBC977B6, 0x0B98B40F, 0x3A4D0FE6, 0xDF4FC26B,
- 0x159CF22A, 0xC298D6E2, 0x2B78EF6A, 0x61A94AC0, 0xAB561187, 0x14EEA0F0,
- 0xDF0D4164, 0x19AF70EE };
-
-/*
-* MARS Encryption Round
-*/
-inline void encrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D,
- u32bit EK1, u32bit EK2)
- {
- const u32bit X = A + EK1;
- A = rotate_left(A, 13);
- u32bit Y = A * EK2;
- u32bit Z = SBOX[X % 512];
-
- Y = rotate_left(Y, 5);
- Z ^= Y;
- C += rotate_left(X, Y % 32);
- Y = rotate_left(Y, 5);
- Z ^= Y;
- D ^= Y;
- B += rotate_left(Z, Y % 32);
- }
-
-/*
-* MARS Decryption Round
-*/
-inline void decrypt_round(u32bit& A, u32bit& B, u32bit& C, u32bit& D,
- u32bit EK1, u32bit EK2)
- {
- u32bit Y = A * EK1;
- A = rotate_right(A, 13);
- const u32bit X = A + EK2;
- u32bit Z = SBOX[X % 512];
-
- Y = rotate_left(Y, 5);
- Z ^= Y;
- C -= rotate_left(X, Y % 32);
- Y = rotate_left(Y, 5);
- Z ^= Y;
- D ^= Y;
- B -= rotate_left(Z, Y % 32);
- }
-
-/*
-* MARS Forward Mixing Operation
-*/
-void forward_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D)
- {
- for(size_t j = 0; j != 2; ++j)
- {
- B ^= SBOX[get_byte(3, A)]; B += SBOX[get_byte(2, A) + 256];
- C += SBOX[get_byte(1, A)]; D ^= SBOX[get_byte(0, A) + 256];
- A = rotate_right(A, 24) + D;
-
- C ^= SBOX[get_byte(3, B)]; C += SBOX[get_byte(2, B) + 256];
- D += SBOX[get_byte(1, B)]; A ^= SBOX[get_byte(0, B) + 256];
- B = rotate_right(B, 24) + C;
-
- D ^= SBOX[get_byte(3, C)]; D += SBOX[get_byte(2, C) + 256];
- A += SBOX[get_byte(1, C)]; B ^= SBOX[get_byte(0, C) + 256];
- C = rotate_right(C, 24);
-
- A ^= SBOX[get_byte(3, D)]; A += SBOX[get_byte(2, D) + 256];
- B += SBOX[get_byte(1, D)]; C ^= SBOX[get_byte(0, D) + 256];
- D = rotate_right(D, 24);
- }
- }
-
-/*
-* MARS Reverse Mixing Operation
-*/
-void reverse_mix(u32bit& A, u32bit& B, u32bit& C, u32bit& D)
- {
- for(size_t j = 0; j != 2; ++j)
- {
- B ^= SBOX[get_byte(3, A) + 256]; C -= SBOX[get_byte(0, A)];
- D -= SBOX[get_byte(1, A) + 256]; D ^= SBOX[get_byte(2, A)];
- A = rotate_left(A, 24);
-
- C ^= SBOX[get_byte(3, B) + 256]; D -= SBOX[get_byte(0, B)];
- A -= SBOX[get_byte(1, B) + 256]; A ^= SBOX[get_byte(2, B)];
- C -= (B = rotate_left(B, 24));
-
- D ^= SBOX[get_byte(3, C) + 256]; A -= SBOX[get_byte(0, C)];
- B -= SBOX[get_byte(1, C) + 256]; B ^= SBOX[get_byte(2, C)];
- C = rotate_left(C, 24);
- D -= A;
-
- A ^= SBOX[get_byte(3, D) + 256]; B -= SBOX[get_byte(0, D)];
- C -= SBOX[get_byte(1, D) + 256]; C ^= SBOX[get_byte(2, D)];
- D = rotate_left(D, 24);
- }
- }
-
-/*
-* Generate a mask for runs of bits
-*/
-u32bit gen_mask(u32bit input)
- {
- u32bit mask = 0;
-
- for(u32bit j = 2; j != 31; ++j)
- {
- const u32bit region = (input >> (j-1)) & 0x07;
-
- if(region == 0x00 || region == 0x07)
- {
- const u32bit low = (j < 9) ? 0 : (j - 9);
- const u32bit high = (j < 23) ? j : 23;
-
- for(u32bit k = low; k != high; ++k)
- {
- const u32bit value = (input >> k) & 0x3FF;
-
- if(value == 0 || value == 0x3FF)
- {
- mask |= static_cast<u32bit>(1) << j;
- break;
- }
- }
- }
- }
-
- return mask;
- }
-
-}
-
-/*
-* MARS Encryption
-*/
-void MARS::encrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u32bit A = load_le<u32bit>(in, 0) + m_EK[0];
- u32bit B = load_le<u32bit>(in, 1) + m_EK[1];
- u32bit C = load_le<u32bit>(in, 2) + m_EK[2];
- u32bit D = load_le<u32bit>(in, 3) + m_EK[3];
-
- forward_mix(A, B, C, D);
-
- encrypt_round(A, B, C, D, m_EK[ 4], m_EK[ 5]);
- encrypt_round(B, C, D, A, m_EK[ 6], m_EK[ 7]);
- encrypt_round(C, D, A, B, m_EK[ 8], m_EK[ 9]);
- encrypt_round(D, A, B, C, m_EK[10], m_EK[11]);
- encrypt_round(A, B, C, D, m_EK[12], m_EK[13]);
- encrypt_round(B, C, D, A, m_EK[14], m_EK[15]);
- encrypt_round(C, D, A, B, m_EK[16], m_EK[17]);
- encrypt_round(D, A, B, C, m_EK[18], m_EK[19]);
-
- encrypt_round(A, D, C, B, m_EK[20], m_EK[21]);
- encrypt_round(B, A, D, C, m_EK[22], m_EK[23]);
- encrypt_round(C, B, A, D, m_EK[24], m_EK[25]);
- encrypt_round(D, C, B, A, m_EK[26], m_EK[27]);
- encrypt_round(A, D, C, B, m_EK[28], m_EK[29]);
- encrypt_round(B, A, D, C, m_EK[30], m_EK[31]);
- encrypt_round(C, B, A, D, m_EK[32], m_EK[33]);
- encrypt_round(D, C, B, A, m_EK[34], m_EK[35]);
-
- reverse_mix(A, B, C, D);
-
- A -= m_EK[36]; B -= m_EK[37]; C -= m_EK[38]; D -= m_EK[39];
-
- store_le(out, A, B, C, D);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* MARS Decryption
-*/
-void MARS::decrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u32bit A = load_le<u32bit>(in, 3) + m_EK[39];
- u32bit B = load_le<u32bit>(in, 2) + m_EK[38];
- u32bit C = load_le<u32bit>(in, 1) + m_EK[37];
- u32bit D = load_le<u32bit>(in, 0) + m_EK[36];
-
- forward_mix(A, B, C, D);
-
- decrypt_round(A, B, C, D, m_EK[35], m_EK[34]);
- decrypt_round(B, C, D, A, m_EK[33], m_EK[32]);
- decrypt_round(C, D, A, B, m_EK[31], m_EK[30]);
- decrypt_round(D, A, B, C, m_EK[29], m_EK[28]);
- decrypt_round(A, B, C, D, m_EK[27], m_EK[26]);
- decrypt_round(B, C, D, A, m_EK[25], m_EK[24]);
- decrypt_round(C, D, A, B, m_EK[23], m_EK[22]);
- decrypt_round(D, A, B, C, m_EK[21], m_EK[20]);
-
- decrypt_round(A, D, C, B, m_EK[19], m_EK[18]);
- decrypt_round(B, A, D, C, m_EK[17], m_EK[16]);
- decrypt_round(C, B, A, D, m_EK[15], m_EK[14]);
- decrypt_round(D, C, B, A, m_EK[13], m_EK[12]);
- decrypt_round(A, D, C, B, m_EK[11], m_EK[10]);
- decrypt_round(B, A, D, C, m_EK[ 9], m_EK[ 8]);
- decrypt_round(C, B, A, D, m_EK[ 7], m_EK[ 6]);
- decrypt_round(D, C, B, A, m_EK[ 5], m_EK[ 4]);
-
- reverse_mix(A, B, C, D);
-
- A -= m_EK[3]; B -= m_EK[2]; C -= m_EK[1]; D -= m_EK[0];
-
- store_le(out, D, C, B, A);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* MARS Key Schedule
-*/
-void MARS::key_schedule(const byte key[], size_t length)
- {
- secure_vector<u32bit> T(15);
- for(size_t i = 0; i != length / 4; ++i)
- T[i] = load_le<u32bit>(key, i);
-
- T[length / 4] = static_cast<u32bit>(length) / 4;
-
- m_EK.resize(40);
-
- for(u32bit i = 0; i != 4; ++i)
- {
- T[ 0] ^= rotate_left(T[ 8] ^ T[13], 3) ^ (i );
- T[ 1] ^= rotate_left(T[ 9] ^ T[14], 3) ^ (i + 4);
- T[ 2] ^= rotate_left(T[10] ^ T[ 0], 3) ^ (i + 8);
- T[ 3] ^= rotate_left(T[11] ^ T[ 1], 3) ^ (i + 12);
- T[ 4] ^= rotate_left(T[12] ^ T[ 2], 3) ^ (i + 16);
- T[ 5] ^= rotate_left(T[13] ^ T[ 3], 3) ^ (i + 20);
- T[ 6] ^= rotate_left(T[14] ^ T[ 4], 3) ^ (i + 24);
- T[ 7] ^= rotate_left(T[ 0] ^ T[ 5], 3) ^ (i + 28);
- T[ 8] ^= rotate_left(T[ 1] ^ T[ 6], 3) ^ (i + 32);
- T[ 9] ^= rotate_left(T[ 2] ^ T[ 7], 3) ^ (i + 36);
- T[10] ^= rotate_left(T[ 3] ^ T[ 8], 3) ^ (i + 40);
- T[11] ^= rotate_left(T[ 4] ^ T[ 9], 3) ^ (i + 44);
- T[12] ^= rotate_left(T[ 5] ^ T[10], 3) ^ (i + 48);
- T[13] ^= rotate_left(T[ 6] ^ T[11], 3) ^ (i + 52);
- T[14] ^= rotate_left(T[ 7] ^ T[12], 3) ^ (i + 56);
-
- for(size_t j = 0; j != 4; ++j)
- {
- T[ 0] = rotate_left(T[ 0] + SBOX[T[14] % 512], 9);
- T[ 1] = rotate_left(T[ 1] + SBOX[T[ 0] % 512], 9);
- T[ 2] = rotate_left(T[ 2] + SBOX[T[ 1] % 512], 9);
- T[ 3] = rotate_left(T[ 3] + SBOX[T[ 2] % 512], 9);
- T[ 4] = rotate_left(T[ 4] + SBOX[T[ 3] % 512], 9);
- T[ 5] = rotate_left(T[ 5] + SBOX[T[ 4] % 512], 9);
- T[ 6] = rotate_left(T[ 6] + SBOX[T[ 5] % 512], 9);
- T[ 7] = rotate_left(T[ 7] + SBOX[T[ 6] % 512], 9);
- T[ 8] = rotate_left(T[ 8] + SBOX[T[ 7] % 512], 9);
- T[ 9] = rotate_left(T[ 9] + SBOX[T[ 8] % 512], 9);
- T[10] = rotate_left(T[10] + SBOX[T[ 9] % 512], 9);
- T[11] = rotate_left(T[11] + SBOX[T[10] % 512], 9);
- T[12] = rotate_left(T[12] + SBOX[T[11] % 512], 9);
- T[13] = rotate_left(T[13] + SBOX[T[12] % 512], 9);
- T[14] = rotate_left(T[14] + SBOX[T[13] % 512], 9);
- }
-
- m_EK[10*i + 0] = T[ 0];
- m_EK[10*i + 1] = T[ 4];
- m_EK[10*i + 2] = T[ 8];
- m_EK[10*i + 3] = T[12];
- m_EK[10*i + 4] = T[ 1];
- m_EK[10*i + 5] = T[ 5];
- m_EK[10*i + 6] = T[ 9];
- m_EK[10*i + 7] = T[13];
- m_EK[10*i + 8] = T[ 2];
- m_EK[10*i + 9] = T[ 6];
- }
-
- for(size_t i = 5; i != 37; i += 2)
- {
- const u32bit key3 = m_EK[i] & 3;
- m_EK[i] |= 3;
- m_EK[i] ^= rotate_left(SBOX[265 + key3], m_EK[i-1] % 32) & gen_mask(m_EK[i]);
- }
- }
-
-void MARS::clear()
- {
- zap(m_EK);
- }
-
-}
diff --git a/src/lib/block/mars/mars.h b/src/lib/block/mars/mars.h
deleted file mode 100644
index a4d7a07d6..000000000
--- a/src/lib/block/mars/mars.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-* MARS
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_MARS_H__
-#define BOTAN_MARS_H__
-
-#include <botan/block_cipher.h>
-
-namespace Botan {
-
-/**
-* MARS, IBM's candidate for AES
-*/
-class BOTAN_DLL MARS final : public Block_Cipher_Fixed_Params<16, 16, 32, 4>
- {
- public:
- void encrypt_n(const byte in[], byte out[], size_t blocks) const override;
- void decrypt_n(const byte in[], byte out[], size_t blocks) const override;
-
- void clear() override;
- std::string name() const override { return "MARS"; }
- BlockCipher* clone() const override { return new MARS; }
- private:
- void key_schedule(const byte[], size_t) override;
-
- secure_vector<u32bit> m_EK;
- };
-
-}
-
-#endif
diff --git a/src/lib/block/rc2/info.txt b/src/lib/block/rc2/info.txt
deleted file mode 100644
index fae09cf23..000000000
--- a/src/lib/block/rc2/info.txt
+++ /dev/null
@@ -1 +0,0 @@
-define RC2 20131128
diff --git a/src/lib/block/rc2/rc2.cpp b/src/lib/block/rc2/rc2.cpp
deleted file mode 100644
index 112c6561d..000000000
--- a/src/lib/block/rc2/rc2.cpp
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
-* RC2
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/rc2.h>
-#include <botan/loadstor.h>
-
-namespace Botan {
-
-/*
-* RC2 Encryption
-*/
-void RC2::encrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u16bit R0 = load_le<u16bit>(in, 0);
- u16bit R1 = load_le<u16bit>(in, 1);
- u16bit R2 = load_le<u16bit>(in, 2);
- u16bit R3 = load_le<u16bit>(in, 3);
-
- for(size_t j = 0; j != 16; ++j)
- {
- R0 += (R1 & ~R3) + (R2 & R3) + m_K[4*j];
- R0 = rotate_left(R0, 1);
-
- R1 += (R2 & ~R0) + (R3 & R0) + m_K[4*j + 1];
- R1 = rotate_left(R1, 2);
-
- R2 += (R3 & ~R1) + (R0 & R1) + m_K[4*j + 2];
- R2 = rotate_left(R2, 3);
-
- R3 += (R0 & ~R2) + (R1 & R2) + m_K[4*j + 3];
- R3 = rotate_left(R3, 5);
-
- if(j == 4 || j == 10)
- {
- R0 += m_K[R3 % 64];
- R1 += m_K[R0 % 64];
- R2 += m_K[R1 % 64];
- R3 += m_K[R2 % 64];
- }
- }
-
- store_le(out, R0, R1, R2, R3);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* RC2 Decryption
-*/
-void RC2::decrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u16bit R0 = load_le<u16bit>(in, 0);
- u16bit R1 = load_le<u16bit>(in, 1);
- u16bit R2 = load_le<u16bit>(in, 2);
- u16bit R3 = load_le<u16bit>(in, 3);
-
- for(size_t j = 0; j != 16; ++j)
- {
- R3 = rotate_right(R3, 5);
- R3 -= (R0 & ~R2) + (R1 & R2) + m_K[63 - (4*j + 0)];
-
- R2 = rotate_right(R2, 3);
- R2 -= (R3 & ~R1) + (R0 & R1) + m_K[63 - (4*j + 1)];
-
- R1 = rotate_right(R1, 2);
- R1 -= (R2 & ~R0) + (R3 & R0) + m_K[63 - (4*j + 2)];
-
- R0 = rotate_right(R0, 1);
- R0 -= (R1 & ~R3) + (R2 & R3) + m_K[63 - (4*j + 3)];
-
- if(j == 4 || j == 10)
- {
- R3 -= m_K[R2 % 64];
- R2 -= m_K[R1 % 64];
- R1 -= m_K[R0 % 64];
- R0 -= m_K[R3 % 64];
- }
- }
-
- store_le(out, R0, R1, R2, R3);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* RC2 Key Schedule
-*/
-void RC2::key_schedule(const byte key[], size_t length)
- {
- static const byte TABLE[256] = {
- 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, 0x28, 0xE9, 0xFD, 0x79,
- 0x4A, 0xA0, 0xD8, 0x9D, 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E,
- 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, 0x17, 0x9A, 0x59, 0xF5,
- 0x87, 0xB3, 0x4F, 0x13, 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32,
- 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, 0xF0, 0x95, 0x21, 0x22,
- 0x5C, 0x6B, 0x4E, 0x82, 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C,
- 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, 0x12, 0x75, 0xCA, 0x1F,
- 0x3B, 0xBE, 0xE4, 0xD1, 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26,
- 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, 0x27, 0xF2, 0x1D, 0x9B,
- 0xBC, 0x94, 0x43, 0x03, 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7,
- 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, 0x08, 0xE8, 0xEA, 0xDE,
- 0x80, 0x52, 0xEE, 0xF7, 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A,
- 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, 0x4B, 0x9F, 0xD0, 0x5E,
- 0x04, 0x18, 0xA4, 0xEC, 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC,
- 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, 0x99, 0x7C, 0x3A, 0x85,
- 0x23, 0xB8, 0xB4, 0x7A, 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31,
- 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, 0x05, 0xDF, 0x29, 0x10,
- 0x67, 0x6C, 0xBA, 0xC9, 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C,
- 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, 0x0D, 0x38, 0x34, 0x1B,
- 0xAB, 0x33, 0xFF, 0xB0, 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E,
- 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, 0x0A, 0xA6, 0x20, 0x68,
- 0xFE, 0x7F, 0xC1, 0xAD };
-
- secure_vector<byte> L(128);
- copy_mem(L.data(), key, length);
-
- for(size_t i = length; i != 128; ++i)
- L[i] = TABLE[(L[i-1] + L[i-length]) % 256];
-
- L[128-length] = TABLE[L[128-length]];
-
- for(s32bit i = 127-length; i >= 0; --i)
- L[i] = TABLE[L[i+1] ^ L[i+length]];
-
- m_K.resize(64);
- load_le<u16bit>(m_K.data(), L.data(), 64);
- }
-
-void RC2::clear()
- {
- zap(m_K);
- }
-
-/*
-* Return the code of the effective key bits
-*/
-byte RC2::EKB_code(size_t ekb)
- {
- const byte EKB[256] = {
- 0xBD, 0x56, 0xEA, 0xF2, 0xA2, 0xF1, 0xAC, 0x2A, 0xB0, 0x93, 0xD1, 0x9C,
- 0x1B, 0x33, 0xFD, 0xD0, 0x30, 0x04, 0xB6, 0xDC, 0x7D, 0xDF, 0x32, 0x4B,
- 0xF7, 0xCB, 0x45, 0x9B, 0x31, 0xBB, 0x21, 0x5A, 0x41, 0x9F, 0xE1, 0xD9,
- 0x4A, 0x4D, 0x9E, 0xDA, 0xA0, 0x68, 0x2C, 0xC3, 0x27, 0x5F, 0x80, 0x36,
- 0x3E, 0xEE, 0xFB, 0x95, 0x1A, 0xFE, 0xCE, 0xA8, 0x34, 0xA9, 0x13, 0xF0,
- 0xA6, 0x3F, 0xD8, 0x0C, 0x78, 0x24, 0xAF, 0x23, 0x52, 0xC1, 0x67, 0x17,
- 0xF5, 0x66, 0x90, 0xE7, 0xE8, 0x07, 0xB8, 0x60, 0x48, 0xE6, 0x1E, 0x53,
- 0xF3, 0x92, 0xA4, 0x72, 0x8C, 0x08, 0x15, 0x6E, 0x86, 0x00, 0x84, 0xFA,
- 0xF4, 0x7F, 0x8A, 0x42, 0x19, 0xF6, 0xDB, 0xCD, 0x14, 0x8D, 0x50, 0x12,
- 0xBA, 0x3C, 0x06, 0x4E, 0xEC, 0xB3, 0x35, 0x11, 0xA1, 0x88, 0x8E, 0x2B,
- 0x94, 0x99, 0xB7, 0x71, 0x74, 0xD3, 0xE4, 0xBF, 0x3A, 0xDE, 0x96, 0x0E,
- 0xBC, 0x0A, 0xED, 0x77, 0xFC, 0x37, 0x6B, 0x03, 0x79, 0x89, 0x62, 0xC6,
- 0xD7, 0xC0, 0xD2, 0x7C, 0x6A, 0x8B, 0x22, 0xA3, 0x5B, 0x05, 0x5D, 0x02,
- 0x75, 0xD5, 0x61, 0xE3, 0x18, 0x8F, 0x55, 0x51, 0xAD, 0x1F, 0x0B, 0x5E,
- 0x85, 0xE5, 0xC2, 0x57, 0x63, 0xCA, 0x3D, 0x6C, 0xB4, 0xC5, 0xCC, 0x70,
- 0xB2, 0x91, 0x59, 0x0D, 0x47, 0x20, 0xC8, 0x4F, 0x58, 0xE0, 0x01, 0xE2,
- 0x16, 0x38, 0xC4, 0x6F, 0x3B, 0x0F, 0x65, 0x46, 0xBE, 0x7E, 0x2D, 0x7B,
- 0x82, 0xF9, 0x40, 0xB5, 0x1D, 0x73, 0xF8, 0xEB, 0x26, 0xC7, 0x87, 0x97,
- 0x25, 0x54, 0xB1, 0x28, 0xAA, 0x98, 0x9D, 0xA5, 0x64, 0x6D, 0x7A, 0xD4,
- 0x10, 0x81, 0x44, 0xEF, 0x49, 0xD6, 0xAE, 0x2E, 0xDD, 0x76, 0x5C, 0x2F,
- 0xA7, 0x1C, 0xC9, 0x09, 0x69, 0x9A, 0x83, 0xCF, 0x29, 0x39, 0xB9, 0xE9,
- 0x4C, 0xFF, 0x43, 0xAB };
-
- if(ekb < 256)
- return EKB[ekb];
- else
- throw Encoding_Error("RC2::EKB_code: EKB is too large");
- }
-
-}
diff --git a/src/lib/block/rc2/rc2.h b/src/lib/block/rc2/rc2.h
deleted file mode 100644
index 9ec9b9557..000000000
--- a/src/lib/block/rc2/rc2.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-* RC2
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_RC2_H__
-#define BOTAN_RC2_H__
-
-#include <botan/block_cipher.h>
-
-namespace Botan {
-
-/**
-* RC2
-*/
-class BOTAN_DLL RC2 final : public Block_Cipher_Fixed_Params<8, 1, 32>
- {
- public:
- void encrypt_n(const byte in[], byte out[], size_t blocks) const override;
- void decrypt_n(const byte in[], byte out[], size_t blocks) const override;
-
- /**
- * Return the code of the effective key bits
- * @param bits key length
- * @return EKB code
- */
- static byte EKB_code(size_t bits);
-
- void clear() override;
- std::string name() const override { return "RC2"; }
- BlockCipher* clone() const override { return new RC2; }
- private:
- void key_schedule(const byte[], size_t) override;
-
- secure_vector<u16bit> m_K;
- };
-
-}
-
-#endif
diff --git a/src/lib/block/rc5/info.txt b/src/lib/block/rc5/info.txt
deleted file mode 100644
index 2c2c613ba..000000000
--- a/src/lib/block/rc5/info.txt
+++ /dev/null
@@ -1 +0,0 @@
-define RC5 20131128
diff --git a/src/lib/block/rc5/rc5.cpp b/src/lib/block/rc5/rc5.cpp
deleted file mode 100644
index a02a45e9f..000000000
--- a/src/lib/block/rc5/rc5.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
-* RC5
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/rc5.h>
-#include <botan/loadstor.h>
-#include <botan/parsing.h>
-
-namespace Botan {
-
-/*
-* RC5 Encryption
-*/
-void RC5::encrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u32bit A = load_le<u32bit>(in, 0);
- u32bit B = load_le<u32bit>(in, 1);
-
- A += m_S[0]; B += m_S[1];
- for(size_t j = 0; j != m_rounds; j += 4)
- {
- A = rotate_left(A ^ B, B % 32) + m_S[2*j+2];
- B = rotate_left(B ^ A, A % 32) + m_S[2*j+3];
-
- A = rotate_left(A ^ B, B % 32) + m_S[2*j+4];
- B = rotate_left(B ^ A, A % 32) + m_S[2*j+5];
-
- A = rotate_left(A ^ B, B % 32) + m_S[2*j+6];
- B = rotate_left(B ^ A, A % 32) + m_S[2*j+7];
-
- A = rotate_left(A ^ B, B % 32) + m_S[2*j+8];
- B = rotate_left(B ^ A, A % 32) + m_S[2*j+9];
- }
-
- store_le(out, A, B);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* RC5 Decryption
-*/
-void RC5::decrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u32bit A = load_le<u32bit>(in, 0);
- u32bit B = load_le<u32bit>(in, 1);
-
- for(size_t j = m_rounds; j != 0; j -= 4)
- {
- B = rotate_right(B - m_S[2*j+1], A % 32) ^ A;
- A = rotate_right(A - m_S[2*j ], B % 32) ^ B;
-
- B = rotate_right(B - m_S[2*j-1], A % 32) ^ A;
- A = rotate_right(A - m_S[2*j-2], B % 32) ^ B;
-
- B = rotate_right(B - m_S[2*j-3], A % 32) ^ A;
- A = rotate_right(A - m_S[2*j-4], B % 32) ^ B;
-
- B = rotate_right(B - m_S[2*j-5], A % 32) ^ A;
- A = rotate_right(A - m_S[2*j-6], B % 32) ^ B;
- }
- B -= m_S[1]; A -= m_S[0];
-
- store_le(out, A, B);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* RC5 Key Schedule
-*/
-void RC5::key_schedule(const byte key[], size_t length)
- {
- m_S.resize(2*m_rounds + 2);
-
- const size_t WORD_KEYLENGTH = (((length - 1) / 4) + 1);
- const size_t MIX_ROUNDS = 3 * std::max(WORD_KEYLENGTH, m_S.size());
-
- m_S[0] = 0xB7E15163;
- for(size_t i = 1; i != m_S.size(); ++i)
- m_S[i] = m_S[i-1] + 0x9E3779B9;
-
- secure_vector<u32bit> K(8);
-
- for(s32bit i = length-1; i >= 0; --i)
- K[i/4] = (K[i/4] << 8) + key[i];
-
- u32bit A = 0, B = 0;
-
- for(size_t i = 0; i != MIX_ROUNDS; ++i)
- {
- A = rotate_left(m_S[i % m_S.size()] + A + B, 3);
- B = rotate_left(K[i % WORD_KEYLENGTH] + A + B, (A + B) % 32);
- m_S[i % m_S.size()] = A;
- K[i % WORD_KEYLENGTH] = B;
- }
- }
-
-void RC5::clear()
- {
- zap(m_S);
- }
-
-/*
-* Return the name of this type
-*/
-std::string RC5::name() const
- {
- return "RC5(" + std::to_string(m_rounds) + ")";
- }
-
-/*
-* RC5 Constructor
-*/
-RC5::RC5(size_t r) : m_rounds(r)
- {
- if(m_rounds < 8 || m_rounds > 32 || (m_rounds % 4 != 0))
- throw Invalid_Argument("RC5: Invalid number of rounds " +
- std::to_string(m_rounds));
- }
-
-}
diff --git a/src/lib/block/rc5/rc5.h b/src/lib/block/rc5/rc5.h
deleted file mode 100644
index 4d9232326..000000000
--- a/src/lib/block/rc5/rc5.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-* RC5
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_RC5_H__
-#define BOTAN_RC5_H__
-
-#include <botan/block_cipher.h>
-
-namespace Botan {
-
-/**
-* RC5
-*/
-class BOTAN_DLL RC5 final : public Block_Cipher_Fixed_Params<8, 1, 32>
- {
- public:
- void encrypt_n(const byte in[], byte out[], size_t blocks) const override;
- void decrypt_n(const byte in[], byte out[], size_t blocks) const override;
-
- void clear() override;
- std::string name() const override;
- BlockCipher* clone() const override { return new RC5(m_rounds); }
-
- /**
- * @param rounds the number of RC5 rounds to run. Must be between
- * 8 and 32 and a multiple of 4.
- */
- explicit RC5(size_t rounds);
- private:
- void key_schedule(const byte[], size_t) override;
-
- size_t m_rounds;
- secure_vector<u32bit> m_S;
- };
-
-}
-
-#endif
diff --git a/src/lib/block/rc6/info.txt b/src/lib/block/rc6/info.txt
deleted file mode 100644
index e54379f65..000000000
--- a/src/lib/block/rc6/info.txt
+++ /dev/null
@@ -1 +0,0 @@
-define RC6 20131128
diff --git a/src/lib/block/rc6/rc6.cpp b/src/lib/block/rc6/rc6.cpp
deleted file mode 100644
index 426b86ebd..000000000
--- a/src/lib/block/rc6/rc6.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
-* RC6
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/rc6.h>
-#include <botan/loadstor.h>
-
-namespace Botan {
-
-/*
-* RC6 Encryption
-*/
-void RC6::encrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u32bit A = load_le<u32bit>(in, 0);
- u32bit B = load_le<u32bit>(in, 1);
- u32bit C = load_le<u32bit>(in, 2);
- u32bit D = load_le<u32bit>(in, 3);
-
- B += m_S[0]; D += m_S[1];
-
- for(size_t j = 0; j != 20; j += 4)
- {
- u32bit T1, T2;
-
- T1 = rotate_left(B*(2*B+1), 5);
- T2 = rotate_left(D*(2*D+1), 5);
- A = rotate_left(A ^ T1, T2 % 32) + m_S[2*j+2];
- C = rotate_left(C ^ T2, T1 % 32) + m_S[2*j+3];
-
- T1 = rotate_left(C*(2*C+1), 5);
- T2 = rotate_left(A*(2*A+1), 5);
- B = rotate_left(B ^ T1, T2 % 32) + m_S[2*j+4];
- D = rotate_left(D ^ T2, T1 % 32) + m_S[2*j+5];
-
- T1 = rotate_left(D*(2*D+1), 5);
- T2 = rotate_left(B*(2*B+1), 5);
- C = rotate_left(C ^ T1, T2 % 32) + m_S[2*j+6];
- A = rotate_left(A ^ T2, T1 % 32) + m_S[2*j+7];
-
- T1 = rotate_left(A*(2*A+1), 5);
- T2 = rotate_left(C*(2*C+1), 5);
- D = rotate_left(D ^ T1, T2 % 32) + m_S[2*j+8];
- B = rotate_left(B ^ T2, T1 % 32) + m_S[2*j+9];
- }
-
- A += m_S[42]; C += m_S[43];
-
- store_le(out, A, B, C, D);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* RC6 Decryption
-*/
-void RC6::decrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u32bit A = load_le<u32bit>(in, 0);
- u32bit B = load_le<u32bit>(in, 1);
- u32bit C = load_le<u32bit>(in, 2);
- u32bit D = load_le<u32bit>(in, 3);
-
- C -= m_S[43]; A -= m_S[42];
-
- for(size_t j = 0; j != 20; j += 4)
- {
- u32bit T1, T2;
-
- T1 = rotate_left(A*(2*A+1), 5);
- T2 = rotate_left(C*(2*C+1), 5);
- B = rotate_right(B - m_S[41 - 2*j], T1 % 32) ^ T2;
- D = rotate_right(D - m_S[40 - 2*j], T2 % 32) ^ T1;
-
- T1 = rotate_left(D*(2*D+1), 5);
- T2 = rotate_left(B*(2*B+1), 5);
- A = rotate_right(A - m_S[39 - 2*j], T1 % 32) ^ T2;
- C = rotate_right(C - m_S[38 - 2*j], T2 % 32) ^ T1;
-
- T1 = rotate_left(C*(2*C+1), 5);
- T2 = rotate_left(A*(2*A+1), 5);
- D = rotate_right(D - m_S[37 - 2*j], T1 % 32) ^ T2;
- B = rotate_right(B - m_S[36 - 2*j], T2 % 32) ^ T1;
-
- T1 = rotate_left(B*(2*B+1), 5);
- T2 = rotate_left(D*(2*D+1), 5);
- C = rotate_right(C - m_S[35 - 2*j], T1 % 32) ^ T2;
- A = rotate_right(A - m_S[34 - 2*j], T2 % 32) ^ T1;
- }
-
- D -= m_S[1]; B -= m_S[0];
-
- store_le(out, A, B, C, D);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* RC6 Key Schedule
-*/
-void RC6::key_schedule(const byte key[], size_t length)
- {
- m_S.resize(44);
-
- const size_t WORD_KEYLENGTH = (((length - 1) / 4) + 1);
- const size_t MIX_ROUNDS = 3 * std::max(WORD_KEYLENGTH, m_S.size());
-
- m_S[0] = 0xB7E15163;
- for(size_t i = 1; i != m_S.size(); ++i)
- m_S[i] = m_S[i-1] + 0x9E3779B9;
-
- secure_vector<u32bit> K(8);
-
- for(s32bit i = length-1; i >= 0; --i)
- K[i/4] = (K[i/4] << 8) + key[i];
-
- u32bit A = 0, B = 0;
- for(size_t i = 0; i != MIX_ROUNDS; ++i)
- {
- A = rotate_left(m_S[i % m_S.size()] + A + B, 3);
- B = rotate_left(K[i % WORD_KEYLENGTH] + A + B, (A + B) % 32);
- m_S[i % m_S.size()] = A;
- K[i % WORD_KEYLENGTH] = B;
- }
- }
-
-void RC6::clear()
- {
- zap(m_S);
- }
-
-}
diff --git a/src/lib/block/rc6/rc6.h b/src/lib/block/rc6/rc6.h
deleted file mode 100644
index 3f9bb0af1..000000000
--- a/src/lib/block/rc6/rc6.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-* RC6
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_RC6_H__
-#define BOTAN_RC6_H__
-
-#include <botan/block_cipher.h>
-
-namespace Botan {
-
-/**
-* RC6, Ron Rivest's AES candidate
-*/
-class BOTAN_DLL RC6 final : public Block_Cipher_Fixed_Params<16, 1, 32>
- {
- public:
- void encrypt_n(const byte in[], byte out[], size_t blocks) const override;
- void decrypt_n(const byte in[], byte out[], size_t blocks) const override;
-
- void clear() override;
- std::string name() const override { return "RC6"; }
- BlockCipher* clone() const override { return new RC6; }
- private:
- void key_schedule(const byte[], size_t) override;
-
- secure_vector<u32bit> m_S;
- };
-
-}
-
-#endif
diff --git a/src/lib/block/safer/info.txt b/src/lib/block/safer/info.txt
deleted file mode 100644
index ad7841dab..000000000
--- a/src/lib/block/safer/info.txt
+++ /dev/null
@@ -1 +0,0 @@
-define SAFER 20131128
diff --git a/src/lib/block/safer/safer_sk.cpp b/src/lib/block/safer/safer_sk.cpp
deleted file mode 100644
index 8dec0b897..000000000
--- a/src/lib/block/safer/safer_sk.cpp
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
-* SAFER-SK
-* (C) 1999-2009 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/safer_sk.h>
-#include <botan/rotate.h>
-#include <botan/parsing.h>
-
-namespace Botan {
-
-namespace {
-
-const byte EXP[256] = {
- 0x01, 0x2D, 0xE2, 0x93, 0xBE, 0x45, 0x15, 0xAE, 0x78, 0x03, 0x87, 0xA4,
- 0xB8, 0x38, 0xCF, 0x3F, 0x08, 0x67, 0x09, 0x94, 0xEB, 0x26, 0xA8, 0x6B,
- 0xBD, 0x18, 0x34, 0x1B, 0xBB, 0xBF, 0x72, 0xF7, 0x40, 0x35, 0x48, 0x9C,
- 0x51, 0x2F, 0x3B, 0x55, 0xE3, 0xC0, 0x9F, 0xD8, 0xD3, 0xF3, 0x8D, 0xB1,
- 0xFF, 0xA7, 0x3E, 0xDC, 0x86, 0x77, 0xD7, 0xA6, 0x11, 0xFB, 0xF4, 0xBA,
- 0x92, 0x91, 0x64, 0x83, 0xF1, 0x33, 0xEF, 0xDA, 0x2C, 0xB5, 0xB2, 0x2B,
- 0x88, 0xD1, 0x99, 0xCB, 0x8C, 0x84, 0x1D, 0x14, 0x81, 0x97, 0x71, 0xCA,
- 0x5F, 0xA3, 0x8B, 0x57, 0x3C, 0x82, 0xC4, 0x52, 0x5C, 0x1C, 0xE8, 0xA0,
- 0x04, 0xB4, 0x85, 0x4A, 0xF6, 0x13, 0x54, 0xB6, 0xDF, 0x0C, 0x1A, 0x8E,
- 0xDE, 0xE0, 0x39, 0xFC, 0x20, 0x9B, 0x24, 0x4E, 0xA9, 0x98, 0x9E, 0xAB,
- 0xF2, 0x60, 0xD0, 0x6C, 0xEA, 0xFA, 0xC7, 0xD9, 0x00, 0xD4, 0x1F, 0x6E,
- 0x43, 0xBC, 0xEC, 0x53, 0x89, 0xFE, 0x7A, 0x5D, 0x49, 0xC9, 0x32, 0xC2,
- 0xF9, 0x9A, 0xF8, 0x6D, 0x16, 0xDB, 0x59, 0x96, 0x44, 0xE9, 0xCD, 0xE6,
- 0x46, 0x42, 0x8F, 0x0A, 0xC1, 0xCC, 0xB9, 0x65, 0xB0, 0xD2, 0xC6, 0xAC,
- 0x1E, 0x41, 0x62, 0x29, 0x2E, 0x0E, 0x74, 0x50, 0x02, 0x5A, 0xC3, 0x25,
- 0x7B, 0x8A, 0x2A, 0x5B, 0xF0, 0x06, 0x0D, 0x47, 0x6F, 0x70, 0x9D, 0x7E,
- 0x10, 0xCE, 0x12, 0x27, 0xD5, 0x4C, 0x4F, 0xD6, 0x79, 0x30, 0x68, 0x36,
- 0x75, 0x7D, 0xE4, 0xED, 0x80, 0x6A, 0x90, 0x37, 0xA2, 0x5E, 0x76, 0xAA,
- 0xC5, 0x7F, 0x3D, 0xAF, 0xA5, 0xE5, 0x19, 0x61, 0xFD, 0x4D, 0x7C, 0xB7,
- 0x0B, 0xEE, 0xAD, 0x4B, 0x22, 0xF5, 0xE7, 0x73, 0x23, 0x21, 0xC8, 0x05,
- 0xE1, 0x66, 0xDD, 0xB3, 0x58, 0x69, 0x63, 0x56, 0x0F, 0xA1, 0x31, 0x95,
- 0x17, 0x07, 0x3A, 0x28 };
-
-const byte LOG[512] = {
- 0x80, 0x00, 0xB0, 0x09, 0x60, 0xEF, 0xB9, 0xFD, 0x10, 0x12, 0x9F, 0xE4,
- 0x69, 0xBA, 0xAD, 0xF8, 0xC0, 0x38, 0xC2, 0x65, 0x4F, 0x06, 0x94, 0xFC,
- 0x19, 0xDE, 0x6A, 0x1B, 0x5D, 0x4E, 0xA8, 0x82, 0x70, 0xED, 0xE8, 0xEC,
- 0x72, 0xB3, 0x15, 0xC3, 0xFF, 0xAB, 0xB6, 0x47, 0x44, 0x01, 0xAC, 0x25,
- 0xC9, 0xFA, 0x8E, 0x41, 0x1A, 0x21, 0xCB, 0xD3, 0x0D, 0x6E, 0xFE, 0x26,
- 0x58, 0xDA, 0x32, 0x0F, 0x20, 0xA9, 0x9D, 0x84, 0x98, 0x05, 0x9C, 0xBB,
- 0x22, 0x8C, 0x63, 0xE7, 0xC5, 0xE1, 0x73, 0xC6, 0xAF, 0x24, 0x5B, 0x87,
- 0x66, 0x27, 0xF7, 0x57, 0xF4, 0x96, 0xB1, 0xB7, 0x5C, 0x8B, 0xD5, 0x54,
- 0x79, 0xDF, 0xAA, 0xF6, 0x3E, 0xA3, 0xF1, 0x11, 0xCA, 0xF5, 0xD1, 0x17,
- 0x7B, 0x93, 0x83, 0xBC, 0xBD, 0x52, 0x1E, 0xEB, 0xAE, 0xCC, 0xD6, 0x35,
- 0x08, 0xC8, 0x8A, 0xB4, 0xE2, 0xCD, 0xBF, 0xD9, 0xD0, 0x50, 0x59, 0x3F,
- 0x4D, 0x62, 0x34, 0x0A, 0x48, 0x88, 0xB5, 0x56, 0x4C, 0x2E, 0x6B, 0x9E,
- 0xD2, 0x3D, 0x3C, 0x03, 0x13, 0xFB, 0x97, 0x51, 0x75, 0x4A, 0x91, 0x71,
- 0x23, 0xBE, 0x76, 0x2A, 0x5F, 0xF9, 0xD4, 0x55, 0x0B, 0xDC, 0x37, 0x31,
- 0x16, 0x74, 0xD7, 0x77, 0xA7, 0xE6, 0x07, 0xDB, 0xA4, 0x2F, 0x46, 0xF3,
- 0x61, 0x45, 0x67, 0xE3, 0x0C, 0xA2, 0x3B, 0x1C, 0x85, 0x18, 0x04, 0x1D,
- 0x29, 0xA0, 0x8F, 0xB2, 0x5A, 0xD8, 0xA6, 0x7E, 0xEE, 0x8D, 0x53, 0x4B,
- 0xA1, 0x9A, 0xC1, 0x0E, 0x7A, 0x49, 0xA5, 0x2C, 0x81, 0xC4, 0xC7, 0x36,
- 0x2B, 0x7F, 0x43, 0x95, 0x33, 0xF2, 0x6C, 0x68, 0x6D, 0xF0, 0x02, 0x28,
- 0xCE, 0xDD, 0x9B, 0xEA, 0x5E, 0x99, 0x7C, 0x14, 0x86, 0xCF, 0xE5, 0x42,
- 0xB8, 0x40, 0x78, 0x2D, 0x3A, 0xE9, 0x64, 0x1F, 0x92, 0x90, 0x7D, 0x39,
- 0x6F, 0xE0, 0x89, 0x30, 0x80, 0x00, 0xB0, 0x09, 0x60, 0xEF, 0xB9, 0xFD,
- 0x10, 0x12, 0x9F, 0xE4, 0x69, 0xBA, 0xAD, 0xF8, 0xC0, 0x38, 0xC2, 0x65,
- 0x4F, 0x06, 0x94, 0xFC, 0x19, 0xDE, 0x6A, 0x1B, 0x5D, 0x4E, 0xA8, 0x82,
- 0x70, 0xED, 0xE8, 0xEC, 0x72, 0xB3, 0x15, 0xC3, 0xFF, 0xAB, 0xB6, 0x47,
- 0x44, 0x01, 0xAC, 0x25, 0xC9, 0xFA, 0x8E, 0x41, 0x1A, 0x21, 0xCB, 0xD3,
- 0x0D, 0x6E, 0xFE, 0x26, 0x58, 0xDA, 0x32, 0x0F, 0x20, 0xA9, 0x9D, 0x84,
- 0x98, 0x05, 0x9C, 0xBB, 0x22, 0x8C, 0x63, 0xE7, 0xC5, 0xE1, 0x73, 0xC6,
- 0xAF, 0x24, 0x5B, 0x87, 0x66, 0x27, 0xF7, 0x57, 0xF4, 0x96, 0xB1, 0xB7,
- 0x5C, 0x8B, 0xD5, 0x54, 0x79, 0xDF, 0xAA, 0xF6, 0x3E, 0xA3, 0xF1, 0x11,
- 0xCA, 0xF5, 0xD1, 0x17, 0x7B, 0x93, 0x83, 0xBC, 0xBD, 0x52, 0x1E, 0xEB,
- 0xAE, 0xCC, 0xD6, 0x35, 0x08, 0xC8, 0x8A, 0xB4, 0xE2, 0xCD, 0xBF, 0xD9,
- 0xD0, 0x50, 0x59, 0x3F, 0x4D, 0x62, 0x34, 0x0A, 0x48, 0x88, 0xB5, 0x56,
- 0x4C, 0x2E, 0x6B, 0x9E, 0xD2, 0x3D, 0x3C, 0x03, 0x13, 0xFB, 0x97, 0x51,
- 0x75, 0x4A, 0x91, 0x71, 0x23, 0xBE, 0x76, 0x2A, 0x5F, 0xF9, 0xD4, 0x55,
- 0x0B, 0xDC, 0x37, 0x31, 0x16, 0x74, 0xD7, 0x77, 0xA7, 0xE6, 0x07, 0xDB,
- 0xA4, 0x2F, 0x46, 0xF3, 0x61, 0x45, 0x67, 0xE3, 0x0C, 0xA2, 0x3B, 0x1C,
- 0x85, 0x18, 0x04, 0x1D, 0x29, 0xA0, 0x8F, 0xB2, 0x5A, 0xD8, 0xA6, 0x7E,
- 0xEE, 0x8D, 0x53, 0x4B, 0xA1, 0x9A, 0xC1, 0x0E, 0x7A, 0x49, 0xA5, 0x2C,
- 0x81, 0xC4, 0xC7, 0x36, 0x2B, 0x7F, 0x43, 0x95, 0x33, 0xF2, 0x6C, 0x68,
- 0x6D, 0xF0, 0x02, 0x28, 0xCE, 0xDD, 0x9B, 0xEA, 0x5E, 0x99, 0x7C, 0x14,
- 0x86, 0xCF, 0xE5, 0x42, 0xB8, 0x40, 0x78, 0x2D, 0x3A, 0xE9, 0x64, 0x1F,
- 0x92, 0x90, 0x7D, 0x39, 0x6F, 0xE0, 0x89, 0x30 };
-
-}
-
-/*
-* SAFER-SK Encryption
-*/
-void SAFER_SK::encrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- byte A = in[0], B = in[1], C = in[2], D = in[3],
- E = in[4], F = in[5], G = in[6], H = in[7], X, Y;
-
- for(size_t j = 0; j != 16*m_rounds; j += 16)
- {
- A = EXP[A ^ m_EK[j ]]; B = LOG[B + m_EK[j+1]];
- C = LOG[C + m_EK[j+2]]; D = EXP[D ^ m_EK[j+3]];
- E = EXP[E ^ m_EK[j+4]]; F = LOG[F + m_EK[j+5]];
- G = LOG[G + m_EK[j+6]]; H = EXP[H ^ m_EK[j+7]];
-
- A += m_EK[j+ 8]; B ^= m_EK[j+ 9]; C ^= m_EK[j+10]; D += m_EK[j+11];
- E += m_EK[j+12]; F ^= m_EK[j+13]; G ^= m_EK[j+14]; H += m_EK[j+15];
-
- B += A; D += C; F += E; H += G; A += B; C += D; E += F; G += H;
- C += A; G += E; D += B; H += F; A += C; E += G; B += D; F += H;
- H += D; Y = D + H; D = B + F; X = B + D; B = A + E;
- A += B; F = C + G; E = C + F; C = X; G = Y;
- }
-
- out[0] = A ^ m_EK[16*m_rounds+0]; out[1] = B + m_EK[16*m_rounds+1];
- out[2] = C + m_EK[16*m_rounds+2]; out[3] = D ^ m_EK[16*m_rounds+3];
- out[4] = E ^ m_EK[16*m_rounds+4]; out[5] = F + m_EK[16*m_rounds+5];
- out[6] = G + m_EK[16*m_rounds+6]; out[7] = H ^ m_EK[16*m_rounds+7];
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* SAFER-SK Decryption
-*/
-void SAFER_SK::decrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- byte A = in[0], B = in[1], C = in[2], D = in[3],
- E = in[4], F = in[5], G = in[6], H = in[7];
-
- A ^= m_EK[16*m_rounds+0]; B -= m_EK[16*m_rounds+1]; C -= m_EK[16*m_rounds+2];
- D ^= m_EK[16*m_rounds+3]; E ^= m_EK[16*m_rounds+4]; F -= m_EK[16*m_rounds+5];
- G -= m_EK[16*m_rounds+6]; H ^= m_EK[16*m_rounds+7];
-
- for(s32bit j = 16*(m_rounds-1); j >= 0; j -= 16)
- {
- byte T = E; E = B; B = C; C = T; T = F; F = D; D = G; G = T;
- A -= E; B -= F; C -= G; D -= H; E -= A; F -= B; G -= C; H -= D;
- A -= C; E -= G; B -= D; F -= H; C -= A; G -= E; D -= B; H -= F;
- A -= B; C -= D; E -= F; G -= H; B -= A; D -= C; F -= E; H -= G;
-
- A = LOG[A - m_EK[j+8 ] + 256]; B = EXP[B ^ m_EK[j+9 ]];
- C = EXP[C ^ m_EK[j+10]]; D = LOG[D - m_EK[j+11] + 256];
- E = LOG[E - m_EK[j+12] + 256]; F = EXP[F ^ m_EK[j+13]];
- G = EXP[G ^ m_EK[j+14]]; H = LOG[H - m_EK[j+15] + 256];
-
- A ^= m_EK[j+0]; B -= m_EK[j+1]; C -= m_EK[j+2]; D ^= m_EK[j+3];
- E ^= m_EK[j+4]; F -= m_EK[j+5]; G -= m_EK[j+6]; H ^= m_EK[j+7];
- }
-
- out[0] = A; out[1] = B; out[2] = C; out[3] = D;
- out[4] = E; out[5] = F; out[6] = G; out[7] = H;
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* SAFER-SK Key Schedule
-*/
-void SAFER_SK::key_schedule(const byte key[], size_t)
- {
- const byte BIAS[208] = {
- 0x16, 0x73, 0x3B, 0x1E, 0x8E, 0x70, 0xBD, 0x86, 0x47, 0x7E, 0x24, 0x56,
- 0xF1, 0x77, 0x88, 0x46, 0xB1, 0xBA, 0xA3, 0xB7, 0x10, 0x0A, 0xC5, 0x37,
- 0xC9, 0x5A, 0x28, 0xAC, 0x64, 0xA5, 0xEC, 0xAB, 0xC6, 0x67, 0x95, 0x58,
- 0x0D, 0xF8, 0x9A, 0xF6, 0x66, 0xDC, 0x05, 0x3D, 0xD3, 0x8A, 0xC3, 0xD8,
- 0x6A, 0xE9, 0x36, 0x49, 0x43, 0xBF, 0xEB, 0xD4, 0x9B, 0x68, 0xA0, 0x65,
- 0x5D, 0x57, 0x92, 0x1F, 0x71, 0x5C, 0xBB, 0x22, 0xC1, 0xBE, 0x7B, 0xBC,
- 0x63, 0x94, 0x5F, 0x2A, 0x61, 0xB8, 0x34, 0x32, 0xFD, 0xFB, 0x17, 0x40,
- 0xE6, 0x51, 0x1D, 0x41, 0x8F, 0x29, 0xDD, 0x04, 0x80, 0xDE, 0xE7, 0x31,
- 0x7F, 0x01, 0xA2, 0xF7, 0x39, 0xDA, 0x6F, 0x23, 0xFE, 0x3A, 0xD0, 0x1C,
- 0xD1, 0x30, 0x3E, 0x12, 0xCD, 0x0F, 0xE0, 0xA8, 0xAF, 0x82, 0x59, 0x2C,
- 0x7D, 0xAD, 0xB2, 0xEF, 0xC2, 0x87, 0xCE, 0x75, 0x13, 0x02, 0x90, 0x4F,
- 0x2E, 0x72, 0x33, 0x85, 0x8D, 0xCF, 0xA9, 0x81, 0xE2, 0xC4, 0x27, 0x2F,
- 0x7A, 0x9F, 0x52, 0xE1, 0x15, 0x38, 0x2B, 0xFC, 0x42, 0xC7, 0x08, 0xE4,
- 0x09, 0x55, 0x5E, 0x8C, 0x76, 0x60, 0xFF, 0xDF, 0xD7, 0x98, 0xFA, 0x0B,
- 0x00, 0x1A, 0xF9, 0xA6, 0xB9, 0xE8, 0x9E, 0x62, 0xD9, 0x91, 0x50, 0xD2,
- 0xEE, 0x18, 0xB4, 0x07, 0xEA, 0x5B, 0xA4, 0xC8, 0x0E, 0xCB, 0x48, 0x69,
- 0x4E, 0x9C, 0x35, 0x79, 0x45, 0x4D, 0x54, 0xE5, 0x3C, 0x0C, 0x4A, 0x8B,
- 0x3F, 0xCC, 0xA7, 0xDB };
-
- const byte KEY_INDEX[208] = {
- 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0D, 0x0E,
- 0x0F, 0x10, 0x11, 0x09, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01,
- 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08,
- 0x00, 0x01, 0x02, 0x03, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
- 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x11, 0x09, 0x0A, 0x0B,
- 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x02, 0x03, 0x04, 0x05,
- 0x06, 0x07, 0x08, 0x00, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A,
- 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01, 0x02, 0x0E, 0x0F, 0x10, 0x11,
- 0x09, 0x0A, 0x0B, 0x0C, 0x06, 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04,
- 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x08, 0x00, 0x01, 0x02,
- 0x03, 0x04, 0x05, 0x06, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
- 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0B, 0x0C, 0x0D, 0x0E,
- 0x0F, 0x10, 0x11, 0x09, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x01,
- 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08,
- 0x00, 0x01, 0x02, 0x03, 0x0F, 0x10, 0x11, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
- 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x11, 0x09, 0x0A, 0x0B,
- 0x0C, 0x0D, 0x0E, 0x0F };
-
- m_EK.resize(16 * m_rounds + 8);
-
- secure_vector<byte> KB(18);
-
- for(size_t i = 0; i != 8; ++i)
- {
- KB[ 8] ^= KB[i] = rotate_left(key[i], 5);
- KB[17] ^= KB[i+9] = m_EK[i] = key[i+8];
- }
-
- for(size_t i = 0; i != m_rounds; ++i)
- {
- for(size_t j = 0; j != 18; ++j)
- KB[j] = rotate_left(KB[j], 6);
- for(size_t j = 0; j != 16; ++j)
- m_EK[16*i+j+8] = KB[KEY_INDEX[16*i+j]] + BIAS[16*i+j];
- }
- }
-
-void SAFER_SK::clear()
- {
- zap(m_EK);
- }
-
-/*
-* Return the name of this type
-*/
-std::string SAFER_SK::name() const
- {
- return "SAFER-SK(" + std::to_string(m_rounds) + ")";
- }
-
-/*
-* Return a clone of this object
-*/
-BlockCipher* SAFER_SK::clone() const
- {
- return new SAFER_SK(m_rounds);
- }
-
-/*
-* SAFER-SK Constructor
-*/
-SAFER_SK::SAFER_SK(size_t r) : m_rounds(r)
- {
- if(m_rounds > 13 || m_rounds == 0)
- throw Invalid_Argument(name() + ": Invalid number of rounds");
- }
-
-}
diff --git a/src/lib/block/safer/safer_sk.h b/src/lib/block/safer/safer_sk.h
deleted file mode 100644
index af944b36c..000000000
--- a/src/lib/block/safer/safer_sk.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-* SAFER-SK
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_SAFER_SK_H__
-#define BOTAN_SAFER_SK_H__
-
-#include <botan/block_cipher.h>
-
-namespace Botan {
-
-/**
-* SAFER-SK
-*/
-class BOTAN_DLL SAFER_SK final : public Block_Cipher_Fixed_Params<8, 16>
- {
- public:
- void encrypt_n(const byte in[], byte out[], size_t blocks) const override;
- void decrypt_n(const byte in[], byte out[], size_t blocks) const override;
-
- void clear() override;
- std::string name() const override;
- BlockCipher* clone() const override;
-
- /**
- * @param rounds the number of rounds to use - must be between 1
- * and 13
- */
- explicit SAFER_SK(size_t rounds);
- private:
- void key_schedule(const byte[], size_t) override;
-
- size_t m_rounds;
- secure_vector<byte> m_EK;
- };
-
-}
-
-#endif
diff --git a/src/lib/block/tea/info.txt b/src/lib/block/tea/info.txt
deleted file mode 100644
index 14edfdb03..000000000
--- a/src/lib/block/tea/info.txt
+++ /dev/null
@@ -1 +0,0 @@
-define TEA 20131128
diff --git a/src/lib/block/tea/tea.cpp b/src/lib/block/tea/tea.cpp
deleted file mode 100644
index 457171e1d..000000000
--- a/src/lib/block/tea/tea.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-* TEA
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/tea.h>
-#include <botan/loadstor.h>
-
-namespace Botan {
-
-/*
-* TEA Encryption
-*/
-void TEA::encrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u32bit L = load_be<u32bit>(in, 0);
- u32bit R = load_be<u32bit>(in, 1);
-
- u32bit S = 0;
- for(size_t j = 0; j != 32; ++j)
- {
- S += 0x9E3779B9;
- L += ((R << 4) + m_K[0]) ^ (R + S) ^ ((R >> 5) + m_K[1]);
- R += ((L << 4) + m_K[2]) ^ (L + S) ^ ((L >> 5) + m_K[3]);
- }
-
- store_be(out, L, R);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* TEA Decryption
-*/
-void TEA::decrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- for(size_t i = 0; i != blocks; ++i)
- {
- u32bit L = load_be<u32bit>(in, 0);
- u32bit R = load_be<u32bit>(in, 1);
-
- u32bit S = 0xC6EF3720;
- for(size_t j = 0; j != 32; ++j)
- {
- R -= ((L << 4) + m_K[2]) ^ (L + S) ^ ((L >> 5) + m_K[3]);
- L -= ((R << 4) + m_K[0]) ^ (R + S) ^ ((R >> 5) + m_K[1]);
- S -= 0x9E3779B9;
- }
-
- store_be(out, L, R);
-
- in += BLOCK_SIZE;
- out += BLOCK_SIZE;
- }
- }
-
-/*
-* TEA Key Schedule
-*/
-void TEA::key_schedule(const byte key[], size_t)
- {
- m_K.resize(4);
- for(size_t i = 0; i != 4; ++i)
- m_K[i] = load_be<u32bit>(key, i);
- }
-
-void TEA::clear()
- {
- zap(m_K);
- }
-
-}
diff --git a/src/lib/block/tea/tea.h b/src/lib/block/tea/tea.h
deleted file mode 100644
index 6b6308381..000000000
--- a/src/lib/block/tea/tea.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-* TEA
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_TEA_H__
-#define BOTAN_TEA_H__
-
-#include <botan/block_cipher.h>
-
-namespace Botan {
-
-/**
-* TEA
-*/
-class BOTAN_DLL TEA final : public Block_Cipher_Fixed_Params<8, 16>
- {
- public:
- void encrypt_n(const byte in[], byte out[], size_t blocks) const override;
- void decrypt_n(const byte in[], byte out[], size_t blocks) const override;
-
- void clear() override;
- std::string name() const override { return "TEA"; }
- BlockCipher* clone() const override { return new TEA; }
- private:
- void key_schedule(const byte[], size_t) override;
- secure_vector<u32bit> m_K;
- };
-
-}
-
-#endif
diff --git a/src/lib/block/xtea_simd/info.txt b/src/lib/block/xtea_simd/info.txt
deleted file mode 100644
index 01fb4110d..000000000
--- a/src/lib/block/xtea_simd/info.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-define XTEA_SIMD 20131128
-
-<requires>
-xtea
-simd
-</requires>
diff --git a/src/lib/block/xtea_simd/xtea_simd.cpp b/src/lib/block/xtea_simd/xtea_simd.cpp
deleted file mode 100644
index 6e50f4ff7..000000000
--- a/src/lib/block/xtea_simd/xtea_simd.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
-* XTEA in SIMD
-* (C) 2009 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/xtea_simd.h>
-#include <botan/internal/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(size_t 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(size_t 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[], size_t blocks) const
- {
- const u32bit* KS = &(this->get_EK()[0]);
-
- while(blocks >= 8)
- {
- xtea_encrypt_8(in, out, KS);
- in += 8 * BLOCK_SIZE;
- out += 8 * BLOCK_SIZE;
- blocks -= 8;
- }
-
- if(blocks)
- XTEA::encrypt_n(in, out, blocks);
- }
-
-/*
-* XTEA Decryption
-*/
-void XTEA_SIMD::decrypt_n(const byte in[], byte out[], size_t blocks) const
- {
- const u32bit* KS = &(this->get_EK()[0]);
-
- while(blocks >= 8)
- {
- xtea_decrypt_8(in, out, KS);
- in += 8 * BLOCK_SIZE;
- out += 8 * BLOCK_SIZE;
- blocks -= 8;
- }
-
- if(blocks)
- XTEA::decrypt_n(in, out, blocks);
- }
-
-}
diff --git a/src/lib/block/xtea_simd/xtea_simd.h b/src/lib/block/xtea_simd/xtea_simd.h
deleted file mode 100644
index 0b0558032..000000000
--- a/src/lib/block/xtea_simd/xtea_simd.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-* XTEA in SIMD
-* (C) 2009 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_XTEA_SIMD_H__
-#define BOTAN_XTEA_SIMD_H__
-
-#include <botan/xtea.h>
-
-namespace Botan {
-
-/**
-* XTEA implemented using SIMD operations
-*/
-class BOTAN_DLL XTEA_SIMD final : public XTEA
- {
- public:
- size_t parallelism() const override { return 8; }
-
- void encrypt_n(const byte in[], byte out[], size_t blocks) const override;
- void decrypt_n(const byte in[], byte out[], size_t blocks) const override;
- BlockCipher* clone() const override { return new XTEA_SIMD; }
- };
-
-}
-
-#endif
diff --git a/src/lib/cert/x509/key_constraint.cpp b/src/lib/cert/x509/key_constraint.cpp
index a90af013c..30d1cb3b8 100644
--- a/src/lib/cert/x509/key_constraint.cpp
+++ b/src/lib/cert/x509/key_constraint.cpp
@@ -31,8 +31,7 @@ void verify_cert_constraints_valid_for_key_type(const Public_Key& pub_key,
permitted |= KEY_ENCIPHERMENT | DATA_ENCIPHERMENT;
}
- if(name == "RSA" || name == "RW" || name == "NR" ||
- name == "DSA" || name == "ECDSA" || name == "ECGDSA" || name == "ECKCDSA")
+ if(name == "RSA" || name == "DSA" || name == "ECDSA" || name == "ECGDSA" || name == "ECKCDSA")
{
permitted |= DIGITAL_SIGNATURE | NON_REPUDIATION | KEY_CERT_SIGN | CRL_SIGN;
}
diff --git a/src/lib/cert/x509/x509_ca.h b/src/lib/cert/x509/x509_ca.h
index 6ea51cd06..ba3724f5e 100644
--- a/src/lib/cert/x509/x509_ca.h
+++ b/src/lib/cert/x509/x509_ca.h
@@ -22,7 +22,6 @@ namespace Botan {
class BOTAN_DLL X509_CA
{
public:
-
/**
* Sign a PKCS#10 Request.
* @param req the request to sign
diff --git a/src/lib/cert/x509/x509cert.cpp b/src/lib/cert/x509/x509cert.cpp
index cb9b644bc..8166e43ef 100644
--- a/src/lib/cert/x509/x509cert.cpp
+++ b/src/lib/cert/x509/x509cert.cpp
@@ -72,32 +72,6 @@ X509_Certificate::X509_Certificate(const std::vector<byte>& in) :
do_decode();
}
-X509_Certificate::X509_Certificate(const X509_Certificate& other) :
- X509_Object(other)
- {
- m_subject = other.m_subject;
- m_issuer = other.m_issuer;
- m_self_signed = other.m_self_signed;
- m_v3_extensions = other.m_v3_extensions;
- }
-
-X509_Certificate& X509_Certificate::operator=(const X509_Certificate& other)
- {
- if(&other == this)
- {
- return *this;
- }
- else
- {
- m_subject = other.m_subject;
- m_issuer = other.m_issuer;
- m_self_signed = other.m_self_signed;
- m_v3_extensions = other.m_v3_extensions;
- }
- return *this;
- }
-
-
/*
* Decode the TBSCertificate data
*/
@@ -276,16 +250,18 @@ bool X509_Certificate::allowed_extended_usage(const std::string& usage) const
bool X509_Certificate::allowed_usage(Usage_Type usage) const
{
+ // These follow suggestions in RFC 5280 4.2.1.12
+
switch(usage)
{
case Usage_Type::UNSPECIFIED:
return true;
case Usage_Type::TLS_SERVER_AUTH:
- return (allowed_usage(DATA_ENCIPHERMENT) || allowed_usage(KEY_ENCIPHERMENT) || allowed_usage(DIGITAL_SIGNATURE)) && allowed_extended_usage("PKIX.ServerAuth");
+ return (allowed_usage(KEY_AGREEMENT) || allowed_usage(KEY_ENCIPHERMENT) || allowed_usage(DIGITAL_SIGNATURE)) && allowed_extended_usage("PKIX.ServerAuth");
case Usage_Type::TLS_CLIENT_AUTH:
- return (allowed_usage(DIGITAL_SIGNATURE) || allowed_usage(NON_REPUDIATION)) && allowed_extended_usage("PKIX.ClientAuth");
+ return (allowed_usage(DIGITAL_SIGNATURE) || allowed_usage(KEY_AGREEMENT)) && allowed_extended_usage("PKIX.ClientAuth");
case Usage_Type::OCSP_RESPONDER:
return (allowed_usage(DIGITAL_SIGNATURE) || allowed_usage(NON_REPUDIATION)) && allowed_extended_usage("PKIX.OCSPSigning");
diff --git a/src/lib/cert/x509/x509cert.h b/src/lib/cert/x509/x509cert.h
index eb98f9c3d..d64d8fd2b 100644
--- a/src/lib/cert/x509/x509cert.h
+++ b/src/lib/cert/x509/x509cert.h
@@ -274,9 +274,9 @@ class BOTAN_DLL X509_Certificate : public X509_Object
explicit X509_Certificate(const std::vector<byte>& in);
- X509_Certificate(const X509_Certificate& other);
+ X509_Certificate(const X509_Certificate& other) = default;
- X509_Certificate& operator=(const X509_Certificate& other);
+ X509_Certificate& operator=(const X509_Certificate& other) = default;
private:
void force_decode() override;
diff --git a/src/lib/hash/has160/has160.cpp b/src/lib/hash/has160/has160.cpp
deleted file mode 100644
index 114b5f8b5..000000000
--- a/src/lib/hash/has160/has160.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
-* HAS-160
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/has160.h>
-
-namespace Botan {
-
-namespace HAS_160_F {
-
-/*
-* HAS-160 F1 Function
-*/
-inline void F1(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E,
- u32bit msg, u32bit rot)
- {
- E += rotate_left(A, rot) + (D ^ (B & (C ^ D))) + msg;
- B = rotate_left(B, 10);
- }
-
-/*
-* HAS-160 F2 Function
-*/
-inline void F2(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E,
- u32bit msg, u32bit rot)
- {
- E += rotate_left(A, rot) + (B ^ C ^ D) + msg + 0x5A827999;
- B = rotate_left(B, 17);
- }
-
-/*
-* HAS-160 F3 Function
-*/
-inline void F3(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E,
- u32bit msg, u32bit rot)
- {
- E += rotate_left(A, rot) + (C ^ (B | ~D)) + msg + 0x6ED9EBA1;
- B = rotate_left(B, 25);
- }
-
-/*
-* HAS-160 F4 Function
-*/
-inline void F4(u32bit A, u32bit& B, u32bit C, u32bit D, u32bit& E,
- u32bit msg, u32bit rot)
- {
- E += rotate_left(A, rot) + (B ^ C ^ D) + msg + 0x8F1BBCDC;
- B = rotate_left(B, 30);
- }
-
-}
-
-/*
-* HAS-160 Compression Function
-*/
-void HAS_160::compress_n(const byte input[], size_t blocks)
- {
- using namespace HAS_160_F;
-
- u32bit A = m_digest[0], B = m_digest[1], C = m_digest[2],
- D = m_digest[3], E = m_digest[4];
-
- for(size_t i = 0; i != blocks; ++i)
- {
- load_le(m_X.data(), input, 16);
-
- m_X[16] = m_X[ 0] ^ m_X[ 1] ^ m_X[ 2] ^ m_X[ 3];
- m_X[17] = m_X[ 4] ^ m_X[ 5] ^ m_X[ 6] ^ m_X[ 7];
- m_X[18] = m_X[ 8] ^ m_X[ 9] ^ m_X[10] ^ m_X[11];
- m_X[19] = m_X[12] ^ m_X[13] ^ m_X[14] ^ m_X[15];
- F1(A,B,C,D,E,m_X[18], 5); F1(E,A,B,C,D,m_X[ 0],11);
- F1(D,E,A,B,C,m_X[ 1], 7); F1(C,D,E,A,B,m_X[ 2],15);
- F1(B,C,D,E,A,m_X[ 3], 6); F1(A,B,C,D,E,m_X[19],13);
- F1(E,A,B,C,D,m_X[ 4], 8); F1(D,E,A,B,C,m_X[ 5],14);
- F1(C,D,E,A,B,m_X[ 6], 7); F1(B,C,D,E,A,m_X[ 7],12);
- F1(A,B,C,D,E,m_X[16], 9); F1(E,A,B,C,D,m_X[ 8],11);
- F1(D,E,A,B,C,m_X[ 9], 8); F1(C,D,E,A,B,m_X[10],15);
- F1(B,C,D,E,A,m_X[11], 6); F1(A,B,C,D,E,m_X[17],12);
- F1(E,A,B,C,D,m_X[12], 9); F1(D,E,A,B,C,m_X[13],14);
- F1(C,D,E,A,B,m_X[14], 5); F1(B,C,D,E,A,m_X[15],13);
-
- m_X[16] = m_X[ 3] ^ m_X[ 6] ^ m_X[ 9] ^ m_X[12];
- m_X[17] = m_X[ 2] ^ m_X[ 5] ^ m_X[ 8] ^ m_X[15];
- m_X[18] = m_X[ 1] ^ m_X[ 4] ^ m_X[11] ^ m_X[14];
- m_X[19] = m_X[ 0] ^ m_X[ 7] ^ m_X[10] ^ m_X[13];
- F2(A,B,C,D,E,m_X[18], 5); F2(E,A,B,C,D,m_X[ 3],11);
- F2(D,E,A,B,C,m_X[ 6], 7); F2(C,D,E,A,B,m_X[ 9],15);
- F2(B,C,D,E,A,m_X[12], 6); F2(A,B,C,D,E,m_X[19],13);
- F2(E,A,B,C,D,m_X[15], 8); F2(D,E,A,B,C,m_X[ 2],14);
- F2(C,D,E,A,B,m_X[ 5], 7); F2(B,C,D,E,A,m_X[ 8],12);
- F2(A,B,C,D,E,m_X[16], 9); F2(E,A,B,C,D,m_X[11],11);
- F2(D,E,A,B,C,m_X[14], 8); F2(C,D,E,A,B,m_X[ 1],15);
- F2(B,C,D,E,A,m_X[ 4], 6); F2(A,B,C,D,E,m_X[17],12);
- F2(E,A,B,C,D,m_X[ 7], 9); F2(D,E,A,B,C,m_X[10],14);
- F2(C,D,E,A,B,m_X[13], 5); F2(B,C,D,E,A,m_X[ 0],13);
-
- m_X[16] = m_X[ 5] ^ m_X[ 7] ^ m_X[12] ^ m_X[14];
- m_X[17] = m_X[ 0] ^ m_X[ 2] ^ m_X[ 9] ^ m_X[11];
- m_X[18] = m_X[ 4] ^ m_X[ 6] ^ m_X[13] ^ m_X[15];
- m_X[19] = m_X[ 1] ^ m_X[ 3] ^ m_X[ 8] ^ m_X[10];
- F3(A,B,C,D,E,m_X[18], 5); F3(E,A,B,C,D,m_X[12],11);
- F3(D,E,A,B,C,m_X[ 5], 7); F3(C,D,E,A,B,m_X[14],15);
- F3(B,C,D,E,A,m_X[ 7], 6); F3(A,B,C,D,E,m_X[19],13);
- F3(E,A,B,C,D,m_X[ 0], 8); F3(D,E,A,B,C,m_X[ 9],14);
- F3(C,D,E,A,B,m_X[ 2], 7); F3(B,C,D,E,A,m_X[11],12);
- F3(A,B,C,D,E,m_X[16], 9); F3(E,A,B,C,D,m_X[ 4],11);
- F3(D,E,A,B,C,m_X[13], 8); F3(C,D,E,A,B,m_X[ 6],15);
- F3(B,C,D,E,A,m_X[15], 6); F3(A,B,C,D,E,m_X[17],12);
- F3(E,A,B,C,D,m_X[ 8], 9); F3(D,E,A,B,C,m_X[ 1],14);
- F3(C,D,E,A,B,m_X[10], 5); F3(B,C,D,E,A,m_X[ 3],13);
-
- m_X[16] = m_X[ 2] ^ m_X[ 7] ^ m_X[ 8] ^ m_X[13];
- m_X[17] = m_X[ 3] ^ m_X[ 4] ^ m_X[ 9] ^ m_X[14];
- m_X[18] = m_X[ 0] ^ m_X[ 5] ^ m_X[10] ^ m_X[15];
- m_X[19] = m_X[ 1] ^ m_X[ 6] ^ m_X[11] ^ m_X[12];
- F4(A,B,C,D,E,m_X[18], 5); F4(E,A,B,C,D,m_X[ 7],11);
- F4(D,E,A,B,C,m_X[ 2], 7); F4(C,D,E,A,B,m_X[13],15);
- F4(B,C,D,E,A,m_X[ 8], 6); F4(A,B,C,D,E,m_X[19],13);
- F4(E,A,B,C,D,m_X[ 3], 8); F4(D,E,A,B,C,m_X[14],14);
- F4(C,D,E,A,B,m_X[ 9], 7); F4(B,C,D,E,A,m_X[ 4],12);
- F4(A,B,C,D,E,m_X[16], 9); F4(E,A,B,C,D,m_X[15],11);
- F4(D,E,A,B,C,m_X[10], 8); F4(C,D,E,A,B,m_X[ 5],15);
- F4(B,C,D,E,A,m_X[ 0], 6); F4(A,B,C,D,E,m_X[17],12);
- F4(E,A,B,C,D,m_X[11], 9); F4(D,E,A,B,C,m_X[ 6],14);
- F4(C,D,E,A,B,m_X[ 1], 5); F4(B,C,D,E,A,m_X[12],13);
-
- A = (m_digest[0] += A);
- B = (m_digest[1] += B);
- C = (m_digest[2] += C);
- D = (m_digest[3] += D);
- E = (m_digest[4] += E);
-
- input += hash_block_size();
- }
- }
-
-/*
-* Copy out the digest
-*/
-void HAS_160::copy_out(byte output[])
- {
- copy_out_vec_le(output, output_length(), m_digest);
- }
-
-/*
-* Clear memory of sensitive data
-*/
-void HAS_160::clear()
- {
- MDx_HashFunction::clear();
- zeroise(m_X);
- m_digest[0] = 0x67452301;
- m_digest[1] = 0xEFCDAB89;
- m_digest[2] = 0x98BADCFE;
- m_digest[3] = 0x10325476;
- m_digest[4] = 0xC3D2E1F0;
- }
-
-}
diff --git a/src/lib/hash/has160/has160.h b/src/lib/hash/has160/has160.h
deleted file mode 100644
index 7ef090eb7..000000000
--- a/src/lib/hash/has160/has160.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-* HAS-160
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_HAS_160_H__
-#define BOTAN_HAS_160_H__
-
-#include <botan/mdx_hash.h>
-
-namespace Botan {
-
-/**
-* HAS-160, a Korean hash function standardized in
-* TTAS.KO-12.0011/R1. Used in conjunction with KCDSA
-*/
-class BOTAN_DLL HAS_160 final : public MDx_HashFunction
- {
- public:
- std::string name() const override { return "HAS-160"; }
- size_t output_length() const override { return 20; }
- HashFunction* clone() const override { return new HAS_160; }
-
- void clear() override;
-
- HAS_160() : MDx_HashFunction(64, false, true), m_X(20), m_digest(5)
- { clear(); }
- private:
- void compress_n(const byte[], size_t blocks) override;
- void copy_out(byte[]) override;
-
- secure_vector<u32bit> m_X, m_digest;
- };
-
-}
-
-#endif
diff --git a/src/lib/hash/has160/info.txt b/src/lib/hash/has160/info.txt
deleted file mode 100644
index cf403dad5..000000000
--- a/src/lib/hash/has160/info.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-define HAS_160 20131128
-
-<requires>
-mdx_hash
-</requires>
diff --git a/src/lib/hash/hash.cpp b/src/lib/hash/hash.cpp
index 9a15c7998..42a7666b6 100644
--- a/src/lib/hash/hash.cpp
+++ b/src/lib/hash/hash.cpp
@@ -25,18 +25,10 @@
#include <botan/gost_3411.h>
#endif
-#if defined(BOTAN_HAS_HAS_160)
- #include <botan/has160.h>
-#endif
-
#if defined(BOTAN_HAS_KECCAK)
#include <botan/keccak.h>
#endif
-#if defined(BOTAN_HAS_MD2)
- #include <botan/md2.h>
-#endif
-
#if defined(BOTAN_HAS_MD4)
#include <botan/md4.h>
#endif
@@ -45,10 +37,6 @@
#include <botan/md5.h>
#endif
-#if defined(BOTAN_HAS_RIPEMD_128)
- #include <botan/rmd128.h>
-#endif
-
#if defined(BOTAN_HAS_RIPEMD_160)
#include <botan/rmd160.h>
#endif
@@ -147,18 +135,10 @@ BOTAN_REGISTER_NAMED_T(HashFunction, "Parallel", Parallel, Parallel::make);
BOTAN_REGISTER_HASH_NAMED_NOARGS(GOST_34_11, "GOST-R-34.11-94");
#endif
-#if defined(BOTAN_HAS_HAS_160)
-BOTAN_REGISTER_HASH_NAMED_NOARGS(HAS_160, "HAS-160");
-#endif
-
#if defined(BOTAN_HAS_KECCAK)
BOTAN_REGISTER_HASH_NAMED_1LEN(Keccak_1600, "Keccak-1600", 512);
#endif
-#if defined(BOTAN_HAS_MD2)
-BOTAN_REGISTER_HASH_NOARGS(MD2);
-#endif
-
#if defined(BOTAN_HAS_MD4)
BOTAN_REGISTER_HASH_NOARGS(MD4);
#endif
@@ -167,10 +147,6 @@ BOTAN_REGISTER_HASH_NOARGS(MD4);
BOTAN_REGISTER_HASH_NOARGS(MD5);
#endif
-#if defined(BOTAN_HAS_RIPEMD_128)
-BOTAN_REGISTER_HASH_NAMED_NOARGS(RIPEMD_128, "RIPEMD-128");
-#endif
-
#if defined(BOTAN_HAS_RIPEMD_160)
BOTAN_REGISTER_HASH_NAMED_NOARGS(RIPEMD_160, "RIPEMD-160");
#endif
diff --git a/src/lib/hash/md2/info.txt b/src/lib/hash/md2/info.txt
deleted file mode 100644
index 8ea7dc393..000000000
--- a/src/lib/hash/md2/info.txt
+++ /dev/null
@@ -1 +0,0 @@
-define MD2 20131128
diff --git a/src/lib/hash/md2/md2.cpp b/src/lib/hash/md2/md2.cpp
deleted file mode 100644
index f5e222610..000000000
--- a/src/lib/hash/md2/md2.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
-* MD2
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/md2.h>
-
-namespace Botan {
-
-/**
-* MD2 Compression Function
-*/
-void MD2::hash(const byte input[])
- {
- static const byte SBOX[256] = {
- 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, 0x54, 0xA1,
- 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C,
- 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C,
- 0xFD, 0xD4, 0xE0, 0x16, 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12,
- 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,
- 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F,
- 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21, 0x80, 0x7F, 0x5D, 0x9A,
- 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03,
- 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A,
- 0xAC, 0x56, 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
- 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D, 0x70, 0x59,
- 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02,
- 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69,
- 0x34, 0x40, 0x7E, 0x0F, 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A,
- 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,
- 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52,
- 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, 0x24, 0xE1, 0x7B, 0x08,
- 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D,
- 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E,
- 0x66, 0x58, 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
- 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, 0x8D, 0x33,
- 0x9F, 0x11, 0x83, 0x14 };
-
- buffer_insert(m_X, 16, input, hash_block_size());
- xor_buf(&m_X[32], m_X.data(), &m_X[16], hash_block_size());
- byte T = 0;
-
- for(size_t i = 0; i != 18; ++i)
- {
- for(size_t k = 0; k != 48; k += 8)
- {
- T = m_X[k ] ^= SBOX[T]; T = m_X[k+1] ^= SBOX[T];
- T = m_X[k+2] ^= SBOX[T]; T = m_X[k+3] ^= SBOX[T];
- T = m_X[k+4] ^= SBOX[T]; T = m_X[k+5] ^= SBOX[T];
- T = m_X[k+6] ^= SBOX[T]; T = m_X[k+7] ^= SBOX[T];
- }
-
- T += static_cast<byte>(i);
- }
-
- T = m_checksum[15];
- for(size_t i = 0; i != hash_block_size(); ++i)
- T = m_checksum[i] ^= SBOX[input[i] ^ T];
- }
-
-/**
-* Update the hash
-*/
-void MD2::add_data(const byte input[], size_t length)
- {
- buffer_insert(m_buffer, m_position, input, length);
-
- if(m_position + length >= hash_block_size())
- {
- hash(m_buffer.data());
- input += (hash_block_size() - m_position);
- length -= (hash_block_size() - m_position);
- while(length >= hash_block_size())
- {
- hash(input);
- input += hash_block_size();
- length -= hash_block_size();
- }
- copy_mem(m_buffer.data(), input, length);
- m_position = 0;
- }
- m_position += length;
- }
-
-/**
-* Finalize a MD2 Hash
-*/
-void MD2::final_result(byte output[])
- {
- for(size_t i = m_position; i != hash_block_size(); ++i)
- m_buffer[i] = static_cast<byte>(hash_block_size() - m_position);
-
- hash(m_buffer.data());
- hash(m_checksum.data());
- copy_mem(output, m_X.data(), output_length());
- clear();
- }
-
-/**
-* Clear memory of sensitive data
-*/
-void MD2::clear()
- {
- zeroise(m_X);
- zeroise(m_checksum);
- zeroise(m_buffer);
- m_position = 0;
- }
-
-}
diff --git a/src/lib/hash/md2/md2.h b/src/lib/hash/md2/md2.h
deleted file mode 100644
index 58629495a..000000000
--- a/src/lib/hash/md2/md2.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-* MD2
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_MD2_H__
-#define BOTAN_MD2_H__
-
-#include <botan/hash.h>
-
-namespace Botan {
-
-/**
-* MD2
-*/
-class BOTAN_DLL MD2 final : public HashFunction
- {
- public:
- std::string name() const override { return "MD2"; }
- size_t output_length() const override { return 16; }
- size_t hash_block_size() const override { return 16; }
- HashFunction* clone() const override { return new MD2; }
-
- void clear() override;
-
- MD2() : m_X(48), m_checksum(16), m_buffer(16), m_position(0)
- { clear(); }
- private:
- void add_data(const byte[], size_t) override;
- void hash(const byte[]);
- void final_result(byte[]) override;
-
- secure_vector<byte> m_X, m_checksum, m_buffer;
- size_t m_position;
- };
-
-}
-
-#endif
diff --git a/src/lib/hash/rmd128/info.txt b/src/lib/hash/rmd128/info.txt
deleted file mode 100644
index 7d2a4eacd..000000000
--- a/src/lib/hash/rmd128/info.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-define RIPEMD_128 20131128
-
-<requires>
-mdx_hash
-</requires>
diff --git a/src/lib/hash/rmd128/rmd128.cpp b/src/lib/hash/rmd128/rmd128.cpp
deleted file mode 100644
index e520fa0c3..000000000
--- a/src/lib/hash/rmd128/rmd128.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
-* RIPEMD-128
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/rmd128.h>
-
-namespace Botan {
-
-namespace RIPEMD_128_F {
-
-/*
-* RIPEMD-128 F1 Function
-*/
-inline void F1(u32bit& A, u32bit B, u32bit C, u32bit D,
- u32bit msg, u32bit shift)
- {
- A += (B ^ C ^ D) + msg;
- A = rotate_left(A, shift);
- }
-
-/*
-* RIPEMD-128 F2 Function
-*/
-inline void F2(u32bit& A, u32bit B, u32bit C, u32bit D,
- u32bit msg, u32bit shift, u32bit magic)
- {
- A += (D ^ (B & (C ^ D))) + msg + magic;
- A = rotate_left(A, shift);
- }
-
-/*
-* RIPEMD-128 F3 Function
-*/
-inline void F3(u32bit& A, u32bit B, u32bit C, u32bit D,
- u32bit msg, u32bit shift, u32bit magic)
- {
- A += (D ^ (B | ~C)) + msg + magic;
- A = rotate_left(A, shift);
- }
-
-/*
-* RIPEMD-128 F4 Function
-*/
-inline void F4(u32bit& A, u32bit B, u32bit C, u32bit D,
- u32bit msg, u32bit shift, u32bit magic)
- {
- A += (C ^ (D & (B ^ C))) + msg + magic;
- A = rotate_left(A, shift);
- }
-
-}
-
-/*
-* RIPEMD-128 Compression Function
-*/
-void RIPEMD_128::compress_n(const byte input[], size_t blocks)
- {
- using namespace RIPEMD_128_F;
-
- const u32bit MAGIC2 = 0x5A827999, MAGIC3 = 0x6ED9EBA1,
- MAGIC4 = 0x8F1BBCDC, MAGIC5 = 0x50A28BE6,
- MAGIC6 = 0x5C4DD124, MAGIC7 = 0x6D703EF3;
-
- for(size_t i = 0; i != blocks; ++i)
- {
- load_le(m_M.data(), input, m_M.size());
-
- u32bit A1 = m_digest[0], A2 = A1, B1 = m_digest[1], B2 = B1,
- C1 = m_digest[2], C2 = C1, D1 = m_digest[3], D2 = D1;
-
- F1(A1,B1,C1,D1,m_M[ 0],11 ); F4(A2,B2,C2,D2,m_M[ 5], 8,MAGIC5);
- F1(D1,A1,B1,C1,m_M[ 1],14 ); F4(D2,A2,B2,C2,m_M[14], 9,MAGIC5);
- F1(C1,D1,A1,B1,m_M[ 2],15 ); F4(C2,D2,A2,B2,m_M[ 7], 9,MAGIC5);
- F1(B1,C1,D1,A1,m_M[ 3],12 ); F4(B2,C2,D2,A2,m_M[ 0],11,MAGIC5);
- F1(A1,B1,C1,D1,m_M[ 4], 5 ); F4(A2,B2,C2,D2,m_M[ 9],13,MAGIC5);
- F1(D1,A1,B1,C1,m_M[ 5], 8 ); F4(D2,A2,B2,C2,m_M[ 2],15,MAGIC5);
- F1(C1,D1,A1,B1,m_M[ 6], 7 ); F4(C2,D2,A2,B2,m_M[11],15,MAGIC5);
- F1(B1,C1,D1,A1,m_M[ 7], 9 ); F4(B2,C2,D2,A2,m_M[ 4], 5,MAGIC5);
- F1(A1,B1,C1,D1,m_M[ 8],11 ); F4(A2,B2,C2,D2,m_M[13], 7,MAGIC5);
- F1(D1,A1,B1,C1,m_M[ 9],13 ); F4(D2,A2,B2,C2,m_M[ 6], 7,MAGIC5);
- F1(C1,D1,A1,B1,m_M[10],14 ); F4(C2,D2,A2,B2,m_M[15], 8,MAGIC5);
- F1(B1,C1,D1,A1,m_M[11],15 ); F4(B2,C2,D2,A2,m_M[ 8],11,MAGIC5);
- F1(A1,B1,C1,D1,m_M[12], 6 ); F4(A2,B2,C2,D2,m_M[ 1],14,MAGIC5);
- F1(D1,A1,B1,C1,m_M[13], 7 ); F4(D2,A2,B2,C2,m_M[10],14,MAGIC5);
- F1(C1,D1,A1,B1,m_M[14], 9 ); F4(C2,D2,A2,B2,m_M[ 3],12,MAGIC5);
- F1(B1,C1,D1,A1,m_M[15], 8 ); F4(B2,C2,D2,A2,m_M[12], 6,MAGIC5);
-
- F2(A1,B1,C1,D1,m_M[ 7], 7,MAGIC2); F3(A2,B2,C2,D2,m_M[ 6], 9,MAGIC6);
- F2(D1,A1,B1,C1,m_M[ 4], 6,MAGIC2); F3(D2,A2,B2,C2,m_M[11],13,MAGIC6);
- F2(C1,D1,A1,B1,m_M[13], 8,MAGIC2); F3(C2,D2,A2,B2,m_M[ 3],15,MAGIC6);
- F2(B1,C1,D1,A1,m_M[ 1],13,MAGIC2); F3(B2,C2,D2,A2,m_M[ 7], 7,MAGIC6);
- F2(A1,B1,C1,D1,m_M[10],11,MAGIC2); F3(A2,B2,C2,D2,m_M[ 0],12,MAGIC6);
- F2(D1,A1,B1,C1,m_M[ 6], 9,MAGIC2); F3(D2,A2,B2,C2,m_M[13], 8,MAGIC6);
- F2(C1,D1,A1,B1,m_M[15], 7,MAGIC2); F3(C2,D2,A2,B2,m_M[ 5], 9,MAGIC6);
- F2(B1,C1,D1,A1,m_M[ 3],15,MAGIC2); F3(B2,C2,D2,A2,m_M[10],11,MAGIC6);
- F2(A1,B1,C1,D1,m_M[12], 7,MAGIC2); F3(A2,B2,C2,D2,m_M[14], 7,MAGIC6);
- F2(D1,A1,B1,C1,m_M[ 0],12,MAGIC2); F3(D2,A2,B2,C2,m_M[15], 7,MAGIC6);
- F2(C1,D1,A1,B1,m_M[ 9],15,MAGIC2); F3(C2,D2,A2,B2,m_M[ 8],12,MAGIC6);
- F2(B1,C1,D1,A1,m_M[ 5], 9,MAGIC2); F3(B2,C2,D2,A2,m_M[12], 7,MAGIC6);
- F2(A1,B1,C1,D1,m_M[ 2],11,MAGIC2); F3(A2,B2,C2,D2,m_M[ 4], 6,MAGIC6);
- F2(D1,A1,B1,C1,m_M[14], 7,MAGIC2); F3(D2,A2,B2,C2,m_M[ 9],15,MAGIC6);
- F2(C1,D1,A1,B1,m_M[11],13,MAGIC2); F3(C2,D2,A2,B2,m_M[ 1],13,MAGIC6);
- F2(B1,C1,D1,A1,m_M[ 8],12,MAGIC2); F3(B2,C2,D2,A2,m_M[ 2],11,MAGIC6);
-
- F3(A1,B1,C1,D1,m_M[ 3],11,MAGIC3); F2(A2,B2,C2,D2,m_M[15], 9,MAGIC7);
- F3(D1,A1,B1,C1,m_M[10],13,MAGIC3); F2(D2,A2,B2,C2,m_M[ 5], 7,MAGIC7);
- F3(C1,D1,A1,B1,m_M[14], 6,MAGIC3); F2(C2,D2,A2,B2,m_M[ 1],15,MAGIC7);
- F3(B1,C1,D1,A1,m_M[ 4], 7,MAGIC3); F2(B2,C2,D2,A2,m_M[ 3],11,MAGIC7);
- F3(A1,B1,C1,D1,m_M[ 9],14,MAGIC3); F2(A2,B2,C2,D2,m_M[ 7], 8,MAGIC7);
- F3(D1,A1,B1,C1,m_M[15], 9,MAGIC3); F2(D2,A2,B2,C2,m_M[14], 6,MAGIC7);
- F3(C1,D1,A1,B1,m_M[ 8],13,MAGIC3); F2(C2,D2,A2,B2,m_M[ 6], 6,MAGIC7);
- F3(B1,C1,D1,A1,m_M[ 1],15,MAGIC3); F2(B2,C2,D2,A2,m_M[ 9],14,MAGIC7);
- F3(A1,B1,C1,D1,m_M[ 2],14,MAGIC3); F2(A2,B2,C2,D2,m_M[11],12,MAGIC7);
- F3(D1,A1,B1,C1,m_M[ 7], 8,MAGIC3); F2(D2,A2,B2,C2,m_M[ 8],13,MAGIC7);
- F3(C1,D1,A1,B1,m_M[ 0],13,MAGIC3); F2(C2,D2,A2,B2,m_M[12], 5,MAGIC7);
- F3(B1,C1,D1,A1,m_M[ 6], 6,MAGIC3); F2(B2,C2,D2,A2,m_M[ 2],14,MAGIC7);
- F3(A1,B1,C1,D1,m_M[13], 5,MAGIC3); F2(A2,B2,C2,D2,m_M[10],13,MAGIC7);
- F3(D1,A1,B1,C1,m_M[11],12,MAGIC3); F2(D2,A2,B2,C2,m_M[ 0],13,MAGIC7);
- F3(C1,D1,A1,B1,m_M[ 5], 7,MAGIC3); F2(C2,D2,A2,B2,m_M[ 4], 7,MAGIC7);
- F3(B1,C1,D1,A1,m_M[12], 5,MAGIC3); F2(B2,C2,D2,A2,m_M[13], 5,MAGIC7);
-
- F4(A1,B1,C1,D1,m_M[ 1],11,MAGIC4); F1(A2,B2,C2,D2,m_M[ 8],15 );
- F4(D1,A1,B1,C1,m_M[ 9],12,MAGIC4); F1(D2,A2,B2,C2,m_M[ 6], 5 );
- F4(C1,D1,A1,B1,m_M[11],14,MAGIC4); F1(C2,D2,A2,B2,m_M[ 4], 8 );
- F4(B1,C1,D1,A1,m_M[10],15,MAGIC4); F1(B2,C2,D2,A2,m_M[ 1],11 );
- F4(A1,B1,C1,D1,m_M[ 0],14,MAGIC4); F1(A2,B2,C2,D2,m_M[ 3],14 );
- F4(D1,A1,B1,C1,m_M[ 8],15,MAGIC4); F1(D2,A2,B2,C2,m_M[11],14 );
- F4(C1,D1,A1,B1,m_M[12], 9,MAGIC4); F1(C2,D2,A2,B2,m_M[15], 6 );
- F4(B1,C1,D1,A1,m_M[ 4], 8,MAGIC4); F1(B2,C2,D2,A2,m_M[ 0],14 );
- F4(A1,B1,C1,D1,m_M[13], 9,MAGIC4); F1(A2,B2,C2,D2,m_M[ 5], 6 );
- F4(D1,A1,B1,C1,m_M[ 3],14,MAGIC4); F1(D2,A2,B2,C2,m_M[12], 9 );
- F4(C1,D1,A1,B1,m_M[ 7], 5,MAGIC4); F1(C2,D2,A2,B2,m_M[ 2],12 );
- F4(B1,C1,D1,A1,m_M[15], 6,MAGIC4); F1(B2,C2,D2,A2,m_M[13], 9 );
- F4(A1,B1,C1,D1,m_M[14], 8,MAGIC4); F1(A2,B2,C2,D2,m_M[ 9],12 );
- F4(D1,A1,B1,C1,m_M[ 5], 6,MAGIC4); F1(D2,A2,B2,C2,m_M[ 7], 5 );
- F4(C1,D1,A1,B1,m_M[ 6], 5,MAGIC4); F1(C2,D2,A2,B2,m_M[10],15 );
- F4(B1,C1,D1,A1,m_M[ 2],12,MAGIC4); F1(B2,C2,D2,A2,m_M[14], 8 );
-
- D2 = m_digest[1] + C1 + D2;
- m_digest[1] = m_digest[2] + D1 + A2;
- m_digest[2] = m_digest[3] + A1 + B2;
- m_digest[3] = m_digest[0] + B1 + C2;
- m_digest[0] = D2;
-
- input += hash_block_size();
- }
- }
-
-/*
-* Copy out the digest
-*/
-void RIPEMD_128::copy_out(byte output[])
- {
- copy_out_vec_le(output, output_length(), m_digest);
- }
-
-/*
-* Clear memory of sensitive data
-*/
-void RIPEMD_128::clear()
- {
- MDx_HashFunction::clear();
- zeroise(m_M);
- m_digest[0] = 0x67452301;
- m_digest[1] = 0xEFCDAB89;
- m_digest[2] = 0x98BADCFE;
- m_digest[3] = 0x10325476;
- }
-
-}
diff --git a/src/lib/hash/rmd128/rmd128.h b/src/lib/hash/rmd128/rmd128.h
deleted file mode 100644
index ba36ab902..000000000
--- a/src/lib/hash/rmd128/rmd128.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-* RIPEMD-128
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_RIPEMD_128_H__
-#define BOTAN_RIPEMD_128_H__
-
-#include <botan/mdx_hash.h>
-
-namespace Botan {
-
-/**
-* RIPEMD-128
-*/
-class BOTAN_DLL RIPEMD_128 final : public MDx_HashFunction
- {
- public:
- std::string name() const override { return "RIPEMD-128"; }
- size_t output_length() const override { return 16; }
- HashFunction* clone() const override { return new RIPEMD_128; }
-
- void clear() override;
-
- RIPEMD_128() : MDx_HashFunction(64, false, true), m_M(16), m_digest(4)
- { clear(); }
- private:
- void compress_n(const byte[], size_t blocks) override;
- void copy_out(byte[]) override;
-
- secure_vector<u32bit> m_M, m_digest;
- };
-
-}
-
-#endif
diff --git a/src/lib/math/bigint/big_ops2.cpp b/src/lib/math/bigint/big_ops2.cpp
index 9a3408247..6e234f036 100644
--- a/src/lib/math/bigint/big_ops2.cpp
+++ b/src/lib/math/bigint/big_ops2.cpp
@@ -1,6 +1,7 @@
/*
* BigInt Assignment Operators
* (C) 1999-2007 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -118,10 +119,7 @@ BigInt& BigInt::operator*=(const BigInt& y)
secure_vector<word> z(data(), data() + x_sw);
secure_vector<word> workspace(size());
-
- bigint_mul(mutable_data(), size(), workspace.data(),
- z.data(), z.size(), x_sw,
- y.data(), y.size(), y_sw);
+ bigint_mul(*this, BigInt(*this), y, workspace.data());
}
return (*this);
diff --git a/src/lib/math/bigint/big_ops3.cpp b/src/lib/math/bigint/big_ops3.cpp
index 6cf837020..24927b4fc 100644
--- a/src/lib/math/bigint/big_ops3.cpp
+++ b/src/lib/math/bigint/big_ops3.cpp
@@ -1,6 +1,7 @@
/*
* BigInt Binary Operators
* (C) 1999-2007 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -93,9 +94,7 @@ BigInt operator*(const BigInt& x, const BigInt& y)
else if(x_sw && y_sw)
{
secure_vector<word> workspace(z.size());
- bigint_mul(z.mutable_data(), z.size(), workspace.data(),
- x.data(), x.size(), x_sw,
- y.data(), y.size(), y_sw);
+ bigint_mul(z, x, y, workspace.data());
}
if(x_sw && y_sw && x.sign() != y.sign())
diff --git a/src/lib/math/ec_gfp/curve_gfp.cpp b/src/lib/math/ec_gfp/curve_gfp.cpp
index 9bf2191c6..96593e601 100644
--- a/src/lib/math/ec_gfp/curve_gfp.cpp
+++ b/src/lib/math/ec_gfp/curve_gfp.cpp
@@ -1,6 +1,7 @@
/*
* Elliptic curves over GF(p) Montgomery Representation
* (C) 2014,2015 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -80,20 +81,14 @@ void CurveGFp_Montgomery::curve_mul(BigInt& z, const BigInt& x, const BigInt& y,
return;
}
- const size_t x_sw = x.sig_words();
- const size_t y_sw = y.sig_words();
-
const size_t output_size = 2*m_p_words + 1;
ws.resize(2*(m_p_words+2));
z.grow_to(output_size);
z.clear();
- bigint_monty_mul(z.mutable_data(), output_size,
- x.data(), x.size(), x_sw,
- y.data(), y.size(), y_sw,
- m_p.data(), m_p_words, m_p_dash,
- ws.data());
+ bigint_monty_mul(z, x, y, m_p.data(), m_p_words, m_p_dash, ws.data());
+
}
void CurveGFp_Montgomery::curve_sqr(BigInt& z, const BigInt& x,
@@ -115,9 +110,7 @@ void CurveGFp_Montgomery::curve_sqr(BigInt& z, const BigInt& x,
z.grow_to(output_size);
z.clear();
- bigint_monty_sqr(z.mutable_data(), output_size,
- x.data(), x.size(), x_sw,
- m_p.data(), m_p_words, m_p_dash,
+ bigint_monty_sqr(z, x, m_p.data(), m_p_words, m_p_dash,
ws.data());
}
@@ -174,9 +167,7 @@ void CurveGFp_NIST::curve_mul(BigInt& z, const BigInt& x, const BigInt& y,
z.grow_to(output_size);
z.clear();
- bigint_mul(z.mutable_data(), output_size, ws.data(),
- x.data(), x.size(), x.sig_words(),
- y.data(), y.size(), y.sig_words());
+ bigint_mul(z, x, y, ws.data());
this->redc(z, ws);
}
diff --git a/src/lib/math/mp/mp_core.h b/src/lib/math/mp/mp_core.h
index 73f13742c..c4ce005ba 100644
--- a/src/lib/math/mp/mp_core.h
+++ b/src/lib/math/mp/mp_core.h
@@ -2,6 +2,7 @@
* MPI Algorithms
* (C) 1999-2010 Jack Lloyd
* 2006 Luca Piccarreta
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -9,6 +10,7 @@
#ifndef BOTAN_MP_CORE_OPS_H__
#define BOTAN_MP_CORE_OPS_H__
+#include <botan/bigint.h>
#include <botan/mp_types.h>
namespace Botan {
@@ -134,17 +136,14 @@ void bigint_monty_redc(word z[],
/*
* Montgomery Multiplication
*/
-void bigint_monty_mul(word z[], size_t z_size,
- const word x[], size_t x_size, size_t x_sw,
- const word y[], size_t y_size, size_t y_sw,
+void bigint_monty_mul(BigInt& z, const BigInt& x, const BigInt& y,
const word p[], size_t p_size, word p_dash,
word workspace[]);
/*
* Montgomery Squaring
*/
-void bigint_monty_sqr(word z[], size_t z_size,
- const word x[], size_t x_size, size_t x_sw,
+void bigint_monty_sqr(BigInt& z, const BigInt& x,
const word p[], size_t p_size, word p_dash,
word workspace[]);
@@ -182,9 +181,7 @@ void bigint_comba_sqr16(word out[32], const word in[16]);
/*
* High Level Multiplication/Squaring Interfaces
*/
-void bigint_mul(word z[], size_t z_size, word workspace[],
- const word x[], size_t x_size, size_t x_sw,
- const word y[], size_t y_size, size_t y_sw);
+void bigint_mul(BigInt& z, const BigInt& x, const BigInt& y, word workspace[]);
void bigint_sqr(word z[], size_t z_size, word workspace[],
const word x[], size_t x_size, size_t x_sw);
diff --git a/src/lib/math/mp/mp_karat.cpp b/src/lib/math/mp/mp_karat.cpp
index 9135fdd6a..7a763e2a9 100644
--- a/src/lib/math/mp/mp_karat.cpp
+++ b/src/lib/math/mp/mp_karat.cpp
@@ -1,6 +1,7 @@
/*
* Multiplication and Squaring
* (C) 1999-2010 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -252,60 +253,55 @@ size_t karatsuba_size(size_t z_size, size_t x_size, size_t x_sw)
/*
* Multiplication Algorithm Dispatcher
*/
-void bigint_mul(word z[], size_t z_size, word workspace[],
- const word x[], size_t x_size, size_t x_sw,
- const word y[], size_t y_size, size_t y_sw)
+void bigint_mul(BigInt& z, const BigInt& x, const BigInt& y, word workspace[])
{
- // checking that z_size >= x_sw + y_sw without overflow
- BOTAN_ASSERT(z_size > x_sw && z_size > y_sw && z_size-x_sw >= y_sw, "Output size is sufficient");
-
- if(x_sw == 1)
+ if(x.sig_words() == 1)
{
- bigint_linmul3(z, y, y_sw, x[0]);
+ bigint_linmul3(z.mutable_data(), y.data(), y.sig_words(), x.data()[0]);
}
- else if(y_sw == 1)
+ else if(y.sig_words() == 1)
{
- bigint_linmul3(z, x, x_sw, y[0]);
+ bigint_linmul3(z.mutable_data(), x.data(), x.sig_words(), y.data()[0]);
}
- else if(x_sw <= 4 && x_size >= 4 &&
- y_sw <= 4 && y_size >= 4 && z_size >= 8)
+ else if(x.sig_words() <= 4 && x.size() >= 4 &&
+ y.sig_words() <= 4 && y.size() >= 4 && z.size() >= 8)
{
- bigint_comba_mul4(z, x, y);
+ bigint_comba_mul4(z.mutable_data(), x.data(), y.data());
}
- else if(x_sw <= 6 && x_size >= 6 &&
- y_sw <= 6 && y_size >= 6 && z_size >= 12)
+ else if(x.sig_words() <= 6 && x.size() >= 6 &&
+ y.sig_words() <= 6 && y.size() >= 6 && z.size() >= 12)
{
- bigint_comba_mul6(z, x, y);
+ bigint_comba_mul6(z.mutable_data(), x.data(), y.data());
}
- else if(x_sw <= 8 && x_size >= 8 &&
- y_sw <= 8 && y_size >= 8 && z_size >= 16)
+ else if(x.sig_words() <= 8 && x.size() >= 8 &&
+ y.sig_words() <= 8 && y.size() >= 8 && z.size() >= 16)
{
- bigint_comba_mul8(z, x, y);
+ bigint_comba_mul8(z.mutable_data(), x.data(), y.data());
}
- else if(x_sw <= 9 && x_size >= 9 &&
- y_sw <= 9 && y_size >= 9 && z_size >= 18)
+ else if(x.sig_words() <= 9 && x.size() >= 9 &&
+ y.sig_words() <= 9 && y.size() >= 9 && z.size() >= 18)
{
- bigint_comba_mul9(z, x, y);
+ bigint_comba_mul9(z.mutable_data(), x.data(), y.data());
}
- else if(x_sw <= 16 && x_size >= 16 &&
- y_sw <= 16 && y_size >= 16 && z_size >= 32)
+ else if(x.sig_words() <= 16 && x.size() >= 16 &&
+ y.sig_words() <= 16 && y.size() >= 16 && z.size() >= 32)
{
- bigint_comba_mul16(z, x, y);
+ bigint_comba_mul16(z.mutable_data(), x.data(), y.data());
}
- else if(x_sw < KARATSUBA_MULTIPLY_THRESHOLD ||
- y_sw < KARATSUBA_MULTIPLY_THRESHOLD ||
+ else if(x.sig_words() < KARATSUBA_MULTIPLY_THRESHOLD ||
+ y.sig_words() < KARATSUBA_MULTIPLY_THRESHOLD ||
!workspace)
{
- basecase_mul(z, x, x_sw, y, y_sw);
+ basecase_mul(z.mutable_data(), x.data(), x.sig_words(), y.data(), y.sig_words());
}
else
{
- const size_t N = karatsuba_size(z_size, x_size, x_sw, y_size, y_sw);
+ const size_t N = karatsuba_size(z.size(), x.size(), x.sig_words(), y.size(), y.sig_words());
if(N)
- karatsuba_mul(z, x, y, N, workspace);
+ karatsuba_mul(z.mutable_data(), x.data(), y.data(), N, workspace);
else
- basecase_mul(z, x, x_sw, y, y_sw);
+ basecase_mul(z.mutable_data(), x.data(), x.sig_words(), y.data(), y.sig_words());
}
}
diff --git a/src/lib/math/mp/mp_monty.cpp b/src/lib/math/mp/mp_monty.cpp
index 7e427b540..88b5de715 100644
--- a/src/lib/math/mp/mp_monty.cpp
+++ b/src/lib/math/mp/mp_monty.cpp
@@ -2,10 +2,12 @@
* Montgomery Reduction
* (C) 1999-2011 Jack Lloyd
* 2006 Luca Piccarreta
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
+#include <botan/bigint.h>
#include <botan/internal/mp_core.h>
#include <botan/internal/mp_madd.h>
#include <botan/internal/mp_asmi.h>
@@ -92,30 +94,25 @@ void bigint_monty_redc(word z[],
BOTAN_ASSERT(borrow == 0 || borrow == 1, "Expected borrow");
}
-void bigint_monty_mul(word z[], size_t z_size,
- const word x[], size_t x_size, size_t x_sw,
- const word y[], size_t y_size, size_t y_sw,
+void bigint_monty_mul(BigInt& z, const BigInt& x, const BigInt& y,
const word p[], size_t p_size, word p_dash,
word ws[])
{
- bigint_mul(&z[0], z_size, &ws[0],
- &x[0], x_size, x_sw,
- &y[0], y_size, y_sw);
+ bigint_mul(z, x, y, &ws[0]);
- bigint_monty_redc(&z[0],
+ bigint_monty_redc(z.mutable_data(),
&p[0], p_size, p_dash,
&ws[0]);
+
}
-void bigint_monty_sqr(word z[], size_t z_size,
- const word x[], size_t x_size, size_t x_sw,
- const word p[], size_t p_size, word p_dash,
- word ws[])
+void bigint_monty_sqr(BigInt& z, const BigInt& x, const word p[],
+ size_t p_size, word p_dash, word ws[])
{
- bigint_sqr(&z[0], z_size, &ws[0],
- &x[0], x_size, x_sw);
+ bigint_sqr(z.mutable_data(), z.size(), &ws[0],
+ x.data(), x.size(), x.sig_words());
- bigint_monty_redc(&z[0],
+ bigint_monty_redc(z.mutable_data(),
&p[0], p_size, p_dash,
&ws[0]);
}
diff --git a/src/lib/math/numbertheory/mp_numth.cpp b/src/lib/math/numbertheory/mp_numth.cpp
index 3373b9ee7..d78d21128 100644
--- a/src/lib/math/numbertheory/mp_numth.cpp
+++ b/src/lib/math/numbertheory/mp_numth.cpp
@@ -1,6 +1,7 @@
/*
* Fused and Important MP Algorithms
* (C) 1999-2007 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -40,20 +41,13 @@ BigInt mul_add(const BigInt& a, const BigInt& b, const BigInt& c)
if(a.sign() != b.sign())
sign = BigInt::Negative;
- const size_t a_sw = a.sig_words();
- const size_t b_sw = b.sig_words();
- const size_t c_sw = c.sig_words();
-
- BigInt r(sign, std::max(a.size() + b.size(), c_sw) + 1);
+ BigInt r(sign, std::max(a.size() + b.size(), c.sig_words()) + 1);
secure_vector<word> workspace(r.size());
- bigint_mul(r.mutable_data(), r.size(),
- workspace.data(),
- a.data(), a.size(), a_sw,
- b.data(), b.size(), b_sw);
+ bigint_mul(r, a, b, workspace.data());
- const size_t r_size = std::max(r.sig_words(), c_sw);
- bigint_add2(r.mutable_data(), r_size, c.data(), c_sw);
+ const size_t r_size = std::max(r.sig_words(), c.sig_words());
+ bigint_add2(r.mutable_data(), r_size, c.data(), c.sig_words());
return r;
}
diff --git a/src/lib/math/numbertheory/powm_mnt.cpp b/src/lib/math/numbertheory/powm_mnt.cpp
index 5c441db3a..572f0de98 100644
--- a/src/lib/math/numbertheory/powm_mnt.cpp
+++ b/src/lib/math/numbertheory/powm_mnt.cpp
@@ -1,6 +1,7 @@
/*
* Montgomery Exponentiation
* (C) 1999-2010,2012 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -8,6 +9,7 @@
#include <botan/internal/def_powm.h>
#include <botan/numthry.h>
#include <botan/internal/mp_core.h>
+#include <iostream>
namespace Botan {
@@ -34,36 +36,26 @@ void Montgomery_Exponentiator::set_base(const BigInt& base)
m_g[0] = 1;
- bigint_monty_mul(z.mutable_data(), z.size(),
- m_g[0].data(), m_g[0].size(), m_g[0].sig_words(),
- m_R2_mod.data(), m_R2_mod.size(), m_R2_mod.sig_words(),
+ bigint_monty_mul(z, m_g[0], m_R2_mod,
m_modulus.data(), m_mod_words, m_mod_prime,
workspace.data());
-
m_g[0] = z;
m_g[1] = (base >= m_modulus) ? (base % m_modulus) : base;
- bigint_monty_mul(z.mutable_data(), z.size(),
- m_g[1].data(), m_g[1].size(), m_g[1].sig_words(),
- m_R2_mod.data(), m_R2_mod.size(), m_R2_mod.sig_words(),
+ bigint_monty_mul(z, m_g[1], m_R2_mod,
m_modulus.data(), m_mod_words, m_mod_prime,
workspace.data());
m_g[1] = z;
const BigInt& x = m_g[1];
- const size_t x_sig = x.sig_words();
for(size_t i = 2; i != m_g.size(); ++i)
{
const BigInt& y = m_g[i-1];
- const size_t y_sig = y.sig_words();
- bigint_monty_mul(z.mutable_data(), z.size(),
- x.data(), x.size(), x_sig,
- y.data(), y.size(), y_sig,
- m_modulus.data(), m_mod_words, m_mod_prime,
+ bigint_monty_mul(z, x, y, m_modulus.data(), m_mod_words, m_mod_prime,
workspace.data());
m_g[i] = z;
@@ -82,15 +74,13 @@ BigInt Montgomery_Exponentiator::execute() const
const size_t z_size = 2*(m_mod_words + 1);
BigInt z(BigInt::Positive, z_size);
- secure_vector<word> workspace(z_size);
+ secure_vector<word> workspace(z.size());
for(size_t i = exp_nibbles; i > 0; --i)
{
for(size_t k = 0; k != m_window_bits; ++k)
{
- bigint_monty_sqr(z.mutable_data(), z_size,
- x.data(), x.size(), x.sig_words(),
- m_modulus.data(), m_mod_words, m_mod_prime,
+ bigint_monty_sqr(z, x, m_modulus.data(), m_mod_words, m_mod_prime,
workspace.data());
x = z;
@@ -100,9 +90,7 @@ BigInt Montgomery_Exponentiator::execute() const
const BigInt& y = m_g[nibble];
- bigint_monty_mul(z.mutable_data(), z_size,
- x.data(), x.size(), x.sig_words(),
- y.data(), y.size(), y.sig_words(),
+ bigint_monty_mul(z, x, y,
m_modulus.data(), m_mod_words, m_mod_prime,
workspace.data());
diff --git a/src/lib/pk_pad/hash_id/hash_id.cpp b/src/lib/pk_pad/hash_id/hash_id.cpp
index 882c30a4c..2af0f6878 100644
--- a/src/lib/pk_pad/hash_id/hash_id.cpp
+++ b/src/lib/pk_pad/hash_id/hash_id.cpp
@@ -12,18 +12,10 @@ namespace Botan {
namespace {
-const byte MD2_PKCS_ID[] = {
-0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86,
-0xF7, 0x0D, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 };
-
const byte MD5_PKCS_ID[] = {
0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86,
0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 };
-const byte RIPEMD_128_PKCS_ID[] = {
-0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02,
-0x02, 0x05, 0x00, 0x04, 0x14 };
-
const byte RIPEMD_160_PKCS_ID[] = {
0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02,
0x01, 0x05, 0x00, 0x04, 0x14 };
@@ -67,18 +59,10 @@ std::vector<byte> pkcs_hash_id(const std::string& name)
if(name == "Parallel(MD5,SHA-160)")
return std::vector<byte>();
- if(name == "MD2")
- return std::vector<byte>(MD2_PKCS_ID,
- MD2_PKCS_ID + sizeof(MD2_PKCS_ID));
-
if(name == "MD5")
return std::vector<byte>(MD5_PKCS_ID,
MD5_PKCS_ID + sizeof(MD5_PKCS_ID));
- if(name == "RIPEMD-128")
- return std::vector<byte>(RIPEMD_128_PKCS_ID,
- RIPEMD_128_PKCS_ID + sizeof(RIPEMD_128_PKCS_ID));
-
if(name == "RIPEMD-160")
return std::vector<byte>(RIPEMD_160_PKCS_ID,
RIPEMD_160_PKCS_ID + sizeof(RIPEMD_160_PKCS_ID));
@@ -127,7 +111,6 @@ byte ieee1363_hash_id(const std::string& name)
if(name == "SHA-512") return 0x35;
if(name == "RIPEMD-160") return 0x31;
- if(name == "RIPEMD-128") return 0x32;
if(name == "Whirlpool") return 0x37;
diff --git a/src/lib/prov/openssl/openssl_hash.cpp b/src/lib/prov/openssl/openssl_hash.cpp
index 574cfed91..c14c551e4 100644
--- a/src/lib/prov/openssl/openssl_hash.cpp
+++ b/src/lib/prov/openssl/openssl_hash.cpp
@@ -96,10 +96,6 @@ make_evp_hash_maker(const EVP_MD* md, const char* algo)
BOTAN_REGISTER_OPENSSL_EVP_HASH("SHA-512", EVP_sha512);
#endif
-#if !defined(OPENSSL_NO_MD2)
- BOTAN_REGISTER_OPENSSL_EVP_HASH("MD2", EVP_md2);
-#endif
-
#if !defined(OPENSSL_NO_MD4)
BOTAN_REGISTER_OPENSSL_EVP_HASH("MD4", EVP_md4);
#endif
diff --git a/src/lib/pubkey/curve25519/donna.cpp b/src/lib/pubkey/curve25519/donna.cpp
index 9b28e412c..a0e4d249f 100644
--- a/src/lib/pubkey/curve25519/donna.cpp
+++ b/src/lib/pubkey/curve25519/donna.cpp
@@ -39,6 +39,26 @@ typedef byte u8;
typedef u64bit limb;
typedef limb felem[5];
+typedef struct
+ {
+ limb* x;
+ limb* z;
+ } fmonty_pair_t;
+
+typedef struct
+ {
+ fmonty_pair_t q;
+ fmonty_pair_t q_dash;
+ const limb* q_minus_q_dash;
+ } fmonty_in_t;
+
+typedef struct
+ {
+ fmonty_pair_t two_q;
+ fmonty_pair_t q_plus_q_dash;
+ } fmonty_out_t;
+
+
#if !defined(BOTAN_TARGET_HAS_NATIVE_UINT128)
typedef donna128 uint128_t;
#endif
@@ -273,44 +293,41 @@ fcontract(u8 *output, const felem input) {
/* Input: Q, Q', Q-Q'
* Output: 2Q, Q+Q'
*
- * x2 z3: long form
- * x3 z3: long form
- * x z: short form, destroyed
- * xprime zprime: short form, destroyed
- * qmqp: short form, preserved
+ * result.two_q (2*Q): long form
+ * result.q_plus_q_dash (Q + Q): long form
+ * in.q: short form, destroyed
+ * in.q_dash: short form, destroyed
+ * in.q_minus_q_dash: short form, preserved
*/
static void
-fmonty(limb *x2, limb *z2, /* output 2Q */
- limb *x3, limb *z3, /* output Q + Q' */
- limb *x, limb *z, /* input Q */
- limb *xprime, limb *zprime, /* input Q' */
- const limb *qmqp /* input Q - Q' */) {
+fmonty(fmonty_out_t& result, fmonty_in_t& in)
+{
limb origx[5], origxprime[5], zzz[5], xx[5], zz[5], xxprime[5],
- zzprime[5], zzzprime[5];
+ zzprime[5], zzzprime[5];
- copy_mem(origx, x, 5);
- fsum(x, z);
- fdifference_backwards(z, origx); // does x - z
+ copy_mem(origx, in.q.x, 5);
+ fsum(in.q.x, in.q.z);
+ fdifference_backwards(in.q.z, origx); // does x - z
- copy_mem(origxprime, xprime, 5);
- fsum(xprime, zprime);
- fdifference_backwards(zprime, origxprime);
- fmul(xxprime, xprime, z);
- fmul(zzprime, x, zprime);
+ copy_mem(origxprime, in.q_dash.x, 5);
+ fsum(in.q_dash.x, in.q_dash.z);
+ fdifference_backwards(in.q_dash.z, origxprime);
+ fmul(xxprime, in.q_dash.x, in.q.z);
+ fmul(zzprime, in.q.x, in.q_dash.z);
copy_mem(origxprime, xxprime, 5);
fsum(xxprime, zzprime);
fdifference_backwards(zzprime, origxprime);
- fsquare_times(x3, xxprime, 1);
+ fsquare_times(result.q_plus_q_dash.x, xxprime, 1);
fsquare_times(zzzprime, zzprime, 1);
- fmul(z3, zzzprime, qmqp);
+ fmul(result.q_plus_q_dash.z, zzzprime, in.q_minus_q_dash);
- fsquare_times(xx, x, 1);
- fsquare_times(zz, z, 1);
- fmul(x2, xx, zz);
+ fsquare_times(xx, in.q.x, 1);
+ fsquare_times(zz, in.q.z, 1);
+ fmul(result.two_q.x, xx, zz);
fdifference_backwards(zz, xx); // does zz = xx - zz
fscalar_product(zzz, zz, 121665);
fsum(zzz, xx);
- fmul(z2, zz, zzz);
+ fmul(result.two_q.z, zz, zzz);
}
// -----------------------------------------------------------------------------
@@ -356,11 +373,10 @@ cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) {
swap_conditional(nqx, nqpqx, bit);
swap_conditional(nqz, nqpqz, bit);
- fmonty(nqx2, nqz2,
- nqpqx2, nqpqz2,
- nqx, nqz,
- nqpqx, nqpqz,
- q);
+
+ fmonty_out_t result { nqx2, nqz2, nqpqx2, nqpqz2 };
+ fmonty_in_t in { nqx, nqz, nqpqx, nqpqz, q };
+ fmonty(result, in);
swap_conditional(nqx2, nqpqx2, bit);
swap_conditional(nqz2, nqpqz2, bit);
diff --git a/src/lib/pubkey/if_algo/if_algo.cpp b/src/lib/pubkey/if_algo/if_algo.cpp
deleted file mode 100644
index e5f3ae20f..000000000
--- a/src/lib/pubkey/if_algo/if_algo.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
-* IF Scheme
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/if_algo.h>
-#include <botan/numthry.h>
-#include <botan/workfactor.h>
-#include <botan/der_enc.h>
-#include <botan/ber_dec.h>
-
-namespace Botan {
-
-size_t IF_Scheme_PublicKey::estimated_strength() const
- {
- return if_work_factor(m_n.bits());
- }
-
-AlgorithmIdentifier IF_Scheme_PublicKey::algorithm_identifier() const
- {
- return AlgorithmIdentifier(get_oid(),
- AlgorithmIdentifier::USE_NULL_PARAM);
- }
-
-std::vector<byte> IF_Scheme_PublicKey::x509_subject_public_key() const
- {
- return DER_Encoder()
- .start_cons(SEQUENCE)
- .encode(m_n)
- .encode(m_e)
- .end_cons()
- .get_contents_unlocked();
- }
-
-IF_Scheme_PublicKey::IF_Scheme_PublicKey(const AlgorithmIdentifier&,
- const secure_vector<byte>& key_bits)
- {
- BER_Decoder(key_bits)
- .start_cons(SEQUENCE)
- .decode(m_n)
- .decode(m_e)
- .verify_end()
- .end_cons();
- }
-
-/*
-* Check IF Scheme Public Parameters
-*/
-bool IF_Scheme_PublicKey::check_key(RandomNumberGenerator&, bool) const
- {
- if(m_n < 35 || m_n.is_even() || m_e < 2)
- return false;
- return true;
- }
-
-secure_vector<byte> IF_Scheme_PrivateKey::pkcs8_private_key() const
- {
- return DER_Encoder()
- .start_cons(SEQUENCE)
- .encode(static_cast<size_t>(0))
- .encode(m_n)
- .encode(m_e)
- .encode(m_d)
- .encode(m_p)
- .encode(m_q)
- .encode(m_d1)
- .encode(m_d2)
- .encode(m_c)
- .end_cons()
- .get_contents();
- }
-
-IF_Scheme_PrivateKey::IF_Scheme_PrivateKey(RandomNumberGenerator& rng,
- const AlgorithmIdentifier&,
- const secure_vector<byte>& key_bits)
- {
- BER_Decoder(key_bits)
- .start_cons(SEQUENCE)
- .decode_and_check<size_t>(0, "Unknown PKCS #1 key format version")
- .decode(m_n)
- .decode(m_e)
- .decode(m_d)
- .decode(m_p)
- .decode(m_q)
- .decode(m_d1)
- .decode(m_d2)
- .decode(m_c)
- .end_cons();
-
- load_check(rng);
- }
-
-IF_Scheme_PrivateKey::IF_Scheme_PrivateKey(RandomNumberGenerator& rng,
- const BigInt& prime1,
- const BigInt& prime2,
- const BigInt& exp,
- const BigInt& d_exp,
- const BigInt& mod) :
- m_d{ d_exp }, m_p{ prime1 }, m_q{ prime2 }, m_d1{}, m_d2{}, m_c{ inverse_mod( m_q, m_p ) }
- {
- m_n = mod.is_nonzero() ? mod : m_p * m_q;
- m_e = exp;
-
- if(m_d == 0)
- {
- BigInt inv_for_d = lcm(m_p - 1, m_q - 1);
- if(m_e.is_even())
- inv_for_d >>= 1;
-
- m_d = inverse_mod(m_e, inv_for_d);
- }
-
- m_d1 = m_d % (m_p - 1);
- m_d2 = m_d % (m_q - 1);
-
- load_check(rng);
- }
-
-/*
-* Check IF Scheme Private Parameters
-*/
-bool IF_Scheme_PrivateKey::check_key(RandomNumberGenerator& rng,
- bool strong) const
- {
- if(m_n < 35 || m_n.is_even() || m_e < 2 || m_d < 2 || m_p < 3 || m_q < 3 || m_p*m_q != m_n)
- return false;
-
- if(m_d1 != m_d % (m_p - 1) || m_d2 != m_d % (m_q - 1) || m_c != inverse_mod(m_q, m_p))
- return false;
-
- const size_t prob = (strong) ? 56 : 12;
-
- if(!is_prime(m_p, rng, prob) || !is_prime(m_q, rng, prob))
- return false;
- return true;
- }
-
-}
diff --git a/src/lib/pubkey/if_algo/if_algo.h b/src/lib/pubkey/if_algo/if_algo.h
deleted file mode 100644
index 46dbd51a9..000000000
--- a/src/lib/pubkey/if_algo/if_algo.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-* IF Scheme
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_IF_ALGO_H__
-#define BOTAN_IF_ALGO_H__
-
-#include <botan/bigint.h>
-#include <botan/x509_key.h>
-
-namespace Botan {
-
-/**
-* This class represents public keys
-* of integer factorization based (IF) public key schemes.
-*/
-class BOTAN_DLL IF_Scheme_PublicKey : public virtual Public_Key
- {
- public:
- IF_Scheme_PublicKey(const AlgorithmIdentifier& alg_id,
- const secure_vector<byte>& key_bits);
-
- IF_Scheme_PublicKey(const BigInt& n, const BigInt& e) :
- m_n(n), m_e(e) {}
-
- bool check_key(RandomNumberGenerator& rng, bool) const override;
-
- AlgorithmIdentifier algorithm_identifier() const override;
-
- std::vector<byte> x509_subject_public_key() const override;
-
- /**
- * @return public modulus
- */
- const BigInt& get_n() const { return m_n; }
-
- /**
- * @return public exponent
- */
- const BigInt& get_e() const { return m_e; }
-
- size_t max_input_bits() const override { return (m_n.bits() - 1); }
-
- size_t estimated_strength() const override;
-
- protected:
- IF_Scheme_PublicKey() {}
-
- BigInt m_n, m_e;
- };
-
-/**
-* This class represents public keys
-* of integer factorization based (IF) public key schemes.
-*/
-class BOTAN_DLL IF_Scheme_PrivateKey : public virtual IF_Scheme_PublicKey,
- public virtual Private_Key
- {
- public:
-
- IF_Scheme_PrivateKey(RandomNumberGenerator& rng,
- const BigInt& prime1, const BigInt& prime2,
- const BigInt& exp, const BigInt& d_exp,
- const BigInt& mod);
-
- IF_Scheme_PrivateKey(RandomNumberGenerator& rng,
- const AlgorithmIdentifier& alg_id,
- const secure_vector<byte>& key_bits);
-
- bool check_key(RandomNumberGenerator& rng, bool) const override;
-
- /**
- * Get the first prime p.
- * @return prime p
- */
- const BigInt& get_p() const { return m_p; }
-
- /**
- * Get the second prime q.
- * @return prime q
- */
- const BigInt& get_q() const { return m_q; }
-
- /**
- * Get d with exp * d = 1 mod (p - 1, q - 1).
- * @return d
- */
- const BigInt& get_d() const { return m_d; }
-
- const BigInt& get_c() const { return m_c; }
- const BigInt& get_d1() const { return m_d1; }
- const BigInt& get_d2() const { return m_d2; }
-
- secure_vector<byte> pkcs8_private_key() const override;
-
- protected:
- IF_Scheme_PrivateKey() {}
-
- BigInt m_d, m_p, m_q, m_d1, m_d2, m_c;
- };
-
-}
-
-#endif
diff --git a/src/lib/pubkey/if_algo/info.txt b/src/lib/pubkey/if_algo/info.txt
deleted file mode 100644
index 5ceec0a89..000000000
--- a/src/lib/pubkey/if_algo/info.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-define IF_PUBLIC_KEY_FAMILY 20131128
-
-load_on dep
-
-<requires>
-asn1
-bigint
-numbertheory
-</requires>
diff --git a/src/lib/pubkey/nr/info.txt b/src/lib/pubkey/nr/info.txt
deleted file mode 100644
index 78ca6ef29..000000000
--- a/src/lib/pubkey/nr/info.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-define NYBERG_RUEPPEL 20131128
-
-<requires>
-dl_algo
-dl_group
-keypair
-numbertheory
-</requires>
diff --git a/src/lib/pubkey/nr/nr.cpp b/src/lib/pubkey/nr/nr.cpp
deleted file mode 100644
index 5e2cb1be5..000000000
--- a/src/lib/pubkey/nr/nr.cpp
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
-* Nyberg-Rueppel
-* (C) 1999-2010 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/internal/pk_utils.h>
-#include <botan/nr.h>
-#include <botan/keypair.h>
-#include <botan/reducer.h>
-#include <future>
-
-namespace Botan {
-
-NR_PublicKey::NR_PublicKey(const AlgorithmIdentifier& alg_id,
- const secure_vector<byte>& key_bits) :
- DL_Scheme_PublicKey(alg_id, key_bits, DL_Group::ANSI_X9_57)
- {
- }
-
-/*
-* NR_PublicKey Constructor
-*/
-NR_PublicKey::NR_PublicKey(const DL_Group& grp, const BigInt& y1)
- {
- m_group = grp;
- m_y = y1;
- }
-
-/*
-* Create a NR private key
-*/
-NR_PrivateKey::NR_PrivateKey(RandomNumberGenerator& rng,
- const DL_Group& grp,
- const BigInt& x_arg)
- {
- m_group = grp;
- m_x = x_arg;
-
- if(m_x == 0)
- m_x = BigInt::random_integer(rng, 2, group_q() - 1);
-
- m_y = power_mod(group_g(), m_x, group_p());
-
- if(x_arg == 0)
- gen_check(rng);
- else
- load_check(rng);
- }
-
-NR_PrivateKey::NR_PrivateKey(const AlgorithmIdentifier& alg_id,
- const secure_vector<byte>& key_bits,
- RandomNumberGenerator& rng) :
- DL_Scheme_PrivateKey(alg_id, key_bits, DL_Group::ANSI_X9_57)
- {
- m_y = power_mod(group_g(), m_x, group_p());
-
- load_check(rng);
- }
-
-/*
-* Check Private Nyberg-Rueppel Parameters
-*/
-bool NR_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const
- {
- if(!DL_Scheme_PrivateKey::check_key(rng, strong) || m_x >= group_q())
- return false;
-
- if(!strong)
- return true;
-
- return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-1)");
- }
-
-namespace {
-
-/**
-* Nyberg-Rueppel signature operation
-*/
-class NR_Signature_Operation : public PK_Ops::Signature_with_EMSA
- {
- public:
- typedef NR_PrivateKey Key_Type;
- NR_Signature_Operation(const NR_PrivateKey& nr, const std::string& emsa) :
- PK_Ops::Signature_with_EMSA(emsa),
- m_q(nr.group_q()),
- m_x(nr.get_x()),
- m_powermod_g_p(nr.group_g(), nr.group_p()),
- m_mod_q(nr.group_q())
- {
- }
-
- size_t message_parts() const override { return 2; }
- size_t message_part_size() const override { return m_q.bytes(); }
- size_t max_input_bits() const override { return (m_q.bits() - 1); }
-
- secure_vector<byte> raw_sign(const byte msg[], size_t msg_len,
- RandomNumberGenerator& rng) override;
- private:
- const BigInt& m_q;
- const BigInt& m_x;
- Fixed_Base_Power_Mod m_powermod_g_p;
- Modular_Reducer m_mod_q;
- };
-
-secure_vector<byte>
-NR_Signature_Operation::raw_sign(const byte msg[], size_t msg_len,
- RandomNumberGenerator& rng)
- {
- rng.add_entropy(msg, msg_len);
-
- BigInt f(msg, msg_len);
-
- if(f >= m_q)
- throw Invalid_Argument("NR_Signature_Operation: Input is out of range");
-
- BigInt c, d;
-
- while(c == 0)
- {
- BigInt k;
- do
- k.randomize(rng, m_q.bits());
- while(k >= m_q);
-
- c = m_mod_q.reduce(m_powermod_g_p(k) + f);
- d = m_mod_q.reduce(k - m_x * c);
- }
-
- secure_vector<byte> output(2*m_q.bytes());
- c.binary_encode(&output[output.size() / 2 - c.bytes()]);
- d.binary_encode(&output[output.size() - d.bytes()]);
- return output;
- }
-
-
-/**
-* Nyberg-Rueppel verification operation
-*/
-class NR_Verification_Operation : public PK_Ops::Verification_with_EMSA
- {
- public:
- typedef NR_PublicKey Key_Type;
- NR_Verification_Operation(const NR_PublicKey& nr, const std::string& emsa) :
- PK_Ops::Verification_with_EMSA(emsa),
- m_q(nr.group_q()), m_y(nr.get_y()), m_powermod_g_p{Fixed_Base_Power_Mod(nr.group_g(), nr.group_p())},
- m_powermod_y_p{Fixed_Base_Power_Mod(m_y, nr.group_p())}, m_mod_p{Modular_Reducer(nr.group_p())},
- m_mod_q{Modular_Reducer(nr.group_q())}
- {}
-
- size_t message_parts() const override { return 2; }
- size_t message_part_size() const override { return m_q.bytes(); }
- size_t max_input_bits() const override { return (m_q.bits() - 1); }
-
- bool with_recovery() const override { return true; }
-
- secure_vector<byte> verify_mr(const byte msg[], size_t msg_len) override;
- private:
- const BigInt& m_q;
- const BigInt& m_y;
-
- Fixed_Base_Power_Mod m_powermod_g_p, m_powermod_y_p;
- Modular_Reducer m_mod_p, m_mod_q;
- };
-
-secure_vector<byte>
-NR_Verification_Operation::verify_mr(const byte msg[], size_t msg_len)
- {
- const BigInt& q = m_mod_q.get_modulus();
-
- if(msg_len != 2*q.bytes())
- throw Invalid_Argument("NR verification: Invalid signature");
-
- BigInt c(msg, q.bytes());
- BigInt d(msg + q.bytes(), q.bytes());
-
- if(c.is_zero() || c >= q || d >= q)
- throw Invalid_Argument("NR verification: Invalid signature");
-
- auto future_y_c = std::async(std::launch::async, m_powermod_y_p, c);
- BigInt g_d = m_powermod_g_p(d);
-
- BigInt i = m_mod_p.multiply(g_d, future_y_c.get());
- return BigInt::encode_locked(m_mod_q.reduce(c - i));
- }
-}
-
-BOTAN_REGISTER_PK_SIGNATURE_OP("NR", NR_Signature_Operation);
-BOTAN_REGISTER_PK_VERIFY_OP("NR", NR_Verification_Operation);
-
-}
diff --git a/src/lib/pubkey/nr/nr.h b/src/lib/pubkey/nr/nr.h
deleted file mode 100644
index 425ad2642..000000000
--- a/src/lib/pubkey/nr/nr.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-* Nyberg-Rueppel
-* (C) 1999-2010 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_NYBERG_RUEPPEL_H__
-#define BOTAN_NYBERG_RUEPPEL_H__
-
-#include <botan/dl_algo.h>
-
-namespace Botan {
-
-/**
-* Nyberg-Rueppel Public Key
-*/
-class BOTAN_DLL NR_PublicKey : public virtual DL_Scheme_PublicKey
- {
- public:
- std::string algo_name() const override { return "NR"; }
-
- DL_Group::Format group_format() const override { return DL_Group::ANSI_X9_57; }
-
- size_t message_parts() const override { return 2; }
- size_t message_part_size() const override { return group_q().bytes(); }
- size_t max_input_bits() const override { return (group_q().bits() - 1); }
-
- NR_PublicKey(const AlgorithmIdentifier& alg_id,
- const secure_vector<byte>& key_bits);
-
- NR_PublicKey(const DL_Group& group, const BigInt& pub_key);
- protected:
- NR_PublicKey() {}
- };
-
-/**
-* Nyberg-Rueppel Private Key
-*/
-class BOTAN_DLL NR_PrivateKey : public NR_PublicKey,
- public virtual DL_Scheme_PrivateKey
- {
- public:
- bool check_key(RandomNumberGenerator& rng, bool strong) const override;
-
- NR_PrivateKey(const AlgorithmIdentifier& alg_id,
- const secure_vector<byte>& key_bits,
- RandomNumberGenerator& rng);
-
- NR_PrivateKey(RandomNumberGenerator& rng,
- const DL_Group& group,
- const BigInt& x = 0);
- };
-
-}
-
-#endif
diff --git a/src/lib/pubkey/pk_algs.cpp b/src/lib/pubkey/pk_algs.cpp
index 9dbde28af..ac6f4a11f 100644
--- a/src/lib/pubkey/pk_algs.cpp
+++ b/src/lib/pubkey/pk_algs.cpp
@@ -36,14 +36,6 @@
#include <botan/gost_3410.h>
#endif
-#if defined(BOTAN_HAS_NYBERG_RUEPPEL)
- #include <botan/nr.h>
-#endif
-
-#if defined(BOTAN_HAS_RW)
- #include <botan/rw.h>
-#endif
-
#if defined(BOTAN_HAS_ELGAMAL)
#include <botan/elgamal.h>
#endif
@@ -74,11 +66,6 @@ Public_Key* make_public_key(const AlgorithmIdentifier& alg_id,
return new RSA_PublicKey(alg_id, key_bits);
#endif
-#if defined(BOTAN_HAS_RW)
- if(alg_name == "RW")
- return new RW_PublicKey(alg_id, key_bits);
-#endif
-
#if defined(BOTAN_HAS_DSA)
if(alg_name == "DSA")
return new DSA_PublicKey(alg_id, key_bits);
@@ -89,11 +76,6 @@ Public_Key* make_public_key(const AlgorithmIdentifier& alg_id,
return new DH_PublicKey(alg_id, key_bits);
#endif
-#if defined(BOTAN_HAS_NYBERG_RUEPPEL)
- if(alg_name == "NR")
- return new NR_PublicKey(alg_id, key_bits);
-#endif
-
#if defined(BOTAN_HAS_ELGAMAL)
if(alg_name == "ElGamal")
return new ElGamal_PublicKey(alg_id, key_bits);
@@ -150,11 +132,6 @@ Private_Key* make_private_key(const AlgorithmIdentifier& alg_id,
return new RSA_PrivateKey(alg_id, key_bits, rng);
#endif
-#if defined(BOTAN_HAS_RW)
- if(alg_name == "RW")
- return new RW_PrivateKey(alg_id, key_bits, rng);
-#endif
-
#if defined(BOTAN_HAS_DSA)
if(alg_name == "DSA")
return new DSA_PrivateKey(alg_id, key_bits, rng);
@@ -165,11 +142,6 @@ Private_Key* make_private_key(const AlgorithmIdentifier& alg_id,
return new DH_PrivateKey(alg_id, key_bits, rng);
#endif
-#if defined(BOTAN_HAS_NYBERG_RUEPPEL)
- if(alg_name == "NR")
- return new NR_PrivateKey(alg_id, key_bits, rng);
-#endif
-
#if defined(BOTAN_HAS_ELGAMAL)
if(alg_name == "ElGamal")
return new ElGamal_PrivateKey(alg_id, key_bits, rng);
diff --git a/src/lib/pubkey/rsa/info.txt b/src/lib/pubkey/rsa/info.txt
index 91eec565a..6df380696 100644
--- a/src/lib/pubkey/rsa/info.txt
+++ b/src/lib/pubkey/rsa/info.txt
@@ -1,7 +1,6 @@
-define RSA 20131128
+define RSA 20160730
<requires>
-if_algo
keypair
numbertheory
emsa_pssr
diff --git a/src/lib/pubkey/rsa/rsa.cpp b/src/lib/pubkey/rsa/rsa.cpp
index 6a645ec88..7f72ba210 100644
--- a/src/lib/pubkey/rsa/rsa.cpp
+++ b/src/lib/pubkey/rsa/rsa.cpp
@@ -1,6 +1,6 @@
/*
* RSA
-* (C) 1999-2010,2015 Jack Lloyd
+* (C) 1999-2010,2015,2016 Jack Lloyd
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -11,10 +11,118 @@
#include <botan/keypair.h>
#include <botan/blinding.h>
#include <botan/reducer.h>
+#include <botan/workfactor.h>
+#include <botan/der_enc.h>
+#include <botan/ber_dec.h>
#include <future>
namespace Botan {
+size_t RSA_PublicKey::estimated_strength() const
+ {
+ return if_work_factor(m_n.bits());
+ }
+
+AlgorithmIdentifier RSA_PublicKey::algorithm_identifier() const
+ {
+ return AlgorithmIdentifier(get_oid(),
+ AlgorithmIdentifier::USE_NULL_PARAM);
+ }
+
+std::vector<byte> RSA_PublicKey::x509_subject_public_key() const
+ {
+ return DER_Encoder()
+ .start_cons(SEQUENCE)
+ .encode(m_n)
+ .encode(m_e)
+ .end_cons()
+ .get_contents_unlocked();
+ }
+
+RSA_PublicKey::RSA_PublicKey(const AlgorithmIdentifier&,
+ const secure_vector<byte>& key_bits)
+ {
+ BER_Decoder(key_bits)
+ .start_cons(SEQUENCE)
+ .decode(m_n)
+ .decode(m_e)
+ .verify_end()
+ .end_cons();
+ }
+
+/*
+* Check RSA Public Parameters
+*/
+bool RSA_PublicKey::check_key(RandomNumberGenerator&, bool) const
+ {
+ if(m_n < 35 || m_n.is_even() || m_e < 2)
+ return false;
+ return true;
+ }
+
+secure_vector<byte> RSA_PrivateKey::pkcs8_private_key() const
+ {
+ return DER_Encoder()
+ .start_cons(SEQUENCE)
+ .encode(static_cast<size_t>(0))
+ .encode(m_n)
+ .encode(m_e)
+ .encode(m_d)
+ .encode(m_p)
+ .encode(m_q)
+ .encode(m_d1)
+ .encode(m_d2)
+ .encode(m_c)
+ .end_cons()
+ .get_contents();
+ }
+
+RSA_PrivateKey::RSA_PrivateKey(const AlgorithmIdentifier&,
+ const secure_vector<byte>& key_bits,
+ RandomNumberGenerator& rng)
+ {
+ BER_Decoder(key_bits)
+ .start_cons(SEQUENCE)
+ .decode_and_check<size_t>(0, "Unknown PKCS #1 key format version")
+ .decode(m_n)
+ .decode(m_e)
+ .decode(m_d)
+ .decode(m_p)
+ .decode(m_q)
+ .decode(m_d1)
+ .decode(m_d2)
+ .decode(m_c)
+ .end_cons();
+
+ load_check(rng);
+ }
+
+RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng,
+ const BigInt& prime1,
+ const BigInt& prime2,
+ const BigInt& exp,
+ const BigInt& d_exp,
+ const BigInt& mod) :
+ m_d{ d_exp }, m_p{ prime1 }, m_q{ prime2 }, m_d1{}, m_d2{}, m_c{ inverse_mod( m_q, m_p ) }
+ {
+ m_n = mod.is_nonzero() ? mod : m_p * m_q;
+ m_e = exp;
+
+ if(m_d == 0)
+ {
+ BigInt inv_for_d = lcm(m_p - 1, m_q - 1);
+ if(m_e.is_even())
+ inv_for_d >>= 1;
+
+ m_d = inverse_mod(m_e, inv_for_d);
+ }
+
+ m_d1 = m_d % (m_p - 1);
+ m_d2 = m_d % (m_q - 1);
+
+ load_check(rng);
+ }
+
/*
* Create a RSA private key
*/
@@ -49,16 +157,26 @@ RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng,
*/
bool RSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const
{
- if(!IF_Scheme_PrivateKey::check_key(rng, strong))
+ if(m_n < 35 || m_n.is_even() || m_e < 2 || m_d < 2 || m_p < 3 || m_q < 3 || m_p*m_q != m_n)
return false;
- if(!strong)
- return true;
+ if(m_d1 != m_d % (m_p - 1) || m_d2 != m_d % (m_q - 1) || m_c != inverse_mod(m_q, m_p))
+ return false;
+
+ const size_t prob = (strong) ? 56 : 12;
- if((m_e * m_d) % lcm(m_p - 1, m_q - 1) != 1)
+ if(!is_prime(m_p, rng, prob) || !is_prime(m_q, rng, prob))
return false;
- return KeyPair::signature_consistency_check(rng, *this, "EMSA4(SHA-256)");
+ if(strong)
+ {
+ if((m_e * m_d) % lcm(m_p - 1, m_q - 1) != 1)
+ return false;
+
+ return KeyPair::signature_consistency_check(rng, *this, "EMSA4(SHA-256)");
+ }
+
+ return true;
}
namespace {
diff --git a/src/lib/pubkey/rsa/rsa.h b/src/lib/pubkey/rsa/rsa.h
index 4a57b9f63..85bd7ce58 100644
--- a/src/lib/pubkey/rsa/rsa.h
+++ b/src/lib/pubkey/rsa/rsa.h
@@ -1,6 +1,6 @@
/*
* RSA
-* (C) 1999-2008 Jack Lloyd
+* (C) 1999-2008,2016 Jack Lloyd
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -8,23 +8,19 @@
#ifndef BOTAN_RSA_H__
#define BOTAN_RSA_H__
-#include <botan/if_algo.h>
-
+#include <botan/bigint.h>
+#include <botan/x509_key.h>
namespace Botan {
/**
* RSA Public Key
*/
-class BOTAN_DLL RSA_PublicKey : public virtual IF_Scheme_PublicKey
+class BOTAN_DLL RSA_PublicKey : public virtual Public_Key
{
public:
- std::string algo_name() const override { return "RSA"; }
-
RSA_PublicKey(const AlgorithmIdentifier& alg_id,
- const secure_vector<byte>& key_bits) :
- IF_Scheme_PublicKey(alg_id, key_bits)
- {}
+ const secure_vector<byte>& key_bits);
/**
* Create a RSA_PublicKey
@@ -32,26 +28,45 @@ class BOTAN_DLL RSA_PublicKey : public virtual IF_Scheme_PublicKey
* @arg e the exponent
*/
RSA_PublicKey(const BigInt& n, const BigInt& e) :
- IF_Scheme_PublicKey(n, e)
- {}
+ m_n(n), m_e(e) {}
+
+ std::string algo_name() const override { return "RSA"; }
+
+ bool check_key(RandomNumberGenerator& rng, bool) const override;
+
+ AlgorithmIdentifier algorithm_identifier() const override;
+
+ std::vector<byte> x509_subject_public_key() const override;
+
+ /**
+ * @return public modulus
+ */
+ const BigInt& get_n() const { return m_n; }
+
+ /**
+ * @return public exponent
+ */
+ const BigInt& get_e() const { return m_e; }
+
+ size_t max_input_bits() const override { return (m_n.bits() - 1); }
+
+ size_t estimated_strength() const override;
protected:
RSA_PublicKey() {}
+
+ BigInt m_n, m_e;
};
/**
* RSA Private Key
*/
-class BOTAN_DLL RSA_PrivateKey : public RSA_PublicKey,
- public IF_Scheme_PrivateKey
+class BOTAN_DLL RSA_PrivateKey : public Private_Key, public RSA_PublicKey
{
public:
- bool check_key(RandomNumberGenerator& rng, bool) const override;
-
RSA_PrivateKey(const AlgorithmIdentifier& alg_id,
const secure_vector<byte>& key_bits,
- RandomNumberGenerator& rng) :
- IF_Scheme_PrivateKey(rng, alg_id, key_bits) {}
+ RandomNumberGenerator& rng);
/**
* Construct a private key from the specified parameters.
@@ -68,8 +83,7 @@ class BOTAN_DLL RSA_PrivateKey : public RSA_PublicKey,
RSA_PrivateKey(RandomNumberGenerator& rng,
const BigInt& p, const BigInt& q,
const BigInt& e, const BigInt& d = 0,
- const BigInt& n = 0) :
- IF_Scheme_PrivateKey(rng, p, q, e, d, n) {}
+ const BigInt& n = 0);
/**
* Create a new private key with the specified bit length
@@ -79,6 +93,34 @@ class BOTAN_DLL RSA_PrivateKey : public RSA_PublicKey,
*/
RSA_PrivateKey(RandomNumberGenerator& rng,
size_t bits, size_t exp = 65537);
+
+ bool check_key(RandomNumberGenerator& rng, bool) const override;
+
+ /**
+ * Get the first prime p.
+ * @return prime p
+ */
+ const BigInt& get_p() const { return m_p; }
+
+ /**
+ * Get the second prime q.
+ * @return prime q
+ */
+ const BigInt& get_q() const { return m_q; }
+
+ /**
+ * Get d with exp * d = 1 mod (p - 1, q - 1).
+ * @return d
+ */
+ const BigInt& get_d() const { return m_d; }
+
+ const BigInt& get_c() const { return m_c; }
+ const BigInt& get_d1() const { return m_d1; }
+ const BigInt& get_d2() const { return m_d2; }
+
+ secure_vector<byte> pkcs8_private_key() const override;
+ private:
+ BigInt m_d, m_p, m_q, m_d1, m_d2, m_c;
};
}
diff --git a/src/lib/pubkey/rw/info.txt b/src/lib/pubkey/rw/info.txt
deleted file mode 100644
index 7cf1d1780..000000000
--- a/src/lib/pubkey/rw/info.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-define RW 20131128
-
-<requires>
-if_algo
-keypair
-numbertheory
-</requires>
diff --git a/src/lib/pubkey/rw/rw.cpp b/src/lib/pubkey/rw/rw.cpp
deleted file mode 100644
index bf6b647a1..000000000
--- a/src/lib/pubkey/rw/rw.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
-* Rabin-Williams
-* (C) 1999-2008 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/internal/pk_utils.h>
-#include <botan/rw.h>
-#include <botan/keypair.h>
-#include <botan/parsing.h>
-#include <botan/reducer.h>
-#include <botan/blinding.h>
-#include <algorithm>
-#include <future>
-
-namespace Botan {
-
-/*
-* Create a Rabin-Williams private key
-*/
-RW_PrivateKey::RW_PrivateKey(RandomNumberGenerator& rng,
- size_t bits, size_t exp)
- {
- if(bits < 1024)
- throw Invalid_Argument(algo_name() + ": Can't make a key that is only " +
- std::to_string(bits) + " bits long");
- if(exp < 2 || exp % 2 == 1)
- throw Invalid_Argument(algo_name() + ": Invalid encryption exponent");
-
- m_e = exp;
-
- do
- {
- m_p = random_prime(rng, (bits + 1) / 2, m_e / 2, 3, 4);
- m_q = random_prime(rng, bits - m_p.bits(), m_e / 2, ((m_p % 8 == 3) ? 7 : 3), 8);
- m_n = m_p * m_q;
- } while(m_n.bits() != bits);
-
- m_d = inverse_mod(m_e, lcm(m_p - 1, m_q - 1) >> 1);
- m_d1 = m_d % (m_p - 1);
- m_d2 = m_d % (m_q - 1);
- m_c = inverse_mod(m_q, m_p);
-
- gen_check(rng);
- }
-
-/*
-* Check Private Rabin-Williams Parameters
-*/
-bool RW_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const
- {
- if(!IF_Scheme_PrivateKey::check_key(rng, strong))
- return false;
-
- if(!strong)
- return true;
-
- if((m_e * m_d) % (lcm(m_p - 1, m_q - 1) / 2) != 1)
- return false;
-
- return KeyPair::signature_consistency_check(rng, *this, "EMSA2(SHA-1)");
- }
-
-namespace {
-
-/**
-* Rabin-Williams Signature Operation
-*/
-class RW_Signature_Operation : public PK_Ops::Signature_with_EMSA
- {
- public:
- typedef RW_PrivateKey Key_Type;
-
- RW_Signature_Operation(const RW_PrivateKey& rw,
- const std::string& emsa) :
- PK_Ops::Signature_with_EMSA(emsa),
- m_n(rw.get_n()),
- m_e(rw.get_e()),
- m_q(rw.get_q()),
- m_c(rw.get_c()),
- m_powermod_d1_p(rw.get_d1(), rw.get_p()),
- m_powermod_d2_q(rw.get_d2(), rw.get_q()),
- m_mod_p(rw.get_p()),
- m_blinder(m_n,
- [this](const BigInt& k) { return power_mod(k, m_e, m_n); },
- [this](const BigInt& k) { return inverse_mod(k, m_n); })
- {
- }
-
- size_t max_input_bits() const override { return (m_n.bits() - 1); }
-
- secure_vector<byte> raw_sign(const byte msg[], size_t msg_len,
- RandomNumberGenerator& rng) override;
- private:
- const BigInt& m_n;
- const BigInt& m_e;
- const BigInt& m_q;
- const BigInt& m_c;
-
- Fixed_Exponent_Power_Mod m_powermod_d1_p, m_powermod_d2_q;
- Modular_Reducer m_mod_p;
- Blinder m_blinder;
- };
-
-secure_vector<byte>
-RW_Signature_Operation::raw_sign(const byte msg[], size_t msg_len,
- RandomNumberGenerator&)
- {
- BigInt i(msg, msg_len);
-
- if(i >= m_n || i % 16 != 12)
- throw Invalid_Argument("Rabin-Williams: invalid input");
-
- if(jacobi(i, m_n) != 1)
- i >>= 1;
-
- i = m_blinder.blind(i);
-
- auto future_j1 = std::async(std::launch::async, m_powermod_d1_p, i);
- const BigInt j2 = m_powermod_d2_q(i);
- BigInt j1 = future_j1.get();
-
- j1 = m_mod_p.reduce(sub_mul(j1, j2, m_c));
-
- const BigInt r = m_blinder.unblind(mul_add(j1, m_q, j2));
-
- return BigInt::encode_1363(std::min(r, m_n - r), m_n.bytes());
- }
-
-/**
-* Rabin-Williams Verification Operation
-*/
-class RW_Verification_Operation : public PK_Ops::Verification_with_EMSA
- {
- public:
- typedef RW_PublicKey Key_Type;
-
- RW_Verification_Operation(const RW_PublicKey& rw, const std::string& emsa) :
- PK_Ops::Verification_with_EMSA(emsa),
- m_n(rw.get_n()), m_powermod_e_n(rw.get_e(), rw.get_n())
- {}
-
- size_t max_input_bits() const override { return (m_n.bits() - 1); }
- bool with_recovery() const override { return true; }
-
- secure_vector<byte> verify_mr(const byte msg[], size_t msg_len) override;
-
- private:
- const BigInt& m_n;
- Fixed_Exponent_Power_Mod m_powermod_e_n;
- };
-
-secure_vector<byte>
-RW_Verification_Operation::verify_mr(const byte msg[], size_t msg_len)
- {
- BigInt m(msg, msg_len);
-
- if((m > (m_n >> 1)) || m.is_negative())
- throw Invalid_Argument("RW signature verification: m > n / 2 || m < 0");
-
- BigInt r = m_powermod_e_n(m);
- if(r % 16 == 12)
- return BigInt::encode_locked(r);
- if(r % 8 == 6)
- return BigInt::encode_locked(2*r);
-
- r = m_n - r;
- if(r % 16 == 12)
- return BigInt::encode_locked(r);
- if(r % 8 == 6)
- return BigInt::encode_locked(2*r);
-
- throw Invalid_Argument("RW signature verification: Invalid signature");
- }
-
-BOTAN_REGISTER_PK_SIGNATURE_OP("RW", RW_Signature_Operation);
-BOTAN_REGISTER_PK_VERIFY_OP("RW", RW_Verification_Operation);
-
-}
-
-}
diff --git a/src/lib/pubkey/rw/rw.h b/src/lib/pubkey/rw/rw.h
deleted file mode 100644
index 2a010441e..000000000
--- a/src/lib/pubkey/rw/rw.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-* Rabin-Williams
-* (C) 1999-2007 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_RW_H__
-#define BOTAN_RW_H__
-
-#include <botan/if_algo.h>
-
-namespace Botan {
-
-/**
-* Rabin-Williams Public Key
-*/
-class BOTAN_DLL RW_PublicKey : public virtual IF_Scheme_PublicKey
- {
- public:
- std::string algo_name() const override { return "RW"; }
-
- RW_PublicKey(const AlgorithmIdentifier& alg_id,
- const secure_vector<byte>& key_bits) :
- IF_Scheme_PublicKey(alg_id, key_bits)
- {}
-
- RW_PublicKey(const BigInt& mod, const BigInt& exponent) :
- IF_Scheme_PublicKey(mod, exponent)
- {}
-
- protected:
- RW_PublicKey() {}
- };
-
-/**
-* Rabin-Williams Private Key
-*/
-class BOTAN_DLL RW_PrivateKey : public RW_PublicKey,
- public IF_Scheme_PrivateKey
- {
- public:
- RW_PrivateKey(const AlgorithmIdentifier& alg_id,
- const secure_vector<byte>& key_bits,
- RandomNumberGenerator& rng) :
- IF_Scheme_PrivateKey(rng, alg_id, key_bits) {}
-
- RW_PrivateKey(RandomNumberGenerator& rng,
- const BigInt& p, const BigInt& q,
- const BigInt& e, const BigInt& d = 0,
- const BigInt& n = 0) :
- IF_Scheme_PrivateKey(rng, p, q, e, d, n) {}
-
- RW_PrivateKey(RandomNumberGenerator& rng, size_t bits, size_t = 2);
-
- bool check_key(RandomNumberGenerator& rng, bool) const override;
- };
-
-}
-
-#endif
diff --git a/src/lib/rng/hmac_rng/hmac_rng.cpp b/src/lib/rng/hmac_rng/hmac_rng.cpp
index d66c538ab..081d8b38a 100644
--- a/src/lib/rng/hmac_rng/hmac_rng.cpp
+++ b/src/lib/rng/hmac_rng/hmac_rng.cpp
@@ -16,7 +16,7 @@ HMAC_RNG::HMAC_RNG(std::unique_ptr<MessageAuthenticationCode> prf,
RandomNumberGenerator& underlying_rng,
Entropy_Sources& entropy_sources,
size_t reseed_interval) :
- Stateful_RNG(underlying_rng, reseed_interval),
+ Stateful_RNG(underlying_rng, entropy_sources, reseed_interval),
m_prf(std::move(prf))
{
BOTAN_ASSERT_NONNULL(m_prf);
diff --git a/src/lib/stream/chacha/chacha.cpp b/src/lib/stream/chacha/chacha.cpp
index 40da93029..c35363112 100644
--- a/src/lib/stream/chacha/chacha.cpp
+++ b/src/lib/stream/chacha/chacha.cpp
@@ -7,6 +7,7 @@
#include <botan/chacha.h>
#include <botan/loadstor.h>
+#include <botan/cpuid.h>
namespace Botan {
@@ -16,58 +17,87 @@ ChaCha::ChaCha(size_t rounds) : m_rounds(rounds)
throw Invalid_Argument("ChaCha only supports 8, 12 or 20 rounds");
}
-namespace {
-
-void chacha(byte output[64], const u32bit input[16], size_t rounds)
+//static
+void ChaCha::chacha_x4(byte output[64*4], u32bit input[16], size_t rounds)
{
BOTAN_ASSERT(rounds % 2 == 0, "Valid rounds");
- u32bit x00 = input[ 0], x01 = input[ 1], x02 = input[ 2], x03 = input[ 3],
- x04 = input[ 4], x05 = input[ 5], x06 = input[ 6], x07 = input[ 7],
- x08 = input[ 8], x09 = input[ 9], x10 = input[10], x11 = input[11],
- x12 = input[12], x13 = input[13], x14 = input[14], x15 = input[15];
-
-#define CHACHA_QUARTER_ROUND(a, b, c, d) \
- do { \
- a += b; d ^= a; d = rotate_left(d, 16); \
- c += d; b ^= c; b = rotate_left(b, 12); \
- a += b; d ^= a; d = rotate_left(d, 8); \
- c += d; b ^= c; b = rotate_left(b, 7); \
- } while(0)
-
- for(size_t i = 0; i != rounds / 2; ++i)
+#if defined(BOTAN_HAS_CHACHA_SSE2)
+ if(CPUID::has_sse2())
{
- CHACHA_QUARTER_ROUND(x00, x04, x08, x12);
- CHACHA_QUARTER_ROUND(x01, x05, x09, x13);
- CHACHA_QUARTER_ROUND(x02, x06, x10, x14);
- CHACHA_QUARTER_ROUND(x03, x07, x11, x15);
-
- CHACHA_QUARTER_ROUND(x00, x05, x10, x15);
- CHACHA_QUARTER_ROUND(x01, x06, x11, x12);
- CHACHA_QUARTER_ROUND(x02, x07, x08, x13);
- CHACHA_QUARTER_ROUND(x03, x04, x09, x14);
+ return ChaCha::chacha_sse2_x4(output, input, rounds);
}
+#endif
+
+ // TODO interleave rounds
+ for(size_t i = 0; i != 4; ++i)
+ {
+ u32bit x00 = input[ 0], x01 = input[ 1], x02 = input[ 2], x03 = input[ 3],
+ x04 = input[ 4], x05 = input[ 5], x06 = input[ 6], x07 = input[ 7],
+ x08 = input[ 8], x09 = input[ 9], x10 = input[10], x11 = input[11],
+ x12 = input[12], x13 = input[13], x14 = input[14], x15 = input[15];
+
+#define CHACHA_QUARTER_ROUND(a, b, c, d) \
+ do { \
+ a += b; d ^= a; d = rotate_left(d, 16); \
+ c += d; b ^= c; b = rotate_left(b, 12); \
+ a += b; d ^= a; d = rotate_left(d, 8); \
+ c += d; b ^= c; b = rotate_left(b, 7); \
+ } while(0)
+
+ for(size_t i = 0; i != rounds / 2; ++i)
+ {
+ CHACHA_QUARTER_ROUND(x00, x04, x08, x12);
+ CHACHA_QUARTER_ROUND(x01, x05, x09, x13);
+ CHACHA_QUARTER_ROUND(x02, x06, x10, x14);
+ CHACHA_QUARTER_ROUND(x03, x07, x11, x15);
+
+ CHACHA_QUARTER_ROUND(x00, x05, x10, x15);
+ CHACHA_QUARTER_ROUND(x01, x06, x11, x12);
+ CHACHA_QUARTER_ROUND(x02, x07, x08, x13);
+ CHACHA_QUARTER_ROUND(x03, x04, x09, x14);
+ }
#undef CHACHA_QUARTER_ROUND
- store_le(x00 + input[ 0], output + 4 * 0);
- store_le(x01 + input[ 1], output + 4 * 1);
- store_le(x02 + input[ 2], output + 4 * 2);
- store_le(x03 + input[ 3], output + 4 * 3);
- store_le(x04 + input[ 4], output + 4 * 4);
- store_le(x05 + input[ 5], output + 4 * 5);
- store_le(x06 + input[ 6], output + 4 * 6);
- store_le(x07 + input[ 7], output + 4 * 7);
- store_le(x08 + input[ 8], output + 4 * 8);
- store_le(x09 + input[ 9], output + 4 * 9);
- store_le(x10 + input[10], output + 4 * 10);
- store_le(x11 + input[11], output + 4 * 11);
- store_le(x12 + input[12], output + 4 * 12);
- store_le(x13 + input[13], output + 4 * 13);
- store_le(x14 + input[14], output + 4 * 14);
- store_le(x15 + input[15], output + 4 * 15);
+ x00 += input[0];
+ x01 += input[1];
+ x02 += input[2];
+ x03 += input[3];
+ x04 += input[4];
+ x05 += input[5];
+ x06 += input[6];
+ x07 += input[7];
+ x08 += input[8];
+ x09 += input[9];
+ x10 += input[10];
+ x11 += input[11];
+ x12 += input[12];
+ x13 += input[13];
+ x14 += input[14];
+ x15 += input[15];
+
+ store_le(x00, output + 64 * i + 4 * 0);
+ store_le(x01, output + 64 * i + 4 * 1);
+ store_le(x02, output + 64 * i + 4 * 2);
+ store_le(x03, output + 64 * i + 4 * 3);
+ store_le(x04, output + 64 * i + 4 * 4);
+ store_le(x05, output + 64 * i + 4 * 5);
+ store_le(x06, output + 64 * i + 4 * 6);
+ store_le(x07, output + 64 * i + 4 * 7);
+ store_le(x08, output + 64 * i + 4 * 8);
+ store_le(x09, output + 64 * i + 4 * 9);
+ store_le(x10, output + 64 * i + 4 * 10);
+ store_le(x11, output + 64 * i + 4 * 11);
+ store_le(x12, output + 64 * i + 4 * 12);
+ store_le(x13, output + 64 * i + 4 * 13);
+ store_le(x14, output + 64 * i + 4 * 14);
+ store_le(x15, output + 64 * i + 4 * 15);
+
+ input[12]++;
+ input[13] += input[12] < i; // carry?
+ }
}
-}
/*
* Combine cipher stream with message
@@ -80,11 +110,7 @@ void ChaCha::cipher(const byte in[], byte out[], size_t length)
length -= (m_buffer.size() - m_position);
in += (m_buffer.size() - m_position);
out += (m_buffer.size() - m_position);
- chacha(m_buffer.data(), m_state.data(), m_rounds);
-
- ++m_state[12];
- m_state[13] += (m_state[12] == 0);
-
+ chacha_x4(m_buffer.data(), m_state.data(), m_rounds);
m_position = 0;
}
@@ -106,8 +132,12 @@ void ChaCha::key_schedule(const byte key[], size_t length)
const u32bit* CONSTANTS = (length == 16) ? TAU : SIGMA;
+ // Repeat the key if 128 bits
+ const byte* key2 = (length == 32) ? key + 16 : key;
+
+ m_position = 0;
m_state.resize(16);
- m_buffer.resize(64);
+ m_buffer.resize(4*64);
m_state[0] = CONSTANTS[0];
m_state[1] = CONSTANTS[1];
@@ -119,16 +149,12 @@ void ChaCha::key_schedule(const byte key[], size_t length)
m_state[6] = load_le<u32bit>(key, 2);
m_state[7] = load_le<u32bit>(key, 3);
- if(length == 32)
- key += 16;
-
- m_state[8] = load_le<u32bit>(key, 0);
- m_state[9] = load_le<u32bit>(key, 1);
- m_state[10] = load_le<u32bit>(key, 2);
- m_state[11] = load_le<u32bit>(key, 3);
-
- m_position = 0;
+ m_state[8] = load_le<u32bit>(key2, 0);
+ m_state[9] = load_le<u32bit>(key2, 1);
+ m_state[10] = load_le<u32bit>(key2, 2);
+ m_state[11] = load_le<u32bit>(key2, 3);
+ // Default all-zero IV
const byte ZERO[8] = { 0 };
set_iv(ZERO, sizeof(ZERO));
}
@@ -153,10 +179,7 @@ void ChaCha::set_iv(const byte iv[], size_t length)
m_state[15] = load_le<u32bit>(iv, 2);
}
- chacha(m_buffer.data(), m_state.data(), m_rounds);
- ++m_state[12];
- m_state[13] += (m_state[12] == 0);
-
+ chacha_x4(m_buffer.data(), m_state.data(), m_rounds);
m_position = 0;
}
@@ -176,12 +199,11 @@ void ChaCha::seek(u64bit offset)
{
if (m_state.size() == 0 && m_buffer.size() == 0)
{
- throw Invalid_State("You have to setup the stream cipher (key and iv)");
+ throw Invalid_State("You have to setup the stream cipher (key and iv)");
}
- m_position = offset % m_buffer.size();
-
- u64bit counter = offset / m_buffer.size();
+ // Find the block offset
+ u64bit counter = offset / 64;
byte out[8];
@@ -190,9 +212,7 @@ void ChaCha::seek(u64bit offset)
m_state[12] = load_le<u32bit>(out, 0);
m_state[13] += load_le<u32bit>(out, 1);
- chacha(m_buffer.data(), m_state.data(), m_rounds);
-
- ++m_state[12];
- m_state[13] += (m_state[12] == 0);
+ chacha_x4(m_buffer.data(), m_state.data(), m_rounds);
+ m_position = offset % 64;
}
}
diff --git a/src/lib/stream/chacha/chacha.h b/src/lib/stream/chacha/chacha.h
index 7ba37012f..9b4c5d76f 100644
--- a/src/lib/stream/chacha/chacha.h
+++ b/src/lib/stream/chacha/chacha.h
@@ -47,6 +47,14 @@ class BOTAN_DLL ChaCha final : public StreamCipher
private:
void key_schedule(const byte key[], size_t key_len) override;
+ void incr_state_counter(size_t howmany);
+
+ void chacha_x4(byte output[64*4], u32bit state[16], size_t rounds);
+
+#if defined(BOTAN_HAS_CHACHA_SSE2)
+ void chacha_sse2_x4(byte output[64*4], u32bit state[16], size_t rounds);
+#endif
+
size_t m_rounds;
secure_vector<u32bit> m_state;
secure_vector<byte> m_buffer;
diff --git a/src/lib/stream/chacha/chacha_sse2/chacha_sse2.cpp b/src/lib/stream/chacha/chacha_sse2/chacha_sse2.cpp
new file mode 100644
index 000000000..e39b285b3
--- /dev/null
+++ b/src/lib/stream/chacha/chacha_sse2/chacha_sse2.cpp
@@ -0,0 +1,259 @@
+/*
+* SSE2 ChaCha
+* (C) 2016 Jack Lloyd
+*
+* Botan is released under the Simplified BSD License (see license.txt)
+*/
+
+#include <botan/chacha.h>
+#include <emmintrin.h>
+
+namespace Botan {
+
+//static
+void ChaCha::chacha_sse2_x4(byte output[64], u32bit input[16], size_t rounds)
+ {
+ BOTAN_ASSERT(rounds % 2 == 0, "Valid rounds");
+
+ const __m128i* input_mm = reinterpret_cast<const __m128i*>(input);
+ __m128i* output_mm = reinterpret_cast<__m128i*>(output);
+
+ __m128i input0 = _mm_loadu_si128(input_mm);
+ __m128i input1 = _mm_loadu_si128(input_mm + 1);
+ __m128i input2 = _mm_loadu_si128(input_mm + 2);
+ __m128i input3 = _mm_loadu_si128(input_mm + 3);
+
+ // TODO: try transposing, which would avoid the permutations each round
+
+#define mm_rotl(r, n) \
+ _mm_or_si128(_mm_slli_epi32(r, n), _mm_srli_epi32(r, 32-n))
+
+ __m128i r0_0 = input0;
+ __m128i r0_1 = input1;
+ __m128i r0_2 = input2;
+ __m128i r0_3 = input3;
+
+ __m128i r1_0 = input0;
+ __m128i r1_1 = input1;
+ __m128i r1_2 = input2;
+ __m128i r1_3 = input3;
+ r1_3 = _mm_add_epi64(r0_3, _mm_set_epi32(0, 0, 0, 1));
+
+ __m128i r2_0 = input0;
+ __m128i r2_1 = input1;
+ __m128i r2_2 = input2;
+ __m128i r2_3 = input3;
+ r2_3 = _mm_add_epi64(r0_3, _mm_set_epi32(0, 0, 0, 2));
+
+ __m128i r3_0 = input0;
+ __m128i r3_1 = input1;
+ __m128i r3_2 = input2;
+ __m128i r3_3 = input3;
+ r3_3 = _mm_add_epi64(r0_3, _mm_set_epi32(0, 0, 0, 3));
+
+ for(size_t r = 0; r != rounds / 2; ++r)
+ {
+ r0_0 = _mm_add_epi32(r0_0, r0_1);
+ r1_0 = _mm_add_epi32(r1_0, r1_1);
+ r2_0 = _mm_add_epi32(r2_0, r2_1);
+ r3_0 = _mm_add_epi32(r3_0, r3_1);
+
+ r0_3 = _mm_xor_si128(r0_3, r0_0);
+ r1_3 = _mm_xor_si128(r1_3, r1_0);
+ r2_3 = _mm_xor_si128(r2_3, r2_0);
+ r3_3 = _mm_xor_si128(r3_3, r3_0);
+
+ r0_3 = mm_rotl(r0_3, 16);
+ r1_3 = mm_rotl(r1_3, 16);
+ r2_3 = mm_rotl(r2_3, 16);
+ r3_3 = mm_rotl(r3_3, 16);
+
+ r0_2 = _mm_add_epi32(r0_2, r0_3);
+ r1_2 = _mm_add_epi32(r1_2, r1_3);
+ r2_2 = _mm_add_epi32(r2_2, r2_3);
+ r3_2 = _mm_add_epi32(r3_2, r3_3);
+
+ r0_1 = _mm_xor_si128(r0_1, r0_2);
+ r1_1 = _mm_xor_si128(r1_1, r1_2);
+ r2_1 = _mm_xor_si128(r2_1, r2_2);
+ r3_1 = _mm_xor_si128(r3_1, r3_2);
+
+ r0_1 = mm_rotl(r0_1, 12);
+ r1_1 = mm_rotl(r1_1, 12);
+ r2_1 = mm_rotl(r2_1, 12);
+ r3_1 = mm_rotl(r3_1, 12);
+
+ r0_0 = _mm_add_epi32(r0_0, r0_1);
+ r1_0 = _mm_add_epi32(r1_0, r1_1);
+ r2_0 = _mm_add_epi32(r2_0, r2_1);
+ r3_0 = _mm_add_epi32(r3_0, r3_1);
+
+ r0_3 = _mm_xor_si128(r0_3, r0_0);
+ r1_3 = _mm_xor_si128(r1_3, r1_0);
+ r2_3 = _mm_xor_si128(r2_3, r2_0);
+ r3_3 = _mm_xor_si128(r3_3, r3_0);
+
+ r0_3 = mm_rotl(r0_3, 8);
+ r1_3 = mm_rotl(r1_3, 8);
+ r2_3 = mm_rotl(r2_3, 8);
+ r3_3 = mm_rotl(r3_3, 8);
+
+ r0_2 = _mm_add_epi32(r0_2, r0_3);
+ r1_2 = _mm_add_epi32(r1_2, r1_3);
+ r2_2 = _mm_add_epi32(r2_2, r2_3);
+ r3_2 = _mm_add_epi32(r3_2, r3_3);
+
+ r0_1 = _mm_xor_si128(r0_1, r0_2);
+ r1_1 = _mm_xor_si128(r1_1, r1_2);
+ r2_1 = _mm_xor_si128(r2_1, r2_2);
+ r3_1 = _mm_xor_si128(r3_1, r3_2);
+
+ r0_1 = mm_rotl(r0_1, 7);
+ r1_1 = mm_rotl(r1_1, 7);
+ r2_1 = mm_rotl(r2_1, 7);
+ r3_1 = mm_rotl(r3_1, 7);
+
+ r0_1 = _mm_shuffle_epi32(r0_1, _MM_SHUFFLE(0, 3, 2, 1));
+ r0_2 = _mm_shuffle_epi32(r0_2, _MM_SHUFFLE(1, 0, 3, 2));
+ r0_3 = _mm_shuffle_epi32(r0_3, _MM_SHUFFLE(2, 1, 0, 3));
+
+ r1_1 = _mm_shuffle_epi32(r1_1, _MM_SHUFFLE(0, 3, 2, 1));
+ r1_2 = _mm_shuffle_epi32(r1_2, _MM_SHUFFLE(1, 0, 3, 2));
+ r1_3 = _mm_shuffle_epi32(r1_3, _MM_SHUFFLE(2, 1, 0, 3));
+
+ r2_1 = _mm_shuffle_epi32(r2_1, _MM_SHUFFLE(0, 3, 2, 1));
+ r2_2 = _mm_shuffle_epi32(r2_2, _MM_SHUFFLE(1, 0, 3, 2));
+ r2_3 = _mm_shuffle_epi32(r2_3, _MM_SHUFFLE(2, 1, 0, 3));
+
+ r3_1 = _mm_shuffle_epi32(r3_1, _MM_SHUFFLE(0, 3, 2, 1));
+ r3_2 = _mm_shuffle_epi32(r3_2, _MM_SHUFFLE(1, 0, 3, 2));
+ r3_3 = _mm_shuffle_epi32(r3_3, _MM_SHUFFLE(2, 1, 0, 3));
+
+ r0_0 = _mm_add_epi32(r0_0, r0_1);
+ r1_0 = _mm_add_epi32(r1_0, r1_1);
+ r2_0 = _mm_add_epi32(r2_0, r2_1);
+ r3_0 = _mm_add_epi32(r3_0, r3_1);
+
+ r0_3 = _mm_xor_si128(r0_3, r0_0);
+ r1_3 = _mm_xor_si128(r1_3, r1_0);
+ r2_3 = _mm_xor_si128(r2_3, r2_0);
+ r3_3 = _mm_xor_si128(r3_3, r3_0);
+
+ r0_3 = mm_rotl(r0_3, 16);
+ r1_3 = mm_rotl(r1_3, 16);
+ r2_3 = mm_rotl(r2_3, 16);
+ r3_3 = mm_rotl(r3_3, 16);
+
+ r0_2 = _mm_add_epi32(r0_2, r0_3);
+ r1_2 = _mm_add_epi32(r1_2, r1_3);
+ r2_2 = _mm_add_epi32(r2_2, r2_3);
+ r3_2 = _mm_add_epi32(r3_2, r3_3);
+
+ r0_1 = _mm_xor_si128(r0_1, r0_2);
+ r1_1 = _mm_xor_si128(r1_1, r1_2);
+ r2_1 = _mm_xor_si128(r2_1, r2_2);
+ r3_1 = _mm_xor_si128(r3_1, r3_2);
+
+ r0_1 = mm_rotl(r0_1, 12);
+ r1_1 = mm_rotl(r1_1, 12);
+ r2_1 = mm_rotl(r2_1, 12);
+ r3_1 = mm_rotl(r3_1, 12);
+
+ r0_0 = _mm_add_epi32(r0_0, r0_1);
+ r1_0 = _mm_add_epi32(r1_0, r1_1);
+ r2_0 = _mm_add_epi32(r2_0, r2_1);
+ r3_0 = _mm_add_epi32(r3_0, r3_1);
+
+ r0_3 = _mm_xor_si128(r0_3, r0_0);
+ r1_3 = _mm_xor_si128(r1_3, r1_0);
+ r2_3 = _mm_xor_si128(r2_3, r2_0);
+ r3_3 = _mm_xor_si128(r3_3, r3_0);
+
+ r0_3 = mm_rotl(r0_3, 8);
+ r1_3 = mm_rotl(r1_3, 8);
+ r2_3 = mm_rotl(r2_3, 8);
+ r3_3 = mm_rotl(r3_3, 8);
+
+ r0_2 = _mm_add_epi32(r0_2, r0_3);
+ r1_2 = _mm_add_epi32(r1_2, r1_3);
+ r2_2 = _mm_add_epi32(r2_2, r2_3);
+ r3_2 = _mm_add_epi32(r3_2, r3_3);
+
+ r0_1 = _mm_xor_si128(r0_1, r0_2);
+ r1_1 = _mm_xor_si128(r1_1, r1_2);
+ r2_1 = _mm_xor_si128(r2_1, r2_2);
+ r3_1 = _mm_xor_si128(r3_1, r3_2);
+
+ r0_1 = mm_rotl(r0_1, 7);
+ r1_1 = mm_rotl(r1_1, 7);
+ r2_1 = mm_rotl(r2_1, 7);
+ r3_1 = mm_rotl(r3_1, 7);
+
+ r0_1 = _mm_shuffle_epi32(r0_1, _MM_SHUFFLE(2, 1, 0, 3));
+ r0_2 = _mm_shuffle_epi32(r0_2, _MM_SHUFFLE(1, 0, 3, 2));
+ r0_3 = _mm_shuffle_epi32(r0_3, _MM_SHUFFLE(0, 3, 2, 1));
+
+ r1_1 = _mm_shuffle_epi32(r1_1, _MM_SHUFFLE(2, 1, 0, 3));
+ r1_2 = _mm_shuffle_epi32(r1_2, _MM_SHUFFLE(1, 0, 3, 2));
+ r1_3 = _mm_shuffle_epi32(r1_3, _MM_SHUFFLE(0, 3, 2, 1));
+
+ r2_1 = _mm_shuffle_epi32(r2_1, _MM_SHUFFLE(2, 1, 0, 3));
+ r2_2 = _mm_shuffle_epi32(r2_2, _MM_SHUFFLE(1, 0, 3, 2));
+ r2_3 = _mm_shuffle_epi32(r2_3, _MM_SHUFFLE(0, 3, 2, 1));
+
+ r3_1 = _mm_shuffle_epi32(r3_1, _MM_SHUFFLE(2, 1, 0, 3));
+ r3_2 = _mm_shuffle_epi32(r3_2, _MM_SHUFFLE(1, 0, 3, 2));
+ r3_3 = _mm_shuffle_epi32(r3_3, _MM_SHUFFLE(0, 3, 2, 1));
+ }
+
+ r0_0 = _mm_add_epi32(r0_0, input0);
+ r0_1 = _mm_add_epi32(r0_1, input1);
+ r0_2 = _mm_add_epi32(r0_2, input2);
+ r0_3 = _mm_add_epi32(r0_3, input3);
+
+ r1_0 = _mm_add_epi32(r1_0, input0);
+ r1_1 = _mm_add_epi32(r1_1, input1);
+ r1_2 = _mm_add_epi32(r1_2, input2);
+ r1_3 = _mm_add_epi32(r1_3, input3);
+ r1_3 = _mm_add_epi64(r1_3, _mm_set_epi32(0, 0, 0, 1));
+
+ r2_0 = _mm_add_epi32(r2_0, input0);
+ r2_1 = _mm_add_epi32(r2_1, input1);
+ r2_2 = _mm_add_epi32(r2_2, input2);
+ r2_3 = _mm_add_epi32(r2_3, input3);
+ r2_3 = _mm_add_epi64(r2_3, _mm_set_epi32(0, 0, 0, 2));
+
+ r3_0 = _mm_add_epi32(r3_0, input0);
+ r3_1 = _mm_add_epi32(r3_1, input1);
+ r3_2 = _mm_add_epi32(r3_2, input2);
+ r3_3 = _mm_add_epi32(r3_3, input3);
+ r3_3 = _mm_add_epi64(r3_3, _mm_set_epi32(0, 0, 0, 3));
+
+ _mm_storeu_si128(output_mm + 0, r0_0);
+ _mm_storeu_si128(output_mm + 1, r0_1);
+ _mm_storeu_si128(output_mm + 2, r0_2);
+ _mm_storeu_si128(output_mm + 3, r0_3);
+
+ _mm_storeu_si128(output_mm + 4, r1_0);
+ _mm_storeu_si128(output_mm + 5, r1_1);
+ _mm_storeu_si128(output_mm + 6, r1_2);
+ _mm_storeu_si128(output_mm + 7, r1_3);
+
+ _mm_storeu_si128(output_mm + 8, r2_0);
+ _mm_storeu_si128(output_mm + 9, r2_1);
+ _mm_storeu_si128(output_mm + 10, r2_2);
+ _mm_storeu_si128(output_mm + 11, r2_3);
+
+ _mm_storeu_si128(output_mm + 12, r3_0);
+ _mm_storeu_si128(output_mm + 13, r3_1);
+ _mm_storeu_si128(output_mm + 14, r3_2);
+ _mm_storeu_si128(output_mm + 15, r3_3);
+
+#undef mm_rotl
+
+ input[12] += 4;
+ if(input[12] < 4)
+ input[13]++;
+ }
+
+}
diff --git a/src/lib/stream/chacha/chacha_sse2/info.txt b/src/lib/stream/chacha/chacha_sse2/info.txt
new file mode 100644
index 000000000..965479746
--- /dev/null
+++ b/src/lib/stream/chacha/chacha_sse2/info.txt
@@ -0,0 +1,3 @@
+define CHACHA_SSE2 20160831
+
+need_isa sse2
diff --git a/src/lib/tls/info.txt b/src/lib/tls/info.txt
index b26179226..667726318 100644
--- a/src/lib/tls/info.txt
+++ b/src/lib/tls/info.txt
@@ -6,6 +6,7 @@ load_on auto
credentials_manager.h
tls_alert.h
tls_blocking.h
+tls_callbacks.h
tls_channel.h
tls_ciphersuite.h
tls_client.h
diff --git a/src/lib/tls/msg_cert_verify.cpp b/src/lib/tls/msg_cert_verify.cpp
index 2598255eb..6b59e703f 100644
--- a/src/lib/tls/msg_cert_verify.cpp
+++ b/src/lib/tls/msg_cert_verify.cpp
@@ -82,6 +82,8 @@ bool Certificate_Verify::verify(const X509_Certificate& cert,
{
std::unique_ptr<Public_Key> key(cert.subject_public_key());
+ policy.check_peer_key_acceptable(*key);
+
std::pair<std::string, Signature_Format> format =
state.parse_sig_format(*key.get(), m_hash_algo, m_sig_algo,
true, policy);
diff --git a/src/lib/tls/msg_certificate.cpp b/src/lib/tls/msg_certificate.cpp
index 32e3e17f0..10ee7c95f 100644
--- a/src/lib/tls/msg_certificate.cpp
+++ b/src/lib/tls/msg_certificate.cpp
@@ -31,7 +31,7 @@ Certificate::Certificate(Handshake_IO& io,
/**
* Deserialize a Certificate message
*/
-Certificate::Certificate(const std::vector<byte>& buf)
+Certificate::Certificate(const std::vector<byte>& buf, const Policy& /*policy_currently_unused*/)
{
if(buf.size() < 3)
throw Decoding_Error("Certificate: Message malformed");
diff --git a/src/lib/tls/msg_client_hello.cpp b/src/lib/tls/msg_client_hello.cpp
index 23807215f..69f9a5e11 100644
--- a/src/lib/tls/msg_client_hello.cpp
+++ b/src/lib/tls/msg_client_hello.cpp
@@ -1,6 +1,7 @@
/*
* TLS Hello Request and Client Hello Messages
* (C) 2004-2011,2015,2016 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -68,22 +69,20 @@ std::vector<byte> Hello_Request::serialize() const
*/
Client_Hello::Client_Hello(Handshake_IO& io,
Handshake_Hash& hash,
- Protocol_Version version,
const Policy& policy,
RandomNumberGenerator& rng,
const std::vector<byte>& reneg_info,
- const std::vector<std::string>& next_protocols,
- const std::string& hostname,
- const std::string& srp_identifier) :
- m_version(version),
+ const Client_Hello::Settings& client_settings,
+ const std::vector<std::string>& next_protocols) :
+ m_version(client_settings.protocol_version()),
m_random(make_hello_random(rng, policy)),
- m_suites(policy.ciphersuite_list(m_version, (srp_identifier != ""))),
+ m_suites(policy.ciphersuite_list(m_version,
+ client_settings.srp_identifier() != "")),
m_comp_methods(policy.compression())
{
m_extensions.add(new Extended_Master_Secret);
m_extensions.add(new Renegotiation_Extension(reneg_info));
-
- m_extensions.add(new Server_Name_Indicator(hostname));
+ m_extensions.add(new Server_Name_Indicator(client_settings.hostname()));
m_extensions.add(new Session_Ticket());
m_extensions.add(new Supported_Elliptic_Curves(policy.allowed_ecc_curves()));
@@ -96,20 +95,23 @@ Client_Hello::Client_Hello(Handshake_IO& io,
if(reneg_info.empty() && !next_protocols.empty())
m_extensions.add(new Application_Layer_Protocol_Notification(next_protocols));
+
+ if(policy.negotiate_encrypt_then_mac())
+ m_extensions.add(new Encrypt_then_MAC);
#if defined(BOTAN_HAS_SRP6)
- m_extensions.add(new SRP_Identifier(srp_identifier));
+ m_extensions.add(new SRP_Identifier(client_settings.srp_identifier()));
#else
- if(!srp_identifier.empty())
+ if(!client_settings.srp_identifier().empty())
{
throw Invalid_State("Attempting to initiate SRP session but TLS-SRP support disabled");
}
#endif
- BOTAN_ASSERT(policy.acceptable_protocol_version(version),
+ BOTAN_ASSERT(policy.acceptable_protocol_version(client_settings.protocol_version()),
"Our policy accepts the version we are offering");
- if(policy.send_fallback_scsv(version))
+ if(policy.send_fallback_scsv(client_settings.protocol_version()))
m_suites.push_back(TLS_FALLBACK_SCSV);
hash.update(io.send(*this));
@@ -155,6 +157,9 @@ Client_Hello::Client_Hello(Handshake_IO& io,
if(reneg_info.empty() && !next_protocols.empty())
m_extensions.add(new Application_Layer_Protocol_Notification(next_protocols));
+
+ if(policy.negotiate_encrypt_then_mac())
+ m_extensions.add(new Encrypt_then_MAC);
#if defined(BOTAN_HAS_SRP6)
m_extensions.add(new SRP_Identifier(session.srp_identifier()));
diff --git a/src/lib/tls/msg_client_kex.cpp b/src/lib/tls/msg_client_kex.cpp
index 77e9795f4..bc4d33d52 100644
--- a/src/lib/tls/msg_client_kex.cpp
+++ b/src/lib/tls/msg_client_kex.cpp
@@ -92,13 +92,6 @@ Client_Key_Exchange::Client_Key_Exchange(Handshake_IO& io,
if(reader.remaining_bytes())
throw Decoding_Error("Bad params size for DH key exchange");
- if(p.bits() < policy.minimum_dh_group_size())
- throw TLS_Exception(Alert::INSUFFICIENT_SECURITY,
- "Server sent DH group of " +
- std::to_string(p.bits()) +
- " bits, policy requires at least " +
- std::to_string(policy.minimum_dh_group_size()));
-
/*
* A basic check for key validity. As we do not know q here we
* cannot check that Y is in the right subgroup. However since
@@ -117,6 +110,8 @@ Client_Key_Exchange::Client_Key_Exchange(Handshake_IO& io,
DH_PublicKey counterparty_key(group, Y);
+ policy.check_peer_key_acceptable(counterparty_key);
+
DH_PrivateKey priv_key(rng, group);
PK_Key_Agreement ka(priv_key, "Raw");
@@ -160,6 +155,8 @@ Client_Key_Exchange::Client_Key_Exchange(Handshake_IO& io,
ECDH_PublicKey counterparty_key(group, OS2ECP(ecdh_key, group.get_curve()));
+ policy.check_peer_key_acceptable(counterparty_key);
+
ECDH_PrivateKey priv_key(rng, group);
PK_Key_Agreement ka(priv_key, "Raw");
diff --git a/src/lib/tls/msg_server_hello.cpp b/src/lib/tls/msg_server_hello.cpp
index f8d0c63c7..ebe8fb085 100644
--- a/src/lib/tls/msg_server_hello.cpp
+++ b/src/lib/tls/msg_server_hello.cpp
@@ -1,6 +1,7 @@
/*
* TLS Server Hello and Server Hello Done
* (C) 2004-2011,2015,2016 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -23,25 +24,28 @@ Server_Hello::Server_Hello(Handshake_IO& io,
RandomNumberGenerator& rng,
const std::vector<byte>& reneg_info,
const Client_Hello& client_hello,
- const std::vector<byte>& new_session_id,
- Protocol_Version new_session_version,
- u16bit ciphersuite,
- byte compression,
- bool offer_session_ticket,
- const std::string& next_protocol) :
- m_version(new_session_version),
- m_session_id(new_session_id),
+ const Server_Hello::Settings& server_settings,
+ const std::string next_protocol) :
+ m_version(server_settings.protocol_version()),
+ m_session_id(server_settings.session_id()),
m_random(make_hello_random(rng, policy)),
- m_ciphersuite(ciphersuite),
- m_comp_method(compression)
+ m_ciphersuite(server_settings.ciphersuite()),
+ m_comp_method(server_settings.compression())
{
if(client_hello.supports_extended_master_secret())
m_extensions.add(new Extended_Master_Secret);
+ if(client_hello.supports_encrypt_then_mac() && policy.negotiate_encrypt_then_mac())
+ {
+ Ciphersuite c = Ciphersuite::by_id(m_ciphersuite);
+ if(c.cbc_ciphersuite())
+ m_extensions.add(new Encrypt_then_MAC);
+ }
+
if(client_hello.secure_renegotiation())
m_extensions.add(new Renegotiation_Extension(reneg_info));
- if(client_hello.supports_session_ticket() && offer_session_ticket)
+ if(client_hello.supports_session_ticket() && server_settings.offer_session_ticket())
m_extensions.add(new Session_Ticket());
if(!next_protocol.empty() && client_hello.supports_alpn())
@@ -90,6 +94,13 @@ Server_Hello::Server_Hello(Handshake_IO& io,
if(client_hello.supports_extended_master_secret())
m_extensions.add(new Extended_Master_Secret);
+ if(client_hello.supports_encrypt_then_mac() && policy.negotiate_encrypt_then_mac())
+ {
+ Ciphersuite c = resumed_session.ciphersuite();
+ if(c.cbc_ciphersuite())
+ m_extensions.add(new Encrypt_then_MAC);
+ }
+
if(client_hello.secure_renegotiation())
m_extensions.add(new Renegotiation_Extension(reneg_info));
diff --git a/src/lib/tls/msg_server_kex.cpp b/src/lib/tls/msg_server_kex.cpp
index 98e3ad1f0..10581fe45 100644
--- a/src/lib/tls/msg_server_kex.cpp
+++ b/src/lib/tls/msg_server_kex.cpp
@@ -236,6 +236,8 @@ bool Server_Key_Exchange::verify(const Public_Key& server_key,
const Handshake_State& state,
const Policy& policy) const
{
+ policy.check_peer_key_acceptable(server_key);
+
std::pair<std::string, Signature_Format> format =
state.parse_sig_format(server_key, m_hash_algo, m_sig_algo,
false, policy);
diff --git a/src/lib/tls/tls_blocking.cpp b/src/lib/tls/tls_blocking.cpp
index a1867b6b5..9408972fd 100644
--- a/src/lib/tls/tls_blocking.cpp
+++ b/src/lib/tls/tls_blocking.cpp
@@ -1,6 +1,7 @@
/*
* TLS Blocking API
* (C) 2013 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -23,10 +24,13 @@ Blocking_Client::Blocking_Client(read_fn reader,
const Protocol_Version& offer_version,
const std::vector<std::string>& next) :
m_read(reader),
- m_channel(writer,
- std::bind(&Blocking_Client::data_cb, this, _1, _2),
- std::bind(&Blocking_Client::alert_cb, this, _1, _2, _3),
- std::bind(&Blocking_Client::handshake_cb, this, _1),
+ m_callbacks(new TLS::Compat_Callbacks(
+ writer,
+ std::bind(&Blocking_Client::data_cb, this, _1, _2),
+ std::function<void (Alert)>(std::bind(&Blocking_Client::alert_cb, this, _1)),
+ std::bind(&Blocking_Client::handshake_cb, this, _1)
+ )),
+ m_channel(*m_callbacks.get(),
session_manager,
creds,
policy,
@@ -42,7 +46,7 @@ bool Blocking_Client::handshake_cb(const Session& session)
return this->handshake_complete(session);
}
-void Blocking_Client::alert_cb(const Alert& alert, const byte[], size_t)
+void Blocking_Client::alert_cb(const Alert& alert)
{
this->alert_notification(alert);
}
diff --git a/src/lib/tls/tls_blocking.h b/src/lib/tls/tls_blocking.h
index 00e65cbaf..0f2986710 100644
--- a/src/lib/tls/tls_blocking.h
+++ b/src/lib/tls/tls_blocking.h
@@ -1,6 +1,7 @@
/*
* TLS Blocking API
* (C) 2013 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -32,6 +33,7 @@ class BOTAN_DLL Blocking_Client
typedef std::function<size_t (byte[], size_t)> read_fn;
typedef std::function<void (const byte[], size_t)> write_fn;
+ BOTAN_DEPRECATED("Use the regular TLS::Client interface")
Blocking_Client(read_fn reader,
write_fn writer,
Session_Manager& session_manager,
@@ -89,9 +91,10 @@ class BOTAN_DLL Blocking_Client
void data_cb(const byte data[], size_t data_len);
- void alert_cb(const Alert& alert, const byte data[], size_t data_len);
+ void alert_cb(const Alert& alert);
read_fn m_read;
+ std::unique_ptr<Compat_Callbacks> m_callbacks;
TLS::Client m_channel;
secure_vector<byte> m_plaintext;
};
diff --git a/src/lib/tls/tls_callbacks.h b/src/lib/tls/tls_callbacks.h
new file mode 100644
index 000000000..75887c23f
--- /dev/null
+++ b/src/lib/tls/tls_callbacks.h
@@ -0,0 +1,203 @@
+/*
+* TLS Callbacks
+* (C) 2016 Matthias Gierlings
+* 2016 Jack Lloyd
+*
+* Botan is released under the Simplified BSD License (see license.txt)
+*/
+
+#ifndef BOTAN_TLS_CALLBACKS_H__
+#define BOTAN_TLS_CALLBACKS_H__
+
+#include <botan/tls_session.h>
+#include <botan/tls_alert.h>
+namespace Botan {
+
+namespace TLS {
+
+class Handshake_Message;
+
+/**
+* Encapsulates the callbacks that a TLS channel will make which are due to
+* channel specific operations.
+*/
+class BOTAN_DLL Callbacks
+ {
+ public:
+ virtual ~Callbacks();
+
+ /**
+ * Mandatory callback: output function
+ * The channel will call this with data which needs to be sent to the peer
+ * (eg, over a socket or some other form of IPC). The array will be overwritten
+ * when the function returns so a copy must be made if the data cannot be
+ * sent immediately.
+ *
+ * @param data the vector of data to send
+ *
+ * @param size the number of bytes to send
+ */
+ virtual void tls_emit_data(const uint8_t data[], size_t size) = 0;
+
+ /**
+ * Mandatory callback: process application data
+ * Called when application data record is received from the peer.
+ * Again the array is overwritten immediately after the function returns.
+ *
+ * @param seq_no the underlying TLS/DTLS record sequence number
+ *
+ * @param data the vector containing the received record
+ *
+ * @param size the length of the received record, in bytes
+ */
+ virtual void tls_record_received(u64bit seq_no, const uint8_t data[], size_t size) = 0;
+
+ /**
+ * Mandary callback: alert received
+ * Called when an alert is received from the peer
+ * If fatal, the connection is closing. If not fatal, the connection may
+ * still be closing (depending on the error and the peer).
+ *
+ * @param alert the source of the alert
+ */
+ virtual void tls_alert(Alert alert) = 0;
+
+ /**
+ * Mandatory callback: session established
+ * Called when a session is established. Throw an exception to abort
+ * the connection.
+ *
+ * @param session the session descriptor
+ *
+ * @return return false to prevent the session from being cached,
+ * return true to cache the session in the configured session manager
+ */
+ virtual bool tls_session_established(const Session& session) = 0;
+
+ /**
+ * Optional callback: inspect handshake message
+ * Throw an exception to abort the handshake.
+ * Default simply ignores the message.
+ *
+ * @param message the handshake message
+ */
+ virtual void tls_inspect_handshake_msg(const Handshake_Message& message);
+
+ /**
+ * Optional callback for server: choose ALPN protocol
+ * ALPN (RFC 7301) works by the client sending a list of application
+ * protocols it is willing to negotiate. The server then selects which
+ * protocol to use, which is not necessarily even on the list that
+ * the client sent.
+ *
+ * @param client_protos the vector of protocols the client is willing to negotiate
+ *
+ * @return the protocol selected by the server, which need not be on the
+ * list that the client sent; if this is the empty string, the server ignores the
+ * client ALPN extension. Default return value is empty string.
+ */
+ virtual std::string tls_server_choose_app_protocol(const std::vector<std::string>& client_protos);
+
+ /**
+ * Optional callback: debug logging. (not currently used)
+ */
+ virtual bool tls_log_debug(const char*) { return false; }
+ };
+
+/**
+* TLS::Callbacks using std::function for compatability with the old API signatures.
+* This type is only provided for backward compatibility.
+* New implementations should derive from TLS::Callbacks instead.
+*/
+class BOTAN_DLL Compat_Callbacks final : public Callbacks
+ {
+ public:
+ typedef std::function<void (const byte[], size_t)> output_fn;
+ typedef std::function<void (const byte[], size_t)> data_cb;
+ typedef std::function<void (Alert, const byte[], size_t)> alert_cb;
+ typedef std::function<bool (const Session&)> handshake_cb;
+ typedef std::function<void (const Handshake_Message&)> handshake_msg_cb;
+ typedef std::function<std::string (std::vector<std::string>)> next_protocol_fn;
+
+ /**
+ * @param output_fn is called with data for the outbound socket
+ *
+ * @param app_data_cb is called when new application data is received
+ *
+ * @param alert_cb is called when a TLS alert is received
+ *
+ * @param handshake_cb is called when a handshake is completed
+ */
+ BOTAN_DEPRECATED("Use TLS::Callbacks (virtual interface).")
+ Compat_Callbacks(output_fn out, data_cb app_data_cb, alert_cb alert_cb,
+ handshake_cb hs_cb, handshake_msg_cb hs_msg_cb = nullptr,
+ next_protocol_fn next_proto = nullptr)
+ : m_output_function(out), m_app_data_cb(app_data_cb),
+ m_alert_cb(std::bind(alert_cb, std::placeholders::_1, nullptr, 0)),
+ m_hs_cb(hs_cb), m_hs_msg_cb(hs_msg_cb), m_next_proto(next_proto) {}
+
+ BOTAN_DEPRECATED("Use TLS::Callbacks (virtual interface).")
+ Compat_Callbacks(output_fn out, data_cb app_data_cb,
+ std::function<void (Alert)> alert_cb,
+ handshake_cb hs_cb,
+ handshake_msg_cb hs_msg_cb = nullptr,
+ next_protocol_fn next_proto = nullptr)
+ : m_output_function(out), m_app_data_cb(app_data_cb),
+ m_alert_cb(alert_cb),
+ m_hs_cb(hs_cb), m_hs_msg_cb(hs_msg_cb), m_next_proto(next_proto) {}
+
+ void tls_emit_data(const byte data[], size_t size) override
+ {
+ BOTAN_ASSERT(m_output_function != nullptr,
+ "Invalid TLS output function callback.");
+ m_output_function(data, size);
+ }
+
+ void tls_record_received(u64bit /*seq_no*/, const byte data[], size_t size) override
+ {
+ BOTAN_ASSERT(m_app_data_cb != nullptr,
+ "Invalid TLS app data callback.");
+ m_app_data_cb(data, size);
+ }
+
+ void tls_alert(Alert alert) override
+ {
+ BOTAN_ASSERT(m_alert_cb != nullptr,
+ "Invalid TLS alert callback.");
+ m_alert_cb(alert);
+ }
+
+ bool tls_session_established(const Session& session) override
+ {
+ BOTAN_ASSERT(m_hs_cb != nullptr,
+ "Invalid TLS handshake callback.");
+ return m_hs_cb(session);
+ }
+
+ std::string tls_server_choose_app_protocol(const std::vector<std::string>& client_protos) override
+ {
+ if(m_next_proto != nullptr) { return m_next_proto(client_protos); }
+ return "";
+ }
+
+ void tls_inspect_handshake_msg(const Handshake_Message& hmsg) override
+ {
+ // The handshake message callback is optional so we can
+ // not assume it has been set.
+ if(m_hs_msg_cb != nullptr) { m_hs_msg_cb(hmsg); }
+ }
+
+ private:
+ const output_fn m_output_function;
+ const data_cb m_app_data_cb;
+ const std::function<void (Alert)> m_alert_cb;
+ const handshake_cb m_hs_cb;
+ const handshake_msg_cb m_hs_msg_cb;
+ const next_protocol_fn m_next_proto;
+ };
+
+}
+
+}
+
+#endif
diff --git a/src/lib/tls/tls_channel.cpp b/src/lib/tls/tls_channel.cpp
index f445eef99..5e9207da7 100644
--- a/src/lib/tls/tls_channel.cpp
+++ b/src/lib/tls/tls_channel.cpp
@@ -1,6 +1,7 @@
/*
* TLS Channels
-* (C) 2011,2012,2014,2015 Jack Lloyd
+* (C) 2011,2012,2014,2015,2016 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -18,32 +19,63 @@ namespace Botan {
namespace TLS {
-Channel::Channel(output_fn output_fn,
- data_cb data_cb,
- alert_cb alert_cb,
- handshake_cb handshake_cb,
- handshake_msg_cb handshake_msg_cb,
+Callbacks::~Callbacks() {}
+
+void Callbacks::tls_inspect_handshake_msg(const Handshake_Message&)
+ {
+ // default is no op
+ }
+
+std::string Callbacks::tls_server_choose_app_protocol(const std::vector<std::string>&)
+ {
+ return "";
+ }
+
+size_t TLS::Channel::IO_BUF_DEFAULT_SIZE = 10*1024;
+
+Channel::Channel(Callbacks& callbacks,
Session_Manager& session_manager,
RandomNumberGenerator& rng,
const Policy& policy,
bool is_datagram,
size_t reserved_io_buffer_size) :
m_is_datagram(is_datagram),
- m_data_cb(data_cb),
- m_alert_cb(alert_cb),
- m_output_fn(output_fn),
- m_handshake_cb(handshake_cb),
- m_handshake_msg_cb(handshake_msg_cb),
+ m_callbacks(callbacks),
m_session_manager(session_manager),
m_policy(policy),
m_rng(rng)
{
+ init(reserved_io_buffer_size);
+ }
+
+Channel::Channel(output_fn out,
+ data_cb app_data_cb,
+ alert_cb alert_cb,
+ handshake_cb hs_cb,
+ handshake_msg_cb hs_msg_cb,
+ Session_Manager& session_manager,
+ RandomNumberGenerator& rng,
+ const Policy& policy,
+ bool is_datagram,
+ size_t io_buf_sz) :
+ m_is_datagram(is_datagram),
+ m_compat_callbacks(new Compat_Callbacks(out, app_data_cb, alert_cb, hs_cb, hs_msg_cb)),
+ m_callbacks(*m_compat_callbacks.get()),
+ m_session_manager(session_manager),
+ m_policy(policy),
+ m_rng(rng)
+ {
+ init(io_buf_sz);
+ }
+
+void Channel::init(size_t io_buf_sz)
+ {
/* epoch 0 is plaintext, thus null cipher state */
m_write_cipher_states[0] = nullptr;
m_read_cipher_states[0] = nullptr;
- m_writebuf.reserve(reserved_io_buffer_size);
- m_readbuf.reserve(reserved_io_buffer_size);
+ m_writebuf.reserve(io_buf_sz);
+ m_readbuf.reserve(io_buf_sz);
}
void Channel::reset_state()
@@ -183,7 +215,8 @@ void Channel::change_cipher_spec_reader(Connection_Side side)
(side == CLIENT) ? SERVER : CLIENT,
false,
pending->ciphersuite(),
- pending->session_keys()));
+ pending->session_keys(),
+ pending->server_hello()->supports_encrypt_then_mac()));
m_read_cipher_states[epoch] = read_state;
}
@@ -210,7 +243,8 @@ void Channel::change_cipher_spec_writer(Connection_Side side)
side,
true,
pending->ciphersuite(),
- pending->session_keys()));
+ pending->session_keys(),
+ pending->server_hello()->supports_encrypt_then_mac()));
m_write_cipher_states[epoch] = write_state;
}
@@ -263,23 +297,19 @@ size_t Channel::received_data(const byte input[], size_t input_size)
{
while(!is_closed() && input_size)
{
- secure_vector<byte> record;
+ secure_vector<byte> record_data;
u64bit record_sequence = 0;
Record_Type record_type = NO_RECORD;
Protocol_Version record_version;
size_t consumed = 0;
+ Record_Raw_Input raw_input(input, input_size, consumed, m_is_datagram);
+ Record record(record_data, &record_sequence, &record_version, &record_type);
const size_t needed =
read_record(m_readbuf,
- input,
- input_size,
- m_is_datagram,
- consumed,
+ raw_input,
record,
- &record_sequence,
- &record_version,
- &record_type,
m_sequence_numbers.get(),
std::bind(&TLS::Channel::read_cipher_state_epoch, this,
std::placeholders::_1));
@@ -298,105 +328,21 @@ size_t Channel::received_data(const byte input[], size_t input_size)
if(input_size == 0 && needed != 0)
return needed; // need more data to complete record
- if(record.size() > MAX_PLAINTEXT_SIZE)
+ if(record_data.size() > MAX_PLAINTEXT_SIZE)
throw TLS_Exception(Alert::RECORD_OVERFLOW,
"TLS plaintext record is larger than allowed maximum");
if(record_type == HANDSHAKE || record_type == CHANGE_CIPHER_SPEC)
{
- if(!m_pending_state)
- {
- // No pending handshake, possibly new:
- if(record_version.is_datagram_protocol())
- {
- if(m_sequence_numbers)
- {
- /*
- * Might be a peer retransmit under epoch - 1 in which
- * case we must retransmit last flight
- */
- sequence_numbers().read_accept(record_sequence);
-
- const u16bit epoch = record_sequence >> 48;
-
- if(epoch == sequence_numbers().current_read_epoch())
- {
- create_handshake_state(record_version);
- }
- else if(epoch == sequence_numbers().current_read_epoch() - 1)
- {
- BOTAN_ASSERT(m_active_state, "Have active state here");
- m_active_state->handshake_io().add_record(unlock(record),
- record_type,
- record_sequence);
- }
- }
- else if(record_sequence == 0)
- {
- create_handshake_state(record_version);
- }
- }
- else
- {
- create_handshake_state(record_version);
- }
- }
-
- // May have been created in above conditional
- if(m_pending_state)
- {
- m_pending_state->handshake_io().add_record(unlock(record),
- record_type,
- record_sequence);
-
- while(auto pending = m_pending_state.get())
- {
- auto msg = pending->get_next_handshake_msg();
-
- if(msg.first == HANDSHAKE_NONE) // no full handshake yet
- break;
-
- process_handshake_msg(active_state(), *pending,
- msg.first, msg.second);
- }
- }
+ process_handshake_ccs(record_data, record_sequence, record_type, record_version);
}
else if(record_type == APPLICATION_DATA)
{
- if(!active_state())
- throw Unexpected_Message("Application data before handshake done");
-
- /*
- * OpenSSL among others sends empty records in versions
- * before TLS v1.1 in order to randomize the IV of the
- * following record. Avoid spurious callbacks.
- */
- if(record.size() > 0)
- m_data_cb(record.data(), record.size());
+ process_application_data(record_sequence, record_data);
}
else if(record_type == ALERT)
{
- Alert alert_msg(record);
-
- if(alert_msg.type() == Alert::NO_RENEGOTIATION)
- m_pending_state.reset();
-
- m_alert_cb(alert_msg, nullptr, 0);
-
- if(alert_msg.is_fatal())
- {
- if(auto active = active_state())
- m_session_manager.remove_entry(active->server_hello()->session_id());
- }
-
- if(alert_msg.type() == Alert::CLOSE_NOTIFY)
- send_warning_alert(Alert::CLOSE_NOTIFY); // reply in kind
-
- if(alert_msg.type() == Alert::CLOSE_NOTIFY || alert_msg.is_fatal())
- {
- reset_state();
- return 0;
- }
+ process_alert(record_data);
}
else if(record_type != NO_RECORD)
throw Unexpected_Message("Unexpected record type " +
@@ -428,6 +374,108 @@ size_t Channel::received_data(const byte input[], size_t input_size)
}
}
+void Channel::process_handshake_ccs(const secure_vector<byte>& record,
+ u64bit record_sequence,
+ Record_Type record_type,
+ Protocol_Version record_version)
+ {
+ if(!m_pending_state)
+ {
+ // No pending handshake, possibly new:
+ if(record_version.is_datagram_protocol())
+ {
+ if(m_sequence_numbers)
+ {
+ /*
+ * Might be a peer retransmit under epoch - 1 in which
+ * case we must retransmit last flight
+ */
+ sequence_numbers().read_accept(record_sequence);
+
+ const u16bit epoch = record_sequence >> 48;
+
+ if(epoch == sequence_numbers().current_read_epoch())
+ {
+ create_handshake_state(record_version);
+ }
+ else if(epoch == sequence_numbers().current_read_epoch() - 1)
+ {
+ BOTAN_ASSERT(m_active_state, "Have active state here");
+ m_active_state->handshake_io().add_record(unlock(record),
+ record_type,
+ record_sequence);
+ }
+ }
+ else if(record_sequence == 0)
+ {
+ create_handshake_state(record_version);
+ }
+ }
+ else
+ {
+ create_handshake_state(record_version);
+ }
+ }
+
+ // May have been created in above conditional
+ if(m_pending_state)
+ {
+ m_pending_state->handshake_io().add_record(unlock(record),
+ record_type,
+ record_sequence);
+
+ while(auto pending = m_pending_state.get())
+ {
+ auto msg = pending->get_next_handshake_msg();
+
+ if(msg.first == HANDSHAKE_NONE) // no full handshake yet
+ break;
+
+ process_handshake_msg(active_state(), *pending,
+ msg.first, msg.second);
+ }
+ }
+ }
+
+void Channel::process_application_data(u64bit seq_no, const secure_vector<byte>& record)
+ {
+ if(!active_state())
+ throw Unexpected_Message("Application data before handshake done");
+
+ /*
+ * OpenSSL among others sends empty records in versions
+ * before TLS v1.1 in order to randomize the IV of the
+ * following record. Avoid spurious callbacks.
+ */
+ if(record.size() > 0)
+ callbacks().tls_record_received(seq_no, record.data(), record.size());
+ }
+
+void Channel::process_alert(const secure_vector<byte>& record)
+ {
+ Alert alert_msg(record);
+
+ if(alert_msg.type() == Alert::NO_RENEGOTIATION)
+ m_pending_state.reset();
+
+ callbacks().tls_alert(alert_msg);
+
+ if(alert_msg.is_fatal())
+ {
+ if(auto active = active_state())
+ m_session_manager.remove_entry(active->server_hello()->session_id());
+ }
+
+ if(alert_msg.type() == Alert::CLOSE_NOTIFY)
+ send_warning_alert(Alert::CLOSE_NOTIFY); // reply in kind
+
+ if(alert_msg.type() == Alert::CLOSE_NOTIFY || alert_msg.is_fatal())
+ {
+ reset_state();
+ }
+ }
+
+
void Channel::write_record(Connection_Cipher_State* cipher_state, u16bit epoch,
byte record_type, const byte input[], size_t length)
{
@@ -436,16 +484,16 @@ void Channel::write_record(Connection_Cipher_State* cipher_state, u16bit epoch,
Protocol_Version record_version =
(m_pending_state) ? (m_pending_state->version()) : (m_active_state->version());
+ Record_Message record_message(record_type, 0, input, length);
+
TLS::write_record(m_writebuf,
- record_type,
- input,
- length,
+ record_message,
record_version,
sequence_numbers().next_write_sequence(epoch),
cipher_state,
m_rng);
- m_output_fn(m_writebuf.data(), m_writebuf.size());
+ callbacks().tls_emit_data(m_writebuf.data(), m_writebuf.size());
}
void Channel::send_record_array(u16bit epoch, byte type, const byte input[], size_t length)
diff --git a/src/lib/tls/tls_channel.h b/src/lib/tls/tls_channel.h
index e0219c242..073af760f 100644
--- a/src/lib/tls/tls_channel.h
+++ b/src/lib/tls/tls_channel.h
@@ -1,6 +1,7 @@
/*
* TLS Channel
* (C) 2011,2012,2014,2015 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -12,6 +13,7 @@
#include <botan/tls_session.h>
#include <botan/tls_alert.h>
#include <botan/tls_session_manager.h>
+#include <botan/tls_callbacks.h>
#include <botan/x509cert.h>
#include <vector>
#include <string>
@@ -37,7 +39,20 @@ class BOTAN_DLL Channel
typedef std::function<void (Alert, const byte[], size_t)> alert_cb;
typedef std::function<bool (const Session&)> handshake_cb;
typedef std::function<void (const Handshake_Message&)> handshake_msg_cb;
+ static size_t IO_BUF_DEFAULT_SIZE;
+ Channel(Callbacks& callbacks,
+ Session_Manager& session_manager,
+ RandomNumberGenerator& rng,
+ const Policy& policy,
+ bool is_datagram,
+ size_t io_buf_sz = IO_BUF_DEFAULT_SIZE);
+
+ /**
+ * DEPRECATED. This constructor is only provided for backward
+ * compatibility and should not be used in new implementations.
+ */
+ BOTAN_DEPRECATED("Use TLS::Channel(TLS::Callbacks ...)")
Channel(output_fn out,
data_cb app_data_cb,
alert_cb alert_cb,
@@ -47,7 +62,7 @@ class BOTAN_DLL Channel
RandomNumberGenerator& rng,
const Policy& policy,
bool is_datagram,
- size_t io_buf_sz = 16*1024);
+ size_t io_buf_sz = IO_BUF_DEFAULT_SIZE);
Channel(const Channel&) = delete;
@@ -200,10 +215,12 @@ class BOTAN_DLL Channel
const Policy& policy() const { return m_policy; }
- bool save_session(const Session& session) const { return m_handshake_cb(session); }
+ bool save_session(const Session& session) const { return callbacks().tls_session_established(session); }
- handshake_msg_cb get_handshake_msg_cb() const { return m_handshake_msg_cb; }
+ Callbacks& callbacks() const { return m_callbacks; }
private:
+ void init(size_t io_buf_sze);
+
void send_record(byte record_type, const std::vector<byte>& record);
void send_record_under_epoch(u16bit epoch, byte record_type,
@@ -227,14 +244,21 @@ class BOTAN_DLL Channel
const Handshake_State* pending_state() const { return m_pending_state.get(); }
+ /* methods to handle incoming traffic through Channel::receive_data. */
+ void process_handshake_ccs(const secure_vector<byte>& record,
+ u64bit record_sequence,
+ Record_Type record_type,
+ Protocol_Version record_version);
+
+ void process_application_data(u64bit req_no, const secure_vector<byte>& record);
+
+ void process_alert(const secure_vector<byte>& record);
+
bool m_is_datagram;
/* callbacks */
- data_cb m_data_cb;
- alert_cb m_alert_cb;
- output_fn m_output_fn;
- handshake_cb m_handshake_cb;
- handshake_msg_cb m_handshake_msg_cb;
+ std::unique_ptr<Compat_Callbacks> m_compat_callbacks;
+ Callbacks& m_callbacks;
/* external state */
Session_Manager& m_session_manager;
diff --git a/src/lib/tls/tls_ciphersuite.cpp b/src/lib/tls/tls_ciphersuite.cpp
index dc0c71278..9a52e0e0e 100644
--- a/src/lib/tls/tls_ciphersuite.cpp
+++ b/src/lib/tls/tls_ciphersuite.cpp
@@ -35,6 +35,13 @@ bool Ciphersuite::ecc_ciphersuite() const
return (sig_algo() == "ECDSA" || kex_algo() == "ECDH" || kex_algo() == "ECDHE_PSK");
}
+bool Ciphersuite::cbc_ciphersuite() const
+ {
+ return (cipher_algo() == "3DES" || cipher_algo() == "SEED" ||
+ cipher_algo() == "AES-128" || cipher_algo() == "AES-256" ||
+ cipher_algo() == "Camellia-128" || cipher_algo() == "Camellia-256");
+ }
+
Ciphersuite Ciphersuite::by_id(u16bit suite)
{
const std::vector<Ciphersuite>& all_suites = all_known_ciphersuites();
diff --git a/src/lib/tls/tls_ciphersuite.h b/src/lib/tls/tls_ciphersuite.h
index 199e126b1..6708e3ca6 100644
--- a/src/lib/tls/tls_ciphersuite.h
+++ b/src/lib/tls/tls_ciphersuite.h
@@ -63,6 +63,11 @@ class BOTAN_DLL Ciphersuite
bool ecc_ciphersuite() const;
/**
+ * @return true if this suite uses a CBC cipher
+ */
+ bool cbc_ciphersuite() const;
+
+ /**
* @return key exchange algorithm used by this ciphersuite
*/
std::string kex_algo() const { return m_kex_algo; }
diff --git a/src/lib/tls/tls_client.cpp b/src/lib/tls/tls_client.cpp
index 301c77c6b..0e72b9a28 100644
--- a/src/lib/tls/tls_client.cpp
+++ b/src/lib/tls/tls_client.cpp
@@ -1,6 +1,7 @@
/*
* TLS Client
* (C) 2004-2011,2012,2015,2016 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -23,7 +24,7 @@ class Client_Handshake_State : public Handshake_State
public:
// using Handshake_State::Handshake_State;
- Client_Handshake_State(Handshake_IO* io, handshake_msg_cb cb) : Handshake_State(io, cb) {}
+ Client_Handshake_State(Handshake_IO* io, Callbacks& cb) : Handshake_State(io, cb) {}
const Public_Key& get_server_public_Key() const
{
@@ -42,6 +43,23 @@ class Client_Handshake_State : public Handshake_State
/*
* TLS Client Constructor
*/
+Client::Client(Callbacks& callbacks,
+ Session_Manager& session_manager,
+ Credentials_Manager& creds,
+ const Policy& policy,
+ RandomNumberGenerator& rng,
+ const Server_Information& info,
+ const Protocol_Version& offer_version,
+ const std::vector<std::string>& next_protos,
+ size_t io_buf_sz) :
+ Channel(callbacks, session_manager, rng, policy, offer_version.is_datagram_protocol(),
+ io_buf_sz),
+ m_creds(creds),
+ m_info(info)
+ {
+ init(offer_version, next_protos);
+ }
+
Client::Client(output_fn output_fn,
data_cb proc_cb,
alert_cb alert_cb,
@@ -59,10 +77,7 @@ Client::Client(output_fn output_fn,
m_creds(creds),
m_info(info)
{
- const std::string srp_identifier = m_creds.srp_identifier("tls-client", m_info.hostname());
-
- Handshake_State& state = create_handshake_state(offer_version);
- send_client_hello(state, false, offer_version, srp_identifier, next_protos);
+ init(offer_version, next_protos);
}
Client::Client(output_fn output_fn,
@@ -82,15 +97,22 @@ Client::Client(output_fn output_fn,
m_creds(creds),
m_info(info)
{
+ init(offer_version, next_protos);
+ }
+
+void Client::init(const Protocol_Version& protocol_version,
+ const std::vector<std::string>& next_protocols)
+ {
const std::string srp_identifier = m_creds.srp_identifier("tls-client", m_info.hostname());
- Handshake_State& state = create_handshake_state(offer_version);
- send_client_hello(state, false, offer_version, srp_identifier, next_protos);
+ Handshake_State& state = create_handshake_state(protocol_version);
+ send_client_hello(state, false, protocol_version,
+ srp_identifier, next_protocols);
}
Handshake_State* Client::new_handshake_state(Handshake_IO* io)
{
- return new Client_Handshake_State(io, get_handshake_msg_cb());
+ return new Client_Handshake_State(io, callbacks());
}
std::vector<X509_Certificate>
@@ -145,16 +167,15 @@ void Client::send_client_hello(Handshake_State& state_base,
if(!state.client_hello()) // not resuming
{
+ Client_Hello::Settings client_settings(version, m_info.hostname(), srp_identifier);
state.client_hello(new Client_Hello(
state.handshake_io(),
state.hash(),
- version,
policy(),
rng(),
secure_renegotiation_data_for_client_hello(),
- next_protocols,
- m_info.hostname(),
- srp_identifier));
+ client_settings,
+ next_protocols));
}
secure_renegotiation_check(state.client_hello());
@@ -352,7 +373,7 @@ void Client::process_handshake_msg(const Handshake_State* active_state,
state.set_expected_next(SERVER_HELLO_DONE);
}
- state.server_certs(new Certificate(contents));
+ state.server_certs(new Certificate(contents, policy()));
const std::vector<X509_Certificate>& server_certs =
state.server_certs()->cert_chain();
@@ -419,11 +440,9 @@ void Client::process_handshake_msg(const Handshake_State* active_state,
"tls-client",
m_info.hostname());
- state.client_certs(
- new Certificate(state.handshake_io(),
- state.hash(),
- client_certs)
- );
+ state.client_certs(new Certificate(state.handshake_io(),
+ state.hash(),
+ client_certs));
}
state.client_kex(
@@ -510,6 +529,7 @@ void Client::process_handshake_msg(const Handshake_State* active_state,
state.server_hello()->compression_method(),
CLIENT,
state.server_hello()->supports_extended_master_secret(),
+ state.server_hello()->supports_encrypt_then_mac(),
get_peer_cert_chain(state),
session_ticket,
m_info,
diff --git a/src/lib/tls/tls_client.h b/src/lib/tls/tls_client.h
index 45a741878..09af053af 100644
--- a/src/lib/tls/tls_client.h
+++ b/src/lib/tls/tls_client.h
@@ -1,6 +1,7 @@
/*
* TLS Client
* (C) 2004-2011 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -22,9 +23,49 @@ namespace TLS {
class BOTAN_DLL Client final : public Channel
{
public:
+
/**
* Set up a new TLS client session
*
+ * @param callbacks contains a set of callback function references
+ * required by the TLS client.
+ *
+ * @param session_manager manages session state
+ *
+ * @param creds manages application/user credentials
+ *
+ * @param policy specifies other connection policy information
+ *
+ * @param rng a random number generator
+ *
+ * @param server_info is identifying information about the TLS server
+ *
+ * @param offer_version specifies which version we will offer
+ * to the TLS server.
+ *
+ * @param next_protocols specifies protocols to advertise with ALPN
+ *
+ * @param reserved_io_buffer_size This many bytes of memory will
+ * be preallocated for the read and write buffers. Smaller
+ * values just mean reallocations and copies are more likely.
+ */
+ Client(Callbacks& callbacks,
+ Session_Manager& session_manager,
+ Credentials_Manager& creds,
+ const Policy& policy,
+ RandomNumberGenerator& rng,
+ const Server_Information& server_info = Server_Information(),
+ const Protocol_Version& offer_version = Protocol_Version::latest_tls_version(),
+ const std::vector<std::string>& next_protocols = {},
+ size_t reserved_io_buffer_size = TLS::Client::IO_BUF_DEFAULT_SIZE
+ );
+
+ /**
+ * DEPRECATED. This constructor is only provided for backward
+ * compatibility and should not be used in new code.
+ *
+ * Set up a new TLS client session
+ *
* @param output_fn is called with data for the outbound socket
*
* @param app_data_cb is called when new application data is received
@@ -52,7 +93,7 @@ class BOTAN_DLL Client final : public Channel
* be preallocated for the read and write buffers. Smaller
* values just mean reallocations and copies are more likely.
*/
-
+ BOTAN_DEPRECATED("Use TLS::Client(TLS::Callbacks ...)")
Client(output_fn out,
data_cb app_data_cb,
alert_cb alert_cb,
@@ -64,9 +105,14 @@ class BOTAN_DLL Client final : public Channel
const Server_Information& server_info = Server_Information(),
const Protocol_Version& offer_version = Protocol_Version::latest_tls_version(),
const std::vector<std::string>& next_protocols = {},
- size_t reserved_io_buffer_size = 16*1024
+ size_t reserved_io_buffer_size = TLS::Client::IO_BUF_DEFAULT_SIZE
);
+ /**
+ * DEPRECATED. This constructor is only provided for backward
+ * compatibility and should not be used in new implementations.
+ */
+ BOTAN_DEPRECATED("Use TLS::Client(TLS::Callbacks ...)")
Client(output_fn out,
data_cb app_data_cb,
alert_cb alert_cb,
@@ -83,6 +129,9 @@ class BOTAN_DLL Client final : public Channel
const std::string& application_protocol() const { return m_application_protocol; }
private:
+ void init(const Protocol_Version& protocol_version,
+ const std::vector<std::string>& next_protocols);
+
std::vector<X509_Certificate>
get_peer_cert_chain(const Handshake_State& state) const override;
diff --git a/src/lib/tls/tls_extensions.cpp b/src/lib/tls/tls_extensions.cpp
index 3ea97203c..3dceb505a 100644
--- a/src/lib/tls/tls_extensions.cpp
+++ b/src/lib/tls/tls_extensions.cpp
@@ -1,6 +1,7 @@
/*
* TLS Extensions
* (C) 2011,2012,2015,2016 Jack Lloyd
+* 2016 Juraj Somorovsky
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -47,6 +48,9 @@ Extension* make_extension(TLS_Data_Reader& reader,
case TLSEXT_EXTENDED_MASTER_SECRET:
return new Extended_Master_Secret(reader, size);
+ case TLSEXT_ENCRYPT_THEN_MAC:
+ return new Encrypt_then_MAC(reader, size);
+
case TLSEXT_SESSION_TICKET:
return new Session_Ticket(reader, size);
@@ -519,6 +523,18 @@ std::vector<byte> Extended_Master_Secret::serialize() const
return std::vector<byte>();
}
+Encrypt_then_MAC::Encrypt_then_MAC(TLS_Data_Reader&,
+ u16bit extension_size)
+ {
+ if(extension_size != 0)
+ throw Decoding_Error("Invalid encrypt_then_mac extension");
+ }
+
+std::vector<byte> Encrypt_then_MAC::serialize() const
+ {
+ return std::vector<byte>();
+ }
+
}
}
diff --git a/src/lib/tls/tls_extensions.h b/src/lib/tls/tls_extensions.h
index a5aac0020..dc69eec36 100644
--- a/src/lib/tls/tls_extensions.h
+++ b/src/lib/tls/tls_extensions.h
@@ -1,6 +1,8 @@
/*
* TLS Extensions
* (C) 2011,2012,2016 Jack Lloyd
+* 2016 Juraj Somorovsky
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -34,9 +36,9 @@ enum Handshake_Extension_Type {
TLSEXT_SRP_IDENTIFIER = 12,
TLSEXT_SIGNATURE_ALGORITHMS = 13,
TLSEXT_USE_SRTP = 14,
- TLSEXT_HEARTBEAT_SUPPORT = 15,
TLSEXT_ALPN = 16,
+ TLSEXT_ENCRYPT_THEN_MAC = 22,
TLSEXT_EXTENDED_MASTER_SECRET = 23,
TLSEXT_SESSION_TICKET = 35,
@@ -341,6 +343,26 @@ class Extended_Master_Secret final : public Extension
};
/**
+* Encrypt-then-MAC Extension (RFC 7366)
+*/
+class Encrypt_then_MAC final : public Extension
+ {
+ public:
+ static Handshake_Extension_Type static_type()
+ { return TLSEXT_ENCRYPT_THEN_MAC; }
+
+ Handshake_Extension_Type type() const override { return static_type(); }
+
+ std::vector<byte> serialize() const override;
+
+ bool empty() const override { return false; }
+
+ Encrypt_then_MAC() {}
+
+ Encrypt_then_MAC(TLS_Data_Reader& reader, u16bit extension_size);
+ };
+
+/**
* Represents a block of extensions in a hello message
*/
class Extensions
diff --git a/src/lib/tls/tls_handshake_msg.h b/src/lib/tls/tls_handshake_msg.h
index 7e527abf4..618ae8d76 100644
--- a/src/lib/tls/tls_handshake_msg.h
+++ b/src/lib/tls/tls_handshake_msg.h
@@ -1,6 +1,7 @@
/*
* TLS Handshake Message
* (C) 2012 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -16,6 +17,9 @@ namespace Botan {
namespace TLS {
+class Handshake_IO;
+class Handshake_Hash;
+
/**
* TLS Handshake Message Base Class
*/
diff --git a/src/lib/tls/tls_handshake_state.cpp b/src/lib/tls/tls_handshake_state.cpp
index afc32ba87..71cacdabd 100644
--- a/src/lib/tls/tls_handshake_state.cpp
+++ b/src/lib/tls/tls_handshake_state.cpp
@@ -8,6 +8,7 @@
#include <botan/internal/tls_handshake_state.h>
#include <botan/internal/tls_messages.h>
#include <botan/internal/tls_record.h>
+#include <botan/tls_callbacks.h>
namespace Botan {
@@ -174,8 +175,8 @@ std::string handshake_mask_to_string(u32bit mask)
/*
* Initialize the SSL/TLS Handshake State
*/
-Handshake_State::Handshake_State(Handshake_IO* io, handshake_msg_cb cb) :
- m_msg_callback(cb),
+Handshake_State::Handshake_State(Handshake_IO* io, Callbacks& cb) :
+ m_callbacks(cb),
m_handshake_io(io),
m_version(m_handshake_io->initial_record_version())
{
@@ -183,6 +184,11 @@ Handshake_State::Handshake_State(Handshake_IO* io, handshake_msg_cb cb) :
Handshake_State::~Handshake_State() {}
+void Handshake_State::note_message(const Handshake_Message& msg)
+ {
+ m_callbacks.tls_inspect_handshake_msg(msg);
+ }
+
void Handshake_State::hello_verify_request(const Hello_Verify_Request& hello_verify)
{
note_message(hello_verify);
diff --git a/src/lib/tls/tls_handshake_state.h b/src/lib/tls/tls_handshake_state.h
index 2943a8637..bdec10d14 100644
--- a/src/lib/tls/tls_handshake_state.h
+++ b/src/lib/tls/tls_handshake_state.h
@@ -24,6 +24,7 @@ class KDF;
namespace TLS {
+class Callbacks;
class Policy;
class Hello_Verify_Request;
@@ -45,9 +46,7 @@ class Finished;
class Handshake_State
{
public:
- typedef std::function<void (const Handshake_Message&)> handshake_msg_cb;
-
- Handshake_State(Handshake_IO* io, handshake_msg_cb cb);
+ Handshake_State(Handshake_IO* io, Callbacks& callbacks);
virtual ~Handshake_State();
@@ -164,15 +163,10 @@ class Handshake_State
const Handshake_Hash& hash() const { return m_handshake_hash; }
- void note_message(const Handshake_Message& msg)
- {
- if(m_msg_callback)
- m_msg_callback(msg);
- }
-
+ void note_message(const Handshake_Message& msg);
private:
- handshake_msg_cb m_msg_callback;
+ Callbacks& m_callbacks;
std::unique_ptr<Handshake_IO> m_handshake_io;
diff --git a/src/lib/tls/tls_messages.h b/src/lib/tls/tls_messages.h
index 3bee89e13..8ccb2fbff 100644
--- a/src/lib/tls/tls_messages.h
+++ b/src/lib/tls/tls_messages.h
@@ -1,6 +1,7 @@
/*
* TLS Messages
* (C) 2004-2011,2015 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -61,6 +62,26 @@ class Hello_Verify_Request final : public Handshake_Message
class Client_Hello final : public Handshake_Message
{
public:
+ class Settings
+ {
+ public:
+ Settings(const Protocol_Version version,
+ const std::string& hostname = "",
+ const std::string& srp_identifier = "")
+ : m_new_session_version(version),
+ m_hostname(hostname),
+ m_srp_identifier(srp_identifier) {};
+
+ const Protocol_Version protocol_version() const { return m_new_session_version; };
+ const std::string& hostname() const { return m_hostname; };
+ const std::string& srp_identifier() const { return m_srp_identifier; }
+
+ private:
+ const Protocol_Version m_new_session_version;
+ const std::string m_hostname;
+ const std::string m_srp_identifier;
+ };
+
Handshake_Type type() const override { return CLIENT_HELLO; }
Protocol_Version version() const { return m_version; }
@@ -141,6 +162,11 @@ class Client_Hello final : public Handshake_Message
return m_extensions.has<Extended_Master_Secret>();
}
+ bool supports_encrypt_then_mac() const
+ {
+ return m_extensions.has<Encrypt_then_MAC>();
+ }
+
std::vector<std::string> next_protocols() const
{
if(auto alpn = m_extensions.get<Application_Layer_Protocol_Notification>())
@@ -162,13 +188,11 @@ class Client_Hello final : public Handshake_Message
Client_Hello(Handshake_IO& io,
Handshake_Hash& hash,
- Protocol_Version version,
const Policy& policy,
RandomNumberGenerator& rng,
const std::vector<byte>& reneg_info,
- const std::vector<std::string>& next_protocols,
- const std::string& hostname = "",
- const std::string& srp_identifier = "");
+ const Client_Hello::Settings& client_settings,
+ const std::vector<std::string>& next_protocols);
Client_Hello(Handshake_IO& io,
Handshake_Hash& hash,
@@ -199,6 +223,35 @@ class Client_Hello final : public Handshake_Message
class Server_Hello final : public Handshake_Message
{
public:
+ class Settings
+ {
+ public:
+ Settings(const std::vector<byte> new_session_id,
+ Protocol_Version new_session_version,
+ u16bit ciphersuite,
+ byte compression,
+ bool offer_session_ticket)
+ : m_new_session_id(new_session_id),
+ m_new_session_version(new_session_version),
+ m_ciphersuite(ciphersuite),
+ m_compression(compression),
+ m_offer_session_ticket(offer_session_ticket) {};
+
+ const std::vector<byte>& session_id() const { return m_new_session_id; };
+ Protocol_Version protocol_version() const { return m_new_session_version; };
+ u16bit ciphersuite() const { return m_ciphersuite; };
+ byte compression() const { return m_compression; }
+ bool offer_session_ticket() const { return m_offer_session_ticket; }
+
+ private:
+ const std::vector<byte> m_new_session_id;
+ Protocol_Version m_new_session_version;
+ u16bit m_ciphersuite;
+ byte m_compression;
+ bool m_offer_session_ticket;
+ };
+
+
Handshake_Type type() const override { return SERVER_HELLO; }
Protocol_Version version() const { return m_version; }
@@ -228,6 +281,11 @@ class Server_Hello final : public Handshake_Message
return m_extensions.has<Extended_Master_Secret>();
}
+ bool supports_encrypt_then_mac() const
+ {
+ return m_extensions.has<Encrypt_then_MAC>();
+ }
+
bool supports_session_ticket() const
{
return m_extensions.has<Session_Ticket>();
@@ -262,12 +320,8 @@ class Server_Hello final : public Handshake_Message
RandomNumberGenerator& rng,
const std::vector<byte>& secure_reneg_info,
const Client_Hello& client_hello,
- const std::vector<byte>& new_session_id,
- Protocol_Version new_session_version,
- u16bit ciphersuite,
- byte compression,
- bool offer_session_ticket,
- const std::string& next_protocol);
+ const Server_Hello::Settings& settings,
+ const std::string next_protocol);
Server_Hello(Handshake_IO& io,
Handshake_Hash& hash,
@@ -341,7 +395,7 @@ class Certificate final : public Handshake_Message
Handshake_Hash& hash,
const std::vector<X509_Certificate>& certs);
- explicit Certificate(const std::vector<byte>& buf);
+ explicit Certificate(const std::vector<byte>& buf, const Policy &policy);
private:
std::vector<byte> serialize() const override;
diff --git a/src/lib/tls/tls_policy.cpp b/src/lib/tls/tls_policy.cpp
index 10b193215..592d4f572 100644
--- a/src/lib/tls/tls_policy.cpp
+++ b/src/lib/tls/tls_policy.cpp
@@ -1,6 +1,7 @@
/*
* Policies for TLS
* (C) 2004-2010,2012,2015,2016 Jack Lloyd
+* 2016 Christian Mainka
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -119,14 +120,75 @@ std::string Policy::choose_curve(const std::vector<std::string>& curve_names) co
std::string Policy::dh_group() const
{
+ // We offer 2048 bit DH because we can
return "modp/ietf/2048";
}
size_t Policy::minimum_dh_group_size() const
{
+ // Many servers still send 1024 bit
return 1024;
}
+size_t Policy::minimum_ecdsa_group_size() const
+ {
+ // Here we are at the mercy of whatever the CA signed, but most certs should be 256 bit by now
+ return 256;
+ }
+
+size_t Policy::minimum_ecdh_group_size() const
+ {
+ // P-256 is smallest curve currently supplrted for TLS key exchange (after 1.11.29)
+ return 256;
+ }
+
+size_t Policy::minimum_rsa_bits() const
+ {
+ /* Default assumption is all end-entity certificates should
+ be at least 2048 bits these days.
+
+ If you are connecting to arbitrary servers on the Internet
+ (ie as a web browser or SMTP client) you'll probably have to reduce this
+ to 1024 bits, or perhaps even lower.
+ */
+ return 2048;
+ }
+
+void Policy::check_peer_key_acceptable(const Public_Key& public_key) const
+ {
+ const std::string algo_name = public_key.algo_name();
+
+ // FIXME this is not really the right way to do this
+ size_t keylength = public_key.max_input_bits();
+ size_t expected_keylength = 0;
+
+ if(algo_name == "RSA")
+ {
+ expected_keylength = minimum_rsa_bits();
+ keylength += 1; // fixup for use of max_input_bits above
+ }
+ else if(algo_name == "DH")
+ {
+ expected_keylength = minimum_dh_group_size();
+ }
+ else if(algo_name == "ECDH")
+ {
+ expected_keylength = minimum_ecdh_group_size();
+ }
+ else if(algo_name == "ECDSA")
+ {
+ expected_keylength = minimum_ecdsa_group_size();
+ }
+ // else some other algo, so leave expected_keylength as zero and the check is a no-op
+
+ if(keylength < expected_keylength)
+ throw TLS_Exception(Alert::INSUFFICIENT_SECURITY,
+ "Peer sent " +
+ std::to_string(keylength) + " bit " + algo_name + " key"
+ ", policy requires at least " +
+ std::to_string(expected_keylength));
+ }
+
/*
* Return allowed compression algorithms
*/
@@ -147,10 +209,17 @@ bool Policy::send_fallback_scsv(Protocol_Version version) const
bool Policy::acceptable_protocol_version(Protocol_Version version) const
{
- if(version.is_datagram_protocol())
- return (version >= Protocol_Version::DTLS_V12);
- else
- return (version >= Protocol_Version::TLS_V10);
+ // Uses boolean optimization:
+ // First check the current version (left part), then if it is allowed
+ // (right part)
+ // checks are ordered according to their probability
+ return (
+ ( ( version == Protocol_Version::TLS_V12) && allow_tls12() ) ||
+ ( ( version == Protocol_Version::TLS_V10) && allow_tls10() ) ||
+ ( ( version == Protocol_Version::TLS_V11) && allow_tls11() ) ||
+ ( ( version == Protocol_Version::DTLS_V12) && allow_dtls12() ) ||
+ ( ( version == Protocol_Version::DTLS_V10) && allow_dtls10() )
+ );
}
Protocol_Version Policy::latest_supported_version(bool datagram) const
@@ -168,9 +237,15 @@ bool Policy::acceptable_ciphersuite(const Ciphersuite&) const
bool Policy::allow_server_initiated_renegotiation() const { return false; }
bool Policy::allow_insecure_renegotiation() const { return false; }
+bool Policy::allow_tls10() const { return true; }
+bool Policy::allow_tls11() const { return true; }
+bool Policy::allow_tls12() const { return true; }
+bool Policy::allow_dtls10() const { return false; }
+bool Policy::allow_dtls12() const { return true; }
bool Policy::include_time_in_hello_random() const { return true; }
bool Policy::hide_unknown_users() const { return false; }
bool Policy::server_uses_own_ciphersuite_preferences() const { return true; }
+bool Policy::negotiate_encrypt_then_mac() const { return true; }
// 1 second initial timeout, 60 second max - see RFC 6347 sec 4.2.4.1
size_t Policy::dtls_initial_timeout() const { return 1*1000; }
@@ -339,6 +414,11 @@ void print_bool(std::ostream& o,
void Policy::print(std::ostream& o) const
{
+ print_bool(o, "allow_tls10", allow_tls10());
+ print_bool(o, "allow_tls11", allow_tls11());
+ print_bool(o, "allow_tls12", allow_tls12());
+ print_bool(o, "allow_dtls10", allow_dtls10());
+ print_bool(o, "allow_dtls12", allow_dtls12());
print_vec(o, "ciphers", allowed_ciphers());
print_vec(o, "macs", allowed_macs());
print_vec(o, "signature_hashes", allowed_signature_hashes());
@@ -351,9 +431,12 @@ void Policy::print(std::ostream& o) const
print_bool(o, "allow_server_initiated_renegotiation", allow_server_initiated_renegotiation());
print_bool(o, "hide_unknown_users", hide_unknown_users());
print_bool(o, "server_uses_own_ciphersuite_preferences", server_uses_own_ciphersuite_preferences());
+ print_bool(o, "negotiate_encrypt_then_mac", negotiate_encrypt_then_mac());
o << "session_ticket_lifetime = " << session_ticket_lifetime() << '\n';
o << "dh_group = " << dh_group() << '\n';
o << "minimum_dh_group_size = " << minimum_dh_group_size() << '\n';
+ o << "minimum_ecdh_group_size = " << minimum_ecdh_group_size() << '\n';
+ o << "minimum_rsa_bits = " << minimum_rsa_bits() << '\n';
}
std::vector<std::string> Strict_Policy::allowed_ciphers() const
@@ -376,13 +459,11 @@ std::vector<std::string> Strict_Policy::allowed_key_exchange_methods() const
return { "ECDH" };
}
-bool Strict_Policy::acceptable_protocol_version(Protocol_Version version) const
- {
- if(version.is_datagram_protocol())
- return (version >= Protocol_Version::DTLS_V12);
- else
- return (version >= Protocol_Version::TLS_V12);
- }
+bool Strict_Policy::allow_tls10() const { return false; }
+bool Strict_Policy::allow_tls11() const { return false; }
+bool Strict_Policy::allow_tls12() const { return true; }
+bool Strict_Policy::allow_dtls10() const { return false; }
+bool Strict_Policy::allow_dtls12() const { return true; }
}
diff --git a/src/lib/tls/tls_policy.h b/src/lib/tls/tls_policy.h
index 999ba2887..76e80ddde 100644
--- a/src/lib/tls/tls_policy.h
+++ b/src/lib/tls/tls_policy.h
@@ -101,15 +101,79 @@ class BOTAN_DLL Policy
* Allow servers to initiate a new handshake
*/
virtual bool allow_server_initiated_renegotiation() const;
+
+ /**
+ * Allow TLS v1.0
+ */
+ virtual bool allow_tls10() const;
+
+ /**
+ * Allow TLS v1.1
+ */
+ virtual bool allow_tls11() const;
+
+ /**
+ * Allow TLS v1.2
+ */
+ virtual bool allow_tls12() const;
+
+ /**
+ * Allow DTLS v1.0
+ */
+ virtual bool allow_dtls10() const;
+
+ /**
+ * Allow DTLS v1.2
+ */
+ virtual bool allow_dtls12() const;
virtual std::string dh_group() const;
/**
* Return the minimum DH group size we're willing to use
+ * Default is currently 1024 (insecure), should be 2048
*/
virtual size_t minimum_dh_group_size() const;
+
+ /**
+ * For ECDSA authenticated ciphersuites, the smallest key size the
+ * client will accept.
+ * This policy is currently only enforced on the server by the client.
+ */
+ virtual size_t minimum_ecdsa_group_size() const;
+
+ /**
+ * Return the minimum ECDH group size we're willing to use
+ * for key exchange
+ *
+ * Default 256, allowing P-256 and larger
+ * P-256 is the smallest curve we will negotiate
+ */
+ virtual size_t minimum_ecdh_group_size() const;
+
+ /**
+ * Return the minimum bit size we're willing to accept for RSA
+ * key exchange or server signatures.
+ *
+ * It does not place any requirements on the size of any RSA signature(s)
+ * which were used to check the server certificate. This is only
+ * concerned with the server's public key.
+ *
+ * Default is 2048 which is smallest RSA key size still secure
+ * for medium term security.
+ */
+ virtual size_t minimum_rsa_bits() const;
/**
+ * Throw an exception if you don't like the peer's key.
+ * Default impl checks the key size against minimum_rsa_bits, minimum_ecdsa_group_size,
+ * or minimum_ecdh_group_size depending on the key's type.
+ * Override if you'd like to perform some other kind of test on
+ * (or logging of) the peer's keys.
+ */
+ virtual void check_peer_key_acceptable(const Public_Key& public_key) const;
+
+ /**
* If this function returns false, unknown SRP/PSK identifiers
* will be rejected with an unknown_psk_identifier alert as soon
* as the non-existence is identified. Otherwise, a false
@@ -168,6 +232,12 @@ class BOTAN_DLL Policy
virtual bool server_uses_own_ciphersuite_preferences() const;
/**
+ * Indicates whether the encrypt-then-MAC extension should be negotiated
+ * (RFC 7366)
+ */
+ virtual bool negotiate_encrypt_then_mac() const;
+
+ /**
* Return allowed ciphersuites, in order of preference
*/
virtual std::vector<u16bit> ciphersuite_list(Protocol_Version version,
@@ -207,9 +277,12 @@ class BOTAN_DLL NSA_Suite_B_128 : public Policy
std::vector<std::string> allowed_ecc_curves() const override
{ return std::vector<std::string>({"secp256r1"}); }
-
- bool acceptable_protocol_version(Protocol_Version version) const override
- { return version == Protocol_Version::TLS_V12; }
+
+ bool allow_tls10() const override { return false; }
+ bool allow_tls11() const override { return false; }
+ bool allow_tls12() const override { return true; }
+ bool allow_dtls10() const override { return false; }
+ bool allow_dtls12() const override { return false; }
};
/**
@@ -220,9 +293,12 @@ class BOTAN_DLL Datagram_Policy : public Policy
public:
std::vector<std::string> allowed_macs() const override
{ return std::vector<std::string>({"AEAD"}); }
-
- bool acceptable_protocol_version(Protocol_Version version) const override
- { return version == Protocol_Version::DTLS_V12; }
+
+ bool allow_tls10() const override { return false; }
+ bool allow_tls11() const override { return false; }
+ bool allow_tls12() const override { return false; }
+ bool allow_dtls10() const override { return false; }
+ bool allow_dtls12() const override { return true; }
};
/*
@@ -243,7 +319,11 @@ class BOTAN_DLL Strict_Policy : public Policy
std::vector<std::string> allowed_key_exchange_methods() const override;
- bool acceptable_protocol_version(Protocol_Version version) const override;
+ bool allow_tls10() const override;
+ bool allow_tls11() const override;
+ bool allow_tls12() const override;
+ bool allow_dtls10() const override;
+ bool allow_dtls12() const override;
};
class BOTAN_DLL Text_Policy : public Policy
@@ -267,6 +347,21 @@ class BOTAN_DLL Text_Policy : public Policy
std::vector<std::string> allowed_ecc_curves() const override
{ return get_list("ecc_curves", Policy::allowed_ecc_curves()); }
+
+ bool allow_tls10() const override
+ { return get_bool("allow_tls10", Policy::allow_tls10()); }
+
+ bool allow_tls11() const override
+ { return get_bool("allow_tls11", Policy::allow_tls11()); }
+
+ bool allow_tls12() const override
+ { return get_bool("allow_tls12", Policy::allow_tls12()); }
+
+ bool allow_dtls10() const override
+ { return get_bool("allow_dtls10", Policy::allow_dtls10()); }
+
+ bool allow_dtls12() const override
+ { return get_bool("allow_dtls12", Policy::allow_dtls12()); }
bool allow_insecure_renegotiation() const override
{ return get_bool("allow_insecure_renegotiation", Policy::allow_insecure_renegotiation()); }
@@ -280,12 +375,24 @@ class BOTAN_DLL Text_Policy : public Policy
bool server_uses_own_ciphersuite_preferences() const override
{ return get_bool("server_uses_own_ciphersuite_preferences", Policy::server_uses_own_ciphersuite_preferences()); }
+ bool negotiate_encrypt_then_mac() const override
+ { return get_bool("negotiate_encrypt_then_mac", Policy::negotiate_encrypt_then_mac()); }
+
std::string dh_group() const override
{ return get_str("dh_group", Policy::dh_group()); }
+ size_t minimum_ecdh_group_size() const override
+ { return get_len("minimum_ecdh_group_size", Policy::minimum_ecdh_group_size()); }
+
+ size_t minimum_ecdsa_group_size() const override
+ { return get_len("minimum_ecdsa_group_size", Policy::minimum_ecdsa_group_size()); }
+
size_t minimum_dh_group_size() const override
{ return get_len("minimum_dh_group_size", Policy::minimum_dh_group_size()); }
+ size_t minimum_rsa_bits() const override
+ { return get_len("minimum_rsa_bits", Policy::minimum_rsa_bits()); }
+
bool hide_unknown_users() const override
{ return get_bool("hide_unknown_users", Policy::hide_unknown_users()); }
diff --git a/src/lib/tls/tls_record.cpp b/src/lib/tls/tls_record.cpp
index eacf313a8..877b81b41 100644
--- a/src/lib/tls/tls_record.cpp
+++ b/src/lib/tls/tls_record.cpp
@@ -1,6 +1,8 @@
/*
* TLS Record Handling
-* (C) 2012,2013,2014,2015 Jack Lloyd
+* (C) 2012,2013,2014,2015,2016 Jack Lloyd
+* 2016 Juraj Somorovsky
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -23,10 +25,12 @@ Connection_Cipher_State::Connection_Cipher_State(Protocol_Version version,
Connection_Side side,
bool our_side,
const Ciphersuite& suite,
- const Session_Keys& keys) :
+ const Session_Keys& keys,
+ bool uses_encrypt_then_mac) :
m_start_time(std::chrono::system_clock::now()),
m_nonce_bytes_from_handshake(suite.nonce_bytes_from_handshake()),
- m_nonce_bytes_from_record(suite.nonce_bytes_from_record())
+ m_nonce_bytes_from_record(suite.nonce_bytes_from_record()),
+ m_uses_encrypt_then_mac(uses_encrypt_then_mac)
{
SymmetricKey mac_key, cipher_key;
InitializationVector iv;
@@ -152,7 +156,7 @@ Connection_Cipher_State::format_ad(u64bit msg_sequence,
}
void write_record(secure_vector<byte>& output,
- byte msg_type, const byte msg[], size_t msg_length,
+ Record_Message msg,
Protocol_Version version,
u64bit seq,
Connection_Cipher_State* cs,
@@ -160,7 +164,7 @@ void write_record(secure_vector<byte>& output,
{
output.clear();
- output.push_back(msg_type);
+ output.push_back(msg.get_type());
output.push_back(version.major_version());
output.push_back(version.minor_version());
@@ -172,17 +176,17 @@ void write_record(secure_vector<byte>& output,
if(!cs) // initial unencrypted handshake records
{
- output.push_back(get_byte(0, static_cast<u16bit>(msg_length)));
- output.push_back(get_byte(1, static_cast<u16bit>(msg_length)));
+ output.push_back(get_byte<u16bit>(0, static_cast<u16bit>(msg.get_size())));
+ output.push_back(get_byte<u16bit>(1, static_cast<u16bit>(msg.get_size())));
- output.insert(output.end(), msg, msg + msg_length);
+ output.insert(output.end(), msg.get_data(), msg.get_data() + msg.get_size());
return;
}
if(AEAD_Mode* aead = cs->aead())
{
- const size_t ctext_size = aead->output_length(msg_length);
+ const size_t ctext_size = aead->output_length(msg.get_size());
const std::vector<byte> nonce = cs->aead_nonce(seq);
@@ -193,17 +197,16 @@ void write_record(secure_vector<byte>& output,
output.push_back(get_byte(0, static_cast<u16bit>(rec_size)));
output.push_back(get_byte(1, static_cast<u16bit>(rec_size)));
- aead->set_ad(cs->format_ad(seq, msg_type, version, static_cast<u16bit>(msg_length)));
+ aead->set_ad(cs->format_ad(seq, msg.get_type(), version, static_cast<u16bit>(msg.get_size())));
if(cs->nonce_bytes_from_record() > 0)
{
output += std::make_pair(&nonce[cs->nonce_bytes_from_handshake()], cs->nonce_bytes_from_record());
}
-
BOTAN_ASSERT(aead->start(nonce).empty(), "AEAD doesn't return anything from start");
const size_t offset = output.size();
- output += std::make_pair(msg, msg_length);
+ output += std::make_pair(msg.get_data(), msg.get_size());
aead->finish(output, offset);
BOTAN_ASSERT(output.size() == offset + ctext_size, "Expected size");
@@ -213,77 +216,151 @@ void write_record(secure_vector<byte>& output,
return;
}
- cs->mac()->update(cs->format_ad(seq, msg_type, version, static_cast<u16bit>(msg_length)));
-
- cs->mac()->update(msg, msg_length);
-
const size_t block_size = cs->block_size();
const size_t iv_size = cs->iv_size();
const size_t mac_size = cs->mac_size();
- const size_t buf_size = round_up(
- iv_size + msg_length + mac_size + (block_size ? 1 : 0),
- block_size);
+ if(!cs->uses_encrypt_then_mac())
+ {
+ cs->mac()->update(cs->format_ad(seq, msg.get_type(), version, static_cast<u16bit>(msg.get_size())));
+ cs->mac()->update(msg.get_data(), msg.get_size());
- if(buf_size > MAX_CIPHERTEXT_SIZE)
- throw Internal_Error("Output record is larger than allowed by protocol");
+ const size_t buf_size = round_up(
+ iv_size + msg.get_size() + mac_size + (block_size ? 1 : 0),
+ block_size);
- output.push_back(get_byte(0, static_cast<u16bit>(buf_size)));
- output.push_back(get_byte(1, static_cast<u16bit>(buf_size)));
+ if(buf_size > MAX_CIPHERTEXT_SIZE)
+ throw Internal_Error("Output record is larger than allowed by protocol");
- const size_t header_size = output.size();
+ output.push_back(get_byte(0, static_cast<u16bit>(buf_size)));
+ output.push_back(get_byte(1, static_cast<u16bit>(buf_size)));
- if(iv_size)
- {
- output.resize(output.size() + iv_size);
- rng.randomize(&output[output.size() - iv_size], iv_size);
- }
+ const size_t header_size = output.size();
- output.insert(output.end(), msg, msg + msg_length);
+ if(iv_size)
+ {
+ output.resize(output.size() + iv_size);
+ rng.randomize(&output[output.size() - iv_size], iv_size);
+ }
- output.resize(output.size() + mac_size);
- cs->mac()->final(&output[output.size() - mac_size]);
+ output.insert(output.end(), msg.get_data(), msg.get_data() + msg.get_size());
- if(block_size)
- {
- const size_t pad_val =
- buf_size - (iv_size + msg_length + mac_size + 1);
+ output.resize(output.size() + mac_size);
+ cs->mac()->final(&output[output.size() - mac_size]);
- for(size_t i = 0; i != pad_val + 1; ++i)
- output.push_back(static_cast<byte>(pad_val));
- }
+ if(block_size)
+ {
+ const size_t pad_val =
+ buf_size - (iv_size + msg.get_size() + mac_size + 1);
- if(buf_size > MAX_CIPHERTEXT_SIZE)
- throw Internal_Error("Produced ciphertext larger than protocol allows");
+ for(size_t i = 0; i != pad_val + 1; ++i)
+ output.push_back(static_cast<byte>(pad_val));
+ }
+
+ if(buf_size > MAX_CIPHERTEXT_SIZE)
+ throw Internal_Error("Produced ciphertext larger than protocol allows");
- BOTAN_ASSERT_EQUAL(buf_size + header_size, output.size(),
+ BOTAN_ASSERT_EQUAL(buf_size + header_size, output.size(),
"Output buffer is sized properly");
- if(BlockCipher* bc = cs->block_cipher())
- {
- secure_vector<byte>& cbc_state = cs->cbc_state();
+ if(BlockCipher* bc = cs->block_cipher())
+ {
+ secure_vector<byte>& cbc_state = cs->cbc_state();
- BOTAN_ASSERT(buf_size % block_size == 0,
+ BOTAN_ASSERT(buf_size % block_size == 0,
"Buffer is an even multiple of block size");
- byte* buf = &output[header_size];
+ byte* buf = &output[header_size];
+
+ const size_t blocks = buf_size / block_size;
- const size_t blocks = buf_size / block_size;
+ xor_buf(buf, cbc_state.data(), block_size);
+ bc->encrypt(buf);
- xor_buf(buf, cbc_state.data(), block_size);
- bc->encrypt(buf);
+ for(size_t i = 1; i < blocks; ++i)
+ {
+ xor_buf(&buf[block_size*i], &buf[block_size*(i-1)], block_size);
+ bc->encrypt(&buf[block_size*i]);
+ }
- for(size_t i = 1; i < blocks; ++i)
+ cbc_state.assign(&buf[block_size*(blocks-1)],
+ &buf[block_size*blocks]);
+ }
+ else
{
- xor_buf(&buf[block_size*i], &buf[block_size*(i-1)], block_size);
- bc->encrypt(&buf[block_size*i]);
+ throw Internal_Error("NULL cipher not supported");
}
+ }
+ else
+ {
+ const size_t enc_size = round_up(
+ iv_size + msg.get_size() + (block_size ? 1 : 0),
+ block_size);
+
+ const size_t buf_size = enc_size + mac_size;
+
+ if(buf_size > MAX_CIPHERTEXT_SIZE)
+ throw Internal_Error("Output record is larger than allowed by protocol");
+
+ output.push_back(get_byte<u16bit>(0, buf_size));
+ output.push_back(get_byte<u16bit>(1, buf_size));
+
+ const size_t header_size = output.size();
- cbc_state.assign(&buf[block_size*(blocks-1)],
+ if(iv_size)
+ {
+ output.resize(output.size() + iv_size);
+ rng.randomize(&output[output.size() - iv_size], iv_size);
+ }
+
+ output.insert(output.end(), msg.get_data(), msg.get_data() + msg.get_size());
+
+ if(block_size)
+ {
+ const size_t pad_val =
+ enc_size - (iv_size + msg.get_size() + 1);
+
+ for(size_t i = 0; i != pad_val + 1; ++i)
+ output.push_back(pad_val);
+ }
+
+ if(BlockCipher* bc = cs->block_cipher())
+ {
+ secure_vector<byte>& cbc_state = cs->cbc_state();
+
+ BOTAN_ASSERT( enc_size % block_size == 0,
+ "Buffer is an even multiple of block size");
+
+ byte* buf = &output[header_size];
+
+ const size_t blocks = enc_size / block_size;
+
+ xor_buf(buf, cbc_state.data(), block_size);
+ bc->encrypt(buf);
+
+ for(size_t i = 1; i < blocks; ++i)
+ {
+ xor_buf(&buf[block_size*i], &buf[block_size*(i-1)], block_size);
+ bc->encrypt(&buf[block_size*i]);
+ }
+
+ cbc_state.assign(&buf[block_size*(blocks-1)],
&buf[block_size*blocks]);
+
+ cs->mac()->update(cs->format_ad(seq, msg.get_type(), version, enc_size));
+ cs->mac()->update(buf, enc_size);
+
+ output.resize(output.size() + mac_size);
+ cs->mac()->final(&output[output.size() - mac_size]);
+
+ BOTAN_ASSERT_EQUAL(buf_size + header_size, output.size(),
+ "Output buffer is sized properly");
+ }
+ else
+ {
+ throw Internal_Error("NULL cipher not supported");
+ }
}
- else
- throw Internal_Error("NULL cipher not supported");
}
namespace {
@@ -409,117 +486,147 @@ void decrypt_record(secure_vector<byte>& output,
const size_t mac_size = cs.mac_size();
const size_t iv_size = cs.iv_size();
- // This early exit does not leak info because all the values are public
- if((record_len < mac_size + iv_size) || (record_len % cs.block_size() != 0))
- throw Decoding_Error("Record sent with invalid length");
+ if(!cs.uses_encrypt_then_mac())
+ {
+ // This early exit does not leak info because all the values are public
+ if((record_len < mac_size + iv_size) || (record_len % cs.block_size() != 0))
+ throw TLS_Exception(Alert::BAD_RECORD_MAC, "Message authentication failure");
- CT::poison(record_contents, record_len);
+ CT::poison(record_contents, record_len);
- cbc_decrypt_record(record_contents, record_len, cs, *bc);
+ cbc_decrypt_record(record_contents, record_len, cs, *bc);
- // 0 if padding was invalid, otherwise 1 + padding_bytes
- u16bit pad_size = tls_padding_check(record_contents, record_len);
+ // 0 if padding was invalid, otherwise 1 + padding_bytes
+ u16bit pad_size = tls_padding_check(record_contents, record_len);
- // This mask is zero if there is not enough room in the packet
- const u16bit size_ok_mask = CT::is_lte<u16bit>(static_cast<u16bit>(mac_size + pad_size + iv_size), static_cast<u16bit>(record_len));
- pad_size &= size_ok_mask;
+ // This mask is zero if there is not enough room in the packet to get
+ // a valid MAC. We have to accept empty packets, since otherwise we
+ // are not compatible with the BEAST countermeasure (thus record_len+1).
+ const u16bit size_ok_mask = CT::is_lte<u16bit>(static_cast<u16bit>(mac_size + pad_size + iv_size), static_cast<u16bit>(record_len + 1));
+ pad_size &= size_ok_mask;
- CT::unpoison(record_contents, record_len);
+ CT::unpoison(record_contents, record_len);
- /*
- This is unpoisoned sooner than it should. The pad_size leaks to plaintext_length and
- then to the timing channel in the MAC computation described in the Lucky 13 paper.
- */
- CT::unpoison(pad_size);
+ /*
+ This is unpoisoned sooner than it should. The pad_size leaks to plaintext_length and
+ then to the timing channel in the MAC computation described in the Lucky 13 paper.
+ */
+ CT::unpoison(pad_size);
- const byte* plaintext_block = &record_contents[iv_size];
- const u16bit plaintext_length = static_cast<u16bit>(record_len - mac_size - iv_size - pad_size);
+ const byte* plaintext_block = &record_contents[iv_size];
+ const u16bit plaintext_length = static_cast<u16bit>(record_len - mac_size - iv_size - pad_size);
- cs.mac()->update(cs.format_ad(record_sequence, record_type, record_version, plaintext_length));
- cs.mac()->update(plaintext_block, plaintext_length);
+ cs.mac()->update(cs.format_ad(record_sequence, record_type, record_version, plaintext_length));
+ cs.mac()->update(plaintext_block, plaintext_length);
- std::vector<byte> mac_buf(mac_size);
- cs.mac()->final(mac_buf.data());
+ std::vector<byte> mac_buf(mac_size);
+ cs.mac()->final(mac_buf.data());
- const size_t mac_offset = record_len - (mac_size + pad_size);
+ const size_t mac_offset = record_len - (mac_size + pad_size);
- const bool mac_ok = same_mem(&record_contents[mac_offset], mac_buf.data(), mac_size);
+ const bool mac_ok = same_mem(&record_contents[mac_offset], mac_buf.data(), mac_size);
- const u16bit ok_mask = size_ok_mask & CT::expand_mask<u16bit>(mac_ok) & CT::expand_mask<u16bit>(pad_size);
+ const u16bit ok_mask = size_ok_mask & CT::expand_mask<u16bit>(mac_ok) & CT::expand_mask<u16bit>(pad_size);
- CT::unpoison(ok_mask);
+ CT::unpoison(ok_mask);
- if(ok_mask)
- {
- output.assign(plaintext_block, plaintext_block + plaintext_length);
+ if(ok_mask)
+ {
+ output.assign(plaintext_block, plaintext_block + plaintext_length);
+ }
+ else
+ {
+ throw TLS_Exception(Alert::BAD_RECORD_MAC, "Message authentication failure");
+ }
}
else
{
- throw TLS_Exception(Alert::BAD_RECORD_MAC, "Message authentication failure");
+ const size_t enc_size = record_len - mac_size;
+ // This early exit does not leak info because all the values are public
+ if((record_len < mac_size + iv_size) || ( enc_size % cs.block_size() != 0))
+ throw TLS_Exception(Alert::BAD_RECORD_MAC, "Message authentication failure");
+
+ cs.mac()->update(cs.format_ad(record_sequence, record_type, record_version, enc_size));
+ cs.mac()->update(record_contents, enc_size);
+
+ std::vector<byte> mac_buf(mac_size);
+ cs.mac()->final(mac_buf.data());
+
+ const size_t mac_offset = enc_size;
+
+ const bool mac_ok = same_mem(&record_contents[mac_offset], mac_buf.data(), mac_size);
+
+ if(!mac_ok)
+ {
+ throw TLS_Exception(Alert::BAD_RECORD_MAC, "Message authentication failure");
+ }
+
+ cbc_decrypt_record(record_contents, enc_size, cs, *bc);
+
+ // 0 if padding was invalid, otherwise 1 + padding_bytes
+ u16bit pad_size = tls_padding_check(record_contents, enc_size);
+
+ const byte* plaintext_block = &record_contents[iv_size];
+ const u16bit plaintext_length = enc_size - iv_size - pad_size;
+
+ output.assign(plaintext_block, plaintext_block + plaintext_length);
}
}
}
size_t read_tls_record(secure_vector<byte>& readbuf,
- const byte input[],
- size_t input_sz,
- size_t& consumed,
- secure_vector<byte>& record,
- u64bit* record_sequence,
- Protocol_Version* record_version,
- Record_Type* record_type,
+ Record_Raw_Input& raw_input,
+ Record& rec,
Connection_Sequence_Numbers* sequence_numbers,
get_cipherstate_fn get_cipherstate)
{
- consumed = 0;
-
if(readbuf.size() < TLS_HEADER_SIZE) // header incomplete?
{
if(size_t needed = fill_buffer_to(readbuf,
- input, input_sz, consumed,
+ raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(),
TLS_HEADER_SIZE))
return needed;
BOTAN_ASSERT_EQUAL(readbuf.size(), TLS_HEADER_SIZE, "Have an entire header");
}
- *record_version = Protocol_Version(readbuf[1], readbuf[2]);
+ *rec.get_protocol_version() = Protocol_Version(readbuf[1], readbuf[2]);
- BOTAN_ASSERT(!record_version->is_datagram_protocol(), "Expected TLS");
+ BOTAN_ASSERT(!rec.get_protocol_version()->is_datagram_protocol(), "Expected TLS");
- const size_t record_len = make_u16bit(readbuf[TLS_HEADER_SIZE-2],
+ const size_t record_size = make_u16bit(readbuf[TLS_HEADER_SIZE-2],
readbuf[TLS_HEADER_SIZE-1]);
- if(record_len > MAX_CIPHERTEXT_SIZE)
+ if(record_size > MAX_CIPHERTEXT_SIZE)
throw TLS_Exception(Alert::RECORD_OVERFLOW,
"Received a record that exceeds maximum size");
- if(record_len == 0)
+ if(record_size == 0)
throw TLS_Exception(Alert::DECODE_ERROR,
"Received a completely empty record");
if(size_t needed = fill_buffer_to(readbuf,
- input, input_sz, consumed,
- TLS_HEADER_SIZE + record_len))
+ raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(),
+ TLS_HEADER_SIZE + record_size))
return needed;
- BOTAN_ASSERT_EQUAL(static_cast<size_t>(TLS_HEADER_SIZE) + record_len,
+ BOTAN_ASSERT_EQUAL(static_cast<size_t>(TLS_HEADER_SIZE) + record_size,
readbuf.size(),
"Have the full record");
- *record_type = static_cast<Record_Type>(readbuf[0]);
+ *rec.get_type() = static_cast<Record_Type>(readbuf[0]);
u16bit epoch = 0;
if(sequence_numbers)
{
- *record_sequence = sequence_numbers->next_read_sequence();
+ *rec.get_sequence() = sequence_numbers->next_read_sequence();
epoch = sequence_numbers->current_read_epoch();
}
else
{
// server initial handshake case
- *record_sequence = 0;
+ *rec.get_sequence() = 0;
epoch = 0;
}
@@ -527,7 +634,7 @@ size_t read_tls_record(secure_vector<byte>& readbuf,
if(epoch == 0) // Unencrypted initial handshake
{
- record.assign(readbuf.begin() + TLS_HEADER_SIZE, readbuf.begin() + TLS_HEADER_SIZE + record_len);
+ rec.get_data().assign(readbuf.begin() + TLS_HEADER_SIZE, readbuf.begin() + TLS_HEADER_SIZE + record_size);
readbuf.clear();
return 0; // got a full record
}
@@ -537,37 +644,30 @@ size_t read_tls_record(secure_vector<byte>& readbuf,
BOTAN_ASSERT(cs, "Have cipherstate for this epoch");
- decrypt_record(record,
+ decrypt_record(rec.get_data(),
record_contents,
- record_len,
- *record_sequence,
- *record_version,
- *record_type,
+ record_size,
+ *rec.get_sequence(),
+ *rec.get_protocol_version(),
+ *rec.get_type(),
*cs);
if(sequence_numbers)
- sequence_numbers->read_accept(*record_sequence);
+ sequence_numbers->read_accept(*rec.get_sequence());
readbuf.clear();
return 0;
}
size_t read_dtls_record(secure_vector<byte>& readbuf,
- const byte input[],
- size_t input_sz,
- size_t& consumed,
- secure_vector<byte>& record,
- u64bit* record_sequence,
- Protocol_Version* record_version,
- Record_Type* record_type,
+ Record_Raw_Input& raw_input,
+ Record& rec,
Connection_Sequence_Numbers* sequence_numbers,
get_cipherstate_fn get_cipherstate)
{
- consumed = 0;
-
if(readbuf.size() < DTLS_HEADER_SIZE) // header incomplete?
{
- if(fill_buffer_to(readbuf, input, input_sz, consumed, DTLS_HEADER_SIZE))
+ if(fill_buffer_to(readbuf, raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(), DTLS_HEADER_SIZE))
{
readbuf.clear();
return 0;
@@ -576,38 +676,35 @@ size_t read_dtls_record(secure_vector<byte>& readbuf,
BOTAN_ASSERT_EQUAL(readbuf.size(), DTLS_HEADER_SIZE, "Have an entire header");
}
- *record_version = Protocol_Version(readbuf[1], readbuf[2]);
+ *rec.get_protocol_version() = Protocol_Version(readbuf[1], readbuf[2]);
- BOTAN_ASSERT(record_version->is_datagram_protocol(), "Expected DTLS");
+ BOTAN_ASSERT(rec.get_protocol_version()->is_datagram_protocol(), "Expected DTLS");
- const size_t record_len = make_u16bit(readbuf[DTLS_HEADER_SIZE-2],
- readbuf[DTLS_HEADER_SIZE-1]);
+ const size_t record_size = make_u16bit(readbuf[DTLS_HEADER_SIZE-2],
+ readbuf[DTLS_HEADER_SIZE-1]);
- // Invalid packet:
- if(record_len == 0 || record_len > MAX_CIPHERTEXT_SIZE)
- {
- readbuf.clear();
- return 0;
- }
+ if(record_size > MAX_CIPHERTEXT_SIZE)
+ throw TLS_Exception(Alert::RECORD_OVERFLOW,
+ "Got message that exceeds maximum size");
- if(fill_buffer_to(readbuf, input, input_sz, consumed, DTLS_HEADER_SIZE + record_len))
+ if(fill_buffer_to(readbuf, raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(), DTLS_HEADER_SIZE + record_size))
{
// Truncated packet?
readbuf.clear();
return 0;
}
- BOTAN_ASSERT_EQUAL(static_cast<size_t>(DTLS_HEADER_SIZE) + record_len, readbuf.size(),
+ BOTAN_ASSERT_EQUAL(static_cast<size_t>(DTLS_HEADER_SIZE) + record_size, readbuf.size(),
"Have the full record");
- *record_type = static_cast<Record_Type>(readbuf[0]);
+ *rec.get_type() = static_cast<Record_Type>(readbuf[0]);
u16bit epoch = 0;
- *record_sequence = load_be<u64bit>(&readbuf[3], 0);
- epoch = (*record_sequence >> 48);
+ *rec.get_sequence() = load_be<u64bit>(&readbuf[3], 0);
+ epoch = (*rec.get_sequence() >> 48);
- if(sequence_numbers && sequence_numbers->already_seen(*record_sequence))
+ if(sequence_numbers && sequence_numbers->already_seen(*rec.get_sequence()))
{
readbuf.clear();
return 0;
@@ -617,7 +714,7 @@ size_t read_dtls_record(secure_vector<byte>& readbuf,
if(epoch == 0) // Unencrypted initial handshake
{
- record.assign(readbuf.begin() + DTLS_HEADER_SIZE, readbuf.begin() + DTLS_HEADER_SIZE + record_len);
+ rec.get_data().assign(readbuf.begin() + DTLS_HEADER_SIZE, readbuf.begin() + DTLS_HEADER_SIZE + record_size);
readbuf.clear();
return 0; // got a full record
}
@@ -629,23 +726,23 @@ size_t read_dtls_record(secure_vector<byte>& readbuf,
BOTAN_ASSERT(cs, "Have cipherstate for this epoch");
- decrypt_record(record,
+ decrypt_record(rec.get_data(),
record_contents,
- record_len,
- *record_sequence,
- *record_version,
- *record_type,
+ record_size,
+ *rec.get_sequence(),
+ *rec.get_protocol_version(),
+ *rec.get_type(),
*cs);
}
catch(std::exception)
{
readbuf.clear();
- *record_type = NO_RECORD;
+ *rec.get_type() = NO_RECORD;
return 0;
}
if(sequence_numbers)
- sequence_numbers->read_accept(*record_sequence);
+ sequence_numbers->read_accept(*rec.get_sequence());
readbuf.clear();
return 0;
@@ -654,24 +751,16 @@ size_t read_dtls_record(secure_vector<byte>& readbuf,
}
size_t read_record(secure_vector<byte>& readbuf,
- const byte input[],
- size_t input_sz,
- bool is_datagram,
- size_t& consumed,
- secure_vector<byte>& record,
- u64bit* record_sequence,
- Protocol_Version* record_version,
- Record_Type* record_type,
+ Record_Raw_Input& raw_input,
+ Record& rec,
Connection_Sequence_Numbers* sequence_numbers,
get_cipherstate_fn get_cipherstate)
{
- if(is_datagram)
- return read_dtls_record(readbuf, input, input_sz, consumed,
- record, record_sequence, record_version, record_type,
+ if(raw_input.is_datagram())
+ return read_dtls_record(readbuf, raw_input, rec,
sequence_numbers, get_cipherstate);
else
- return read_tls_record(readbuf, input, input_sz, consumed,
- record, record_sequence, record_version, record_type,
+ return read_tls_record(readbuf, raw_input, rec,
sequence_numbers, get_cipherstate);
}
diff --git a/src/lib/tls/tls_record.h b/src/lib/tls/tls_record.h
index e3b0b9b58..4420a9c66 100644
--- a/src/lib/tls/tls_record.h
+++ b/src/lib/tls/tls_record.h
@@ -1,6 +1,7 @@
/*
* TLS Record Handling
* (C) 2004-2012 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -38,7 +39,8 @@ class Connection_Cipher_State
Connection_Side which_side,
bool is_our_side,
const Ciphersuite& suite,
- const Session_Keys& keys);
+ const Session_Keys& keys,
+ bool uses_encrypt_then_mac);
AEAD_Mode* aead() { return m_aead.get(); }
@@ -66,6 +68,8 @@ class Connection_Cipher_State
size_t nonce_bytes_from_handshake() const { return m_nonce_bytes_from_handshake; }
+ bool uses_encrypt_then_mac() const { return m_uses_encrypt_then_mac; }
+
bool cbc_without_explicit_iv() const
{ return (m_block_size > 0) && (m_iv_size == 0); }
@@ -88,8 +92,84 @@ class Connection_Cipher_State
size_t m_nonce_bytes_from_handshake;
size_t m_nonce_bytes_from_record;
size_t m_iv_size = 0;
+
+ bool m_uses_encrypt_then_mac;
};
+class Record
+ {
+ public:
+ Record(secure_vector<byte>& data,
+ u64bit* sequence,
+ Protocol_Version* protocol_version,
+ Record_Type* type)
+ : m_data(data), m_sequence(sequence), m_protocol_version(protocol_version),
+ m_type(type), m_size(data.size()) {};
+
+ secure_vector<byte>& get_data() { return m_data; }
+
+ Protocol_Version* get_protocol_version() { return m_protocol_version; }
+
+ u64bit* get_sequence() { return m_sequence; }
+
+ Record_Type* get_type() { return m_type; }
+
+ size_t& get_size() { return m_size; }
+
+ private:
+ secure_vector<byte>& m_data;
+ u64bit* m_sequence;
+ Protocol_Version* m_protocol_version;
+ Record_Type* m_type;
+ size_t m_size;
+ };
+
+class Record_Message
+ {
+ public:
+ Record_Message(const byte* data, size_t size)
+ : m_type(0), m_sequence(0), m_data(data), m_size(size) {};
+ Record_Message(byte type, u64bit sequence, const byte* data, size_t size)
+ : m_type(type), m_sequence(sequence), m_data(data),
+ m_size(size) {};
+
+ byte& get_type() { return m_type; };
+ u64bit& get_sequence() { return m_sequence; };
+ const byte* get_data() { return m_data; };
+ size_t& get_size() { return m_size; };
+
+ private:
+ byte m_type;
+ u64bit m_sequence;
+ const byte* m_data;
+ size_t m_size;
+};
+
+class Record_Raw_Input
+ {
+ public:
+ Record_Raw_Input(const byte* data, size_t size, size_t& consumed,
+ bool is_datagram)
+ : m_data(data), m_size(size), m_consumed(consumed),
+ m_is_datagram(is_datagram) {};
+
+ const byte*& get_data() { return m_data; };
+
+ size_t& get_size() { return m_size; };
+
+ size_t& get_consumed() { return m_consumed; };
+ void set_consumed(size_t consumed) { m_consumed = consumed; }
+
+ bool is_datagram() { return m_is_datagram; };
+
+ private:
+ const byte* m_data;
+ size_t m_size;
+ size_t& m_consumed;
+ bool m_is_datagram;
+ };
+
+
/**
* Create a TLS record
* @param write_buffer the output record is placed here
@@ -103,7 +183,7 @@ class Connection_Cipher_State
* @return number of bytes written to write_buffer
*/
void write_record(secure_vector<byte>& write_buffer,
- byte msg_type, const byte msg[], size_t msg_length,
+ Record_Message rec_msg,
Protocol_Version version,
u64bit msg_sequence,
Connection_Cipher_State* cipherstate,
@@ -117,14 +197,8 @@ typedef std::function<std::shared_ptr<Connection_Cipher_State> (u16bit)> get_cip
* @return zero if full message, else number of bytes still needed
*/
size_t read_record(secure_vector<byte>& read_buffer,
- const byte input[],
- size_t input_length,
- bool is_datagram,
- size_t& input_consumed,
- secure_vector<byte>& record,
- u64bit* record_sequence,
- Protocol_Version* record_version,
- Record_Type* record_type,
+ Record_Raw_Input& raw_input,
+ Record& rec,
Connection_Sequence_Numbers* sequence_numbers,
get_cipherstate_fn get_cipherstate);
diff --git a/src/lib/tls/tls_server.cpp b/src/lib/tls/tls_server.cpp
index 41b14ae08..40aa18d27 100644
--- a/src/lib/tls/tls_server.cpp
+++ b/src/lib/tls/tls_server.cpp
@@ -1,6 +1,7 @@
/*
* TLS Server
* (C) 2004-2011,2012,2016 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -9,30 +10,41 @@
#include <botan/internal/tls_handshake_state.h>
#include <botan/internal/tls_messages.h>
#include <botan/internal/stl_util.h>
+#include <botan/tls_magic.h>
namespace Botan {
namespace TLS {
-namespace {
-
class Server_Handshake_State : public Handshake_State
{
public:
- // using Handshake_State::Handshake_State;
+ Server_Handshake_State(Handshake_IO* io, Callbacks& cb)
+ : Handshake_State(io, cb) {}
+
+ Private_Key* server_rsa_kex_key() { return m_server_rsa_kex_key; }
+ void set_server_rsa_kex_key(Private_Key* key)
+ { m_server_rsa_kex_key = key; }
+
+ bool allow_session_resumption() const
+ { return m_allow_session_resumption; }
+ void set_allow_session_resumption(bool allow_session_resumption)
+ { m_allow_session_resumption = allow_session_resumption; }
- Server_Handshake_State(Handshake_IO* io, handshake_msg_cb cb) : Handshake_State(io, cb) {}
+ private:
// Used by the server only, in case of RSA key exchange. Not owned
- Private_Key* server_rsa_kex_key = nullptr;
+ Private_Key* m_server_rsa_kex_key = nullptr;
/*
* Used by the server to know if resumption should be allowed on
* a server-initiated renegotiation
*/
- bool allow_session_resumption = true;
+ bool m_allow_session_resumption = true;
};
+namespace {
+
bool check_for_resume(Session& session_info,
Session_Manager& session_manager,
Credentials_Manager& credentials,
@@ -118,6 +130,19 @@ bool check_for_resume(Session& session_info,
}
}
+ // Checking encrypt_then_mac on resume (RFC 7366 section 3.1)
+ if( !client_hello->supports_encrypt_then_mac() && session_info.supports_encrypt_then_mac())
+ {
+
+ /*
+ Client previously negotiated session with Encrypt-then-MAC,
+ but has now attempted to resume without the extension: abort
+ */
+ throw TLS_Exception(Alert::HANDSHAKE_FAILURE,
+ "Client resumed Encrypt-then-MAC session without sending extension");
+
+ }
+
return true;
}
@@ -225,6 +250,19 @@ get_server_certs(const std::string& hostname,
/*
* TLS Server Constructor
*/
+Server::Server(Callbacks& callbacks,
+ Session_Manager& session_manager,
+ Credentials_Manager& creds,
+ const Policy& policy,
+ RandomNumberGenerator& rng,
+ bool is_datagram,
+ size_t io_buf_sz) :
+ Channel(callbacks, session_manager, rng, policy,
+ is_datagram, io_buf_sz),
+ m_creds(creds)
+ {
+ }
+
Server::Server(output_fn output,
data_cb data_cb,
alert_cb alert_cb,
@@ -236,13 +274,15 @@ Server::Server(output_fn output,
next_protocol_fn next_proto,
bool is_datagram,
size_t io_buf_sz) :
- Channel(output, data_cb, alert_cb, handshake_cb, Channel::handshake_msg_cb(),
- session_manager, rng, policy, is_datagram, io_buf_sz),
+ Channel(output, data_cb, alert_cb, handshake_cb,
+ Channel::handshake_msg_cb(), session_manager,
+ rng, policy, is_datagram, io_buf_sz),
m_creds(creds),
m_choose_next_protocol(next_proto)
{
}
+
Server::Server(output_fn output,
data_cb data_cb,
alert_cb alert_cb,
@@ -263,8 +303,7 @@ Server::Server(output_fn output,
Handshake_State* Server::new_handshake_state(Handshake_IO* io)
{
- std::unique_ptr<Handshake_State> state(
- new Server_Handshake_State(io, get_handshake_msg_cb()));
+ std::unique_ptr<Handshake_State> state(new Server_Handshake_State(io, callbacks()));
state->set_expected_next(CLIENT_HELLO);
return state.release();
@@ -284,441 +323,516 @@ Server::get_peer_cert_chain(const Handshake_State& state) const
void Server::initiate_handshake(Handshake_State& state,
bool force_full_renegotiation)
{
- dynamic_cast<Server_Handshake_State&>(state).allow_session_resumption =
- !force_full_renegotiation;
+ dynamic_cast<Server_Handshake_State&>(state).
+ set_allow_session_resumption(!force_full_renegotiation);
Hello_Request hello_req(state.handshake_io());
}
/*
-* Process a handshake message
+* Process a CLIENT HELLO Message
*/
-void Server::process_handshake_msg(const Handshake_State* active_state,
- Handshake_State& state_base,
- Handshake_Type type,
- const std::vector<byte>& contents)
- {
- Server_Handshake_State& state = dynamic_cast<Server_Handshake_State&>(state_base);
-
- state.confirm_transition_to(type);
-
- /*
- * The change cipher spec message isn't technically a handshake
- * message so it's not included in the hash. The finished and
- * certificate verify messages are verified based on the current
- * state of the hash *before* this message so we delay adding them
- * to the hash computation until we've processed them below.
- */
- if(type != HANDSHAKE_CCS && type != FINISHED && type != CERTIFICATE_VERIFY)
+void Server::process_client_hello_msg(const Handshake_State* active_state,
+ Server_Handshake_State& pending_state,
+ const std::vector<byte>& contents)
+{
+ const bool initial_handshake = !active_state;
+
+ if(!policy().allow_insecure_renegotiation() &&
+ !(initial_handshake || secure_renegotiation_supported()))
{
- state.hash().update(state.handshake_io().format(contents, type));
+ send_warning_alert(Alert::NO_RENEGOTIATION);
+ return;
}
- if(type == CLIENT_HELLO)
+ pending_state.client_hello(new Client_Hello(contents));
+ const Protocol_Version client_version = pending_state.client_hello()->version();
+
+ Protocol_Version negotiated_version;
+
+ const Protocol_Version latest_supported =
+ policy().latest_supported_version(client_version.is_datagram_protocol());
+
+ if((initial_handshake && client_version.known_version()) ||
+ (!initial_handshake && client_version == active_state->version()))
{
- const bool initial_handshake = !active_state;
+ /*
+ Common cases: new client hello with some known version, or a
+ renegotiation using the same version as previously
+ negotiated.
+ */
- if(!policy().allow_insecure_renegotiation() &&
- !(initial_handshake || secure_renegotiation_supported()))
+ negotiated_version = client_version;
+ }
+ else if(!initial_handshake && (client_version != active_state->version()))
+ {
+ /*
+ * If this is a renegotiation, and the client has offered a
+ * later version than what it initially negotiated, negotiate
+ * the old version. This matches OpenSSL's behavior. If the
+ * client is offering a version earlier than what it initially
+ * negotiated, reject as a probable attack.
+ */
+ if(active_state->version() > client_version)
{
- send_warning_alert(Alert::NO_RENEGOTIATION);
- return;
+ throw TLS_Exception(Alert::PROTOCOL_VERSION,
+ "Client negotiated " +
+ active_state->version().to_string() +
+ " then renegotiated with " +
+ client_version.to_string());
}
+ else
+ negotiated_version = active_state->version();
+ }
+ else
+ {
+ /*
+ New negotiation using a version we don't know. Offer them the
+ best we currently know and support
+ */
+ negotiated_version = latest_supported;
+ }
- state.client_hello(new Client_Hello(contents));
+ if(!policy().acceptable_protocol_version(negotiated_version))
+ {
+ throw TLS_Exception(Alert::PROTOCOL_VERSION,
+ "Client version " + negotiated_version.to_string() +
+ " is unacceptable by policy");
+ }
- const Protocol_Version client_version = state.client_hello()->version();
+ if(pending_state.client_hello()->sent_fallback_scsv())
+ {
+ if(latest_supported > client_version)
+ throw TLS_Exception(Alert::INAPPROPRIATE_FALLBACK,
+ "Client signalled fallback SCSV, possible attack");
+ }
- Protocol_Version negotiated_version;
+ secure_renegotiation_check(pending_state.client_hello());
- const Protocol_Version latest_supported =
- policy().latest_supported_version(client_version.is_datagram_protocol());
+ pending_state.set_version(negotiated_version);
- if((initial_handshake && client_version.known_version()) ||
- (!initial_handshake && client_version == active_state->version()))
- {
- /*
- Common cases: new client hello with some known version, or a
- renegotiation using the same version as previously
- negotiated.
- */
+ Session session_info;
+ const bool resuming =
+ pending_state.allow_session_resumption() &&
+ check_for_resume(session_info,
+ session_manager(),
+ m_creds,
+ pending_state.client_hello(),
+ std::chrono::seconds(policy().session_ticket_lifetime()));
- negotiated_version = client_version;
- }
- else if(!initial_handshake && (client_version != active_state->version()))
- {
- /*
- * If this is a renegotiation, and the client has offered a
- * later version than what it initially negotiated, negotiate
- * the old version. This matches OpenSSL's behavior. If the
- * client is offering a version earlier than what it initially
- * negotiated, reject as a probable attack.
- */
- if(active_state->version() > client_version)
- {
- throw TLS_Exception(Alert::PROTOCOL_VERSION,
- "Client negotiated " +
- active_state->version().to_string() +
- " then renegotiated with " +
- client_version.to_string());
- }
- else
- negotiated_version = active_state->version();
- }
- else
- {
- /*
- New negotiation using a version we don't know. Offer them the
- best we currently know and support
- */
- negotiated_version = latest_supported;
- }
+ bool have_session_ticket_key = false;
- if(!policy().acceptable_protocol_version(negotiated_version))
- {
- throw TLS_Exception(Alert::PROTOCOL_VERSION,
- "Client version " + negotiated_version.to_string() +
- " is unacceptable by policy");
- }
+ try
+ {
+ have_session_ticket_key =
+ m_creds.psk("tls-server", "session-ticket", "").length() > 0;
+ }
+ catch(...) {}
+
+ m_next_protocol = "";
+ if(pending_state.client_hello()->supports_alpn())
+ {
+ m_next_protocol = callbacks().tls_server_choose_app_protocol(pending_state.client_hello()->next_protocols());
- if(state.client_hello()->sent_fallback_scsv())
+ // if the callback return was empty, fall back to the (deprecated) std::function
+ if(m_next_protocol.empty() && m_choose_next_protocol)
{
- if(latest_supported > client_version)
- throw TLS_Exception(Alert::INAPPROPRIATE_FALLBACK,
- "Client signalled fallback SCSV, possible attack");
+ m_next_protocol = m_choose_next_protocol(pending_state.client_hello()->next_protocols());
}
+ }
- secure_renegotiation_check(state.client_hello());
+ if(resuming)
+ {
+ this->session_resume(pending_state, have_session_ticket_key, session_info);
+ }
+ else // new session
+ {
+ this->session_create(pending_state, have_session_ticket_key);
+ }
+}
- state.set_version(negotiated_version);
+void Server::process_certificate_msg(Server_Handshake_State& pending_state,
+ const std::vector<byte>& contents)
+{
+ pending_state.client_certs(new Certificate(contents, policy()));
+ pending_state.set_expected_next(CLIENT_KEX);
+}
- Session session_info;
- const bool resuming =
- state.allow_session_resumption &&
- check_for_resume(session_info,
- session_manager(),
- m_creds,
- state.client_hello(),
- std::chrono::seconds(policy().session_ticket_lifetime()));
+void Server::process_client_key_exchange_msg(Server_Handshake_State& pending_state,
+ const std::vector<byte>& contents)
+{
+ if(pending_state.received_handshake_msg(CERTIFICATE) && !pending_state.client_certs()->empty())
+ pending_state.set_expected_next(CERTIFICATE_VERIFY);
+ else
+ pending_state.set_expected_next(HANDSHAKE_CCS);
- bool have_session_ticket_key = false;
+ pending_state.client_kex(
+ new Client_Key_Exchange(contents, pending_state,
+ pending_state.server_rsa_kex_key(),
+ m_creds, policy(), rng())
+ );
- try
- {
- have_session_ticket_key =
- m_creds.psk("tls-server", "session-ticket", "").length() > 0;
- }
- catch(...) {}
+ pending_state.compute_session_keys();
+}
- m_next_protocol = "";
- if(m_choose_next_protocol && state.client_hello()->supports_alpn())
- m_next_protocol = m_choose_next_protocol(state.client_hello()->next_protocols());
+void Server::process_change_cipher_spec_msg(Server_Handshake_State& pending_state)
+{
+ pending_state.set_expected_next(FINISHED);
+ change_cipher_spec_reader(SERVER);
+}
- if(resuming)
- {
- // Only offer a resuming client a new ticket if they didn't send one this time,
- // ie, resumed via server-side resumption. TODO: also send one if expiring soon?
-
- const bool offer_new_session_ticket =
- (state.client_hello()->supports_session_ticket() &&
- state.client_hello()->session_ticket().empty() &&
- have_session_ticket_key);
-
- state.server_hello(new Server_Hello(
- state.handshake_io(),
- state.hash(),
- policy(),
- rng(),
- secure_renegotiation_data_for_server_hello(),
- *state.client_hello(),
- session_info,
- offer_new_session_ticket,
- m_next_protocol
- ));
-
- secure_renegotiation_check(state.server_hello());
-
- state.compute_session_keys(session_info.master_secret());
-
- if(!save_session(session_info))
- {
- session_manager().remove_entry(session_info.session_id());
-
- if(state.server_hello()->supports_session_ticket()) // send an empty ticket
- {
- state.new_session_ticket(
- new New_Session_Ticket(state.handshake_io(),
- state.hash())
- );
- }
- }
+void Server::process_certificate_verify_msg(Server_Handshake_State& pending_state,
+ Handshake_Type type,
+ const std::vector<byte>& contents)
+{
+ pending_state.client_verify ( new Certificate_Verify ( contents, pending_state.version() ) );
+
+ const std::vector<X509_Certificate>& client_certs =
+ pending_state.client_certs()->cert_chain();
+
+ const bool sig_valid =
+ pending_state.client_verify()->verify ( client_certs[0], pending_state, policy() );
+
+ pending_state.hash().update ( pending_state.handshake_io().format ( contents, type ) );
+
+ /*
+ * Using DECRYPT_ERROR looks weird here, but per RFC 4346 is for
+ * "A handshake cryptographic operation failed, including being
+ * unable to correctly verify a signature, ..."
+ */
+ if ( !sig_valid )
+ throw TLS_Exception ( Alert::DECRYPT_ERROR, "Client cert verify failed" );
+
+ try
+ {
+ m_creds.verify_certificate_chain ( "tls-server", "", client_certs );
+ }
+ catch ( std::exception& e )
+ {
+ throw TLS_Exception ( Alert::BAD_CERTIFICATE, e.what() );
+ }
+
+ pending_state.set_expected_next ( HANDSHAKE_CCS );
+}
- if(state.server_hello()->supports_session_ticket() && !state.new_session_ticket())
- {
- try
- {
- const SymmetricKey ticket_key = m_creds.psk("tls-server", "session-ticket", "");
-
- state.new_session_ticket(
- new New_Session_Ticket(state.handshake_io(),
- state.hash(),
- session_info.encrypt(ticket_key, rng()),
- policy().session_ticket_lifetime())
- );
- }
- catch(...) {}
-
- if(!state.new_session_ticket())
- {
- state.new_session_ticket(
- new New_Session_Ticket(state.handshake_io(), state.hash())
- );
- }
- }
+void Server::process_finished_msg(Server_Handshake_State& pending_state,
+ Handshake_Type type,
+ const std::vector<byte>& contents)
+{
+ pending_state.set_expected_next ( HANDSHAKE_NONE );
- state.handshake_io().send(Change_Cipher_Spec());
+ pending_state.client_finished ( new Finished ( contents ) );
- change_cipher_spec_writer(SERVER);
+ if ( !pending_state.client_finished()->verify ( pending_state, CLIENT ) )
+ throw TLS_Exception ( Alert::DECRYPT_ERROR,
+ "Finished message didn't verify" );
- state.server_finished(new Finished(state.handshake_io(), state, SERVER));
- state.set_expected_next(HANDSHAKE_CCS);
- }
- else // new session
- {
- std::map<std::string, std::vector<X509_Certificate> > cert_chains;
+ if ( !pending_state.server_finished() )
+ {
+ // already sent finished if resuming, so this is a new session
- const std::string sni_hostname = state.client_hello()->sni_hostname();
+ pending_state.hash().update ( pending_state.handshake_io().format ( contents, type ) );
- cert_chains = get_server_certs(sni_hostname, m_creds);
+ Session session_info(
+ pending_state.server_hello()->session_id(),
+ pending_state.session_keys().master_secret(),
+ pending_state.server_hello()->version(),
+ pending_state.server_hello()->ciphersuite(),
+ pending_state.server_hello()->compression_method(),
+ SERVER,
+ pending_state.server_hello()->supports_extended_master_secret(),
+ pending_state.server_hello()->supports_encrypt_then_mac(),
+ get_peer_cert_chain ( pending_state ),
+ std::vector<byte>(),
+ Server_Information(pending_state.client_hello()->sni_hostname()),
+ pending_state.srp_identifier(),
+ pending_state.server_hello()->srtp_profile()
+ );
- if(sni_hostname != "" && cert_chains.empty())
+ if ( save_session ( session_info ) )
{
- cert_chains = get_server_certs("", m_creds);
-
- /*
- * Only send the unrecognized_name alert if we couldn't
- * find any certs for the requested name but did find at
- * least one cert to use in general. That avoids sending an
- * unrecognized_name when a server is configured for purely
- * anonymous operation.
- */
- if(!cert_chains.empty())
- send_alert(Alert(Alert::UNRECOGNIZED_NAME));
+ if ( pending_state.server_hello()->supports_session_ticket() )
+ {
+ try
+ {
+ const SymmetricKey ticket_key = m_creds.psk ( "tls-server", "session-ticket", "" );
+
+ pending_state.new_session_ticket (
+ new New_Session_Ticket ( pending_state.handshake_io(),
+ pending_state.hash(),
+ session_info.encrypt ( ticket_key, rng() ),
+ policy().session_ticket_lifetime() )
+ );
+ }
+ catch ( ... ) {}
+ }
+ else
+ session_manager().save ( session_info );
}
- state.server_hello(new Server_Hello(
- state.handshake_io(),
- state.hash(),
- policy(),
- rng(),
- secure_renegotiation_data_for_server_hello(),
- *state.client_hello(),
- make_hello_random(rng(), policy()), // new session ID
- state.version(),
- choose_ciphersuite(policy(), state.version(), m_creds, cert_chains, state.client_hello()),
- choose_compression(policy(), state.client_hello()->compression_methods()),
- have_session_ticket_key,
- m_next_protocol)
+ if ( !pending_state.new_session_ticket() &&
+ pending_state.server_hello()->supports_session_ticket() )
+ {
+ pending_state.new_session_ticket (
+ new New_Session_Ticket ( pending_state.handshake_io(), pending_state.hash() )
);
+ }
- secure_renegotiation_check(state.server_hello());
+ pending_state.handshake_io().send ( Change_Cipher_Spec() );
- const std::string sig_algo = state.ciphersuite().sig_algo();
- const std::string kex_algo = state.ciphersuite().kex_algo();
+ change_cipher_spec_writer ( SERVER );
- if(sig_algo != "")
- {
- BOTAN_ASSERT(!cert_chains[sig_algo].empty(),
- "Attempting to send empty certificate chain");
+ pending_state.server_finished ( new Finished ( pending_state.handshake_io(), pending_state, SERVER ) );
+ }
- state.server_certs(new Certificate(state.handshake_io(),
- state.hash(),
- cert_chains[sig_algo]));
- }
+ activate_session();
- Private_Key* private_key = nullptr;
+}
- if(kex_algo == "RSA" || sig_algo != "")
- {
- private_key = m_creds.private_key_for(
- state.server_certs()->cert_chain()[0],
- "tls-server",
- sni_hostname);
+/*
+* Process a handshake message
+*/
+void Server::process_handshake_msg(const Handshake_State* active_state,
+ Handshake_State& state_base,
+ Handshake_Type type,
+ const std::vector<byte>& contents)
+ {
+ Server_Handshake_State& state = dynamic_cast<Server_Handshake_State&>(state_base);
+ state.confirm_transition_to(type);
- if(!private_key)
- throw Internal_Error("No private key located for associated server cert");
- }
+ /*
+ * The change cipher spec message isn't technically a handshake
+ * message so it's not included in the hash. The finished and
+ * certificate verify messages are verified based on the current
+ * state of the hash *before* this message so we delay adding them
+ * to the hash computation until we've processed them below.
+ */
+ if(type != HANDSHAKE_CCS && type != FINISHED && type != CERTIFICATE_VERIFY)
+ {
+ state.hash().update(state.handshake_io().format(contents, type));
+ }
- if(kex_algo == "RSA")
- {
- state.server_rsa_kex_key = private_key;
- }
- else
- {
- state.server_kex(new Server_Key_Exchange(state.handshake_io(),
- state, policy(),
- m_creds, rng(), private_key));
- }
+ switch(type)
+ {
+ case CLIENT_HELLO:
+ this->process_client_hello_msg(active_state, state, contents);
+ break;
+
+ case CERTIFICATE:
+ this->process_certificate_msg(state, contents);
+ break;
+
+ case CLIENT_KEX:
+ this->process_client_key_exchange_msg(state, contents);
+ break;
+
+ case CERTIFICATE_VERIFY:
+ this->process_certificate_verify_msg(state, type, contents);
+ break;
+
+ case HANDSHAKE_CCS:
+ this->process_change_cipher_spec_msg(state);
+ break;
- auto trusted_CAs = m_creds.trusted_certificate_authorities("tls-server", sni_hostname);
+ case FINISHED:
+ this->process_finished_msg(state, type, contents);
+ break;
- std::vector<X509_DN> client_auth_CAs;
+ default:
+ throw Unexpected_Message("Unknown handshake message received");
+ break;
+ }
+ }
- for(auto store : trusted_CAs)
+void Server::session_resume(Server_Handshake_State& pending_state,
+ bool have_session_ticket_key,
+ Session& session_info)
+ {
+ // Only offer a resuming client a new ticket if they didn't send one this time,
+ // ie, resumed via server-side resumption. TODO: also send one if expiring soon?
+
+ const bool offer_new_session_ticket =
+ (pending_state.client_hello()->supports_session_ticket() &&
+ pending_state.client_hello()->session_ticket().empty() &&
+ have_session_ticket_key);
+
+ pending_state.server_hello(new Server_Hello(
+ pending_state.handshake_io(),
+ pending_state.hash(),
+ policy(),
+ rng(),
+ secure_renegotiation_data_for_server_hello(),
+ *pending_state.client_hello(),
+ session_info,
+ offer_new_session_ticket,
+ m_next_protocol
+ ));
+
+ secure_renegotiation_check(pending_state.server_hello());
+
+ pending_state.compute_session_keys(session_info.master_secret());
+
+ if(!save_session(session_info))
+ {
+ session_manager().remove_entry(session_info.session_id());
+
+ if(pending_state.server_hello()->supports_session_ticket()) // send an empty ticket
{
- auto subjects = store->all_subjects();
- client_auth_CAs.insert(client_auth_CAs.end(), subjects.begin(), subjects.end());
+ pending_state.new_session_ticket(
+ new New_Session_Ticket(pending_state.handshake_io(),
+ pending_state.hash())
+ );
}
+ }
- if(!client_auth_CAs.empty() && state.ciphersuite().sig_algo() != "")
+ if(pending_state.server_hello()->supports_session_ticket() && !pending_state.new_session_ticket())
+ {
+ try
{
- state.cert_req(
- new Certificate_Req(state.handshake_io(), state.hash(),
- policy(), client_auth_CAs, state.version()));
+ const SymmetricKey ticket_key = m_creds.psk("tls-server", "session-ticket", "");
- state.set_expected_next(CERTIFICATE);
+ pending_state.new_session_ticket(
+ new New_Session_Ticket(pending_state.handshake_io(),
+ pending_state.hash(),
+ session_info.encrypt(ticket_key, rng()),
+ policy().session_ticket_lifetime())
+ );
}
+ catch(...) {}
- /*
- * If the client doesn't have a cert they want to use they are
- * allowed to send either an empty cert message or proceed
- * directly to the client key exchange, so allow either case.
- */
- state.set_expected_next(CLIENT_KEX);
-
- state.server_hello_done(new Server_Hello_Done(state.handshake_io(), state.hash()));
+ if(!pending_state.new_session_ticket())
+ {
+ pending_state.new_session_ticket(
+ new New_Session_Ticket(pending_state.handshake_io(), pending_state.hash())
+ );
+ }
}
- }
- else if(type == CERTIFICATE)
- {
- state.client_certs(new Certificate(contents));
- state.set_expected_next(CLIENT_KEX);
- }
- else if(type == CLIENT_KEX)
- {
- if(state.received_handshake_msg(CERTIFICATE) && !state.client_certs()->empty())
- state.set_expected_next(CERTIFICATE_VERIFY);
- else
- state.set_expected_next(HANDSHAKE_CCS);
+ pending_state.handshake_io().send(Change_Cipher_Spec());
- state.client_kex(
- new Client_Key_Exchange(contents, state,
- state.server_rsa_kex_key,
- m_creds, policy(), rng())
- );
+ change_cipher_spec_writer(SERVER);
- state.compute_session_keys();
- }
- else if(type == CERTIFICATE_VERIFY)
- {
- state.client_verify(new Certificate_Verify(contents, state.version()));
+ pending_state.server_finished(new Finished(pending_state.handshake_io(), pending_state, SERVER));
+ pending_state.set_expected_next(HANDSHAKE_CCS);
+ }
- const std::vector<X509_Certificate>& client_certs =
- state.client_certs()->cert_chain();
+void Server::session_create(Server_Handshake_State& pending_state,
+ bool have_session_ticket_key)
+ {
+ std::map<std::string, std::vector<X509_Certificate> > cert_chains;
- const bool sig_valid =
- state.client_verify()->verify(client_certs[0], state, policy());
+ const std::string sni_hostname = pending_state.client_hello()->sni_hostname();
- state.hash().update(state.handshake_io().format(contents, type));
+ cert_chains = get_server_certs(sni_hostname, m_creds);
+
+ if(sni_hostname != "" && cert_chains.empty())
+ {
+ cert_chains = get_server_certs("", m_creds);
/*
- * Using DECRYPT_ERROR looks weird here, but per RFC 4346 is for
- * "A handshake cryptographic operation failed, including being
- * unable to correctly verify a signature, ..."
+ * Only send the unrecognized_name alert if we couldn't
+ * find any certs for the requested name but did find at
+ * least one cert to use in general. That avoids sending an
+ * unrecognized_name when a server is configured for purely
+ * anonymous operation.
*/
- if(!sig_valid)
- throw TLS_Exception(Alert::DECRYPT_ERROR, "Client cert verify failed");
-
- try
- {
- m_creds.verify_certificate_chain("tls-server", "", client_certs);
- }
- catch(std::exception& e)
- {
- throw TLS_Exception(Alert::BAD_CERTIFICATE, e.what());
- }
-
- state.set_expected_next(HANDSHAKE_CCS);
- }
- else if(type == HANDSHAKE_CCS)
- {
- state.set_expected_next(FINISHED);
- change_cipher_spec_reader(SERVER);
+ if(!cert_chains.empty())
+ send_alert(Alert(Alert::UNRECOGNIZED_NAME));
}
- else if(type == FINISHED)
+
+ Server_Hello::Settings srv_settings(
+ make_hello_random(rng(), policy()), // new session ID
+ pending_state.version(),
+ choose_ciphersuite(policy(),
+ pending_state.version(),
+ m_creds,
+ cert_chains,
+ pending_state.client_hello()),
+ choose_compression(policy(),
+ pending_state.client_hello()->compression_methods()),
+ have_session_ticket_key);
+
+ pending_state.server_hello(new Server_Hello(
+ pending_state.handshake_io(),
+ pending_state.hash(),
+ policy(),
+ rng(),
+ secure_renegotiation_data_for_server_hello(),
+ *pending_state.client_hello(),
+ srv_settings,
+ m_next_protocol)
+ );
+
+ secure_renegotiation_check(pending_state.server_hello());
+
+ const std::string sig_algo = pending_state.ciphersuite().sig_algo();
+ const std::string kex_algo = pending_state.ciphersuite().kex_algo();
+
+ if(sig_algo != "")
{
- state.set_expected_next(HANDSHAKE_NONE);
+ BOTAN_ASSERT(!cert_chains[sig_algo].empty(),
+ "Attempting to send empty certificate chain");
- state.client_finished(new Finished(contents));
+ pending_state.server_certs(new Certificate(pending_state.handshake_io(),
+ pending_state.hash(),
+ cert_chains[sig_algo]));
+ }
- if(!state.client_finished()->verify(state, CLIENT))
- throw TLS_Exception(Alert::DECRYPT_ERROR,
- "Finished message didn't verify");
+ Private_Key* private_key = nullptr;
- if(!state.server_finished())
- {
- // already sent finished if resuming, so this is a new session
+ if(kex_algo == "RSA" || sig_algo != "")
+ {
+ private_key = m_creds.private_key_for(
+ pending_state.server_certs()->cert_chain()[0],
+ "tls-server",
+ sni_hostname);
- state.hash().update(state.handshake_io().format(contents, type));
+ if(!private_key)
+ throw Internal_Error("No private key located for associated server cert");
+ }
- Session session_info(
- state.server_hello()->session_id(),
- state.session_keys().master_secret(),
- state.server_hello()->version(),
- state.server_hello()->ciphersuite(),
- state.server_hello()->compression_method(),
- SERVER,
- state.server_hello()->supports_extended_master_secret(),
- get_peer_cert_chain(state),
- std::vector<byte>(),
- Server_Information(state.client_hello()->sni_hostname()),
- state.srp_identifier(),
- state.server_hello()->srtp_profile()
- );
+ if(kex_algo == "RSA")
+ {
+ pending_state.set_server_rsa_kex_key(private_key);
+ }
+ else
+ {
+ pending_state.server_kex(new Server_Key_Exchange(pending_state.handshake_io(),
+ pending_state, policy(),
+ m_creds, rng(), private_key));
+ }
- if(save_session(session_info))
- {
- if(state.server_hello()->supports_session_ticket())
- {
- try
- {
- const SymmetricKey ticket_key = m_creds.psk("tls-server", "session-ticket", "");
-
- state.new_session_ticket(
- new New_Session_Ticket(state.handshake_io(),
- state.hash(),
- session_info.encrypt(ticket_key, rng()),
- policy().session_ticket_lifetime())
- );
- }
- catch(...) {}
- }
- else
- session_manager().save(session_info);
- }
+ auto trusted_CAs = m_creds.trusted_certificate_authorities("tls-server", sni_hostname);
- if(!state.new_session_ticket() &&
- state.server_hello()->supports_session_ticket())
- {
- state.new_session_ticket(
- new New_Session_Ticket(state.handshake_io(), state.hash())
- );
- }
+ std::vector<X509_DN> client_auth_CAs;
- state.handshake_io().send(Change_Cipher_Spec());
+ for(auto store : trusted_CAs)
+ {
+ auto subjects = store->all_subjects();
+ client_auth_CAs.insert(client_auth_CAs.end(), subjects.begin(), subjects.end());
+ }
- change_cipher_spec_writer(SERVER);
+ if(!client_auth_CAs.empty() && pending_state.ciphersuite().sig_algo() != "")
+ {
+ pending_state.cert_req(
+ new Certificate_Req(pending_state.handshake_io(),
+ pending_state.hash(),
+ policy(),
+ client_auth_CAs,
+ pending_state.version()));
+
+ pending_state.set_expected_next(CERTIFICATE);
+ }
- state.server_finished(new Finished(state.handshake_io(), state, SERVER));
- }
+ /*
+ * If the client doesn't have a cert they want to use they are
+ * allowed to send either an empty cert message or proceed
+ * directly to the client key exchange, so allow either case.
+ */
+ pending_state.set_expected_next(CLIENT_KEX);
- activate_session();
- }
- else
- throw Unexpected_Message("Unknown handshake message received");
+ pending_state.server_hello_done(new Server_Hello_Done(pending_state.handshake_io(), pending_state.hash()));
}
-
}
}
diff --git a/src/lib/tls/tls_server.h b/src/lib/tls/tls_server.h
index 5ea2a1318..051eda445 100644
--- a/src/lib/tls/tls_server.h
+++ b/src/lib/tls/tls_server.h
@@ -1,6 +1,7 @@
/*
* TLS Server
* (C) 2004-2011 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -12,10 +13,13 @@
#include <botan/credentials_manager.h>
#include <vector>
+
namespace Botan {
namespace TLS {
+class Server_Handshake_State;
+
/**
* TLS Server
*/
@@ -26,7 +30,39 @@ class BOTAN_DLL Server final : public Channel
/**
* Server initialization
+ *
+ * @param callbacks contains a set of callback function references
+ * required by the TLS client.
+ *
+ * @param session_manager manages session state
+ *
+ * @param creds manages application/user credentials
+ *
+ * @param policy specifies other connection policy information
+ *
+ * @param rng a random number generator
+ *
+ * @param is_datagram set to true if this server should expect DTLS
+ * connections. Otherwise TLS connections are expected.
+ *
+ * @param reserved_io_buffer_size This many bytes of memory will
+ * be preallocated for the read and write buffers. Smaller
+ * values just mean reallocations and copies are more likely.
*/
+ Server(Callbacks& callbacks,
+ Session_Manager& session_manager,
+ Credentials_Manager& creds,
+ const Policy& policy,
+ RandomNumberGenerator& rng,
+ bool is_datagram = false,
+ size_t reserved_io_buffer_size = TLS::Server::IO_BUF_DEFAULT_SIZE
+ );
+
+ /**
+ * DEPRECATED. This constructor is only provided for backward
+ * compatibility and should not be used in new implementations.
+ */
+ BOTAN_DEPRECATED("Use TLS::Server(TLS::Callbacks ...)")
Server(output_fn output,
data_cb data_cb,
alert_cb alert_cb,
@@ -37,9 +73,14 @@ class BOTAN_DLL Server final : public Channel
RandomNumberGenerator& rng,
next_protocol_fn next_proto = next_protocol_fn(),
bool is_datagram = false,
- size_t reserved_io_buffer_size = 16*1024
+ size_t reserved_io_buffer_size = TLS::Server::IO_BUF_DEFAULT_SIZE
);
+ /**
+ * DEPRECATED. This constructor is only provided for backward
+ * compatibility and should not be used in new implementations.
+ */
+ BOTAN_DEPRECATED("Use TLS::Server(TLS::Callbacks ...)")
Server(output_fn output,
data_cb data_cb,
alert_cb alert_cb,
@@ -73,12 +114,40 @@ class BOTAN_DLL Server final : public Channel
Handshake_Type type,
const std::vector<byte>& contents) override;
+ void process_client_hello_msg(const Handshake_State* active_state,
+ Server_Handshake_State& pending_state,
+ const std::vector<byte>& contents);
+
+ void process_certificate_msg(Server_Handshake_State& pending_state,
+ const std::vector<byte>& contents);
+
+ void process_client_key_exchange_msg(Server_Handshake_State& pending_state,
+ const std::vector<byte>& contents);
+
+ void process_change_cipher_spec_msg(Server_Handshake_State& pending_state);
+
+ void process_certificate_verify_msg(Server_Handshake_State& pending_state,
+ Handshake_Type type,
+ const std::vector<byte>& contents);
+
+ void process_finished_msg(Server_Handshake_State& pending_state,
+ Handshake_Type type,
+ const std::vector<byte>& contents);
+
+ void session_resume(Server_Handshake_State& pending_state,
+ bool have_session_ticket_key,
+ Session& session_info);
+
+ void session_create(Server_Handshake_State& pending_state,
+ bool have_session_ticket_key);
+
Handshake_State* new_handshake_state(Handshake_IO* io) override;
Credentials_Manager& m_creds;
+ std::string m_next_protocol;
+ // Set by deprecated constructor, Server calls both this fn and Callbacks version
next_protocol_fn m_choose_next_protocol;
- std::string m_next_protocol;
};
}
diff --git a/src/lib/tls/tls_session.cpp b/src/lib/tls/tls_session.cpp
index 18c9b357c..d6b52846f 100644
--- a/src/lib/tls/tls_session.cpp
+++ b/src/lib/tls/tls_session.cpp
@@ -24,6 +24,7 @@ Session::Session(const std::vector<byte>& session_identifier,
byte compression_method,
Connection_Side side,
bool extended_master_secret,
+ bool encrypt_then_mac,
const std::vector<X509_Certificate>& certs,
const std::vector<byte>& ticket,
const Server_Information& server_info,
@@ -39,6 +40,7 @@ Session::Session(const std::vector<byte>& session_identifier,
m_connection_side(side),
m_srtp_profile(srtp_profile),
m_extended_master_secret(extended_master_secret),
+ m_encrypt_then_mac(encrypt_then_mac),
m_peer_certs(certs),
m_server_info(server_info),
m_srp_identifier(srp_identifier)
@@ -83,6 +85,7 @@ Session::Session(const byte ber[], size_t ber_len)
.decode_integer_type(side_code)
.decode_integer_type(fragment_size)
.decode(m_extended_master_secret)
+ .decode(m_encrypt_then_mac)
.decode(m_master_secret, OCTET_STRING)
.decode(peer_cert_bits, OCTET_STRING)
.decode(server_hostname)
@@ -142,6 +145,7 @@ secure_vector<byte> Session::DER_encode() const
.encode(static_cast<size_t>(m_connection_side))
.encode(static_cast<size_t>(/*old fragment size*/0))
.encode(m_extended_master_secret)
+ .encode(m_encrypt_then_mac)
.encode(m_master_secret, OCTET_STRING)
.encode(peer_cert_bits, OCTET_STRING)
.encode(ASN1_String(m_server_info.hostname(), UTF8_STRING))
diff --git a/src/lib/tls/tls_session.h b/src/lib/tls/tls_session.h
index 8ca646cf2..643b79ac6 100644
--- a/src/lib/tls/tls_session.h
+++ b/src/lib/tls/tls_session.h
@@ -38,7 +38,8 @@ class BOTAN_DLL Session
m_compression_method(0),
m_connection_side(static_cast<Connection_Side>(0)),
m_srtp_profile(0),
- m_extended_master_secret(false)
+ m_extended_master_secret(false),
+ m_encrypt_then_mac(false)
{}
/**
@@ -51,6 +52,7 @@ class BOTAN_DLL Session
byte compression_method,
Connection_Side side,
bool supports_extended_master_secret,
+ bool supports_encrypt_then_mac,
const std::vector<X509_Certificate>& peer_certs,
const std::vector<byte>& session_ticket,
const Server_Information& server_info,
@@ -157,6 +159,8 @@ class BOTAN_DLL Session
bool supports_extended_master_secret() const { return m_extended_master_secret; }
+ bool supports_encrypt_then_mac() const { return m_encrypt_then_mac; }
+
/**
* Return the certificate chain of the peer (possibly empty)
*/
@@ -180,7 +184,7 @@ class BOTAN_DLL Session
const Server_Information& server_info() const { return m_server_info; }
private:
- enum { TLS_SESSION_PARAM_STRUCT_VERSION = 20160103 };
+ enum { TLS_SESSION_PARAM_STRUCT_VERSION = 20160812};
std::chrono::system_clock::time_point m_start_time;
@@ -194,6 +198,7 @@ class BOTAN_DLL Session
Connection_Side m_connection_side;
u16bit m_srtp_profile;
bool m_extended_master_secret;
+ bool m_encrypt_then_mac;
std::vector<X509_Certificate> m_peer_certs;
Server_Information m_server_info; // optional
diff --git a/src/lib/utils/os_utils.cpp b/src/lib/utils/os_utils.cpp
index eab509984..2f17da952 100644
--- a/src/lib/utils/os_utils.cpp
+++ b/src/lib/utils/os_utils.cpp
@@ -40,49 +40,92 @@ uint32_t get_process_id()
uint64_t get_processor_timestamp()
{
- uint64_t rtc = 0;
-
#if defined(BOTAN_TARGET_OS_HAS_QUERY_PERF_COUNTER)
LARGE_INTEGER tv;
::QueryPerformanceCounter(&tv);
- rtc = tv.QuadPart;
-#endif
-
-#if defined(BOTAN_USE_GCC_INLINE_ASM)
+ return tv.QuadPart;
-#if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY)
+#elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_CPU_IS_X86_FAMILY)
if(CPUID::has_rdtsc()) // not available on all x86 CPUs
{
uint32_t rtc_low = 0, rtc_high = 0;
asm volatile("rdtsc" : "=d" (rtc_high), "=a" (rtc_low));
- rtc = (static_cast<u64bit>(rtc_high) << 32) | rtc_low;
+ return (static_cast<u64bit>(rtc_high) << 32) | rtc_low;
}
-#elif defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY)
+#elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY)
uint32_t rtc_low = 0, rtc_high = 0;
asm volatile("mftbu %0; mftb %1" : "=r" (rtc_high), "=r" (rtc_low));
- rtc = (static_cast<u64bit>(rtc_high) << 32) | rtc_low;
+ return (static_cast<u64bit>(rtc_high) << 32) | rtc_low;
-#elif defined(BOTAN_TARGET_ARCH_IS_ALPHA)
+#elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_ARCH_IS_ALPHA)
+ uint64_t rtc = 0;
asm volatile("rpcc %0" : "=r" (rtc));
+ return rtc;
-#elif defined(BOTAN_TARGET_ARCH_IS_SPARC64) && !defined(BOTAN_TARGET_OS_IS_OPENBSD)
// OpenBSD does not trap access to the %tick register
+#elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_ARCH_IS_SPARC64) && !defined(BOTAN_TARGET_OS_IS_OPENBSD)
+ uint64_t rtc = 0;
asm volatile("rd %%tick, %0" : "=r" (rtc));
+ return rtc;
-#elif defined(BOTAN_TARGET_ARCH_IS_IA64)
+#elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_ARCH_IS_IA64)
+ uint64_t rtc = 0;
asm volatile("mov %0=ar.itc" : "=r" (rtc));
+ return rtc;
-#elif defined(BOTAN_TARGET_ARCH_IS_S390X)
+#elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_ARCH_IS_S390X)
+ uint64_t rtc = 0;
asm volatile("stck 0(%0)" : : "a" (&rtc) : "memory", "cc");
+ return rtc;
-#elif defined(BOTAN_TARGET_ARCH_IS_HPPA)
+#elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_ARCH_IS_HPPA)
+ uint64_t rtc = 0;
asm volatile("mfctl 16,%0" : "=r" (rtc)); // 64-bit only?
+ return rtc;
#endif
+ /*
+ If we got here either we either don't have an asm instruction
+ above, or (for x86) RDTSC is not available at runtime. Try some
+ clock_gettimes and return the first one that works, or otherwise
+ fall back to std::chrono.
+ */
+
+#if defined(BOTAN_TARGET_OS_HAS_CLOCK_GETTIME)
+
+ // The ordering here is somewhat arbitrary...
+ const clockid_t clock_types[] = {
+#if defined(CLOCK_MONOTONIC_HR)
+ CLOCK_MONOTONIC_HR,
+#endif
+#if defined(CLOCK_MONOTONIC_RAW)
+ CLOCK_MONOTONIC_RAW,
#endif
+#if defined(CLOCK_MONOTONIC)
+ CLOCK_MONOTONIC,
+#endif
+#if defined(CLOCK_PROCESS_CPUTIME_ID)
+ CLOCK_PROCESS_CPUTIME_ID,
+#endif
+#if defined(CLOCK_THREAD_CPUTIME_ID)
+ CLOCK_THREAD_CPUTIME_ID,
+#endif
+ };
- return rtc;
+ for(clockid_t clock : clock_types)
+ {
+ struct timespec ts;
+ if(::clock_gettime(clock, &ts) == 0)
+ {
+ return (static_cast<uint64_t>(ts.tv_sec) * 1000000000) + static_cast<uint64_t>(ts.tv_nsec);
+ }
+ }
+#endif
+
+ // Plain C++11 fallback
+ auto now = std::chrono::high_resolution_clock::now().time_since_epoch();
+ return std::chrono::duration_cast<std::chrono::nanoseconds>(now).count();
}
uint64_t get_system_timestamp_ns()
diff --git a/src/lib/utils/simd/simd_32.h b/src/lib/utils/simd/simd_32.h
index 0b4ca8f03..c29c55c7a 100644
--- a/src/lib/utils/simd/simd_32.h
+++ b/src/lib/utils/simd/simd_32.h
@@ -100,7 +100,9 @@ class SIMD_4x32
__vector unsigned char perm = vec_lvsl(0, in_32);
- perm = vec_xor(perm, vec_splat_u8(3));
+#if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN)
+ perm = vec_xor(perm, vec_splat_u8(3)); // bswap vector
+#endif
R0 = vec_perm(R0, R1, perm);
@@ -124,6 +126,10 @@ class SIMD_4x32
__vector unsigned char perm = vec_lvsl(0, in_32);
+#if defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN)
+ perm = vec_xor(perm, vec_splat_u8(3)); // bswap vector
+#endif
+
R0 = vec_perm(R0, R1, perm);
return SIMD_4x32(R0);
@@ -142,7 +148,9 @@ class SIMD_4x32
#elif defined(BOTAN_SIMD_USE_ALTIVEC)
__vector unsigned char perm = vec_lvsl(0, static_cast<u32bit*>(nullptr));
+#if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN)
perm = vec_xor(perm, vec_splat_u8(3)); // bswap vector
+#endif
union {
__vector unsigned int V;
diff --git a/src/scripts/ci/travis/after_success.sh b/src/scripts/ci/travis/after_success.sh
index a9acab3c9..0bc723b7f 100755
--- a/src/scripts/ci/travis/after_success.sh
+++ b/src/scripts/ci/travis/after_success.sh
@@ -4,9 +4,9 @@ which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if avai
if [ "$BUILD_MODE" = "coverage" ]; then
GCOV="/usr/bin/gcov-4.8"
- /tmp/usr/bin/lcov --gcov-tool "$GCOV" --directory . --capture --output-file coverage.info
- /tmp/usr/bin/lcov --gcov-tool "$GCOV" --remove coverage.info 'tests/*' '/usr/*' --output-file coverage.info
- /tmp/usr/bin/lcov --gcov-tool "$GCOV" --list coverage.info
+ /tmp/usr/bin/lcov --gcov-tool "$GCOV" --directory . --capture --output-file $(pwd)/coverage.info.in
+ /tmp/usr/bin/lcov --gcov-tool "$GCOV" --remove $(pwd)/coverage.info.in 'tests/*' '/usr/*' --output-file $(pwd)/coverage.info
+ /tmp/usr/bin/lcov --gcov-tool "$GCOV" --list $(pwd)/coverage.info
LD_LIBRARY_PATH=. coverage run --branch src/python/botan.py
diff --git a/src/tests/data/aead/eax.vec b/src/tests/data/aead/eax.vec
index 6b6a408a7..4e7365f9b 100644
--- a/src/tests/data/aead/eax.vec
+++ b/src/tests/data/aead/eax.vec
@@ -539,310 +539,6 @@ AD = 000102030405060708090A0B0C0D0E0F
In = 000102030405060708090A0B0C0D0E0F
Out = 60A315193F58144F5701D547C79FEEED912FDBDB05467DF5
-[RC5/EAX]
-
-Key = 0001020304050607
-Nonce =
-AD =
-In =
-Out = 169C7954341EF44D
-
-Key = 169C7954341EF44D
-Nonce = 00
-AD = 00
-In = 00
-Out = 22DABFDA9A0B0BA067
-
-Key = DABFDA9A0B0BA067
-Nonce = 0001
-AD = 0001
-In = 0001
-Out = 2E546A3D6D9AA5877C5A
-
-Key = 6A3D6D9AA5877C5A
-Nonce = 000102
-AD = 000102
-In = 000102
-Out = 2A6ECF2A34A3AF5DE8919E
-
-Key = 2A34A3AF5DE8919E
-Nonce = 00010203
-AD = 00010203
-In = 00010203
-Out = 9CC5F84FD3F673EDAF75E3B5
-
-Key = D3F673EDAF75E3B5
-Nonce = 0001020304
-AD = 0001020304
-In = 0001020304
-Out = FF5611756CCC647FAAC8D49BF1
-
-Key = CC647FAAC8D49BF1
-Nonce = 000102030405
-AD = 000102030405
-In = 000102030405
-Out = 74C939BEB31CC335999CCFE8F5FA
-
-Key = C335999CCFE8F5FA
-Nonce = 00010203040506
-AD = 00010203040506
-In = 00010203040506
-Out = 7976B6F7709B5F2A7969C5FD063A88
-
-Key = 2A7969C5FD063A88
-Nonce = 0001020304050607
-AD = 0001020304050607
-In = 0001020304050607
-Out = 421EEC50222761742C9BFB1EAC3C54A2
-
-Key = 2C9BFB1EAC3C54A2
-Nonce = 000102030405060708
-AD = 000102030405060708
-In = 000102030405060708
-Out = 6A4761CD266B1C0ECB3EA3CCEBC85FAC4E
-
-Key = 3EA3CCEBC85FAC4E
-Nonce = 00010203040506070809
-AD = 00010203040506070809
-In = 00010203040506070809
-Out = 7C09201098E764239A2E8043ABA9BF4D5AEE
-
-Key = 8043ABA9BF4D5AEE
-Nonce = 000102030405060708090A
-AD = 000102030405060708090A
-In = 000102030405060708090A
-Out = 8CE26277562F646DE33C88D72AED48895E3B40
-
-Key = D72AED48895E3B40
-Nonce = 000102030405060708090A0B
-AD = 000102030405060708090A0B
-In = 000102030405060708090A0B
-Out = 52150F44D37D121560DA87F658E865E22B485906
-
-Key = 58E865E22B485906
-Nonce = 000102030405060708090A0B0C
-AD = 000102030405060708090A0B0C
-In = 000102030405060708090A0B0C
-Out = BA0A73B45F93ECFBFC3AB3D8D0683D52FA47FB1A52
-
-Key = 683D52FA47FB1A52
-Nonce = 000102030405060708090A0B0C0D
-AD = 000102030405060708090A0B0C0D
-In = 000102030405060708090A0B0C0D
-Out = 96546CBE01054AD24CC95DB54724D80D0D530E5D1DDE
-
-Key = D80D0D530E5D1DDE
-Nonce = 000102030405060708090A0B0C0D0E
-AD = 000102030405060708090A0B0C0D0E
-In = 000102030405060708090A0B0C0D0E
-Out = 61E654BB18CD26FC36C09F874DC2C7C65884CB9D9FEC1E
-
-Key = C65884CB9D9FEC1E
-Nonce = 000102030405060708090A0B0C0D0E0F
-AD = 000102030405060708090A0B0C0D0E0F
-In = 000102030405060708090A0B0C0D0E0F
-Out = 1D77B8BF02CDEAB4A707C07628826D5BF18D1730C3D64701
-
-[RC6/EAX]
-
-Key = 000102030405060708090A0B0C0D0E0F
-Nonce =
-AD =
-In =
-Out = 1DF8B0B92A3F0C951C425AF4830E63FD
-
-Key = 1DF8B0B92A3F0C951C425AF4830E63FD
-Nonce = 00
-AD = 00
-In = 00
-Out = 1A8A2959EBBE90180999994DEB7036DB85
-
-Key = 8A2959EBBE90180999994DEB7036DB85
-Nonce = 0001
-AD = 0001
-In = 0001
-Out = 435D7EF00CB57DB7B4155DB530D75CE6B025
-
-Key = 7EF00CB57DB7B4155DB530D75CE6B025
-Nonce = 000102
-AD = 000102
-In = 000102
-Out = 08A6CF2ED6AF0F2D5BAB05F623D389480A01F2
-
-Key = 2ED6AF0F2D5BAB05F623D389480A01F2
-Nonce = 00010203
-AD = 00010203
-In = 00010203
-Out = A86E54D3FC69547C8BD922A5BF2F7B26C4D20F98
-
-Key = FC69547C8BD922A5BF2F7B26C4D20F98
-Nonce = 0001020304
-AD = 0001020304
-In = 0001020304
-Out = ED0822E4390007A3C6DEFC6C912C0E5B853B520368
-
-Key = 0007A3C6DEFC6C912C0E5B853B520368
-Nonce = 000102030405
-AD = 000102030405
-In = 000102030405
-Out = 7BEFC7FD4054D32C43A4D1086D57C5BCFAEE04EBC600
-
-Key = D32C43A4D1086D57C5BCFAEE04EBC600
-Nonce = 00010203040506
-AD = 00010203040506
-In = 00010203040506
-Out = 5235E58E79287CA27E9C781327C0FC7C55410EB0C828A9
-
-Key = A27E9C781327C0FC7C55410EB0C828A9
-Nonce = 0001020304050607
-AD = 0001020304050607
-In = 0001020304050607
-Out = CEB5EE99BE521F4D547F46383987F2A3582A81A3BCF9B280
-
-Key = 547F46383987F2A3582A81A3BCF9B280
-Nonce = 000102030405060708
-AD = 000102030405060708
-In = 000102030405060708
-Out = 0358B063D5F99C3770C0A73730512CDA6AD49599775D59EDA1
-
-Key = C0A73730512CDA6AD49599775D59EDA1
-Nonce = 00010203040506070809
-AD = 00010203040506070809
-In = 00010203040506070809
-Out = 434B9AEE07DFADD0A332499BD88881E558E09A8E822BE27D2496
-
-Key = 499BD88881E558E09A8E822BE27D2496
-Nonce = 000102030405060708090A
-AD = 000102030405060708090A
-In = 000102030405060708090A
-Out = D47849E650F350BB622D74638E37A84E7FAAF8F5D77F1B061773DC
-
-Key = 638E37A84E7FAAF8F5D77F1B061773DC
-Nonce = 000102030405060708090A0B
-AD = 000102030405060708090A0B
-In = 000102030405060708090A0B
-Out = 814592F568284085E79A024B9EB1405E8422FE50BC0D88D837A2C650
-
-Key = 9EB1405E8422FE50BC0D88D837A2C650
-Nonce = 000102030405060708090A0B0C
-AD = 000102030405060708090A0B0C
-In = 000102030405060708090A0B0C
-Out = 6F2B55EC91B591082053AF692EC48F91EF01AA43A1EE3B36D233DDD48B
-
-Key = C48F91EF01AA43A1EE3B36D233DDD48B
-Nonce = 000102030405060708090A0B0C0D
-AD = 000102030405060708090A0B0C0D
-In = 000102030405060708090A0B0C0D
-Out = 506CBDD2901838EE2F178B6953DA03778957F536509BFCA577B23A18F726
-
-Key = 03778957F536509BFCA577B23A18F726
-Nonce = 000102030405060708090A0B0C0D0E
-AD = 000102030405060708090A0B0C0D0E
-In = 000102030405060708090A0B0C0D0E
-Out = 446EE435D3D1848B51BB8C5F7BE4A11129EAEAADE534940546D43242A4C839
-
-Key = 1129EAEAADE534940546D43242A4C839
-Nonce = 000102030405060708090A0B0C0D0E0F
-AD = 000102030405060708090A0B0C0D0E0F
-In = 000102030405060708090A0B0C0D0E0F
-Out = FB9D2B150C42465B1685D8F069CC06DB41E2940F5DC63CB4E2FBEC25ED8A31E6
-
-Key = 41E2940F5DC63CB4E2FBEC25ED8A31E6
-Nonce = 000102030405060708090A0B0C0D0E0F10
-AD = 000102030405060708090A0B0C0D0E0F10
-In = 000102030405060708090A0B0C0D0E0F10
-Out = 9684F683260107BE8FEBBEE1D3EEDAA7BDBAE7C116F7FF96631F4ACEE95C65CEF3
-
-Key = BAE7C116F7FF96631F4ACEE95C65CEF3
-Nonce = 000102030405060708090A0B0C0D0E0F1011
-AD = 000102030405060708090A0B0C0D0E0F1011
-In = 000102030405060708090A0B0C0D0E0F1011
-Out = 5082B1FE48CD3AB58F63C2DCFDD4069AC73619AC7B8EE315CBB7131A283851B32266
-
-Key = 19AC7B8EE315CBB7131A283851B32266
-Nonce = 000102030405060708090A0B0C0D0E0F101112
-AD = 000102030405060708090A0B0C0D0E0F101112
-In = 000102030405060708090A0B0C0D0E0F101112
-Out = 8C72AE495B6F003A3C784D144E84E88885F78EFA4CEC023740A8D670E351FBCF62C1CB
-
-Key = FA4CEC023740A8D670E351FBCF62C1CB
-Nonce = 000102030405060708090A0B0C0D0E0F10111213
-AD = 000102030405060708090A0B0C0D0E0F10111213
-In = 000102030405060708090A0B0C0D0E0F10111213
-Out = 815D6361C7AE34C9D796ADF9C71ABC46AEF88BC99A1F7288C61A6623B9A82748137ED7CC
-
-Key = 9A1F7288C61A6623B9A82748137ED7CC
-Nonce = 000102030405060708090A0B0C0D0E0F1011121314
-AD = 000102030405060708090A0B0C0D0E0F1011121314
-In = 000102030405060708090A0B0C0D0E0F1011121314
-Out = 904A853E2E96BD2B85AAB3F5DFB900E9B3642EE6679AA90DBDD461CAD20495DCFBCB513DD2
-
-Key = 9AA90DBDD461CAD20495DCFBCB513DD2
-Nonce = 000102030405060708090A0B0C0D0E0F101112131415
-AD = 000102030405060708090A0B0C0D0E0F101112131415
-In = 000102030405060708090A0B0C0D0E0F101112131415
-Out = 79D738A462F727B3D3C529ED999B6FDCCD991D1C5A4DBF0987BEDDE650D73CAE7D380FED3431
-
-Key = BF0987BEDDE650D73CAE7D380FED3431
-Nonce = 000102030405060708090A0B0C0D0E0F10111213141516
-AD = 000102030405060708090A0B0C0D0E0F10111213141516
-In = 000102030405060708090A0B0C0D0E0F10111213141516
-Out = B2DEFDB7D503A84E83155A04B8DE8C8DBB68C2FC475007B7CE900CF43CD518024123C76F6DA328
-
-Key = B7CE900CF43CD518024123C76F6DA328
-Nonce = 000102030405060708090A0B0C0D0E0F1011121314151617
-AD = 000102030405060708090A0B0C0D0E0F1011121314151617
-In = 000102030405060708090A0B0C0D0E0F1011121314151617
-Out = 9E723E15439E12F6C46DF8A309AE1E97B6FD18436259CFB0DF8B6E1E23512CC4CF5FF531A1908F69
-
-Key = DF8B6E1E23512CC4CF5FF531A1908F69
-Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718
-AD = 000102030405060708090A0B0C0D0E0F101112131415161718
-In = 000102030405060708090A0B0C0D0E0F101112131415161718
-Out = A7F0AD03CEBCC9202718AA164886E1026975306A664C5AC7A94A771BF8B9A4325705C85E5499FD98E9
-
-Key = 4A771BF8B9A4325705C85E5499FD98E9
-Nonce = 000102030405060708090A0B0C0D0E0F10111213141516171819
-AD = 000102030405060708090A0B0C0D0E0F10111213141516171819
-In = 000102030405060708090A0B0C0D0E0F10111213141516171819
-Out = A53A92AD1C6835F28E04EF591E783D36F3D76E489B31B87BEB7AAA263B52A6E6A043DE4D7029D4DC73F5
-
-Key = AA263B52A6E6A043DE4D7029D4DC73F5
-Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A
-AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A
-In = 000102030405060708090A0B0C0D0E0F101112131415161718191A
-Out = 79BE3C38291A7F77E932C8A9DEAC08DE6442EA9B3895B101A14E7B33B84DE06342E675E019CD0237292ED0
-
-Key = 33B84DE06342E675E019CD0237292ED0
-Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B
-AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B
-In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B
-Out = FA108123C5A69571CFDFE8C3D00535121FDE3096DDC0D700F8F26A5A764025D7CA1A3F2C54D28956423B0C77
-
-Key = 764025D7CA1A3F2C54D28956423B0C77
-Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C
-AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C
-In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C
-Out = 36EC2D67FD977BD2B73DB6D8EB756B3EADA13690E1B6DFC12A4781B34B4BC6B38DE3B02283D92F4DF19A5C48C5
-
-Key = 4BC6B38DE3B02283D92F4DF19A5C48C5
-Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D
-AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D
-In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D
-Out = 96D3243C945905C9732B5927E46F00886D511463B38C86002FC26B65AB8C5B5511CDEC35687AB8425AB22D58B4F1
-
-Key = 5B5511CDEC35687AB8425AB22D58B4F1
-Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E
-AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E
-In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E
-Out = 9CF83B87BEA3374AF7722E999863E3DABB858B0383383EAC7757F5B80FD44B1E0CBC961940FDA93B73A92DACFD67F3
-
-Key = 1E0CBC961940FDA93B73A92DACFD67F3
-Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
-AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
-In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
-Out = CE3BC3C9FA5EF4AFE5272B3EDD24B1B003FED2C2E501528CFF44D3FABFF52CB4DC94FDDC78AAB2B7CAA1E1EF149AC355
-
[Twofish/EAX]
Key = 000102030405060708090A0B0C0D0E0F
@@ -1043,214 +739,6 @@ AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Out = 2B1890EB9FC0B8293E45D42D2126F4072754AA54E220C853C5F20FBA86BE07951A1B15BBC287372FB9AF035FB124B6A1
-[SAFER-SK(10)/EAX]
-
-Key = 000102030405060708090A0B0C0D0E0F
-Nonce =
-AD =
-In =
-Out = 22D90A75BBA5F298
-
-Key = 22D90A75BBA5F29822D90A75BBA5F298
-Nonce = 00
-AD = 00
-In = 00
-Out = 3F98C31AB2DE61DE82
-
-Key = 98C31AB2DE61DE8298C31AB2DE61DE82
-Nonce = 0001
-AD = 0001
-In = 0001
-Out = 584DF4701D4A1A09928C
-
-Key = F4701D4A1A09928CF4701D4A1A09928C
-Nonce = 000102
-AD = 000102
-In = 000102
-Out = B9DEAD6E221A98505153DA
-
-Key = 6E221A98505153DA6E221A98505153DA
-Nonce = 00010203
-AD = 00010203
-In = 00010203
-Out = 06D4A6EB0E57C51B96BA13B6
-
-Key = 0E57C51B96BA13B60E57C51B96BA13B6
-Nonce = 0001020304
-AD = 0001020304
-In = 0001020304
-Out = 7B58B441CAE28CCF271F5D0A29
-
-Key = E28CCF271F5D0A29E28CCF271F5D0A29
-Nonce = 000102030405
-AD = 000102030405
-In = 000102030405
-Out = 7950E0D1EC242ACDDE6E38180C07
-
-Key = 2ACDDE6E38180C072ACDDE6E38180C07
-Nonce = 00010203040506
-AD = 00010203040506
-In = 00010203040506
-Out = 65A4F4E098D7C67DC1C9E9602BACF2
-
-Key = 7DC1C9E9602BACF27DC1C9E9602BACF2
-Nonce = 0001020304050607
-AD = 0001020304050607
-In = 0001020304050607
-Out = FEBE4E72BAA0848FC4607EA3F138BAD9
-
-Key = C4607EA3F138BAD9C4607EA3F138BAD9
-Nonce = 000102030405060708
-AD = 000102030405060708
-In = 000102030405060708
-Out = 9B7BD6D6D655985AA38B2C58A9530EA6AC
-
-Key = 8B2C58A9530EA6AC8B2C58A9530EA6AC
-Nonce = 00010203040506070809
-AD = 00010203040506070809
-In = 00010203040506070809
-Out = 60C92F925D147847020351E6F5F6DC996F84
-
-Key = 51E6F5F6DC996F8451E6F5F6DC996F84
-Nonce = 000102030405060708090A
-AD = 000102030405060708090A
-In = 000102030405060708090A
-Out = 7B40769370E651F64AA65474F1F8A8D3F4B9AF
-
-Key = 74F1F8A8D3F4B9AF74F1F8A8D3F4B9AF
-Nonce = 000102030405060708090A0B
-AD = 000102030405060708090A0B
-In = 000102030405060708090A0B
-Out = 7215832C2FB9C54DF7A9C6869BF9AEF14F9151D1
-
-Key = 9BF9AEF14F9151D19BF9AEF14F9151D1
-Nonce = 000102030405060708090A0B0C
-AD = 000102030405060708090A0B0C
-In = 000102030405060708090A0B0C
-Out = AD0F9C79008572AB8AE2466EFFF375D0583D921B69
-
-Key = F375D0583D921B69F375D0583D921B69
-Nonce = 000102030405060708090A0B0C0D
-AD = 000102030405060708090A0B0C0D
-In = 000102030405060708090A0B0C0D
-Out = C05076E2C330A0D25D7CEC80597F843C12F84B00A8E0
-
-Key = 843C12F84B00A8E0843C12F84B00A8E0
-Nonce = 000102030405060708090A0B0C0D0E
-AD = 000102030405060708090A0B0C0D0E
-In = 000102030405060708090A0B0C0D0E
-Out = D18F0563AB0278140B0CD9A9B07B34262B1688E16A171E
-
-Key = 262B1688E16A171E262B1688E16A171E
-Nonce = 000102030405060708090A0B0C0D0E0F
-AD = 000102030405060708090A0B0C0D0E0F
-In = 000102030405060708090A0B0C0D0E0F
-Out = 650747091F5C532EE37D2D78EE1EC6051BAC36144F9A0E8D
-
-[RC2/EAX]
-
-Key = 0001020304050607
-Nonce =
-AD =
-In =
-Out = D6CC8632EEE0F46B
-
-Key = D6CC8632EEE0F46B
-Nonce = 00
-AD = 00
-In = 00
-Out = 4CEA19572CB8970CB4
-
-Key = EA19572CB8970CB4
-Nonce = 0001
-AD = 0001
-In = 0001
-Out = 55373EDD3253F6D0C1A8
-
-Key = 3EDD3253F6D0C1A8
-Nonce = 000102
-AD = 000102
-In = 000102
-Out = 206FA620FA88F03F240D31
-
-Key = 20FA88F03F240D31
-Nonce = 00010203
-AD = 00010203
-In = 00010203
-Out = 17EE8B40702E8194F1FCBFDE
-
-Key = 702E8194F1FCBFDE
-Nonce = 0001020304
-AD = 0001020304
-In = 0001020304
-Out = 2A8928713631C5534786E15FB3
-
-Key = 31C5534786E15FB3
-Nonce = 000102030405
-AD = 000102030405
-In = 000102030405
-Out = 3A6AEDC7066B3C663A4081E1D243
-
-Key = 3C663A4081E1D243
-Nonce = 00010203040506
-AD = 00010203040506
-In = 00010203040506
-Out = 8BC5203947A6446AAC806C92BFBD6E
-
-Key = 6AAC806C92BFBD6E
-Nonce = 0001020304050607
-AD = 0001020304050607
-In = 0001020304050607
-Out = 2E0274BBE14D21A3CEB0E0CB73C3664C
-
-Key = CEB0E0CB73C3664C
-Nonce = 000102030405060708
-AD = 000102030405060708
-In = 000102030405060708
-Out = 9C4B292B0CF17E3A29F23CD535559023EC
-
-Key = F23CD535559023EC
-Nonce = 00010203040506070809
-AD = 00010203040506070809
-In = 00010203040506070809
-Out = 8E322734308F8566287746363D7EFC322821
-
-Key = 46363D7EFC322821
-Nonce = 000102030405060708090A
-AD = 000102030405060708090A
-In = 000102030405060708090A
-Out = C413C405767FF5F98E3667E7BA35D8F3678E7E
-
-Key = E7BA35D8F3678E7E
-Nonce = 000102030405060708090A0B
-AD = 000102030405060708090A0B
-In = 000102030405060708090A0B
-Out = D77806B7A218098B1569EADCBA67C306E5C0181B
-
-Key = BA67C306E5C0181B
-Nonce = 000102030405060708090A0B0C
-AD = 000102030405060708090A0B0C
-In = 000102030405060708090A0B0C
-Out = 4BE5EF74F9E9799A4D636FEA9F4C511C44ADBA4030
-
-Key = 4C511C44ADBA4030
-Nonce = 000102030405060708090A0B0C0D
-AD = 000102030405060708090A0B0C0D
-In = 000102030405060708090A0B0C0D
-Out = 7E19969170C2C8D8AEBA8C7FBC2C54CC6D466A2DF6DA
-
-Key = 54CC6D466A2DF6DA
-Nonce = 000102030405060708090A0B0C0D0E
-AD = 000102030405060708090A0B0C0D0E
-In = 000102030405060708090A0B0C0D0E
-Out = 2EF1CEDC1DD3403CF440FC5561BE3361C6FB277E93701F
-
-Key = 61C6FB277E93701F
-Nonce = 000102030405060708090A0B0C0D0E0F
-AD = 000102030405060708090A0B0C0D0E0F
-In = 000102030405060708090A0B0C0D0E0F
-Out = DE052719153EBACE9D7B19F52AC4282F4AC2A96F2FA8634C
-
[DES/EAX]
Key = 0001020304050607
diff --git a/src/tests/data/block/mars.vec b/src/tests/data/block/mars.vec
deleted file mode 100644
index a7cc764fc..000000000
--- a/src/tests/data/block/mars.vec
+++ /dev/null
@@ -1,4337 +0,0 @@
-[MARS]
-Key = CB14A1776ABBC1CDAFE7243DEF2CEA02
-In = F94512A9B42D034EC4792204D708A69B
-Out = 225DA2CB64B73F79069F21A5E3CB8522
-
-Key = 86EDF4DA31824CABEF6A4637C40B0BAB
-In = 4DF955AD5B398D66408D620A2B27E1A9
-Out = A4B737340AE6D2CAFD930BA97D86129F
-
-Key = D158860838874D9500000000000000000000000000000000
-In = 93A953A82C10411DD158860838874D95
-Out = 4FA0E5F64893131712F01408D233E9F7
-
-Key = FBA167983E7AEF22317CE28C02AAE1A3E8E5CC3CEDBEA82A99DBC39AD65E7227
-In = 1344ABA4D3C44708A8A72116D4F49384
-Out = 458335D95EA42A9F4DCCD41AECC2390D
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DCC07B8DFB0738D6E30A22DFCF27E886
-
-Key = 00000000000000000000000000000000
-In = DCC07B8DFB0738D6E30A22DFCF27E886
-Out = 33CAFFBDDC7F1DDA0F9C15FA2F30E2FF
-
-Key = 00000000000000000000000000000000
-In = 33CAFFBDDC7F1DDA0F9C15FA2F30E2FF
-Out = 62D0D531FD18BAC77177CEB2395EF18F
-
-Key = 00000000000000000000000000000000
-In = 62D0D531FD18BAC77177CEB2395EF18F
-Out = FC444017478822797D800F790622D77B
-
-Key = 00000000000000000000000000000000
-In = FC444017478822797D800F790622D77B
-Out = D584ED203C50582BCBF74B0469417EDC
-
-Key = 00000000000000000000000000000000
-In = D584ED203C50582BCBF74B0469417EDC
-Out = 7134D3EF595D573FE88E18CE5CB2E612
-
-Key = 00000000000000000000000000000000
-In = 7134D3EF595D573FE88E18CE5CB2E612
-Out = 9172072F22CFC72234A7697D73412DB9
-
-Key = 00000000000000000000000000000000
-In = 9172072F22CFC72234A7697D73412DB9
-Out = 06B0DDCAAE6EA44BD0C509CE2BC838AC
-
-Key = 00000000000000000000000000000000
-In = 06B0DDCAAE6EA44BD0C509CE2BC838AC
-Out = 77512E7A4A90D6D5CD66637DEEF1FD52
-
-Key = 00000000000000000000000000000000
-In = 77512E7A4A90D6D5CD66637DEEF1FD52
-Out = 8BC4E466ABE0E2F8FD76019B8237F36E
-
-Key = 00000000000000000000000000000000
-In = 8BC4E466ABE0E2F8FD76019B8237F36E
-Out = 77D40822866C0DD51E0594AA81E5F1B5
-
-Key = 00000000000000000000000000000000
-In = 77D40822866C0DD51E0594AA81E5F1B5
-Out = B8AB0608C7976E1D8F57B2BA493C7503
-
-Key = 00000000000000000000000000000000
-In = B8AB0608C7976E1D8F57B2BA493C7503
-Out = ED4AFE77CE3A2F8C00D0A5E4FDF23426
-
-Key = 00000000000000000000000000000000
-In = ED4AFE77CE3A2F8C00D0A5E4FDF23426
-Out = 1B52C34EDB3826E2BF564E4E3A8C9FA6
-
-Key = 00000000000000000000000000000000
-In = 1B52C34EDB3826E2BF564E4E3A8C9FA6
-Out = AE7E643A355B4847D4F1DBD126518993
-
-Key = 00000000000000000000000000000000
-In = AE7E643A355B4847D4F1DBD126518993
-Out = 3E144191008102E869184D9714BAE7CF
-
-Key = 00000000000000000000000000000000
-In = 3E144191008102E869184D9714BAE7CF
-Out = 89ABFA208A52F85CA60F296CE99FC97A
-
-Key = 00000000000000000000000000000000
-In = 89ABFA208A52F85CA60F296CE99FC97A
-Out = FA092A3DD37EF94837715BBC72C9008F
-
-Key = 00000000000000000000000000000000
-In = FA092A3DD37EF94837715BBC72C9008F
-Out = 8A2288E53B2F0DD376ED385911BB4BB9
-
-Key = 00000000000000000000000000000000
-In = 8A2288E53B2F0DD376ED385911BB4BB9
-Out = 0CD12B0AEC2BA1C57F06E268A4BF5966
-
-Key = 00000000000000000000000000000000
-In = 0CD12B0AEC2BA1C57F06E268A4BF5966
-Out = 0B86524D05D0963C1BDF538290156686
-
-Key = 00000000000000000000000000000000
-In = 0B86524D05D0963C1BDF538290156686
-Out = 79031361A2E423A7C4D1613C3873C0A0
-
-Key = 00000000000000000000000000000000
-In = 79031361A2E423A7C4D1613C3873C0A0
-Out = DD66BC447E835A9F426D0A2267850461
-
-Key = 00000000000000000000000000000000
-In = DD66BC447E835A9F426D0A2267850461
-Out = 4294DCCF31F54E693179449F25B514CC
-
-Key = 00000000000000000000000000000000
-In = 4294DCCF31F54E693179449F25B514CC
-Out = 0A402C1A0F2EB568EDB7252AFDA4192B
-
-Key = 00000000000000000000000000000000
-In = 0A402C1A0F2EB568EDB7252AFDA4192B
-Out = FFACF106A37C74D17009E2566E611BE0
-
-Key = 00000000000000000000000000000000
-In = FFACF106A37C74D17009E2566E611BE0
-Out = 99E058DA9540E6B5C5A869CB9204010B
-
-Key = 00000000000000000000000000000000
-In = 99E058DA9540E6B5C5A869CB9204010B
-Out = 8D616AB19B75842DC5EF102CE4BB2A51
-
-Key = 00000000000000000000000000000000
-In = 8D616AB19B75842DC5EF102CE4BB2A51
-Out = 06C7C640672895C3CCFD52DB2CD9D51B
-
-Key = 00000000000000000000000000000000
-In = 06C7C640672895C3CCFD52DB2CD9D51B
-Out = EB2B67E27ABCB5C06DA3D3EECEC8A25B
-
-Key = 00000000000000000000000000000000
-In = EB2B67E27ABCB5C06DA3D3EECEC8A25B
-Out = 62EC35DC05A0BA40FE5D33A0B974C152
-
-Key = 00000000000000000000000000000000
-In = 62EC35DC05A0BA40FE5D33A0B974C152
-Out = A4CB55D7881ACC44F868C8BCFE098091
-
-Key = 00000000000000000000000000000000
-In = A4CB55D7881ACC44F868C8BCFE098091
-Out = 5CEE73CEBCAA22DF78C8C9FB8A47E5D3
-
-Key = 00000000000000000000000000000000
-In = 5CEE73CEBCAA22DF78C8C9FB8A47E5D3
-Out = 62FCD19C3AC4370A4CC58AA619B0EA2F
-
-Key = 00000000000000000000000000000000
-In = 62FCD19C3AC4370A4CC58AA619B0EA2F
-Out = 3583E618DAC3CE4347FD0E8AE6D6F5E9
-
-Key = 00000000000000000000000000000000
-In = 3583E618DAC3CE4347FD0E8AE6D6F5E9
-Out = 2B307B42E0B9EF2D2EC3EEA07D339A87
-
-Key = 00000000000000000000000000000000
-In = 2B307B42E0B9EF2D2EC3EEA07D339A87
-Out = 29A212AF4220054975D7C2AE9242AFA8
-
-Key = 00000000000000000000000000000000
-In = 29A212AF4220054975D7C2AE9242AFA8
-Out = 67D5BD878FF66CDB33A4DD07EB634F91
-
-Key = 00000000000000000000000000000000
-In = 67D5BD878FF66CDB33A4DD07EB634F91
-Out = 53944CA7C3BBBBE32C9BA9D8A8B765D6
-
-Key = 00000000000000000000000000000000
-In = 53944CA7C3BBBBE32C9BA9D8A8B765D6
-Out = 9213B43D06D0AB7ECCC5CA751C5DBAA8
-
-Key = 000000000000000000000000000000000000000000000000
-In = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Out = 97778747D60E425C2B4202599DB856FB
-
-Key = 000000000000000000000000000000000000000000000000
-In = 97778747D60E425C2B4202599DB856FB
-Out = 885C6C280610DA436936E3C5AEEB9512
-
-Key = 000000000000000000000000000000000000000000000000
-In = 885C6C280610DA436936E3C5AEEB9512
-Out = 749935A9971B7060043018F95329A530
-
-Key = 000000000000000000000000000000000000000000000000
-In = 749935A9971B7060043018F95329A530
-Out = 05F0D089DE79801B3BE3D3D1361628DD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 05F0D089DE79801B3BE3D3D1361628DD
-Out = 35F8044736D1FF4142460E4E72610700
-
-Key = 000000000000000000000000000000000000000000000000
-In = 35F8044736D1FF4142460E4E72610700
-Out = B7028947854FE0C670E1E7416C2803DC
-
-Key = 000000000000000000000000000000000000000000000000
-In = B7028947854FE0C670E1E7416C2803DC
-Out = D4F8A703F24F7E0AC5807EADADCA8CC9
-
-Key = 000000000000000000000000000000000000000000000000
-In = D4F8A703F24F7E0AC5807EADADCA8CC9
-Out = 77F1D30164CD2984C52ACEC02CAE2CD9
-
-Key = 000000000000000000000000000000000000000000000000
-In = 77F1D30164CD2984C52ACEC02CAE2CD9
-Out = CE509EEFF43FB5C22A9756B023573775
-
-Key = 000000000000000000000000000000000000000000000000
-In = CE509EEFF43FB5C22A9756B023573775
-Out = B9D5ACCA79E9719979DA1E657C391F07
-
-Key = 000000000000000000000000000000000000000000000000
-In = B9D5ACCA79E9719979DA1E657C391F07
-Out = 9E3B2E46FC6E2D71D46AF0D5CF36B456
-
-Key = 000000000000000000000000000000000000000000000000
-In = 9E3B2E46FC6E2D71D46AF0D5CF36B456
-Out = D8104637E81C52CCEFB0AFE87F4BAF85
-
-Key = 000000000000000000000000000000000000000000000000
-In = D8104637E81C52CCEFB0AFE87F4BAF85
-Out = C7F9AF5B41E9EB5387DB1D122E483F0E
-
-Key = 000000000000000000000000000000000000000000000000
-In = C7F9AF5B41E9EB5387DB1D122E483F0E
-Out = D7ACF96A441BB267B591FBCEECB0494F
-
-Key = 000000000000000000000000000000000000000000000000
-In = D7ACF96A441BB267B591FBCEECB0494F
-Out = DA2234B06D83F32064A78AD3C5303D73
-
-Key = 000000000000000000000000000000000000000000000000
-In = DA2234B06D83F32064A78AD3C5303D73
-Out = 70EF6DCDD349CD7F1D1A0EB3CB18C8C7
-
-Key = 000000000000000000000000000000000000000000000000
-In = 70EF6DCDD349CD7F1D1A0EB3CB18C8C7
-Out = DA093FB2C0F00258D8D9F216C91C0C9C
-
-Key = 000000000000000000000000000000000000000000000000
-In = DA093FB2C0F00258D8D9F216C91C0C9C
-Out = 26EAEEAE8FBE4835E5C43CBF3249CBB6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 26EAEEAE8FBE4835E5C43CBF3249CBB6
-Out = 35692A1CC8E9FBB99DEE2AD149EE7F33
-
-Key = 000000000000000000000000000000000000000000000000
-In = 35692A1CC8E9FBB99DEE2AD149EE7F33
-Out = 6929CAD6052F809A2850D7E754C11C8D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 6929CAD6052F809A2850D7E754C11C8D
-Out = 5F4E499D26ED1D290D9A187FB7B7FB14
-
-Key = 000000000000000000000000000000000000000000000000
-In = 5F4E499D26ED1D290D9A187FB7B7FB14
-Out = BC5B30B2BAE077710A9DF5686794965F
-
-Key = 000000000000000000000000000000000000000000000000
-In = BC5B30B2BAE077710A9DF5686794965F
-Out = 41661F98160A6556815A15B1C1C2E080
-
-Key = 000000000000000000000000000000000000000000000000
-In = 41661F98160A6556815A15B1C1C2E080
-Out = EC2E71697E742ABDBB5FE516E50DBAD5
-
-Key = 000000000000000000000000000000000000000000000000
-In = EC2E71697E742ABDBB5FE516E50DBAD5
-Out = CB104FF2203633E97573D308923C7AE9
-
-Key = 000000000000000000000000000000000000000000000000
-In = CB104FF2203633E97573D308923C7AE9
-Out = C47B77D5FAD3535CFAE0BE60B48C741E
-
-Key = 000000000000000000000000000000000000000000000000
-In = C47B77D5FAD3535CFAE0BE60B48C741E
-Out = BCA5C36E33821A60CAF6E2DA72956C5E
-
-Key = 000000000000000000000000000000000000000000000000
-In = BCA5C36E33821A60CAF6E2DA72956C5E
-Out = B780AA350F6EFB3B805E505A2D32249F
-
-Key = 000000000000000000000000000000000000000000000000
-In = B780AA350F6EFB3B805E505A2D32249F
-Out = 8857D872D91FE8937E292C8948C0AF24
-
-Key = 000000000000000000000000000000000000000000000000
-In = 8857D872D91FE8937E292C8948C0AF24
-Out = 4FCF851C845CBD7D7C528F55B8E84662
-
-Key = 000000000000000000000000000000000000000000000000
-In = 4FCF851C845CBD7D7C528F55B8E84662
-Out = BDDEE7D374D810E3658670F46054F99B
-
-Key = 000000000000000000000000000000000000000000000000
-In = BDDEE7D374D810E3658670F46054F99B
-Out = 16A4F2C3A95B296FBB7F8DEC6F70A9D0
-
-Key = 000000000000000000000000000000000000000000000000
-In = 16A4F2C3A95B296FBB7F8DEC6F70A9D0
-Out = 2583F970ED6970C6D0963015D67217B6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 2583F970ED6970C6D0963015D67217B6
-Out = 0E7BB2CDF9CD553709D2BE4E9497D2F3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 0E7BB2CDF9CD553709D2BE4E9497D2F3
-Out = A6D82EE721AAF1BA1BC3EBD8C75ABA9F
-
-Key = 000000000000000000000000000000000000000000000000
-In = A6D82EE721AAF1BA1BC3EBD8C75ABA9F
-Out = C1211304A35315EC827DAE80B3F29BBB
-
-Key = 000000000000000000000000000000000000000000000000
-In = C1211304A35315EC827DAE80B3F29BBB
-Out = 4F0842F2D9EA5CD1AB743A8626DA6BE7
-
-Key = 000000000000000000000000000000000000000000000000
-In = 4F0842F2D9EA5CD1AB743A8626DA6BE7
-Out = BF39E62B863AFFFAD3DEE960962E03AE
-
-Key = 000000000000000000000000000000000000000000000000
-In = BF39E62B863AFFFAD3DEE960962E03AE
-Out = 147C3CB084958D3FBB9D4223D3126BF3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 147C3CB084958D3FBB9D4223D3126BF3
-Out = 6E76BEF9304B115EFC1C9002FBB848A0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 62E45B4CF3477F1DD65063729D9ABA8F
-Out = 0F4B897EA014D21FBC20F1054A42F719
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 0F4B897EA014D21FBC20F1054A42F719
-Out = 9A4D42A7F27D42E542286ACF6650CF8A
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 9A4D42A7F27D42E542286ACF6650CF8A
-Out = 5E5F71257B5156C075FDC4BCBE996527
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 5E5F71257B5156C075FDC4BCBE996527
-Out = 5A8112FB681B184766069A229BC0E1B6
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 5A8112FB681B184766069A229BC0E1B6
-Out = 2169853AD199721728B2F41FF6C3F316
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 2169853AD199721728B2F41FF6C3F316
-Out = FD3954D96EF5B4078F5C301BAF15A3DE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = FD3954D96EF5B4078F5C301BAF15A3DE
-Out = DB1F3D03E0012505E354B2F4D7C7A255
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = DB1F3D03E0012505E354B2F4D7C7A255
-Out = 375CECE4E897512373B86A82A6A660D5
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 375CECE4E897512373B86A82A6A660D5
-Out = 4CDA1DDDD8849D47609D7D9803FD67D6
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 4CDA1DDDD8849D47609D7D9803FD67D6
-Out = 20A6C90C54A118487C173AE3166EF219
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 20A6C90C54A118487C173AE3166EF219
-Out = F4A0164DFC1F38E967F3DDE74B7B0CAD
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = F4A0164DFC1F38E967F3DDE74B7B0CAD
-Out = 638D1B47820C0FD0A1BFA5FB05AE9087
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 638D1B47820C0FD0A1BFA5FB05AE9087
-Out = CDE141CD9E784912B6BEFD62003FE253
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = CDE141CD9E784912B6BEFD62003FE253
-Out = 84276E8EB17CB38307F3ACFE9480A771
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 84276E8EB17CB38307F3ACFE9480A771
-Out = 27BA4090E1929A7E65D0C5078039A677
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 27BA4090E1929A7E65D0C5078039A677
-Out = 264E4F150552D0D5F81583635189EED1
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 264E4F150552D0D5F81583635189EED1
-Out = F052005B58BE2C8981575BA5C31D812C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = F052005B58BE2C8981575BA5C31D812C
-Out = 807E73C57A18CA88CA0F58C2FFD06394
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 807E73C57A18CA88CA0F58C2FFD06394
-Out = C317C6C0411947887DFCE0A9B2270B5F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = C317C6C0411947887DFCE0A9B2270B5F
-Out = 8ACD4164453A4C1C0DACBC8C2ED0896C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 8ACD4164453A4C1C0DACBC8C2ED0896C
-Out = 2BA5D280D05FBAF78A8B55BF5FD8D343
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 2BA5D280D05FBAF78A8B55BF5FD8D343
-Out = DDF70B8350ED845F6D875B0C85961D39
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = DDF70B8350ED845F6D875B0C85961D39
-Out = 039FD445F0A6D65698D5146D498C8BDB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 039FD445F0A6D65698D5146D498C8BDB
-Out = 22AE4D552D09558DEEEFC9518C01F4E2
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 22AE4D552D09558DEEEFC9518C01F4E2
-Out = D5947EA67A7BD88DA577A28254EE44EF
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = D5947EA67A7BD88DA577A28254EE44EF
-Out = 22698C92691EE76CAD72880F577EFEC3
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 22698C92691EE76CAD72880F577EFEC3
-Out = 10ECA6E5E499742DDEC48434B767EBA1
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 10ECA6E5E499742DDEC48434B767EBA1
-Out = 3D97E93A44C2CB1CE9AF5770A4BD1A34
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 3D97E93A44C2CB1CE9AF5770A4BD1A34
-Out = F89C438D5311FC8235C632629CE1F3A0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = F89C438D5311FC8235C632629CE1F3A0
-Out = 4114C623ADF6DB0958FFA2DC27A2A828
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 4114C623ADF6DB0958FFA2DC27A2A828
-Out = 980089430C89563A5510DF5196E07040
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 980089430C89563A5510DF5196E07040
-Out = 1D1FEFBD55AA23487CD2DEC4D370302D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 1D1FEFBD55AA23487CD2DEC4D370302D
-Out = 73A8AAE732EF445F3462353181168B23
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 73A8AAE732EF445F3462353181168B23
-Out = 1D8116306AF7D70FE419226F35251687
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 1D8116306AF7D70FE419226F35251687
-Out = 84EFA8A595B06C91A5A083440DAF5B50
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 84EFA8A595B06C91A5A083440DAF5B50
-Out = 630EECD4A8A957A610765E01A1D07C45
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 630EECD4A8A957A610765E01A1D07C45
-Out = 825A47AD6FCE09FEDB5D8F07DE6A2707
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 825A47AD6FCE09FEDB5D8F07DE6A2707
-Out = 0C472D25510DD0592B5130FB4272DECA
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 0C472D25510DD0592B5130FB4272DECA
-Out = 3DA22A91B605A540E474383672C8D06C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 3DA22A91B605A540E474383672C8D06C
-Out = 9A1C14309E4B246C9E7B485A7F41D046
-
-Key = 80000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B3E2AD5608AC1B6733A7CB4FDF8F9952
-
-Key = 40000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8655D5CCAF76A3A8AA09841F04689465
-
-Key = 20000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F611F21A70C0AB5FB3D52AD5E8196E09
-
-Key = 10000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6676D02EAE3EE58FA396BE40A3A6A234
-
-Key = 08000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 786E147E5D66764A16DFE1DCB10F3F13
-
-Key = 04000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FDDBC84DA51496AD1CA2B7013B93FFA8
-
-Key = 02000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B5A0BB3A8E7FEAC192B7BF8080E2CC81
-
-Key = 01000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9A4802E8BF4426467617E9A44072EB76
-
-Key = 00800000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BE279F4EE696EC5B07820A1066F110CD
-
-Key = 00400000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4BBB919E52C258960549FAE9DD5FF524
-
-Key = 00200000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6B077B5DE4C9961DC6E11053662E3CFB
-
-Key = 00100000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 755358499858F166C9DEAF2E79B3EDA3
-
-Key = 00080000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 632644AA2ACB4FB3214E9E5BFF57D4D8
-
-Key = 00040000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DD3F06DD5A90BD7EA3F4B1BFB56E4ABB
-
-Key = 00020000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B2FB07551FD5B549C857020356B99D45
-
-Key = 00010000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5DE9EF4627A3EB6FD3920C322ECE9FAB
-
-Key = 00008000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A8D37D0254E1C908AAD02631B614A0C6
-
-Key = 00004000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 91372C769C1E64DE0FDDC1C63436B623
-
-Key = 00002000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4F8FF5063FFF638497733E1526EE27BD
-
-Key = 00001000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5157ECB5597AC6A8D761E97517C65C0F
-
-Key = 00000800000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 117B9349CFFD2066452CC0FE204C18A5
-
-Key = 00000400000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AE0AF51926529A3F354F7585578F6439
-
-Key = 00000200000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B2723B8D2D61497DBF44FF9D70E48C0E
-
-Key = 00000100000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 464B3EB2A0F8A394DA239E0D0D62EDE2
-
-Key = 00000080000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AA03D30E1CE0E91DC360B1E538017F05
-
-Key = 00000040000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B1EDF5E18160BF8E16F386D999BF65BE
-
-Key = 00000020000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 85F1BDD358B23675328841103F1DCE65
-
-Key = 00000010000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 38DEA42C35E5758C7C5CCF451936DFCB
-
-Key = 00000008000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E484E7CB2D35D5AE92939B06864A0E6B
-
-Key = 00000004000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 53B7E22F63F4D8AAC66D148619A7691D
-
-Key = 00000002000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0042A8EDB756329533D82ED13386E648
-
-Key = 00000001000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 44BBDB223AFCC69EB69C5D07AF10E5D8
-
-Key = 00000000800000000000000000000000
-In = 00000000000000000000000000000000
-Out = C5B1739AF4C0AE459BF11144132D0979
-
-Key = 00000000400000000000000000000000
-In = 00000000000000000000000000000000
-Out = 151BBFAECB027BAB90C8DA3E4743F033
-
-Key = 00000000200000000000000000000000
-In = 00000000000000000000000000000000
-Out = 376786816F319B96A19B134143952FE5
-
-Key = 00000000100000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3E94AC897203461EFD9EED441F66AE9F
-
-Key = 00000000080000000000000000000000
-In = 00000000000000000000000000000000
-Out = 61A93766162F0B01EDC84D47B1D4ECAA
-
-Key = 00000000040000000000000000000000
-In = 00000000000000000000000000000000
-Out = B21FA9D0AC731750F15B47FFF2BC4030
-
-Key = 00000000020000000000000000000000
-In = 00000000000000000000000000000000
-Out = BDE8813E0E4EAE6CECCBC4C6BD10C610
-
-Key = 00000000010000000000000000000000
-In = 00000000000000000000000000000000
-Out = 50A5AE30DC3432F3060EE3628B274FFB
-
-Key = 00000000008000000000000000000000
-In = 00000000000000000000000000000000
-Out = E3DA95B76AD9E29F0B3F14DD33C670AC
-
-Key = 00000000004000000000000000000000
-In = 00000000000000000000000000000000
-Out = 969DC8A583DED13E53042450FA4BE8FA
-
-Key = 00000000002000000000000000000000
-In = 00000000000000000000000000000000
-Out = D7CB0D2F9BFF048CBD8CBD8452361611
-
-Key = 00000000001000000000000000000000
-In = 00000000000000000000000000000000
-Out = E056677749114108153C6AC262EC0396
-
-Key = 00000000000800000000000000000000
-In = 00000000000000000000000000000000
-Out = E5572F1812044977D4309B8D675CAE48
-
-Key = 00000000000400000000000000000000
-In = 00000000000000000000000000000000
-Out = F00C1AB95B5CE3D3ACC2162E7A7F0262
-
-Key = 00000000000200000000000000000000
-In = 00000000000000000000000000000000
-Out = AB33C3682E0C1BFA627F4932AE4AAD94
-
-Key = 00000000000100000000000000000000
-In = 00000000000000000000000000000000
-Out = EE5B68820CB978CAACA22B1D590E31CF
-
-Key = 00000000000080000000000000000000
-In = 00000000000000000000000000000000
-Out = 8ACACFB9E872873E315D84657613756B
-
-Key = 00000000000040000000000000000000
-In = 00000000000000000000000000000000
-Out = 75CD1E528E5B6DB21BC8E44E70E5ECFA
-
-Key = 00000000000020000000000000000000
-In = 00000000000000000000000000000000
-Out = 3195CE6F460654E6FC00672755A5B7C3
-
-Key = 00000000000010000000000000000000
-In = 00000000000000000000000000000000
-Out = 8ACC17F3EDF59AA02DBBA93F27AD11D0
-
-Key = 00000000000008000000000000000000
-In = 00000000000000000000000000000000
-Out = DD82C41281BE711F7E5DCDCDC6CBBF6F
-
-Key = 00000000000004000000000000000000
-In = 00000000000000000000000000000000
-Out = 971ABFC0649C9ABE7DE583799F31DD9D
-
-Key = 00000000000002000000000000000000
-In = 00000000000000000000000000000000
-Out = 9CD8E45DE9909A8146956F2B581AE664
-
-Key = 00000000000001000000000000000000
-In = 00000000000000000000000000000000
-Out = 095314A316B4DB9CE6F2CDDEC59ECE89
-
-Key = 00000000000000800000000000000000
-In = 00000000000000000000000000000000
-Out = B626E1C40D644E2E72370CA4A3528576
-
-Key = 00000000000000400000000000000000
-In = 00000000000000000000000000000000
-Out = 002E4294BD6DDE3E3BFFB0CF5A5A7D4B
-
-Key = 00000000000000200000000000000000
-In = 00000000000000000000000000000000
-Out = DA89C327F041BEBDB09E835ED2A2DDBE
-
-Key = 00000000000000100000000000000000
-In = 00000000000000000000000000000000
-Out = 9BC999880C14C9358CA89C435B1FDB00
-
-Key = 00000000000000080000000000000000
-In = 00000000000000000000000000000000
-Out = D0C92CFF98EB228C6C19B405E6EFEE77
-
-Key = 00000000000000040000000000000000
-In = 00000000000000000000000000000000
-Out = FAE5C83332BB176704F0E73B27442C0C
-
-Key = 00000000000000020000000000000000
-In = 00000000000000000000000000000000
-Out = DC9FB83F80E56CAF1DB807B5921927E8
-
-Key = 00000000000000010000000000000000
-In = 00000000000000000000000000000000
-Out = 6FBB39934CC2627EE4F93343F50EB9D4
-
-Key = 00000000000000008000000000000000
-In = 00000000000000000000000000000000
-Out = 02A31EDEF8DEA2DE3307748BF4DC1C54
-
-Key = 00000000000000004000000000000000
-In = 00000000000000000000000000000000
-Out = 8C433C3D2005B30996ADA41F896436AC
-
-Key = 00000000000000002000000000000000
-In = 00000000000000000000000000000000
-Out = ED04C68D4D73C6EE193E0FC9E2CBD1B0
-
-Key = 00000000000000001000000000000000
-In = 00000000000000000000000000000000
-Out = 515E01A6F25A4F1B2B57B27DECBFF195
-
-Key = 00000000000000000800000000000000
-In = 00000000000000000000000000000000
-Out = 30A07996E5C40C41786FC75B9C56325B
-
-Key = 00000000000000000400000000000000
-In = 00000000000000000000000000000000
-Out = 279C94707B0732D210DA7B619158825A
-
-Key = 00000000000000000200000000000000
-In = 00000000000000000000000000000000
-Out = 07552A95AC44BB11CD34428C858FD19F
-
-Key = 00000000000000000100000000000000
-In = 00000000000000000000000000000000
-Out = BA67FC2E51DA92EA19079B237B42C9D8
-
-Key = 00000000000000000080000000000000
-In = 00000000000000000000000000000000
-Out = 40387C974070B484E0DBAAFD5ADA0243
-
-Key = 00000000000000000040000000000000
-In = 00000000000000000000000000000000
-Out = 3BF99A29B17D84BE5F8DC315616061F8
-
-Key = 00000000000000000020000000000000
-In = 00000000000000000000000000000000
-Out = D4EF00C794D337961FD9E3B5AF7A67A5
-
-Key = 00000000000000000010000000000000
-In = 00000000000000000000000000000000
-Out = 1C77C28A6CBF3CBB24F2686ED3A408E2
-
-Key = 00000000000000000008000000000000
-In = 00000000000000000000000000000000
-Out = F93568CD7CBA7A6E9B9DD7144F1D4ABB
-
-Key = 00000000000000000004000000000000
-In = 00000000000000000000000000000000
-Out = C3BCD1F7F268E2806CCF0498C85D2E3E
-
-Key = 00000000000000000002000000000000
-In = 00000000000000000000000000000000
-Out = 2FD2F0DEB5DBF7EB3B9050042E56A9A9
-
-Key = 00000000000000000001000000000000
-In = 00000000000000000000000000000000
-Out = 2150DEB8C7C6327227A772031FF64047
-
-Key = 00000000000000000000800000000000
-In = 00000000000000000000000000000000
-Out = 3E8B4B1CBB877B6F612BFB391043CFC3
-
-Key = 00000000000000000000400000000000
-In = 00000000000000000000000000000000
-Out = 2376F56DFEB40C9348D758CA068C2127
-
-Key = 00000000000000000000200000000000
-In = 00000000000000000000000000000000
-Out = AABB351CA9BDCDACCD8E966766FF1C59
-
-Key = 00000000000000000000100000000000
-In = 00000000000000000000000000000000
-Out = 212EF966B6CEECC65B5B0AE6A9DAA099
-
-Key = 00000000000000000000080000000000
-In = 00000000000000000000000000000000
-Out = 99C95AC67935AE473E2EF3907DDCE5B3
-
-Key = 00000000000000000000040000000000
-In = 00000000000000000000000000000000
-Out = 125DC68286DB1F81E6CD3D0C9EF8B922
-
-Key = 00000000000000000000020000000000
-In = 00000000000000000000000000000000
-Out = CC55D94C0102A12D87454DB8BA8E654C
-
-Key = 00000000000000000000010000000000
-In = 00000000000000000000000000000000
-Out = 3F1E089ACAD719F7DB9292A770038475
-
-Key = 00000000000000000000008000000000
-In = 00000000000000000000000000000000
-Out = EC4D155D404F72B4BE88D1E17C345822
-
-Key = 00000000000000000000004000000000
-In = 00000000000000000000000000000000
-Out = 276F8AECA95C7F65CD95B77680955548
-
-Key = 00000000000000000000002000000000
-In = 00000000000000000000000000000000
-Out = 7D78CE850C26BB18B8631CDFF0A5E597
-
-Key = 00000000000000000000001000000000
-In = 00000000000000000000000000000000
-Out = 6345692D62E879A058F342D5226A036D
-
-Key = 00000000000000000000000800000000
-In = 00000000000000000000000000000000
-Out = E19D5A2899061B7B5537EA6DF0390FE8
-
-Key = 00000000000000000000000400000000
-In = 00000000000000000000000000000000
-Out = 4FAB8BB80E979853052BA0B19EF8521D
-
-Key = 00000000000000000000000200000000
-In = 00000000000000000000000000000000
-Out = E84EE11321AF1C0AE6430C4F600270B4
-
-Key = 00000000000000000000000100000000
-In = 00000000000000000000000000000000
-Out = 73048F29C44F0953DFCC6B5380D36977
-
-Key = 00000000000000000000000080000000
-In = 00000000000000000000000000000000
-Out = 16280B84B187AE90E25121AB297620FA
-
-Key = 00000000000000000000000040000000
-In = 00000000000000000000000000000000
-Out = FAAE881E9FA9DCA876B668CCAFA12B6A
-
-Key = 00000000000000000000000020000000
-In = 00000000000000000000000000000000
-Out = 46A73C4A4516E1E0BE2140E175A7225F
-
-Key = 00000000000000000000000010000000
-In = 00000000000000000000000000000000
-Out = 01C71A7B0BD6410894C9234A4250ABB4
-
-Key = 00000000000000000000000008000000
-In = 00000000000000000000000000000000
-Out = EA8CEF3C1E8EF94D4A17A4D4C1C28C32
-
-Key = 00000000000000000000000004000000
-In = 00000000000000000000000000000000
-Out = 13BB356657B36C0D023047B324443468
-
-Key = 00000000000000000000000002000000
-In = 00000000000000000000000000000000
-Out = B14DCC5250036260131B3D92B1B26C18
-
-Key = 00000000000000000000000001000000
-In = 00000000000000000000000000000000
-Out = 261E07BADC6E4BBB0EAD9ECCAE179821
-
-Key = 00000000000000000000000000800000
-In = 00000000000000000000000000000000
-Out = 1D40D508EB8878251EC5C01D8E9949BB
-
-Key = 00000000000000000000000000400000
-In = 00000000000000000000000000000000
-Out = 735BDCA8DF0C58679161E99BED3B8D3E
-
-Key = 00000000000000000000000000200000
-In = 00000000000000000000000000000000
-Out = 49C907F757494623F8E8519F4A5D13A0
-
-Key = 00000000000000000000000000100000
-In = 00000000000000000000000000000000
-Out = AB858C224E5A3ADDF5A7549A98EEAF94
-
-Key = 00000000000000000000000000080000
-In = 00000000000000000000000000000000
-Out = 7C7A62A1DBF206572A323682E0441458
-
-Key = 00000000000000000000000000040000
-In = 00000000000000000000000000000000
-Out = 7461D6F4D609F8BCA9CAB4EB559C71C3
-
-Key = 00000000000000000000000000020000
-In = 00000000000000000000000000000000
-Out = 2F646495150F4F9CA06B77281C1150FD
-
-Key = 00000000000000000000000000010000
-In = 00000000000000000000000000000000
-Out = A0C27498F797D6A9F513640AFE6CC316
-
-Key = 00000000000000000000000000008000
-In = 00000000000000000000000000000000
-Out = 8D511A840453125335AB8DF8C64FA8E8
-
-Key = 00000000000000000000000000004000
-In = 00000000000000000000000000000000
-Out = 9E64465740D81CCB74713A144F636985
-
-Key = 00000000000000000000000000002000
-In = 00000000000000000000000000000000
-Out = 804499E6C6E8790988747009D3B3C66D
-
-Key = 00000000000000000000000000001000
-In = 00000000000000000000000000000000
-Out = 59EBC223BAC60B13198C9AF47066274E
-
-Key = 00000000000000000000000000000800
-In = 00000000000000000000000000000000
-Out = CCA216CC095954AFD3DE594C91A26310
-
-Key = 00000000000000000000000000000400
-In = 00000000000000000000000000000000
-Out = 06FF525F42EFF20A548DA1B7DCD1FFF8
-
-Key = 00000000000000000000000000000200
-In = 00000000000000000000000000000000
-Out = B2F1FD473FCA588111E6EB9DCE82CFA9
-
-Key = 00000000000000000000000000000100
-In = 00000000000000000000000000000000
-Out = 557307573D2E5225AD6EDADDF1FCAB68
-
-Key = 00000000000000000000000000000080
-In = 00000000000000000000000000000000
-Out = CA159F81D155071BDCA701174C69184D
-
-Key = 00000000000000000000000000000040
-In = 00000000000000000000000000000000
-Out = 41491AE31AB75E3ACA41B1A2CB75C1D9
-
-Key = 00000000000000000000000000000020
-In = 00000000000000000000000000000000
-Out = C3B4B9419C0E19D4A851C2DAD2954268
-
-Key = 00000000000000000000000000000010
-In = 00000000000000000000000000000000
-Out = 6E3DD6DF183B80A0FF5D2D0A4B25A2C8
-
-Key = 00000000000000000000000000000008
-In = 00000000000000000000000000000000
-Out = EC69E1BD0815AE6C83876B75E58A7EB6
-
-Key = 00000000000000000000000000000004
-In = 00000000000000000000000000000000
-Out = 8F5766DE11517F63A60459B1EDC32D44
-
-Key = 00000000000000000000000000000002
-In = 00000000000000000000000000000000
-Out = 8A74C64985345925D8A6AB8E6A0D3589
-
-Key = 00000000000000000000000000000001
-In = 00000000000000000000000000000000
-Out = F65B8E5EAF04B33AD5FCF1B14874E059
-
-Key = 800000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FD04E0B77403BBDC72A370240B45B92D
-
-Key = 400000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CB0B4AC08E20385D31CF468B52B356E2
-
-Key = 200000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C39B63B4A8F7BF5C3CC61141584DE462
-
-Key = 100000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C63F433FF98BEE849D75D0F0402C9273
-
-Key = 080000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9433992C094CDBEC06199B0517970B5D
-
-Key = 040000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FA8B068AD3C2C32F99EF1A4F76C409AF
-
-Key = 020000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 014617D6109068C39137EE0CC522163E
-
-Key = 010000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 41B87685C649AD72C32D9390C23CF34B
-
-Key = 008000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6836281F31AA9120DC144E26074491EC
-
-Key = 004000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C4163CB0CA1315C3D0115D495E0FF701
-
-Key = 002000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F0B8F3585636D2785FF619523C4365B9
-
-Key = 001000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6E1740E818B450955C6B7612DBBA0DAE
-
-Key = 000800000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 192A2FAAC85794EB20E43645E2E1B749
-
-Key = 000400000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5CA4011E7024A4978B58E1DFA9278625
-
-Key = 000200000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 498152C714A2CEFD692AC99DB90CDDBD
-
-Key = 000100000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DEB3A9FEB22886C511A057AB858BB4DD
-
-Key = 000080000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D60466B1EA5C1C7A5DDFDA049A685B50
-
-Key = 000040000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 62A0EE49A6333815350E9C9CD7CB24D2
-
-Key = 000020000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3AE70846AFDCC299B32EB9DE118070B8
-
-Key = 000010000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5118414720E424364E15B5EDC8E64559
-
-Key = 000008000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 42F9E38F7FB493D6048C63F804F5AD62
-
-Key = 000004000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 71043DAA3CF78997D9965DE84B150FA6
-
-Key = 000002000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 55B0DF5816DD16D2EB5CDDC5478D0652
-
-Key = 000001000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CA853E905496251FF856259149FB5CCA
-
-Key = 000000800000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BEF7C892708F0369378EA80C0EB9DD4A
-
-Key = 000000400000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3E7D986D91BEE75E597999C3E7372F06
-
-Key = 000000200000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8877D8DAF98680C7EC03C870BAFB66F9
-
-Key = 000000100000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 493B8E5D02D01A6C98DDF4D016F4932D
-
-Key = 000000080000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E372455C9A44DCD5AEA803A276B2C5C3
-
-Key = 000000040000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 92FCA63F71BCD0C950231E104D833246
-
-Key = 000000020000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1630F75A2F31B1998725D849CC2ADA9A
-
-Key = 000000010000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E3B636FC5BE0F05A036AEDF4DE7154BD
-
-Key = 000000008000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DBC8BD2D128A11715152306E19C9D1F9
-
-Key = 000000004000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AEFB45876EE3B0025A2D26A7A20E2A72
-
-Key = 000000002000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C7F1370CD98539026B8FD0968F7A8247
-
-Key = 000000001000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6D09CC037CDFD06ECAC142630A599C4F
-
-Key = 000000000800000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 94C29805153DB7FE4834BD261F0CA87E
-
-Key = 000000000400000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B509BAF1EAB92764F8085764968CD111
-
-Key = 000000000200000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E6ECD9CCAF93F302250A90E3C083C22E
-
-Key = 000000000100000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1419D2C7A7A8F7AB5D78B327770EE8F7
-
-Key = 000000000080000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 984FA23C883200CFA802FCBF1DE752A2
-
-Key = 000000000040000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 003BFBA6334DEDFF7A3652DFDC73D04A
-
-Key = 000000000020000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B21EC3CCD1303B81744348C64B5E5984
-
-Key = 000000000010000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 58557001247E8AFE91399042E723751B
-
-Key = 000000000008000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0EF33C5A09600898D9FFE6AF5A06C2B6
-
-Key = 000000000004000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AA0E866FEE8227BF6A8FDA4B318920AB
-
-Key = 000000000002000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 839A0DA3DB2718EEBB917B4CE37D23BF
-
-Key = 000000000001000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BA3292A8130B2708EEBC5B2478B52C17
-
-Key = 000000000000800000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 49B2A8F2FC9639B5918176993D96646A
-
-Key = 000000000000400000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 21967CDE8F85ED1600F359F376CD18CA
-
-Key = 000000000000200000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6CCA94D43AB4B3A82FA4E514D928E644
-
-Key = 000000000000100000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3C76EAC404CF1E23B0A159C919A60206
-
-Key = 000000000000080000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F9DE0E78E8CC16D3A99D7642DEA13DB0
-
-Key = 000000000000040000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5B74643F1DEA8CA49078E4BF54B856CA
-
-Key = 000000000000020000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0E07FE27FBFAB005FF7EF334C3320736
-
-Key = 000000000000010000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 477810CB11FC7E68144960AAD5372A64
-
-Key = 000000000000008000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A638D2171A231AFF384C97A7E9EFF6B6
-
-Key = 000000000000004000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9EA186F9AA6BE6D395E92474CCB9CAA3
-
-Key = 000000000000002000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7F6A295094E5512EDEA0B7206B977270
-
-Key = 000000000000001000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2DD07726A9333391A6EB41F4859A1627
-
-Key = 000000000000000800000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 515847FB17843E42C936A6201DF28563
-
-Key = 000000000000000400000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 35B29379EABD877B458FC4A4FB532931
-
-Key = 000000000000000200000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B986149A6E871ACD8E3E1E5F5928C889
-
-Key = 000000000000000100000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 84D0A488FB56ADB915B553B2EDDBCC41
-
-Key = 000000000000000080000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 63B2B5A4D51E076D673044C71DC68B02
-
-Key = 000000000000000040000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F388AD195E35B2892E586B830D728440
-
-Key = 000000000000000020000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8FA923E8949678F76205CF4CBE07FF2F
-
-Key = 000000000000000010000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = ACCF2708E75B4CF48E45B641B81C1F41
-
-Key = 000000000000000008000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0A7C295579AD4296447B7E56EB719ED3
-
-Key = 000000000000000004000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 06572AAB88739B2BDEE8E1E9CCA22883
-
-Key = 000000000000000002000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2CF0CA3DB58CDC62890D386B07A4145F
-
-Key = 000000000000000001000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CEFAEB3CEAA5959FAB15E884D46E9F09
-
-Key = 000000000000000000800000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 57EB477F0573D6C75E45EE8606B5A2B6
-
-Key = 000000000000000000400000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C55F45149DE0FD18F2588B2B9F54CC22
-
-Key = 000000000000000000200000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = ABCA7BE4CCC597AD8783C24EAB8BF17D
-
-Key = 000000000000000000100000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 702F3D046E8651BF40D6A5914D8AC8B5
-
-Key = 000000000000000000080000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2C6424E1EF097C8FB44138C8A5160AE7
-
-Key = 000000000000000000040000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3F0E8296D93C233CBBE22623CCB66A52
-
-Key = 000000000000000000020000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D828348AFD520F98ED31F0B9FA4C48B1
-
-Key = 000000000000000000010000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BA7A4AA5F32D16DF08ABAA63E72F8BAD
-
-Key = 000000000000000000008000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9211FA0B1161E094BE702157D4CAFC73
-
-Key = 000000000000000000004000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1A4D5C52FDDEE81374295341F950055D
-
-Key = 000000000000000000002000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9544A653B635734B0FBC84E6C64B1AD5
-
-Key = 000000000000000000001000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8B7E7EE1A74570F35183E15D05114BD0
-
-Key = 000000000000000000000800000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6567CE30F21EE879D60359CEE9AD3EC0
-
-Key = 000000000000000000000400000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E5078C9B9B7572A60822A44150C6A4F4
-
-Key = 000000000000000000000200000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 51DFF3FE97481F08F6D5B66480AEE6D5
-
-Key = 000000000000000000000100000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E84E478B15FB1BCD50E3CA9936FE9E01
-
-Key = 000000000000000000000080000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FC614E54348A78E28ADB5DFB11130ADC
-
-Key = 000000000000000000000040000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0F872CF9F54CE981ED17E41B23ED616C
-
-Key = 000000000000000000000020000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AFCC9646ED78283BD19092853223F347
-
-Key = 000000000000000000000010000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 35D5A827B175D776F8F90F30F41A1C4B
-
-Key = 000000000000000000000008000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B55980544140E694FCDFCE7C251C121C
-
-Key = 000000000000000000000004000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 244C4A55D5EEC8BD55C4F0D295ED2541
-
-Key = 000000000000000000000002000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B3700314BD37894991C2FD4355B26845
-
-Key = 000000000000000000000001000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 43F3C6FFB517CD6E8EE1AEFCAA6FDE06
-
-Key = 000000000000000000000000800000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0F1A3E34821335E4EC22D404155192C2
-
-Key = 000000000000000000000000400000000000000000000000
-In = 00000000000000000000000000000000
-Out = 22C59B22CC6A1E0EA313346F461324CD
-
-Key = 000000000000000000000000200000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2A90EF00D977A82EBDF6681F33D7DC1C
-
-Key = 000000000000000000000000100000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4B36176A8C174A635BF96A5B46BCF54C
-
-Key = 000000000000000000000000080000000000000000000000
-In = 00000000000000000000000000000000
-Out = E344C5213246712CAA2A056A6EE1868F
-
-Key = 000000000000000000000000040000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8F75D3C2ABBF84F3AA5E1734D6CC76A6
-
-Key = 000000000000000000000000020000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2258F75A5FC2B667DD0B28039CEA784C
-
-Key = 000000000000000000000000010000000000000000000000
-In = 00000000000000000000000000000000
-Out = D74F3EA90D02FC4908FDDCBE5849152E
-
-Key = 000000000000000000000000008000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0DCD8607E57390DD609717338591B205
-
-Key = 000000000000000000000000004000000000000000000000
-In = 00000000000000000000000000000000
-Out = 594419C26F408B721F82ACCAC2DF1D5B
-
-Key = 000000000000000000000000002000000000000000000000
-In = 00000000000000000000000000000000
-Out = 12D0F6A150858F64F0C88061CE592C11
-
-Key = 000000000000000000000000001000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5351E750DE5C9322AFA2885FB83C623B
-
-Key = 000000000000000000000000000800000000000000000000
-In = 00000000000000000000000000000000
-Out = 7C120675A918C2C728149D332A196586
-
-Key = 000000000000000000000000000400000000000000000000
-In = 00000000000000000000000000000000
-Out = CDCA42B4E3ED64C2D37812847D7377CC
-
-Key = 000000000000000000000000000200000000000000000000
-In = 00000000000000000000000000000000
-Out = E4B73F8C0D9A40A67ACB9837CF8006DB
-
-Key = 000000000000000000000000000100000000000000000000
-In = 00000000000000000000000000000000
-Out = A863A13ED52E8BFD6652FEE291837B1D
-
-Key = 000000000000000000000000000080000000000000000000
-In = 00000000000000000000000000000000
-Out = 64F9790C0BBD5C234FFADF0037485BB1
-
-Key = 000000000000000000000000000040000000000000000000
-In = 00000000000000000000000000000000
-Out = 37A8AA3E38B937D92E1E41EC5E157FE0
-
-Key = 000000000000000000000000000020000000000000000000
-In = 00000000000000000000000000000000
-Out = F84D2A60A99BA9C17848BFBFBFEA0271
-
-Key = 000000000000000000000000000010000000000000000000
-In = 00000000000000000000000000000000
-Out = 01AD547F2E1A713AC0B3D3E332A044A6
-
-Key = 000000000000000000000000000008000000000000000000
-In = 00000000000000000000000000000000
-Out = ED06A9B6EB5E24DF2CDA83564080AE93
-
-Key = 000000000000000000000000000004000000000000000000
-In = 00000000000000000000000000000000
-Out = 3682650D35D3247471F3EB10A173479D
-
-Key = 000000000000000000000000000002000000000000000000
-In = 00000000000000000000000000000000
-Out = E3BD985B5B7C83F841F2F2A37A2974B3
-
-Key = 000000000000000000000000000001000000000000000000
-In = 00000000000000000000000000000000
-Out = EEA30254CF0FD6379A7203FC2328EEB6
-
-Key = 000000000000000000000000000000800000000000000000
-In = 00000000000000000000000000000000
-Out = 4F2C052C360DA20FF826DFA98429AAA5
-
-Key = 000000000000000000000000000000400000000000000000
-In = 00000000000000000000000000000000
-Out = 5F4CE32E4D55F0EB15799A3C46E1C40A
-
-Key = 000000000000000000000000000000200000000000000000
-In = 00000000000000000000000000000000
-Out = 2EBE1C941F8247BBA3E85A04BA10B27C
-
-Key = 000000000000000000000000000000100000000000000000
-In = 00000000000000000000000000000000
-Out = 9F41738ADB0CD8B4DD048527FCCFC23B
-
-Key = 000000000000000000000000000000080000000000000000
-In = 00000000000000000000000000000000
-Out = 0E9F502FEE59A16CC5CEEDC82FD98E1A
-
-Key = 000000000000000000000000000000040000000000000000
-In = 00000000000000000000000000000000
-Out = 56DC540BBAFB42B9817B4D464993DBCE
-
-Key = 000000000000000000000000000000020000000000000000
-In = 00000000000000000000000000000000
-Out = 7421D3EB41769680565DD67683FE6737
-
-Key = 000000000000000000000000000000010000000000000000
-In = 00000000000000000000000000000000
-Out = 777D08A4999E79A97CDBAFA5B6C33D12
-
-Key = 000000000000000000000000000000008000000000000000
-In = 00000000000000000000000000000000
-Out = 4F3145690B092FAEDEBC672FE0ABC1EC
-
-Key = 000000000000000000000000000000004000000000000000
-In = 00000000000000000000000000000000
-Out = C221E4ABE2DD5ABA26DC29B6F3E421C6
-
-Key = 000000000000000000000000000000002000000000000000
-In = 00000000000000000000000000000000
-Out = EC48948223D3086FA730F6F81C103E8B
-
-Key = 000000000000000000000000000000001000000000000000
-In = 00000000000000000000000000000000
-Out = 38B03357B1A0719A4E04FC3725B66400
-
-Key = 000000000000000000000000000000000800000000000000
-In = 00000000000000000000000000000000
-Out = A9458E67FD55DFB7F5D43344D7B8D994
-
-Key = 000000000000000000000000000000000400000000000000
-In = 00000000000000000000000000000000
-Out = C82BBCFE8E647A4915E578BB6BB410EC
-
-Key = 000000000000000000000000000000000200000000000000
-In = 00000000000000000000000000000000
-Out = 27DA68521E57EFBC401640232896ABC7
-
-Key = 000000000000000000000000000000000100000000000000
-In = 00000000000000000000000000000000
-Out = DD6C4A6784C293F1D6B334731298C043
-
-Key = 000000000000000000000000000000000080000000000000
-In = 00000000000000000000000000000000
-Out = C2C4A691BD77C60869E6C030E357B7DF
-
-Key = 000000000000000000000000000000000040000000000000
-In = 00000000000000000000000000000000
-Out = EDA41EF6E7863F1A7D718E31A7D0AB0F
-
-Key = 000000000000000000000000000000000020000000000000
-In = 00000000000000000000000000000000
-Out = 7915CF01D36808B875E1561FB88ECF2D
-
-Key = 000000000000000000000000000000000010000000000000
-In = 00000000000000000000000000000000
-Out = 033826639ABFCBA709DEECD8F32306D5
-
-Key = 000000000000000000000000000000000008000000000000
-In = 00000000000000000000000000000000
-Out = B7CE1348B2832FABD58542A59319C947
-
-Key = 000000000000000000000000000000000004000000000000
-In = 00000000000000000000000000000000
-Out = 479E3B195B3F9BE75AA2D0931F179495
-
-Key = 000000000000000000000000000000000002000000000000
-In = 00000000000000000000000000000000
-Out = 6B9E7F0C5050E8CD232722C33261135D
-
-Key = 000000000000000000000000000000000001000000000000
-In = 00000000000000000000000000000000
-Out = 063F64EDD05343702B76BE045A9D1DDD
-
-Key = 000000000000000000000000000000000000800000000000
-In = 00000000000000000000000000000000
-Out = E1AE2D5667E440C0A44EF9CC91AA10CC
-
-Key = 000000000000000000000000000000000000400000000000
-In = 00000000000000000000000000000000
-Out = A64A692A55AF5D1C99794707BA00E670
-
-Key = 000000000000000000000000000000000000200000000000
-In = 00000000000000000000000000000000
-Out = B975AC5AFA03D77D7361AACFF32E1B39
-
-Key = 000000000000000000000000000000000000100000000000
-In = 00000000000000000000000000000000
-Out = 267A1379C257776BE4CA75C8B1A59EF6
-
-Key = 000000000000000000000000000000000000080000000000
-In = 00000000000000000000000000000000
-Out = ED392DDA2AD879B58405B41FAA7A56A1
-
-Key = 000000000000000000000000000000000000040000000000
-In = 00000000000000000000000000000000
-Out = 4DECF57B85B75F1A78431A972CC873F6
-
-Key = 000000000000000000000000000000000000020000000000
-In = 00000000000000000000000000000000
-Out = 5F9D95B7F415376A6665BDF645E5C6AC
-
-Key = 000000000000000000000000000000000000010000000000
-In = 00000000000000000000000000000000
-Out = 5929FF53CC9876F923C6D19D3D101F18
-
-Key = 000000000000000000000000000000000000008000000000
-In = 00000000000000000000000000000000
-Out = D6CF5F18474D3A44D0BE029EE879E6FA
-
-Key = 000000000000000000000000000000000000004000000000
-In = 00000000000000000000000000000000
-Out = 8860A98873A8DBFFDC4D7835F3D59BB7
-
-Key = 000000000000000000000000000000000000002000000000
-In = 00000000000000000000000000000000
-Out = 4B506DF2FF9DA5672F55624AFE5374E8
-
-Key = 000000000000000000000000000000000000001000000000
-In = 00000000000000000000000000000000
-Out = B4D6692D5AAE39519C0AAB97597A5521
-
-Key = 000000000000000000000000000000000000000800000000
-In = 00000000000000000000000000000000
-Out = 7185FA267D3926EA0804F07A91398C37
-
-Key = 000000000000000000000000000000000000000400000000
-In = 00000000000000000000000000000000
-Out = 8C3BD232227C1C1B214186A603D85115
-
-Key = 000000000000000000000000000000000000000200000000
-In = 00000000000000000000000000000000
-Out = 5300AFD8D507A60ACB0907B4D3E3D2B0
-
-Key = 000000000000000000000000000000000000000100000000
-In = 00000000000000000000000000000000
-Out = D8A16D32AE71F991EE2C1C19153B146D
-
-Key = 000000000000000000000000000000000000000080000000
-In = 00000000000000000000000000000000
-Out = 32B3F26C1415BF7F82B6A637843F4C21
-
-Key = 000000000000000000000000000000000000000040000000
-In = 00000000000000000000000000000000
-Out = E416420B5F736F39328D36181992A720
-
-Key = 000000000000000000000000000000000000000020000000
-In = 00000000000000000000000000000000
-Out = 619918287897135AD5516BA12A0FC6D7
-
-Key = 000000000000000000000000000000000000000010000000
-In = 00000000000000000000000000000000
-Out = 69830C559F08DDCEEB6F83900DC14626
-
-Key = 000000000000000000000000000000000000000008000000
-In = 00000000000000000000000000000000
-Out = BB451FB76A7B1FE65E0332DE6E6712A3
-
-Key = 000000000000000000000000000000000000000004000000
-In = 00000000000000000000000000000000
-Out = AF2DE55E1EFFAF00EBF4EAEE45B29A4C
-
-Key = 000000000000000000000000000000000000000002000000
-In = 00000000000000000000000000000000
-Out = CA31B9A81450A198A073A299C7DF14C9
-
-Key = 000000000000000000000000000000000000000001000000
-In = 00000000000000000000000000000000
-Out = 4FF7E9FADFCFFBB2DD3F23214B407180
-
-Key = 000000000000000000000000000000000000000000800000
-In = 00000000000000000000000000000000
-Out = B8BC9344751D34B0BFE353E5F3A9E309
-
-Key = 000000000000000000000000000000000000000000400000
-In = 00000000000000000000000000000000
-Out = 4589951B936D1948299548D199E0612F
-
-Key = 000000000000000000000000000000000000000000200000
-In = 00000000000000000000000000000000
-Out = 61B33E9A6A14F21B12D00832385F9BCA
-
-Key = 000000000000000000000000000000000000000000100000
-In = 00000000000000000000000000000000
-Out = 652B66FBC2B192ACA177D4C16ACB1E3F
-
-Key = 000000000000000000000000000000000000000000080000
-In = 00000000000000000000000000000000
-Out = 81A252288A18D4E4EC1F919FE34BD4C8
-
-Key = 000000000000000000000000000000000000000000040000
-In = 00000000000000000000000000000000
-Out = 4D38323769C7AEFBF838F51A57E21C0E
-
-Key = 000000000000000000000000000000000000000000020000
-In = 00000000000000000000000000000000
-Out = C07D35D5788A04FEEBA6A337453DEFCA
-
-Key = 000000000000000000000000000000000000000000010000
-In = 00000000000000000000000000000000
-Out = 6692591964FF5304D877DDE631E55AC2
-
-Key = 000000000000000000000000000000000000000000008000
-In = 00000000000000000000000000000000
-Out = 1792F89A673DFE67A04BAC230317BFD3
-
-Key = 000000000000000000000000000000000000000000004000
-In = 00000000000000000000000000000000
-Out = 0EC45273FAA59A4C6AA56C0BDF9DC1C4
-
-Key = 000000000000000000000000000000000000000000002000
-In = 00000000000000000000000000000000
-Out = 273575F8DB870005ED51F0F1FB962A35
-
-Key = 000000000000000000000000000000000000000000001000
-In = 00000000000000000000000000000000
-Out = D9EDC0E324D69F3CAB465E3F63AC4CD3
-
-Key = 000000000000000000000000000000000000000000000800
-In = 00000000000000000000000000000000
-Out = 647B9C834502295B5D46AE962ABD9059
-
-Key = 000000000000000000000000000000000000000000000400
-In = 00000000000000000000000000000000
-Out = 3C8B932E1E8C1E9FD4629AF03D16D717
-
-Key = 000000000000000000000000000000000000000000000200
-In = 00000000000000000000000000000000
-Out = 9FD433DAE0C3B5C35C7CA5468B4AF8DE
-
-Key = 000000000000000000000000000000000000000000000100
-In = 00000000000000000000000000000000
-Out = 916E8226F1925A4C7E0056E8951B4609
-
-Key = 000000000000000000000000000000000000000000000080
-In = 00000000000000000000000000000000
-Out = A53FCF269CF194C323B2C2A5B82571E2
-
-Key = 000000000000000000000000000000000000000000000040
-In = 00000000000000000000000000000000
-Out = 51C6D510F3053D502D141C99FBB28618
-
-Key = 000000000000000000000000000000000000000000000020
-In = 00000000000000000000000000000000
-Out = 040E54E63CCF8E5D6EE6A27EEDCC02AB
-
-Key = 000000000000000000000000000000000000000000000010
-In = 00000000000000000000000000000000
-Out = DE90BD5F4C96E4F52EC9200D9E298DCD
-
-Key = 000000000000000000000000000000000000000000000008
-In = 00000000000000000000000000000000
-Out = 87233EAEFC125F7C6E1FE329CC415520
-
-Key = 000000000000000000000000000000000000000000000004
-In = 00000000000000000000000000000000
-Out = 71B61DD72D4FBD96542E73A5E5BD7CA5
-
-Key = 000000000000000000000000000000000000000000000002
-In = 00000000000000000000000000000000
-Out = F5F6E1B6215062A2547C1A7C84EB8E86
-
-Key = 000000000000000000000000000000000000000000000001
-In = 00000000000000000000000000000000
-Out = 2DD740E5E0E0CBE72EBDF2808410D55F
-
-Key = 8000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EA4FCDBA1EB0C533938AA9FA32B740F3
-
-Key = 4000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B8E6D5134AB08E553AD5785B33D66111
-
-Key = 2000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2D7805B2B86764E8FC3DD6E2EFB1532D
-
-Key = 1000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B9449A4D8C53639D0A6751DB3695B325
-
-Key = 0800000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B2C6850F1AAAF7CD2E9B3FC1F5433FDC
-
-Key = 0400000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7D124E20CE475B66BEA88399FF95C8C0
-
-Key = 0200000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D5F5ED2CDEC8D3043BD0C58238AF2820
-
-Key = 0100000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 051135A86EADA21353CB5FFD7A58408E
-
-Key = 0080000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FEF406FC9C405AFB959C796E4ED0AF0D
-
-Key = 0040000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 52DA5222BB9974AE66CC9BB77E1F15E8
-
-Key = 0020000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F5DC2C5F98AF6CF4BCC23ECEEAF213AD
-
-Key = 0010000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 09DF90DE791250ACBE170DC643780CF2
-
-Key = 0008000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3FA812132A21BEB83162C33B28CC242C
-
-Key = 0004000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CEE571785850DD567A75D9E244660C66
-
-Key = 0002000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 642BB005B38790E518E53A53373C2474
-
-Key = 0001000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E3EBE5FA1C748BCB125602F8B7911FAE
-
-Key = 0000800000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C863C98E1C09C28B4A05B5FBCE64DF28
-
-Key = 0000400000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B4BAB3A731F8CCD8A09A5D3AFF77BE60
-
-Key = 0000200000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1A3FC4F1DE42F1AC5DA5F88701E6F292
-
-Key = 0000100000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FF43862813E9F1CFEF044F4B8CFED265
-
-Key = 0000080000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8F2785A7E28C1910580BBFD989A7F0D3
-
-Key = 0000040000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 26059027035B43615A7996D19FED9D42
-
-Key = 0000020000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8CD8416F37E3BA1B5D6D0838F6B6E604
-
-Key = 0000010000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BB0BD60CD950DE5E0B9AAF78FF9A30DB
-
-Key = 0000008000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B99C1D4F98B68E8CD7495D16F3260D7D
-
-Key = 0000004000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4F1A4F8D20456CFE0EF0E39DE6C71B9C
-
-Key = 0000002000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F453DB1AB45A6F5834F9908E1A15D4F7
-
-Key = 0000001000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DA25287B7CD050E9B3E2074ED3B49FCF
-
-Key = 0000000800000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BAB2AE0FF7C4902697DE88ED7F2FA06C
-
-Key = 0000000400000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = ABE6F6C9D29A58B985A91782EE28CF3E
-
-Key = 0000000200000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5C59FBE090DB3D75D7A5A8FD76F8A3DB
-
-Key = 0000000100000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DCA806B1D0BAFCEAB015EC19A3E5C7FA
-
-Key = 0000000080000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1BA870E6D62FEB16E6C2AA1128AE5ABA
-
-Key = 0000000040000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0FE91367D4C178DD313C6AB7F3D5149A
-
-Key = 0000000020000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BFE27CB1B52150E0636A81473148B018
-
-Key = 0000000010000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F79BE17022979D01E3AFFB3499556DC4
-
-Key = 0000000008000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A2F2B772060C53A539B5A3FE4C935171
-
-Key = 0000000004000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DB97947A8B14B3E3859068A0288285F6
-
-Key = 0000000002000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1FD086FE698C5E092A8E0C9EE527714A
-
-Key = 0000000001000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8ADAB79B444DDDF86B8D53D2A9112881
-
-Key = 0000000000800000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C36CEC9730A74CE94CF2EA5C7B0EC3ED
-
-Key = 0000000000400000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 033629A0675A45A11BE7924137D711EC
-
-Key = 0000000000200000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D5C22EF288E7D2D04BC04B57B702A03F
-
-Key = 0000000000100000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1FD290A5EB2E278C6396625034EB268C
-
-Key = 0000000000080000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 05C35E0CB6D27E6E9D680368B2ABA9B5
-
-Key = 0000000000040000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B0194CDF7510FE98EDF9464259378FAF
-
-Key = 0000000000020000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 043729754E5B1F63408F62742E5F2765
-
-Key = 0000000000010000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 24A2746042EC7970E8AB59589AD63775
-
-Key = 0000000000008000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7BDEF0A2EF8B637C4C3C5D001BAB5F85
-
-Key = 0000000000004000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0221B515A1559D96E9C3CBFB929E96A9
-
-Key = 0000000000002000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7E975026E5771D90EDA081B72C0BC77C
-
-Key = 0000000000001000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7C7F9F98B4739C9774F84E75E5B30A95
-
-Key = 0000000000000800000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A4E176B7C98D76BC6662BBB3E606BA9C
-
-Key = 0000000000000400000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7FDBDA5910B26D8D3FE42987B09430C0
-
-Key = 0000000000000200000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7B134F40F8E10D8287B8E6FC0BDE45E8
-
-Key = 0000000000000100000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CF3C98CC0CAFB2935385C0B5D8F07857
-
-Key = 0000000000000080000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FB71BA47019735DA4082D68A1A587BDB
-
-Key = 0000000000000040000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E9D45576FC1A56DAFB48ABFB90A1DE4B
-
-Key = 0000000000000020000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AE9408DC1A007CA9C13F2F9D12FC4F71
-
-Key = 0000000000000010000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B407201A6A44CB236468709B181BCA23
-
-Key = 0000000000000008000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 06E1A40D4F7534E24538D26802AF9E98
-
-Key = 0000000000000004000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3468992A9D6F274286611D1E5DB327BA
-
-Key = 0000000000000002000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 635748DEDCB4E65B76E818D09994D19A
-
-Key = 0000000000000001000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C2A0DACC741E90029F16CDA81BEB8D0C
-
-Key = 0000000000000000800000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D20B9853FC98ED3FCFA4C3B9781352D3
-
-Key = 0000000000000000400000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 869B106388046F6F5F9AE5ADC1F23BC2
-
-Key = 0000000000000000200000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4F9BF7227D943B80C97B2FED132098FE
-
-Key = 0000000000000000100000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7232A96D275C409349A0382BAE576274
-
-Key = 0000000000000000080000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = ADAF9B3E14B8CC101A2F143B373517B7
-
-Key = 0000000000000000040000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 813E38DF25E4356EAFC7ECEB75270FD4
-
-Key = 0000000000000000020000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 46D6957C76223046E232EEBB661CCE59
-
-Key = 0000000000000000010000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1714E3EDD2A7BFE4FC35D4B6034E4184
-
-Key = 0000000000000000008000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 445ED35901D4608FAC3BCD59E685E77C
-
-Key = 0000000000000000004000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 236F86A3A59F563611C9A1A9C8DF045C
-
-Key = 0000000000000000002000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FC0739E82EF130E533C77FA15BD85B57
-
-Key = 0000000000000000001000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EDC81185A966066433F1B19BE7659080
-
-Key = 0000000000000000000800000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9D0ED59542D4851F7812B29640739765
-
-Key = 0000000000000000000400000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4BA903B83FD4A443564723403BD7D431
-
-Key = 0000000000000000000200000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5DA2CD3D64EDCB29588F02BFED3D575B
-
-Key = 0000000000000000000100000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E66697B697E8881555F5B358A2EB7628
-
-Key = 0000000000000000000080000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7DE9B3320A7872088B1417AAC4E841ED
-
-Key = 0000000000000000000040000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 236D82828CE9A9471B51DDCDA350C542
-
-Key = 0000000000000000000020000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CF250F09887F0B9300FF865810A2E03F
-
-Key = 0000000000000000000010000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0103157DB999DF64D6C6DACB16F15F78
-
-Key = 0000000000000000000008000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EA918B3C7929C992E6F0D7B0DD6B8A59
-
-Key = 0000000000000000000004000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FB853888B1D95F9C7BB7630231C9108E
-
-Key = 0000000000000000000002000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 46E63459DCC0514DD200BF82B6AEEA0B
-
-Key = 0000000000000000000001000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 19051C0A056D4B56DFF08C52FBBD4547
-
-Key = 0000000000000000000000800000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 055240C320AC09978BE4EC0EE9E40123
-
-Key = 0000000000000000000000400000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E0D04118BAD95366416C6D715507646B
-
-Key = 0000000000000000000000200000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 888C70E963419AA6446123CD9685252C
-
-Key = 0000000000000000000000100000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E060A32AF3CD8A525C60A8EB4BEB5B24
-
-Key = 0000000000000000000000080000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 36A235722A72A5BD05896B74EBB39E35
-
-Key = 0000000000000000000000040000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 665A781CF1F7839FA4E7EF66F5B47D45
-
-Key = 0000000000000000000000020000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8156E976338FB48ED3E469F1485EAA06
-
-Key = 0000000000000000000000010000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BA853DF1B7622D17A549624B234082F8
-
-Key = 0000000000000000000000008000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3A411EF75149822F0C4E998587BA0CAD
-
-Key = 0000000000000000000000004000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EA33525A7CC7C74340773389A764513E
-
-Key = 0000000000000000000000002000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E007DDE8158568CF80C470745E455EEE
-
-Key = 0000000000000000000000001000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C140AE31D6B8AB675539344B9D857A89
-
-Key = 0000000000000000000000000800000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8C86266079ABCEE926A5EF6F80F50308
-
-Key = 0000000000000000000000000400000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CD77B23315E31DF96FABD6E427184F9F
-
-Key = 0000000000000000000000000200000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A72E93628614A603E59ECC5C766A639B
-
-Key = 0000000000000000000000000100000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 00EE192F18F06F5799B9593DE71B2FBE
-
-Key = 0000000000000000000000000080000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A79378A27F39485A2A6757A953DE8D63
-
-Key = 0000000000000000000000000040000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 38353F1349680DF284CF7D59272D435B
-
-Key = 0000000000000000000000000020000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0960EF878BE3F63CB8A25AFDEE9272F8
-
-Key = 0000000000000000000000000010000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CB52EEC84DD320FB74A13DF2D4AF5B64
-
-Key = 0000000000000000000000000008000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 89525CFDCCC1A572987EEEC44507942D
-
-Key = 0000000000000000000000000004000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 894183826F3CD163F2BDCE8FD123BCBD
-
-Key = 0000000000000000000000000002000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 152FAB85782DD050EF29C8C7E95C5941
-
-Key = 0000000000000000000000000001000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6C8CC544D1E6B9B8ACEB723A6E903710
-
-Key = 0000000000000000000000000000800000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9D1DCFEFD9CAEB5934AA93278F8E0988
-
-Key = 0000000000000000000000000000400000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 86473616CFE39825E9F93B4A5D1518F0
-
-Key = 0000000000000000000000000000200000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3EC955C39DC4442411A578115482A331
-
-Key = 0000000000000000000000000000100000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 117C11E5DAFA73A4CBA2E599582DF463
-
-Key = 0000000000000000000000000000080000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 371B4F0F917CDC7F028CF90072EA6C0C
-
-Key = 0000000000000000000000000000040000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F6EAC5AC916431427022EE688D4E8248
-
-Key = 0000000000000000000000000000020000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5E7787153D1C5E94A860600D0FE0F695
-
-Key = 0000000000000000000000000000010000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 44888E6DD958A843AF2143DA81986196
-
-Key = 0000000000000000000000000000008000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F3B940BFEFF393BFDAF0C435D262961C
-
-Key = 0000000000000000000000000000004000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 40781DABC58A81B11FAA4039E6F73345
-
-Key = 0000000000000000000000000000002000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7685B120BD850BD6D7A618E023D42BA0
-
-Key = 0000000000000000000000000000001000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8088416E7FEDB30B1883DF50E29CD4D1
-
-Key = 0000000000000000000000000000000800000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B0C9ED5257B103131AB5DBECC16D1547
-
-Key = 0000000000000000000000000000000400000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 01C8B821C4683B586CD8096A0DC4FDAA
-
-Key = 0000000000000000000000000000000200000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4CA16F058B3AE1E2B3774E3DF99087CA
-
-Key = 0000000000000000000000000000000100000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 620D06B8EFBFDD1EE274D5EAE42B8F0E
-
-Key = 0000000000000000000000000000000080000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 34CF934F88C0D631B3D80BE0A5671B11
-
-Key = 0000000000000000000000000000000040000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F8AB4045BD0CD95486B921B7430E74A0
-
-Key = 0000000000000000000000000000000020000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 96ECEC4088D81E2EF27D74A96E2614DC
-
-Key = 0000000000000000000000000000000010000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EB0152474310B99F0F8F0DFD6D67962C
-
-Key = 0000000000000000000000000000000008000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 74DA68DA599D7DD37918F24F7654DC4D
-
-Key = 0000000000000000000000000000000004000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F766AD686EB2BAF2950974F78968F510
-
-Key = 0000000000000000000000000000000002000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A2D18CF5C770587E19DBD6FFEBD52FAE
-
-Key = 0000000000000000000000000000000001000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DDADE16C2B9E78715FC281197149E4F0
-
-Key = 0000000000000000000000000000000000800000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 79931CFAC3FD4F540E53905538B5E122
-
-Key = 0000000000000000000000000000000000400000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 93F88DDDE5004BD8998CDB7A1BD1EE4D
-
-Key = 0000000000000000000000000000000000200000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 011A413B2CC8E56A94A5C6D3932B3C3B
-
-Key = 0000000000000000000000000000000000100000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C509B737BBC749EE466ADF8142F52B28
-
-Key = 0000000000000000000000000000000000080000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 514332276B9E9299F9F722B63752B0A8
-
-Key = 0000000000000000000000000000000000040000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D9F3A75F94986D0A1AB14258934C21D1
-
-Key = 0000000000000000000000000000000000020000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6FE84CDC49C9A8A55D85EA1A1D5C0DD9
-
-Key = 0000000000000000000000000000000000010000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0C85C65BD9DE393D2FEA3BE5AC7BAB67
-
-Key = 0000000000000000000000000000000000008000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 904C7F2E8084FC10D59480C3DE1CB1A4
-
-Key = 0000000000000000000000000000000000004000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 52C696236B4B7EE6B03B8876DEA8DD45
-
-Key = 0000000000000000000000000000000000002000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A0D46DAEA95CB4968F62BD9B3F8075A8
-
-Key = 0000000000000000000000000000000000001000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 51BE75B32A05384D2A2E08CB1EAB5F63
-
-Key = 0000000000000000000000000000000000000800000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1123151EB432831D2C65A90ED1D0A429
-
-Key = 0000000000000000000000000000000000000400000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A26350A8FF6C10FCBA736D46FC26BF69
-
-Key = 0000000000000000000000000000000000000200000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FF85BEF6CF6674FA5EE40EC9FB9052FF
-
-Key = 0000000000000000000000000000000000000100000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6ED96DB33AB981AF27894AC436CB4D62
-
-Key = 0000000000000000000000000000000000000080000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B38DE9B3C4D6D128101B02FDD05E3BF8
-
-Key = 0000000000000000000000000000000000000040000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 11E05766EBB66AB211E2D9653EF3144D
-
-Key = 0000000000000000000000000000000000000020000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F6A196E085116E5BC21732A2EF9ACAF4
-
-Key = 0000000000000000000000000000000000000010000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BC2A6753CA41E306A0500E97B38D8A9A
-
-Key = 0000000000000000000000000000000000000008000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 773A687B1FC97918943C1B66EF693354
-
-Key = 0000000000000000000000000000000000000004000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C6E2112CCDBD821D2B9068B285C5192B
-
-Key = 0000000000000000000000000000000000000002000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EA69C8E28021801EE9A14809848D781F
-
-Key = 0000000000000000000000000000000000000001000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6290745CD4CB62DE172F8AB30966EB57
-
-Key = 0000000000000000000000000000000000000000800000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1051EE4C389B96B1365B417C74EFBF10
-
-Key = 0000000000000000000000000000000000000000400000000000000000000000
-In = 00000000000000000000000000000000
-Out = 52B6F3EE6655128999EEE3831E708D76
-
-Key = 0000000000000000000000000000000000000000200000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5BDE19A1D741ECE40CE98CD02F02AD75
-
-Key = 0000000000000000000000000000000000000000100000000000000000000000
-In = 00000000000000000000000000000000
-Out = 36EF5E803A68F6AC20D92FB14E2AFDF5
-
-Key = 0000000000000000000000000000000000000000080000000000000000000000
-In = 00000000000000000000000000000000
-Out = B3E1E30B78FBBCA07F065A422D33410B
-
-Key = 0000000000000000000000000000000000000000040000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5FA0E6C8E6C1FCD613975A18348484CB
-
-Key = 0000000000000000000000000000000000000000020000000000000000000000
-In = 00000000000000000000000000000000
-Out = B74E4A2406EEB2AB836AED857754A612
-
-Key = 0000000000000000000000000000000000000000010000000000000000000000
-In = 00000000000000000000000000000000
-Out = 52EBF44DB69347A22DF8CA0ABAE3D668
-
-Key = 0000000000000000000000000000000000000000008000000000000000000000
-In = 00000000000000000000000000000000
-Out = 986B7B05D1E9639779D034047FC3B780
-
-Key = 0000000000000000000000000000000000000000004000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1846AF7EB612C5C356DAF4FE42108444
-
-Key = 0000000000000000000000000000000000000000002000000000000000000000
-In = 00000000000000000000000000000000
-Out = 22AD41F78567C6D5C2266486404168DC
-
-Key = 0000000000000000000000000000000000000000001000000000000000000000
-In = 00000000000000000000000000000000
-Out = 73409A5B03D08BCEE496F7255417DEC5
-
-Key = 0000000000000000000000000000000000000000000800000000000000000000
-In = 00000000000000000000000000000000
-Out = 32C47FAEB48DA7847B3C5B063153B049
-
-Key = 0000000000000000000000000000000000000000000400000000000000000000
-In = 00000000000000000000000000000000
-Out = 5514F66B91C06AD15BE581AA99F5961B
-
-Key = 0000000000000000000000000000000000000000000200000000000000000000
-In = 00000000000000000000000000000000
-Out = 38AF52E0648030498BA94D0BBF819B8A
-
-Key = 0000000000000000000000000000000000000000000100000000000000000000
-In = 00000000000000000000000000000000
-Out = 91D48EEE9A769F0753C6A6DC1037405D
-
-Key = 0000000000000000000000000000000000000000000080000000000000000000
-In = 00000000000000000000000000000000
-Out = 2CA3F3F2BB2332984A97E5274462E7AF
-
-Key = 0000000000000000000000000000000000000000000040000000000000000000
-In = 00000000000000000000000000000000
-Out = 806EE4C1C6432102E40A21F03222B0E1
-
-Key = 0000000000000000000000000000000000000000000020000000000000000000
-In = 00000000000000000000000000000000
-Out = E8BBDC90505FE81AB2024274BB2FA258
-
-Key = 0000000000000000000000000000000000000000000010000000000000000000
-In = 00000000000000000000000000000000
-Out = 307920977ADAD0EEDEBA2CB8AF83D3CE
-
-Key = 0000000000000000000000000000000000000000000008000000000000000000
-In = 00000000000000000000000000000000
-Out = 6B0A17013DFAAD05442FA8B298043438
-
-Key = 0000000000000000000000000000000000000000000004000000000000000000
-In = 00000000000000000000000000000000
-Out = BA6EC60065FA6C9679D7E47FC1B85479
-
-Key = 0000000000000000000000000000000000000000000002000000000000000000
-In = 00000000000000000000000000000000
-Out = F1AA580B5E904BED235ACE85C0E009D0
-
-Key = 0000000000000000000000000000000000000000000001000000000000000000
-In = 00000000000000000000000000000000
-Out = 9092A797F7024CC218B4A3575F4F7D63
-
-Key = 0000000000000000000000000000000000000000000000800000000000000000
-In = 00000000000000000000000000000000
-Out = CF404B154F2A8388DA9ED1E93AC78894
-
-Key = 0000000000000000000000000000000000000000000000400000000000000000
-In = 00000000000000000000000000000000
-Out = 1B32215E25E3EB15FE4BED2F2F31281E
-
-Key = 0000000000000000000000000000000000000000000000200000000000000000
-In = 00000000000000000000000000000000
-Out = 999B92E27EC161089F45DB53D036C8F0
-
-Key = 0000000000000000000000000000000000000000000000100000000000000000
-In = 00000000000000000000000000000000
-Out = B2F7DBFD67DBC260A7CFCD9C90FEF16F
-
-Key = 0000000000000000000000000000000000000000000000080000000000000000
-In = 00000000000000000000000000000000
-Out = 7BD9AA3B08F103C796EE8023EF474F0A
-
-Key = 0000000000000000000000000000000000000000000000040000000000000000
-In = 00000000000000000000000000000000
-Out = 483121AF85F36EA159BE2EB5802FBF21
-
-Key = 0000000000000000000000000000000000000000000000020000000000000000
-In = 00000000000000000000000000000000
-Out = AE2788C2115CB466713687AB06FE5E46
-
-Key = 0000000000000000000000000000000000000000000000010000000000000000
-In = 00000000000000000000000000000000
-Out = ADE758D100ABEEB7BA80BF257781494D
-
-Key = 0000000000000000000000000000000000000000000000008000000000000000
-In = 00000000000000000000000000000000
-Out = 6DF30205652926EB339833F2EDD8472E
-
-Key = 0000000000000000000000000000000000000000000000004000000000000000
-In = 00000000000000000000000000000000
-Out = 031E86B2AD4D83A4A19BCAF191F9B65A
-
-Key = 0000000000000000000000000000000000000000000000002000000000000000
-In = 00000000000000000000000000000000
-Out = F605CCC9E46B1792EA2F0B4124924F42
-
-Key = 0000000000000000000000000000000000000000000000001000000000000000
-In = 00000000000000000000000000000000
-Out = A70E3286C50B8DD8306109AB59119510
-
-Key = 0000000000000000000000000000000000000000000000000800000000000000
-In = 00000000000000000000000000000000
-Out = 6922EEA4B8AE7BFECE899009848A33DA
-
-Key = 0000000000000000000000000000000000000000000000000400000000000000
-In = 00000000000000000000000000000000
-Out = 1DD856F5453D1D61860E48035BFDADC7
-
-Key = 0000000000000000000000000000000000000000000000000200000000000000
-In = 00000000000000000000000000000000
-Out = 9AE9BEC5D195B32BD52623EF21CF2AA3
-
-Key = 0000000000000000000000000000000000000000000000000100000000000000
-In = 00000000000000000000000000000000
-Out = C89ADA0E7DF448DE2155DB7C3E3EAAF2
-
-Key = 0000000000000000000000000000000000000000000000000080000000000000
-In = 00000000000000000000000000000000
-Out = 0D176C6E373B2A3B3408AD24BE258365
-
-Key = 0000000000000000000000000000000000000000000000000040000000000000
-In = 00000000000000000000000000000000
-Out = 8C2E48AF6FE6305B58EF5B950061E93C
-
-Key = 0000000000000000000000000000000000000000000000000020000000000000
-In = 00000000000000000000000000000000
-Out = 2E81D19464919FFB1886E81C46AEDE37
-
-Key = 0000000000000000000000000000000000000000000000000010000000000000
-In = 00000000000000000000000000000000
-Out = 7169BEE79D4DCC57F771A43AA0A80EF1
-
-Key = 0000000000000000000000000000000000000000000000000008000000000000
-In = 00000000000000000000000000000000
-Out = 425223474892BA95538DAFF58F3DD0D3
-
-Key = 0000000000000000000000000000000000000000000000000004000000000000
-In = 00000000000000000000000000000000
-Out = B2650BF17E26E9A4F6484DD2992517D9
-
-Key = 0000000000000000000000000000000000000000000000000002000000000000
-In = 00000000000000000000000000000000
-Out = 71936A21362F80ECCED8FC955FF159F3
-
-Key = 0000000000000000000000000000000000000000000000000001000000000000
-In = 00000000000000000000000000000000
-Out = E09665C274E582FFD6BCD0663BD6EA12
-
-Key = 0000000000000000000000000000000000000000000000000000800000000000
-In = 00000000000000000000000000000000
-Out = 3E8D36D10E6AB4454154A226B7D6E50E
-
-Key = 0000000000000000000000000000000000000000000000000000400000000000
-In = 00000000000000000000000000000000
-Out = 5D008338DDD66164591A9B98B23323CA
-
-Key = 0000000000000000000000000000000000000000000000000000200000000000
-In = 00000000000000000000000000000000
-Out = 6BC5ACE2FA017CCC5CD0A8E88AF73B28
-
-Key = 0000000000000000000000000000000000000000000000000000100000000000
-In = 00000000000000000000000000000000
-Out = C115E4646FC054C50C2BBEC7C20C94F7
-
-Key = 0000000000000000000000000000000000000000000000000000080000000000
-In = 00000000000000000000000000000000
-Out = 2CEB602F3C61BE94AF96FD012BB3190C
-
-Key = 0000000000000000000000000000000000000000000000000000040000000000
-In = 00000000000000000000000000000000
-Out = 5A04F68F56580702891E4ECF6C600C92
-
-Key = 0000000000000000000000000000000000000000000000000000020000000000
-In = 00000000000000000000000000000000
-Out = D6A0DC0D5FB91B6478B9A1AAA586431B
-
-Key = 0000000000000000000000000000000000000000000000000000010000000000
-In = 00000000000000000000000000000000
-Out = E38BB33BF982D61BB2CD980BFCE4C2BF
-
-Key = 0000000000000000000000000000000000000000000000000000008000000000
-In = 00000000000000000000000000000000
-Out = B47BF164959077E378396A175020AC95
-
-Key = 0000000000000000000000000000000000000000000000000000004000000000
-In = 00000000000000000000000000000000
-Out = CC5CEE68ABBFDC2DFE32FD3A1E433932
-
-Key = 0000000000000000000000000000000000000000000000000000002000000000
-In = 00000000000000000000000000000000
-Out = A8180BBB689F29A560296FF24C785DC4
-
-Key = 0000000000000000000000000000000000000000000000000000001000000000
-In = 00000000000000000000000000000000
-Out = DCCBE0BB943D3B772010A08C11E82763
-
-Key = 0000000000000000000000000000000000000000000000000000000800000000
-In = 00000000000000000000000000000000
-Out = 0439C5D8BB8BDD7FCB3A3281BD8A3A3F
-
-Key = 0000000000000000000000000000000000000000000000000000000400000000
-In = 00000000000000000000000000000000
-Out = 2864CEAE94E09933190479BEA2515040
-
-Key = 0000000000000000000000000000000000000000000000000000000200000000
-In = 00000000000000000000000000000000
-Out = 2AFF33A00C93057FE56EDCBBB65987BB
-
-Key = 0000000000000000000000000000000000000000000000000000000100000000
-In = 00000000000000000000000000000000
-Out = 38C6B37E80EC873DE0A0ABEB9803438F
-
-Key = 0000000000000000000000000000000000000000000000000000000080000000
-In = 00000000000000000000000000000000
-Out = 1D9428E92329672C0E902F6AA6AFC874
-
-Key = 0000000000000000000000000000000000000000000000000000000040000000
-In = 00000000000000000000000000000000
-Out = 2AB8CC1998977DF208C97B2D0DC86C54
-
-Key = 0000000000000000000000000000000000000000000000000000000020000000
-In = 00000000000000000000000000000000
-Out = 2E42C343E7E489916E2F2C0AD2AFFFB1
-
-Key = 0000000000000000000000000000000000000000000000000000000010000000
-In = 00000000000000000000000000000000
-Out = 571C17477C9FB6C334718983E0B25859
-
-Key = 0000000000000000000000000000000000000000000000000000000008000000
-In = 00000000000000000000000000000000
-Out = 3ABAD289F84A4B75412C82D8AD9BD739
-
-Key = 0000000000000000000000000000000000000000000000000000000004000000
-In = 00000000000000000000000000000000
-Out = E91C1A5E57DD295A7F4AC1687F6B8DB6
-
-Key = 0000000000000000000000000000000000000000000000000000000002000000
-In = 00000000000000000000000000000000
-Out = 60CEAEC342165320652D7ED13FDAC05A
-
-Key = 0000000000000000000000000000000000000000000000000000000001000000
-In = 00000000000000000000000000000000
-Out = DA854CEC00C19BB97F7D8292ABAEB5BB
-
-Key = 0000000000000000000000000000000000000000000000000000000000800000
-In = 00000000000000000000000000000000
-Out = 6BC45EBD7172512E5F6D51C60E271ACF
-
-Key = 0000000000000000000000000000000000000000000000000000000000400000
-In = 00000000000000000000000000000000
-Out = 6604FAE8ECBC741D0F46D90AA235CAF6
-
-Key = 0000000000000000000000000000000000000000000000000000000000200000
-In = 00000000000000000000000000000000
-Out = 5F95FA50CF7CDD4B619DCB8D6E0B7873
-
-Key = 0000000000000000000000000000000000000000000000000000000000100000
-In = 00000000000000000000000000000000
-Out = C98C198A5A988E2911302C22BFDC4890
-
-Key = 0000000000000000000000000000000000000000000000000000000000080000
-In = 00000000000000000000000000000000
-Out = 4B5818505B80DA67A206BF3107DF2B4C
-
-Key = 0000000000000000000000000000000000000000000000000000000000040000
-In = 00000000000000000000000000000000
-Out = B2EA813634A26DC5894BFC4BB070E147
-
-Key = 0000000000000000000000000000000000000000000000000000000000020000
-In = 00000000000000000000000000000000
-Out = B6DDED10D2E8B13D7C758692C844017B
-
-Key = 0000000000000000000000000000000000000000000000000000000000010000
-In = 00000000000000000000000000000000
-Out = F2DC2468DF800E237C026F968CC3AAE2
-
-Key = 0000000000000000000000000000000000000000000000000000000000008000
-In = 00000000000000000000000000000000
-Out = EBCCE81109DCF1B9793AB60BD062F033
-
-Key = 0000000000000000000000000000000000000000000000000000000000004000
-In = 00000000000000000000000000000000
-Out = 1BC015DC9E1B9DBB68293EB93D65088F
-
-Key = 0000000000000000000000000000000000000000000000000000000000002000
-In = 00000000000000000000000000000000
-Out = F718F0FC2A276D6CBB7A2BD59BBC3DB0
-
-Key = 0000000000000000000000000000000000000000000000000000000000001000
-In = 00000000000000000000000000000000
-Out = D89BE6BDD07222EF8297FDD246C3DA09
-
-Key = 0000000000000000000000000000000000000000000000000000000000000800
-In = 00000000000000000000000000000000
-Out = 7013B55968A743157C4959DE2068AC57
-
-Key = 0000000000000000000000000000000000000000000000000000000000000400
-In = 00000000000000000000000000000000
-Out = 758199FCB16B8ADF9B1350A02B10B735
-
-Key = 0000000000000000000000000000000000000000000000000000000000000200
-In = 00000000000000000000000000000000
-Out = 29D38DC5215AA1F3CAEC044C8B472696
-
-Key = 0000000000000000000000000000000000000000000000000000000000000100
-In = 00000000000000000000000000000000
-Out = F5E1BCA4497ED2B1D871B5877C5BE3A8
-
-Key = 0000000000000000000000000000000000000000000000000000000000000080
-In = 00000000000000000000000000000000
-Out = C7388535D265CBFCEDE6423CC29F33A4
-
-Key = 0000000000000000000000000000000000000000000000000000000000000040
-In = 00000000000000000000000000000000
-Out = 84992BD0280C4CDF8B1587D42AA63605
-
-Key = 0000000000000000000000000000000000000000000000000000000000000020
-In = 00000000000000000000000000000000
-Out = 197E91D0F0261D975BA1F6FAA7983E51
-
-Key = 0000000000000000000000000000000000000000000000000000000000000010
-In = 00000000000000000000000000000000
-Out = 644BDF2B1508CFF2E8D791DADC5D4BD6
-
-Key = 0000000000000000000000000000000000000000000000000000000000000008
-In = 00000000000000000000000000000000
-Out = D7BB8C6C07F21F648CE87A17A0589334
-
-Key = 0000000000000000000000000000000000000000000000000000000000000004
-In = 00000000000000000000000000000000
-Out = B6718CB65E557AF3C25D03770AD6B1FA
-
-Key = 0000000000000000000000000000000000000000000000000000000000000002
-In = 00000000000000000000000000000000
-Out = F32E30ADD384B71F7254A15B4042E1F6
-
-Key = 0000000000000000000000000000000000000000000000000000000000000001
-In = 00000000000000000000000000000000
-Out = B5C218F26198EE763B863EDA24446609
-
-Key = 00000000000000000000000000000000
-In = 80000000000000000000000000000000
-Out = D962EFEBA75817BF6ED24BBBB5B7820D
-
-Key = 00000000000000000000000000000000
-In = 40000000000000000000000000000000
-Out = 639B9F07305BCC1D2E64CE3D1671304A
-
-Key = 00000000000000000000000000000000
-In = 20000000000000000000000000000000
-Out = 33ACF35AF3FF94B4C0A59C9035C99E79
-
-Key = 00000000000000000000000000000000
-In = 10000000000000000000000000000000
-Out = C18D6444EE8DEAECC4697D021B9694D2
-
-Key = 00000000000000000000000000000000
-In = 08000000000000000000000000000000
-Out = 37DDA7DC913E6253679EB4A1906AE47C
-
-Key = 00000000000000000000000000000000
-In = 04000000000000000000000000000000
-Out = 1DED0AB726E2358CCB57451EB5A1711A
-
-Key = 00000000000000000000000000000000
-In = 02000000000000000000000000000000
-Out = BFB43CD34EEC7C0A34CD77759E1396CE
-
-Key = 00000000000000000000000000000000
-In = 01000000000000000000000000000000
-Out = 607C0F5FB6A489AED3D3238FB0C51D37
-
-Key = 00000000000000000000000000000000
-In = 00800000000000000000000000000000
-Out = 0EBFB100FBBA1A66319743F846383323
-
-Key = 00000000000000000000000000000000
-In = 00400000000000000000000000000000
-Out = 8ECA01741C7622FB9EB41FD9826EEA32
-
-Key = 00000000000000000000000000000000
-In = 00200000000000000000000000000000
-Out = BC7CABCFE201ECE01A42C2F4C49C1237
-
-Key = 00000000000000000000000000000000
-In = 00100000000000000000000000000000
-Out = 6DD5E5FFF9A41C637553AC4873E118F6
-
-Key = 00000000000000000000000000000000
-In = 00080000000000000000000000000000
-Out = 009DFBAA196DF5257E6F48F3310DDD58
-
-Key = 00000000000000000000000000000000
-In = 00040000000000000000000000000000
-Out = 9A41BD1783AFB149865D341334D8DA3D
-
-Key = 00000000000000000000000000000000
-In = 00020000000000000000000000000000
-Out = 9D3A9D9EA90505D970CA6C1FB39CBE11
-
-Key = 00000000000000000000000000000000
-In = 00010000000000000000000000000000
-Out = 35495878D00360B50D980A6C7B193F2F
-
-Key = 00000000000000000000000000000000
-In = 00008000000000000000000000000000
-Out = 81D74A81C7F5A5316314B02C6DB4BAA6
-
-Key = 00000000000000000000000000000000
-In = 00004000000000000000000000000000
-Out = 4B0B95251D8737013E01F73B71DBEBFE
-
-Key = 00000000000000000000000000000000
-In = 00002000000000000000000000000000
-Out = 8793996649604702198290E258A151DF
-
-Key = 00000000000000000000000000000000
-In = 00001000000000000000000000000000
-Out = 99F161837DF7F24E3748C2BBCD71417F
-
-Key = 00000000000000000000000000000000
-In = 00000800000000000000000000000000
-Out = 305049B5511EA8FBD5C36AB3E62E59EE
-
-Key = 00000000000000000000000000000000
-In = 00000400000000000000000000000000
-Out = 89BF8940DD39B51B35E70F62137AE5EA
-
-Key = 00000000000000000000000000000000
-In = 00000200000000000000000000000000
-Out = 301847CD9DA64B1BFD9E781056457761
-
-Key = 00000000000000000000000000000000
-In = 00000100000000000000000000000000
-Out = 04B0F6A6C8BE9C4A771701DA1F2BD512
-
-Key = 00000000000000000000000000000000
-In = 00000080000000000000000000000000
-Out = 91898CFEE3784B0299A655391057081E
-
-Key = 00000000000000000000000000000000
-In = 00000040000000000000000000000000
-Out = 6515031342504BAC93832D74B18DE5F9
-
-Key = 00000000000000000000000000000000
-In = 00000020000000000000000000000000
-Out = D98ED2EEACB67C0FFDDA9724C309DF25
-
-Key = 00000000000000000000000000000000
-In = 00000010000000000000000000000000
-Out = 4F963C1680E07CA4DD7C3759F848D2CC
-
-Key = 00000000000000000000000000000000
-In = 00000008000000000000000000000000
-Out = B51D85DC8C8F5A7EA15EFBEDBCBFC9E4
-
-Key = 00000000000000000000000000000000
-In = 00000004000000000000000000000000
-Out = F7C45BC3FA262A837C670776238C767E
-
-Key = 00000000000000000000000000000000
-In = 00000002000000000000000000000000
-Out = 5E912791AC2F572389999FD369EC8E37
-
-Key = 00000000000000000000000000000000
-In = 00000001000000000000000000000000
-Out = 7E8C9BA80ADC579747B1E4616D7EC9B3
-
-Key = 00000000000000000000000000000000
-In = 00000000800000000000000000000000
-Out = BF99640F187DB0C2944B959050B62F6D
-
-Key = 00000000000000000000000000000000
-In = 00000000400000000000000000000000
-Out = C5E61399609A0BE02A916D48A8A64C63
-
-Key = 00000000000000000000000000000000
-In = 00000000200000000000000000000000
-Out = 07B4116F41B82767CB72E2E64CC046E3
-
-Key = 00000000000000000000000000000000
-In = 00000000100000000000000000000000
-Out = AB696B5F4E7ABDFCEC1D2DEDAC05E2A0
-
-Key = 00000000000000000000000000000000
-In = 00000000080000000000000000000000
-Out = 50654EE25CF9E493B0B7138EE74BC166
-
-Key = 00000000000000000000000000000000
-In = 00000000040000000000000000000000
-Out = BDA01373F42BFC2B0F723366A46E1FF1
-
-Key = 00000000000000000000000000000000
-In = 00000000020000000000000000000000
-Out = AE25CD3DF7FC7BB8A2E645EBD79D2A29
-
-Key = 00000000000000000000000000000000
-In = 00000000010000000000000000000000
-Out = 644664257BFAD3A0CF16D683A026A72A
-
-Key = 00000000000000000000000000000000
-In = 00000000008000000000000000000000
-Out = 3AD0281E1F1225280383D5B7A3E90B04
-
-Key = 00000000000000000000000000000000
-In = 00000000004000000000000000000000
-Out = 23F2882568F472EBC1B519122823441C
-
-Key = 00000000000000000000000000000000
-In = 00000000002000000000000000000000
-Out = 8DE047245D62895A7E5852CEE8379A4F
-
-Key = 00000000000000000000000000000000
-In = 00000000001000000000000000000000
-Out = 21ADF95994B6FEC5DA6FC40FEA782D79
-
-Key = 00000000000000000000000000000000
-In = 00000000000800000000000000000000
-Out = F2834B5587D63C382DBC397101EBB64F
-
-Key = 00000000000000000000000000000000
-In = 00000000000400000000000000000000
-Out = 884C3D3850DC3EFFEAA0DB8785BEC5E5
-
-Key = 00000000000000000000000000000000
-In = 00000000000200000000000000000000
-Out = 71AB2DB59AE3AAF781DAB5CAD1007975
-
-Key = 00000000000000000000000000000000
-In = 00000000000100000000000000000000
-Out = 7793380505B20B6CDA1A2CEB6AF6D76D
-
-Key = 00000000000000000000000000000000
-In = 00000000000080000000000000000000
-Out = 6A986D4B71CC337450CA165B110414AB
-
-Key = 00000000000000000000000000000000
-In = 00000000000040000000000000000000
-Out = EEC535764784A680C2852BD4B00ED6AC
-
-Key = 00000000000000000000000000000000
-In = 00000000000020000000000000000000
-Out = 431A4B03918BD1A65D3523D63C7CBCA9
-
-Key = 00000000000000000000000000000000
-In = 00000000000010000000000000000000
-Out = 6E657880D84A51B2241109E82B2A7EEE
-
-Key = 00000000000000000000000000000000
-In = 00000000000008000000000000000000
-Out = B4D163CFD4279B1F9DA0E1FC8616940C
-
-Key = 00000000000000000000000000000000
-In = 00000000000004000000000000000000
-Out = 552143C6F2B0A0AB82B2AD487BD74DF4
-
-Key = 00000000000000000000000000000000
-In = 00000000000002000000000000000000
-Out = A8CED7B931A5AD407DDEF7F4510DBA70
-
-Key = 00000000000000000000000000000000
-In = 00000000000001000000000000000000
-Out = 55BB234ED4164A9CC028C9C9DADA8A06
-
-Key = 00000000000000000000000000000000
-In = 00000000000000800000000000000000
-Out = 0576F9792BA215C89BE0C86D8B3E84B6
-
-Key = 00000000000000000000000000000000
-In = 00000000000000400000000000000000
-Out = C117C7A4AF79DEECC8C18E8138BD4F78
-
-Key = 00000000000000000000000000000000
-In = 00000000000000200000000000000000
-Out = 92FC2FDE8E99F5ECF5DFFB2B005C3790
-
-Key = 00000000000000000000000000000000
-In = 00000000000000100000000000000000
-Out = F3C94469F9B4166B76A7DA55FC45EE2B
-
-Key = 00000000000000000000000000000000
-In = 00000000000000080000000000000000
-Out = 4C3A60421F79015B99A9B928477CC451
-
-Key = 00000000000000000000000000000000
-In = 00000000000000040000000000000000
-Out = ED6A1AF53574213F41812E8F5D41536B
-
-Key = 00000000000000000000000000000000
-In = 00000000000000020000000000000000
-Out = AF39A2A89D48B0A2F519B39F3DD4A7E9
-
-Key = 00000000000000000000000000000000
-In = 00000000000000010000000000000000
-Out = 7F75ED2F965C9ED280CFA16B934E81D9
-
-Key = 00000000000000000000000000000000
-In = 00000000000000008000000000000000
-Out = B92C3EEB72B6BFD288E1F38D64248E93
-
-Key = 00000000000000000000000000000000
-In = 00000000000000004000000000000000
-Out = 6FE1E1883D78ADF9FD415265A539D61C
-
-Key = 00000000000000000000000000000000
-In = 00000000000000002000000000000000
-Out = D5ABB34FC2D207FB0F8DF60DA81B9661
-
-Key = 00000000000000000000000000000000
-In = 00000000000000001000000000000000
-Out = 751327283356553AF48AB6ED21DCE7C5
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000800000000000000
-Out = B826F4F7B5C5DF743C87EE73119D71FF
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000400000000000000
-Out = ACC2FA1CBD0FA5F8AAF147396AA72EF1
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000200000000000000
-Out = F9F02491D78EA3B140D368CA71F0D6D4
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000100000000000000
-Out = A414990595D6E5E3C657B3190A1AE3C6
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000080000000000000
-Out = 478FCFBDB52A6CDA402217483E26604F
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000040000000000000
-Out = DE5E798198E306A2FF47F4F2DB7B3E2F
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000020000000000000
-Out = B42E74D15CA26D9CC358A5E2B1F9DD70
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000010000000000000
-Out = 2800BCF67B76D76F7D0070950A85A20C
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000008000000000000
-Out = 808F9BE49A31AD5D0A62094A55372D64
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000004000000000000
-Out = DAA7291D3A3289EAD026121F8CE16151
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000002000000000000
-Out = 93D7139BC6A67316FFAFEC2ACC89D245
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000001000000000000
-Out = 15D1444811E90AD554E50973F32B8AD6
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000800000000000
-Out = 636FF061A2FCA2EAA8DFD3A195E8BA4F
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000400000000000
-Out = A2FBB57034BCF5E89E1495C216A44917
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000200000000000
-Out = 7B370D533113C91233BBDC73B14B121F
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000100000000000
-Out = F21BC7D2EB7541EB3F0B40394FA064C7
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000080000000000
-Out = BAAD725D1BEBC934FEC792D158163DD5
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000040000000000
-Out = ED50A592E0D2DE126BC97FD8DAD20919
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000020000000000
-Out = 11DB39B92B98A4719FE345FC44082787
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000010000000000
-Out = 43B1AA58C190006D5EA3F6B708B90509
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000008000000000
-Out = 8A19FB44B5962288640F48B27286904A
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000004000000000
-Out = C19B0558E72BABB1B9275EE8B48B9017
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000002000000000
-Out = 587D8A04B1958388D69F26E4106D8232
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000001000000000
-Out = B53EB6177E1BC1C083E743878F476003
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000800000000
-Out = A42E251AF82C03E4ADB9E5872AD8F7B2
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000400000000
-Out = E2585AE29C6054CBDA85B6AA00D88C90
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000200000000
-Out = 3F6364A00BDCF925C6D62BA15DF56234
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000100000000
-Out = 6ECB0E56F218E4D1E790C34BBBCA06B8
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000080000000
-Out = 02ACC5470DD8D223ECB12339750D3BC0
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000040000000
-Out = D67A590C0AB3B3E47406D19DB9F0A21F
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000020000000
-Out = 2B5CF7D06148DF6448016FB40FBF9F53
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000010000000
-Out = 4D635C044E9ACA243BA1F68268789D41
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000008000000
-Out = 0118FE9B311429CC06F01AA150D1FF08
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000004000000
-Out = 1E8AB1853E0D2F0E9FD49FE5285611AD
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000002000000
-Out = E521BDB90371FAEC980E1EAC85C10137
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000001000000
-Out = E2B8BB4A2EDF3DA04F6934EEF903DF17
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000800000
-Out = 75528623E760DD71612DA5F9374EC616
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000400000
-Out = 1FCEBEA2DDEDF905D645E1A03E2584EF
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000200000
-Out = 4AC71EB7EBDA9AD47531FCAB0D34FA5A
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000100000
-Out = 0458B8910A076F39CAAE517F5E3E4D59
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000080000
-Out = F5D01E6C7FA961F6AA1B94FFBFA59672
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000040000
-Out = 652473292C5C5764658F8E1FF91B21F8
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000020000
-Out = 05D5357FD61285F1B9FC19EB2BBF01C8
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000010000
-Out = 2D379505C15DD6C1AD7544CB375720E1
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000008000
-Out = D5918DFA1A722206C89E7B5D518BB28D
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000004000
-Out = 30C3BBEC945657A6EC5B9222BC36DB0B
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000002000
-Out = 041305F2248F1FD0EC6181B4D6B619D3
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000001000
-Out = C275B6410A77513E4F33C21F9BC11924
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000800
-Out = EECA71E0036A80BBAAAE62400EA1A237
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000400
-Out = 1025F24952D1691730DAD7CAF09C32C0
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000200
-Out = FB7830146AC03E32BE6D03A4AE839E97
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000100
-Out = A91E3D5B9DDC4F0315E718B4C190CBA9
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000080
-Out = 79FBBF61CB27651FBA333B9FFAF60F31
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000040
-Out = FF598CBF22746883F86DAD6D679DC85E
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000020
-Out = FA0ED9A5406FC13E532FDB74988A9554
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000010
-Out = 36DEA77F6832D3C81776801AFF839069
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000008
-Out = 262855946EE434D4F0DF924BAB0311BE
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000004
-Out = 01FF81B0107BEFA8427260954C7CD50C
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000002
-Out = 61DF2C54CDF545F8E774D50C8FF59752
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000001
-Out = 45F21B1FD1099CB36C64435337BAB3E3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 80000000000000000000000000000000
-Out = 4433FCCBF2D4AA14783835D0968BB7A6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 40000000000000000000000000000000
-Out = D565448D0753F08C6108B10CCEB4F213
-
-Key = 000000000000000000000000000000000000000000000000
-In = 20000000000000000000000000000000
-Out = 1F2B7678DB0B0C33F2F5531FCB71D97E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 10000000000000000000000000000000
-Out = 8025160E9E0DF83CAC559816D3BA4AEA
-
-Key = 000000000000000000000000000000000000000000000000
-In = 08000000000000000000000000000000
-Out = A0F5D4524C743641214BD088EE9A4A0F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 04000000000000000000000000000000
-Out = A2981925C529529B068FC1109A509836
-
-Key = 000000000000000000000000000000000000000000000000
-In = 02000000000000000000000000000000
-Out = AF60EDCB3C0FE50E4FE093509C1A87F6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 01000000000000000000000000000000
-Out = 6F475AF136CC10485515C95773A74AD2
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00800000000000000000000000000000
-Out = 6E09A8F5626CE2364668F8254F192E5A
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00400000000000000000000000000000
-Out = 5DE55C749F91D9392A87CA423F00FF95
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00200000000000000000000000000000
-Out = 4CD217660FCE3BD43999AC8353503118
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00100000000000000000000000000000
-Out = 94B45B0665BCB3FC486CFD980546E934
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00080000000000000000000000000000
-Out = F924999F0213FE2DE932D1D072FBD38B
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00040000000000000000000000000000
-Out = B64F96119ED3F9FD37A826E7A48C4F94
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00020000000000000000000000000000
-Out = 63E59879D0A422CD030E51727F379CC0
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00010000000000000000000000000000
-Out = 62B160854BBA6DB3EB960EDF53A60663
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00008000000000000000000000000000
-Out = 39A8147579540CC5A1F32F87768A4E3B
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00004000000000000000000000000000
-Out = 1B201066BC1D0173089BD0346C57630C
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00002000000000000000000000000000
-Out = 2818D6897E7AF26CF08409C1BBCDA8FC
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00001000000000000000000000000000
-Out = 8BCE5EE56402A19BB29979A05AB3EFF8
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000800000000000000000000000000
-Out = 4F8B1F65E7CE872E514B53BE8DE8759A
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000400000000000000000000000000
-Out = 3145B8EBF046F533D5378BBDF9C9E4F8
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000200000000000000000000000000
-Out = 49E18ADC2929D19B61389C698DCEE532
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000100000000000000000000000000
-Out = BC7C0A8FDBEB8B63608F0BEF9C1E396F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000080000000000000000000000000
-Out = 89F15AD40BB43B2284B3563F2C974023
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000040000000000000000000000000
-Out = BB60A7897D5F438651EE13C02B5AA790
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000020000000000000000000000000
-Out = 946FB4349CE2935BE1CCE99A2A01A6C9
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000010000000000000000000000000
-Out = 90EA5937B4E393E34B4E60C787B33E2F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000008000000000000000000000000
-Out = C5884097BC796E63B3046CB031919D15
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000004000000000000000000000000
-Out = 06DC71C7CB99EF0B2EA4379CE5451E81
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000002000000000000000000000000
-Out = 8A85BC61EAF50F065CB769B48243E51B
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000001000000000000000000000000
-Out = 482E708D7AAA9637674AE923E2128BB5
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000800000000000000000000000
-Out = 1977127839A3FD886B5ACF2753A28D9F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000400000000000000000000000
-Out = 39A993ED3ED7F4A1557FF18ADFE55CCD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000200000000000000000000000
-Out = 8995CF677F032B100EF2FBA632AA4D67
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000100000000000000000000000
-Out = B54C94BC29029F9DC78BAE0908B543C9
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000080000000000000000000000
-Out = CD0A7D015E352D8B27687ED66B45C64D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000040000000000000000000000
-Out = F4E89BBAAA6DCB96952662F88DB0A60D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000020000000000000000000000
-Out = 37FA1912B2636F3982A768C5208267B3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000010000000000000000000000
-Out = C5F27B0B8B93C4F693510EDAB0560073
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000008000000000000000000000
-Out = EAD47638DF1D0AB1D3441D5B77A7459D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000004000000000000000000000
-Out = A9198F0441AAA6B84DB891AF859145E0
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000002000000000000000000000
-Out = 99604EEF14A27550AA1F58510BC6C745
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000001000000000000000000000
-Out = 133CE0B0F01E22DB16B51F6074A570E0
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000800000000000000000000
-Out = 6E2503C056B37957BC00249175B6A829
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000400000000000000000000
-Out = 8076A054B269283F5063CF9EDAFF721E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000200000000000000000000
-Out = 6ADC87C1A40ABF8DA9FF4DA863C4AAA1
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000100000000000000000000
-Out = 676953B542456DDD155467F7F6E51C2A
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000080000000000000000000
-Out = 441D72C0FB4A79E4451B9B0D3571E1E4
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000040000000000000000000
-Out = 642DC2A4A84229406ADFE681FD1D2F51
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000020000000000000000000
-Out = CA1DF7DBF4163F601ED11216767E8C79
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000010000000000000000000
-Out = F8EBCE557E084052E74A5DEB45439D6A
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000008000000000000000000
-Out = 589606504D2BBC4A85507D61AD1AE6E1
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000004000000000000000000
-Out = 5627DFEFE159A8FEF32FDC29321CC705
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000002000000000000000000
-Out = BFC074B43DD81ED778082FB83AAB8D8D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000001000000000000000000
-Out = 6DF74B1434C13343CAE51F38BABDF4BF
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000800000000000000000
-Out = 1C9B11549C831CE68C7CE061F1CCFCEE
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000400000000000000000
-Out = 31D07F177D35A6EE067C75C5B1F3D728
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000200000000000000000
-Out = D4B7FA191B9414FF3D293BC76C2E12A6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000100000000000000000
-Out = 9D7AA5550DAE2B1B7D608147009DFE2B
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000080000000000000000
-Out = 5266FA9AB29440558FB71EDA1B43BFBA
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000040000000000000000
-Out = 2CF722D01CB1EAE802C78FB22AF095B2
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000020000000000000000
-Out = B3C02698C56AB6D3EFCB90AC81CBD787
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000010000000000000000
-Out = FBF4F2DC7FD1A9F6D4C8B8BFA3AA81FB
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000008000000000000000
-Out = 32D300D0B845E26F7A0505AAB453E0B2
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000004000000000000000
-Out = EAA724538478C450FE5E893DFD206D5B
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000002000000000000000
-Out = 346E15BA10E1B15D2DE2A862C8BAB645
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000001000000000000000
-Out = 67E87A345284D00742FF8E0D6C67C677
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000800000000000000
-Out = D9FF605AF934D4EA36BB4D4678D250A5
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000400000000000000
-Out = C6BAAD911C8D06461FEB1C8FD73A1163
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000200000000000000
-Out = AFE155824F95065479A7326AF6FFAD5C
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000100000000000000
-Out = DAFA519AB33BC01A665BD43D7B578716
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000080000000000000
-Out = AB1A3C2AEA2AB0873FCE9B193AC3CE26
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000040000000000000
-Out = DB4E325C5F0C6A2A80A97FB53629CA42
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000020000000000000
-Out = AA0B63CE9363BCDC1840FE6DF3EEF598
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000010000000000000
-Out = 564F6ED396958B6CD1C5156F30F12BD3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000008000000000000
-Out = 59CAEE5DD9D6D8A17DCD5761F285ACCD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000004000000000000
-Out = 4CAC1BC4EBF467854A15DDBC9410E30E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000002000000000000
-Out = 9D432A8BC205B2DAE6ED10E5D2573DB5
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000001000000000000
-Out = A1B2A6D98E8331CA5D2605C5053AE8D8
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000800000000000
-Out = CD3676661A44F4509EFBFFB4ED5AD60D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000400000000000
-Out = 0E367EE025F2FF821D5F0B89FCECFFA9
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000200000000000
-Out = 5F60D9B6A93F1F1B531A9D26C7465114
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000100000000000
-Out = E5753FFD3DF072BCD07292484E9AF749
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000080000000000
-Out = 25F43090C51DFE3C48DB6F391B489669
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000040000000000
-Out = AE817F28DEE664D2B9739BF93AA73B1E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000020000000000
-Out = F1D08CAFE3F5E56C18237E777C731DDD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000010000000000
-Out = 6ECFB7B90D05650F97B5D6D7F677ECE9
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000008000000000
-Out = FEA1BF5FD0BCFA04E0D906B4C5F8C51A
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000004000000000
-Out = 0739D17249C17E813B7716212E4E32F3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000002000000000
-Out = 81AA866868D538D53194B5B5D7014BD0
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000001000000000
-Out = E3CC87289C585148267231499BADA0F0
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000800000000
-Out = 2016EF8808F2B5C38B0F790C5A81E9F7
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000400000000
-Out = 7F06EC5E639B36CD7482E5D3568DD54E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000200000000
-Out = 9A066E0A89EDFF5F26F00F8CC76710B7
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000100000000
-Out = 49A6ED8109D54E6628CD4F6418B788D4
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000080000000
-Out = 4C3F149C3D7A196B8F61AFF5691950FB
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000040000000
-Out = 85B54F82B4586B3396C2200DFF3B26CC
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000020000000
-Out = 705B756847815F1D0DA8D55A45F91BF5
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000010000000
-Out = 4C81CA819469B5A80EB6AF78BB91570D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000008000000
-Out = 5D057D02E17129A43E0B68D9425917CA
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000004000000
-Out = E472655E64E637CCD7D1FD3D46970F34
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000002000000
-Out = 05B3391A2CABBED3F1AE0EBAEF6D61B3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000001000000
-Out = 96D1DAD8F5083314D8185517614E2E3B
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000800000
-Out = B4054DBFE0DB6487C90505273A5FF3B1
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000400000
-Out = 4E766330F2C22059E59B5C8972AA2AFC
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000200000
-Out = 78AB8FC7997E2B63B59DC80F4F560D95
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000100000
-Out = 059181B7493B3D66B61CC663B58D7860
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000080000
-Out = 4149CD202F19C2BBF631FC2BA8FFDF41
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000040000
-Out = 6465A8757C3E9E5D9A98EEF1CEE37324
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000020000
-Out = 06A7F1D391336FFBEA9986A82BAFFD02
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000010000
-Out = 6204BFF718C247F7A909C4FD4CB6444D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000008000
-Out = 4B815F5F654E7C6E9B135D14773BF419
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000004000
-Out = D18FBE3FAACC1722641E66DB74220E98
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000002000
-Out = 6E473DD470E74E9066FE07297434D8A4
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000001000
-Out = E6FD048EB622EE77A092E1818472C477
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000800
-Out = 2DCD5664A1151BF563F25E86B69767E4
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000400
-Out = 3455215DFA380B77C931C262A38B01EE
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000200
-Out = 7470C0914B4AA37DB90DCDD87A253D94
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000100
-Out = CB15F18A9A66397EAC67FAC2BA875EE5
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000080
-Out = 5F273D6F25D09AFE351CE02016E18218
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000040
-Out = CA995621063500658C47AAD5C89BE0FE
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000020
-Out = 70724F68B3D09917AB7286449BCC71F3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000010
-Out = 10769D43746A1DBFB7CEEDD1EB9EBB0E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000008
-Out = 87F113ABDF184062224235392A20AF11
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000004
-Out = 7D237E25D34FEC04FC635884B1342EC3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000002
-Out = 435B4DA29136AAA1275EF16F5394A235
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000001
-Out = 70051777D259550440C9BB7884DFFBFA
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 80000000000000000000000000000000
-Out = 7DEC45D013733A2FC3ACB05AC5EDCDA0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 40000000000000000000000000000000
-Out = A0CEAF180B51BFD4781D46CD10160457
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 20000000000000000000000000000000
-Out = 498CEEDE242280926B1583FB4A2F9073
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 10000000000000000000000000000000
-Out = 39E60B423F54786849C6E0BA2AF6BDD3
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 08000000000000000000000000000000
-Out = CA6680EA57E0FE1628DC26EA79C948EA
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 04000000000000000000000000000000
-Out = CA14A0AF4CF3D1C3615204EB95F216CC
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 02000000000000000000000000000000
-Out = 2D5A5029679E795D4F49CF1E7AA525FF
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 01000000000000000000000000000000
-Out = 5AAD27C9EABDAAD2296718BB0118871E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00800000000000000000000000000000
-Out = 80CA60282018A1DD71762D84750EB459
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00400000000000000000000000000000
-Out = E2250B330EC2C407295F2A1BC8B33330
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00200000000000000000000000000000
-Out = 210CEBA6B53AC0DE78757CDC785C6A35
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00100000000000000000000000000000
-Out = 053FC841A2E3D6037B34CB9C7CCC0CFB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00080000000000000000000000000000
-Out = DED4DA1EFC0FCF248E9DA7885CA54A32
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00040000000000000000000000000000
-Out = BAE5DF7B5CB001EFCB26C5AA2DD2588D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00020000000000000000000000000000
-Out = 9DD5C8DC680CC10FAF75B19331ED9FCD
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00010000000000000000000000000000
-Out = D348D0D2E64F7C6B3EBC0844EA93A77E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00008000000000000000000000000000
-Out = E3AEE8A29AD4A08D979F08F030650A24
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00004000000000000000000000000000
-Out = 272797A77F83C01290E213B511A1659E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00002000000000000000000000000000
-Out = B2E84007CACDA6638F4391ACCC8DD245
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00001000000000000000000000000000
-Out = EAA21531B492A737DDCB7EF2D8D4022A
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000800000000000000000000000000
-Out = 0DCF4259CFB5D0DEFA7C1DD26C5AE728
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000400000000000000000000000000
-Out = 1B3596ABDAB6FE10E574A0505AE5EC1F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000200000000000000000000000000
-Out = 0B07CA48F49D189E2E343D83D54784A1
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000100000000000000000000000000
-Out = BB4977183CE7D829F90C1A4A0C0AD921
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000080000000000000000000000000
-Out = A30AAD2751895E667AF64C24F127EE00
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000040000000000000000000000000
-Out = 1D407E4971F586E8BAFD780411DAB446
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000020000000000000000000000000
-Out = 287E1CBFA05A25B90B94B0D1769DB4BE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000010000000000000000000000000
-Out = FEEE919F6634BFDEFD6950CA84FE7DDE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000008000000000000000000000000
-Out = DEBC950100E5BDB2B972D96B110CAAFB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000004000000000000000000000000
-Out = 7E2B207B3204FF65ABD0E286E8FCFD88
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000002000000000000000000000000
-Out = E46FA1ACDA975397F893DA874257B063
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000001000000000000000000000000
-Out = 48B472378DDB8297A1E70DB24B3B5784
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000800000000000000000000000
-Out = 51E73F78E9E3DF78C460BD1D1D6F9D02
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000400000000000000000000000
-Out = A140D05B56E36B690DE8E5CC7CA2DA96
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000200000000000000000000000
-Out = 4775063A5B2DB92E0A97A975DFD161AD
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000100000000000000000000000
-Out = AD6913069340B8B88A42F09975A03E96
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000080000000000000000000000
-Out = CE03AA97EC230AF5130F7B49CF11F749
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000040000000000000000000000
-Out = CE235004F77A37CA2405AB272AE1F278
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000020000000000000000000000
-Out = 0207B9546C956A9B96FC6FF8D8B25FF9
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000010000000000000000000000
-Out = 72284643B100DFEDAB7243D372000289
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000008000000000000000000000
-Out = 2B97D40D51A9C400AC8F72285CB9D947
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000004000000000000000000000
-Out = 16DEF3EF31FB9E0A9E11FE5DBD10FF6D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000002000000000000000000000
-Out = B8C5BEAB5058E1F8F31AC2537DFC2A04
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000001000000000000000000000
-Out = 96240AFD00164E5BA929C470CC2EDFCD
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000800000000000000000000
-Out = 8255F69C848F0601DFA944E7DAA07B03
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000400000000000000000000
-Out = 31D19233EB697EC50C087C6761658C22
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000200000000000000000000
-Out = 0E267CDC580C17C21F207BB6A14A2A61
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000100000000000000000000
-Out = 84F60557F8302489621586BC45B52D1D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000080000000000000000000
-Out = C6D5B38F47BB5298C521E41B9B722B44
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000040000000000000000000
-Out = 384D3E44D70F9FD1783D7B86DC7C0B79
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000020000000000000000000
-Out = 542B27EBC9FA37FA8CECF14E73545CB6
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000010000000000000000000
-Out = 04B5915863477F621C976F47ED7A6242
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000008000000000000000000
-Out = 571E6627E25993D157D7306937A0F62F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000004000000000000000000
-Out = A256299F34E93EBEC69E04CFFF3476A0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000002000000000000000000
-Out = F202A1227405A4CDFC9308819B189FCB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000001000000000000000000
-Out = F99B66FEB8E9FFA89164A8EC1B8F1C85
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000800000000000000000
-Out = 3C70D7CD09111B15069F54809724F1B0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000400000000000000000
-Out = B88FDCFD41AD34AE92091D31E90C585C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000200000000000000000
-Out = 2A80BE073D50FCF2B7FA44A39F777AE1
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000100000000000000000
-Out = 65F620832AD465A2AA6A14129F382DEE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000080000000000000000
-Out = A4518AD23FA96370D83BD3B2FBAA54C9
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000040000000000000000
-Out = 22AB117786B312AD84C9C2CAF1E2C2CF
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000020000000000000000
-Out = 33C719DCCF25FCF76916B80C632ADD00
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000010000000000000000
-Out = 7D95F59DB32ECC39D00DA9DF113AA2EF
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000008000000000000000
-Out = 376278196B5EE68F2B57B51B4D07A849
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000004000000000000000
-Out = F6EBAD4990425CD9BBF97D5AC51D33DE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000002000000000000000
-Out = 2C64F1A0EB9601E7B5A29E9237040E39
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000001000000000000000
-Out = 0D6E4B7D38620761D65CCDDE9EDDB24F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000800000000000000
-Out = FB954442EDC07197FAE86E9A0D714903
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000400000000000000
-Out = 4B2CC93726DEE48282FA27816FEDC5D6
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000200000000000000
-Out = 75EBA30DFEE4BE2CEFAF7D097D08BE4E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000100000000000000
-Out = 90A9750293D227B3F75839A1B1B72A1D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000080000000000000
-Out = EA6A6BADD96680C06A0F3FF72A89A3B9
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000040000000000000
-Out = 027957EFFC5F8D54F5E31DEFA4EA5B1C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000020000000000000
-Out = 689E796B7CA20D52ABCA6E02DFF2FA19
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000010000000000000
-Out = D0894BC5EC6BB6548C2DEF7D271C5A84
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000008000000000000
-Out = B3AD04752FE8B3CED3BC0C721CFFA017
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000004000000000000
-Out = 75EBEAA918EE7713AB6B555911A8895B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000002000000000000
-Out = 4507EAC65B6F8825147535212B810659
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000001000000000000
-Out = 488887A888AD9C4208981298C32C8802
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000800000000000
-Out = 8516A2448258784F9CE88A4DF07E12BB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000400000000000
-Out = 34C35EAEF661E815B02FAE1D82A5C6FC
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000200000000000
-Out = 88927ABABC4DCDBE547729DC8486C912
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000100000000000
-Out = E3F2B4AD45A40E8F61A1A002EBB1A6B4
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000080000000000
-Out = 7B8C8A12DFFF1B31E9BBBC9AB1BF191E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000040000000000
-Out = 12896559E9F9818A45895A850949641F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000020000000000
-Out = 0ABC2B5B0BE224FCC494D1EF9930663E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000010000000000
-Out = 1975B8F3DBFEF1B3F68150526EFDFD9A
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000008000000000
-Out = 531360071C6EDFCE4194DD34F282687A
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000004000000000
-Out = D7D44699A83FAA21673C244155E57276
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000002000000000
-Out = 1AECF6542049C8ADAE288158FAB8797B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000001000000000
-Out = EB40D7F5FADCE30126B34463B1FCFB43
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000800000000
-Out = FEFA8ED45925FD4F51AA06EADD1D08CE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000400000000
-Out = 7E36A1A7FC162B85AAC263DCA957F534
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000200000000
-Out = E5C330087D678D159C00C27CBBDC9F61
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000100000000
-Out = 8F56044BB6E9321DADC1F21A70F1E8C5
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000080000000
-Out = 8714D0D553AD80DDCABE3E9DB67CFE11
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000040000000
-Out = B72D92FFF02A78AC4682ABAF141D77C9
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000020000000
-Out = 9550FBBFD4A34816E2FD792AC339D49D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000010000000
-Out = 84981AB5DFBE8422A2086D0E5E470254
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000008000000
-Out = 7BD5A92C5957B09FA5AA9F1A34E17943
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000004000000
-Out = B603FAB9ED51424992A737BBC1E910D6
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000002000000
-Out = 2E396DFC0B28E28353C2F97BA982C13D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000001000000
-Out = D4CC605A1C64E8A98592A8CD05AAFED0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000800000
-Out = 26C58B071D9116B0123CB99734CFAAF2
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000400000
-Out = 3C9D6B460A2364020F55A70E41B5B2E5
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000200000
-Out = 40569C782ACA0CB05042D0F54967545B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000100000
-Out = 7340B7EB0B49722A28D0F06056D8878C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000080000
-Out = 8FA7508A26413C633B77FC418AE0EE80
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000040000
-Out = 4EA014A1F02840246644548A9C09629D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000020000
-Out = B44678D49E3F80D998A94CB542CFBF83
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000010000
-Out = 756FEB41FE20E403C5C1715AB9D0E58A
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000008000
-Out = F061519982CD7D2C1451CB2BCA567F21
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000004000
-Out = 43B291C8A4BBF59612F896EF8DE8C801
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000002000
-Out = 8512D67DA5F121630DF707E1B87901A3
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000001000
-Out = 1CE9CE4393434F7A0BCD3F4424B95575
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000800
-Out = 8DEE20BD926E0AEA8F5163FCF8D594E5
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000400
-Out = B504027202FA9A205A36ACFF47E22CB5
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000200
-Out = 3B88E059888E28B7E61F2602A5361A4D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000100
-Out = 264BE9E31092B5F5FAE3C90A8544E036
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000080
-Out = 82ED5DDBF256FB53432873A896699723
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000040
-Out = AE8D4DC3B948546E1F0DB6173A7DA5D2
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000020
-Out = 01CD700F9FAAD9182FADAA2E62B9814C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000010
-Out = 000C12107A21E608CFCC1285E1057373
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000008
-Out = 3FCD4604A02D1142032433FF551F0F23
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000004
-Out = D049B0BD078583621E4841BC9F53B11F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000002
-Out = BAAEF3F9A301A25EE35FE6D6C054E06C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000001
-Out = 5A991DB3C1149C0C16A523B8FC413C8D
-
diff --git a/src/tests/data/block/rc2.vec b/src/tests/data/block/rc2.vec
deleted file mode 100644
index 7c718311d..000000000
--- a/src/tests/data/block/rc2.vec
+++ /dev/null
@@ -1,117 +0,0 @@
-[RC2]
-Key = FFFFFFFFFFFFFFFF
-In = FFFFFFFFFFFFFFFF
-Out = 278B27E42E2F0D49
-
-Key = 3000000000000000
-In = 1000000000000001
-Out = 30649EDF9BE7D2C2
-
-Key = 88BCA90E90875A7F0F79C384627BAFB2
-In = 0000000000000000
-Out = 2269552AB0F85CA6
-
-Key = 1D
-In = D8886B78E580404D
-Out = 90748F6F07EF2836
-
-Key = 5049
-In = FE9C2CDD8C027870
-Out = EC184E6CEC40D9F5
-
-Key = C4F82F
-In = A7E13BC9F22C595B
-Out = 67A28EB51250764E
-
-Key = 9190277A
-In = 7177755D3F54A920
-Out = 62A6F69BFE164A05
-
-Key = 481B0F86EA
-In = D9DCB373FD4ABCB3
-Out = B80190D7B249614B
-
-Key = 499825B0D117
-In = 4B138DDE007975AD
-Out = 7FD56A6AA67F6C83
-
-Key = 4920D4274A62EA
-In = 971F30AF097B7350
-Out = 5DFC9E205A2D14B8
-
-Key = 405F1C56CEFE4013
-In = F95DCF9157489637
-Out = 4AC1643B949984EA
-
-Key = AD6AF2DC8463BAB7C6
-In = 1026140C4E7301D1
-Out = 283EB71029EDE89A
-
-Key = 3BB04A71CB0D23A7DFCB
-In = 36773B9B092E5FB1
-Out = FE60654754ADA82B
-
-Key = 0A6CC3F130AFD069222EEC
-In = CBB90C2F7F42158C
-Out = 30CFDEFED10675CC
-
-Key = 6A9DB0629A46CA98E9F99450
-In = B07CDC0A13DD350A
-Out = 3B050F6208CC43CE
-
-Key = 200BCA0DCF0497C3DBF9A025D8
-In = C0B69D0AD97D154E
-Out = BBA1918C34881835
-
-Key = 7C5DD0AC485AD056C57F4B15ABE7
-In = 649B5F71F3B3BDBA
-Out = 349369793550565D
-
-Key = 65D6250D40CEDA1CB7A3CE29414ED4
-In = 30B3ED77DBECDF2F
-Out = 25174AD01E0BE2BC
-
-Key = 56B594BB2938E08B9504D189AD39EADB
-In = E5D64497786FB2D7
-Out = BAE8FA177F46151C
-
-Key = 48E5FB1C74186717F17C9B7EA8F40827
-In = 2009AF9845F4D0E1
-Out = 4508CBDEAC304883
-
-Key = 2E7C56B9A41B512817B702615EBA38A0
-In = 8D7BF299E1DD2710
-Out = D5C504FF23ADE3A2
-
-Key = 68229077C5E04998A73CAC26265BC454
-In = 66E588E1E54E69FA
-Out = FB599477D9EF7C14
-
-Key = B2851A27F152B3B8D21FE19FE080DE93
-In = 3526264FB3AAD439
-Out = 789C2F4906D4DD94
-
-Key = A63FACCE8ED417ADDBE36262E334C934
-In = 51F9D8B75E99850A
-Out = 992215897C1C4D4E
-
-Key = 68A2CD033B11F329BBF0E952FBDDADEF
-In = 7643ADF384C7D876
-Out = 280FBCA90127A9B7
-
-Key = 6562CAA391B7AD91F6F953860C142D53
-In = 61649CC1BB265F04
-Out = C04617D4C7F4688B
-
-Key = 97FF0C4C1D58254DE89140EECFF8A15B
-In = 7027B6111FE67F27
-Out = 526E8225707ED477
-
-Key = FDA85236CFEEFF046973CF46C182B41C
-In = 450500AFA05B83ED
-Out = 5E55E20A0D0E3226
-
-Key = 2F1810D1FCFC98C847DA1D21BCA75712
-In = 51E3A05332220E12
-Out = 05B42A4CC45321EB
-
diff --git a/src/tests/data/block/rc5.vec b/src/tests/data/block/rc5.vec
deleted file mode 100644
index 555566917..000000000
--- a/src/tests/data/block/rc5.vec
+++ /dev/null
@@ -1,350 +0,0 @@
-[RC5(12)]
-Key = 00000000000000000000000000000000
-In = 0000000000000000
-Out = 21A5DBEE154B8F6D
-
-Key = 915F4619BE41B2516355A50110A9CE91
-In = 21A5DBEE154B8F6D
-Out = F7C013AC5B2B8952
-
-Key = 783348E75AEB0F2FD7B169BB8DC16787
-In = F7C013AC5B2B8952
-Out = 2F42B3B70369FC92
-
-Key = DC49DB1375A5584F6485B413B5F12BAF
-In = 2F42B3B70369FC92
-Out = 65C178B284D197CC
-
-Key = 5269F149D41BA0152497574D7F153125
-In = 65C178B284D197CC
-Out = EB44E415DA319824
-
-Key = C0
-In = 9E1916F381491CCE
-Out = 172A7A0BA70282E9
-
-Key = DBEC
-In = B97800C223082F9F
-Out = B5B1708AF59CCAD4
-
-Key = DA735B
-In = F39054061481EB24
-Out = 64CC1E0066FCA2AA
-
-Key = 0656F579
-In = 7622BA5D3D51D560
-Out = FFCB9EA21917C3DE
-
-Key = A59FB3DA35
-In = A15418BC11B2F0E1
-Out = B52821179E5CB9B9
-
-Key = 32594FCCFFEE
-In = 73B02BE42685EA56
-Out = 308C21EFE81621EA
-
-Key = 80E92B27999910
-In = 8CD5121F09DB7DFA
-Out = 70921F59F5CD29AD
-
-Key = 925498B73A9CAED6
-In = 532955C8EEBC75CF
-Out = CBFBB1E0A1A693F2
-
-Key = 3C379D8B11F23CC0F9
-In = BC8B5CF722EEBCAC
-Out = F233FBDDC09D9561
-
-Key = AED34B49E719D6157F93
-In = EFABA1B87E0236FE
-Out = A573453E1BF7B74B
-
-Key = 729B301AFAAB8FCADBEE25
-In = 5248601C102C10C0
-Out = D96D76C05F5E4478
-
-Key = 982644C13B1AA070437C1144
-In = EF6671A5A29EDEF8
-Out = 9EC6407003B827B1
-
-Key = 3BADA3BBA56BF23EF64E0D208B
-In = 5EF9939F903D5AD3
-Out = 8D9D5B5D12448231
-
-Key = BDD77CE81D8AF0B50ABE418F45F7
-In = FEF8CD62F9DC8D1E
-Out = 8FAF5F9D6A4A0A7B
-
-Key = 4AB4A9A4A31B700ECCB0FF23441F82
-In = C330D9BDC20D794D
-Out = 0F74E03240C58D70
-
-Key = 3668476363B42815FF575A65006DAC49
-In = 502E1C61223F5522
-Out = 86CC15281600FA7D
-
-Key = AEE7D59BFFC7FD4A2932C937C7277A2830
-In = 62ECF065C5723856
-Out = 5F8E3E9341B32B71
-
-Key = 3A1CCFABC9F8C46F96FB8B58D02A1F9EC514
-In = CF8DDCB5035B3CC1
-Out = 2D688A1A2A8DCA18
-
-Key = 834BC680E250D2A3B5B2D5B03FF14F2F65E412
-In = D595EBBAFE479CCC
-Out = 8AE450DB2A9A7C37
-
-Key = 39A787D483A6E52FAEF9FBD2EC3CDF81A39495DA
-In = 9F24230CB25BC86E
-Out = EE922AA0AC2EB904
-
-Key = DD7ECA8D1145431F60F2B749FB576F82011BB65005
-In = EE68DE3FEEC31750
-Out = E71038E4AB9F475F
-
-Key = 51FEB601EDA05F5D3D903FA957E6E06B81E640E6DFBE
-In = 9464C68A5E6FCE5C
-Out = 54534C495295FEE4
-
-Key = 0EF8C830DDE1838F1554195CAE006E69DD050C255B17FC
-In = A91EACB2C38F78EC
-Out = 997EBFE794F83F65
-
-Key = 5C47BF0F8E6D0E7A445188E361E4A76A9C48CD9738791293
-In = 170D65C9396BFAE0
-Out = 3B21E9B59F37FF96
-
-Key = 44822C91949958ADAF7E938395113A4BCE343D39C30B3CBE70
-In = D5961EA7B7C02063
-Out = 15C33DA775B4154B
-
-Key = 284FE5889A02AC1C83F9D1C62AC15AEAA08532EB478447B7A599
-In = 2C9A50C06A12E865
-Out = F060DD9CDBEA5738
-
-Key = 37F29AA9FDF4758489AD07C168965A73DB335049BDE60400BC19A7
-In = 780A3BD50CF78B15
-Out = D263CFB83966D499
-
-Key = 8ED81E58E34274D0B72318A14812D1E50D117437B1F303AC72F75057
-In = 39EBCCE8CD770C35
-Out = BF040B7D806BEDA5
-
-Key = AE591161BDC88AD08FF582EBEDB93A172C235E08E244AACA2F433CF1A5
-In = E823EB34847F1551
-Out = 489177CA2F6E7189
-
-Key = D1464349DB7C4D43777B3A44B4DC611C1F4DCCEF296D7A6E38443C773D60
-In = 3C4DB181401E588C
-Out = E2CCD84073236831
-
-Key = 1234D3D3AFB98F7D24D63E3A829D7EBA96A16B516638B79F59F38FD6C75766
-In = 128787704DDA4240
-Out = 6BE471CF49A4C1CE
-
-Key = FAC10D2B235098D973E8E81997EC9189197DAFE989E4B3A18E6D3C0150BF48CE
-In = 28FE4812E9137CFB
-Out = 18B5499EF0C1F9B4
-
-Key = 4780C11A3CD65D21435AAEC988609495A4DEF6C8FFF6AAE1B26C70BC6C336F73
-In = 725F91D74F3F3C66
-Out = F398FC47F4FEA520
-
-Key = ED7E67F4D658C34693F0962687DB46628587EA2D35DB81C1129F00FA69833E1B
-In = 4C706FD69646BA98
-Out = 5B9A776AEAD6304A
-
-Key = 5DB32571B70E3A66FEAD8ACC3F0C4F3A2A6E41A8ACF3D94E73EA0F91176FC3DB
-In = 3361F4771047397D
-Out = DED25E1BD3872DD0
-
-Key = 674C6060F45869214A7AA9BF0FA8F54AFCA92D06A0366EA8C4FEF4C8E79A53CB
-In = D840360511EB9840
-Out = D95E6398EC528F68
-
-Key = FB0A5141B81EDEAC27DEA6D4789083AA487B7D830E0041E1E2D167A1355BD858
-In = DBBC3D4D45847930
-Out = 74A00B919BE23D16
-
-Key = 291FF645CA077953ECE2EF2AE8EA10A127E6D2A1DF4582A5A7B513227C8294C8
-In = 5FF081C8F197D3ED
-Out = 48305C0741ECBED9
-
-Key = A967EC9902F212F1D2D6645AB7C81F0DD1BF4439C131AABD7B8233836615F9F4
-In = 30B8BAE80C26B18D
-Out = 57F443D4060FAC4D
-
-Key = 0A30C331D6015E8A0F64E33994263741D996435CFBA3253CBD64B03A5E000310
-In = E75EBB4AA43E6C45
-Out = A29B91450C2A637E
-
-Key = 1B5E8C38D611847842ACE7CB7CCEDDF152F5043141B462E4704E729C57404D1D
-In = B53DD82028EBB35E
-Out = 39718235AC88956E
-
-[RC5(16)]
-Key = 2B
-In = 1CA702F26A04AF21
-Out = 8105DD6EDD4051FB
-
-Key = 0957
-In = 78195A51EF592AFF
-Out = 89055B0265E67032
-
-Key = 698855
-In = 5BB2A022E7EDCCBF
-Out = 94AD2F68A2D3E83C
-
-Key = F62251DF
-In = 3B8B7A2F20DA627F
-Out = CB4B25A4A493287F
-
-Key = CB8CE363E0
-In = C450CB97E69F2E94
-Out = 77644E7454A72221
-
-Key = 1FE3BBD63969
-In = B7057F70F43A993B
-Out = E411E3023FCA87FC
-
-Key = F9EACED56552BD
-In = BE9976C68D70D0AA
-Out = FDBA816DB72A874C
-
-Key = BB0C6E15883513C7
-In = 6D340411F05E3B31
-Out = F58D02EEB481AFB6
-
-Key = 3312EEB8E2B619738A
-In = B3844D3B7CAF9F3D
-Out = 21133B09AABC3C07
-
-Key = 9CD7B7EAA3C7C0F2A962
-In = 2FBA65761241EAD7
-Out = 99D16F970CF37B73
-
-Key = 347469C239C728FC135965
-In = 8B1DC2A2D8E02FC3
-Out = 4643C45523471F25
-
-Key = 3001E738EC0D082C1A80D84F
-In = A372047B4271030F
-Out = 731303538F359918
-
-Key = 7BFF831DE2C51FD9426AB7424A
-In = 4E666F689DB1FF6E
-Out = AE11B65FD7E4AB67
-
-Key = 3DADAB349343D1CFA3009B49ABE1
-In = 5D440679051B3A6D
-Out = 2B4BE8A815F9A35D
-
-Key = D967EE11872B8C04EE0C4BCEE700EB
-In = E461164D61914F95
-Out = 32CF5B9FC95C48CA
-
-Key = 32F94338D7D70B4A5537FAEE03730745
-In = 4AB29FEF7BB5FC5C
-Out = 2518AA1C85B4600C
-
-Key = 1D158F49A2D6878739C61FE6D2E37C11E9
-In = 53D49E42AB3AC1FC
-Out = 02419E4BFDBF550E
-
-Key = 95EC4B43FC098B966E151F1B94EDC28D846A
-In = F99F9DD38CED0DB1
-Out = 58E4BD6BBAE8565B
-
-Key = 414326FF6F61C54E2932B56ABADB2496DEBB80
-In = 4263C4FE2AB9B990
-Out = D267474CE38E6E9C
-
-Key = B99CA2E96FB0C85A8633010AA6EC8C3DC6CC0EF8
-In = 375AEE48D204DEED
-Out = 61600764332D10C0
-
-Key = 1C4C076CA04C611316AA5D71659F163428479D929B
-In = 02B884BC12569B3F
-Out = 86B0ED3E4CB4759F
-
-Key = EA42742CF00A91F7CD9C63650EF450D20E34732A420C
-In = 8AF5B9C53FDAE8B2
-Out = 37091EFCD093D1D6
-
-Key = BEBE3CB5B711C83E150F2DA7A864AE63CF336D9E0EE282
-In = 9C42CAEEA47E2A06
-Out = BC1D42AFBE2CB8E5
-
-Key = 3A0603293C5F5A1CCF9DB9337DCA010F243B29A6A2EB3455
-In = DD4B4CABDD5D5E35
-Out = 31076D5D6EA4DE13
-
-Key = 00752D67E4E1CCC4ABC7C50B3188181FE664EABF7ED476BC3E
-In = 597699EDD1B4DD7D
-Out = 95FA85725C0AE0DE
-
-Key = 23B5163E359A7FE8BBD3704F1EA98B712A15FB6FA6D8BFC3AF0E
-In = 5E2DEED62635DB75
-Out = 828E88B5D91A7DB4
-
-Key = 041C609CFA10BAFD30D34D986B762A959146E7DEE3481DF8A8C70D
-In = 041BBDF41357E288
-Out = 2FE24A38A1AE4D61
-
-Key = 4CD0194425DF24845BABFB6895BAA18F45C395E8BADC196F36403C30
-In = E8D46EFBAB44EF65
-Out = BA01FBBCF2FE39D6
-
-Key = 7D7CC7017CF9DA5A74E8A7F2D36E5CC016710C43A9CB3C0B9DFB771EED
-In = 0A382E03FB85CFCC
-Out = 571B98B3E9710D58
-
-Key = CBA9B751F404F861E1DA95FFC2D11C686F84D8508D9A1743E5B9A006DA8B
-In = A3D86E1D88602802
-Out = EBBB0C7614414D7C
-
-Key = 28967E8AEBD065D3B5ED27158F953512035515ED3B388E2DA336E9705F16D4
-In = 017E4B4EFEF05D71
-Out = 3EE25FA34042CDE6
-
-Key = 3257D40C6B4EBDF8CAEC563CFE94201E1A843B31F2C9B720FC58C8214B7E2C2B
-In = 9AD01B01AFEA67C0
-Out = 249B074FC69E1042
-
-Key = 4120A9CA90A38A4E16E8323E6B9CB1D2CBA0594253AE578A1A64518B32ABCB20
-In = 1EE20108D1089F69
-Out = 28FA504AB46349D7
-
-Key = 246F010FB9F2DDD99412824C602C7FB48C9F6A3B81688A4404E1F5EA21296599
-In = 306786E25C18C9F0
-Out = 76A525501E857BE5
-
-Key = 754D9753401A56E2096D71C30102B885159CF5CE7305D93020ECE035869E0BC7
-In = D0FCF3DC590D5A53
-Out = 91A9699905107EEA
-
-Key = 534F366548F16D3825EDD61EAD00EF650DDC8E040B7955F68D240691AC34F840
-In = 83D2C97FFECD78A2
-Out = 95FE3BD241FE9E5F
-
-Key = 3B2CCDDFC5371E5F2FF9E119E0E13B730193E563296865BADA20781A2E0FFE2D
-In = 2D7F3F25DE4C0F05
-Out = 31BD01CB7BA808E4
-
-Key = DED645862D8B88517F26EC729B8538BB6CE46D869E6D568A20DDC4D253E70749
-In = 140AF01EB286A1DE
-Out = 098B274A3F2D50EA
-
-Key = D3C38159C3DB49A62E2369BF4BFEAF9EBDAF8E19B6FE9CB579E52C083FF70AB2
-In = DB58306587587FFD
-Out = 20E71B55168E5ACD
-
-Key = 2C15C8A0354DCA1FAF296FBF3FD8E64FD7B9C65EF2EA65B6E216943A551A2CFA
-In = 0A55DD3E3A425245
-Out = 1489079C596FB1BB
-
-Key = 8777192F49C195BAACCFF2096964683CFCF0009B2C57477B759F57B1C32C07F9
-In = 37EC03CAA189CBAE
-Out = 99FB7B05635AB5AA
-
diff --git a/src/tests/data/block/rc6.vec b/src/tests/data/block/rc6.vec
deleted file mode 100644
index f4f7fc95c..000000000
--- a/src/tests/data/block/rc6.vec
+++ /dev/null
@@ -1,4877 +0,0 @@
-[RC6]
-Key = 00000000000000000000000000000000
-In = 80000000000000000000000000000000
-Out = F71F65E7B80C0C6966FEE607984B5CDF
-
-Key = 00000000000000000000000000000000
-In = 40000000000000000000000000000000
-Out = 8CF4A482491CD207289D810C2BB29930
-
-Key = 00000000000000000000000000000000
-In = 20000000000000000000000000000000
-Out = 80EF45D42327E3AED39CD45C4E3E6197
-
-Key = 00000000000000000000000000000000
-In = 10000000000000000000000000000000
-Out = F28D8DF12AC0837A0919254980B674F9
-
-Key = 00000000000000000000000000000000
-In = 08000000000000000000000000000000
-Out = 9FB984DCBA5B0BDFFCFD97B02B648800
-
-Key = 00000000000000000000000000000000
-In = 04000000000000000000000000000000
-Out = 46F7091CD30CCCF570AFC116F8446492
-
-Key = 00000000000000000000000000000000
-In = 02000000000000000000000000000000
-Out = 77B517AA59EC7D3381188936BDEACCBD
-
-Key = 00000000000000000000000000000000
-In = 01000000000000000000000000000000
-Out = 40D5D97CFFDC390AC35C2734F44CF9FF
-
-Key = 00000000000000000000000000000000
-In = 00800000000000000000000000000000
-Out = B5A6B7C92EFCB55D349B63066AC1E009
-
-Key = 00000000000000000000000000000000
-In = 00400000000000000000000000000000
-Out = 152F0F5EA10FAFD0E63494C5FBDCC469
-
-Key = 00000000000000000000000000000000
-In = 00200000000000000000000000000000
-Out = 61F669BF2B32CD27CF6278392C988510
-
-Key = 00000000000000000000000000000000
-In = 00100000000000000000000000000000
-Out = 53A63CEE35DF00C73577B9255F55C855
-
-Key = 00000000000000000000000000000000
-In = 00080000000000000000000000000000
-Out = 6E46B92E23344321A19321DF136CE9C5
-
-Key = 00000000000000000000000000000000
-In = 00040000000000000000000000000000
-Out = 22F1261FAB993350F6ED41DA5D69B9B8
-
-Key = 00000000000000000000000000000000
-In = 00020000000000000000000000000000
-Out = 0901BC0A1DB5CC87CDA91EF5F5FF46BC
-
-Key = 00000000000000000000000000000000
-In = 00010000000000000000000000000000
-Out = 2EE65B377C16BE9517BA12F63189DE64
-
-Key = 00000000000000000000000000000000
-In = 00008000000000000000000000000000
-Out = 74BD6FAA83668952E2D546A66B7A8243
-
-Key = 00000000000000000000000000000000
-In = 00004000000000000000000000000000
-Out = 08FB4817F040B54E995B722C483C399E
-
-Key = 00000000000000000000000000000000
-In = 00002000000000000000000000000000
-Out = 5630614200E248D1644B58E3694D8BA6
-
-Key = 00000000000000000000000000000000
-In = 00001000000000000000000000000000
-Out = 659A3A27C9F3B0BBC65FC4C15D19051E
-
-Key = 00000000000000000000000000000000
-In = 00000800000000000000000000000000
-Out = FF3B39DCB459EE4FFAFCAC8C7331A6BE
-
-Key = 00000000000000000000000000000000
-In = 00000400000000000000000000000000
-Out = 19F0727A66BD056DCB5541EDE14B4662
-
-Key = 00000000000000000000000000000000
-In = 00000200000000000000000000000000
-Out = D0DE4B5B30A294C8A3838B70387C93B6
-
-Key = 00000000000000000000000000000000
-In = 00000100000000000000000000000000
-Out = 37BDB0A854686484E5EB52239D6C16C4
-
-Key = 00000000000000000000000000000000
-In = 00000080000000000000000000000000
-Out = 3CC7113F6E6833C9BFB4EE07371488A5
-
-Key = 00000000000000000000000000000000
-In = 00000040000000000000000000000000
-Out = A56737C45AC4DBF2417243C2E3B40133
-
-Key = 00000000000000000000000000000000
-In = 00000020000000000000000000000000
-Out = B0A5C817B1E2C307A4BBF8258DF5F41B
-
-Key = 00000000000000000000000000000000
-In = 00000010000000000000000000000000
-Out = F2112329EFA070476BD515679C887FC6
-
-Key = 00000000000000000000000000000000
-In = 00000008000000000000000000000000
-Out = 1AD2023CEC89B9436D03CCB9893C21C2
-
-Key = 00000000000000000000000000000000
-In = 00000004000000000000000000000000
-Out = 6BA3E774FCDD02379C6CF2F7BF28B914
-
-Key = 00000000000000000000000000000000
-In = 00000002000000000000000000000000
-Out = A2F8638B0A4014F0641A3CB8A13B5ED9
-
-Key = 00000000000000000000000000000000
-In = 00000001000000000000000000000000
-Out = 877FEDF7CACCBF0BD7BB5BB236BA96D5
-
-Key = 00000000000000000000000000000000
-In = 00000000800000000000000000000000
-Out = C9298A9A01C1F276E2E1E04226BF3D5C
-
-Key = 00000000000000000000000000000000
-In = 00000000400000000000000000000000
-Out = 4E01DB16789DE364085416DE25871A59
-
-Key = 00000000000000000000000000000000
-In = 00000000200000000000000000000000
-Out = FD3B5DA07D0054DD10FFB79440AB3A00
-
-Key = 00000000000000000000000000000000
-In = 00000000100000000000000000000000
-Out = A2508E8BD26E2FB9944C27F04D60FAA0
-
-Key = 00000000000000000000000000000000
-In = 00000000080000000000000000000000
-Out = E9A43055D71335545A6A514F08B868BB
-
-Key = 00000000000000000000000000000000
-In = 00000000040000000000000000000000
-Out = 587D5B71730D0B59BFBC0A93675B32F3
-
-Key = 00000000000000000000000000000000
-In = 00000000020000000000000000000000
-Out = 90076413F890E8FFF04F1031C779C91F
-
-Key = 00000000000000000000000000000000
-In = 00000000010000000000000000000000
-Out = FAC9F46E9A1346646EE5C7CED45A84B9
-
-Key = 00000000000000000000000000000000
-In = 00000000008000000000000000000000
-Out = 471F0738C4F4937E4253161F28086803
-
-Key = 00000000000000000000000000000000
-In = 00000000004000000000000000000000
-Out = A76F843041C4AED8241850B316D252A3
-
-Key = 00000000000000000000000000000000
-In = 00000000002000000000000000000000
-Out = 5C5FD0334332A39924DB0CC7F0867C2E
-
-Key = 00000000000000000000000000000000
-In = 00000000001000000000000000000000
-Out = 07B6EDDEF27EE890EBC8FFA187D84438
-
-Key = 00000000000000000000000000000000
-In = 00000000000800000000000000000000
-Out = 11BB0F2DC24461F5E70D2830ED8A7463
-
-Key = 00000000000000000000000000000000
-In = 00000000000400000000000000000000
-Out = 0AB1A99B63CB8E07290AC60D0A4F1FF3
-
-Key = 00000000000000000000000000000000
-In = 00000000000200000000000000000000
-Out = A26B0AFC4D55E7D61518C54E7C1BED01
-
-Key = 00000000000000000000000000000000
-In = 00000000000100000000000000000000
-Out = 50C8C2B68E06CFCB98785E5AD3D5B09D
-
-Key = 00000000000000000000000000000000
-In = 00000000000080000000000000000000
-Out = ACA305D5D0D1E74FC51AC8C92A72FEA7
-
-Key = 00000000000000000000000000000000
-In = 00000000000040000000000000000000
-Out = 5AF970E570BC1652C82FB4B0945D5410
-
-Key = 00000000000000000000000000000000
-In = 00000000000020000000000000000000
-Out = 00C224433138C1A4BD60571AA35580BC
-
-Key = 00000000000000000000000000000000
-In = 00000000000010000000000000000000
-Out = 4EBE79726DAAF4702B075A5898B26075
-
-Key = 00000000000000000000000000000000
-In = 00000000000008000000000000000000
-Out = 8109EE81B1679CEC42DB80D9530AD2F6
-
-Key = 00000000000000000000000000000000
-In = 00000000000004000000000000000000
-Out = 403B11B8181D460E9AC0172CBE6DD45F
-
-Key = 00000000000000000000000000000000
-In = 00000000000002000000000000000000
-Out = CDE78E92B5A84717AD9B4162E3B14BFA
-
-Key = 00000000000000000000000000000000
-In = 00000000000001000000000000000000
-Out = A173D6BEBAA05EC54A47C7E554415963
-
-Key = 00000000000000000000000000000000
-In = 00000000000000800000000000000000
-Out = EF31AD6CBFA7857ACF0C28294BDEF8B8
-
-Key = 00000000000000000000000000000000
-In = 00000000000000400000000000000000
-Out = 209A30C46E41540C7B0AC8C4822DA253
-
-Key = 00000000000000000000000000000000
-In = 00000000000000200000000000000000
-Out = AF770103EC57EBEB913C83D99F58B6AC
-
-Key = 00000000000000000000000000000000
-In = 00000000000000100000000000000000
-Out = 17D0C179EF34DE7F8EC7698A5371EC00
-
-Key = 00000000000000000000000000000000
-In = 00000000000000080000000000000000
-Out = E0285A3F97607250CDB89BF92CBD1F41
-
-Key = 00000000000000000000000000000000
-In = 00000000000000040000000000000000
-Out = D76BA3CE5E4DC974D4803ADB9F821A57
-
-Key = 00000000000000000000000000000000
-In = 00000000000000020000000000000000
-Out = B66579D4159CF0B0114011C0298EBDA3
-
-Key = 00000000000000000000000000000000
-In = 00000000000000010000000000000000
-Out = B9761796C787B51852E4C3130B8B662D
-
-Key = 00000000000000000000000000000000
-In = 00000000000000008000000000000000
-Out = D5C638801B97A1C2584ED42132F44109
-
-Key = 00000000000000000000000000000000
-In = 00000000000000004000000000000000
-Out = E54A021B145B7B7761487BCDFD0B032F
-
-Key = 00000000000000000000000000000000
-In = 00000000000000002000000000000000
-Out = 3EB3AFE73582EFAB0396108B5E0CDEEC
-
-Key = 00000000000000000000000000000000
-In = 00000000000000001000000000000000
-Out = 463E10507A26B708A1DFF3763276F5C9
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000800000000000000
-Out = 0EEBF8D85AE19EB24C810CEF565FA77B
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000400000000000000
-Out = 86CA894EEFD1CEAAEA70E00CD14645F6
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000200000000000000
-Out = 989B0FC1FFE4BA6F7CC0F1EDEEB5B932
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000100000000000000
-Out = 42916ED17877E58933D3D8CEDA8DD7B3
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000080000000000000
-Out = 88C0369158F2FEFFB4CF14130CE10B3B
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000040000000000000
-Out = DB8976E1DDA56553340236F47F8E9CEF
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000020000000000000
-Out = C6207672C411F088ACAD20814C66254A
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000010000000000000
-Out = A792CF60F44A15D63FB293F9FCF879AC
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000008000000000000
-Out = 8F733746F91273D97ADA41D3A7D5A9E3
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000004000000000000
-Out = 5DA8F191833E6198689710D5A03EE262
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000002000000000000
-Out = D6DB9CEB7E821F6DF4CB1E99105E07AA
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000001000000000000
-Out = 05F308FFAEA3E1E754974435CE0B77C3
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000800000000000
-Out = 73B8639AAD53AFA1B24165E0C9FD397E
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000400000000000
-Out = AF45FDC65FD5F153E29A8D5032650AAD
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000200000000000
-Out = A8BB045FB5B867E85FCAD328E13756C9
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000100000000000
-Out = DD053128C46C78C4414CE3234C16AEB3
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000080000000000
-Out = B0C82152D1D9E21D7C3F33E1FC9B4D68
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000040000000000
-Out = 11B56480D5C718A77A1BEA30CC3A53CF
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000020000000000
-Out = 92C99F843674DED7F20A258C57253726
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000010000000000
-Out = 63B218D069CE9CAF52EF97614BDACFF9
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000008000000000
-Out = 76096721043A016C095D95DD02980289
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000004000000000
-Out = 87AF16066939B8C4D90E242917DB05CF
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000002000000000
-Out = F7E0C931B7204308AB5020F106BBA0EF
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000001000000000
-Out = C697B3602711749580713737729E7049
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000800000000
-Out = AF314640B147719EC1B4ABE27CDB58F5
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000400000000
-Out = B67DAC5BF73AF7546D2FDC3BC142708D
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000200000000
-Out = AC53D20E3C06FF82DE52470BCCE1B283
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000100000000
-Out = 7D65047AF522F01856FDD83A9AAA147A
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000080000000
-Out = 709D6454033E3FCF8962CAD39B0DC4BD
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000040000000
-Out = 7B8058E46789EF51D18700511D20CB70
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000020000000
-Out = 738088C404D8850041AD6B690CC6B65A
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000010000000
-Out = 7DFDFD55B53D4CD704F96CF93311AFC4
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000008000000
-Out = 1DBE62C57AF741D9F2FBF9A340E772C9
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000004000000
-Out = E7349BAB7CB458736436943DB0CC411D
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000002000000
-Out = 64E229BF2AF893510358CB0DBEF7E97F
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000001000000
-Out = 4C632CF8C75AD0DDE8316A7B35F871CC
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000800000
-Out = 2517115CB13E681F0EEA2206C26AD5C4
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000400000
-Out = 8ED5E9D7005D980B078E7F58B47E591E
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000200000
-Out = 8DBCD253443534B2B8BC698A03166ABE
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000100000
-Out = 02F34EAB6CC1DBC8809F3D0EB80FA493
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000080000
-Out = 47E5B71162F75B84D7A699A31FFA29DE
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000040000
-Out = B6C1EA2B410D1704058E905EB967C503
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000020000
-Out = 4383238CE44E30ECDFC90A70EA4C9E96
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000010000
-Out = 9314DFBB44D530768B159DAABCBD439F
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000008000
-Out = 12D7C80912C299C4F668278FA494D580
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000004000
-Out = 49FB1EACCA3B1743E15014010E9963DF
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000002000
-Out = 0DF48D3B128AA63496DBE0CD11083495
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000001000
-Out = 13240392854D6290A4BE08999843105B
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000800
-Out = 3D4B8705340C3225CE5A724917BA92B4
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000400
-Out = 425DCCF406AD46F2F565BBBC72FE234B
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000200
-Out = 88C09509CBB95339726C196E63346418
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000100
-Out = 90724430636A3DB610F25332BE2FEBE6
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000080
-Out = 044B4FAED3EA17338630E828B9960CA7
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000040
-Out = 4A59243AEB65BAA4F7432498FD87EF62
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000020
-Out = 4324DF8817589D894674B3F311256E9F
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000010
-Out = 0527269F9FA9E9CC01A03CFA59FD3854
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000008
-Out = 96CA56F9EFAA393F521679E0B6ACF231
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000004
-Out = DA7A328F8A5BF03DD42BC52DEC5C4B15
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000002
-Out = 5FE3D4C46DB294523166AB46208E0711
-
-Key = 00000000000000000000000000000000
-In = 00000000000000000000000000000001
-Out = 2519B9240C21C1F980FB722AD8CB793E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 80000000000000000000000000000000
-Out = A600B72AAC4DFB5271DC45F563FAE428
-
-Key = 000000000000000000000000000000000000000000000000
-In = 40000000000000000000000000000000
-Out = A7B1D7CBFBAB741B41744FF9100529B4
-
-Key = 000000000000000000000000000000000000000000000000
-In = 20000000000000000000000000000000
-Out = D9AAAA866BAB0D68AFFC39CF9888B8C6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 10000000000000000000000000000000
-Out = 32B0048A204036E1B45DE285E87E57B8
-
-Key = 000000000000000000000000000000000000000000000000
-In = 08000000000000000000000000000000
-Out = 7267FEE7E04ACEB47C8FCC4096720484
-
-Key = 000000000000000000000000000000000000000000000000
-In = 04000000000000000000000000000000
-Out = FF0C22F756C2F5EBDC6610F085D74383
-
-Key = 000000000000000000000000000000000000000000000000
-In = 02000000000000000000000000000000
-Out = A6264FBCB2926C6181AA6F5551244B2F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 01000000000000000000000000000000
-Out = D3A5B8FB3CBAA98419D394BB4C66B9D7
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00800000000000000000000000000000
-Out = F9FE5D1BA274021F041023CD9AC20399
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00400000000000000000000000000000
-Out = 7307F7DEBBEFD911B0B590A0667E093D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00200000000000000000000000000000
-Out = 4D8A3B987A1E66E72B3FFA520DDD57BB
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00100000000000000000000000000000
-Out = 0F444C0A7334947DBCB43D72F897E72F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00080000000000000000000000000000
-Out = 448F29B848D7CFDA617D8A64AC518B0C
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00040000000000000000000000000000
-Out = 261B4EA7CD31F46C4FBF684395ED7FB8
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00020000000000000000000000000000
-Out = 25FA5AD347C57047749B15B97FE8ABE6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00010000000000000000000000000000
-Out = F7E13200EBA3F6E8E9F37B092B907961
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00008000000000000000000000000000
-Out = 9C934B121791B35AFE509A0D5A04BBF2
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00004000000000000000000000000000
-Out = 3C0F9D40F9608091CDFD831DD6D215EA
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00002000000000000000000000000000
-Out = 97D7D2AF2F635D43E536E0A5AA18C61E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00001000000000000000000000000000
-Out = 1E41EB291C07ECF0908D49A9CBFAB57E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000800000000000000000000000000
-Out = C9CCEB56AF06C494582F2C966EEEFD07
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000400000000000000000000000000
-Out = 4B21E0D2942CCD21501F698ACA866BD0
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000200000000000000000000000000
-Out = BA0DC6ACC50486AD389EF65B5677DE19
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000100000000000000000000000000
-Out = EB80DE49F3D5605D9C3CE426EC80FAFD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000080000000000000000000000000
-Out = D6984153BF67512062F876966BD190F3
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000040000000000000000000000000
-Out = AC789910F3458D59C5090BE936C6682A
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000020000000000000000000000000
-Out = 5D64A268407F791DBDAFD0E5C6399A64
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000010000000000000000000000000
-Out = 2B4F25AC69BA3AD941BBD4E1ECC75E79
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000008000000000000000000000000
-Out = FB943544937F3A34DFA0548C0257CE53
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000004000000000000000000000000
-Out = 125A04339B61FA79FA3757576EC4FAA1
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000002000000000000000000000000
-Out = 160B88277AC4C81603BD37ECA4FD73DC
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000001000000000000000000000000
-Out = 4D65B09355F893E26C85E85955767604
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000800000000000000000000000
-Out = 1EE56A4AB4811DC3B17401CBAA8F5A15
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000400000000000000000000000
-Out = 6214728772DBD2CDA3124BA8BA2ABF38
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000200000000000000000000000
-Out = 328B60EDD6FD150934A30100286E07B5
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000100000000000000000000000
-Out = 2C976B076409056EA7489C7658BB34B9
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000080000000000000000000000
-Out = D592EBBA861BBCC369DA99F832B0A773
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000040000000000000000000000
-Out = E6F48FB373724153FFFC51758527C6E8
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000020000000000000000000000
-Out = 6C397B0BF5992740BD6A787F16BD511C
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000010000000000000000000000
-Out = 2CA57FEE77351E747799C8855780C63F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000008000000000000000000000
-Out = 194C42AA377D361BBDF283693171FFDB
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000004000000000000000000000
-Out = 61832D4C637CCE219D2FBB36ACF7992E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000002000000000000000000000
-Out = 945D2B20B9FD48F1961D04DBBA1708B5
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000001000000000000000000000
-Out = EC152810AA2771AA5E871949BF12B6F1
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000800000000000000000000
-Out = E87712941A7EE80510D53509311196B7
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000400000000000000000000
-Out = 776820A0500F2D90D4DF36F50C395674
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000200000000000000000000
-Out = 64958DB0758C1E80FCFCBB9FC6195E6D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000100000000000000000000
-Out = 37F27D1D918D463B0668A470DE898AB9
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000080000000000000000000
-Out = AA71549A4B290289C7060D76FF5A20BC
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000040000000000000000000
-Out = 95EF0C6213EB7CF56186D76BFA617174
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000020000000000000000000
-Out = 2F6A4BD794419F9F34CFD0FED825B6CD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000010000000000000000000
-Out = 882C2B9E19854367479F0EE25D086F4E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000008000000000000000000
-Out = D246FD18C625C1846741544EC4CE60B6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000004000000000000000000
-Out = 9EAF5A8C5673BE9F488D5C7B6521BD8C
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000002000000000000000000
-Out = 9E7A685F738CB391FAE6ED184087630C
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000001000000000000000000
-Out = 5E0AC39E49825B2424C7263AA8824232
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000800000000000000000
-Out = 0B06C4805E20BC990E601E5610A1BEAD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000400000000000000000
-Out = 78A99615E809CA88F6F6C6E9AFA532FF
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000200000000000000000
-Out = 9ACF5CC740AA37663000C89C5F8EE8D8
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000100000000000000000
-Out = 35D76EBA8F59CA6A78FC2942AC5F7F43
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000080000000000000000
-Out = 39AD4C9AE2B4D46EF693303B54B53546
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000040000000000000000
-Out = EA0833009C96171EAA2BFDEF50DEE473
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000020000000000000000
-Out = 868A8E86F525E50D3FF33A094A3AE119
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000010000000000000000
-Out = 3DBB9A366A2A3A660F027191B3613B95
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000008000000000000000
-Out = E4CDE1FC6D811CDC25328CDAC8D0AD2B
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000004000000000000000
-Out = 332010FB6E39F82F00DC1FF6B6F8CFE6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000002000000000000000
-Out = 00293BFE5BB3DA2D3652D4E06EE361B2
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000001000000000000000
-Out = 9BC99B26E0114669EFE218BF014A15AA
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000800000000000000
-Out = 43C358B6DAB480D0EAEB96DCE57E5B85
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000400000000000000
-Out = 9842333B8E9FCEC35A8779CCCA7D025A
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000200000000000000
-Out = 5A47529DB0D103DCC34D2ADD3A19C53F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000100000000000000
-Out = 8F705A89D4C6EE7E27A14792EC49B652
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000080000000000000
-Out = 6D4B9905F05096B23D6C13565588F012
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000040000000000000
-Out = 23DDD34E8598F013C0559B3312341DBA
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000020000000000000
-Out = 7B5AE9F49ACC68F2FEECB2823C3868A9
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000010000000000000
-Out = 09F8EED21EB8EE33C02B90637EF24E6B
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000008000000000000
-Out = 00A2E8DB0417F61EAABAD6E9BF13E4BC
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000004000000000000
-Out = CF5DB5AA31599EEDB5A3143E08D23672
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000002000000000000
-Out = E09B69B9C0E3365C0EDA54AB3310A5AC
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000001000000000000
-Out = 33650F826366AEC9A09D7D038708737D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000800000000000
-Out = E84A1EE9A00BA66952B24A6E6AD0C002
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000400000000000
-Out = 11B1E0969380A0A24E876D6470872796
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000200000000000
-Out = D88FCA95FA29C35FDCD9467715F102D7
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000100000000000
-Out = A78B86EF0E6959C08F70C810AF8E99CD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000080000000000
-Out = A83E4F27E34360C8033CBC304EBBDF0C
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000040000000000
-Out = 0AA5B4F05A0B42358ABF19F6E55F66D2
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000020000000000
-Out = 5C2AC2588982E3CCE99994101FC0A21A
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000010000000000
-Out = 60A3E107674A0B7F7B931C6EC35BC747
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000008000000000
-Out = 123D266844DFFF63DA93C4D806325660
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000004000000000
-Out = 08170908422DCB46EEB046F3D7E4AE3A
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000002000000000
-Out = 13754D93DC4807807A9535388553FB47
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000001000000000
-Out = DFA9741DD3883E39FED5716A706A65EC
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000800000000
-Out = CA5C3DCA7BE84DCBE33BF5238EA3F4B0
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000400000000
-Out = 6EBEED89B297D6918FA5CEAB7A0E985E
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000200000000
-Out = 3F79AB2119DEBCC44675E340C25B7D85
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000100000000
-Out = A7739DE45E6051EBBDC2F0365859BEE0
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000080000000
-Out = CEA0C2B3C653B7553605BACCFDD62DF8
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000040000000
-Out = 7F9742EEE96193CA8981739712F73045
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000020000000
-Out = F0103101F4EC92C0CB48145FF34CF51F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000010000000
-Out = 55A8A3B02951558F343C160E7F86288D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000008000000
-Out = 3F9206DB4F3083E8F6EEC33CFE2C1BBF
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000004000000
-Out = F012723B2F08A28A5E24BB959FA5EFDD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000002000000
-Out = 1A28919DB3AB4A53D5A0E1E566982DF7
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000001000000
-Out = E17C960B43B7E926C83DF749C6A5532F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000800000
-Out = 16DF63CFB77D31CC782C0ED3190136AD
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000400000
-Out = 1643D697AC4075EC6FE609472FA4C678
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000200000
-Out = AD76BF6119FFC36369980D3466CF6570
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000100000
-Out = 554E53F64D99F89A5BAA7FD5B70E0BD1
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000080000
-Out = BDC10FF10FA5E3A41B096C870666DECB
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000040000
-Out = 6B12E2408646228502972EA7580B05E1
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000020000
-Out = B9583810806D5A491B2F69FFF2D2A327
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000010000
-Out = E8E9F4A50B834DDEF307503AECD8A3BC
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000008000
-Out = D7F4A1C7F7954E789BD61007866FFA80
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000004000
-Out = 953D7D0FD6DDD25CA25FA23C9322339F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000002000
-Out = CD4E607B4324CEC7372DE19CEA5AEF78
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000001000
-Out = 9B5C29709E0F0E586383EAB29E884009
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000800
-Out = 28B822B70E7430E44182C2BBAED4D88D
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000400
-Out = D2325AF7325642138C355BC4ACAF938F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000200
-Out = F4D1A000EC3A370B5A6386355CEE010C
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000100
-Out = F9D198D9FDC650AFA72320AD4826506B
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000080
-Out = 5024595BEB4DAA2239D495BB023757EA
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000040
-Out = 8A6CDA8F518CA2FB0A860C5567C60104
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000020
-Out = D6D90C40B07164436453E8312A633109
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000010
-Out = 3E73330AE10DF1B8B81D9CA72221E192
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000008
-Out = 5029AE60BF118AA69E47B235C3551490
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000004
-Out = 7299F32614EA0BD98D2375CA643EC47F
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000002
-Out = DF4A7B804A4D3A13113529C509F8BAF6
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000001
-Out = 3EFC3791618B7D832BFA6AE030C09122
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 80000000000000000000000000000000
-Out = 30F5C183F6C81A72F39B618B086CC2DE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 40000000000000000000000000000000
-Out = DB11AFAAB4946101911DF90AFED8AC0D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 20000000000000000000000000000000
-Out = 1487FC298DBDA9C520CC5851B17D4079
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 10000000000000000000000000000000
-Out = 2321D38ACCAAEA5DBA682E7BDCE095AB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 08000000000000000000000000000000
-Out = C4DB11197AE15CF9DFE7D0F3457EC94C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 04000000000000000000000000000000
-Out = 1054BFF1A1564172460A0194B57EBE6C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 02000000000000000000000000000000
-Out = 2340568047F06139D03FE0A3C75CDBF1
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 01000000000000000000000000000000
-Out = 3FA18912A1C05E244663BD9A9B5D4046
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00800000000000000000000000000000
-Out = 7220FA3179267839BB03569E43056BE8
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00400000000000000000000000000000
-Out = C7D49A32A6B93D1323EFD7B99FC0A5F7
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00200000000000000000000000000000
-Out = C30D9FFB19F2090109AD40FDAB73176B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00100000000000000000000000000000
-Out = 54CA1E1FD38713CD454A07339385739F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00080000000000000000000000000000
-Out = 034516E874272A5A325EB9D54831B6F7
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00040000000000000000000000000000
-Out = 42650A58269E311A3B4F7BC414D1488A
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00020000000000000000000000000000
-Out = 8D4916888A02DC18E1EE95B005C58E18
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00010000000000000000000000000000
-Out = B192C07FB927170DF62D6C44819BCD6F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00008000000000000000000000000000
-Out = 973C835241ED02CBE39699AF2FFC150A
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00004000000000000000000000000000
-Out = F9630817124B0787237D76697D66341F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00002000000000000000000000000000
-Out = 51E98EC760A328E35B8D77289726AFC3
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00001000000000000000000000000000
-Out = FC2E80BE856AE38BE0682E8C273616AE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000800000000000000000000000000
-Out = A440C29E6F4D6C3540D6C8DB6B02DE4F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000400000000000000000000000000
-Out = E04312CB849684A440114B40C242F1E0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000200000000000000000000000000
-Out = 2186FC5F5947AAF6626DCAAFFFB47829
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000100000000000000000000000000
-Out = D357AAA0B4548EB23E9CF1B5D33487C3
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000080000000000000000000000000
-Out = 02239634F2A7CB81D1CACA279659C637
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000040000000000000000000000000
-Out = 2EF92962D2F7D0A4B075992C3F8FA9C3
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000020000000000000000000000000
-Out = F197F67C65438532F17DDBE41F87BA17
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000010000000000000000000000000
-Out = 6A9387BE237C03056921A9F85AB7A394
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000008000000000000000000000000
-Out = 5BE801A4767AD211AF20B295E4EB9F72
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000004000000000000000000000000
-Out = D38007A33C45B295D06FA99660E8C6E4
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000002000000000000000000000000
-Out = C87746C9F5405E9BBBB53D17544AD016
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000001000000000000000000000000
-Out = 142BB703DC8B4E870165F987B94A3D06
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000800000000000000000000000
-Out = 3C25BD8199CD580D684BD7EC53601EED
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000400000000000000000000000
-Out = 283CC22E28A7E48B9FB34F5454A1EB92
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000200000000000000000000000
-Out = BE6FA799CE3E6BB239EE35FEF2744A14
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000100000000000000000000000
-Out = 99BF63EEB37E1C7E8686B28A0F13E120
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000080000000000000000000000
-Out = 01308C588EC24E97B75A1D32F8C3E770
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000040000000000000000000000
-Out = F820CB9552F6800049E51037DD238E7B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000020000000000000000000000
-Out = BBC26F6098B0F4D2235FC139041EB78F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000010000000000000000000000
-Out = 836E3B15AA777DEA46606FCC7C2FAB65
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000008000000000000000000000
-Out = AAB58970926FE6CFC4017F23FB44C287
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000004000000000000000000000
-Out = 1DEEF417C2192D50694D1DF67F960E6E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000002000000000000000000000
-Out = 4E4EA43FAD14AF207C311D98A1DB4B24
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000001000000000000000000000
-Out = E0731CEF0FAF7AE36B4FCB9E1AB95488
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000800000000000000000000
-Out = C6FF60796386126058694CAA35BFF163
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000400000000000000000000
-Out = AEA22D742BA1919C43E0A42719B1A9C8
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000200000000000000000000
-Out = 843793D2EF2427D745B9B35BC0AD0555
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000100000000000000000000
-Out = 3C805CED7CBDEF4F896113D95D4BD975
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000080000000000000000000
-Out = 5157A8B222432635BEBD29BDAA9C490B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000040000000000000000000
-Out = D7A88C8E82EB2F2BB827E56F33E7B1C3
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000020000000000000000000
-Out = DA55FBE256EF08F565A70D870B969B27
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000010000000000000000000
-Out = 951F6F33FD34701F7C79FC94EFB119CF
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000008000000000000000000
-Out = BE2BD92D9F3DBFD3225B7488FFEC09C1
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000004000000000000000000
-Out = 3C560897DF4AC5F3C33818E2597E90B0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000002000000000000000000
-Out = 52C4110C36C90E3A54921B3F1AAB66C0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000001000000000000000000
-Out = 9DCED6AECC426A4DFB6B648490A7D002
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000800000000000000000
-Out = F2631BD62B10761B923DD415ADCCC59B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000400000000000000000
-Out = 2B1E1C0D54367440A122D31058057A42
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000200000000000000000
-Out = 544C870FBF43AB7CFCF114E00B05D974
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000100000000000000000
-Out = 1E8B06D5FDF11BF70AD8F8748F7F6C33
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000080000000000000000
-Out = 582BE6419DB732C646B80E8C8966C7CC
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000040000000000000000
-Out = 2AB0AEAAF06EAD0BA24CCDD46BCAC4D2
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000020000000000000000
-Out = 32ABA6C20CFFB3D81A4D3288BF4BDFB1
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000010000000000000000
-Out = AB8F8FB0A91662A4E3C54C395BDD6711
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000008000000000000000
-Out = F154670ADDE837119060F4ECE9D7B636
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000004000000000000000
-Out = 64CE436BCC7AAC1DE95D6CECC28C46C2
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000002000000000000000
-Out = 17A6371CFEAD87CBB6A545D9F9973155
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000001000000000000000
-Out = 532AC851EF076F571D6B1C9418D7E2E9
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000800000000000000
-Out = 8CA057121128472C01EF7F6EC39EC63F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000400000000000000
-Out = 283DF89A06A93492543BCA4D5DB109E9
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000200000000000000
-Out = 2A07389C26321F9F7AF46897D80E3CCF
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000100000000000000
-Out = 1473BBE037060B30273908A495C2F622
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000080000000000000
-Out = C937D109334A404B55CEE675092A2D2C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000040000000000000
-Out = 0CAA09146104F478E231268F03EA4FB9
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000020000000000000
-Out = 7FCA0541DC09F947145B69C93E0E382F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000010000000000000
-Out = 16739ED42CEF90CA03B686FF13A29A6C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000008000000000000
-Out = 911BB934A7D6ED03A5AF9DF7A28E8129
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000004000000000000
-Out = 3974614212BA6A30AC9541B7776CC29B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000002000000000000
-Out = 8D17F86E8423398AB06E739B112048FB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000001000000000000
-Out = 76A0AC6091D6DAF57C303E02D5AE8F97
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000800000000000
-Out = 98C8AD3C3AB0EFB14DF2C96EC4A5923C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000400000000000
-Out = 3AF0B1C79917659CF8E5B91D4ED31ED3
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000200000000000
-Out = 0F6C180C0D449B35A3C7026E513DA0D9
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000100000000000
-Out = 646F2B75831CA1CB950B5CC79F320F6F
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000080000000000
-Out = 2877CB6CFED0900A25FE65367B8DF5DC
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000040000000000
-Out = 5122F1C85198E03E269D90BDA811A8AD
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000020000000000
-Out = 7FEC2A1C88A6E72D22FE71B513B1C34D
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000010000000000
-Out = 1176120721DC2C20A1ED31F1572ECBB8
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000008000000000
-Out = 932B4B9980CF29A3EC9B982A2C0215CE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000004000000000
-Out = BFE6D2C8354E83D26AEF557E2AD1C2EF
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000002000000000
-Out = FE4C742734F30C62964D5917C5B63723
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000001000000000
-Out = 1663275B61F3FACEB365D56D8B51AE33
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000800000000
-Out = 32EB39C865C149CF81E27D8AE0A91BDB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000400000000
-Out = 0229846F9F8150006A27D62E60A762DE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000200000000
-Out = B88BACF0AFFAA2C5CAAC4C7036785A74
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000100000000
-Out = C61820350B4DAF92077DB18B2563C050
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000080000000
-Out = D4ABF17AA49B24F71DD5151339951D1B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000040000000
-Out = D7C632D6C753246A176B659DBCEF61D8
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000020000000
-Out = 1F34C055C434A025ADD592A5397D2D35
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000010000000
-Out = C399CB8A665E35A23F660C2F8C3D8FE9
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000008000000
-Out = 09E11B6D984BD70089CB2360448A4B60
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000004000000
-Out = E243F7445FCCF52878F8B83BE492EABA
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000002000000
-Out = 389F39873BDF652BC4F9043E30AD7CE0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000001000000
-Out = 0669295AA4EA970860CF675D6469F765
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000800000
-Out = 35C5F9A85171DC889BFD5332E6C8E0D7
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000400000
-Out = E07600A31EA2F2F781EBC12A3DDC936E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000200000
-Out = FB4CBEC86740711F59995673EB73ADE8
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000100000
-Out = E572F84C3AEFB9DFCE042B39E68EA160
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000080000
-Out = A87AB39149865D45B1E43D35D8C65001
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000040000
-Out = 4E5215E398BD5D0F7223348581D18158
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000020000
-Out = 2524BA2E297D0D2B26797441A7CDB01E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000010000
-Out = 3DCE8EB2F6FBDBB7A33A26FF6485D4AE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000008000
-Out = 28EC64C3D0C3AA145F21F4067322573B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000004000
-Out = EC6E0084F98693A0D3AD1E4790716ACE
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000002000
-Out = F09BD8B4646FBAC5556B4F0B816B35EB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000001000
-Out = 9CC8722245E3CD23DF490353DCACC9E0
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000800
-Out = C73465C832CC907D4F79035E67F9AE29
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000400
-Out = F311B9CF73CF5A8FAFB9DBEECC67B9E1
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000200
-Out = 56494DBCF09A6019B1C6CEE3DB0C844B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000100
-Out = 0364CB9DAF55D765BC5CCD46B58FA718
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000080
-Out = 4DAFE2AAED6E49C98A7B8B979C32E6DB
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000040
-Out = 2F5BECD180A9449CE7A1ECCCB34057B1
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000020
-Out = 1C8B0DF1D643B9376B3E40B847850DFD
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000010
-Out = 674A46D61796154EC5DE8EC7EDA4BD3A
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000008
-Out = 8F111A48A7C598EFF1CBCB43414A7791
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000004
-Out = CBD9C99FB47C9518151222D6F8B07446
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000002
-Out = D449C5BE9B01257543932AF7B8777F69
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000001
-Out = 283D43A1CEA6187A31581D1606BB8B7A
-
-Key = 80000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1AD578A02A08162850A15A1552A17AD4
-
-Key = 40000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 912E9CF1473035A8443A82495C0730D3
-
-Key = 20000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3D3E851A80ABAF221761931747473048
-
-Key = 10000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 96CFC0510819EEB7FCDF2CC7BEABEF77
-
-Key = 08000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FB787268EC3C583A3685973B861AEF8D
-
-Key = 04000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2AE927525C73250D954B619EDAC718BE
-
-Key = 02000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 00298D1DB6C6DA02E28E49C63B4A5795
-
-Key = 01000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7E32F418910C9AC8701292B5F96346F3
-
-Key = 00800000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9FC6C21A562A049AD320EAA0D43C1998
-
-Key = 00400000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7A0BD66C361D641DFD313CBE23F69A57
-
-Key = 00200000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C2E2CAD226964597A98C388B27127EA1
-
-Key = 00100000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B7F4837AC6F1F808D8EBBF1D08077FB4
-
-Key = 00080000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0495E1AEDA7A9EC9ACBF38FE41CB08FA
-
-Key = 00040000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E001020E1D0C05BE072695F3F48F07B2
-
-Key = 00020000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 608CE7A12C9EEC348FF674FB9F8D1972
-
-Key = 00010000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 916BEC60955C1A3540B4C245F4D3B94B
-
-Key = 00008000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B2B91EC4EFE12CD4EDDA71ED52B278B1
-
-Key = 00004000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0CA46CF5275313AB3D9494A5BB7D786A
-
-Key = 00002000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E679B7C6F661AE52BA5199EC24D4E542
-
-Key = 00001000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 043FAB3A991B3FEC872AC747640731CB
-
-Key = 00000800000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EF8C38151A67B9A51E0935BBA14D9E22
-
-Key = 00000400000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2D4515423CFCF372B5632C2879A71267
-
-Key = 00000200000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2420A9327B9D2426C19F755BC3D8BD88
-
-Key = 00000100000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2151D88643EE81D8D23B44D22E2B0D65
-
-Key = 00000080000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AEFA6F32E963CB2D4D89E673B503DDAC
-
-Key = 00000040000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 43DBE4D6B1BA3F05F16D73B2F80A12DF
-
-Key = 00000020000000000000000000000000
-In = 00000000000000000000000000000000
-Out = ED8C9B25558CAD4EF9469364BE97CA30
-
-Key = 00000010000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BDE5B1DC5053F94670599CBE6845604B
-
-Key = 00000008000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4529434499884BE7C4E6D009F3D5353E
-
-Key = 00000004000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B3D4C642173189B9295912E860CF6880
-
-Key = 00000002000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 651F1B1629535AD03D5C296D560FDE1F
-
-Key = 00000001000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8A380594D7396453771A1DFBE2914C8E
-
-Key = 00000000800000000000000000000000
-In = 00000000000000000000000000000000
-Out = 395FE0214AC536428C86737514B6237F
-
-Key = 00000000400000000000000000000000
-In = 00000000000000000000000000000000
-Out = ACEFAC47A7AB6E635EA9F85EF74DEFF3
-
-Key = 00000000200000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8C208E26E96D9DFA248010D8C1CFDB3B
-
-Key = 00000000100000000000000000000000
-In = 00000000000000000000000000000000
-Out = D3AE8AE99B3A84C3721EAA57C8EB17B1
-
-Key = 00000000080000000000000000000000
-In = 00000000000000000000000000000000
-Out = 40D8DA37A8A6591A203F2A38AB05A08D
-
-Key = 00000000040000000000000000000000
-In = 00000000000000000000000000000000
-Out = F0580D0B864E8C03638A33499B36C9A5
-
-Key = 00000000020000000000000000000000
-In = 00000000000000000000000000000000
-Out = 10F19634C2D1006B0C208AA303065B0F
-
-Key = 00000000010000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7D43298935D0AF6DB498542752666C99
-
-Key = 00000000008000000000000000000000
-In = 00000000000000000000000000000000
-Out = 456AD1F19D18900B4F85EB64E06DF643
-
-Key = 00000000004000000000000000000000
-In = 00000000000000000000000000000000
-Out = 08C83A53955102F6E60C2CB0F6C02443
-
-Key = 00000000002000000000000000000000
-In = 00000000000000000000000000000000
-Out = 351C1035006BC7475DF60694859BB491
-
-Key = 00000000001000000000000000000000
-In = 00000000000000000000000000000000
-Out = BB47464DFF62381AD4A93684D00A817F
-
-Key = 00000000000800000000000000000000
-In = 00000000000000000000000000000000
-Out = 514AC91B28081BD0E0CAE22D766257DF
-
-Key = 00000000000400000000000000000000
-In = 00000000000000000000000000000000
-Out = 7758C19B083A62E6F2CAAD2B4C3DF4DC
-
-Key = 00000000000200000000000000000000
-In = 00000000000000000000000000000000
-Out = 46B352EAC71542E417619E0360221673
-
-Key = 00000000000100000000000000000000
-In = 00000000000000000000000000000000
-Out = 648D51C6F9522FE38108BBFD34015F22
-
-Key = 00000000000080000000000000000000
-In = 00000000000000000000000000000000
-Out = DCD800CC104B9C098AB4B931C7538F00
-
-Key = 00000000000040000000000000000000
-In = 00000000000000000000000000000000
-Out = E40601C1632937FA769C58BE63DEB056
-
-Key = 00000000000020000000000000000000
-In = 00000000000000000000000000000000
-Out = BC968175089F3864C81124A55AA445EC
-
-Key = 00000000000010000000000000000000
-In = 00000000000000000000000000000000
-Out = 05479ACFA5A7C6BC89FE432D8D25A366
-
-Key = 00000000000008000000000000000000
-In = 00000000000000000000000000000000
-Out = 8DDF91E221B4C2043C079F5F0ED63EA7
-
-Key = 00000000000004000000000000000000
-In = 00000000000000000000000000000000
-Out = 66C47E3E339FFD404A61547E54ED0F7F
-
-Key = 00000000000002000000000000000000
-In = 00000000000000000000000000000000
-Out = 3D622A36A3375D2EFFF3B49363F25755
-
-Key = 00000000000001000000000000000000
-In = 00000000000000000000000000000000
-Out = C2E42DDC662F226D09908E2CFDD03D32
-
-Key = 00000000000000800000000000000000
-In = 00000000000000000000000000000000
-Out = 3221BC8032E72E0DE7580480A99DFD7D
-
-Key = 00000000000000400000000000000000
-In = 00000000000000000000000000000000
-Out = C65A142D036E99D1A4DA370D964A8A44
-
-Key = 00000000000000200000000000000000
-In = 00000000000000000000000000000000
-Out = E9C03F4840645726563582AA30464D1E
-
-Key = 00000000000000100000000000000000
-In = 00000000000000000000000000000000
-Out = 93C2F8237D526E910F007FA0CF0608A8
-
-Key = 00000000000000080000000000000000
-In = 00000000000000000000000000000000
-Out = 6F3A45184B87581E98B7B0D873F8B315
-
-Key = 00000000000000040000000000000000
-In = 00000000000000000000000000000000
-Out = D3569BAB0FDD360451E113895B39D0E2
-
-Key = 00000000000000020000000000000000
-In = 00000000000000000000000000000000
-Out = 4002FF10DDB6FCB6669AE3FED696B2EC
-
-Key = 00000000000000010000000000000000
-In = 00000000000000000000000000000000
-Out = B265C44F675800A3B498FFA91C440654
-
-Key = 00000000000000008000000000000000
-In = 00000000000000000000000000000000
-Out = 092E77F2537EE742D627EA8628E473E9
-
-Key = 00000000000000004000000000000000
-In = 00000000000000000000000000000000
-Out = 441859995F05E1C06D118CFFB389C9CE
-
-Key = 00000000000000002000000000000000
-In = 00000000000000000000000000000000
-Out = 844480BB205810808DC1F87C2B5281E9
-
-Key = 00000000000000001000000000000000
-In = 00000000000000000000000000000000
-Out = 4B2E7C3B31CFC0CA5B51EA589DFFC9AC
-
-Key = 00000000000000000800000000000000
-In = 00000000000000000000000000000000
-Out = D55D552EA89C267FF3B0AF688CF00D78
-
-Key = 00000000000000000400000000000000
-In = 00000000000000000000000000000000
-Out = 6AD19E9DD39381C8A02F3CC6F60C8048
-
-Key = 00000000000000000200000000000000
-In = 00000000000000000000000000000000
-Out = 271ED37DB771414743EB781B2B315841
-
-Key = 00000000000000000100000000000000
-In = 00000000000000000000000000000000
-Out = ED0A833C87FE6CDC56E021BCD3099508
-
-Key = 00000000000000000080000000000000
-In = 00000000000000000000000000000000
-Out = 6DBE8FEEB66CF747FFEC4E6D3D2D6BB0
-
-Key = 00000000000000000040000000000000
-In = 00000000000000000000000000000000
-Out = 79460469EFEA89FA576B526B17709D4E
-
-Key = 00000000000000000020000000000000
-In = 00000000000000000000000000000000
-Out = 5C3C35EC3D15CFAE719221549293A6AC
-
-Key = 00000000000000000010000000000000
-In = 00000000000000000000000000000000
-Out = 607106E18F8C8A6E725AF44A491D891A
-
-Key = 00000000000000000008000000000000
-In = 00000000000000000000000000000000
-Out = 1C22A5627309A238E2CE5A39BE370243
-
-Key = 00000000000000000004000000000000
-In = 00000000000000000000000000000000
-Out = FB6D4F017D84E9B74C2A59204A2EA0D6
-
-Key = 00000000000000000002000000000000
-In = 00000000000000000000000000000000
-Out = B66A30712DB3BD6B580678BDA72CC5B5
-
-Key = 00000000000000000001000000000000
-In = 00000000000000000000000000000000
-Out = 59C93B2A53BE699840E29D78ACF05DE0
-
-Key = 00000000000000000000800000000000
-In = 00000000000000000000000000000000
-Out = AD37DFE5DCBB5A50228537BF24ED0159
-
-Key = 00000000000000000000400000000000
-In = 00000000000000000000000000000000
-Out = C9FAB85DCB8DA12A7C9416B267F21486
-
-Key = 00000000000000000000200000000000
-In = 00000000000000000000000000000000
-Out = EC797A0F6EBED4C257BC7FC1D7BD0100
-
-Key = 00000000000000000000100000000000
-In = 00000000000000000000000000000000
-Out = 629D633D7A7C345A3A3CF66565E298E1
-
-Key = 00000000000000000000080000000000
-In = 00000000000000000000000000000000
-Out = 859D400CC95F29E7131561F4D7E4DD12
-
-Key = 00000000000000000000040000000000
-In = 00000000000000000000000000000000
-Out = 932CFF2E8A828C61BA537E186F559E93
-
-Key = 00000000000000000000020000000000
-In = 00000000000000000000000000000000
-Out = 62FA5692938CB84279C7E399BA10E08D
-
-Key = 00000000000000000000010000000000
-In = 00000000000000000000000000000000
-Out = 50321207B2A375B12F4630F3F1909B08
-
-Key = 00000000000000000000008000000000
-In = 00000000000000000000000000000000
-Out = 63978A72D0ACAF85676EAA2D1EE01F3C
-
-Key = 00000000000000000000004000000000
-In = 00000000000000000000000000000000
-Out = 20721CCA68AE0451687D82534A360173
-
-Key = 00000000000000000000002000000000
-In = 00000000000000000000000000000000
-Out = 9223A844EAB1CA5D3A43EBC4C5CF01C8
-
-Key = 00000000000000000000001000000000
-In = 00000000000000000000000000000000
-Out = 70E162CC61AC398CF4D9DBE62FD653CE
-
-Key = 00000000000000000000000800000000
-In = 00000000000000000000000000000000
-Out = 082CED7A4969FD3C8131BF9AE57754DB
-
-Key = 00000000000000000000000400000000
-In = 00000000000000000000000000000000
-Out = 169070D4658D94C12041D14EC60A2B0A
-
-Key = 00000000000000000000000200000000
-In = 00000000000000000000000000000000
-Out = 960E45070B5BA767F1A3117851ECF9DA
-
-Key = 00000000000000000000000100000000
-In = 00000000000000000000000000000000
-Out = 4AAAA999C2421953E3607CA202D4C1DE
-
-Key = 00000000000000000000000080000000
-In = 00000000000000000000000000000000
-Out = E4B97E5B2BA83D2038B5D08EB792F92F
-
-Key = 00000000000000000000000040000000
-In = 00000000000000000000000000000000
-Out = ECBC7F9C422FC676152CC7E40391D730
-
-Key = 00000000000000000000000020000000
-In = 00000000000000000000000000000000
-Out = 55EBABC43A33305FB82B39A88A737FFF
-
-Key = 00000000000000000000000010000000
-In = 00000000000000000000000000000000
-Out = C1BDA064749B2B7A9E9378137462F800
-
-Key = 00000000000000000000000008000000
-In = 00000000000000000000000000000000
-Out = BDDD0163E4CEAC2C614ABDA9EBE15F3D
-
-Key = 00000000000000000000000004000000
-In = 00000000000000000000000000000000
-Out = B767CF0E6717B409743AE41C56A2054D
-
-Key = 00000000000000000000000002000000
-In = 00000000000000000000000000000000
-Out = AD897CFAED8FBBD9A3006F7EB2A7C601
-
-Key = 00000000000000000000000001000000
-In = 00000000000000000000000000000000
-Out = 2929929D821D010A1A30E9CF4415F809
-
-Key = 00000000000000000000000000800000
-In = 00000000000000000000000000000000
-Out = 0C861D39741060051855648B385708B5
-
-Key = 00000000000000000000000000400000
-In = 00000000000000000000000000000000
-Out = 4BA018EA1AFF5C0A9CF368592B08FD34
-
-Key = 00000000000000000000000000200000
-In = 00000000000000000000000000000000
-Out = 4377CD44B655A0ABC40E5B9D3A480EC6
-
-Key = 00000000000000000000000000100000
-In = 00000000000000000000000000000000
-Out = 2F604E94C9CD1DCB730AB0AF407FEDBD
-
-Key = 00000000000000000000000000080000
-In = 00000000000000000000000000000000
-Out = 44A3514094941B7E497BCFE0D746BA48
-
-Key = 00000000000000000000000000040000
-In = 00000000000000000000000000000000
-Out = 1235A968A7D12BA7042E7E63A897DBED
-
-Key = 00000000000000000000000000020000
-In = 00000000000000000000000000000000
-Out = 0BA061C7AD274E004B2E06D3D5FC784D
-
-Key = 00000000000000000000000000010000
-In = 00000000000000000000000000000000
-Out = E0DB8CE28D1C2F6B692B230A7AB0CB44
-
-Key = 00000000000000000000000000008000
-In = 00000000000000000000000000000000
-Out = ED4BBD535080655AF3F4D71709B1B8D5
-
-Key = 00000000000000000000000000004000
-In = 00000000000000000000000000000000
-Out = 92D183FBE0BD07A0884EBD1963A193BE
-
-Key = 00000000000000000000000000002000
-In = 00000000000000000000000000000000
-Out = 995BB9E75386C99DA3038C3C6340C838
-
-Key = 00000000000000000000000000001000
-In = 00000000000000000000000000000000
-Out = 4914DA6C7A8E1AB8297A9D280DE576F9
-
-Key = 00000000000000000000000000000800
-In = 00000000000000000000000000000000
-Out = 6415185D85078CE80F46C6E09EDB8B78
-
-Key = 00000000000000000000000000000400
-In = 00000000000000000000000000000000
-Out = 8B2908466F8BD3C1C3A4A5EAFCC0FF92
-
-Key = 00000000000000000000000000000200
-In = 00000000000000000000000000000000
-Out = 425BF2FCF5DD8B0013773F9A0DC09B0D
-
-Key = 00000000000000000000000000000100
-In = 00000000000000000000000000000000
-Out = 9AC35220BE56E453B73CD887B299D06E
-
-Key = 00000000000000000000000000000080
-In = 00000000000000000000000000000000
-Out = 41900EF8223D019F1BC3E8EA68FC763C
-
-Key = 00000000000000000000000000000040
-In = 00000000000000000000000000000000
-Out = 9D294A574144109A9C6DE8E90EE517B6
-
-Key = 00000000000000000000000000000020
-In = 00000000000000000000000000000000
-Out = 4146D6BB7AE455D93EAF43753C7AE693
-
-Key = 00000000000000000000000000000010
-In = 00000000000000000000000000000000
-Out = 4155B7D12FD12F96FD39C576FDD41422
-
-Key = 00000000000000000000000000000008
-In = 00000000000000000000000000000000
-Out = 1AF1E634B06211668CE2410D5EDCA968
-
-Key = 00000000000000000000000000000004
-In = 00000000000000000000000000000000
-Out = 815739510622BFE08EEE06B772368524
-
-Key = 00000000000000000000000000000002
-In = 00000000000000000000000000000000
-Out = E2F7D8411181A21B02C1466E750056C2
-
-Key = 00000000000000000000000000000001
-In = 00000000000000000000000000000000
-Out = 13095792D8B1D771378839C912CA3C41
-
-Key = 800000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8301730C7D5FEFC416BEEC1104C51E36
-
-Key = 400000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F7EF83BDD4C3D5B30E805C351DB87200
-
-Key = 200000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A236EB8595FDF9239C658D58342EF566
-
-Key = 100000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 236397EB9EEDA5EA8BF4A42864A5A39F
-
-Key = 080000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 21C3DD416D64F6055C8C3977EEFB4652
-
-Key = 040000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 59128F63BD9D834C3EECA5A5299417D1
-
-Key = 020000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0F95FA4C48DE95391B45A460B92B22BF
-
-Key = 010000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5073FABD5FA03D153108B9A5F2128C78
-
-Key = 008000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B83872427919126F2C976D45872B7596
-
-Key = 004000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 73F8E6C4181758AFA29945E970C8F854
-
-Key = 002000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B72DC39B9A72EFFA047E3657B1F02B1B
-
-Key = 001000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 081F1C50BF964CCC01949363A1A1C76C
-
-Key = 000800000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D4A2AB8B904BE542386CC2342AC354D6
-
-Key = 000400000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BC94C45B53BB5281BFF16F7BC7CCD26E
-
-Key = 000200000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7D976240134D43279AB809A3EC1BAB8E
-
-Key = 000100000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BE18D342080322DBBCEDBB83C7F11CA5
-
-Key = 000080000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D1359D29060E0003C78066A900C90C00
-
-Key = 000040000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FD0A7E670B7E9B57C913D38E4649715E
-
-Key = 000020000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C9DFB5B1CB3E079CFC027E67DA61EC2A
-
-Key = 000010000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 10FDD69900FBC470499EDF0AFF655430
-
-Key = 000008000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 565721A361F5F0EB44366DEC1D6841BE
-
-Key = 000004000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 07AD173E39A769D345277F4CFD16BBA8
-
-Key = 000002000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8E89B6B70A10D1866ED4D139A0E6565C
-
-Key = 000001000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 88A431DD4CBBD94778AE53A36EE246DE
-
-Key = 000000800000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F4C8E31B64506E9BDE6BB682DBCEF50A
-
-Key = 000000400000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5B0E256E4EAB25AEC08CD2CE5547334D
-
-Key = 000000200000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EDBAA578C13D7D215057EAD4F03B9E1C
-
-Key = 000000100000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7EA37DB8EB1B362E370A43DF1ADB2F0A
-
-Key = 000000080000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8B7C67AE8F749C4EFB7418788D369DEC
-
-Key = 000000040000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 34D3A7E87A4B1B3FAC60672A3D82F40D
-
-Key = 000000020000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4FE628152A1D46CF6DA78D5F17255877
-
-Key = 000000010000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3460A571D035B6DA52AA8E59702B79C0
-
-Key = 000000008000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CA2375E2E96AB28C7FC3E61B6561B07C
-
-Key = 000000004000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7E33319A69017428DDBD979D3F6982C6
-
-Key = 000000002000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 49DA8B8AD80A6BBA1003FF6B8D06E3D8
-
-Key = 000000001000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CCE4C841B39187943DCCA5EB8BBF1221
-
-Key = 000000000800000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3B42FA9129BF36F87E445589460A19BD
-
-Key = 000000000400000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3E397A22C64A8C09B5B59A9D397B0A96
-
-Key = 000000000200000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 159AB9C871FB3EB373A94721E9F0743A
-
-Key = 000000000100000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9C2DECEEFEDF2475C26EFFEA3A0E2920
-
-Key = 000000000080000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0FCC4399113E6BF62A23F657BEF97224
-
-Key = 000000000040000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2FCA4167B034D9EDAC4E12828B911600
-
-Key = 000000000020000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3F9434872C4E49EB8718EDB8896CFF2E
-
-Key = 000000000010000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8168025815D16028078007C9E1370331
-
-Key = 000000000008000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F0FBF790B49553EC3963805CC2F6AA7E
-
-Key = 000000000004000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 951C45D26A548A9A6152CCBC00D3C6FA
-
-Key = 000000000002000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 845DCC97B1F8CD3254D2B29A59C7AE41
-
-Key = 000000000001000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6694A168D387E4FB3291A376B938136D
-
-Key = 000000000000800000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9569359A00659B9645565857398C982F
-
-Key = 000000000000400000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 417C97D7F56216FFEBE64A73F8D81168
-
-Key = 000000000000200000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8C46288B3314B9E1BC91E3C901C784A8
-
-Key = 000000000000100000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8EB78926977246F186274D88A4B0E6B3
-
-Key = 000000000000080000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 51E819059AB0325A2DF7F8CF49A54353
-
-Key = 000000000000040000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 56A59894FC1972B03D66D6C43688138B
-
-Key = 000000000000020000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CB772637B59AD2330ACC8CC2FA7A338B
-
-Key = 000000000000010000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1E3759E5BBE19EA0F66FBB0702F07440
-
-Key = 000000000000008000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2112CFD246447D95F1A6BFF65A044121
-
-Key = 000000000000004000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8A7E580BAC4406B297E12B472C2748E3
-
-Key = 000000000000002000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 349ABE7C34357C7C719BD48AB62DF95C
-
-Key = 000000000000001000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5EDB9089B865DAC899854DACE9DBBDBC
-
-Key = 000000000000000800000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C82372837C0B459699779683785CE09C
-
-Key = 000000000000000400000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B26532F7C0FDFF76BFADD7178E7A2A7A
-
-Key = 000000000000000200000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 965F80C599BF6AA85CA2199C785EDAF1
-
-Key = 000000000000000100000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8434DFE0C8717514FB0F8A4FF46930B6
-
-Key = 000000000000000080000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 10D701937E2944C7B48BAA32DA64C6A5
-
-Key = 000000000000000040000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9A401E466C3686609B7B92FC6C57EA3B
-
-Key = 000000000000000020000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E3442053C50265AEBEFD327633E449B1
-
-Key = 000000000000000010000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7DF5EC480DEFA928687A35116989A7E2
-
-Key = 000000000000000008000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EB2D38038A867146E3999D3E4DACE2BD
-
-Key = 000000000000000004000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AE420A68558A2A50085331D8C46D7685
-
-Key = 000000000000000002000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 049B78384DE81BB815C48CC565DC1029
-
-Key = 000000000000000001000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 38EDCB5D37E043621F1EB80C78E40657
-
-Key = 000000000000000000800000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 928C462D2AE8B7B45C252D0CAE80B34C
-
-Key = 000000000000000000400000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B3AD5D661D6DACFD57C214FDB9384491
-
-Key = 000000000000000000200000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9785657218402C1F3D1A40E73B015359
-
-Key = 000000000000000000100000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 302355F21D129456A3EC58CD4C74D334
-
-Key = 000000000000000000080000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7322A935E1F65E2F341F778D0A55DAC0
-
-Key = 000000000000000000040000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7EEEF0009743F18E1E08F5CB02CFA104
-
-Key = 000000000000000000020000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 82FA95B00BA5C8D71CB372895E91F7AD
-
-Key = 000000000000000000010000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 44E308A9BAE6315936931C0D6F3472A4
-
-Key = 000000000000000000008000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A0F7760CB5F12B2F7F7451688DCC6DB3
-
-Key = 000000000000000000004000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 249CBF1A9027A9D4A049DCC61C100631
-
-Key = 000000000000000000002000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AE5191679DB49836EBD11781E1A9E809
-
-Key = 000000000000000000001000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6F0F72E56952895F7425A34EB97D0D41
-
-Key = 000000000000000000000800000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E4C8937EA026250290E85A2AA4B3A338
-
-Key = 000000000000000000000400000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0D1B7815F62D8C6DB79E9755EB5CC047
-
-Key = 000000000000000000000200000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3B8DA219500F670D2D32C753F613E646
-
-Key = 000000000000000000000100000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DC16F91F486975C2762AAEF8E4C66543
-
-Key = 000000000000000000000080000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7CC222B3C5866AC0F27A60C9D9713981
-
-Key = 000000000000000000000040000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B7F625FC185B3ACEF820AF59570370FD
-
-Key = 000000000000000000000020000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8AA59EA7476AFE267D7745A2A5E1D0CB
-
-Key = 000000000000000000000010000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DDB9E4AA397029E10ED5F1984513280B
-
-Key = 000000000000000000000008000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C92B81F3061A4ABC6C35D1B0AF2BA410
-
-Key = 000000000000000000000004000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 05F510BA96377001A23093980C02FBCD
-
-Key = 000000000000000000000002000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A22D14EBC78B338735CA0AAD155B0114
-
-Key = 000000000000000000000001000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C562318B01D5235CCD4DC3D3A8B10DA0
-
-Key = 000000000000000000000000800000000000000000000000
-In = 00000000000000000000000000000000
-Out = FA248CAA2F7C4B029054A31917BE9B47
-
-Key = 000000000000000000000000400000000000000000000000
-In = 00000000000000000000000000000000
-Out = FCC4E2E3C6E5DB8DECBF2493E3A52B9A
-
-Key = 000000000000000000000000200000000000000000000000
-In = 00000000000000000000000000000000
-Out = C5D23718F33ADC9F8B3B35263E47248A
-
-Key = 000000000000000000000000100000000000000000000000
-In = 00000000000000000000000000000000
-Out = 773E59C9CA8EFD081E1CFD4F3DF4BC16
-
-Key = 000000000000000000000000080000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9A5E5AB516ECEA600952D25684DFF5E9
-
-Key = 000000000000000000000000040000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4EB9B9CC17E48F68423C884D64091022
-
-Key = 000000000000000000000000020000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0CCD75BECA8406EBF53CB0ABB1B46B23
-
-Key = 000000000000000000000000010000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0242108DABD2ED9886E8ABD70AA97B29
-
-Key = 000000000000000000000000008000000000000000000000
-In = 00000000000000000000000000000000
-Out = C52A6EB2958C995465C4F870F1A8269E
-
-Key = 000000000000000000000000004000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5FD2C7F3C81B013B96EC3ACBB0688175
-
-Key = 000000000000000000000000002000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1E63A0B10B0293A8572FD7749ACB9A53
-
-Key = 000000000000000000000000001000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9E1D466FA752C13AF4296CFFB8566DB2
-
-Key = 000000000000000000000000000800000000000000000000
-In = 00000000000000000000000000000000
-Out = BA1A69D7AD2869734A4954553D4EF249
-
-Key = 000000000000000000000000000400000000000000000000
-In = 00000000000000000000000000000000
-Out = EC2E7D615474B0B08D47AFCBE4FD8402
-
-Key = 000000000000000000000000000200000000000000000000
-In = 00000000000000000000000000000000
-Out = 5C295AA2183B5FB9498094DB774244D1
-
-Key = 000000000000000000000000000100000000000000000000
-In = 00000000000000000000000000000000
-Out = 1C5A17D1BE0D9EDCF339DB3D2631F236
-
-Key = 000000000000000000000000000080000000000000000000
-In = 00000000000000000000000000000000
-Out = CF6E9758B39149E3E29FB66CD58D0976
-
-Key = 000000000000000000000000000040000000000000000000
-In = 00000000000000000000000000000000
-Out = 4F3FF2CAB95F678D85207691BFDAB811
-
-Key = 000000000000000000000000000020000000000000000000
-In = 00000000000000000000000000000000
-Out = 463F1FCDF4A918300A93D7BED72F788B
-
-Key = 000000000000000000000000000010000000000000000000
-In = 00000000000000000000000000000000
-Out = CA5C88802CF0520C6521B106F4A58977
-
-Key = 000000000000000000000000000008000000000000000000
-In = 00000000000000000000000000000000
-Out = 95C83D16F101B16E82D9DF9108A6805A
-
-Key = 000000000000000000000000000004000000000000000000
-In = 00000000000000000000000000000000
-Out = F98E0BE43F35A4CD52F93FD0877C1638
-
-Key = 000000000000000000000000000002000000000000000000
-In = 00000000000000000000000000000000
-Out = 3B0D41F3A12DE6BDACFCA225F1344D77
-
-Key = 000000000000000000000000000001000000000000000000
-In = 00000000000000000000000000000000
-Out = BCB6197992A90A62497B53EC8E7E5857
-
-Key = 000000000000000000000000000000800000000000000000
-In = 00000000000000000000000000000000
-Out = 9CA86B881701310C33F6CB2911ED777E
-
-Key = 000000000000000000000000000000400000000000000000
-In = 00000000000000000000000000000000
-Out = DDF4EBC89B16643E7B4F0B43AB3FC443
-
-Key = 000000000000000000000000000000200000000000000000
-In = 00000000000000000000000000000000
-Out = 650AA74CDF7C5E92720E02A87ECA8FB2
-
-Key = 000000000000000000000000000000100000000000000000
-In = 00000000000000000000000000000000
-Out = F44E947B2A18F15189884E55EAC372CD
-
-Key = 000000000000000000000000000000080000000000000000
-In = 00000000000000000000000000000000
-Out = A4CC79AB8F6ABA941D400B45C32DA248
-
-Key = 000000000000000000000000000000040000000000000000
-In = 00000000000000000000000000000000
-Out = 3C49EE1D3E4D8FD1E5CE9C793511F2E7
-
-Key = 000000000000000000000000000000020000000000000000
-In = 00000000000000000000000000000000
-Out = 49199A91A32424357890F5C8E08E168C
-
-Key = 000000000000000000000000000000010000000000000000
-In = 00000000000000000000000000000000
-Out = 438EBCC76304C4231DCDBDF85A876A85
-
-Key = 000000000000000000000000000000008000000000000000
-In = 00000000000000000000000000000000
-Out = DD04C176440BBC6686C90AEE775BD368
-
-Key = 000000000000000000000000000000004000000000000000
-In = 00000000000000000000000000000000
-Out = 1DBAE21DF9D10630D8E9BA704AA3A6E2
-
-Key = 000000000000000000000000000000002000000000000000
-In = 00000000000000000000000000000000
-Out = F46B5DF361FF1A58AD233A2884E9B73B
-
-Key = 000000000000000000000000000000001000000000000000
-In = 00000000000000000000000000000000
-Out = DBD49C75B6CCA6CCEF0423FF3941922A
-
-Key = 000000000000000000000000000000000800000000000000
-In = 00000000000000000000000000000000
-Out = 2C62774D20D574A487057A24280EBBC9
-
-Key = 000000000000000000000000000000000400000000000000
-In = 00000000000000000000000000000000
-Out = A6E24FFF68DF51B5613692D4098F7E22
-
-Key = 000000000000000000000000000000000200000000000000
-In = 00000000000000000000000000000000
-Out = A961B427D5FCD129EE29830DBD2952DD
-
-Key = 000000000000000000000000000000000100000000000000
-In = 00000000000000000000000000000000
-Out = 7F637C136F8A57358DD5229B5E3BC38C
-
-Key = 000000000000000000000000000000000080000000000000
-In = 00000000000000000000000000000000
-Out = 6FC5A39B35D2EF01B808E20C05DB9DDE
-
-Key = 000000000000000000000000000000000040000000000000
-In = 00000000000000000000000000000000
-Out = 95E085E82A0883C8F6C1C83D6F4DF270
-
-Key = 000000000000000000000000000000000020000000000000
-In = 00000000000000000000000000000000
-Out = BDEE30731D4CD3593E46D9A8222485CC
-
-Key = 000000000000000000000000000000000010000000000000
-In = 00000000000000000000000000000000
-Out = 508B5BB4ECCE303014D5A9ABB47DD30D
-
-Key = 000000000000000000000000000000000008000000000000
-In = 00000000000000000000000000000000
-Out = 047832614B07AEABC28A39D5E72007C9
-
-Key = 000000000000000000000000000000000004000000000000
-In = 00000000000000000000000000000000
-Out = C1D4B662EE239A6DB9262B23C561B677
-
-Key = 000000000000000000000000000000000002000000000000
-In = 00000000000000000000000000000000
-Out = E567714DF47D43F1505D318C8D553062
-
-Key = 000000000000000000000000000000000001000000000000
-In = 00000000000000000000000000000000
-Out = CDF70F29AFD13EC6820D2C126D053DC4
-
-Key = 000000000000000000000000000000000000800000000000
-In = 00000000000000000000000000000000
-Out = 182F2FD0ADC68D8DC72B08AC17E642C1
-
-Key = 000000000000000000000000000000000000400000000000
-In = 00000000000000000000000000000000
-Out = 5DAA43AFBCD59026C0C410072A263673
-
-Key = 000000000000000000000000000000000000200000000000
-In = 00000000000000000000000000000000
-Out = E0C6DD7A8971A7D21AFAE153F115D658
-
-Key = 000000000000000000000000000000000000100000000000
-In = 00000000000000000000000000000000
-Out = 4ED2DAA970922690D8CDF6CDFDA2E8D3
-
-Key = 000000000000000000000000000000000000080000000000
-In = 00000000000000000000000000000000
-Out = C1F929B679E007B1DDBBE896CE91C8C5
-
-Key = 000000000000000000000000000000000000040000000000
-In = 00000000000000000000000000000000
-Out = 2323F5569BA740E14E05E0FB0914CE44
-
-Key = 000000000000000000000000000000000000020000000000
-In = 00000000000000000000000000000000
-Out = 875AFCE0522E00712AB29E0E77BA57D2
-
-Key = 000000000000000000000000000000000000010000000000
-In = 00000000000000000000000000000000
-Out = A6185ECBDEFEB900335BAB38D95D7583
-
-Key = 000000000000000000000000000000000000008000000000
-In = 00000000000000000000000000000000
-Out = 1331B89B377EA2A88A181907300BC50C
-
-Key = 000000000000000000000000000000000000004000000000
-In = 00000000000000000000000000000000
-Out = FC9D177C5B5D072E041D6C2F9EE6B536
-
-Key = 000000000000000000000000000000000000002000000000
-In = 00000000000000000000000000000000
-Out = 5BCE1EA4FD0CC1EDE325DCEB55790565
-
-Key = 000000000000000000000000000000000000001000000000
-In = 00000000000000000000000000000000
-Out = 937FE02D20FCB72F0F57201012B88BA4
-
-Key = 000000000000000000000000000000000000000800000000
-In = 00000000000000000000000000000000
-Out = 5280E7768E573DC74DB90ABDC10422FE
-
-Key = 000000000000000000000000000000000000000400000000
-In = 00000000000000000000000000000000
-Out = 0995E2D8E83C853C58ECF916E8067C3A
-
-Key = 000000000000000000000000000000000000000200000000
-In = 00000000000000000000000000000000
-Out = 98DF44D404B5BD54CA5D55D08E7F1B12
-
-Key = 000000000000000000000000000000000000000100000000
-In = 00000000000000000000000000000000
-Out = 9FD5F1165CD60FA5229CF03080428664
-
-Key = 000000000000000000000000000000000000000080000000
-In = 00000000000000000000000000000000
-Out = B4AE95212E3E8FFD6B27D4F0CC079CCA
-
-Key = 000000000000000000000000000000000000000040000000
-In = 00000000000000000000000000000000
-Out = 878BD051874AB0BAC12EA94C60CC2671
-
-Key = 000000000000000000000000000000000000000020000000
-In = 00000000000000000000000000000000
-Out = 3B0F2EF2A0849425063F49E65DF4D3AB
-
-Key = 000000000000000000000000000000000000000010000000
-In = 00000000000000000000000000000000
-Out = 07D4297668485EBBF0F9266C203407E2
-
-Key = 000000000000000000000000000000000000000008000000
-In = 00000000000000000000000000000000
-Out = C2ECFB79C073BD453BDD2323C77FF80D
-
-Key = 000000000000000000000000000000000000000004000000
-In = 00000000000000000000000000000000
-Out = 5173B04FC7C211CA17161164B79D0AE7
-
-Key = 000000000000000000000000000000000000000002000000
-In = 00000000000000000000000000000000
-Out = 5135A445A721783AACD06930D39F72C4
-
-Key = 000000000000000000000000000000000000000001000000
-In = 00000000000000000000000000000000
-Out = A511E849B1B75DC94B1D73D957B53D78
-
-Key = 000000000000000000000000000000000000000000800000
-In = 00000000000000000000000000000000
-Out = 42312B67F192D72B73689C712D60EAB7
-
-Key = 000000000000000000000000000000000000000000400000
-In = 00000000000000000000000000000000
-Out = 30C89A160855BC3F339A170B715DD482
-
-Key = 000000000000000000000000000000000000000000200000
-In = 00000000000000000000000000000000
-Out = 8DC19A7A97319A3309B98797A59954FA
-
-Key = 000000000000000000000000000000000000000000100000
-In = 00000000000000000000000000000000
-Out = D0AA5A8B9DFF98E18281E5FF20CCA3DE
-
-Key = 000000000000000000000000000000000000000000080000
-In = 00000000000000000000000000000000
-Out = AFA70EF4B45EA22E90108B834019120A
-
-Key = 000000000000000000000000000000000000000000040000
-In = 00000000000000000000000000000000
-Out = 2801C6A5C0547CB988A2137A559D12B0
-
-Key = 000000000000000000000000000000000000000000020000
-In = 00000000000000000000000000000000
-Out = D791F5709D4AFE0642955F1B072F144E
-
-Key = 000000000000000000000000000000000000000000010000
-In = 00000000000000000000000000000000
-Out = 35BB50E6D59A693709DE9B88CC8581F6
-
-Key = 000000000000000000000000000000000000000000008000
-In = 00000000000000000000000000000000
-Out = 9B58CC95279539C1AF0BBC274A62F5C8
-
-Key = 000000000000000000000000000000000000000000004000
-In = 00000000000000000000000000000000
-Out = F51803FF4EA1B0F0AFF1C68C5C98CB3A
-
-Key = 000000000000000000000000000000000000000000002000
-In = 00000000000000000000000000000000
-Out = 975B5309F1D3ACE9BA08B3D2D3FCB43E
-
-Key = 000000000000000000000000000000000000000000001000
-In = 00000000000000000000000000000000
-Out = D53CD9381EA85B0C106C22DA611F7336
-
-Key = 000000000000000000000000000000000000000000000800
-In = 00000000000000000000000000000000
-Out = 393270B47546F1BFE35690ACCAC0FEBD
-
-Key = 000000000000000000000000000000000000000000000400
-In = 00000000000000000000000000000000
-Out = 53E21284948996FC03ED9BCC34B45B61
-
-Key = 000000000000000000000000000000000000000000000200
-In = 00000000000000000000000000000000
-Out = AD9CA2740670DA740C75703A8859382B
-
-Key = 000000000000000000000000000000000000000000000100
-In = 00000000000000000000000000000000
-Out = AC9C2960E3061E56D8B9A1CDD3EED010
-
-Key = 000000000000000000000000000000000000000000000080
-In = 00000000000000000000000000000000
-Out = E5F68B122D15823F131DEA0468977D70
-
-Key = 000000000000000000000000000000000000000000000040
-In = 00000000000000000000000000000000
-Out = 7EB7C6460FE9885BC96AFD4D4B65E90E
-
-Key = 000000000000000000000000000000000000000000000020
-In = 00000000000000000000000000000000
-Out = 409147483ADC22592CA41224D35BB323
-
-Key = 000000000000000000000000000000000000000000000010
-In = 00000000000000000000000000000000
-Out = AB61745316651F61F4E2CC1DFBF8135C
-
-Key = 000000000000000000000000000000000000000000000008
-In = 00000000000000000000000000000000
-Out = 88977EAD91ECF9C83F33EBE41FB7410C
-
-Key = 000000000000000000000000000000000000000000000004
-In = 00000000000000000000000000000000
-Out = 9DC923136A1882D73CB412C986103481
-
-Key = 000000000000000000000000000000000000000000000002
-In = 00000000000000000000000000000000
-Out = 9914219ED77B8FA772B4B8C53F9AD2FC
-
-Key = 000000000000000000000000000000000000000000000001
-In = 00000000000000000000000000000000
-Out = B9A0FA2324625650A2052D691E7DE9C3
-
-Key = 8000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5172978A58543DE597060983FD799F1B
-
-Key = 4000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0F86AECE7ACE09A8EAC0345C935BE91A
-
-Key = 2000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8C8D6ACDB23AE4B5BEE4E2C15273286F
-
-Key = 1000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 11395D4BFE4C8258979EE2BF2D24DFF4
-
-Key = 0800000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D50183337FD8B3FAEF06C78B2ECFC40F
-
-Key = 0400000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F3969970B4E37D9FFD9BD886200D7C0F
-
-Key = 0200000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FF101A14CCB71863E0B51E8583D22760
-
-Key = 0100000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0CACB5AB8A51226134656220DBF23228
-
-Key = 0080000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BF75C54F53A3F374DC549BE280F6C6E0
-
-Key = 0040000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1DC755ED6128DC50826E65632C7672D6
-
-Key = 0020000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D7A46C3A378DB6A9C041D7DB1835DE3F
-
-Key = 0010000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 175FDB12EFB7E7D950777FE12BAAC953
-
-Key = 0008000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1A5C489CB6E0608EADAF3DBFA8B5FD1B
-
-Key = 0004000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7FD567FB07007A65CA8D98D4BF66F7F1
-
-Key = 0002000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3256E4481641ED28938AD6471414CD04
-
-Key = 0001000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A2AD960B437DCD0669681BBBC30F0CF1
-
-Key = 0000800000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FB04B658FA923EA9CD5FB98BE54989DE
-
-Key = 0000400000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F3F43741881655CF074E36BD655F420B
-
-Key = 0000200000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 637DCF9D891EAD8D85A842BE0DC8261F
-
-Key = 0000100000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E663749A2786E3BA3833348A9CE5E7F0
-
-Key = 0000080000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 76F0F7C439E25C54A9BC7AEA05640882
-
-Key = 0000040000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2CDE682FC40895F1E2464739FAD230DD
-
-Key = 0000020000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3242FE919ADFDCE04F163EBE772AD51D
-
-Key = 0000010000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CE05F79A80B2947B13BD22EE37FB3F79
-
-Key = 0000008000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5345BDE33281A0CB4A899A4F18C57563
-
-Key = 0000004000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2E971691DDFD33D36738C08A517B0B44
-
-Key = 0000002000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EE144813E2194B18F1593C44932F170F
-
-Key = 0000001000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F626C435E30ABA4FA6F6DCA30CC08833
-
-Key = 0000000800000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8AD30F69BD7446793C36676755D05F57
-
-Key = 0000000400000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 56851CB7277CBE4AE9AFF86E5BD49F90
-
-Key = 0000000200000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CA864AC764D6B9B9141A08146CFA7F56
-
-Key = 0000000100000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 484518D9A3C6CF7B7B92393DBBF78E42
-
-Key = 0000000080000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 093F44542B0E41E300C11AE77A48C6C4
-
-Key = 0000000040000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6D9856ADC56605F70EF069D639C9D977
-
-Key = 0000000020000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3FFB2FF7C5457744CABDFB89C0BBA7E8
-
-Key = 0000000010000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6D8254191931BE754D64F70FE3E226C7
-
-Key = 0000000008000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 23F3CC55C460EE949A9934C7E5C06CCB
-
-Key = 0000000004000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8739DA7F4A9D821EAA7A349E25741DAA
-
-Key = 0000000002000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 73E724C08890501275A0559621526948
-
-Key = 0000000001000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4CC6569D4F6207DDB03B232BFA8AA481
-
-Key = 0000000000800000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 52A6D921AEF99205822B361D8D9DD998
-
-Key = 0000000000400000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 970E1899AEEEB7CCD26F854CA25214E2
-
-Key = 0000000000200000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D1DEFC8AC21C95160CF71612AAC55A8C
-
-Key = 0000000000100000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D8C2A3AD65F16024265714C21B8A70C5
-
-Key = 0000000000080000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 55DE20482FAE35A03F0D57B7546EB980
-
-Key = 0000000000040000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 81BCA41F11D12EE26326E042E74961AF
-
-Key = 0000000000020000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6D8D5C30A508436401396224D4E417B5
-
-Key = 0000000000010000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0FA1ECAB0B3C598C51372A5AAF6E1315
-
-Key = 0000000000008000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 945BF2690A9CE9ED8009004039E1E743
-
-Key = 0000000000004000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 73618AD5FD3A9740CB92C3F870C772B9
-
-Key = 0000000000002000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A7BAB4D0765D66F06FCB85A42D4CF0EE
-
-Key = 0000000000001000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2A659EA8BF9EA163976C33A0B7463A56
-
-Key = 0000000000000800000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4D9D5CC19BF1B2D48EF2CF4CD313D3E3
-
-Key = 0000000000000400000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0D7A26F850BDD2A633689367901BC2A4
-
-Key = 0000000000000200000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1A1235352EC6CD1A7A1913E77EF7CE4D
-
-Key = 0000000000000100000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5FDC541376BAF15D5AC011B9C0B74E75
-
-Key = 0000000000000080000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CB8DCB7AD04598E8337747E02A8DF16E
-
-Key = 0000000000000040000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2855A6EEA8B20B8B25EDEE37A7D7E976
-
-Key = 0000000000000020000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 58B5CD00D833233E718DBEAABCC48E8F
-
-Key = 0000000000000010000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6DF58A11F96B67C330ED10FFFB1E6D74
-
-Key = 0000000000000008000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8FD74AAB8D136DCF1B398D1174AA343B
-
-Key = 0000000000000004000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A81E2F57E80761E361DB1008AC1ABDD8
-
-Key = 0000000000000002000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BDD939E7A93F6FECC762E2E3321DFEC7
-
-Key = 0000000000000001000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C281060452693278B48AD9076911EC39
-
-Key = 0000000000000000800000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C06C159EEAFF3CB4B509DB604060F537
-
-Key = 0000000000000000400000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 757CED2216A9912B5FBFA1E623077E5D
-
-Key = 0000000000000000200000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9606EDC198F44F955F510FA525E9C80C
-
-Key = 0000000000000000100000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = ADE8D3FAE7A4651855E053F42FFF7905
-
-Key = 0000000000000000080000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 398BA679B6C0A63479F0C6FE25614F01
-
-Key = 0000000000000000040000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FB77ECA9DEF62902240E4BF3806F3A64
-
-Key = 0000000000000000020000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = B4313D0A9D34B21F69021A5458680579
-
-Key = 0000000000000000010000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BDC7C4ED3B989BF8288E8B4ACDE3FEEA
-
-Key = 0000000000000000008000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 430A2DAFFA822532FD4843DF9CBAF824
-
-Key = 0000000000000000004000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 16A2DEBA266577150B6DC34995902C99
-
-Key = 0000000000000000002000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5902382C7675AF5C52A6ADF349454276
-
-Key = 0000000000000000001000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0D912AA37CFB56223C6ED9E04B3D563F
-
-Key = 0000000000000000000800000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1FD8880BE6A6E51C0C0E9C2866127F7D
-
-Key = 0000000000000000000400000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BC4079EE5CDB86BDD8FAE650E2931D98
-
-Key = 0000000000000000000200000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C52E414FC84C978FAD8CFA103844C306
-
-Key = 0000000000000000000100000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DF6291B74EF77E82A8FB7C207213125F
-
-Key = 0000000000000000000080000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 530424A0F23CD90074F2D672A4FF3A96
-
-Key = 0000000000000000000040000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 83ED777537F5EE3E5769B8A07476A6AB
-
-Key = 0000000000000000000020000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5357341784EAB13F104FBAEFC69B726B
-
-Key = 0000000000000000000010000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6DBACA4C68AD93373CBEB1DB0963F33F
-
-Key = 0000000000000000000008000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EFA128916DF70D852574EC8507625CC8
-
-Key = 0000000000000000000004000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0BD55284AC672E1A2F248FB89C22B514
-
-Key = 0000000000000000000002000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E3222E0E2770496C443ED562ECBFC368
-
-Key = 0000000000000000000001000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6B689B6DB9374E072B45A7807DAAB132
-
-Key = 0000000000000000000000800000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3215A725BCFBB120926F8BBCE41FC3EC
-
-Key = 0000000000000000000000400000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F2475FE25BEF963862CF66C91DA0250B
-
-Key = 0000000000000000000000200000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5E1CC549BB39348529FD279DFE5E1FFC
-
-Key = 0000000000000000000000100000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1A8EDD22AA0FE906267DF710DE8DB007
-
-Key = 0000000000000000000000080000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = EE139CE12F8205D4EECCE6D7FD23B01F
-
-Key = 0000000000000000000000040000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FD84D87207D7BE3A79272CC9DF65E1E6
-
-Key = 0000000000000000000000020000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CE01B0EEA6BF6D981AFFB07FE1DD164E
-
-Key = 0000000000000000000000010000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1BCCA9BD22179B1C941947643FB01F0F
-
-Key = 0000000000000000000000008000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 87A581347DF02FF9973A0622DF673804
-
-Key = 0000000000000000000000004000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1EDEB75B65B365582AB5AA265037FA55
-
-Key = 0000000000000000000000002000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 807DD7E0418803258EF677BA9345CF51
-
-Key = 0000000000000000000000001000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 70CE90D345621481A99DC8EE1A62DCD5
-
-Key = 0000000000000000000000000800000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BB51E835284E0F7B74C053151F07D207
-
-Key = 0000000000000000000000000400000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0240317EC3AFA5D4610C545C0D507367
-
-Key = 0000000000000000000000000200000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9B77B76CA91662A9CB067267F0560C65
-
-Key = 0000000000000000000000000100000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2219ED37D533B05CDC20B16F45D3DBD9
-
-Key = 0000000000000000000000000080000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BC5A33AF9E4591BD4CF53B20728C3F85
-
-Key = 0000000000000000000000000040000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 68628B89F58C20E5195DB795C0A41489
-
-Key = 0000000000000000000000000020000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 5D177DE234B6288510163F2351750215
-
-Key = 0000000000000000000000000010000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6015D7BA2F33B88B2BE0016E022E05FE
-
-Key = 0000000000000000000000000008000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2D203E35B97E3B315C17D9F0F80ACDA0
-
-Key = 0000000000000000000000000004000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E5800AF9BF96D6B7ED3A2AED899CA456
-
-Key = 0000000000000000000000000002000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1163E6F8F1DE919686C138089EFA7986
-
-Key = 0000000000000000000000000001000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2180B46E9EAC63A165BE63DAE17889A4
-
-Key = 0000000000000000000000000000800000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3D751DC36B1046AC808D8275B48697AC
-
-Key = 0000000000000000000000000000400000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = DF022C5EFCEB5D3FE7E72DDF11D16EA3
-
-Key = 0000000000000000000000000000200000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C706AB7A20E0D038143B78D9D12EC1A4
-
-Key = 0000000000000000000000000000100000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8AFB006F196B00DAE7F0B36C9E88A3B9
-
-Key = 0000000000000000000000000000080000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BED70262ED524A5C6A495092E2543993
-
-Key = 0000000000000000000000000000040000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 088A58A7351C7A7AF594035514DE0757
-
-Key = 0000000000000000000000000000020000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F5DF0BB68AB377B12321365C05480EA8
-
-Key = 0000000000000000000000000000010000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 512DC8D603A7E4C8031D3566F141B233
-
-Key = 0000000000000000000000000000008000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 50342EA0E9E81EC53E3683C8C1471602
-
-Key = 0000000000000000000000000000004000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8AAB01E320B17FD9945D725F5EA904BA
-
-Key = 0000000000000000000000000000002000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 76FB320065713C165DECBE5DAFDD79BD
-
-Key = 0000000000000000000000000000001000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A8AD014D22CD8FCC9557438B8228253A
-
-Key = 0000000000000000000000000000000800000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6017A9EB6F3336882FCCEDEC746C62F6
-
-Key = 0000000000000000000000000000000400000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2EDF94990EB0F4BAFE1F5903102FE874
-
-Key = 0000000000000000000000000000000200000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4EC81B0FA8FAE0025AF09D26F1F200EA
-
-Key = 0000000000000000000000000000000100000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = AF7F474333E74691E5D01A3A841F8096
-
-Key = 0000000000000000000000000000000080000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 28FCE531836F2A255CA19DE6F53841E8
-
-Key = 0000000000000000000000000000000040000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6282A41053316B1A4027488E6F747003
-
-Key = 0000000000000000000000000000000020000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3668527987AC38A3F7C052A20B668F24
-
-Key = 0000000000000000000000000000000010000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 4C3473FE666072653E29354F07EF02B5
-
-Key = 0000000000000000000000000000000008000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 0A51D7A5B347225798EDE5663940F32F
-
-Key = 0000000000000000000000000000000004000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = D3CA3A8821A3D094CF63CF12136A1249
-
-Key = 0000000000000000000000000000000002000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = FBC5E4B37A69AD5F21E53F88E55AB95D
-
-Key = 0000000000000000000000000000000001000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = CCCAAA0A2DEFD357EE31C2CFEC9D0E8E
-
-Key = 0000000000000000000000000000000000800000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 93348B5393560AA416C6E6F0C99A58F7
-
-Key = 0000000000000000000000000000000000400000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 13AC66E49E23A8D3582AA7117F7A8F2F
-
-Key = 0000000000000000000000000000000000200000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = C403AD02F23055CEE08281E7D0C7EB2A
-
-Key = 0000000000000000000000000000000000100000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 65DFD53B699B191CE7A6610A405083DC
-
-Key = 0000000000000000000000000000000000080000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 3D6F7E99F6512553BB983E8F75672B97
-
-Key = 0000000000000000000000000000000000040000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 92BA0D580A954F8C8494A840F0252AEF
-
-Key = 0000000000000000000000000000000000020000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 958D8C9141CE21DBD69E19BA1E4F67AA
-
-Key = 0000000000000000000000000000000000010000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = E508796197F539FCDC917ECAB19507E0
-
-Key = 0000000000000000000000000000000000008000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 2200A6914A2050E99A55FB3BF20315E4
-
-Key = 0000000000000000000000000000000000004000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 627C0B2401EE6C095404CD7AA59EA67E
-
-Key = 0000000000000000000000000000000000002000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 75159B707278DFE6FD8A024B9FF0D5A8
-
-Key = 0000000000000000000000000000000000001000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F47982BE40C39306ACF25A120BC1B4E0
-
-Key = 0000000000000000000000000000000000000800000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 01CAABEF85A1E081EA6983079A90EA34
-
-Key = 0000000000000000000000000000000000000400000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7F473CD21A453BF74CC76184D6F5496F
-
-Key = 0000000000000000000000000000000000000200000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 659442FD57B94862529D3E4C530826FE
-
-Key = 0000000000000000000000000000000000000100000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 88A9140C094A695716A2966B1A8078A0
-
-Key = 0000000000000000000000000000000000000080000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 28CCFC1BB6180AA7373DA1F5A54E47EA
-
-Key = 0000000000000000000000000000000000000040000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 53DFD8CB845FD279B337B52DBBA3CF4C
-
-Key = 0000000000000000000000000000000000000020000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1BB5B100DFE6BA16983AD4A0F09FD50B
-
-Key = 0000000000000000000000000000000000000010000000000000000000000000
-In = 00000000000000000000000000000000
-Out = A896AE30D529D4ACFFCF5B763309CD28
-
-Key = 0000000000000000000000000000000000000008000000000000000000000000
-In = 00000000000000000000000000000000
-Out = F40A1B359A9B6B1197276C71222371F4
-
-Key = 0000000000000000000000000000000000000004000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 9FDE11C9E6CF9A1E9089820FD928767C
-
-Key = 0000000000000000000000000000000000000002000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7771A5A99B099A2C861D084E790958A2
-
-Key = 0000000000000000000000000000000000000001000000000000000000000000
-In = 00000000000000000000000000000000
-Out = BE1907AA5CA148A0282850401C48AF71
-
-Key = 0000000000000000000000000000000000000000800000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8E47D50827FD36B62C0D3BD36F863198
-
-Key = 0000000000000000000000000000000000000000400000000000000000000000
-In = 00000000000000000000000000000000
-Out = 81AA1751209F9173258CD1625DB65E07
-
-Key = 0000000000000000000000000000000000000000200000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1EE8FE72574BD819C97A0DEA2A5E0B64
-
-Key = 0000000000000000000000000000000000000000100000000000000000000000
-In = 00000000000000000000000000000000
-Out = 031BA0B3EFCAE9B08793C8107C277A27
-
-Key = 0000000000000000000000000000000000000000080000000000000000000000
-In = 00000000000000000000000000000000
-Out = 34C8DFD0DC4BA5240CA21BF4959EEF6B
-
-Key = 0000000000000000000000000000000000000000040000000000000000000000
-In = 00000000000000000000000000000000
-Out = C7A4DA0D5892A185D35447DB904511B5
-
-Key = 0000000000000000000000000000000000000000020000000000000000000000
-In = 00000000000000000000000000000000
-Out = 7A8B9982B6C8AE1B5DC02FC1D9AFA2E0
-
-Key = 0000000000000000000000000000000000000000010000000000000000000000
-In = 00000000000000000000000000000000
-Out = C77E0DFB29402C587C6DD97E0BD09ABA
-
-Key = 0000000000000000000000000000000000000000008000000000000000000000
-In = 00000000000000000000000000000000
-Out = 1AA2FD990BD0B0715B18482088DE0844
-
-Key = 0000000000000000000000000000000000000000004000000000000000000000
-In = 00000000000000000000000000000000
-Out = 31C2D486FDA54BAB4286A02D260918AC
-
-Key = 0000000000000000000000000000000000000000002000000000000000000000
-In = 00000000000000000000000000000000
-Out = 545F5A95E159B5F0DDF544B60F9C28C3
-
-Key = 0000000000000000000000000000000000000000001000000000000000000000
-In = 00000000000000000000000000000000
-Out = 45C84895AF0393588C67D9CDD5E4D7E2
-
-Key = 0000000000000000000000000000000000000000000800000000000000000000
-In = 00000000000000000000000000000000
-Out = 745BF4AF94A92D32FFE44B41AEF39320
-
-Key = 0000000000000000000000000000000000000000000400000000000000000000
-In = 00000000000000000000000000000000
-Out = 13C47C2F92F91D72F34381AC9A81473D
-
-Key = 0000000000000000000000000000000000000000000200000000000000000000
-In = 00000000000000000000000000000000
-Out = 8836D5AA076110FCD5BD66F3BECB39F6
-
-Key = 0000000000000000000000000000000000000000000100000000000000000000
-In = 00000000000000000000000000000000
-Out = 11EDE6F221E96C7515B1256DF055FBC3
-
-Key = 0000000000000000000000000000000000000000000080000000000000000000
-In = 00000000000000000000000000000000
-Out = 4E3BE7D6830703A6185CF0BDBE7F5BE4
-
-Key = 0000000000000000000000000000000000000000000040000000000000000000
-In = 00000000000000000000000000000000
-Out = 6A1ABDA47972CFF536946A1C7D380810
-
-Key = 0000000000000000000000000000000000000000000020000000000000000000
-In = 00000000000000000000000000000000
-Out = 74031DB865D2FC8319A320FFAC4694D8
-
-Key = 0000000000000000000000000000000000000000000010000000000000000000
-In = 00000000000000000000000000000000
-Out = E1F751F11027548C057075E8D8F880EA
-
-Key = 0000000000000000000000000000000000000000000008000000000000000000
-In = 00000000000000000000000000000000
-Out = AF24FA74CA96D89088C9018AA60E1D53
-
-Key = 0000000000000000000000000000000000000000000004000000000000000000
-In = 00000000000000000000000000000000
-Out = 0E5214D31B2C9219F6C9686A35F210FF
-
-Key = 0000000000000000000000000000000000000000000002000000000000000000
-In = 00000000000000000000000000000000
-Out = 2A72E2E692463EE8846C94A483C27E25
-
-Key = 0000000000000000000000000000000000000000000001000000000000000000
-In = 00000000000000000000000000000000
-Out = 2B9C3298626F11072D7B1D80B47A841F
-
-Key = 0000000000000000000000000000000000000000000000800000000000000000
-In = 00000000000000000000000000000000
-Out = 7468CAA1A5FFC828BE5A752C33132E90
-
-Key = 0000000000000000000000000000000000000000000000400000000000000000
-In = 00000000000000000000000000000000
-Out = 29C75ADD5EDE2680C169FF9FD9177331
-
-Key = 0000000000000000000000000000000000000000000000200000000000000000
-In = 00000000000000000000000000000000
-Out = 9BA78930CDD3357A2D84A49725902E8F
-
-Key = 0000000000000000000000000000000000000000000000100000000000000000
-In = 00000000000000000000000000000000
-Out = F190AC4C43E202F925B5FD1E4CA62DD6
-
-Key = 0000000000000000000000000000000000000000000000080000000000000000
-In = 00000000000000000000000000000000
-Out = 5716FB34A1A6B40C35B2BA860F12163E
-
-Key = 0000000000000000000000000000000000000000000000040000000000000000
-In = 00000000000000000000000000000000
-Out = 43B90548889A171E85515AB05EC76856
-
-Key = 0000000000000000000000000000000000000000000000020000000000000000
-In = 00000000000000000000000000000000
-Out = B4DE6F86875147F5276D584CEC11AFB4
-
-Key = 0000000000000000000000000000000000000000000000010000000000000000
-In = 00000000000000000000000000000000
-Out = 3DA6C1A8937583BF6491B2E9C52081E6
-
-Key = 0000000000000000000000000000000000000000000000008000000000000000
-In = 00000000000000000000000000000000
-Out = 9A54FCD26D9754ADD5F8967EF551EAB0
-
-Key = 0000000000000000000000000000000000000000000000004000000000000000
-In = 00000000000000000000000000000000
-Out = F0DCFA56A7E41A859276A6F8927B561D
-
-Key = 0000000000000000000000000000000000000000000000002000000000000000
-In = 00000000000000000000000000000000
-Out = 5881A8AE181F16B64CD0C455389F511C
-
-Key = 0000000000000000000000000000000000000000000000001000000000000000
-In = 00000000000000000000000000000000
-Out = E9F7AD45D9EA9AA4C830B89EEC61C1B5
-
-Key = 0000000000000000000000000000000000000000000000000800000000000000
-In = 00000000000000000000000000000000
-Out = 9118B623A63BFC69A9AAB868D752460B
-
-Key = 0000000000000000000000000000000000000000000000000400000000000000
-In = 00000000000000000000000000000000
-Out = 2D208D46FB2177C243C539FCCD4A1E9D
-
-Key = 0000000000000000000000000000000000000000000000000200000000000000
-In = 00000000000000000000000000000000
-Out = 2A4F52A297F20E428222008D9BE4A23B
-
-Key = 0000000000000000000000000000000000000000000000000100000000000000
-In = 00000000000000000000000000000000
-Out = EBCFDD28550C9654374590EC4BFD1CDC
-
-Key = 0000000000000000000000000000000000000000000000000080000000000000
-In = 00000000000000000000000000000000
-Out = FABB99266FC741241F6CFC0CED776A11
-
-Key = 0000000000000000000000000000000000000000000000000040000000000000
-In = 00000000000000000000000000000000
-Out = FBDEC944B2303E3A08A964E24130D10D
-
-Key = 0000000000000000000000000000000000000000000000000020000000000000
-In = 00000000000000000000000000000000
-Out = 9897E33E6052ABA1F07233BCEF531E32
-
-Key = 0000000000000000000000000000000000000000000000000010000000000000
-In = 00000000000000000000000000000000
-Out = 509DCA41B038225B30D8B7880D52999D
-
-Key = 0000000000000000000000000000000000000000000000000008000000000000
-In = 00000000000000000000000000000000
-Out = 3F70238F99F2AF394C31308D68F1707C
-
-Key = 0000000000000000000000000000000000000000000000000004000000000000
-In = 00000000000000000000000000000000
-Out = E6FF6426E9025DD6519837F71A6C3636
-
-Key = 0000000000000000000000000000000000000000000000000002000000000000
-In = 00000000000000000000000000000000
-Out = F222502AEF77C1F21DB79B08F7AB8CA2
-
-Key = 0000000000000000000000000000000000000000000000000001000000000000
-In = 00000000000000000000000000000000
-Out = C17D2C00477C1AA20B539BE8174E7202
-
-Key = 0000000000000000000000000000000000000000000000000000800000000000
-In = 00000000000000000000000000000000
-Out = 0F7B12AE962AF9C0C8CDCAA288FC6E12
-
-Key = 0000000000000000000000000000000000000000000000000000400000000000
-In = 00000000000000000000000000000000
-Out = 0E740EE58431521A622122AEFB163CE2
-
-Key = 0000000000000000000000000000000000000000000000000000200000000000
-In = 00000000000000000000000000000000
-Out = CF0B94FECAC6F67070306654FE198449
-
-Key = 0000000000000000000000000000000000000000000000000000100000000000
-In = 00000000000000000000000000000000
-Out = 604EA1D0711ACB8E545C0A88976008F9
-
-Key = 0000000000000000000000000000000000000000000000000000080000000000
-In = 00000000000000000000000000000000
-Out = 71D03D8F6F917FDF5B612180454F3699
-
-Key = 0000000000000000000000000000000000000000000000000000040000000000
-In = 00000000000000000000000000000000
-Out = A6BCFE7B73EDCE71DB36AF00B01C37EC
-
-Key = 0000000000000000000000000000000000000000000000000000020000000000
-In = 00000000000000000000000000000000
-Out = 93D761851BB991221AE77968459787DD
-
-Key = 0000000000000000000000000000000000000000000000000000010000000000
-In = 00000000000000000000000000000000
-Out = F117E4D5C88CC1C067C88AE38A5BF1D5
-
-Key = 0000000000000000000000000000000000000000000000000000008000000000
-In = 00000000000000000000000000000000
-Out = B534328DA555A9B69AC2A5B08E3CE47E
-
-Key = 0000000000000000000000000000000000000000000000000000004000000000
-In = 00000000000000000000000000000000
-Out = 7BDFB785D866B6487790B9F6164F5EBD
-
-Key = 0000000000000000000000000000000000000000000000000000002000000000
-In = 00000000000000000000000000000000
-Out = 5B3BB41E43D02901F5A0231768347B38
-
-Key = 0000000000000000000000000000000000000000000000000000001000000000
-In = 00000000000000000000000000000000
-Out = 917216669DB1600015F2FE7CBDDA0FF4
-
-Key = 0000000000000000000000000000000000000000000000000000000800000000
-In = 00000000000000000000000000000000
-Out = C79B582FC430C0187D7B1D7B1E79BDB9
-
-Key = 0000000000000000000000000000000000000000000000000000000400000000
-In = 00000000000000000000000000000000
-Out = B9A43998AED6BB7B79C91BB4C2530F4E
-
-Key = 0000000000000000000000000000000000000000000000000000000200000000
-In = 00000000000000000000000000000000
-Out = 0B24EBDF9A1D129F5E8397AB7412BC74
-
-Key = 0000000000000000000000000000000000000000000000000000000100000000
-In = 00000000000000000000000000000000
-Out = 96D523E4EF1C888C72460DEBA8D58B78
-
-Key = 0000000000000000000000000000000000000000000000000000000080000000
-In = 00000000000000000000000000000000
-Out = 85708C4539C8B06DD787AFDD06A3FE24
-
-Key = 0000000000000000000000000000000000000000000000000000000040000000
-In = 00000000000000000000000000000000
-Out = 67A106762D2F46B7880750BCF987054C
-
-Key = 0000000000000000000000000000000000000000000000000000000020000000
-In = 00000000000000000000000000000000
-Out = 8F46E37371E81C389CA94A8272A14FC8
-
-Key = 0000000000000000000000000000000000000000000000000000000010000000
-In = 00000000000000000000000000000000
-Out = 92DC700C11BBE46DA9559CAA7BA662F0
-
-Key = 0000000000000000000000000000000000000000000000000000000008000000
-In = 00000000000000000000000000000000
-Out = 90D2B52984DA214F392EF4EAC26A04FE
-
-Key = 0000000000000000000000000000000000000000000000000000000004000000
-In = 00000000000000000000000000000000
-Out = 832D440D62996C5BFCB7FAA08DEB4D2C
-
-Key = 0000000000000000000000000000000000000000000000000000000002000000
-In = 00000000000000000000000000000000
-Out = 69B7F725BA2B0539F6B45F2C8495D571
-
-Key = 0000000000000000000000000000000000000000000000000000000001000000
-In = 00000000000000000000000000000000
-Out = CE78A2AA25F818D87C46367579FAE698
-
-Key = 0000000000000000000000000000000000000000000000000000000000800000
-In = 00000000000000000000000000000000
-Out = F5E3E4DA4FC90F25F7D6679F076CA32E
-
-Key = 0000000000000000000000000000000000000000000000000000000000400000
-In = 00000000000000000000000000000000
-Out = F7618B001BC19F0195BD21021D9545B6
-
-Key = 0000000000000000000000000000000000000000000000000000000000200000
-In = 00000000000000000000000000000000
-Out = D84E1E36E1100913C7AFDBFE5009EDEA
-
-Key = 0000000000000000000000000000000000000000000000000000000000100000
-In = 00000000000000000000000000000000
-Out = 9DB2838E3903829913D2AEE6465202FD
-
-Key = 0000000000000000000000000000000000000000000000000000000000080000
-In = 00000000000000000000000000000000
-Out = 361AFBF61BDB378CCF2B76C01469BAA2
-
-Key = 0000000000000000000000000000000000000000000000000000000000040000
-In = 00000000000000000000000000000000
-Out = DC4C998046574B4CC447154F663E8EBD
-
-Key = 0000000000000000000000000000000000000000000000000000000000020000
-In = 00000000000000000000000000000000
-Out = 0D890EFA71666BE0A38B423BAD47C90F
-
-Key = 0000000000000000000000000000000000000000000000000000000000010000
-In = 00000000000000000000000000000000
-Out = F39C444538E646A2BD59B443F68C51D5
-
-Key = 0000000000000000000000000000000000000000000000000000000000008000
-In = 00000000000000000000000000000000
-Out = 9C6D37340E8F5EA22213E17A9F720238
-
-Key = 0000000000000000000000000000000000000000000000000000000000004000
-In = 00000000000000000000000000000000
-Out = 3A23813329F978C1C6C3BE1715011283
-
-Key = 0000000000000000000000000000000000000000000000000000000000002000
-In = 00000000000000000000000000000000
-Out = CE24D63AFA37E2A659A21CF770109BB4
-
-Key = 0000000000000000000000000000000000000000000000000000000000001000
-In = 00000000000000000000000000000000
-Out = DF329017478D86B2C360D55BC2B2ADCF
-
-Key = 0000000000000000000000000000000000000000000000000000000000000800
-In = 00000000000000000000000000000000
-Out = BC5EFA1FBF848776746FD7826656E25C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000400
-In = 00000000000000000000000000000000
-Out = A3E4185241C566DD2CF8117D4D7699F4
-
-Key = 0000000000000000000000000000000000000000000000000000000000000200
-In = 00000000000000000000000000000000
-Out = EF7BBDEB18879C11E2979DCC601CB620
-
-Key = 0000000000000000000000000000000000000000000000000000000000000100
-In = 00000000000000000000000000000000
-Out = FDC76A95F9C87E394F82A787D7406D40
-
-Key = 0000000000000000000000000000000000000000000000000000000000000080
-In = 00000000000000000000000000000000
-Out = B224E2BECACF6773B9941516195ED06B
-
-Key = 0000000000000000000000000000000000000000000000000000000000000040
-In = 00000000000000000000000000000000
-Out = B3951D0CF640BB7BD8F3D9948745FF9E
-
-Key = 0000000000000000000000000000000000000000000000000000000000000020
-In = 00000000000000000000000000000000
-Out = F9C8966E2874F736765B89DA10EF4611
-
-Key = 0000000000000000000000000000000000000000000000000000000000000010
-In = 00000000000000000000000000000000
-Out = 3750F26BAB98833AB30444C0821A594C
-
-Key = 0000000000000000000000000000000000000000000000000000000000000008
-In = 00000000000000000000000000000000
-Out = D369C2B7C2337D67A87CD5B4EB45D290
-
-Key = 0000000000000000000000000000000000000000000000000000000000000004
-In = 00000000000000000000000000000000
-Out = F3A44B0F53DCC9F79E1AFA8ABB022C84
-
-Key = 0000000000000000000000000000000000000000000000000000000000000002
-In = 00000000000000000000000000000000
-Out = 6E47C47F3940D369EC703E974AB350B6
-
-Key = 0000000000000000000000000000000000000000000000000000000000000001
-In = 00000000000000000000000000000000
-Out = 1100DE2A57C47C2EB63277537ADE5716
-
-Key = 01010101010101010101010101010101
-In = 01010101010101010101010101010101
-Out = EFB2C7DD69614683DAB0BC607036C425
-
-Key = 02020202020202020202020202020202
-In = 02020202020202020202020202020202
-Out = A1AE9D211867538B100BD121BA6A3ADC
-
-Key = 03030303030303030303030303030303
-In = 03030303030303030303030303030303
-Out = 8E77797CEC40C34AD3A3230975AE760E
-
-Key = 04040404040404040404040404040404
-In = 04040404040404040404040404040404
-Out = 91086B2221C3FC8E254A97B611D83239
-
-Key = 05050505050505050505050505050505
-In = 05050505050505050505050505050505
-Out = 95CA7F3CA2269A73B4964BD7A6A3DEA0
-
-Key = 06060606060606060606060606060606
-In = 06060606060606060606060606060606
-Out = BD7EB1B707AA5F801070B9C94F64A5C6
-
-Key = 07070707070707070707070707070707
-In = 07070707070707070707070707070707
-Out = 37CE0ADCFAA89DD737CB15193DCBA48E
-
-Key = 08080808080808080808080808080808
-In = 08080808080808080808080808080808
-Out = 37B6051557E2E535EE8B4955AC5DCB82
-
-Key = 09090909090909090909090909090909
-In = 09090909090909090909090909090909
-Out = 33D6A06EB3B16C0C6078BF56F2966AB2
-
-Key = 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A
-In = 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A
-Out = 521D3B74BA74D29362708CFE62E357AB
-
-Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B
-In = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B
-Out = CDD5D57C2ABED59CEACAA9352103751F
-
-Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
-In = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
-Out = 173D2D1CABD12095742C3045EC50899A
-
-Key = 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
-In = 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
-Out = A85D680132CCF78F2918A9698D6431D6
-
-Key = 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
-In = 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
-Out = C8137067650576081E34565121681374
-
-Key = 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F
-In = 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F
-Out = EDC375FEF71B83B2BE5187F82D0180EA
-
-Key = 10101010101010101010101010101010
-In = 10101010101010101010101010101010
-Out = 54FD2A83F505EE40F4F6F4F94198ED48
-
-Key = 11111111111111111111111111111111
-In = 11111111111111111111111111111111
-Out = 10CC2D64A5306366D8D594B8CDB4FBD3
-
-Key = 12121212121212121212121212121212
-In = 12121212121212121212121212121212
-Out = 13E3A82E121BC3CCA5C703FCAC451E22
-
-Key = 13131313131313131313131313131313
-In = 13131313131313131313131313131313
-Out = 1D8753BFF6930FA77FD7819F5935C422
-
-Key = 14141414141414141414141414141414
-In = 14141414141414141414141414141414
-Out = A6FF617A5D0395407BEEC3A311A0CBCB
-
-Key = 15151515151515151515151515151515
-In = 15151515151515151515151515151515
-Out = 034D4716AC68312E05C9497E9FC9430A
-
-Key = 16161616161616161616161616161616
-In = 16161616161616161616161616161616
-Out = 690D68007F51E2E8C9516EF9EE64F85D
-
-Key = 17171717171717171717171717171717
-In = 17171717171717171717171717171717
-Out = EF1396B41E8AF9BD6B2EBDEB7CC1A91B
-
-Key = 18181818181818181818181818181818
-In = 18181818181818181818181818181818
-Out = 9A20B52BFC5EB501F027978FBD684A1B
-
-Key = 19191919191919191919191919191919
-In = 19191919191919191919191919191919
-Out = 7A1A35FAD281601D522188B546CE1800
-
-Key = 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A
-In = 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A
-Out = F715BBB8000B577E6EF5D698511E8D03
-
-Key = 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B
-In = 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B
-Out = 09E83FD6F11C656ACAA1D1FAAF02F086
-
-Key = 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C
-In = 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C
-Out = 41561B53A60A9FBB25304169789461BB
-
-Key = 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D
-In = 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D
-Out = B47BB77008C75F854861994479DA3E7B
-
-Key = 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E
-In = 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E
-Out = 811CE0CFEB49117D6ED593FBFD5E6CD6
-
-Key = 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F
-In = 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F
-Out = C9479F831ECEBCFCB91F99FD6379A962
-
-Key = 20202020202020202020202020202020
-In = 20202020202020202020202020202020
-Out = FF2C70AB530B889BFF5F3C902DE6209A
-
-Key = 21212121212121212121212121212121
-In = 21212121212121212121212121212121
-Out = 695A8754A7A6F18C4F3C6EE9CE0EA103
-
-Key = 22222222222222222222222222222222
-In = 22222222222222222222222222222222
-Out = 2E2DFBB0C8BD286E87625F61A2F7D887
-
-Key = 23232323232323232323232323232323
-In = 23232323232323232323232323232323
-Out = CE8E66F871157B0182653B625074CB02
-
-Key = 24242424242424242424242424242424
-In = 24242424242424242424242424242424
-Out = C32823388E5ADBD6AA14186CE0400A4E
-
-Key = 25252525252525252525252525252525
-In = 25252525252525252525252525252525
-Out = EDEA3E4740736BC47A7891609B86CE9E
-
-Key = 26262626262626262626262626262626
-In = 26262626262626262626262626262626
-Out = 2B2DDCA5AD969636475196D462F5B2A5
-
-Key = 27272727272727272727272727272727
-In = 27272727272727272727272727272727
-Out = 5C46E5F8DD4E7DC61474CB8DFC3E04F0
-
-Key = 28282828282828282828282828282828
-In = 28282828282828282828282828282828
-Out = 6670EBB8C7E041121C5C5E449B675FD2
-
-Key = 29292929292929292929292929292929
-In = 29292929292929292929292929292929
-Out = 808DC7740040F39A6D3CBFAAC5228A23
-
-Key = 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A
-In = 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A
-Out = 15ECD6020C001F45262A1256AF7B066D
-
-Key = 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B
-In = 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B
-Out = C937773A54DC09B0CC52756A7EEEF178
-
-Key = 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C
-In = 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C
-Out = B8AB07101FC58ED64BBE203F31F892D4
-
-Key = 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D
-In = 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D
-Out = FC429A3B703812E0AAD1A325A23E33DE
-
-Key = 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
-In = 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
-Out = C4FFFE21B89FFCC6EC721D49E870ECEC
-
-Key = 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F
-In = 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F
-Out = D218CB13BC19296A50B5612A3721C1E2
-
-Key = 30303030303030303030303030303030
-In = 30303030303030303030303030303030
-Out = 573FF72784A1CEBD97FED191A3B979EF
-
-Key = 31313131313131313131313131313131
-In = 31313131313131313131313131313131
-Out = 4D44F703C1E1C39C3A2EDF5639394702
-
-Key = 32323232323232323232323232323232
-In = 32323232323232323232323232323232
-Out = 50F09502DB7FCF0095E5F8219DCA5A3C
-
-Key = 33333333333333333333333333333333
-In = 33333333333333333333333333333333
-Out = 9533F79F724484B169CB32EB7FAD0168
-
-Key = 34343434343434343434343434343434
-In = 34343434343434343434343434343434
-Out = 9EB8075BAB79DD8BBF7ECAD69C6B13CE
-
-Key = 35353535353535353535353535353535
-In = 35353535353535353535353535353535
-Out = E5450816410E771677D879F0A6ED86BD
-
-Key = 36363636363636363636363636363636
-In = 36363636363636363636363636363636
-Out = 07B20FB465C2F4FABC042A07E3163DEA
-
-Key = 37373737373737373737373737373737
-In = 37373737373737373737373737373737
-Out = 26B4CFBE7FDB3B3253E9F5D499DAD6C0
-
-Key = 38383838383838383838383838383838
-In = 38383838383838383838383838383838
-Out = 4FD4E8956C0808613A5EA19A9D753800
-
-Key = 39393939393939393939393939393939
-In = 39393939393939393939393939393939
-Out = FA74B3A2F745D440E74851D1C0D8679B
-
-Key = 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A
-In = 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A
-Out = 9D6FC40588769E07EC406A0CEBEC99F2
-
-Key = 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B
-In = 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B
-Out = 53602388866685FC37681EBC9BC46F73
-
-Key = 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C
-In = 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C
-Out = AB4532B652BDD0FC8ED4034CF3C11A24
-
-Key = 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D
-In = 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D
-Out = 66EFBCE5A3C3795A50C1A6B999CC3E71
-
-Key = 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
-In = 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
-Out = 1CAC1DEB42C55E3A3FEB261ED2FB3F50
-
-Key = 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F
-In = 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F
-Out = 31D98EA0E6B439432C3A6BB8E25D600D
-
-Key = 40404040404040404040404040404040
-In = 40404040404040404040404040404040
-Out = 898FD889A6AA36447C89D8CCC8B4043A
-
-Key = 41414141414141414141414141414141
-In = 41414141414141414141414141414141
-Out = AA74AA28D307802D28EDF73B58BD3BA3
-
-Key = 42424242424242424242424242424242
-In = 42424242424242424242424242424242
-Out = 57F1920F30A23C74DA3CD9CF78F4328C
-
-Key = 43434343434343434343434343434343
-In = 43434343434343434343434343434343
-Out = 2C30C357FB5A8F9D531CE0F17E1286F3
-
-Key = 44444444444444444444444444444444
-In = 44444444444444444444444444444444
-Out = C6E5EB2B3F9A7744A0128B93A4145A7B
-
-Key = 45454545454545454545454545454545
-In = 45454545454545454545454545454545
-Out = 0DBF0AD86C57F7D25A0CE61F6A6148EE
-
-Key = 46464646464646464646464646464646
-In = 46464646464646464646464646464646
-Out = 5F64A9BC4359153FF2572195A12F52D3
-
-Key = 47474747474747474747474747474747
-In = 47474747474747474747474747474747
-Out = B6099EE04520977CB7B1DE88E2120FA1
-
-Key = 48484848484848484848484848484848
-In = 48484848484848484848484848484848
-Out = 77AE144A7A3883038561F239C5312F09
-
-Key = 49494949494949494949494949494949
-In = 49494949494949494949494949494949
-Out = DF0FE7423AA1CF40C8FD45253817FE33
-
-Key = 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A
-In = 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A
-Out = CE4E05EC0EE20A8A4B27937B7B8ECED4
-
-Key = 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B
-In = 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B
-Out = BAB91404D49876BEE288311BA3C7456A
-
-Key = 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
-In = 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
-Out = 9DC6BCB030F1FBC24ADBF6EA5238E507
-
-Key = 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D
-In = 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D
-Out = BFACD02D59B26640B80B1886CD6E7D03
-
-Key = 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
-In = 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
-Out = 2076B2B836A8C545B3C103050E7AFF41
-
-Key = 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F
-In = 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F
-Out = 653B5B9A9751451C89DF56D79CFD07EF
-
-Key = 50505050505050505050505050505050
-In = 50505050505050505050505050505050
-Out = 7F4060C7776DEED87F7F9B26BEAFA428
-
-Key = 51515151515151515151515151515151
-In = 51515151515151515151515151515151
-Out = B7072058AEF8AA25604ACE1531C81C59
-
-Key = 52525252525252525252525252525252
-In = 52525252525252525252525252525252
-Out = 40A0515E8F01E55C60F70E0DAE4A1D31
-
-Key = 53535353535353535353535353535353
-In = 53535353535353535353535353535353
-Out = 9805BD832CBCBEE6B439D866F3ED53F9
-
-Key = 54545454545454545454545454545454
-In = 54545454545454545454545454545454
-Out = 81334B63525932E8B9342094A8DBB917
-
-Key = 55555555555555555555555555555555
-In = 55555555555555555555555555555555
-Out = 59670A6CBA2E729FEDD36389481541A4
-
-Key = 56565656565656565656565656565656
-In = 56565656565656565656565656565656
-Out = 84B3279AE90EACB5BF863DC17AE9212E
-
-Key = 57575757575757575757575757575757
-In = 57575757575757575757575757575757
-Out = 13F3BDFA7EF33A97F496692361AE6167
-
-Key = 58585858585858585858585858585858
-In = 58585858585858585858585858585858
-Out = 080F06D07DC2B4D0B748FA9F28946B0C
-
-Key = 59595959595959595959595959595959
-In = 59595959595959595959595959595959
-Out = 72B8521961C711E79AA30616F0B70687
-
-Key = 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
-In = 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
-Out = 75082BB9C98676FBB964DBDCD25705A2
-
-Key = 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B
-In = 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B
-Out = C00D2666ED3FAF0F01FEEB01A9883B1B
-
-Key = 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
-In = 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
-Out = C70DBF746F722EBC18A4F4B115193ED4
-
-Key = 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D
-In = 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D
-Out = 6283561914D3FABEE1FDD1747515C2D4
-
-Key = 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E
-In = 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E
-Out = 7AAABB3AE21BBA557AE89A0D9B99816C
-
-Key = 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F
-In = 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F
-Out = 4010AB7D9F7237DE123450ECA31B0900
-
-Key = 60606060606060606060606060606060
-In = 60606060606060606060606060606060
-Out = 3E4B358F1A26A197BF3B65B0DB4FB7E5
-
-Key = 61616161616161616161616161616161
-In = 61616161616161616161616161616161
-Out = 2E9D9D04453C0698FB444CFA3340E0B8
-
-Key = 62626262626262626262626262626262
-In = 62626262626262626262626262626262
-Out = 99ABC39983649030A48BAEDA6E718E8A
-
-Key = 63636363636363636363636363636363
-In = 63636363636363636363636363636363
-Out = 39478E48FACF3E28870082DFB51A817B
-
-Key = 64646464646464646464646464646464
-In = 64646464646464646464646464646464
-Out = 1BCA5B87AFEB4D9090910E02E3040CFD
-
-Key = 65656565656565656565656565656565
-In = 65656565656565656565656565656565
-Out = 30B0F7101370BB69E7B20D13050AB876
-
-Key = 66666666666666666666666666666666
-In = 66666666666666666666666666666666
-Out = CC000CAA9DEB82E9766CD98B9DE131DE
-
-Key = 67676767676767676767676767676767
-In = 67676767676767676767676767676767
-Out = AEDA25322DEA94FA8345FD467992B1D8
-
-Key = 68686868686868686868686868686868
-In = 68686868686868686868686868686868
-Out = 14D0D8253551FC65B1DE9DB1C3F0AB6A
-
-Key = 69696969696969696969696969696969
-In = 69696969696969696969696969696969
-Out = 67D32FDC0CD1AAC1F20E3F5FDFC986C0
-
-Key = 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A
-In = 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A
-Out = 3D8101226BBB3F4FFD40E68EF5F93626
-
-Key = 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B
-In = 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B
-Out = 684F017186FCC8AC24342CC54BF2FA6C
-
-Key = 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C
-In = 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C
-Out = 4AD0F6751D4DE121269F0FCCD99EFE68
-
-Key = 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D
-In = 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D
-Out = FDF357681BD91A83E2632698C1525CE0
-
-Key = 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E
-In = 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E
-Out = AC2698CD31DE9AC9740F53D467902FCB
-
-Key = 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F
-In = 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F
-Out = ED011F6CD9356CBA1E4715D60AB112A6
-
-Key = 70707070707070707070707070707070
-In = 70707070707070707070707070707070
-Out = 724926624439B1C8694571BC103CFCED
-
-Key = 71717171717171717171717171717171
-In = 71717171717171717171717171717171
-Out = C2725BBB0E4945AF08A6A7F1A9AF211A
-
-Key = 72727272727272727272727272727272
-In = 72727272727272727272727272727272
-Out = 0ABD84E7FF8FD3F826B4AFBE3AF2B653
-
-Key = 73737373737373737373737373737373
-In = 73737373737373737373737373737373
-Out = 404BEFC70C072CAEE758CC3E697E946D
-
-Key = 74747474747474747474747474747474
-In = 74747474747474747474747474747474
-Out = 0106FFAEE3A63E7B80004B044F864032
-
-Key = 75757575757575757575757575757575
-In = 75757575757575757575757575757575
-Out = AE43C4368B1FC9B98DB952887C4316B1
-
-Key = 76767676767676767676767676767676
-In = 76767676767676767676767676767676
-Out = FAC2FD894C5AEBC38A45034F38D44075
-
-Key = 77777777777777777777777777777777
-In = 77777777777777777777777777777777
-Out = 09831AB86A3DF171F1961A8E9F40BDD0
-
-Key = 78787878787878787878787878787878
-In = 78787878787878787878787878787878
-Out = DFC3FE2EC8C90B113BB11F76F3636E3D
-
-Key = 79797979797979797979797979797979
-In = 79797979797979797979797979797979
-Out = E9B9BB30C6D86061FA1812FF08CBC65A
-
-Key = 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A
-In = 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A
-Out = 0FC606C92CCFE70FEDAAE3DB6C443762
-
-Key = 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B
-In = 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B
-Out = 85DEC6534601D8B6B11B9060C8A42DF2
-
-Key = 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C
-In = 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C
-Out = 1250BEB80BC3D145284DF9188CCA5C50
-
-Key = 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D
-In = 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D
-Out = 318E30C9CCEBCA2A7F546A49052AF9A4
-
-Key = 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E
-In = 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E
-Out = 49FCFE05AEF655D83155DB617ED581BA
-
-Key = 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F
-In = 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F
-Out = 91EF1DED08B8BC59A916B5739195C758
-
-Key = 80808080808080808080808080808080
-In = 80808080808080808080808080808080
-Out = B5BCEC5D9EC2161530284CD96653C250
-
-Key = 81818181818181818181818181818181
-In = 81818181818181818181818181818181
-Out = 3B26ABD6B5688159301921809DF64FB1
-
-Key = 82828282828282828282828282828282
-In = 82828282828282828282828282828282
-Out = DAEA518A364BC404EEDD6903474BB56D
-
-Key = 83838383838383838383838383838383
-In = 83838383838383838383838383838383
-Out = 37C8EBDBCE1501AAD18A395AAADCB415
-
-Key = 84848484848484848484848484848484
-In = 84848484848484848484848484848484
-Out = 399FB3321F29829924CE72FBE9ED2756
-
-Key = 85858585858585858585858585858585
-In = 85858585858585858585858585858585
-Out = A88E685E95E838E27AC3024370BFE12F
-
-Key = 86868686868686868686868686868686
-In = 86868686868686868686868686868686
-Out = 4C56F71EC80909EC98673D808F42321E
-
-Key = 87878787878787878787878787878787
-In = 87878787878787878787878787878787
-Out = 4EFA656E3F35C570C8DC4EA5524B436C
-
-Key = 88888888888888888888888888888888
-In = 88888888888888888888888888888888
-Out = 808FA06393685AB9143C82CA4B954BE4
-
-Key = 89898989898989898989898989898989
-In = 89898989898989898989898989898989
-Out = D107696CCF562B2CC2901D50E1BFE320
-
-Key = 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A
-In = 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A
-Out = 98CF296ACAFAF704D6C91D1997202E47
-
-Key = 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B
-In = 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B
-Out = 5A023E5B18861A1FFCCC26F487EBF80F
-
-Key = 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C
-In = 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C
-Out = 8570554F91C1D8366FF6EC2097F110C3
-
-Key = 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D
-In = 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D
-Out = E1CE24B74C513C884992C98DFCF70BFB
-
-Key = 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E
-In = 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E
-Out = 23F536F1876F44FFB7727D0FAF9F2D70
-
-Key = 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
-In = 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
-Out = D877DD242B0C7CC05D9600419385A3EF
-
-Key = 90909090909090909090909090909090
-In = 90909090909090909090909090909090
-Out = 2896226A5A298578E2C999AF4F382DE7
-
-Key = 91919191919191919191919191919191
-In = 91919191919191919191919191919191
-Out = B54F6E5FB8F33608A8DFAEAD8EF27B98
-
-Key = 92929292929292929292929292929292
-In = 92929292929292929292929292929292
-Out = 45CF4F783116E562F104B107BD3D10F3
-
-Key = 93939393939393939393939393939393
-In = 93939393939393939393939393939393
-Out = 93F404FF83D493315E2E9665AC2013C5
-
-Key = 94949494949494949494949494949494
-In = 94949494949494949494949494949494
-Out = 1A5664813121482F4DBE1026104D84A8
-
-Key = 95959595959595959595959595959595
-In = 95959595959595959595959595959595
-Out = AEE4A82CE2FF23E91A497269B82530F6
-
-Key = 96969696969696969696969696969696
-In = 96969696969696969696969696969696
-Out = E001B8A93500C4D49F8A9A372A1E8A61
-
-Key = 97979797979797979797979797979797
-In = 97979797979797979797979797979797
-Out = FB23B31999D3D84AFD55600B9EA722CD
-
-Key = 98989898989898989898989898989898
-In = 98989898989898989898989898989898
-Out = 9572170C51A1198373B6ADBAB87AE454
-
-Key = 99999999999999999999999999999999
-In = 99999999999999999999999999999999
-Out = 65CCAA1321D8CB3CA18462C37DBBE4E1
-
-Key = 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A
-In = 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A
-Out = 3E942B1978B989CAC106E4575E6729A7
-
-Key = 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B
-In = 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B
-Out = 3E9AA5B6EC22E250368E9806041F6AA2
-
-Key = 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C
-In = 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C
-Out = 717479032B7D79C5236436D8AE0F3AB5
-
-Key = 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D
-In = 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D
-Out = 2643B168C234D5E0205E212C5CF669F4
-
-Key = 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E
-In = 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E
-Out = A79DE0F9F3BE54CF4B453A1836F7F491
-
-Key = 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
-In = 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
-Out = CF0836AC18F99D130EE85DE0ACDBE063
-
-Key = A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0
-In = A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0
-Out = F12ABC04BB0C7F6F794EF428E57F15FA
-
-Key = A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1
-In = A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1
-Out = 383E9B4B9D663B8527E6FAB4A7892832
-
-Key = A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2
-In = A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2
-Out = 432103C74F3C2D68315CDD2831EF8F71
-
-Key = A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3
-In = A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3
-Out = E06519949E2F6E8B00E15CD58054BB4A
-
-Key = A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4
-In = A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4
-Out = 34A14A8B9E5869C25A9C604300BEC911
-
-Key = A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5
-In = A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5
-Out = 0FB01A7B7F093C400E2FB08E709F7675
-
-Key = A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6
-In = A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6
-Out = 51D28B7FDD1C3EA5ED21EBD1D8B7499D
-
-Key = A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7
-In = A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7
-Out = 3F6FCB543C8771ABFABDD72E0E788FD7
-
-Key = A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8
-In = A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8
-Out = 045A187E0A7009AB426A78B251CA088E
-
-Key = A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9
-In = A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9
-Out = BF28504290089DB7D289785147BD5D9A
-
-Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-In = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-Out = 1297E67DBA4B264248FCDAF3B9E3FE4B
-
-Key = ABABABABABABABABABABABABABABABAB
-In = ABABABABABABABABABABABABABABABAB
-Out = 8177E1C48AB5578DBB3C4AA36EEEEF5C
-
-Key = ACACACACACACACACACACACACACACACAC
-In = ACACACACACACACACACACACACACACACAC
-Out = 97E785AED832ACF1D419DC01219704D4
-
-Key = ADADADADADADADADADADADADADADADAD
-In = ADADADADADADADADADADADADADADADAD
-Out = 23D059447EDB76B0F9B41006399CC087
-
-Key = AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE
-In = AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE
-Out = 7320A4A66FE238B9E1A932F9942DCFAA
-
-Key = AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF
-In = AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF
-Out = 4D8D7376C26FE0AFAA27B61ED1882721
-
-Key = B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0
-In = B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0
-Out = DEF37D094186DE7209801C7D2D93F61A
-
-Key = B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1
-In = B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1
-Out = 536A8AACDB1156AC2E2D7DD0499BFA5F
-
-Key = B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2
-In = B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2
-Out = F57A2E78B976A57642DC8BFAFB3480B2
-
-Key = B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3
-In = B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3
-Out = 88177315699E7AE0D5B4B07046ED5990
-
-Key = B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4
-In = B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4
-Out = 02F65559B9AA547A5EA54EB6A8E48960
-
-Key = B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5
-In = B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5
-Out = F2F02BC7D56F7594E37DB7DF94C1B9C1
-
-Key = B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6
-In = B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6
-Out = 2691BEACD805DC3C69B0295A7308CFD8
-
-Key = B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7
-In = B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7
-Out = A3A67B09425720C8AAB79DA8F44A8E8A
-
-Key = B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8
-In = B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8
-Out = DBC7ABF1DD510B5D3A6BA898670B6361
-
-Key = B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9
-In = B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9
-Out = FA1B51E10654E448C32EFCD7A986CAF0
-
-Key = BABABABABABABABABABABABABABABABA
-In = BABABABABABABABABABABABABABABABA
-Out = C63D856771FC45E5102B14B41A79CB7E
-
-Key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-In = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-Out = 9030C8326D2B75D1979DC1C3B80796B9
-
-Key = BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC
-In = BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC
-Out = B11A41E18A535F8F3B343135C73A4670
-
-Key = BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD
-In = BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD
-Out = BC6F04C2D75634E0054CCE755DE717A7
-
-Key = BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE
-In = BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE
-Out = AAFAD1353CD8C6469751190678362F03
-
-Key = BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF
-In = BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF
-Out = 9DD8ACCD8D2A504AAE205BAD997F20DE
-
-Key = C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0
-In = C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0
-Out = 0FCBA053A6E5DE5D0E6B9395BDE2BD18
-
-Key = C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1
-In = C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1
-Out = E3AD2507E0F6BCDCC3D50728E12BF962
-
-Key = C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2
-In = C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2
-Out = 0AB51BDC22FFF1458CB4D3D08EDB164C
-
-Key = C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3
-In = C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3
-Out = FBF3371047AB698FCFC81442B134AD26
-
-Key = C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4
-In = C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4
-Out = D026FC11B7B1BB47B020D7A8320A174B
-
-Key = C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5
-In = C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5
-Out = FAE26B00CAD7DD254EDBB84688A846E9
-
-Key = C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6
-In = C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6
-Out = 91F547F8129DB5B465DF57F0A03E58FE
-
-Key = C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7
-In = C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7
-Out = AECA4D2C88D33F6A0CEAE619259E3982
-
-Key = C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8
-In = C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8
-Out = 32AAB72FE2809153140156909B52F414
-
-Key = C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9
-In = C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9
-Out = 91EDBD3465D1216B3564F094455F0ECC
-
-Key = CACACACACACACACACACACACACACACACA
-In = CACACACACACACACACACACACACACACACA
-Out = 4D14F0124000E96F09938906B99415BA
-
-Key = CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB
-In = CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB
-Out = 297F6B5BF3A01B1D87B7B74DF4E9DC2F
-
-Key = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-In = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-Out = BCCE55DCAFF6BB7B4D0CAFD112E87FCD
-
-Key = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
-In = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
-Out = D7A1E8E4624689000AD7AFB06982D8FE
-
-Key = CECECECECECECECECECECECECECECECE
-In = CECECECECECECECECECECECECECECECE
-Out = D59DAF6299A27A5DE36F7090B777673F
-
-Key = CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF
-In = CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF
-Out = A5ACE3553FB387187CCFF88C3DEE1ED7
-
-Key = D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0
-In = D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0
-Out = 2CCF6DD6EBEE7C4A4C5586EBF792AC57
-
-Key = D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1
-In = D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1
-Out = 695849E45DE312A07C5E8A6C1C20D6B8
-
-Key = D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2
-In = D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2
-Out = 5E14D156D004D484E040C354F13A8F63
-
-Key = D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3
-In = D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3
-Out = E4CD1852605EDC0FF576A8310FED4883
-
-Key = D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4
-In = D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4
-Out = BC7EB0533C90715C314362B1FBDC3545
-
-Key = D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5
-In = D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5
-Out = AFBDF9336F9CAC06313181937FF1849E
-
-Key = D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6
-In = D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6
-Out = B590131983C4E266BDE99D577C493B67
-
-Key = D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7
-In = D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7
-Out = 90921A3641666DE025E42B1BDC891FBA
-
-Key = D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8
-In = D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8
-Out = E3B79B1EC3FA41E7EB3C575ED197588D
-
-Key = D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
-In = D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
-Out = 5D9B53924BFCB123BEF8F3C5431103F2
-
-Key = DADADADADADADADADADADADADADADADA
-In = DADADADADADADADADADADADADADADADA
-Out = 12BB6C3773F42D7AB2BD711C3DA6B1F9
-
-Key = DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB
-In = DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB
-Out = A0D2449463DDB310E0D4D0B547043FA0
-
-Key = DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC
-In = DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC
-Out = B1E70695E833951DA0C4B38CDA067ACD
-
-Key = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
-In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
-Out = 19AA0D4A04DD8C93935FCB3F39A0D2CD
-
-Key = DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE
-In = DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE
-Out = 98E4BAC98E4B1559B07E3A323D352964
-
-Key = DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF
-In = DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF
-Out = 4B88F29F1DCB339CEF6C80EF949272BA
-
-Key = E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0
-In = E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0
-Out = 8F3C7931AC39D8B62C643BB3AC2C731B
-
-Key = E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1
-In = E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1
-Out = D620AC385CAA42FD228176995C7EEC61
-
-Key = E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2
-In = E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2
-Out = D99A20E342818B37A21C87F35C19D559
-
-Key = E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3
-In = E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3
-Out = 0817FC31D13725B3F64790470C883F22
-
-Key = E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4
-In = E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4
-Out = 945FE4DAEEE2AAA1EFE80022311B1040
-
-Key = E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
-In = E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
-Out = F5976BFF2CE360F3A75CACB10B1B26E6
-
-Key = E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6
-In = E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6
-Out = 4D7118A0D1DE4AB7E43765B2E2AE0EE2
-
-Key = E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7
-In = E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7
-Out = FC428DC79787BBAC03937C6C0FEDA673
-
-Key = E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8
-In = E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8
-Out = 6DF3580C31F389C898CC905582BCD920
-
-Key = E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9
-In = E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9
-Out = 6B74DC42605029718F4D0C060547CC8B
-
-Key = EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA
-In = EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA
-Out = B587D402AA54E60DB655B4164847ACA1
-
-Key = EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
-In = EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
-Out = 16313A473EFCB6D965C5F1426785B472
-
-Key = ECECECECECECECECECECECECECECECEC
-In = ECECECECECECECECECECECECECECECEC
-Out = 734356F14E8A6C5775A4638BBDFCE111
-
-Key = EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED
-In = EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED
-Out = F66FFD7385B4A87A9E2865D70864DAA6
-
-Key = EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
-In = EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
-Out = FB7FA84127D218FDE6A24CA30379ECCC
-
-Key = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF
-In = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF
-Out = 4FADBE831B78D6B3C59DCE8B4293BB79
-
-Key = F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0
-In = F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0
-Out = DA219657EA1AB63EA46306C2D0B69186
-
-Key = F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
-In = F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
-Out = 34BE2E9CB3C4047884CB291416D037C7
-
-Key = F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2
-In = F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2
-Out = 384BAAE4DB758555E2DB6E2995E0CAEC
-
-Key = F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3
-In = F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3
-Out = 7338107A3D9BF3E8C67936E1CB77A22A
-
-Key = F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4
-In = F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4
-Out = 217BC7820BB5A9183D95BF7E99180B87
-
-Key = F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5
-In = F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5
-Out = 56BA9C916AECDC51203CB6BA5FEE8D3B
-
-Key = F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6
-In = F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6
-Out = 8CCA87B86BEB5CCD11A594F20AD5D1B8
-
-Key = F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7
-In = F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7
-Out = CD0230DBA2982BE4F126FB2E80AB2C24
-
-Key = F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8
-In = F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8
-Out = A3E46629CF9D1D6DD1A6DE82B86C5934
-
-Key = F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9
-In = F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9
-Out = AE18D7C35968E90CECA036CF586EB963
-
-Key = FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA
-In = FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA
-Out = 3B0261B9DA91346FAD84DD9CC9EC4A37
-
-Key = FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB
-In = FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB
-Out = 9F3E91301511409E1F997A080F9A9424
-
-Key = FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC
-In = FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC
-Out = F1BF5CCE9A7D5FBE759A579640348692
-
-Key = FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD
-In = FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD
-Out = D192CBC80E653C12C647C1EBEB56AE10
-
-Key = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
-In = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
-Out = 64F5B3E91B4CC3C35AFB6793FCEC836A
-
-Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-In = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-Out = EFB109978422E50FDCB05335D050D0D7
-
-Key = 000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 6CD61BCB190B30384E8A3F168690AE82
-
-Key = 0123456789ABCDEF0112233445566778899AABBCCDDEEFF0
-In = 02132435465768798A9BACBDCEDFE0F1
-Out = 688329D019E505041E52E92AF95291D4
-
-Key = 0000000000000000000000000000000000000000000000000000000000000000
-In = 00000000000000000000000000000000
-Out = 8F5FBD0510D15FA893FA3FDA6E857EC2
-
-Key = 0123456789ABCDEF0112233445566778899AABBCCDDEEFF01032547698BADCFE
-In = 02132435465768798A9BACBDCEDFE0F1
-Out = C8241816F0D7E48920AD16A1674E5D48
-
diff --git a/src/tests/data/block/safer.vec b/src/tests/data/block/safer.vec
deleted file mode 100644
index a85a36d84..000000000
--- a/src/tests/data/block/safer.vec
+++ /dev/null
@@ -1,49 +0,0 @@
-[SAFER-SK(10)]
-Key = 01020304050607080000000000000000
-In = A0A1A2A3A4A5A6A7
-Out = 41246B65F1DC6AFA
-
-Key = 00000000000000000102030405060708
-In = A0A1A2A3A4A5A6A7
-Out = 5CBD77B03626FE3B
-
-Key = 00000000000000010000000000000001
-In = 9091929394959697
-Out = 9EAA4DF1E0EFF445
-
-Key = 00000000000000010000000000000001
-In = 98999A9B9C9D9E9F
-Out = 4CC14838399E532D
-
-Key = 053D79C5CFC7E2A3244F888CB0336DBF
-In = B9BA26C1B67F9692
-Out = 75AF0AEF94E54122
-
-Key = 438C2106DD87C2A0741F66A28D75A962
-In = 382395FB04EA1FD6
-Out = 8162DBDC5984CAD0
-
-Key = 8A5CB47F29F8B1C79EFDDC95EAA8DA2A
-In = 0C07884F2D4B7645
-Out = 64C8047DEBBE6895
-
-Key = 885588FCDBDDF30BDD55D6AD097594A7
-In = FD8CD3214D56917A
-Out = 3360F9F4A25D0D5A
-
-Key = D020D65E6FEF3C7FD60413E04C71F8B1
-In = D2A9B8F6A027F02A
-Out = D750587CC46CF3B7
-
-Key = 228A5CFEF727066B2E682DC8E40CD629
-In = 18AC5F07FCF872E7
-Out = 557368277E129BE6
-
-Key = 360495E7E4784CAA34E42C12F125B71A
-In = 4438471711225573
-Out = B75E4C4155A67C4F
-
-Key = 850F94815381C03111F45EFEE704AB48
-In = 5ED88B627B5C899D
-Out = B356A077F9DB11DC
-
diff --git a/src/tests/data/block/tea.vec b/src/tests/data/block/tea.vec
deleted file mode 100644
index b08df67da..000000000
--- a/src/tests/data/block/tea.vec
+++ /dev/null
@@ -1,153 +0,0 @@
-[TEA]
-Key = 00000000000000000000000000000000
-In = 0000000000000000
-Out = 41EA3A0A94BAA940
-
-Key = 271AD15192C4D1204A4A2561E3DB6FF7
-In = 7C944D08DEF34C0C
-Out = 195C0E8F49761539
-
-Key = F04EBF798C193F199C1F532AF383555B
-In = B9682750BB15CAAD
-Out = 2B5F318FB66806B9
-
-Key = 200C0CE59717D5D9AF6813CD207FEE73
-In = 9706769A18A2D03D
-Out = 8E17EEB5008DC0CB
-
-Key = 2828D51F98AE0B33F4DE2B7FBD18A529
-In = EDB76C54847DA59E
-Out = DFA6C29BEB40F9AF
-
-Key = 61AABA6BE48B0D0D14FE5D27FAB852A4
-In = 178A49BAFBA53F23
-Out = C3BBCE6715D90CE6
-
-Key = 2080E2409BA01C8532FC84403EE8C06A
-In = DF4CDB61A5F38536
-Out = B4E6359C9D9458AA
-
-Key = 271AD15192C4D1204A4A2561E3DB6FF7
-In = 7C944D08DEF34C0C
-Out = 195C0E8F49761539
-
-Key = C1E297C0C761777D8A76FFF02D22B859
-In = F4C76C1D47FE568F
-Out = 551CA67C7756FF56
-
-Key = 23C807A2EF0A551F858FD52D125A47D8
-In = CAB16583E15D0074
-Out = DE472175D55372C9
-
-Key = 9FA5D4D8CBDFCECD559E3CE88BF78EE1
-In = 97B05C60774164AD
-Out = BC4BD30CB50DA39B
-
-Key = 24F4E91083139099D663647A7FFAC321
-In = 7017A263985B735C
-Out = E47FDF06A51D8C24
-
-Key = 7CF8626DE76D8462218ED5C9DC8ACC26
-In = 15475A90DF04CD29
-Out = 4DF54282EAAFA235
-
-Key = 3C6AD7DF17332A3E1E3DE06007387357
-In = 87CA0AACCF146CC8
-Out = F7360F57CFCC09AC
-
-Key = 24237A762D8A89383A2949F5A0F5EC08
-In = 9268AF048ECBAE67
-Out = E98E428A9D1FEE9C
-
-Key = 209A2833A39472D9720380FFB2F74761
-In = AF0062CD77A84EBD
-Out = 44CD624B87CBEE77
-
-Key = 22EBE7A30E8855B3B453A6E926D4F187
-In = F922CA875B991A31
-Out = 1E92C0C51185F7C7
-
-Key = 1B5E23EBD915C1FEE59F57DD91AF7347
-In = B4ECC305C3DBD8E5
-Out = 063D8F75A7A77501
-
-Key = 6C21D105515290DA29339F142685C135
-In = A4C2F6DC597D13EA
-Out = BF8FFEC7550A496B
-
-Key = 01F728A7433A47B13DE34FCC08958449
-In = 3AF7F1AE0F58AB1D
-Out = BBA581D07E51D8D6
-
-Key = 9A2D4C50337D3EC337673782FD385601
-In = 791D8DA8CBB0BC94
-Out = 7D9A4F0363B6085F
-
-Key = 112233445566778899AABBCCDDEEFF01
-In = ABCDEF0198765432
-Out = 58C7BA625ED42820
-
-Key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-In = AAAAAAAAAAAAAAAA
-Out = 423251D460AEBE8E
-
-Key = 88AD993684E3FE4C4D5DD8F1C0964D32
-In = 6385ECC14C50C91F
-Out = D3A465910B0ECF46
-
-Key = 69F9181A726912C2DFD815081209F9F6
-In = 99532D57CC7FC724
-Out = A846FE0F9A698E32
-
-Key = 79846B4ED899433C452EDED9D6925C7A
-In = A874F573DD7A8761
-Out = 5055A546D119BFA7
-
-Key = B0BB57B0E243DC91143DA8F235DCF9DB
-In = CD58533F9F18C3F3
-Out = F5E649326A32F7BD
-
-Key = 6CDF16B8E08604C93A4BC86E269BA2EF
-In = 65B4628A8A4ACC33
-Out = E2FAC5AB9B301983
-
-Key = 2203D8EFC29D3421981E0C2FAF90EA8C
-In = 21244B2AA3071823
-Out = 14F62A42C4BDA3E6
-
-Key = 86B435D9BF689FD450352308EDDA200A
-In = C6BBAD2319111D81
-Out = F4068832803914F7
-
-Key = 279243E8F5759FD3D29EF824D65B163B
-In = 38CD92C3E6882185
-Out = A3C3CE70D4A097E8
-
-Key = 95ADBC7D2F67A15C395605250AC1275F
-In = 56D1B5CB68ADBD3F
-Out = 4E57696CAC39676C
-
-Key = 4E760AF9B46E2C9EF75B7F5721EAFD60
-In = 1936713432D87C16
-Out = 3D3E59CA7EDED044
-
-Key = 2C98241CD08DF0B269C8669E55F61227
-In = A9AF22BFEA5639F1
-Out = D478E142344FCFAC
-
-Key = B28F6B02B950BC924B03C39C672A8216
-In = 8DEC08977A7F6D02
-Out = 23F4A36A9D475299
-
-Key = F7A7B83FC8DF8868AB753F435B6E46DE
-In = 8535D9E669C2A7B8
-Out = 30284672AF8877F1
-
-Key = 1BC9B0A578D89DAE5A47F5704640CA4A
-In = 03682AB977DDDCD9
-Out = 9F678A05F82E9326
-
-Key = 15C140E81E98AE10443AA43C89E5D52C
-In = 3A1A041F2F1B0FC7
-Out = A40CBAE926F0F13B
-
diff --git a/src/tests/data/hash/has160.vec b/src/tests/data/hash/has160.vec
deleted file mode 100644
index 1ec4fedea..000000000
--- a/src/tests/data/hash/has160.vec
+++ /dev/null
@@ -1,22 +0,0 @@
-[HAS-160]
-In =
-Out = 307964EF34151D37C8047ADEC7AB50F4FF89762D
-
-In = 61
-Out = 4872BCBC4CD0F0A9DC7C2F7045E5B43B6C830DB8
-
-In = 616263
-Out = 975E810488CF2A3D49838478124AFCE4B1C78804
-
-In = 6D65737361676520646967657374
-Out = 2338DBC8638D31225F73086246BA529F96710BC6
-
-In = 6162636465666768696A6B6C6D6E6F707172737475767778797A
-Out = 596185C9AB6703D0D0DBB98702BC0F5729CD1D3C
-
-In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A30313233343536373839
-Out = CB5D7EFBCA2F02E0FB7167CABB123AF5795764E5
-
-In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930
-Out = 07F05C8C0773C55CA3A5A695CE6ACA4C438911B5
-
diff --git a/src/tests/data/hash/md2.vec b/src/tests/data/hash/md2.vec
deleted file mode 100644
index 1bcd29c27..000000000
--- a/src/tests/data/hash/md2.vec
+++ /dev/null
@@ -1,226 +0,0 @@
-[MD2]
-In = 25
-Out = A248ABDA0C79140E2D99170DAD36CBC8
-
-In = 3386
-Out = 43C980AD45E7B3B1CD75CA4E7D9A723D
-
-In = A0A806
-Out = 0D4596E208051A05DFF8116455562630
-
-In = 7664BC7A
-Out = E561C90B5534D750BC251EB77A9E7870
-
-In = 94A3C94A0C
-Out = 2D8026BE7A76954A9E096343C39ECD8C
-
-In = 2BA359656CCD
-Out = 2C549D1C220B32CDFC242874E6807B0B
-
-In = F62E1519F7C123
-Out = 7D473DB4CBC7B479443BE0F5BA34AB88
-
-In = 731E26C302E41557
-Out = DFFFCBFDB186EDFC3174BD6118B9F4AE
-
-In = E96E54E58C275946D6
-Out = DDD255C1D97FFC23ADA446D630E648D8
-
-In = A05EF276F00ADD9AA737
-Out = 7468B835B7FAB5B85E95BCEB563AF71B
-
-In = B2E29CEBCFE26335B65604
-Out = 96CCB8AEB6DC5B5D0502CA2DD5795197
-
-In = 4A926951A34CFF9612086FA1
-Out = CA2A050506C450FDFF20DD7E4EE5339C
-
-In = 501771E1BB1766FD3FA714BCC1
-Out = FA6F95FB2DAF9E4E153D7D78590EE138
-
-In = 07ED7EC95443B759D36E5699547E
-Out = 61B549A5FB75E337A194E2FCA382DE25
-
-In = 50AD2003A260C982EFECA7D5912BFF
-Out = 6BA8E7DDD4019F159FF72514CFA156D9
-
-In = 940866DDC4A37CD965DFFBE3E2B0C341
-Out = 6A92E7EB476CB01F9C404494260E3777
-
-In = 62F3333A791881457264348DA07FB6B7C4
-Out = 61017AB161754960D3F1D1F1D10FE8F9
-
-In = E68EA199397AD1D0C9A76BEB4D96722CBDA2
-Out = B373D1E21455608FCA99654850ECFFD6
-
-In = A7A8C48263FC70A6A77374CD0E685773248D26
-Out = 07FF45303EA30885D7AACAAD2E16BD50
-
-In = 654C952DA2E3C7998473AFCA3C9AF2AE89B2DE45
-Out = C9444F92EE581185EF649354CA8F4BCE
-
-In = A4D93A05DF87F08E3113EA2D0CAF8F70CBC2BE4B2A
-Out = B46ADB25D38DA1F0E7F6F8C5DD129D40
-
-In = EA12AE41BE9B71EBA74C9010C4C884FE5DC9B0C5C65A
-Out = B6CFCF8CFDC2FE63CEAA66A5573FDA81
-
-In = C3AF0ABC9A2B464A1C4F629908D1EC556F20F64084E733
-Out = 523441B8A2FB07E41E9B1B8CC5276660
-
-In = 3C8BCC24A8DC88690F6B6C7CFB25DEF15D37335EC41C8C83
-Out = F80ADCB9C78CF9DE5211091CEC3E310E
-
-In = 65E2194B8A8B5B30F5C53D01F8431E8C20418EE6A06F89F87F
-Out = 5833781CF79E57F605F9D73D3B7088CC
-
-In = 62FBD128DA286D5C6C5A3E73D463E5B31D7FB06F34DD050B3CDB
-Out = 987C1F6BB686F3A983D611C22C5086BA
-
-In = DDA05271A7C4860D49D2CE62A0B59B11BDCAAF272898EB8E18F1A8
-Out = 779D23550876E50A7C19F4777C84984D
-
-In = AA8DB1791C56E3C88122A1AB77A9D8BCE0D53240C01B789DE7FCD594
-Out = 9540F40D24417EAD9465B26D8A7746CC
-
-In = A1C7EAF91BBB251411A86595BC66D4E5CCF227FB2D9913F3EFB4E69B3E
-Out = D67F49DE6E7BB44071947A6C96774E02
-
-In = 611B90477FDC084652039E3E3F55EB74EE1A3E14BB49A08882AB67EABA73
-Out = C7F8C0C4B53D40634A084A0E388186DC
-
-In = 5E9F73521E348BFBF3ECC570012AF45C9832F673FFC61CB034908EB91A6672
-Out = 03B6F0BCB2A99CE4CE51D92DBC9ED3B2
-
-In = 275C7EC5230978B84D4D87B929EE90C04269B91A32A69BFE2B30E84361CD8905
-Out = 72721B4138FEE747BCB950DD01291C37
-
-In = BFC3C421B77FDC497E417DF9A2E8A480CB975BED8E3B90F0BDFC567D66D8747D85
-Out = 92BCE15368AA8388D71E1CC5B4773536
-
-In = C2B801C8419027751EF0C9EDBA783BDD703259834E0D28F1CC18BA82A2D9DCDDCD5D
-Out = 7B194DE6324A19C54F9AFEB352EF9A8D
-
-In = 787B37C5C74098B78B693D33E5DD5A12BC2D502D3F69852DCB5CD56D6263E846F96ED4
-Out = F63A8C1958208D999F55917D9A1F3228
-
-In = 0614889EFFDC294287D820C8A4459FA44CDD02CB1DE0F678493C959E7DD1DF90257AAF0F
-Out = 1E20FBB25E31606B0B22FDFDD2639C71
-
-In = 60D169B12C1ECC464591BA572EC74B454D417BBDC49A82F01B9A4FD1273404F6FEBB575E51
-Out = C23B75350BA0174D6A4BD629A8E43311
-
-In = 642350615A9C6CBC8894D72176AB2EE4AF3413D15C4D4D9B38D071C95FC620FBAD6AB37FB8E5
-Out = 3D0C91CA852FB8C51AB9441D5A3C1F94
-
-In = C6299D1B98BB473500364EC66A3DD9238DCCEA4F281005FF630E99B5C8D2A7AC5FB13C693ED05D
-Out = E2B2458ADCFB7D0BCD4789EB9FC0D2CE
-
-In = 9D5AA26103830005ED7C966E120253DD7ADF49C56BD89B211B6B0D5B491066A52498736122A325F7
-Out = C8F205DEC0103264BEF4FA0501CF007C
-
-In = 7E038B83083785FDF4696310B579D3C0D98A0092FF2D71808C620225FC54E6973B907E5ED4A50BBD5F
-Out = 91F01747135E4E9B18A95666FF4C8801
-
-In = CBD41D36CC3F85C7427E3D04DB05E66D32FE7E9683A35B9ABC5B06185E24A867B954DDC4FD41E0379423
-Out = 96110102BF17E3CB91AF30EB0B527851
-
-In = 61F01942CFBDCC748AAB816527D49848CF698A8AE5E5EDE8C3C9178EA5719EFBA60EB1C4C3324C6B1AFB2D
-Out = 94EBDFBB3060FA8E7FCE7A4538CD6829
-
-In = 3E96A6186BD855DF00FCE2693B1394151594448B516DE0B9C8D15396984222497B15EE0DFCD47AFBD8AC3F83
-Out = D39A82F44F8E7D8384938DD8C42C28AA
-
-In = 9C8CC760D830780DD8671282D6A2909E9D163BC54A04119586404BCBAF5489C79491AB236A4F9781CA58E58408
-Out = 1F902D98C973B382D084FBB40F0920AB
-
-In = 00A530B70C406BFD533C2642B94FF767EF4C7BCB28EA5CB69C62F52A01AC1A25F1EDD918719004757463E6663340
-Out = C7FA3641EC0626AC66FADE4B77FFC795
-
-In = 8DAC93EB30AF1242B93B4C1C8D7D2A8E1320B2738C3D40E623E7380AFE596A783A902B6A19DF17D15356C24CEFBD66
-Out = 437FF6F86D68E35D5BC507AE88C8B0D3
-
-In = C3D2DA59D6435405406E342683A324DE6844C527687521E43066270CDF8534C110FEEBD79B5F2FB00FA3B9A31E1D548F
-Out = 7B4E56A2014BC8127D6DB1699128310D
-
-In = D178D2623180FA605C3379B2EF0D5A3272593EE49588708303F5744E8A26DC7F4E3B4435B85A8E68B5ECC40AC7DCB2039F
-Out = CEC9CC7590DEAFB05FDA5D42C5CC3A71
-
-In = 4B2C6190EBE39D5282026FDB3124D64094108DA1237FFD3A52ACA1BD96FBE752C4C3631C33913BD5DB067AB234C4628B2ED9
-Out = E0CABDA82227CE74EA7550053F942E74
-
-In = 9A75285DE0B739BBEC8AF7A791FEF5375A8E722134B6299D6FF167F43BF80F5CCD838F76AC2278C6CA5BE7E5C339ACEB8BF77A
-Out = 117451E0A38EA5E87D6817003D9DC6B1
-
-In = A2ABD527204652A5DC3C672A1E47F5CA34FB1D7F300580F63B463959991DE6DE1472EB21CAD19D4636C26B0F1FA99CBE6DA4CD70
-Out = EDBEAC9A8676D1BA66949F71B7BE5005
-
-In = FB2063EF9B211AB8ACF3D1256DEB4E30D1B6DF1882308FD7F80F27C2141DA8A89551B878410D914C4099DB464738EA337335828434
-Out = 4DF72B07A43EF126FBDEAD01E51ABAAA
-
-In = 41DEB68691AFCB42C865CF29EC0C2698CE621594ACD0D3443B8D025F6A4547DFD058740A837867A2C1E204CCEB27740C343BDA0AB6B2
-Out = 83A4F9739748D0402BA738757FCC517A
-
-In = 38C8C56CE471F839B8FD15AB3AF0E1D1A3FA494E7DFE660D5224E1C8D43907E5CBC56CECCCBB44CEC1AFFF26EA7594E33D05789DC49E76
-Out = 07A7A27D722092692035AAF579751495
-
-In = 6AAE2909D84B75F7AF3155E85660A1CB224DF40A4EA6CEF0C0F28AD149F3486AC3E837E7283E07803522CCE7000D0213C73B09FE77500852
-Out = C7324E5968CC534F8B98406165C5ACF5
-
-In = 9934BAEAF002C98F527AB248B8D44520456FD552409845CF1E666E41151DD3383E5F658DD3AEE63DCBB94BF5ADE141D753B57BDC3BD22D6648
-Out = 985711D04A1636B27B98EFC2DB61A806
-
-In = 69C8BB8FB1ADA90D0B9739E62AA1090D12C750945EC15F28D03886BDD1ADCED7169948E085B56996D4537A35F72FEB5313F3B7BB3DEBA66B2B84
-Out = 709578A0AA3DBF9CE4BE69AF71E1AECB
-
-In = 1EEA19E3548286905BE1092F54EC9E372DBB9950E77EAF7E9C55031232D8D70AC9DEC5D71FACC235EA339B859D54C4D3245F8702D535467E918F86
-Out = 26BC86988B1C278EEEFA648345431254
-
-In = 24215B243E36C2EFC561CABA961A170C0EC406344AD712DF5DFF62CB80B4A12C08FC009E4A359306601ADDF31845A88F927BD86566634466BA15E5BA
-Out = 2BB96ED578D8C61B39DEA925DCDE859F
-
-In = 4B6AFF3B20CA5685D3E173AD26E443D38748340B209D63E60F26988AA4C31FEE142783DA23BDE5D322C6AF97599C63183EAAC6B9DBC3611E6C2C32054A
-Out = F54BBB34D01EDA10B43753BE8BB9C219
-
-In = 26C82DDB40254A854F3FDD1334F1A191101730DCE43972881706FFA4D307D7D9159893252B25732F3976DE9675C7128990D7E321CB023221E2A89BA7E066
-Out = 951FBE39B9172884541297FC8DD4C2BE
-
-In = F357FE7BE2CFC971379457338EBEB69A40286C9C0FE5DB16888E2E270EAD23BCF7F70031770B08B5C7C4CFF2E49C6BF9844F773B3F84C49C575173C691CAFF
-Out = C2AE33C5E43079851FC8D2671F5F4CB9
-
-In = F5A11AC76D127223FD9E95B3E743B7EFD13BDE1E502D0E81E33EC85852420EFB353595BB7591E11E3A79FAE079239EE4C87FD141BAE6C6B7019B9A57BB6498E0
-Out = 45F83BFC62EBAFF4EA00678A138D7E7B
-
-In = CE9C44FA430FCB3BACFF6B384A2A6C2B0617C0737DB20B0B78D86C6F7C341D19801AC2E4400822DAE74DFA40A4468CF5D1081D3290FF35AB4775790E22FAA58BCB
-Out = 882D31790CC7FA4B512EF4A00B1F5180
-
-In = BE2FBB79CC864E84C625D71F9886DC29F9D5D387BBA4AABC2DF2C8C75FA45C759E192E0EE1A31BCD51618402D8898E8EB937630F6211734AFC590F99AA67BAA0DA69
-Out = 497353E9FFE29110092E859CEC5B366E
-
-In = 53726A30175CCB0EEE5B91B542E7FFA6EC7C2DD20784563D5D379B0DD5F632060B9B9FB6264AC792830B6555767F91BD0D6808134624E7A2D8901A6BA01F558BE4A549
-Out = 2CADCE7ECC0BC5DF4043C9A3F4F838B7
-
-In =
-Out = 8350E5A3E24C153DF2275C9F80692773
-
-In = 61
-Out = 32EC01EC4A6DAC72C0AB96FB34C0B5D1
-
-In = 616263
-Out = DA853B0D3F88D99B30283A69E6DED6BB
-
-In = 6D65737361676520646967657374
-Out = AB4F496BFB2A530B219FF33031FE06B0
-
-In = 6162636465666768696A6B6C6D6E6F707172737475767778797A
-Out = 4E8DDFF3650292AB5A4108C3AA47940B
-
-In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A30313233343536373839
-Out = DA33DEF2A42DF13975352846C30338CD
-
-In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930
-Out = D5976F79D83D3A0DC9806C3C66F3EFD8
-
-In = 91F1999647F001F7B4D4452CF7C07B64A994EFD25DCDBD9F6B260A77C8855AEB3EE8C65EAEE6397DF26F58A1729BF7A12ACFCF1C4C07A760B829D4158164A57037C15FBFCFFCD85C987C9FB5319AEF44484965425FDEED7D182861A0F3F9BA42BCE7CA288355DF484BC4476B1C587C401BD6196A401A9A99BEC075E8B99CEC15B3E9292F6399F61E00B27837AF4CCCDAAFB235E90282A08C979628E084C66FF24E6E180AB9BE50E274861E174FB511760CB2EB48A2A50D9D70C97B864236BD6AB8C2D9BE95E44FD317FBE6135B800C00E2422068F399F6F9427340AD4ED5CAA1DD96C76EFA688679F577FDBC02624F7D936A199A9CEFBB4F2A9FD15A1A81ABD5703A55FE3911455C8F0BBDB6C6479B24BF8501654DE0593F52713A53929E46FCECBF708ED4EF00768352682B8BF7731F2682991D3CE26497BD4419B6BD67A04907C6A1D84B2B7C2B8C622EAE73AE49D978DEEF8214AACCDFDDBAE1F10D19AB6BB7D38D5BEA2A6141A55BEF2BEFB605FBF01A88BB7294E4952283731BE737EC395B8B537558BE7889CC9C43C855F6CBF4131FB2FA17D72E334F775466F1B9C70A4325DFAFF502D71ECC73E113871EBED295D9FD66EB2F8CCF456075666C9FFC121BFAD286C457AC1191354CD5AFC3F8678CCDC3371B2D86F378182B7F40517FB36DB0194A0D517D9CF235D91001FFE86F7386717B9CDA393C712E3E2628768EA5FB41B1E26B11615B6187E0CE73015FE6811420C1A2CB00D69399C91AE4A21F759B31CCE31CF01F0F9D1E40162130EDE0ADC73B641121F1286FE03619B2768E1FA021311CEDC5B124EDD6B1AAED550CC3AE65E0DDE172F9A8CF136D417C859DA5C1B6F2166810AA46BFBBC2C13B1D23EECA6159CB09D511233A50FCE4DB27E3D35728CA1F35C1A5D538BC4B1F2D95C8B8B424B346FEC0EDBE78D727B9E982EC2DA3CC81238D2317648CCDCEED1C887E97FDAA0E764807F5503FC97A555D99B417185F75F06CCE3646E6C1900A64DAB07881D074FDCB400043275A4D23C5AB64FA7ABA88D225EFA9AA399A7C18640B09D37F189D5B8AE4256D20A50B5BC26DB9DD6B2A81436A098DB8283BC6BC64C07B0F700A2BB0A4440DF1BB4B63197EEEB31039AEA6B2517B54D5B6F93F9432D94E5C6755F4B847635C8E70E7B66A2ACC479B36BEEF513B583CEBBB97310DA9B96111B137E37A3DB5656A1E3C2F7DF8F7A84857FF376F6AB085C80A3A3733D519677805DC1AB9F0278C78A2A55026EB6998761E8F1853EEE64B843B74714CBA56B578766942B241D32000384C9634E09BCC45E80F5CBC32B86C33AF2E96E0602CD081DC9174B33F1506951A560C0141F940E3F2E84133C137F7002F0C7CBD7D86429963C1B5F8BC3996685FDA856C4548F3317904D4EFE606070F783E7BD746537170A9EBE29967C36A2CA8ED8AC08114C24CC860013195
-Out = 3A1237D02204327A5D2CB7CEDF024363
-
diff --git a/src/tests/data/hash/parallel.vec b/src/tests/data/hash/parallel.vec
index 544ecc0b8..537e4941e 100644
--- a/src/tests/data/hash/parallel.vec
+++ b/src/tests/data/hash/parallel.vec
@@ -5,9 +5,6 @@ Out = D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709
In = 61
Out = 0CC175B9C0F1B6A831C399E26977266186F7E437FAA5A7FCE15D1DDCB9EAEAEA377667B8
-[Parallel(SHA-160,RIPEMD-128,Tiger(24,3))]
-In =
-Out = DA39A3EE5E6B4B0D3255BFEF95601890AFD80709CDF26213A150DC3ECB610F18F6B38B463293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3
[Parallel(SHA-256,SHA-512)]
In =
diff --git a/src/tests/data/hash/ripemd128.vec b/src/tests/data/hash/ripemd128.vec
deleted file mode 100644
index 526ac26c3..000000000
--- a/src/tests/data/hash/ripemd128.vec
+++ /dev/null
@@ -1,24 +0,0 @@
-[RIPEMD-128]
-In =
-Out = CDF26213A150DC3ECB610F18F6B38B46
-
-In = 61
-Out = 86BE7AFA339D0FC7CFC785E72F578D33
-
-In = 616263
-Out = C14A12199C66E4BA84636B0F69144C77
-
-In = 6D65737361676520646967657374
-Out = 9E327B3D6E523062AFC1132D7DF9D1B8
-
-In = 6162636465666768696A6B6C6D6E6F707172737475767778797A
-Out = FD2AA607F71DC8F510714922B371834E
-
-In = 6162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071
-Out = A1AA0689D0FAFA2DDC22E88B49133A06
-
-In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A30313233343536373839
-Out = D1E959EB179C911FAEA4624C60C5C702
-
-In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930
-Out = 3F45EF194732C2DBB2C4A2C769795FA3
diff --git a/src/tests/data/mac/hmac.vec b/src/tests/data/mac/hmac.vec
index 2db21bc3a..8a210f622 100644
--- a/src/tests/data/mac/hmac.vec
+++ b/src/tests/data/mac/hmac.vec
@@ -1,28 +1,3 @@
-[HMAC(HAS-160)]
-Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B
-In = 4869205468657265
-Out = F5B44115A53F716B6F488DE1098EE7C251418623
-
-Key = 4A656665
-In = 7768617420646F2079612077616E7420666F72206E6F7468696E673F
-Out = A74547C1EF0AA147C7428AB7E71664549BE2A412
-
-Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
-Out = E4C91BC71782FA44A56BE1A34AAE167E8FFC9734
-
-Key = 0102030405060708090A0B0C0D0E0F10111213141516171819
-In = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
-Out = 14D1055DA875222053BF1180BBEF8892EBA3AC30
-
-Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
-In = 546573742057697468205472756E636174696F6E
-Out = 124131A293F1FDF3D6B11E2B7F7A1F5B12E42D58
-
-Key = A766901C8630F7DB3A3FC2A9747A6E2593452BE7
-In = 54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B6579202D2048617368204B6579204669727374
-Out = 63750D67AF40E3FDE33526545D300972A1527053
-
[HMAC(MD5)]
Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B
In = 4869205468657265
@@ -65,23 +40,6 @@ Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
Out = 125D7342B9AC11CD91A39AF48AA17B4F63F175D3
-[HMAC(RIPEMD-128)]
-Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B
-In = 4869205468657265
-Out = FBF61F9492AA4BBF81C172E84E0734DB
-
-Key = 0102030405060708090A0B0C0D0E0F10111213141516171819
-In = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
-Out = BDBBD7CF03E44B5AA60AF815BE4D2294
-
-Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
-Out = 09F0B2846D2F543DA363CBEC8D62A38D
-
-Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
-In = 546573742057697468205472756E636174696F6E
-Out = E79808F24B25FD031C155F0D551D9A3A
-
[HMAC(RIPEMD-160)]
Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B
In = 4869205468657265
diff --git a/src/tests/data/modes/cbc.vec b/src/tests/data/modes/cbc.vec
index 6839a396b..4767b7e50 100644
--- a/src/tests/data/modes/cbc.vec
+++ b/src/tests/data/modes/cbc.vec
@@ -171,17 +171,6 @@ Nonce = C1E0E3A06B357B51
In = 8EB8FAF49126AD5B8A0AA6DF8B52DBE50DD5AED271641EF983BD650DA69816
Out = 5B4622F1C4FAA817EE3AC181B969A7AFED7117E23F68BC6017519A7D1399CFE9
-[RC5(8)/CBC/PKCS7]
-Key = 0102030405
-Nonce = 0000000000000000
-In = FFFFFFFFFFFFFFFF
-Out = 7875DBF6738C64788F34C3C681C99695
-
-Key = 0102030405
-Nonce = 0000000000000000
-In = FFFFFFFFFFFFFFFF7875DBF6738C647811223344556677
-Out = 7875DBF6738C64787CB3F1DF34F948117FD1A023A5BBA217
-
[Noekeon/CBC/PKCS7]
Key = 56C5E79C74EF63A2B64D831EC0FE0F5A
Nonce = D79A4D3B34BDE6BFB4DC0BF752987080
@@ -1258,4 +1247,4 @@ Out = 97687268d6ecccc0c07b25e25ecfe5849dad8bbb96c4cdc03bc103e1a194bbd839312523a7
Key = 636869636b656e207465726979616b69
Nonce = 00000000000000000000000000000000
In = 4920776f756c64206c696b65207468652047656e6572616c20476175277320436869636b656e2c20706c656173652c20616e6420776f6e746f6e20736f75702e
-Out = 97687268d6ecccc0c07b25e25ecfe58439312523a78662d5be7fcbcc98ebf5a84807efe836ee89a526730dbc2f7bc8409dad8bbb96c4cdc03bc103e1a194bbd8 \ No newline at end of file
+Out = 97687268d6ecccc0c07b25e25ecfe58439312523a78662d5be7fcbcc98ebf5a84807efe836ee89a526730dbc2f7bc8409dad8bbb96c4cdc03bc103e1a194bbd8
diff --git a/src/tests/data/modes/ecb.vec b/src/tests/data/modes/ecb.vec
index c62ce7fae..f8a02ae64 100644
--- a/src/tests/data/modes/ecb.vec
+++ b/src/tests/data/modes/ecb.vec
@@ -260,162 +260,6 @@ Nonce =
In = 00E0D8C19605363653DFA5F778DAF9E959CBF9BB7E4D3245
Out = BB44D4E603A6CD1EBB27E47FF7AD9F163420E58B97F1C7FF975B521917E7879B
-[TEA/ECB/NoPadding]
-Key = F9506AECFD6B86C4E9D5D973B435E66B
-Nonce =
-In = 2FA6A6449FB4F998EFA3F1679A638602
-Out = 4D3953E121FFDB4FD7F05FC74FC2ADFC
-
-Key = 47BF1198D16C123C95496D0CCC9A5C8C
-Nonce =
-In = B4C8B417381DFC14CD6CFEDC0D83477F27B0B1BD842922D4
-Out = 7608D8A9F2BFFC14DCA6942B2867239BE3B4788D8748F314
-
-Key = 3D8D2CFB7424BBD7B39BD9BB2C0CD794
-Nonce =
-In = 18DE3130F51CD7A6172B3C79F6DF435B41F57D3B2D54DF7A436ECCE32ADB88EC
-Out = 58AA062B7B9EFAEA2E3ED1F9D19FA6F695B0642EA7FB6EB5C5ED914A4034134D
-
-Key = C1C1384840D2B15BF8751CBDFB2607CB
-Nonce =
-In = 64E00DCC29A3BE3695F2198E58EA42E323E99387CE99A0543F7594331E546EADD7163E625ED6B32E
-Out = EA6EF6ECA267C02C2C98D03AED4402A85B8CC02326D1FFCF169D321F675C23BF530FD4E8AF7A511C
-
-Key = 25EF77ACC4435B378B0A07AF35D7A283
-Nonce =
-In = CF70A73AD2C4714044C8953EA103DDD2848595C182BC6A703B2E6CB90E80357120AC671F10C8060EB2A14451BD69C9F4
-Out = FACC24C79AD55C3E2FDB55AD21F52595452E116FC526ED3F21C4386D0400F098F86D86C4E630E638A24EFF839EB8AECE
-
-Key = B3763F385F9F53A76F59E9E9B8070886
-Nonce =
-In = 5AAADAFF6BF18700ECF66DCDB2AA201A1B5C338422E654A9E769C0EC40982E2FD9A794E29951C6EF26AA3FBF41B29E7457B6A2BA4E39F75F
-Out = 260629AC2B3838BADABD4765B0BB6A65D34927FC51BD712A36C8AD74AF386422FC479EB51C5FA2072B4D4A3F259A761C4CDAC375E0FB7883
-
-Key = 84A6AC5EDB9A96C8BA3BFF40AAD9ADFA
-Nonce =
-In = 10D5908E8AB77BBC4B6A2D89A13C899C9044E2823FCBA56FBE7312A7F475E16AB3B26E74FA74390B5025C2399AC84EEA37326A6F8EF8D133A3E27EC6A01F97B1
-Out = 1421E0144AA1061EAA75F81B44E12A8DE1ADDCF46D4E29D636F17565AC1326B8B5E1F2EF097E3BC22CA2FBB5B637E17BF164DAE5B8A0D503085EFDE1E36B82CE
-
-Key = 0B666EE6C0C5FDAAB1D3C528825B8262
-Nonce =
-In = C65601054E837A0BBC4D0A50CAC6CDCFD7EC9879316EEE2979F6FF139D881DBF7338DDAF02F3700BBCD7ED67D605030187A588775A3604FFB20A989D6893FED3814179B336111DC4
-Out = 7F65DA6551B8C2A677054CBFA5BAC5B8CDFFE2593F3297B3C6014D8EE83B00DB0BF063C168A4C155705A7984BD961A0278BE247FAF01E3BDC6DF3EBA4D39A0566F59DBB3F1D682CA
-
-Key = 6CFBA581ADFD1DEFA555D4B1F2924E67
-Nonce =
-In = 73ABA32AA3A6D791EDF7C1FEDBDE65950ACA8E7CDA9AA303DAA259965726F7E54EE8E07B6EC41EE05DF08A8030AC76CD419CAC55249E5454427C9EC1607721A0A8DFF4200175B5EAB66D6A33CB1ACC08
-Out = 39D91242429514DB8B2715FF7CB1D12AE97AA9B31286E672DCD6D5FBF9FDF52739F50684F629F7F8F47F4840E399725DB5383C4427FD920D0091B8466ADCE80AA86E945AB09F9999DE7518991229A9DC
-
-Key = 35927642F001AF7BBA592C573D566B04
-Nonce =
-In = A9956670B38BD99613696110B2717482945A798817EFCB34254271251C1D7912F966F78FDD0D534BAABD440A80F75FF20C5D62C21327803FD957699302328B03F12F17A9D89CCE843227D99E3F223C2E1EB8541FA4DFFDC1
-Out = 27F0468A37ADD1F81E6C453DB2E89A741C4949D4994ED22D4473B40FE63642B0303933F74523055F9B2614DEB0A5E4BE8067C9EAE91C573C6508610FFC6CDE32DB8C3BBA9803F9FCF1A1A3C8CDAD99F945FB9912BF38BF24
-
-Key = C4A3785214040158D8D9037A9D5FD25C
-Nonce =
-In = 2AE6CFDEFCAB3176BB1D7C9125F75011127F87F068846B5BB17C04457AA795CAF2459C7C351CCF870CDE051432CF0019A5C411A45979A3E318523366138501A8C167A05B959B4DC7C8735B9B15691262F2828A22093EE2BC15BAA5CC06426663
-Out = 46594307F5E0E998848072D2690D97E32058FB1D4577521FE5AF518C325762D9F076B15E77E04DCEA1C8A2C34A287EFC5F9A301B5FB4C75699A3DFDF7DB8B7EBD61D5BB2C1F880EFCCDDA930A8478C7DD946A7BF9EA906F6C6C930DF1BCDC51F
-
-Key = 4A9F7BC01C835442B5F4EAECC8FF50B5
-Nonce =
-In = BC139112FA244D06DF5FFFAA2E44F58F29AE8B092395B9A67ABB435610674E4FF71027FCE2C3EB95F7CAF7E05DE6C095551AE224A97807297F64C87247A34BECC6ABDC900259EFD4048D384AF5481DE995C8ADE6FA7F982A702A44422EC022699B783E7EA57B7A2F
-Out = 57D854129FB358772683BB1BA42AF91F7E945F1BFF27AC4EBE6B531A581914E8BB57834FD16A9E287544CD2840475155E49B9F6859D9E3D235D56CF5E7ECFD47D43FCF50A378287F9F9A33AF0E53983456D75A58FF5111E69D768F25DAF721AA9C69FBE01F2430A1
-
-Key = A076529A62A7C604739522583E1EC20C
-Nonce =
-In = 51AB05548D117A49B3C47D2BDFD681A9FA39A1D270437AF03D5557BD5945C66D448428902152A2DEC23141E4366B55DA9A5FFF68C6C67CC2A7446EB28125986E945D6B7AE587EBAD8EA14B066241B54A6485A9878837571346E7C416376908B74AEB4C5D022080BB79D0DA25B837D53F
-Out = BCF3B29D04DE30C8EB5345C444E3FEDC5D34EEAE60EA71BC355F21F69E31F759DED7AA436EC595505E1631A52F5416A41A529F39F6958499E99EA5DAAD023593A78DFE9C443C5AFFB6E4D9EEC22BBD66545A67FB8F39799149A1601DA998694D7BD65AFF19AD1326F4B988F37E555D78
-
-Key = 7D9FC06731D5D44E7D137AFE5F7CB7AB
-Nonce =
-In = EE99893A9B1087AC531F3C5C67902E6EE086A11F6D28B3A41A0A692A15EAD2E0A43A3432AE88E9EB54944F4138BA95A4E52240B3CC34E1EA6B764AE2703696493F454670415787981CBB062910A3DA1D39ECFEE971EFD945B44A5FF4C4140B5893A89F6F454F9568D83AD429272832258D3D0B82B7ECD00C
-Out = 641C64CD007BED6BA89AA7ABB2BA478717C84844D06D0F83251B8DCFB0AA02FE8991F06CDF5328B4195B272807B242A0CD51D9C9CAFDBCA8773ED2048FA25360601197C1A8AAC3BCAA05B087FF38F53072755C1AECB169CA4EDDECAE1B580433DA6CB30F4A7E33D02C6E3624982853DC5A77BCE8E3E9217B
-
-Key = 3652786521A31CD6A927E608CB2A87CB
-Nonce =
-In = E687266A896382127FCDF60A3F271BD3BD21C0306B8206FE9D9F2B00F4201418A4DACFA653DFD029639AAE03A6675D3E2B4ABA7E46CFBE14FED665E0F520F110BDCC4E5647BC3D82723FFE0F588062E56DE991922E9F23FFBF2E1BE91625A190210654E0B2476664568B44EB58117317C6B61645C6907ACCCCC4BE949C9D3ED2
-Out = 0058B2D35FDED2CBC91D454AA55F93B0A249152B3A5C9DFBE907E639CECF1B90580907A29920901AA5278EABF189DB980372C2A804B2B301F8262840D45A668564C634191E027F691630602423B9069279FFC20B181CEEB2CA6C15B5A66B9FDBBAE3B591FDEC91D41413AF3036EF4A99E9E1B728E901405E5EACBAB539BD4796
-
-Key = FE97F4A2874358EEDDE14C5A1DBA9731
-Nonce =
-In = 6A5A797BFCDB31CA65F7A0D720B679B5C7CBAD92508E93C565E3AC94DA5B84C041D2A0A97CE0D138C2D48E8F613C36F4C9A9ADA0A32EBD5E346A0A76078D2B49E559BDE59297728577714F3EF016A607D3426297B4681CE7FFE958B5750F8DB6F88916C5DD61CA30DC2CD2A24742EA7AF3886C792E1D94ACD6DAD21649A8BFA6F907121166E51D97
-Out = 1DAFC103EF64B21BEA443931DD0111CB06D5BF42D1824C4E3F3A7D6718F2911756D946117A12CA4974F9BDE4A99012615D6D1B78B94349216FC73CFDF7BF91126F017A9206F783106E636AA89EA986A4F4942A8820FFF0D0B151E7A74397EA186AD85899DA5AF661566A3BCB3C7305DCD5113F12E3532B803E0ABA376B232EC1328F3D0F1F884835
-
-Key = 5F5B428DB8D1FF5165F7C6691BF21794
-Nonce =
-In = A420F0855799B02E78C5A8087857A62E10F6448E3B02257AA678A7895EB9CBDED44D0ECAADD6ECB78F06CD65ECB8ED2183F62691FB42383E4062A5EA5078F146964F1DE275CC449304D319A4EF99A07C09B35F4C59E6AE9F8799C074C42BAE060E463A25078A61CBBD1818CEC67CCB08BB4CEC9A4D3B146007C990AF9E723F858F7D63B81D4536243694AAC2F4C02CCA
-Out = 6AA3148AA2E4676C3ABBEA8B883560168F04843310B7871174C21F906E4049752617F465DAA843BDAC395FED435C32CD2B497D2A58993282E1FC36113060AE36620AD606E0A32FD9E143578188FD408D98C36F2A4134B10431BC20779195F5BD01F915987C40622D6D813CC48684D043AC74994B61F2CFEC89DA1A8A8C44FA82355508605324B20346B62CBF42649803
-
-Key = 93BFF08E9CC32466F4436111031037A9
-Nonce =
-In = 50A9163557E25C824A3DB605486E137772BFB26F3D60AF6431065B11DFFB65B5F46B49786612857935365BE801D978A860463351EB37A62BB66EE43E0B348BF509C3AB450334DDEB1FB04F829311998D026F7A66FC6E06795F7268D0E4B71BCF674E42E9851AD830243EF28B854A2CAA00541A5AF0A3E05EA7A4B445264204516A7B824CC8FEAABA992040939E2D13CB832A821267928B88
-Out = E905FBFB19EA75D647CAE71A3E4AD1FD1150101614109A06C4BEE3E8CE5E677FFFDE252DBD7AD0B65E9A47683D10B32E5EA1DEC50746E8ABE6B562054F1F60AEDF267308583DD209157ED0013F91C76A58740CC94D46584ABF2145D441C7721E5C41A7B33CBE13A09D05A569C7C0E313232282FA72B2DDF8107930C6A697D9C87EE66DA240658EC5254A4F8E4A99425BA77E6D36557FD32A
-
-Key = 07EB031C2A50E81BFD6150BB8E279F6A
-Nonce =
-In = BD4BCFC5B25FAAE48AA8F4DB7FE80F14ED076F13DED25A3EF4784882F38838EEBB4757B9BFB1344D422DC20D93EF2947B5D741BF945BC679BFAD074EEA9DFF9CCA6E49B6C40EEAFA40733AFD8A21E26E19E9EBF66074C1102AD6234D129B589AC7AF71096C128FD94566E1C129D07E220FBE9D4DDA25BC71112D62AE335702CAFB7B46DFAAD51F6D7B4462A86400D030CE96B577F0F8C43DB342E4C700C21F89
-Out = 1C2FB8256D92E620276C95006DF21ECD2C0DC26BF5752369C57745A27538200A5FBA2A08B3DC4C6B7037035E96A7E4F97DF66B5FFF4D0AABB520A15D83FBA17CAA84641142044A75F675637143F2ABDEA9631533877D3E77CA68B615A4EB9DFC4B0C27BB777604EC60950D4531D4C6DA5412661D2CFF573DB93D4D428EC974904BDC6CE92B0F137188891DCAE497084FD3DD3A9BF0991E7D954C473DD7075978
-
-Key = 0347E502FE1FB58BCE93EBB16AF1671B
-Nonce =
-In = C12B1B0A8CCFE8BB72CA3C353F855F7F226DF0F1FFA791785506E972E19D153A92DEF0D082CAC0B4318E5C0C597638EC01204BCA002AE8BE1624AA4DDBC50759B8813F6533184181395AE665962CD6BA22D82C1B4CD82CC4D2DFC07884C784398D596095B4ADF4A4CB5561E52C5DD85A2EC4642EF902A91FFD4FA73094D9A10D410743B82B24FE1149A5BFDAC8469D4C74282581DB20BF4DB73321184B29E08D0A3BEB0A56D12AB6
-Out = 06F1F55E98C7B67858AAB0EAB9ED413B2E8D7BCFDD95FBDE16151A76E3E314022918B276403782EEC2810FB10B8E6742287685675C67935217023EBE32994E1B1C7FFAF3C8E18EECCCBFA47DAE25377A1D38CFCF9FAF92AC99EFCA34FC70F04B03D1A2E8685B2CB2F513EA6A49130BD8F220267DA4FB22E2FA02AC9B4F2FF554395BA7E0F85C378474E185DE7B04E01C8929560B399D768267B352CA4BDA75FEA3B022B2790146E7
-
-Key = 5922D69B966C705B91F8DDB19DFD15C5
-Nonce =
-In = 7BCCB586FE4F343EB7DE9210AAF5A5F81E62CBA5ACCCD897ED221CDA61E2D4F177A25002F5E12AE2AFA0B19113485EE793F3C85FF14D7BC94B23AF502ED0118E78192CB4FD680676194A99157E9349353E907ED93A869A1A9BE721ECC94619E26F120A87C1E227589901C1617328D76F6B1555693ABD6F847ADFAB14CC936D3DA4F8F47BC5B77E323F23BD4DD248822245213A03CE770FB50D40E174606D3318BE3F76FB07473ED7034314E16567098D
-Out = B42FBD0AEC444319719ED521AF7CC522A2F1DD69ACB6C6FC08EF1AD52415DDAA4E94FDE1A21BDF954DBD56681E2E3D89C6725E716414043C42B0CC842B6A326CD70770881E047D59B611B6595FAE0385111BA18CB19359AA7FD318B528D48348EB51655AE17B6DF79DF383FF2F3AD856BA42598DC2D94921B4A93E87BD12490DE43C454B30F4093B30878B5BDA7D6711F68DCFBA6AD0AC92804E15B6DC141A0D06CB962244700554B0BA4D399BB9D935
-
-Key = E5C7B48ADB3AB291EFE88CEBFDC612D9
-Nonce =
-In = 7D578CFBB35A1026C7AE1B82405B5F93366BF2280C6E6FB42EC515374AA2294534B1ECB67CBC925E375D4F6B2E1451CA1BA569D494FD5C0FCE09F9637C83276AE3E1249815445D60E47CA8DD9EC7B846449C73F1648640299EFA82C2E696A0F9CA9738DFA459F8AE04E3431BB702D4F6D41526DF1543016A8E0FB1DE5E5258FAC9DF77CFC07CB297BA2A2921EFDBB0BE4F355197409CEB98BBB08BD24F48748142321E66C9791E93E8156D3FEDF7B3CABC0C40148A866D28
-Out = 50E48B13EDB839D430DB28787D20DDD4C070730ACF59E9B235F101557E88905B2B8766F19421718D82EBFB7FD8075D1239DB19BE2151782075A761A7A1B78B1613D95340083BFE449B502D5744512CAF2C33ACDE1F1B18CB53B152AFF2078319399858A3356DD710A1D181A6EAD0EB9C1ECA868CBCE049503E372BF3B9364B275A6D68D92F2DA3396FC045A816C2E9FFE3797538483CBC25A97DD93E7CC997CF7469E66FEF432B9F3C5F2ADFC55235710EADD2E8FCA5AFF8
-
-Key = A830EC3F2B6EB4C27215F68C373D51CB
-Nonce =
-In = FF2E2C4B8BF3223B6513D612666415DA018A608BEFBCE8141F40EABE933BE55782E1355B5D87FD7A31374EDA7BEECD24CB798A458ACC60ED063322CBCDD796546C0D09AFC04042A348E30D83309DA1EDFC0D631F1D1264D02812AB2F1ACA5E71076FA681BEEBC71C0104CD63807C1B1C5FA543A2F30D903FCA91B6E946923FD57E1F1396B33E4C44F057693AA8413917002C185FE0E54C2E0FB478B324E7237C6F4A5B439C2B52E1AA4A190263F5B6941244919FAA826358C3F5055A1F67AB4B
-Out = 44FC4977E72F10AD62AD3E3FC7D868FBB09C4B7CCAC299E9E299B3FD5DF116C837B5D9857AF8F83E97699F021F673679296444F96EC481F2C71DEA77E571DDFC49D9E453235A9BC93DC7CF60B209F305A2420830777D4B3732ADAED70B55406C777EA7CBC71EE2E58F89FC1D4A1AD84A80B8F57C958D887383EEC107D5EA2E8297D75D588B24C8E42C2AB11FB21322E997B11DCB9AD7C825638BCC25A04E7D9311F24638418095D28259C74E718123CE597D22041CCAAC3612D803335DB4E21B
-
-Key = 201C9CFDE22F6BE8FC881A4BE6862199
-Nonce =
-In = 796E00B9B9C314F46A6FC4D30E251CBC99C0A7EC1012D4C08B3C709F8C42A0A24B52AA86A8B4EE6C0B40B9AA749751222CE2E40E97467F8E49498D3EE24BCA8C3F6271AAD7AC9F69F56B6F911B8840AC28B10DD63EAB8249A85747F5B97CF2BD18CD163BAF26D57C8E5454F162BA6D9758151F53D3F45733C3464836491C28963962FEBC6985DD4BAD90418C5CC02758F59E001179888D5C56310EF3BD19660C98B40F39618C12DB9DF20A1144E4D88F5849F2A619903B91A4F88EA8CB0448B2D02ED413C71619EE
-Out = 35D5A3EBBD297958E923D81114240262166A0E6BFC0C42EFA099C488005ED84257FB74324568308109E76AC28EC059E7F8E612C2F8639C4510F996D311581D898E13DF6031385A620C5ECE9FD0745C7E7BB28323A16186065AE236482CFC37F227C99B6EA79FDB095D2E13A00CEDF8D91648CBBCFE9A72423485899CFBFDBC2CA6AB2CFEFBEFB38522EF1CF2D07AC68F29819E17E202AB863F0878713F1CE248349E4139DC8107328D9907FC8F4987FC0392B120F06DB28B7767AABC735535BB9FE18178B5BB34CE
-
-Key = 271A2BFE528BCBE7A13214409BAA2E12
-Nonce =
-In = 85BD2383419FFC58425316A0B1D0EE6DB75CEF29BCB06C55D961F1880C930C4536BBD4902DC33C528957409269CBF90C28468F4260225B30C1A11611F524B4FC28FCC6B1BA85064ACD5AB63686E8DA93A938081F14FF0D7BB4FCDB12B68F9A2821B397A6FEF87511FF67B8FBC20D4338A00B7AFBBBFC73CB832346030920A463617A8E046E5B9BDEE2950DB7BA80BBDF04230094F8357062AC03E277AA68D14AEEF8DC810F7BE6C51FB8866CC9FD24BEDE265184EF7EE936EA79B68C9ACD37EFB131F2647FC501826A4F4CC5D16D4666
-Out = AD7D51359CF9E854759CB435669B098EA48DD89DCDF882E2781170086EB679D6C45AC3A04583FE8BEA6A315CB59541E3753F800BFB186E9177A8E299A9F55E1D034BF8CC876C2F463D1273E320FB6B35FBE5E6DE0C3C205B6FC0EFB2A0FDED8C606E0422B0C8D72222318BF9B1A3D7A0B527253BEC8C9F66115655CE3175828B6659352BBC461ADFA2133808D872BC1CDC597A2EEDC72A1D2E2644275C60144F6C7EC00C43B6BFE2E4433A6F42A4CD2073528174C466AA9EE0AB24429726029FF1834254B7A839A0D8D4643C131C1BB7
-
-Key = 8588AF13229A77FB1006467AF02D6AF7
-Nonce =
-In = 89DCAACBE537D9028953B0BDD28FCFD1E745D6D457F48F9247F51A8F6E9719D85F106E8F794C6CA57247966AD2F878421C35528E95CB5813413B6E8AAD530AB09168A012D0027068D63ECF4D7D4783BCE8014D34852F5A52C66461E15C965B8750087C43176E70E24FD0D4FA83D4B9166C6311E328E08BEDAB29DBF554AE268476E507D7791AB3475DFE90CA3F3A3B6407BF67E4BFAA67292E3ABAF6967C5450E17C2CD3C096C501B0180BA891EA951E99FA418ACB72BE2FCB74FF143BABE55264F6B1BCCA83B81856544B843FF59D9668BDCD7EFC2F1F0A
-Out = 91B44C174E57C20AFD631C5B21B329A8B438C3249B5E0A4587BB01EB3C3770BDF67C16B24DE0DE2D61A1ECF3E00094BF562A21B6E2B9DD904CED2FBBA18A18A4228B958EDB1C3FF55BDE7D544DDDE97C67C1EA5E1FA4F0B0FBD2775B93AA02F4E6E19A43ACC14D022CDA7DEDE8B2915D8D4D0EDAB2718E56B25A6AA3C79B63E5DC03D57F948CE7D78A15FE3C0C781B83B5B116816D55D660F0B6ADDE327231069DE6015C622E456AD01DC1EBF527D05627AD3BF5A09EBCAF9392BAD189B511F6E429C1052E05FDAA558CB8D720F5B08AF5C2B7E1D811DB11
-
-Key = BFFD749F285E2BF09E6E1CF31F485D27
-Nonce =
-In = A3647B24A430D05146C564F62665B74242A393B47ADBF341DD56BB1855C0DEB052A6AD5F4661A45F5107EF138BF5FBCF03F2DF6CA6FBDCE61D91CC9327D476B7D96061A4EFE06D77A608A78A716541A4C1B4A9D99B473295D293F37F6F3E982CC8687B67ECD9C8B999FFE97F1F28F23531F600D2D91865BD7144186A53B823887FBC4E5B25A6F233386393E40D9FABF5B4119E83CB614CD4D302D999AE00E85F78F22687BDC1420784374B87CC7EB772BC468B01AD895259E94FE55159FB5F6EC7FB5B7B1CACCD09884327F174A60C38DB31D6A8B8925D75309D2D2850FE4E8F
-Out = 5ED0A794F77048023665D3B9FCF108C2794D98C4472136EC491F2EEFE3A2ACB89DC6A0067DCF449AF304E0A43ACD79EF1C8118DCE1A73DEAB3CA002390E2DE166F24883619491723AAE01FDCC31FCAB8996779604A36F22B1C8E418054BA9164D74CA8ABFD0C39E31A0FE97BC4796802957CBCDA7ABC8AAF298C007F401B56EA023D26720B5DC3C9843CA604AA6F820CEFFF2A38681A2B18DD37450CB853F5A5612C3F7083C78DE65CDBAAB5983337672AC050ACCC013E6DF3EE7AAE6EBD91D328FEC89407668B5BBB40A94135E071A9E20D0420D24A9E719D0FC72A3136217B
-
-Key = C0DE2ED5FE62A1B2973360E18660DFB5
-Nonce =
-In = 5A52582DAA9B17977B476F718A030152C8F4A9C8BFAC2CE9A3A78935B4B9D7DCBCE4237AC8B51464E33568F6ED94CF29A2BD367D38D059116C57EC69BEEDD67858E9C06420C082C0D4C18FAE8B617EFE427DE7BC07BA2BE9BC9FDD9CD15232FD9A9B8B3B9B9BDD2F801B69AC5EFDA6FB9E2204FEEBC4FBEE4432407894C17DB0B8E0BBEAB451B15A3AEAD171B937E8451664C3A80E9E28F8F4CFCD2F28C1B116CA3CC2775632BBB14832C36FC70073E6FF462B826F3EB092504BE6A14E78AA2E32148B2E63BB8EE4B2D7BED5E8E2E8F025852F03A65DA77D3F9C6BB6B373C90F6B0D2CB5C2C1AC0A
-Out = 88FCDB413A956FDF038C69A5842363FC82F9D3BDF80D5574DC0C6867F7EE21EA4CF72DEC9AD83D5F19F9A71B71A71EE76645A153047825B5FCE892CEFABE49F6B0D768951B2F03ECA4EC7200141895AA87EBF85CC33AF12EBF0189DAE5F6218F4E485873E994BCEC2E007AB977BD2C8C77792F2DAC0F29B8F8161B2CA99C4E81DC9DA37FEA73E707200697647AB6C73E0DD1D837D329801A7B5F56CB137A1C23F5FA66213E720156C9AB67398300DE5F979BF4E1DB8C8DF0E927EAD3DD7F44302DC9B39AFDB4F287672114288E24BAB76CA10200DB56A428A671CB66EB2E4FE80630B94152B06158
-
-Key = C37E924EFECE82E275AA6115E2E2EEB7
-Nonce =
-In = BC0990F88218EDE0DE9835353BCF340C5463CFA55FC4551DE21ABFE260A8173591D44A82DCC62CA063F395396040F4B09E4CE63BFBC1C1F725FBCEC1A129124B111A9D393D53AE65330569846DA3FD18A682B192773A76649BFA999859B9EC844C6B4496981FA13F8F7F057530879998BDBF8D3ACF090D5CF543ABA1E9DBB72B6A48B85794BF212BF5956DFCA7714BC238E5BC3E785916DF9D27A0FB4A0A391314B072EECEACF50DC8693D5777C45E932F5C0314A882ED43AFF657935AFCA0B3FBCF97ADB513C754BD0EC82482DAAA8497D26A9E7F4320AA382903AEEBC83B53CC297364446664424ED246037F063BDE
-Out = 41E85AED70C8464E353FC6E2D5975E0FAF5DB17A8573C7DDE4BBE0E29EB71CDEB210B794D0FDFBF7ED7254B1EABEBD8CE203225CC4C2EBFF3B5D5BC51E3010F9946289BA3BBDBE4BE7C3FEFE7E7A390B628E29798E732382B482D84D7863CB0A85F6F3CE1072CAB120960D05FAE3510D36C9718DB4CB4750565C8745A076A7BE89F52A16DDE9D32A42CD635340F9ED1AA39132E30DBDE32FB28354C1DBE9BBF817481903BD6EA8CA4805D03B42F2D5000B43475FCC4103717BA2BEC3E2F1542BF308EDA7E2C71956F32F50680415685E8106E701E3F5303D79F03214097A4874CFC0664BE4815BAE2769BA2CE11FD663
-
-Key = FCE0F56F8DAE31186336ADE3B46D6FF5
-Nonce =
-In = C34B10E6DD28BEBD7DE1BCA43D8AAFC65917C51E848703C034284FAFDB04DB3FFC0F30599C923C6BDCF006B47786E1EC68B9D9BDE22D39294CA235E43CFD42DFDFD3D4C49FD778A4F61F17198851FE3923CA6DCBC8A6215E2CD8F24E110DCBA58A63058CF169A4CA4A8EA5578030CCB2EB03C95871AEDDF6A090FADF44F8D43D7FD36987F31E0409A7615687C1D3FC0F25796973E96A4DE0382D0965824E9A81677D414EE29EEAE3547BCE77BF9F6D3E6ED1526CF1F51130D7DF5B6B34E89EEC7D8866486E02D5E654C920BC42DA3DF7F08EAA0681F1350462B29792166D951CE94E5125FACF103D591C0E819667E42082FDFB7763C8C559
-Out = C2CAE1A03A0B7D37D3FB79D98E425DAFDBAA0E2BBCDBD0366690C05D495014915ACEBD34D320614752D0D667BABFEB9E3D5EBF5C1501EAD8D3C9602E6D33843C18F2868E237DB6976536FE28B02233BAF37E9EC308A4E163ABCD4BA5422F92F5AECC38818371FFFF5AF0FC66CE57DE4E0692B1BD82AAF95CDA6FF3C3C2F85CE16C54C151E32F146FC20AEDD4985E13F68C2E2224C49226545A32EC6C47974D2778184FBE289B14DCB78CE6DE17377557B92AC2DD3C1102B74B2B04EC74BDAF85D2FC8F659F4F067F6C3679709A8F2BDC2429BB7F78F5173EB3026156F2EA8FC510D5AA4482E1F5639F5514EEA3B5E979A0E54324954D47C7
-
-Key = A0C7A1DD857747698B49D1E6127F564E
-Nonce =
-In = 2112DE278B42F0E058EBE6BF868F544F740F0AB25C30459B6F198F74E8CB4E8B677F59E915CFAE5C208770C3AE03AE597D5B41C97AC6497F67837C20B5D2AC3F01FA5E831C8F240D8115279D81E315060A77B5971506D7DCA40939A81E377015BD6BAE084861A9044271D2CC66EAC30473931B26B5ADBB14471B32591D405B2D7C9F30A1B0280D21D5EF49A1D24F0E80783D31E2A156CCA3F12C7EED45E471BA42635A04057D3BE56E31936E0BEF6E705FAE0E46DAB18F9AFF3582935BDE554F650B21DF6DA8BD4C5CD75A58BC9FE50C03FA3217CE60DB9FAC52A4BABAB8223A05549532ED8386F6D621E2CB97B829C0FE9886DC67CDDA9E3A0D19E870DC8E09
-Out = 67315AF4A1B112817E9922FB3FC8D251CE6BB7CC1CBFBFED1927A172D14B0C1D20A9E382833306A08A3222FF0E11F19FDAD5FDF44911E46FFE688D0226B096BB227A0777B2C5F97101A386D65CE4E71CA590BA8DF68DE85D50511FE1CC08F6F569B9D3F47D37A93BA28B301A72D9AA736B464343DEC323207FFCE6AE59CF22916531B6EB6E92E5674C226E06FFF18F5E9306835957E93EBAD84711E4B059A19F554E3CB0F08ED7AD6EA58730BE7BA5572BECC89228FF83BC11F3036EBD8BFE370C7D74ED1FA03530E86DE89638CC7A1E79EB121F7DF32EF164AA1D0570FA6191FD88F7D09C1CFF5C55F3C62618017879DBBE422C6BD51BB320F7B5FC00276019
-
[XTEA/ECB/NoPadding]
Key = DD0C8719A8DA117DD9D1DAA189E65654
Nonce =
diff --git a/src/tests/data/pbkdf/pbkdf1.vec b/src/tests/data/pbkdf/pbkdf1.vec
index 910225671..ebcad175b 100644
--- a/src/tests/data/pbkdf/pbkdf1.vec
+++ b/src/tests/data/pbkdf/pbkdf1.vec
@@ -1,28 +1,3 @@
-[PBKDF1(MD2)]
-Salt = 40CF117C3865E0CF
-Iterations = 1000
-Passphrase = qalzsegt
-OutputLen = 16
-Output = 7C1991F3F38A09D70CF3B1ACADB70BC6
-
-Salt = 3A2484CE5D3E1B4D
-Iterations = 1
-Passphrase = vnhazjfsixbomxqu
-OutputLen = 14
-Output = 677500EDA9F0C5E96E0A11F90FB9
-
-Salt = 5D838B0F4FA22BFA2157F9083D87F8752E0495BB2113012761EF11B66E87C3CB
-Iterations = 15
-Passphrase = fheetneqbdmqqqnyywioqjfloivccquj
-OutputLen = 14
-Output = 91A5B689156B441BF27DD2BDD276
-
-Salt = F22D341361B47E3390107BD973FDC0D3E0BC02A3
-Iterations = 2
-Passphrase = snbyinjpuikqvxxgrlkf
-OutputLen = 14
-Output = 49516935CC9F438BAFA30FF038FB
-
[PBKDF1(SHA-1)]
Salt = 40AC5837560251C275AF5E30A6A3074E57CED38E
Iterations = 6
diff --git a/src/tests/data/pubkey/nr.vec b/src/tests/data/pubkey/nr.vec
deleted file mode 100644
index 7ea0b5f58..000000000
--- a/src/tests/data/pubkey/nr.vec
+++ /dev/null
@@ -1,108 +0,0 @@
-
-Hash = SHA-1
-P = 13232376895198612407547930718267435757728527029623408872245156039757713029036368719146452186041204237350521785240337048752071462798273003935646236777459223
-Q = 857393771208094202104259627990318636601332086981
-G = 11629401773565540073100961473632977008134185076958364415809981826641612629974728305105606061133984394938666464842000720534465163992699133277631369246002549
-X = 690137371285617821883812262785390552483969245734
-Msg = FCABA2CF434AC8DCFCEC
-Nonce = 91F1D3A9C129D91120EA3F6486A079AA695AB632
-Signature = 44EC399FAA3853B7F7313FCCB3A30B82B20A18C45E53188FC58B0E3C141A0851BAEA0A7723C71A94
-
-Hash = SHA-1
-P = 11539157087115501064443313862230776814501503314908866582520064395234214662096469833944226801182094864301551078051839094523689065169630864970454325952246003
-Q = 4611867475027478089006048754416511599991217483222299946239
-G = 6840886814729250448628234878216116001269356551393119934540583512165344555273987561922034037109642507867428525278842646754491096970938164337278633387482001
-X = 1883033040916132991100735190078580013234350924382655236344
-Msg = 5075752E
-Nonce = A876034938F576056B00569E4706963C8B28D23E03AEABE2
-Signature = 3097CCDF824E2BB33089DAA042551335625D9802A2BDE54C10810881157C8DC37E2ADC8195251FBE040B919D56512F57
-
-Hash = SHA-1
-P = 21493319731966889395799474793674095481723722419442661804680140633335622798225252248476045677397436074434085647562851808408438818911783503270078118300840749
-Q = 2448429158401879693785391062978880053200446269131
-G = 4203761693330811086621862151184427969736787878615125490977811499372765210480369328510227659014955675161810152504096942847711228481122133020330912131088488
-X = 2021846214679266501848864964638443639868567441259
-Msg = 5075752E
-Nonce = 019E4706963C8B28D23E03AEABE27C7B294EEC2337
-Signature = 006AAA75DD2B3A7AE867D2DA3581D04AE2AAA5905C0074F8C1507136682A93A23A89504DC0FEA5603946
-
-Hash = SHA-1
-P = 35830843685758796191508259498352925866257295533427704319070381297423750780192082137963436364930795492409541031064272330680223674416403180136573368273413749
-Q = 2448429158401879693785391062978880053200446269131
-G = 5290860346671742549277477828426565321171404093164267704697578220977450055062732322451195806155297850087747074380869149080130132451724804988893066580084340
-X = 1649869239975171591476437377401006250492835853262
-Msg = 5075752E
-Nonce = 019540EEBCCFFBC202BB81AD78F1E046F4D4597F53
-Signature = 013D9A09041BA0E9DD2ECE20C5042F5442DD14C8F00113A3C080CB2B8FCC156D33E7FB8966032FE1570D
-
-Hash = SHA-1
-P = 140216752278600893405703049381038106466439992842926641456608953608349773182806651998779141954572985837754248088548038650964859967484756133596402858595223598718762187370713301783055866344582170960945605918540977304299009366211417416442912323654642193555012972631965464344489591125740216730885895427547016442089
-Q = 17664434429951611987885446903779562647393233487261
-G = 103172929054303770690939275696854890328330388523369933172989492329033218850064284598935370056999657672388300721493303716791847736030771754006167529200711350097996970123193674509190741058192564015421755738018474299227597843185650645225450031497015978814063018225280067737398554797638834576543770866767917382576
-X = 9216662458075461813441473730167636850659942976016
-Msg = 5075752E
-Nonce = 0AF20FE4162B721067160E55F9BC980AAC8A51BFCC
-Signature = 05B325CB3BAC1A189B132F8F88DB1389958604305104AB71A2C77D8A9C9026559C2E1765D44A81A1178B
-
-Hash = SHA-1
-P = 301164513047973738819737863923065529772693984731550072752736054506472125309312211411181830533992242283304962453762009830563777450843078947095340533761364645205077068779239171754462303166309130350364690633659047670592562646315208077550758968504608591739918637523132651620932257937394751403503356774821801467331
-Q = 17664434429951611987885446903779562647393233487261
-G = 109878721885498452449845699239583955684868586896311014124779988390432343992663258694986210605150036214426823642714691392396570235722052158072237456051272972227372469236772215281153923487765650215573437828715500032798737742846561463845735026996521961545383384496833091910320864533657907014709078376595881364845
-X = 9672614292481226693960166253962510771536576389944
-Msg = 47656E6B696B656E67617220466C61726521
-Nonce = 0A9A8513912E5A2AA2375A50A53E505C0F8D4D0A7F
-Signature = 082B6655BB32ED12D90CA95B8DDCBE36DA1DF3C96F009F88917FCB93F04D6198D438A1EF1FB732914332
-
-Hash = SHA-1
-P = 660703140020436920365598902080870476496289380520011387299596216821937476920314137676598785178807314325545190213504796545881356988471912192081035395040312893960612855628970142307066742368801318589270856537829059208268864011000133840498585189586263066066619720891141025456081333611140755308457869893203540507391
-Q = 87816513021834952061662318874161147590877995550057
-G = 323101247392657525008071693290907082407373408613350240111018443116964264958293859895147919396175836914648220360417188806609171792878531288691654693297452754739705338932798481785294159148443232564990176903662128014218757109880275171610833163055983871798086534511144978777985043569325074103197213925980821084011
-X = 33056640489775673385219123577423039086031497077560
-Msg = 47656E6B696B656E67617220466C61726521
-Nonce = 2A9A8513912E5A2AA2375A50A53E505C0F8D4D0A7F
-Signature = 34CD8EEF38DE00C87C2281ADEA5A597E85AFB8BDB42F59C80618D6EDB7361EF76674C0D535B31BDA3A9A
-
-Hash = SHA-1
-P = 1379780393965363283457320978396480369943480172096934016393316541452868180142317990207432694468437458410025645732990369976516516063729578682052425117598209391471684429328432083412275620773785695067083188346169082283621466740369985366394237631749572014720021772369666276935677436710491086612709427431422684117033
-Q = 87816513021834952061662318874161147590877995550057
-G = 1311969761382233592297578466165621268108129107689358121907769337880867301593670907143892175375566348862635411711374254007220774729472266605648630030603637282192333501605194501700719677843468373081976857008453088208080541406832891414075067602512850266116823025420778037639787577775282728456511758898079378412121
-X = 33056640489775673385219123577423039086031497077560
-Msg = 47656E6B696B656E67617220466C61726521
-Nonce = 2A9A8513912E5A2AA2375A50A53E505C0F8D4D0A7F
-Signature = 3255F933B90A659F32A2CEBDAD6C3465A494A87D350255D303139C95B0B60D3258A060B4510B0F26B22A
-
-Hash = SHA-1
-P = 2215835318919259185407136225166932443628083477708275860820654775805976008986844847116208531154747351262647682385758497411128854630678369023632414267685978088840312891295034156027960434251678198162918925642789892491604036248910534219539204654146485930985719383163759172858331638167627440903411015733068753273027
-Q = 64309387768281421215468729727290653627386295176121
-G = 1475310677586848995805494750762847694416864504694891230462845662059434954071887636112972407455438977563974495334718719978332643627390509315535841598673191776642366618729540242890273779397393741683596497385923869352052197961340599682222007901084919110828432197144483667033529875944525571083261123938926291555084
-X = 63738456098411319716118727591110898184859942159140
-Msg = B5E19E15868A062940B6909033B90A659F32A203
-Nonce = 2B51BC665CF466B2CEC3DCA92F6D8F0F02F6A4F05E
-Signature = 26F372588C0F5C1C71E32CE62E32B35C6A28C0454C0B6E09F2D96697037955B5EB51F38DA7B82F4C2C1B
-
-Hash = SHA-1
-P = 5505419827986981360083225706842467131767674143833794155961952892326024602512762050244188643341345352720149399867357379100834131418709353131827461694214183281686904885134573880240966656029267037736401776255169735480999895658507104122229743232182355716634936075734224169017149362830817700617535698331873614423333
-Q = 64149332069385337811352784807066226782206009894953
-G = 2209689516064916258301675205049467919080756622901846282997645916360951199910468772603886780375737673116724508378029587901519875020180283287060054683322382042615391178144742613811136707400642780906564250493022359468675209660353704542003948653839849585992866634088325506865322813990632995812250475462302465328099
-X = 36554240750905903253864460752696908094868073092201
-Msg = B5E19E15868A062940B6909033B90A659F32A202
-Nonce = 260FE1BF1BC190EB4014A860AD06DAACF0E62B5C2D
-Signature = 06FDDB7CC9347C59CA19C4C1D1489A333C2AC894400BB70AAD611DF63BAB771F0418605456957DA85FEF
-
-Hash = SHA-1
-P = 9250511942545843330250071173117860277568745788853414359370800439964570922849233589996096207730504873439659011115968230464487751688751178048713386511354094948254917838369172236982578927078353941647172074469591206853805560338228966334759312206175943223147016446334199288955810713526193635473525613891428251917643
-Q = 86817770948500646696376153866298303732836782970827
-G = 724918010552210077957259566048848276720076781283162106375865877958493111978322253687534787631911218249370474608056384339729299831713149909912058500497813465443708704666375256581242479984935812641837885785219922258472517621022924127430688333574757524554461547464239654242787326906525790210552401334762974618211
-X = 31970297447971648840599273756646875320184370534450
-Msg = B5E19E15868A062940B6909033B90A659F32A201
-Nonce = 2C6C5DDC20577082E4711D5F1327B0A8EEAA166617
-Signature = 2A8EE316C60FBB17BA8FC78D07402BC3B70E90D7060A80875979E0A2C63F67E871C1B80A2F3ECA1F6FCD
-
-Hash = SHA-1
-P = 19111252109879106551762735748075186208134979696829360100271814234024764304315225414805509744577336657096425461263248528046784276440964807828814289094498689903366980653888641241375585465860443155152933260465951241648574220324726817294643663179877120505866654270179791400891310032585850557581323522175688455763583
-Q = 81922656227567365417492475134687902350001383859709
-G = 14192377354377485672607889615664569982217004959622462208284683423636765305938230251294168377121489109009071925504129143063559851028061260650266772077602325176109397561736099074924449774999498908553216425305363194605557225748874563803272070193223634377877400558810380140400568592238681843565083451652221215870033
-X = 28748754198429578100702948616241622132862396928023
-Msg = 80EC0767A54D67D3E086EE2B47E8527DD71BFC2911B11E40
-Nonce = 23AEAF18FB8F0D808218A587F86C16B16AA5DFA48E
-Signature = 084ECEC098E77A72CDB6AE4BB5B77FD81EA19904962B89AD966FB795F201BE01BA0D5CBA8A63BBBB222D
diff --git a/src/tests/data/pubkey/rsa_sig.vec b/src/tests/data/pubkey/rsa_sig.vec
index 18a9b55d4..c352d9205 100644
--- a/src/tests/data/pubkey/rsa_sig.vec
+++ b/src/tests/data/pubkey/rsa_sig.vec
@@ -148,34 +148,6 @@ Q = 1230750235930523558307236321284100548115636187714970826267882300302842003242
Msg = 7072696F6E636F7270
Signature = 3697C05A657A8904C792E750515BCB11751D2D4C4C1460FA6055A10A2C5F2320CFF2D82C0CF086E2E213CF5C4A4BE890F5C0A9F98789710646A500DA83333AE1CC6A24E99167B97B7E7EC06FDC789037DF23F6FD1608695643C7D7C6462A0B37AD926FCA364A826DE539CC89419C99397C7FA1F1CD244B0C7D3C27E77B6A4D4806E749B1291A23F8F3E6873BC8DE349F871530AE11CF4EC42E27B6E3BACAA3DD6A40AE51463EDE39B510E94F0A177328F868C91B5C35F13AF0FEF0AA4AD88B4D
-Padding = EMSA2(RIPEMD-128)
-E = 65537
-P = 30591693737094154398644675106263504379403477948171972807479302421847529767632977161255649292854912675261964092642711
-Q = 31525024883528724188040731298623782591495821826748348507751579753638841973946458485234899643279818175890294937993923
-Msg = 7072696F6E636F7270
-Signature = 63F9A46002EEDF74A3B21A58AF360C78A0389A6FA469CC6C7F3F37B9298CB666C59CF993CD3EE741C8D6896F61135D2223C3D02B0AE001DF8EC270968F8E999FFD7575F437747E2C0B4181EB3ACFE51ADAD24924D75E86EFA2DF4531FFD1A718
-
-Padding = EMSA2(RIPEMD-128)
-E = 65537
-P = 11368704817493700936626798101362768879783044260988520494361719476728922843998377669065479558745853594969303776632392636949534709425028326966830332407456469
-Q = 9684487867711295418823781796724517181902035719252962858645278138706345583963475964914903197851100677565676778379867627016873935743015879344315952280921497
-Msg = 7072696F6E636F7270
-Signature = 38CDF4F149F7CAE46ECC24C32F98F30A73DA6B57F0281009493CBCCEE2B902F66DCCCFDEBB1422992BBB4D62030D24FF6674C27163CE4015A3BC899CFE6A01ACC06A7E0CC36754ABFAD8D19F5E7372747557FC9B2F5F8F19563F33AFD0D4E3CAF639657922468457E44032E72E865517E095B728E8ED3169D37B45374E53D692
-
-Padding = EMSA2(RIPEMD-128)
-E = 65537
-P = 10956194440658320049047729680960152925819370311069301949033136303301068775619599159427539489120149146834377875796551819542266815993042087568426345655131063
-Q = 11986780240363843518427773639089419606869264001112076030161437852470908569084952935419795370924750564016439000250807088636901980967687072395457882311344897
-Msg = 7072696F6E636F7270
-Signature = 9CC6743EA34FB010B0B64975E37CF4C90BEDC063B9CA90F543CCA616C67D16A8EA0883DCAE11FBA595CA8D42F45DA84532E8173149A55196D01E45588FF372A1D95DEBC58353B3892810F43F58A935E85AFF87B46BCB77C6176422E887BA3671F44BD6112DB0E4A56B44BBED76EFDB01B079C43FE9AD593E65162C9FDB92B42A
-
-Padding = EMSA2(RIPEMD-128)
-E = 65537
-P = 1493081647698257945592425302627367854663037689833333929117233432578015307914302171317912605123690754688685850444755947537141942728014076444513969199742840661797737512811613534281996660649365617513329258624026915628665059410835817137
-Q = 1434999624111100962071127937019397971456655559334726656774903057601210861257928542953329948471592610705125168742255043941163545301111407190719456116794170236473765293978010431337821276552432801148592363931604509551245440889306772481
-Msg = 7072696F6E636F7270
-Signature = 3D2E76A438D4B927C4578B27EAAD666CC041D4495A14A462A530BC81AF115D961C4CF840E9B146C83BE619E9D7730ACC4589DC17665CB4B10A19E021BF4E5BD0F7A1CAF720BC4677B809F6E2BD6A15B94590A5DA3F03E83D819B1A429F22D595D2D042468EF602944508915C88480AAE928ABA32B4CC8FB4C7125496623912FCEBFF28D8DB33CAF008AB6B7195019DF8BAC96E23238EA8EC60D1C9527D91EC4018AA23A50B8B3998BB70006EC441334C1301D0A47C160FCE995A14831A737681
-
Padding = EMSA2(RIPEMD-160)
E = 65537
P = 33925778159875562458694815508122384232436989268432608178008054088773285675555263909583338719156234691017896174716511
@@ -267,13 +239,6 @@ Q = 1300628500736091066469357724169131719350514861299470388096939255066412050709
Msg = 2C88F626457046190AEB16FF2A499DF5820240A5248074445B2D54DDF0C298F57BFF
Signature = 0EB5DC0D319B97F56F1C71E381BC26F40012054BB9A597484946955886F83333D21E916D60C3FB667869383CF9AAF6C0A98641ECECCB9F3BD71943696A78609E6324386B2030D2B2DEF1692677E205282617AA40EBAEB48C86B884CF51884BC807BE2D7C83AE3C671DB24E141B76646F0466B0DBFF20362991D465F7A0F7B4324E54092A742E0FE4C66A200AF324706B7D1BDE1C0371AB5FAFD58EBDE5555D24DECF399553C94E45A3E5B3F491BEF76EA9B08C41C2F233F13F83C99D6D88EDAD
-Padding = EMSA3(MD2)
-E = 65537
-P = 23443439767333138692938389505422341860387525814723848738690073331642118819681
-Q = 23234950162188993388155927630085331316851060055334470382368804331834850828939
-Msg = 45766572796F6E65206765747320467269646179206F66662E
-Signature = 05FA6A812FC7DF8BF4F2542509E03E846E11B9C620BE2009EFB440EFBCC669216994AC04F341B57D05202D428FB2A27B5C77DFD9B15BFC3D559353503410C1E1
-
Padding = EMSA3(MD5)
E = 17
P = 13029564622157791280616891297384459345543528892729268050647908228725108502227809382105716872483480064224030258864846430267698903993578412414816903162894041
diff --git a/src/tests/data/pubkey/rw_sig.vec b/src/tests/data/pubkey/rw_sig.vec
deleted file mode 100644
index 515532f81..000000000
--- a/src/tests/data/pubkey/rw_sig.vec
+++ /dev/null
@@ -1,114 +0,0 @@
-
-E = 2
-P = 109498832837193349942352787694410757220743898293950008902229768464763555846411
-Q = 85230704000388320343522047881225795219999050879145593285943985369507278238159
-Msg = 5075752E
-Signature = 44CB3C6CD992A656AC2D8C92E044FCCC60FAA1B47FE153E7BA4B647136DA4A4288BD50FB0935E3B9180AF477F8B88E1EA1106569CCAB8D354E0A7E3AC92D70B3
-
-E = 2
-P = 109865738846453297504870443124415697975266037607085001559257420422594220882891
-Q = 98694408656025624050695264343005989524606446925918783808403866808761791794879
-Msg = A0C554E8D58C73A23F4725F1429E2F22
-Signature = 444C53E0B8CB70F1E8DC7788D390D4ECED5327800C122AB09C721DD08FE1E51A6FC8840140484014E64DA5D03A4F50ADE0D3E0B7C9C10B84D2B57045D6445121
-
-E = 2
-P = 143336889641615010244496430978489546339101892549496727101913128299881609918627
-Q = 151926545718894569699926859267668314402054550931627831706467116313636054387719
-Msg = CD5D30D1FCCF06CF6733D4416DB31B711461B81D53A855969E0E4A631D65E37B
-Signature = 0047459B8B8A46F43C6E54AA7D5B186AB997653BAFFD6EE9836ED0E4C38D12CCB8A1909A1FC1A4B9078946856287C280DF516BE8BAE4E17A9EECFD04B07F9310CE
-
-E = 2
-P = 182949987979358144640279185334649223492192688082789988743518134058381626294243
-Q = 217661937100392176429471532487409307118283276201469365990573762972129550201199
-Msg = 6BB7CFD26643B1202C3A437C4011DCEC6C3052164C1A5DA06DA42C1344D04CDA
-Signature = 00415BE626CE0173D34AAF57A86E66BC551C77A41AF32EFB64A3861E4F66EFEDDC2591360708B28338DE282F98A9DB05A0F2AD09427798BC98CE79F4D88C5EF1BE
-
-E = 2
-P = 192918421933113071672663571790417136575315830343623361517062943483820137610547
-Q = 219272031000798787900070278061750019215061926937271003090760219962651645895279
-Msg = E8B950C5BC86786FD69BCDF0FF8C5CA1BACE33FAB4260DB5814D8D11B8F1C7F9
-Signature = 00E51E4A98686C324B0356DF93058710E2B13B2FED029B2BF7F15DF8EF9BF209E1DEA5A101E614D6A843B9E4B218633D4D2E88398DF0C919EE9747F0CDEDE943BB
-
-E = 2
-P = 251763799668299139801148051936996493750316333616200301101265631148955054519003
-Q = 273942130639566796395628522491377999143259784737482155942900369025738294484647
-Msg = 54657374696E6720766172696F7573206B657973697A657320666F72205257207369676E6174757265733A2035313220746F203531392C20616E642031303234
-Signature = 0191F1BA45BC571445612D8C1A7818B52DFF78566E6CCFF7AB55B2F35FA21210C951F171E27A2921032718AE01BB4F209164BA0B21A5842D1925B35D09C7538050
-
-E = 2
-P = 409327577911563897329676201153305399224622257769264083949192266671863994023819
-Q = 341703906964487478759596292996274739409750155006525111822762040290119222665991
-Msg = 54657374696E6720766172696F7573206B657973697A657320666F72205257207369676E6174757265733A2035313220746F203531392C20616E642031303234
-Signature = 046C31E4EA320DF130FE1F361184DDC03713BBAC169E08266B91655B42A01F39E1E3FF781B04B2F44B2504F37ACC9688C1ADD7EB94A998779EFCDFBEB9FAFFC82D
-
-E = 2
-P = 542011156169896018363979833341171988540613020356308206083427540015546115987387
-Q = 588172110649890433110066846624960065830759891988972734390859461944450439293431
-Msg = 54657374696E6720766172696F7573206B657973697A657320666F72205257207369676E6174757265733A2035313220746F203531392C20616E642031303234
-Signature = 01BF0E20BF646E5E427B8D28CBAF696D7AA6B6DE878BB91C295D5559B1FA9A94F114FF61C11C0BC97066C2FC919815B0FD150CE70F63D696CEA4D5D1D7BDEDC035
-
-E = 2
-P = 771754770322374918077056807903198519432205177728078647887981967576575978481467
-Q = 786476629036513622552685880695741484791006753374459242149779582249234250146599
-Msg = 990B98BDAB266B4F5775025849FFFA9D344456AD023E7485
-Signature = 05F380320796E88C07170EE43F5497E3A84865E8BCD9EFFBC59D3E18B0CF785D668C5D8F99ECF36CCC4446EE3D3DA96DD5DA01BC2622743F9CF32D4790E3DFC3A9
-
-E = 2
-P = 1148355730975347131387674372822971414014271826139830720434999981897070232737907
-Q = 1254657073389576341606193988392457393961175021782268524267609443939027314335303
-Msg = D31A3E95F25DD795DE8A03C02A728436FE69F47177191183
-Signature = 05F7A7BF7B8A5EFA209885F0BCCF365FB6196E40A271E0000245FCFA98FF6DD5A35D7FBBB7218DC80A2AF20CA4499B8BD283B0DEEB5AF51DE283D054ECCEAA7C28
-
-E = 2
-P = 11920069466388025699244766440706927938965059002714491243177000161378000266109851115065694697794227241273343580951202247629310020256601693186944788025991843
-Q = 10777605005897273896785043775935571603158137557557200763166615929482216506057635943544427604777885488270215488764833385892798734511893248802408897989014263
-Msg = A76359F624250AFA5663B9783DE68D51369D972A89738D1C
-Signature = 26E13DBB1262A91761E6C5E6278401F7E80DB3DF947A81A8574404446D7C095883996CDA19346B0B46DBD38B9AE10ED8A4F76742C352B8DF85F8BC28F7A0BFE8EA0520A63A3B1A492E3D9F7FC492ADFB2295BE8BB6200317963AE978CFF89B300904859EF00FD7784CE630B30066D4500666B1673CD4263B49CFCB3A1D6A51A5
-
-E = 2
-P = 12545037330810088207768168723878733954756730747728115083756898577519070470389840741025833975537982084207671034725541309978724324975075329600505345504520219
-Q = 12870002110810180474990402294641834896535792812534110350536651271565094596430383644373958805954527115948325417945374873044426407582211769447386123601766879
-Msg = 2CA039854B55688740E3
-Signature = 1AF029CBEC9C692CE5096E73E4E9A52EC9A28D207A5511CCEC7681E5E3D867A4AE2E22DE4909D89196A272F1B50DE6FA3248BCA334D46E0D57171A790B6F4697E7BA7047DB79DECD47BD21995243DEBBF25915DDBC93C45875C14DE953792257C5C6825C905AFF40109C8CC7E793123D47AC1B5B6304A436CFA9BEEC8E0054E7
-
-E = 2
-P = 12545037330810088207768168723878733954756730747728115083756898577519070470389840741025833975537982084207671034725541309978724324975075329600505345504520219
-Q = 12870002110810180474990402294641834896535792812534110350536651271565094596430383644373958805954527115948325417945374873044426407582211769447386123601766879
-Msg = 2119A954F1AC0F3DCDB2
-Signature = 60C3CCF4F086B15B7F850B445F384333F7AE5A4B5EDE2820C7233239E1B86D6E4B4FCA4F50B087CE1DF17DA5D62672A17F2CF87A2875BBD9B138CAF6863821D6A4D553E9EB64C9254A8F9A6B960E57E39069D65E3F561AA1FA91643D42FEEFB9270D34AB0861DEA1E234EA587F580503D46A1989D413DAC2FFE0FC4CA663CE68
-
-E = 2
-P = 12545037330810088207768168723878733954756730747728115083756898577519070470389840741025833975537982084207671034725541309978724324975075329600505345504520219
-Q = 12870002110810180474990402294641834896535792812534110350536651271565094596430383644373958805954527115948325417945374873044426407582211769447386123601766879
-Msg = 7A4C634DE6F16315BD5F
-Signature = 308A5D65224201BED626CC83FB901EC84874EE03B2E7AB4E752EDBDE024C754E3CC9841CA062100A8843DE9183354B4E0596E8C68F1605828287884F0F9BA6968FC7A9F0CA09418A8485B90465E5D3F96CE4995A5FC7A6E5ABD9CC06BB8A2C3C8109F72EAE67FB4C108852C881CA645B3C5586F27F12FF3028ADE56E32AD9434
-
-E = 2
-P = 157704599352069859921156397442363312110769306142195838598773542758154595866567210022640109888478413022709250917899819531357360018250143692500197076580934099
-Q = 207895480306421993885928959277756332378135790107557439472247328444554879933219045837896240872517904914421631349451165104093054667050399312478738341782350039
-Msg = EF0F1D56F4E5D587C212
-Signature = 3E544FEBB6623F5D392003B729FE2BFC20E2CB3ECAC22734DFCA55150254E616A41C5E54CE3B50FBC2FE2363EE9AF9B15C70615497B0A458F8AB6D850992EEEB56D65F87EA1BD6E2B4B7E40A0F5E1635C7DDB17110C61039CF712D3524C9C2C1F35D9163BE5C70276F46634514BE16EC09602782E88FE74EAEB2F50CBB0E3B5C4A
-
-E = 2
-P = 157704599352069859921156397442363312110769306142195838598773542758154595866567210022640109888478413022709250917899819531357360018250143692500197076580934099
-Q = 207895480306421993885928959277756332378135790107557439472247328444554879933219045837896240872517904914421631349451165104093054667050399312478738341782350039
-Msg = EC5CC4228C3C70EE8F35
-Signature = 228BAA85062F10DCC9D99A23D340BC4B9E463D8AB86A6781A6D2143564303E2DC78772BF68449BE1E2711A68D5A15CF04A23573FB3870454308F583BBB5F2467069EF1395431E70F91BD56D846DC8DB2E88AB3D26A9770660B87A76D6C3575DE512BAFA8A0B901AD15B7D8E8BE2F176A182D16A9609F19A4298416245873175805
-
-E = 2
-P = 157704599352069859921156397442363312110769306142195838598773542758154595866567210022640109888478413022709250917899819531357360018250143692500197076580934099
-Q = 207895480306421993885928959277756332378135790107557439472247328444554879933219045837896240872517904914421631349451165104093054667050399312478738341782350039
-Msg = FEF5EE07C74118DA30B9
-Signature = 2637E16E2599B6EC2F4728C73D3B29F483C2B881F1E1969C426027605EF080E9B17D258D5E1EBC6472A2501E04CF19C144537FCB38A1DA00D948EBD39FA11322D9230B62E2C12AEDB366BD85A2089588A8D52E941FD986D89828A342B83438A960B6FD87E9AD025AD75A692AA9DFEA873A9467B42D84879E85C5D11EFAB347FBED
-
-E = 2
-P = 175929136695235398623978468982850882403177251171692053453163550527817444539242668478665523777116321800265560553921886249250653855011544289712550979662853142733380647502828837599849362421137735579029747170330078887639249000639490211840143752226146930789086027815718983074897826279804793994355341993150274152459
-Q = 131219248820237432230459994108611509842674503136881955113016298751051553750310448066570966264819272949229207100348941583625652701978979515213283684339178766873393297204552194591324343169883183564987140838254688839495455182007213365712028901853100685930521016622466535780176408252821208461989118980161415019487
-Msg = 15E7B7B7ED0F176B6799
-Signature = 39FF4B5FA50AE498F3C91A655E6865840D1FC401EE02DBC8460A59DEB8816E6680F712B7BAF8D4DC11A3B54BF906BE698306F0449BB43F3F223B944D930A1A3C718E8A9E2EEDEC5A07AB817C26A80CC2A2EE2846A597EAB8A999D38DB98490166F2574524038BBDF24B4E4622C843210C6B94987638C6976562EA9727385B152614C18349BD54AD95DE33D5354954B505E5259CCDA47E3CECEF3154F6E5481E536BAB568146A0BFCB66573714A7BA7ABE0385115720687F33D9C6EF6BB60272F1272CF349990E3A2FBCCE180B730792101089B164AE5A001F5263F7493AF148D6E0953E311AD12E4202D35F96DD30885663B5101F9B05675FCD2FCC4FCC4DDFF
-
-E = 2
-P = 175929136695235398623978468982850882403177251171692053453163550527817444539242668478665523777116321800265560553921886249250653855011544289712550979662853142733380647502828837599849362421137735579029747170330078887639249000639490211840143752226146930789086027815718983074897826279804793994355341993150274152459
-Q = 131219248820237432230459994108611509842674503136881955113016298751051553750310448066570966264819272949229207100348941583625652701978979515213283684339178766873393297204552194591324343169883183564987140838254688839495455182007213365712028901853100685930521016622466535780176408252821208461989118980161415019487
-Msg = B36724C92954C38D0288
-Signature = 3C8CD3614555568BBECA99174B7B203D0BC6FABE9E6FFE0C41EB4D9A2C601D2393CA1E01B7D7E99337758AC914C9F151311E5AE6708DAF1D8C825DA471652C6E13A8FE5802D7AE097BFC899A4EC8CA235B5982B9058C53AAD52823ACF692290EB8823C126635AB0BBF101C2B3149AB16183FA2DBB049DDB99C5E83723E4D4693CA3A08588AA868C677D42ABDAA6586EF192391D276C5E5AF0763ACCA6293F06250C51FDC2AD369CD44EB5F654E98761C881DDEC08E795FFB229B20522349B0714059E18B7B23A48875EAB12ED3F0A011D3A985DD7384B0046F39FA6C1A331F3D4C5125100BA58666935C68A7A10849D9C74850BAB82AE15EC950A283F3E7DAD8
diff --git a/src/tests/data/pubkey/rw_verify.vec b/src/tests/data/pubkey/rw_verify.vec
deleted file mode 100644
index 56eaeccae..000000000
--- a/src/tests/data/pubkey/rw_verify.vec
+++ /dev/null
@@ -1,45 +0,0 @@
-
-E = 2
-N = 161454656927718347546710495694108529777245911373659826842829267986614546594045217933996260902225693470782367852921548571818741091142328119451183980020737294116588677127973118579514046427857660817897020988337799668966050218796197424008138916049541798309364039036236330944419873716106449892609340592749580026501
-Msg = 2A51DF4AF88613D91A37
-Signature = 6FF18F4471E1A8F850C910A181A9F28E69AACD8E8126969605E000A853197541AF9047E5D17315BF062B9CD8DF91196F0343285D9E31D5C72560C156782B6D0E5AF8F06D7DCDD8CABEC01B2438C168C40C21F6A8794648361BD2AEE13573A49ECA07A7EED97C0B9C5B1E508869E4CFD5FE1771924B1CF5A4BFF7D4379E5CD59F
-
-E = 2
-N = 161454656927718347546710495694108529777245911373659826842829267986614546594045217933996260902225693470782367852921548571818741091142328119451183980020737294116588677127973118579514046427857660817897020988337799668966050218796197424008138916049541798309364039036236330944419873716106449892609340592749580026501
-Msg = 1CF8DDD95D780A89D7CF
-Signature = 539C266B0313E0E256ED98EEF13E6AE64CED90C160A4999B3D47CBDA5285DAB0E0678C0E079CE9B8EB23E10EDFACFC19A80EEBB8F38ED5B5D6C8A988AB8CEC40A5A5BA102F75586167EAB6D5BF0CE8FF30C656895800F6F1B37D69FBBAF9055F7505DBEB537C0F986A1B5F0270DC12A640FFCB626F9763FDCFEFA1208C104003
-
-E = 2
-N = 161454656927718347546710495694108529777245911373659826842829267986614546594045217933996260902225693470782367852921548571818741091142328119451183980020737294116588677127973118579514046427857660817897020988337799668966050218796197424008138916049541798309364039036236330944419873716106449892609340592749580026501
-Msg = F6959926E6D9D37D8BC0
-Signature = 249E1066542618CE0D236A7174708F801E7AB257931E9967A65C483ED66FB58598F99B6664AF0EAE221E2A6B271D7D17875ED02BF7FE35AA0786023858521CB79FEE0D134D9DDA609B0270FC9804BB6BF74AD90AE11EB339353533DC0D5A69E6B8758212B86024ED563767EA5D9B59655E0B8CC21244F720BA4ED663BF668E3A
-
-E = 2
-N = 32786073428830410300284398130917235885067430238109848936605383675780141752060601429462102909027763036198820309290723334169722464563078967493471762466687109286253939743688211922523861101766022434426241688525377498535565035820609539198077315872030442353465034902603192318438957229679544105479421156369538009079861
-Msg = 2C9EA313EACF2C5DA43A
-Signature = 1FEFF88814BB53E447E1E955AC8F1AF597C15C3866033E337AFBAB8627306F2EC1276621FF2176C89323CE32EA20F6AEC2CC271F1ED749408B2A3E43A23A44D6A3F38DCDDCAB696B239110AA7ECF12C6681B0E97E6FFF1B72F4F6D796BF82B9450AB8B3D28CA9D220BDF84ACCEA1DA5EDA0B470C3A82BBDD77B4C2723297608BD4
-
-E = 2
-N = 32786073428830410300284398130917235885067430238109848936605383675780141752060601429462102909027763036198820309290723334169722464563078967493471762466687109286253939743688211922523861101766022434426241688525377498535565035820609539198077315872030442353465034902603192318438957229679544105479421156369538009079861
-Msg = 0B9554FFE4F6ADAB2C76
-Signature = 095952F24D9FBEF3A93A932865F4BDBB522CF24EBE153CE4BBB24CF301A1C7B51FE47B94F8F8B211CBC5A926FF6BAF9A6BBF7E15975D2DCCB95EF01AB7E641687870B0D01FC18B6B16FE17D3FC82931FBBCD4FD18C7F9588CEE8491876D72F98F2E7EEA90C12907210D6859053ADC7178B87BF8B4826954D6986FE761E71E1B7EA
-
-E = 2
-N = 23085289162741657527840167277266509664124085355414549040512530339697658387985567689334460418487839008934878679957217276034762867535322838769309710601133720477419144651652431984020413179219099708493077666967073038701913036009744973121934238964755003870653746948359481987956885300823356903154270243367915826847703878822563963033648087127205805904895271584100346005591610792553114534696786749743262897187409362428960073234641477114369452520945902014227194038301981685731937113320369353918470275156548959860091573626887579450283427370674385898724855497767152486821298218877895649195196037107789007826511494658561893968533
-Msg = 00AA5515CDAE5CD0F0DC
-Signature = 30EECA6B48D796552F5A6A3C11F28D730FA077422CAAB34FDEB879AE0F71DF21330E2F3BE5BF3A8CA372EBCD3DFA7C81B3398C31B0972D0B857926CB39732351AACEB8276D52B9D82F9C245FA0F1CF49E785A2BC00FF27FBCF777F84D05BEF17FCC0505820B029AC8F0CE17D2469372CE47E1428BB941004FE170EF87163E07298EFFCC1BFA7E7CB1F572C340CAA075A5962A15B69CE937BC7EFB492F501FC88CBF0119C351C8498782091EF6EFB19120195E5FF51DF86F90E90FAEB225AA2EE43AB4E8358101C0348C7E3859B9DEBA19464C74B74AC48A0B73FC8D2E7F8033E86208F0792B6E5B6DE36C99DEF604949811D1671EF6B0A4781B4E7A0A72AD855
-
-E = 2
-N = 23085289162741657527840167277266509664124085355414549040512530339697658387985567689334460418487839008934878679957217276034762867535322838769309710601133720477419144651652431984020413179219099708493077666967073038701913036009744973121934238964755003870653746948359481987956885300823356903154270243367915826847703878822563963033648087127205805904895271584100346005591610792553114534696786749743262897187409362428960073234641477114369452520945902014227194038301981685731937113320369353918470275156548959860091573626887579450283427370674385898724855497767152486821298218877895649195196037107789007826511494658561893968533
-Msg = B8E2FB9EAE22FB2C0021
-Signature = 416D33F8C213CF81F805F54FC1D4E7C6A588A0965F1C9CAEEA1D41452E20935AAF2D30F957584B56621035430212A428E27A2F687CA9DBB596C19864AE692EF7BBA730F3D70CC2DDE15AB71E1E350C0C316EFA1A831ACD1441598B112482487DF72F58ED318182C7CD0906FE39C5655BF1313F29A15D60A6178CBF600C7FBFF8994840ED649C3C4026A463B3EA39C692B7D112B128BE49E1E32D4A7FF8D4513283D8DCD9CCB8FB7300BE0BDD4C44DAA2F7049B3AD83437093E623442AC69B48911CDA21E95E0775041F67F6E6AE01DCE646AEC20908E7C1B693600FE41ABA85AC0C778641E46C419083E41773C749DB3E1BD8FD764E271860D2D7F8E11BD6AB3
-
-E = 2
-N = 23085289162741657527840167277266509664124085355414549040512530339697658387985567689334460418487839008934878679957217276034762867535322838769309710601133720477419144651652431984020413179219099708493077666967073038701913036009744973121934238964755003870653746948359481987956885300823356903154270243367915826847703878822563963033648087127205805904895271584100346005591610792553114534696786749743262897187409362428960073234641477114369452520945902014227194038301981685731937113320369353918470275156548959860091573626887579450283427370674385898724855497767152486821298218877895649195196037107789007826511494658561893968533
-Msg = 8C8C306A629373BAE647
-Signature = 0E9A00045FFD399D9DA9D0D7E543CF9FFD098BC23E72DD7763A64F22C7F0479CE866E31438B8F7DE31A18F35AF419BED6C67BE1540614D3310DD24F019E14FCC3AF73743F4C143D4B79CDF35C752A300F0A8251CCFF4AAF18785C533A7DF1A20AFE6770DEBD1B8BA2C83B2E345A04F833CD173E998FF9840C2F8A370FFDCFF5FD95CBD71B25FC9972192470FD145975344F64C2F6D68CB3513F48F9FC070021BEE8F6A4282D098C44DF655CE415E89B97994AE3ABE85986C7EE0AC348EF2A4F52D102EA80836E77E81AD3678803E53C83CF2F30D2D4950FB6B038CCB3F2690A9381EB34D6C09E88C090AB05E28047DC490EB8A1282FEB38E82FB0B18309284C4
-
-E = 2
-N = 23085289162741657527840167277266509664124085355414549040512530339697658387985567689334460418487839008934878679957217276034762867535322838769309710601133720477419144651652431984020413179219099708493077666967073038701913036009744973121934238964755003870653746948359481987956885300823356903154270243367915826847703878822563963033648087127205805904895271584100346005591610792553114534696786749743262897187409362428960073234641477114369452520945902014227194038301981685731937113320369353918470275156548959860091573626887579450283427370674385898724855497767152486821298218877895649195196037107789007826511494658561893968533
-Msg = FA95400C2B14E064F76A
-Signature = 3F67F9DBEB88E6AD057BEDC3D97030555A908867EC578A6CA572137CB61C21036AADE6DDC5592EC7CCB6B263E51B4C886A51904C858040E493D64B9ACE5BAA50C4A66D04ACCDFE0039D8541C4363DEFFCF93BDF5F5CC1FB64855D956B5EFD42D4C9B96B9CBAA97A32F02AAB307674E53404E6836DB5C96B59572ADBFD1113B87608ACE6D0898CB02E35575CC28D38A9FF8C1C4AD36BAA991DEFAB533F0A6C9C2F0F0815F1D659ED576E5DB18494A54B6817D9E34A134F3B9A0F1E8C77FC204B6EE087C0445A7036C935117E338D092F6E1FF4DF7605525C409456A5195233A176B29B2FD8FB2808D0412FCA0541B2BB6800BD8BB9DC9DC25230166071E8D961E
diff --git a/src/tests/data/stream/chacha.vec b/src/tests/data/stream/chacha.vec
index f51ff0812..47d3aa7fe 100644
--- a/src/tests/data/stream/chacha.vec
+++ b/src/tests/data/stream/chacha.vec
@@ -4,17 +4,14 @@
Key = 00000000000000000000000000000000
Nonce = 0000000000000000
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = E28A5FA4A67F8C5DEFED3E6FB7303486AA8427D31419A729572D777953491120B64AB8E72B8DEB85CD6AEA7CB6089A101824BEEB08814A428AAB1FA2C816081B
Key = 0000000000000000000000000000000000000000000000000000000000000000
Nonce = 000000000000000000000002
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = FD74BC4D822E344ACA041ACB39789BDA359D16B7709A7676B03B0F06117685B33B5E1E7DB844BE88ACCFC8370C808FB4BFBFDE831358476F09E34F2045AE61C0AC4120E44862548D3E5B577C695005115CFB158B9B6341BFC0561B9EAEE34D114583FB5FC901D5EA85019EAD2D4F618A5FC97954A5913576CD6BA32E710DA15A52D9A5B74B6E2F1D333C6405A5D6F64E2B1CED579A5FFBEB390A756755FED56AF37061CCC3A1D4DF6421F7A4D7811919F95A7F8533826DAB256A09E58CBFC5A04F83B063BBB169D2B05AFA6C8B3EC5880DB3346193860671AFFB3F9A5B56F771231393330816FFBD0E66F6D6B598178461CF5BE424A84A8D426DDB4B88FCB275
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 2E214501D03825E75AC476151531939D6DB48E04588D91CB6CAC080F87CDF6A95C6A0245E0333A970BB8E8C373A0CA81E2592224712B8002D3AA52835DF513F5D4CCCD346E24968A9BBE43C770EF563968821B21FDF26583F51D9F3ED89EBA912B2EC460C460BE062B8AE3604569FDFD0B1312F7705E9D7A33DCBE720D69308CD89AC06C58545C47148BD68C1E61A838DD3BFB88A5ADC721DEAB8147B9EC16A77FC8466C0B791D29AC2068769D8AA54A5D15A11580FA9A375F2D0072E1FB8EF5A27EF31B7710E196B3D061C911FFA93D067364D23B1FE69EA1318202BF94C8718CB44F4383D678C493A5C5502F02A9BA861534DD2BDC9559587BFEED4A08F5C3
# Test vector in a draft "Test Vectors for the Stream Cipher ChaCha draft-strombergson-chacha-test-vectors-00" available at the following link: http://tools.ietf.org/html/draft-strombergson-chacha-test-vectors-00.
@@ -22,82 +19,66 @@ Out = 2E214501D03825E75AC476151531939D6DB48E04588D91CB6CAC080F87CDF6A95C6A0245E0
Key = 00000000000000000000000000000000
Nonce = 0000000000000000
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = E28A5FA4A67F8C5DEFED3E6FB7303486AA8427D31419A729572D777953491120B64AB8E72B8DEB85CD6AEA7CB6089A101824BEEB08814A428AAB1FA2C816081B8A26AF448A1BA906368FD8C83831C18CEC8CED811A028E675B8D2BE8FCE081165CEAE9F1D1B7A975497749480569CEB83DE6A0A587D4984F19925F5D338E430D
Key = 0000000000000000000000000000000000000000000000000000000000000000
Nonce = 0000000000000000
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 3E00EF2F895F40D67F5BB8E81F09A5A12C840EC3CE9A7F3B181BE188EF711A1E984CE172B9216F419F445367456D5619314A42A3DA86B001387BFDB80E0CFE42D2AEFA0DEAA5C151BF0ADB6C01F2A5ADC0FD581259F9A2AADCF20F8FD566A26B5032EC38BBC5DA98EE0C6F568B872A65A08ABF251DEB21BB4B56E5D8821E68AA
Key = 01000000000000000000000000000000
Nonce = 0000000000000000
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 03A7669888605A0765E8357475E58673F94FC8161DA76C2A3AA2F3CAF9FE5449E0FCF38EB882656AF83D430D410927D55C972AC4C92AB9DA3713E19F761EAA147138C25C8A7CE3D5E7546746FFD2E3515CE6A4B1B2D3F380138668ED39FA92F8A1AEE36258E05FAE6F566673511765FDB59E05163D55A708C5F9BC45045124CB
Key = 0100000000000000000000000000000000000000000000000000000000000000
Nonce = 0000000000000000
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = CF5EE9A0494AA9613E05D5ED725B804B12F4A465EE635ACC3A311DE8740489EA289D04F43C7518DB56EB4433E498A1238CD8464D3763DDBB9222EE3BD8FAE3C8B4355A7D93DD8867089EE643558B95754EFA2BD1A8A1E2D75BCDB32015542638291941FEB49965587C4FDFE219CF0EC132A6CD4DC067392E67982FE53278C0B4
Key = 00000000000000000000000000000000
Nonce = 0100000000000000
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 25F5BEC6683916FF44BCCD12D102E692176663F4CAC53E719509CA74B6B2EEC85DA4236FB29902012ADC8F0D86C8187D25CD1C486966930D0204C4EE88A6AB355A6C9976C7BC6E78BAF3108C5364EF42B93B35D2694D2DDF72A4FC7ECDB968FCFE16BEDB8D48102FB54F1CE3636E914C0E2DADC7CAA2AB1929733A9263325E72
Key = 0000000000000000000000000000000000000000000000000000000000000000
Nonce = 0100000000000000
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 2B8F4BB3798306CA5130D47C4F8D4ED13AA0EDCCC1BE6942090FAEECA0D7599B7FF0FE616BB25AA0153AD6FDC88B954903C22426D478B97B22B8F9B1DB00CF06470BDFFBC488A8B7C701EBF4061D75C5969186497C95367809AFA80BD843B040A79ABC6E73A91757F1DB73C8EACFA543B38F289D065AB2F3032D377B8C37FE46
Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Nonce = FFFFFFFFFFFFFFFF
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 2204D5B81CE662193E00966034F91302F14A3FB047F58B6E6EF0D721132304163E0FB640D76FF9C3B9CD99996E6E38FAD13F0E31C82244D33ABBC1B11E8BF12D9A81D78E9E56604DDFAE136921F51C9D81AE15119DB8E756DD28024493EE571D363AE4BBCD6E7D300F99D2673AEB92CCFC6E43A38DC31BACD66B28F17B22B28A
Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Nonce = FFFFFFFFFFFFFFFF
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = E163BBF8C9A739D18925EE8362DAD2CDC973DF05225AFB2AA26396F2A9849A4A445E0547D31C1623C537DF4BA85C70A9884A35BCBF3DFAB077E98B0F68135F5481D4933F8B322AC0CD762C27235CE2B31534E0244A9A2F1FD5E94498D47FF108790C009CF9E1A348032A7694CB28024CD96D3498361EDB1785AF752D187AB54B
Key = 55555555555555555555555555555555
Nonce = 5555555555555555
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = F0A23BC36270E18ED0691DC384374B9B2C5CB60110A03F56FA48A9FBBAD961AA6BAB4D892E96261B6F1A0919514AE56F86E066E17C71A4176AC684AF1C931996950F754E728BD061D176ECF571C62A5EA5C776697B3193D3EA94CF17D7F0A14E504859D1A67C248AB298BE3BB7EDED3A23F61B6C5BD1A5A4CFC84BFC3D295AC5
Key = 5555555555555555555555555555555555555555555555555555555555555555
Nonce = 5555555555555555
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 7CB78214E4D3465B6DC62CF7A1538C88996952B4FB72CB6105F1243CE3442E2975A59EBCD2B2A598290D7538491FE65BDBFEFD060D88798120A70D049DC2677DD48FF5A2513E497A5D54802D7484C4F1083944D8D0D14D6482CE09F7E5EBF20B29807D62C31874D02F5D3CC85381A745ECBC60525205E300A76961BFE51AC07C
Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Nonce = AAAAAAAAAAAAAAAA
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 312D95C0BC38EFF4942DB2D50BDC500A30641EF7132DB1A8AE838B3BEA3A7AB03815D7A4CC09DBF5882A3433D743ACED48136EBAB73299506855C0F5437A36C6EF5AD3D6A4F6C35D9D66C2E34005B91BBBE3099E135A00CE2F700745BE6253195824D4B19F69731B6177E624358C7977E67552F519B470E3F7A8EC965DC3BEDA
Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Nonce = AAAAAAAAAAAAAAAA
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 40F9AB86C8F9A1A0CDC05A75E5531B612D71EF7F0CF9E387DF6ED6972F0AAE21311AA581F816C90E8A99DE990B6B95AAC92450F4E112712667B804C99E9C6EDAF8D144F560C8C0EA36880D3B77874C9A9103D147F6DED386284801A4EE158E5EA4F9C093FC55FD344C33349DC5B699E21DC83B4296F92EE3ECABF3D51F95FE3F
Key = 00112233445566778899AABBCCDDEEFF
Nonce = 0F1E2D3C4B5A6978
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 29560D280B4528400A8F4B795369FB3A01105599E9F1ED58279CFC9ECE2DC5F99F1C2E52C98238F542A5C0A881D850B615D3ACD9FBDB026E9368565DA50E0D49DD5BE8EF74248B3E251D965D8FCB21E7CFE204D4007806FBEE3CE94C74BFBAD2C11C621BA048147C5CAA94D182CCFF6FD5CF44ADF96E3D68281BB49676AF87E7
Key = 00112233445566778899AABBCCDDEEFFFFEEDDCCBBAA99887766554433221100
Nonce = 0F1E2D3C4B5A6978
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = DB43AD9D1E842D1272E4530E276B3F568F8859B3F7CF6D9D2C74FA53808CB5157A8EBF46AD3DCC4B6C7DADDE131784B0120E0E22F6D5F9FFA7407D4A21B695D9C5DD30BF55612FAB9BDD118920C19816470C7F5DCD42325DBBED8C57A56281C144CB0F03E81B3004624E0650A1CE5AFAF9A7CD8163F6DBD72602257DD96E471E
Key = C46EC1B18CE8A878725A37E780DFB735
Nonce = 1ADA31D5CF688221
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 6A870108859F679118F3E205E2A56A6826EF5A60A4102AC8D4770059FCB7C7BAE02F5CE004A6BFBBEA53014DD82107C0AA1C7CE11B7D78F2D50BD3602BBD25940560BB6A84289E0B38F5DD21D6EF6D7737E3EC0FB772DA2C71C2397762E5DBBBF449E3D1639CCBFA3E069C4D871ED6395B22AAF35C8DA6DE2DEC3D77880DA8E8
Key = C46EC1B18CE8A878725A37E780DFB7351F68ED2E194C79FBC6AEBEE1A667975D
Nonce = 1ADA31D5CF688221
-In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 838751B42D8DDD8A3D77F48825A2BA752CF4047CB308A5978EF274973BE374C96AD848065871417B08F034E681FE46A93F7D5C61D1306614D4AAF257A7CFF08B16F2FDA170CC18A4B58A2667ED962774AF792A6E7F3C77992540711A7A136D7E8A2F8D3F93816709D45A3FA5F8CE72FDE15BE7B841ACBA3A2ABD557228D9FE4F
[ChaCha(12)]
@@ -107,40 +88,33 @@ Out = 838751B42D8DDD8A3D77F48825A2BA752CF4047CB308A5978EF274973BE374C96AD8480658
Key = 80000000000000000000000000000000
Nonce = 0000000000000000
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 36CF0D56E9F7FBF287BC5460D95FBA94AA6CBF17D74E7C784DDCF7E0E882DDAE3B5A58243EF32B79A04575A8E2C2B73DC64A52AA15B9F88305A8F0CA0B5A1A25
Key = 0F62B5085BAE0154A7FA4DA0F34699EC3F92E5388BDE3184D72A7DD02376C91C
Nonce = 288FF65DC42B92F9
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 49FD8FBF19EDCF3A198F5226AA480B97D9F16BA71A693C4ECB90C276094585DFA4FA259E1EC34DE444C92879BFE7F641EEAC480168DC8969A9C033151B1E9229
[ChaCha(20)]
Key = 00000000000000000000000000000000
Nonce = 0000000000000000
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 89670952608364FD00B2F90936F031C8E756E15DBA04B8493D00429259B20F46CC04F111246B6C2CE066BE3BFB32D9AA0FDDFBC12123D4B9E44F34DCA05A103F
# From draft-agl-tls-chacha20poly1305-01
Key = 0000000000000000000000000000000000000000000000000000000000000000
Nonce = 0000000000000000
-In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 76B8E0ADA0F13D90405D6AE55386BD28BDD219B8A08DED1AA836EFCC8B770DC7DA41597C5157488D7724E03FB8D84A376A43B8F41518A11CC387B669
Key = 0000000000000000000000000000000000000000000000000000000000000001
Nonce = 0000000000000000
-In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 4540F05A9F1FB296D7736E7B208E3C96EB4FE1834688D2604F450952ED432D41BBE2A0B6EA7566D2A5D1E7E20D42AF2C53D792B1C43FEA817E9AD275
Key = 0000000000000000000000000000000000000000000000000000000000000000
Nonce = 0100000000000000
-In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = EF3FDFD6C61578FBF5CF35BD3DD33B8009631634D21E42AC33960BD138E50D32111E4CAF237EE53CA8AD6426194A88545DDC497A0B466E7D6BBDB004
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 0001020304050607
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = F798A189F195E66982105FFB640BB7757F579DA31602FC93EC01AC56F85AC3C134A4547B733B46413042C9440049176905D3BE59EA1C53F15916155C2BE8241A38008B9A26BC35941E2444177C8ADE6689DE95264986D95889FB60E84629C9BD9A5ACB1CC118BE563EB9B3A4A472F82E09A7E778492B562EF7130E88DFE031C79DB9D4F7C7A899151B9A475032B63FC385245FE054E3DD5A97A5F576FE064025D3CE042C566AB2C507B138DB853E3D6959660996546CC9C4A6EAFDC777C040D70EAF46F76DAD3979E5C5360C3317166A1C894C94A371876A94DF7628FE4EAAF2CCB27D5AAAE0AD7AD0F9D4B6AD3B54098746D4524D38407A6DEB
# From draft-irtf-cfrg-chacha20-poly1305-03
@@ -150,407 +124,347 @@ Nonce = 000000000000000000000002
In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = C2C64D378CD536374AE204B9EF933FCD1A8B2288B3DFA49672AB765B54EE27C78A970E0E955C14F3A88E741B97C286F75F8FC299E8148362FA198A39531BED6D
+# Long output tests generated by DJB ref impl
+
+Key = 0000000000000000000000000000000000000000000000000000000000000000
+Nonce = 000000000000000000000000
+Out = 76B8E0ADA0F13D90405D6AE55386BD28BDD219B8A08DED1AA836EFCC8B770DC7DA41597C5157488D7724E03FB8D84A376A43B8F41518A11CC387B669B2EE65869F07E7BE5551387A98BA977C732D080DCB0F29A048E3656912C6533E32EE7AED29B721769CE64E43D57133B074D839D531ED1F28510AFB45ACE10A1F4B794D6F2D09A0E663266CE1AE7ED1081968A0758E718E997BD362C6B0C34634A9A0B35D012737681F7B5D0F281E3AFDE458BC1E73D2D313C9CF94C05FF3716240A248F21320A058D7B3566BD520DAAA3ED2BF0AC5B8B120FB852773C3639734B45C91A42DD4CB83F8840D2EEDB158131062AC3F1F2CF8FF6DCD1856E86A1E6C3167167EE5A688742B47C5ADFB59D4DF76FD1DB1E51EE03B1CA9F82ACA173EDB8B7293474EBE980F904D10C916442B4783A0E984860CB6C957B39C38ED8F51CFFAA68A4DE01025A39C504546B9DC1406A7EB28151E5150D7B204BAA719D4F091021217DB5CF1B5C84C4FA71A879610A1A695AC527C5B56774A6B8A21AAE88685868E094CF29EF4090AF7A90CC07E8817AA528763797D3C332B67CA4BC110642C2151EC47EE84CB8C42D85F10E2A8CB18C3B7335F26E8C39A12B1BCC1707177B76138732EEDAAB74DA1410FC055EA068C99E9260ACBE337CF5D3E00E5B3230FFEDB0B990787D0C70E0BFE4198EA6758DD5A61FB5FEC2DF981F31BEFE153F81D17161784DB1C8822D53CD1EE7DB532364828BDF404B040A8DCC522F3D3D99AEC4B8057EDB8500931A2C42D2F0C570847100B5754DAFC5FBDB894BBEF1A2DE1A07F8BA0C4B919301066EDBC056B7B481E7A0C46297BBB589D9DA5B675A6723E152E5E63A4CE034E9E83E58A013AF0E7352FB7908514E3B3D1040D0BB963B3954B636B5FD4BF6D0AADBAF8157D062ACB2418C176A475511B35C3F6218A5668EA5BC6F54B8782F8B340F00AC1BEBA5E62CD632A7CE7809C725608ACA5EFBF7C41F237643F06C0997207171DE867F9D697BF5EA6011ABCCE6C8CDB211394D2C02DD0FB60DB5A2C17AC3DC85878A90BED3809DBB96EAA5426FC8EAE0D2D65C42A479F088648BE2DC801D82A366FDDC0EF234263C0B6417D5F9DA41817B88D68E5E67195C5C1EE3095E821F22524B20BE41CEB590412E41DC648843FA9BFEC7A3DCF61AB0541573316D3FA8151629303FE9741562ED065DB4EBC0050EF558364AE81124A28F5C01313232FBC496DFD8A2568657B686D7214382A1A00903017DDA969878442BA5AFFF6613F553CBB233CE46D9AEE93A7876CF5E9E82912B18CADF0B34327B2E0427ECF66B7CEB7C0918DC47BDFF12A062ADF07133009CE7A5E5C917E0168306109B7CB49653A6D2CAEF005DE783A9A9BFE05381ED1348D94EC65886F9C0B619C52C5533800B16C836172B95182DBC5EEC042B89E22F11A085B739A3611CD8D836018C4FFF0B86C02ED662D2D2522647A1F09A7B2F9EEA56E7E20B1F06CCDD9CEC37E3B2D20812DF369978636C22646603675804104745D2997E28DF5D8242AAD19C8120CA4142FB6019FCCECF9FADB04ADE03B341E3FC77201B3DC957A8097AB2F615AFF142AB753811D5F32E75BC8825B456555F3D179FFABCF35F6AE61365851F3F681A2E86E8078B064976646186394CB9064767750DAD4E336B8F1D20FE2C13C6248D3D73D4D66D9C8587AC68A7976A3BBB8B5808320607400DBDB1918E3D3B90CFC38C4DDFADE990A213D208FBF7898334F4DEED7E5830FD266751315435AE19BB94F4D3DC92652F243DD1F96F3595AB473D2356D8FA8F6D64CC4F64B12CA99ECDD1962572E6ADD609D9C619AAB678B3FC298BC2F0F81FEB4F0D3EBAD7E850A8BCB52CA467E649DE2DB913BFDA001294C49DC369F7D14CC25C5FA65D4D5AF6A436D22BD2839BE23DD3C57825033FECDCE2DED6C511DBEAF4DF2B4CBB7AF8215BB48A550F57D02750E599298F512B1EC1829722FC10A5ACF9537E392A728455905D3AB4837DECE4B63FDFD5DD07A2B76A8C82566DF1A2167DAE5E125B6AA0E76B9D99CA84664F50EEEA54E449F0E587039137F57543D89205483141C933166B61990A706ACA07F467D22BC34C6552F5BBA91CB1FC21DB51D03DFFF6523A5E1B4285D54C47660EDA1B290E4087B30651B542305A714E98A8233577D2AFB383E402F6B9FD214B194C738886BD2289CC5F997951910994B0A6104092FBC9B385639343CF26C9FAF845E7A98CB1F2C9306E8200185D95DE059F83AD17C4B97F8C62CF6C347DC6EB5F2B1F4BF2DD328130D4500CA39BEBA2D4281A3D8CEB4CB1ECDE378B20029FB6A4C543312E41013915C57016E5DA681944CC277F9C7E75F4A654AB2E5DC646ADA242B6223AACC63674F9702146723360811ADBDF2BB938B595BF4C688A8A844130D9DA3F0EFE3650C2283640B342F8922FB6DD10B8BBE35C7AEBEBA416CB0180FB7D2B171149018F8D880463AC26202C2B72F9A7CF83A917AD26183F8E74CD418E3B63459F7AD59849EE43CAC6DF3BB63FCEEC1ABE8E9E0B64B233A43AAC54F9BA0998D2219B3BACA111940D524B7CF94677D6C557750FA4DB9E1077EEDB5BA6E33C104AE25443C86BF1583353ADDF6FDDD19A4FF491188E3D4878769611B36427C8F4C705CF42338475C3185C123919B79B3A4887243B924509C9A4E7A3FFF0517021E51642D9B4526C28A0CF86FB254BE7EAB18701CA5919B754EC2506ECCC087AC6141B4C3A661A3D1A89E0D4DD2DF52CAA5B3402D0026B3C643FA7126E8ED101A94188A048B34AB61E1182D6BE76E2E9E6ACF401443ED0D997DD5AE67346CB1E189791102900225E6B955CD7C9E39FC7255021045FE7ECD40E2C68486A4C2FBCDBC53E847790DAFE5B2CBDCA09BF09DE327076C79F2A339A9F942DFA372B41A390EABBBF296383D438466AE6105B5058117B8E406DCAA62A98AC624D30BC8773DE643CCE7578E8D5C57C5718711421E6D04A182F8714E192EDF3935CB2E0380E10C77AA6583832DEB64CB41DC401541504E0420D06379E4830F06125018DB3810A684C4E888B3B88829CF97EC67FC8549703F9EA5D6B8F67CE9E060F765532C323DB034EC700DB819936FBE6F749FD37CE927663F439498C98C5104D69AE9CD8B04444A471F95390873346858625420ED783203F8DB371D766586137459505525CB3EE59A7FD8AC3C1DB3F5F4E0DAB62B43D1C4CD813D998ED83637F922F884A7584835BCDC03E9F1802B449DFA2D249D9ED7F2F9129815CD8D4EC4169EC51EAC449DDFA5BC0F232D47323D4C48AB558576160103820D485877CC2BBAB641D21D94E67B32CEFB4E9CE5DAC84D03ED3228EA3CDDDD33F3915B9E21B435BBED927A539B556FFCDD4C9822FD1CE81ACCA79B6F7050B0C01A3A317F066A1A89C81E4DF8C7EE2E042203BE8C290CF8605C193471953F8FE6055AC546670A4A075F70909246C3E3B92B39CF2F35AB49FE6FDA67072A6E1B82364820477FD522A746EAC07E0398E873790486ABEBB50EC59A9E4129B7CEA87C5182EB43BCDF096EF740EF67482E98165A4EC64EBE9D57C8D8C16CEAA81F3203DFF26B3D5BF01EDC0B0458B6B47846C326C75A822FC8B42774A3B201EF941484631406CBBEAC961CCF42860EBAC578703B485844BB9E01B2D6C2DF72B62B43BADE982B0BDD0501230FC76B820D2F5BD259EC791B33225E06AFC2D996C90E756DBD4257D53EA6D6FF2371330035B57BF54C9DC4FA95D61536AAC11CDB08A664EFB55BC91A4C6F7FBE3EFA8C621FD9F2CB343898979E7BCBD55B55217143493B6DE415A85D681A2405113F3ADA3EDAEE6EB0E78572D2BAF9C43E3FC39B93081CF2FB3F8879E810F417B733927525ACB6D026F6EC46395620547D057A539A391DE7C6F4B7095911C2D3AE075AD4F2C0C96D9F70E48A42CDCDAE542BAE833EB4A976D4F98410B4A3D77857762D1527EC6714A040BAAEC3BEC41BF9CFF00E1CF81CE61E95D97792D7C0DB7A88545F10D9B0A5940457018817725DA257766906FFBC6172B9C4D2D32A14D00C0D1D01E15280074A4A9FD2D21393F078EF55B16CFEA5327993263BFFE8E99E56837B2763ABD221ED85D83F9187AF8B9E928F00DEFF423FFFDADB786E6678A59AF305CDC02546D0F8AB4681ACC1F00069B0C47BBC9F13D12FD9411F8DF532096D53E4B7861839E602FC5DFA0D0B72232DD81D2B0E4B660A7EBA353DA27E66CEAF2D6C7734925247281866A12D67752A1EDAADD1EA59E4E86E2E85A81A573CD68F6DFB526558D81A8F488F261F355DDAC23F6CAF07D27FDA71D8F3968D4CEEDA89A09DCFDD00C17FA6DB3658CC7AB02C0E5F44B1F526A7DB9269E4DCD1D11B8421C204C07A5DE46E48769579718C69532F1671E552B92EF1451FFBC7A2F412696C6D67EF071C988ACF61F39319CA02DC853247BE1F7F07B3BBD68C901EF36D46868F65D0FA1D1755EFF6C2802212908250207AB65FCE827F0A82F3140DDC692CB5742B3133C541E0FE17718B546AD1FC8CB8A3A5AF69A825A84343C378D7B54F917057A8D026D4A59931FF9E24AB95BCE2BEBDB3A4286E000A4C47E74CF82925DEA07686DD20DE228828705D90638661173E703E712D69B043DCEBAFDC53F132BE3D04CE50D70B80DD118DB00E45DFE953DB87525880BA9F7ABB0FC481A5F3ACFA363AA2153391AEF0DBF680512A0FA37A6C8293865CA95015DEDBF6A21992CE1FEB5F499359E288A3255EF3FBAEA5B01440BD787251CAF362326C7FFAD20086AA7FCF35E95BBF398DB75735E087E0863E016246703946C4E88BCA6FC21446146BD342AAE88AD4249F9A38CA3E4ED0A88AA6FD746F578E5B414CE0F2CE5EC76F87FA3B6321102EF7110B7E6D889B2B85BB11FCFD4AB2B3BD5F92B8A2F66166F0695C0B13F32F97EFAA0CDE4F28E1674BF120E03FA15980873A1C6AB674C085303FDD74832CC1DF5EF787AE11C6E6A9302C1488F36996C1703670786C05324F99D9D2CDA1624DB95B8EAB6F7E10AC5BC985D6536CF667307A577A2555888BD9302CFE704CF72E59FD28B6DAEA343A83531A10A732D65CE93F523A03E5E791EFD5AC502BB0A1F756E93208746240BC7BB1C085728CCC8150D8EA74B33AEBC59567E65B7E2BD83699F607412448D202D948BB111BADD456D68086FF9A5906EA3B2CDA4111D3638391F7A7B153EEA77AB47215D6FE13B350F59F884C6E31AC087239D9145B816424CBA2C8BCB7B3ED7E19638089D91E5C9136D2AEFC8DA165284B42229A70346296A7484648DAAFB9B88994D8823EFBCE9E029ACE51706FC1E6E194B7D8906BB83BE681A96D50F4A66F5AF24AFF5007AA2052277D75E1C6FCB719AE789587E73BFB11029B2AE9E380CD7B4FBD78F0C5318EF61802ECBFE5D91BA28184E96963366BE3D5B063B5B664002AB0682E5820E3F9D30AFD461B3046CFC86F29605458AE94054CC2967CA77F102F97BAE3454BC190726AF88CFFD5F0F05E18D31159EF2A9D9800F48D1B6719617474F1B3594315795822976613CB63A4D6996505F4A4C57F3454EC101F5303F5B84AA8236843FC51D63D8445AD5C9B4F4E15AA0395695CDE980A6D48936146C519FB84AB775647E2CF809135D10B12F7E632654C679F92988B79021746C867A8E05102BB98F8FE7D3D7C005F690D9CA7C6A175FF26ED82B873D63DF4CBEA0218BAD0CB9A8C4404526F9806E2D4FBF37E84B756561C67C3A5732966DC4F0701063EAA7D3A52A2B5E4A8C9ACDB30EE8B9F5125F76BCF7B22DB897DE9A8A9560C54118F31DCCF49E87527D188FCB8
+
+
# Test seek offset
# Tests got from the original implementation of Daniel J. Bernstein
#
Seek = 0
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 103AF111C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED
Seek = 1
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 3AF111C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89
Seek = 2
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = F111C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB
Seek = 3
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 11C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08
Seek = 4
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB0800
Seek = 5
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 8B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB080029
Seek = 6
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917
Seek = 7
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 9D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A5
Seek = 8
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540
Seek = 9
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7
Seek = 10
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 8FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B783
Seek = 11
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = B07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833F
Seek = 12
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 7D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3
Seek = 13
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF398
Seek = 14
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D
Seek = 15
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 9A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E
Seek = 16
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63
Seek = 17
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C9
Seek = 18
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970
Seek = 19
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2
Seek = 20
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E7
Seek = 21
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 92F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E751
Seek = 22
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174
Seek = 23
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174AD
Seek = 24
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9
Seek = 25
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6
Seek = 26
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 9A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E697
Seek = 27
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972F
Seek = 28
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = D47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC5
Seek = 29
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 7A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575
Seek = 30
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0
Seek = 31
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A6
Seek = 32
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = D5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63C
Seek = 33
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC
Seek = 34
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC80
Seek = 35
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802C
Seek = 36
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 8DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3
Seek = 37
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = D52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E6
Seek = 38
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 2C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61E
Seek = 39
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB1
Seek = 40
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 8BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198
Seek = 41
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = EF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB19837
Seek = 42
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB1983732
Seek = 43
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276
Seek = 44
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D8
Seek = 45
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 2B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865
Seek = 46
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D86594
Seek = 47
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 47040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F
Seek = 48
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F23
Seek = 49
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 0FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E
Seek = 50
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = A3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84
Seek = 51
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A9
Seek = 52
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 1300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974
Seek = 53
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 00B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD
Seek = 54
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28
Seek = 55
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B8
Seek = 56
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 93150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B
Seek = 57
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12
Seek = 58
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 0A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8
Seek = 59
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D9
Seek = 60
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907
Seek = 61
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 0D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D90790
Seek = 62
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F
Seek = 63
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = ED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F9E
Seek = 64
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = 89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F9ED6
Seek = 65
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F9ED679
Seek = 4294967232
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Nonce = 000102030405060708090A0B
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Out = DBF81BB406517BE1A54F4740E5DDDF2B7965747B757FA9D5B7EDD6B27FEDDB89D5D47F9B24E57DF393017A5079F61852CD8B86859884120AF867D25D3B259E2B
diff --git a/src/tests/data/stream/ctr.vec b/src/tests/data/stream/ctr.vec
index ae97030b3..ee1246fd8 100644
--- a/src/tests/data/stream/ctr.vec
+++ b/src/tests/data/stream/ctr.vec
@@ -2041,292 +2041,6 @@ Nonce = D43BE1D1871642996713B6400DA4B0A7
In = E71039961AC14FCF7212ACA932E1C6307696CF7D98A96048D888CACE6B95A32A268EF802CD311EDAA92D96019938D7F6D1E12C70306A1A893341F610D387248F00A113BE0BA43CE254B0958EE5DDCF10BDE3223EFF0BB7FB71C833A7A3AE52F78E00B7A294A23B76868A53B74737E23B93A7B89F6890791CBA7657715B9DA9BD
Out = E411BA4401573E11E51D6D7E318D6DDCF23E5927CA429DCA57C419BBC391CAC9EAE01A2384F4705EAC94B06F151638BC7299DD8FF570404363430E9B06FFAABEC5E1384485E7A085AAF6E2692742F7E9003B18A4B9FD5D772EB0A326655F38F39B2D49035C484AE4B4F12B14A7BC74A1F0ED2BEC9906E45C22C085C04679DB62
-[CTR-BE(TEA)]
-Key = F580309FD46FC90ABA15E05AD82078A4
-Nonce = AF4D336BEB213C0F
-In = 0779B5A4D94C4B572257340F8F86FBDC5AE955DB72E588CB3D8298FE27ADC668
-Out = 6D787EAE01A5D7946C8526B75BAAF2A8D1F13CE4AF93E469A21B7C53965A1CE1
-
-Key = C86E8F484AEB12370C20A3A0EE5590BC
-Nonce = 13DCCD64DDBC8E41
-In = 6DC828712ECC5C470541DF1602B85F4007CF93FC070CC7762D7956B7BB549B6372DBC08B
-Out = 09DAE7B36CB22B70FD79C64244E6E45987B5F7EFC8CB0B8E3CA9F43764807BE1027B7BB9
-
-Key = 4C55B486E92B56E40276A86483AEE6B9
-Nonce = 3967D01A6CA67F89
-In = 5B65BD1306636A3AD2E0022E02E85269F20F76F45B136EFDF4C899F8C9656129B4CA80462AE80783
-Out = E89A69E8F2D8150C05B56F2A4A944857B645B16280612F58FB89B08EE8A20EBE11C862D39A1A59A1
-
-Key = 2803FC9BAF7D0373B2D479046AAAEDD9
-Nonce = B91B7AD2875C1EE4
-In = 311BD2A8AA6E97C4E84A3C322A53181D72A6C189C7B1FE6DB283BE9EC3193EA91521C1CEDE7304F0DE4995EF
-Out = 10C9482E1BC5FC5F3E0204D721A9840ED5921483104A783D46B376E9B74BCAD25C5C4632F523CA72CC6733F6
-
-Key = B45B330DC5589E6AFFE1A11C09C4DC30
-Nonce = 04F4F13187E04998
-In = 55243E865867E2281B3DBF43521D984804AD038D8A4D113DD1E118358EF1366AA82854D87DEC5C8051C9915F685F55AF
-Out = 02BEBB951E42063A106A0797227CD7CD037BDF9FCF2DB5405645B1CE17C0D6C36A3611097B9D74599AA5614E90BA6046
-
-Key = 9344248E661DDF45BCB9B6E529B39431
-Nonce = 3444DD3711244051
-In = 37B0677F9DDBD8DB1496F75439862C17100C2BC735087B9A0970DA487DFEB9520B2C5B22EC089777A710FC7C5EF5B7AD83199993
-Out = E8DF3BF04F4EB8209BA30532885CB16F4DC4CFCC9DAA5D195A8F92BCD9B41ADE5B7EAB7B1BCEFED039E3A3F8810C2B34A3E3AB24
-
-Key = 215C4753906EE909902B163EF367BEE5
-Nonce = A9C40171E5946170
-In = DB572CD1DDEBF0C06AE910471B108064A73851F460F3F79A303E463230162B99452DBC0B0BE88A17765D4E317B04BAC5693A5B2E5A1AFFE8
-Out = 19D1415407B422F155D1E8EF9C99F2C77F68B39516D4CCD3AD020A4B01A64244FC0E3012A19FEDACCDD64D948372A2D8FD2F7B7BBDBA8CD6
-
-Key = 63689A7EA77EE56313EDCD9092EE74A6
-Nonce = 4FC29C5D1A03780E
-In = 98E56143F834948EC76D2D3651787E8B6D1959FBAA1E4A8A8917091E626D3A7FCAE23E59726A9B7E6808CD6245ADAD71EC52EE49F8B6983AF90165DD
-Out = A2F29D9B387237DE529BBF8FA26704D4246C68F0C71FB986A735BEFEB239DF8220B3EE66F0C8BD4B764BD4C8DA951BF3F0589315F5AE3E7F172F3F17
-
-Key = F6DB0F1401BF9E04BC31F0E5AAE3B6AA
-Nonce = FF0415F250ACEF92
-In = 05796CA4B977B4D81B3F898ADB404805F6418425C6FA44C77ED6CF8B3A5C6A4D4692A3E8A1D0AA88429C73DC0931BEE46EBDF759E16C975D8528EBE66092C686
-Out = B8AB041041D2E9E48909A193956F9CA68D6ADADA5C2EB9A6F6795BDB751E704B2F9F3E6B5531F2A2449C7C710367B4BF7F0EB293FEAC04D3C387B5C3D4F1F2FE
-
-Key = CC5B8B7E1D9877A5845D9F2C4070061F
-Nonce = EF786B15E7F3F602
-In = 5456E7301B77AF7E4E571D7A542B4DA79A6C3E198E29B973DD482CE44EDAD6C8BA2A7C6C044B9187C0920BF626E55E844C8746F8FA3748DA84A49D2393AB68294304CEA2
-Out = 86927873D7469420C6E817A1A9382FC03BA4DFECEEC08400E3B0995F1C695D2599B3612DDE5017E0B2422F233C86859CBA4A038D2F9E1DD886720ED63365A9184B1EDAAB
-
-Key = 899D47EFFEEB386DE8342FE3A3242FEA
-Nonce = CE412E40677E5BF0
-In = E7CE6B54133D74C1D1F6370AA96F6993354E1BA145221B91B689B5A759F808D7861A7384BAD3A192FDA08A36E9287B20188DF4131BC2D47457FCD3705C0D510A565A6E7D8EF7B22A
-Out = 3F1DA63F3BC4BF2691FD10D71CDFEF4FEB29F9E3C918C432AA7A7BC8F804E693B0A25F2F935F9F9A8009959A118884E626F23FBA1C624CF719951940690C890AA05E8C87E55E3098
-
-Key = 08C7C0A9B04684B49554E83499D2F277
-Nonce = 7D16029BCE205DD1
-In = F2369B2BEEB9FB44CA09D59D3C9A22E107E960CA7588066E9B95EE6926DAD5E91ADC13206AFEFDBE39DB95BDD77655C132FB108F4721EDF687CEE1258CF5C43D60F8EC31D5A26B022B925EB2
-Out = EABC0FE834E386A647EBCACC5FE48308E475C5DBB7D18F404A83F50FC2F93CE75E4591C0334479B0A9920CC3D9389CFDA9E2D532B1C491B0F1F3057C797AEDBAE51CCEDF72023556D98868B2
-
-Key = 9D923AB332BA365F20DA39217C7D1650
-Nonce = 49B9FB1F976B6EC7
-In = 2A101F89BCCEE248AAAF5EB65D9AA97240B9644FFA73305AEE2498A085262573D23783BC442D6C296F126017403421AA5AC8E4AEE44E020DA81BF52DF9D0652E42F2768F1428C43DD25E63E2B2FD7344
-Out = E70DC7AC1E4A4E1461F6DC51F64B0C236F3BE15D5AAFFECFC1D094A4D69063E14EB4059CD14481A26FF7DBC6BA07059856C2C764338B07E1C961FA56275AA450929BF62399B423629565E3E7C1DEB293
-
-Key = 7BD5159E4DD63ECF90DDA801DD608104
-Nonce = 7A60E38CEE806006
-In = 375D52ADA62453CC4F83B43BEC349E85119D9233ACBA7328F3009041FBB9E83DB788B79EE543D93859404A91D0166397908BE510D0FCB58F0033D3884A0AAFF9348E4E3825E3D4F0E8B7D592C7ACFCBA11C2D9F7
-Out = 27F658DDDD613482AADFD44E832C372665EC2001697602A274D84BF3C2C76A5626D84C8A80306E31FD8748256FBA279732AFD0CEA0102EB103511CAB71458F881841A3D49A43D450558DAE85159310F67DB2B747
-
-Key = F0DCB57019B3CEA07D6F8B81F8A974C6
-Nonce = FBDD2704EA4830CD
-In = F81D39C6A1A977FBEDADE7F2A1C516FEFED8621E0C3FE4CC01DDFC4035EFB3F2DFD468EB8899C9368A4DD48327EBBE739E6A68B063BCD5C03A896B47C1DA723A5AF8DA8629964D4373F38F297DA5FC11597E0F0AAC6A328F
-Out = 84DD988BEACF8442FB917A80408164008BFED0C6B66A05E5EF5F46CBF5C126108F3986F7336E5BCECB7F4645FEEE00F20511C52A750029CA31D869340170F30933E92A0DCF703EAE3A7F15AA004D84358F76C4D3965E67C2
-
-Key = 92BEEED6E43A5D7A6F6211C85229D86A
-Nonce = 6B0FFBA1B3FAB3D1
-In = 44176AC9FA9B8502B675B559FFC21164366F73BAD09982114F21D2CBDAA15F88651EDE4BBE5B644EC78B375ED58DB3A4D814A6DF7563F282E8FEC7C9965668039AB4988F6E87DC9413AB3367500C6AC1ED5968E5B31F44F176B02F7E
-Out = DE0DC6FBA50CA8E81E265781993875746F2C30BC80F682F085C644C162AED09718D09B5BFFA421F8B26FEF78F222D55C5CFC71048F805393377AFBE94775057B432D712CE65B62B2E48A2F973D3882D10BA56AA3DFECD37DBCDD2D57
-
-Key = 2A70897594FA8D00C8792ADCEB16BAFC
-Nonce = 530C2B6E298FFD38
-In = 1788E3C83C04ECE0D95D27BEAE329CB99D5E84FC3EF4A45575C630C8B946365467386261CAFF1FB8C615C840E6EC28FB0A42C633B373F5AC79C32FF90F4883E0DFABF01963C7868170CEA96A30B4DA4BFC1107E31AB53D63A9543373E505C779
-Out = BC545A4E753BF6BB554B13DE4CD53644AA7235F2593BB0B69B11EFD66B3CEC201790271C83138945C5A7347635F788CA0883CECB6BB4B53610A64E384F769F6591D962620B660CAC0A587FE9212B5A247001B5439D62E144F91608CE39756FAE
-
-Key = 85EDC49CF905E1EE9A8205C3709E1304
-Nonce = 82E743E483BEC9F2
-In = 4C8E284F44D41B80818BDB68A8D57BD63F267BC0888CDA54AA48386E32C561BF8E3B370BCF9615A74659846F476DD0FA6CDEA8FF11FFD3FE7D5BA8590CCC66D419E9D96ED3CEE7A46CF559345FFE61AAFAE1ADC3868E6C9734AE56B41E35B6D8A2316E4C
-Out = FD08FED590AA383CE472B91572CF6E2244A897AE7116F0821DCE23223AC1DDC28207EB5DDDACA086188DC78FE5ABAE43D3FC4F0F259C521EC38B8DC0BDAAE7F80B7B27DB75B00E35E8A88380FA5205B002961BC6F1A4E81BDE84F7A3079F10F8CE644588
-
-Key = F207A0C6B1A66ED1D50D256693DACDDC
-Nonce = 6171F470E638F864
-In = F33FE0DF117BA01A850C2DEB6EF8CD86CB65433ECBB079FD69831A06096DDBFFFFB1EA23F18EB4B4F397F51A5662462D8DC8DA6BE49F9DA578A90E12C8CA33F4579BBA602EC4F4422D93C5FA8E8EC2C9640C0D3A0F0201A5F3D57DA94A163C25E185F5F4089F68BC
-Out = 17297C6EAB5EF458AAA16A1F0D7A1EE3496CAABBC623F2127307EAA81A78A756E4373F391DA290357927B703EE1F0623A3FF7101CB78C3525C059BFAC4A3DF3588021953445A521E415AE2576948B323F08E3CE108989BE73EEF7F00FF01C1C587B312E5D80C0D6B
-
-Key = 358CAE6A62C661EB1B365BB5C37CB744
-Nonce = 4F8E99D3BB7E3057
-In = 59170FF4B0A175B7EF8BC2B2E0AB81AF6C994FEAACDE9D255606A1DC476E89980A0927632819B55DE0892DD43F0D7CBE5C4279E6251BF5296FA03C8A2F0260339BCE64DE16155F3197792C2379F11D102A2F7825A97A03D6A62C85C3A1C5BDAA18E4BC25F6C0BA43595D194D
-Out = 64EDCCBCA6BC3C6880DFC6BBD62DA90084AD8CEC2A704A7FFBEA8751F467BFBB5DADEB43039C6F17FFF1EE87844C7EFA72A2EDF1EAA332CC4F281E5E813672C7A7AF4F85FCCBCB1B0AE11F869382015D7DCD676BD4B482D175A5AE61730C5A29DFE7B14F7549A7DA12579667
-
-Key = 4ED8501303B4D3F924D5C7C4097E57C0
-Nonce = 2B3A19E6E2EB6CA9
-In = 8FDA3A1460325CF70E0DED926596E870382B6B4D99FE89E86CDB6DC1B25C82C5816DD622980FFBD4148AD82196865644B90A6B282DE1B92A99CD2AE0E804FB330F95724CA5B45A2FC57B0926AB998EDCBB63E61E8673FAB199C2BC83998B7F43E8307B57222C4D76CBC606B6B4AE8D1B
-Out = 55E3B003AC093190C81300E08533A11C4C96D30E3DF4E030DFBB1D2BE741A8F30188398DAB8198972D85B44948AF438D6BBD9F47CB1307389F456F35238B1901F03D8FAB0669B66BF7DC10619D5DB72AFA4990F52FEF4F96576542B55251B83E7EADFD984DE5554909C8975865B78A61
-
-Key = C8378142EA256625CDF42F9EF7DCB2BE
-Nonce = 7E12641A0C703137
-In = 3599E1DB61A7B8E74620BE5965CB0E160A69767048BE47083BDE3FB650D0BAC5532976F25530580B7EA047A346F5E8D413B07CA19928444ABC3A94CC52C7DCFFA3CE402F395CC1827B13DA3B33E4658041E2F7393D90C27D928EAF9731A5054F289F736429D6644FE790644058309B8607587B9D
-Out = 6AFCA1CE267A3A90C6CF0179699DCB96BE1C42F0E7985C2D4D8D725C5FBFD9F6996DFB59C0A5BBD09A58418E1151C1BD847B44D58384837E9594E445CFD87F8E324A0BB938838AABD0A496DDA178C927810E674ED0E36D257EA79743261F555B0E04E1524460DED8C288D71B330F5AB0A13A6FBA
-
-Key = DCBF96AF1456108A9B9227ED94CE806B
-Nonce = 05C03EFCE65A8210
-In = 7B902233AF687EB4D0B8711FAACBCD2446038DE3F41FA72805BFBE69E00DC9AC5936C8481539C1E97DABB61CFFE9D492D758F8D8DDFF7AE764DB8D4D946CB3207123A1F95F7DF76CF0BD8B276004C9D685C93D123B407A78BC8342FAE45D91B5DCEB7EE5A2EAB15CFA38F4FB3586C45E7279DEF3A5376CB8
-Out = 5554A20E71F2C86C77A13DCDB065D01EEA0880BD648F3C17937623934C7EFC77B37733F2D1E96BEDAC273954C3F8301A749D14CF74AE76A9CDBFE559AD9643BA818080E1D8FAC761B45B48D0E19F51657115E8ACFD6E81211D890EABF55E06946CB90599005B535A6D274E221F7A697B92BCA34D1F09FAA7
-
-Key = 2B4B352CF67C87C3397A3CFD44E6758E
-Nonce = C5ACF3B41053377D
-In = A226BAC3B9FAB88446697ABF579D5332EE60985E2EA7065AFC56FF26C16CD4B944C7BF3DC3CEF4BD9AE3000F17CB304B649D3A30776EDFA7D067D439A5990F2B7BE3FA5A6447D22FBAA0683E7ED683707C30557557E2291574A76C68F32BFBA14E2CDE9E1FABD5034FFA38EBA9A18BA405412D3CAC48D0A6F8B5033E
-Out = B22F813952B9667C95028571AD9F8731A41617A9192671573DAFEEC9821B1A82296C8BCF6DFDFE16D31F2AEDD69E9B18E8B34BFEF7D08FE47466AC0299F8E08922E515307E284BCE85E70C7BBD4F7783653BCCE054BB82A14EE89EEFDF53C772273442576D37F90D5E2E14C70769F2F3ACEFF8CF1E71281D4172BF65
-
-Key = 81BF9C41D2404B0A468380F8CEBD5996
-Nonce = 2EC2328185E51927
-In = C85A0F50724680DF59E0AC198F7412AEE6734C05E53F6957BDC33A89E40DDCFAA4F1E211C1E3390EFE49F299478DCD9026CC2E3B49F35E893ABDF851C39F76ABCDF9B5E3E4FA2B520966A4E1AEB36E8EBD1BF5DDFFF64C9935E89B75DF0D78D1B54D9FA6F8A87A8A4721591570B47E091B016A381A3E76B3AE92EA014EB03905
-Out = 13C3BEE2154D3C4A9109B1F3E0D1D21CF47FDC283A7ECEDF2338FADC4F893896A8EF03D998EBB98FB732FDD1B11061ED6FFCE2613DE72AA898931F4B5471BF1B96D35FA4676292755C1B77AD5AB0345C6B3E8FF05F7EFACC393762A075D36E88CC5EE1AC3709DA398E21F452CE9F255D93BDF03AD42444C2ABBE0211C38F9F84
-
-Key = 5A6F131AD458C1E9B3C004109CC78E7A
-Nonce = FF6CC874B337996C
-In = EA03F0920CDB09256BB8D2DCBBF5E0F9C14FBF0449BAC0AD02BBC6F3C5646FD13F2995B0B6E37B8BEFC5E85DEEEA696E4DA351DB87D694AD896EEC2F810538CEDAF434931E6A69A019A2C73C3309FE7FF028D7A8D387CEFF33A63C4FA3669B41EF3DD8D7A0A923B4AF8307E9072C32020B42D4CA2F6933486762E8E3286582FEE0F1636D
-Out = 847772497AD58F8AD957CE4B2D83D16C8F6F0E7A693DED94B7D1D11832078CBBB9783AAB878CC9AAD7CD731E74D314DE0B9E9B9F65A279C05ED1382D26882F8BFBF06192E587CBBBEB2167B96DFB3269B4BAC805288365849EA703E56FAC7F13805AE140E894B8E684642E73BAAC18E7F0EE1637FC17C42789525AF0DA8D10DFFD7BFA53
-
-Key = B0221D669075C7DA04EA353F6712C7FE
-Nonce = 386BC7C0AA935689
-In = 4A90541507A87188EB104184D464D1A04B622CD3C706B5A800B57BEEFE5AFCA5215686267D2BB696F64F4311D33A83C553022C482EC939A77D6F2961D668625E214AA9081056643ACCB0FB9C67892D20B674E5AE2036214C41D162C7B44E453F87659943088A8468BC12735741B2F3E7F3DDED053B73377E9E9CE47EBE52A4FD503245CDCEFA4919
-Out = D3489D41497715E8CA4B828E86A03903AE435C170FC4DC149D599832EA64ED7917F30E4591151B08E46986FD94C2983AF9713AF602DBECBA6B9F9692AF43E53A3A04AD8B8E33E846B95C8CDE80AA03D46C923137938937FD7A285CF322D23405F2FFB8C836B2CBA663C4967BFE61DB36860B6B741826BA4F22E5393879AB76330545BE2B62389491
-
-Key = 5771D7A711C92CBB93CB776D54083382
-Nonce = 7FC654F95497E5AB
-In = 8C52A4AFC465477D059AA22CE8CE343FF273987F10B249B1A19B6F95A69B0C82F122B22DD4FC9AD3DA4AEDCA876DBEE1AF12101B5CF065EF20E2EFA1B50349659F77DA6928BB5108BD9226424CA31C7ADF49C4F738F013AA5A55380ADD25E840A60A5113B08506D71B702A4525DF234AA0BC459222879DE4EF24B305F6B6E7D5702E3EE7320D5C1FAEE2AC70
-Out = B054E0553AE9BE63A3315509949DC984F145DD24B152E6FB15D712067AAFF77733F7AA8ECC4D60E47E4CC1305BBEDD7D572ACEBEC9FA31F3E701E2DD5885C1C39B371B6582D14AE32D31BC04976E3805EE3BBA6C727A82C8009C1AE39F866C6C5C4333498B32337E435EDD700A48BDC28A7918B8DE08E02A6CD3BA196C7236379C12AA86FFFD0DAC3D7390AB
-
-Key = CDE4F850BA8D7F1C9114149084656B49
-Nonce = A6250EFEB105609D
-In = 18AEB9393D3A19E52A9F83E7E419C40E533CD2547C186038B315787C3F9616CE14A5A022C2718D35CF6B54227C4E496E1552D392CC060B87E843313705797996CC5E73BF43141BFC11452B209BE877D7ECE2A7A4D4C02745179B90D5E6A205ACD8BB01405632D1813E31938A37F43165A1F1C5AC87A1ABD8A69AE655D4FD70DB124FD3420D700726705224533C9F6713
-Out = 51E70E5CFD39FDB62418893CDC05469738E3E144E4915064F2ABB82F0DF1D1147AC59EC001A5EEBC6763AEA4748825814E4CB5A90B271007EB8FDFBB867A9911E9DAAABA4D692B1AD9AE2465210037A18E64A742D831AF8AB925B696DC0D18F45B80C0F6A46A07E3322E26AADE193F64BC2BD998F819C440CD47781A4DC21B831476145093319BF8FF4C00FC9E33DB25
-
-Key = 44738E1E4B7A442D209F2661FBDA824F
-Nonce = 6CEBF2964385D443
-In = 9DEB4E27C4592FD5DB48D3DD21DE22342C3F6F1533F288D8BBF3FA65E67A66854479737C03F2FA5C40E0001FD84D9EA4604594CF571F03BBFC06668D12DF9EE61CCC0385B45329243D5A5D06C19791389E89FB54A6B85D005B64C08EEAE5FFD7DC1C9F1DB87B5C55D06FFCEB1C9BDC3F78E5CBD67E06AE24500546B17A756F9A1639DF24AA77CC53B6893A31D87435E33B1045C2
-Out = 44C52C48BC865C5FFBFD05C2B27C4D2B69F373CF704A2E91FB2CB0D429B957A6EB3089D79182311777705987FCB9D8539BB2CCCFA1FFC8D49EBE6820D01F10597315E46985F4B4A2160FD97BDE4E5F5C7C7441E06E089540788121B761340DCC2BA676670432C0B0C712D6DC3B565B25AC5C31177A50499F716522CB5ED67E9EC63C73E6FC6BC68B0C5C7B4102D4F59E79439CF0
-
-Key = 7D8DA95A23D6B81028BB069A712AFE2A
-Nonce = 278E3C3D1962967D
-In = 15DCFFF177841397C5B02A1586B9EC69250F7C397DAA9C0C2B172234B18072B894ECEDB76F839878EBD358AD6AB62D387456AAE59D865969E9398326B140B1B16867847F0BB30FEF787EFD2E7F61ADBBC9CF13A519DBA56907787269D5FEB735F88A4C6A313DEA440C4FE07FC374E01C83D65CA5A26631C745F35875BD58890A066F82F4A46846937792C9E893C87856AABD0DEBC110AD4E
-Out = C8065C6F95C74F52907EF0E1409608E15C1D9C97980891B93AC41A6100080658C4F84FF770F0BF240B653B60A91796AE3996C449447E6E1E19FD7C48B8A6C6481C2B5F59262C895A57B4C65E0549DEF9603FBECFEFE9AFA60A26A417D5523B7E47E5C04F07323A88A447803F40CC46D57ED5ECF43D6F1A1BF48F03D0D56D7594B83BBE856A476E9A49ED457A1FC763140EE67FE5F77D0769
-
-Key = D798EFF93075E16619C04C27B44B7710
-Nonce = 81D4628D9577608D
-In = 47743B5282C40BC1D37C6842C7DAFE01D49FEEC11D27D212DB0FBD852712416CD392ACF41E1A5CAD44B82032FDAE4E94BB5F94ED0ECF20EAF9C68B49F9F0D0D3A49A377C1821013044070654606CBC11E69959DFF4E975868399C4BD3A3CDA32ACAAC037A8AF3155F8D20AA2B76285C6EEDB5AF9E31865BE1A86E5615F8E0CDA4F0DAA44DD3EEB1360C262429038E8C9D43054EEA4C67E9C26504FDE
-Out = F7081D26253675F37E0E644CF5FD2E2DF27B760A57A2C9753B2BCDBAEE6EE70DFD83680CB1B4166DCE85F48E52943A3A7E83969F4D674226323C12FB306F5BEE80B96A8BF99BC4979753465E587E9FBB43BAD2003C8DA5F99CE06B6D198D024E7E41576539CA2176DE8C78EB4926CFA264C108A153724F49E38B2215641BF885FDB366FE4975A6AE5B5C9DE89EEBE3F36406F0169F09FEDC9D582656
-
-Key = 831246376C66B8468E7A6E6E897878A9
-Nonce = 9955251D87DE0D7B
-In = 440DFA2B6F45BA97928C07323E7639678ED1B247376F8B51BD5107BC66538ACAE5D9F6924B9060AC5CC37D360F951D81CC2680213B48BC1FB392235D9E74076BBB1A7277E4B4CC6DA3D8B011A31B92EA82DDEC54E3A982988E9823F343E6638A6C8A8B4F9FA1020A81B7B707776BB4991B5C7DBCC9BB9D041154122FAE8F6690675826AA20C251B29EE5647B160041C5DEEC1B90BA21207B39FD0A657527D480
-Out = 6253441E82759549F5791B82541649A09600395E37DA34BBC9B075E084C1C027D3A533D31187C4F0F3FC26A2DACA5F10461953F3F2D8A0C152A367C0E2B99DB3831FB9691C8152902954A26C0D14AB3B8B7B5DA82450FDC4B37D6904F8835326D35ABA9431F003E867AC26F9170DDA423837F657E908493CFC06944B359A42D1761DB68A6A61D9EF03DA83DBD0B4F69F020FDB560C687377021C09977BC8208F
-
-Key = 59C571414163AC80C5856A8E8EA9A524
-Nonce = 9A6C05BA3212D92F
-In = D2F7A97B171A9C774D0DF23173044F51282364ED0F373E86EA57C6AA726F313FBF49DA8BF30411F4D85BB62CA06C577396C0CD74D8F43DDA49EC5AACF46D9D3C20F68FC8E36FE6BEE147040811CF9C6EE80F3B011494C828B6822DD83F635C1AE32A115FAB35E5A7186942C3D5E3A25FB2A2D18D877994DC2F2066DFE5873889978DBC5E6686F24A9D4F69AB8F7B9F19FB723D39982D2C22A68E0D526B35C3782518E721
-Out = 4B48E6C50D37471DB4D311A3303722020E874C6A578E4CFDDE95C44507906ABC4FBA603F0494AD42CE4A660BF4CA06BC7FA1084DE0315DB0C85081D8A06CB823DC876930F948D594020092F3AEB703F95DF7BC94DEE275572BF9D6D6A6FC51AEBF7579F0CD49369A8047D46AB9E47B8D90C4EE61A24536F638987E4D343E2D66DEA1FD670CA98AC284DEA1FC28ED522AB1F5AD0581357300799413CBE6A78C9571B134C2
-
-Key = B69C5FBC4525445638D618F669F82347
-Nonce = 346955985318F429
-In = 0DFE5D7CDEF8C0EFA80C66136189518199FAC9A459DF9FA5369D4F1AE4E3938DCF790F65939A4D8E27CEEB7F7BFA098607DF2C300D61B00E4821B3A52150F5C38A9B12983E0232E305419FCF9D01628CB18D22C88E69091EFC8ED328317894145BD9C7488EBC4C7DAEB5DC9CADC240CF47B1A0A6D720A8EBABB78A2BA0193F2C1485C77DDC47258A8B9E34A4F4066C6FCA22E44AEAADC6FDD6C398EFECC6014662286D3BFB339D2C
-Out = 248E8FED5CED6F9FE5BF2F5FE9D668757A222AD0525861FDF8DC86BD52C75AAB502F3ACEEDF16448107C65CEC8C462C50D9918C7CE84CD7C1F17BC16625D4D9CBA7A335E8DDF31CDF86EB9A2CAB4E6D46136F05DB0FC7E9811CFFE1DFED75A1394860731187B3F4D053BE3FEA79693327F6ED98C40277D747D8601447D5F02401C0AF31DE0816310F81F83683E405AA64CC47953CD922ECDE6ABA6AF4378BE5691B78FB0C2918187
-
-Key = 14388CE990670FBE1D821E677B829621
-Nonce = E13F97C3B492F94E
-In = 4A25E4F0F608CB42CE5E8EC7B48A822918236B42D074D0D7C8D1209E4F68E4DDC9F90B254BF967FAE9058DE032C1084A1BD9645B7647774FDE927DDF1776D5F829CA436C9E8F5D6B4689B592E7EE0ED9F88C12D1C6F30165406BCB2177859523855BE160E7CB477EC73AE50C66F827563B4173EDEEB4AA6DB82B3AFFD9E719BB0701AC3DF37AAE2992348F33BE426B85151D7581F1553A0E99C339BC407CBBCD3EC9D603D3F9E7110CEC5A50
-Out = 89A0DDA3BA5012B8D10F97F1546BB16AD2123FB97A8DE83EDFD42222EF62A07920C93B8B3A123F5CE5EAFE1F9645975DDBBF031AFA61166C90E2A5677A07590B483CF6FA9D1597CEFF8734A3D9554AC4C946A4551EF8698CCCEC3AE7142595D3130AB2712719595A6A14385653DB4B52FA784D75869926237F43C8077732A4DEE1C66220226815E0E77F868C68AF4268BDD89ABD6DCCBE42CD2CD16617467E188D200517FDE85989BFF9A751
-
-Key = 8E0E06D39EA04A2ED224FAB12F875169
-Nonce = 4687DD18DF082821
-In = E0592FD880C54A90F4A3FC3F1057712CEBDED7CFCBDC017C9ADDFB9714C044F1A5AA11E9300F9DE1C15F8368B5DAD6DDB87BE1B6B2D3A32EE21DDE6C1098D2B84787E12366B8734B37130D010A91A76CB6CB153EEE3AB7736A2D6EA3F6FC6072870F5EF351FEE32777CDA4B7936A1062CFA69CB94405E1624E2D56FA06CFF4D31616B20FEECC2D2CEE58C81E3DD0EB563EA825C87914C1F38FB9AC35C04812041F2D81A32A9C8546ABA9BD5AB6E71942
-Out = 003770A75B796934A5C6C8362381B47E9DD791DD860AADBF9F71D4F76D648D210EA1F16F513FE403B0FC39EB84354F585756E95E9C114679A1FF6F90A98434110CB1EF5FE540280A6A82C56855E3A0C83FEA2815C4BDCC22308DF7769A22033F6B2C91ABA1F6BA83D03CA7882EA584E2C2183A1E74A75F1E934E3E0ABFFEE26515528704B669802FD6CDE0811B98BDE7120BE82828E0E67837EBEE0DFC30FECFDFD5B4D5A251571DDD8A42E46583CAF0
-
-Key = 282452A3EDEC7BA6850A6DBB481F18F0
-Nonce = AC2FC317AE3C2DE7
-In = 01A8E66CFBC585451DDC5BE634C7C80DA329D3DF16239DE9EDE1B6EA4EC912B5106999EB348DF1009AFD0ECB16FF5A7EE023BC8C4963D52FBD8BBBA5D99B0512D772608746FBBF36A362761CDFD5DBA5A0AE5100D0FE1AF4EFF576CB1370A4B403DF7B06E22DFC37B1E1AB6E1152E0DED0F1B5867CE72F924EB3D5A122EAD315C7EF570DB199DAF3042937205CA05E22C101527F9B9187DBA80461DF3A0855CE0D32A80255DB81327849901FF16061A52BFF8410
-Out = 0FA83C7A283B563AD3A1D91FD96E5033EE3BD79C786E6398504D2B152E8174BB1F743D2B5F209A7792E89D24B0E91F9A8B19FFB2AF659F0826C743E85F469E31BAFC645EF27DF183CD7AE419ED8D83AD229D9CAC3C67E8C6F3B722215D24793B3AF04283A17DE3B36E34BD48309B2C8DFC5A4B55C0DAFB7EF0E40355485B89C381E9227A7080C2353D05E2E97F58EA41A72E3DABA27753D44EACF8B9C03F21FBBD96D5DE4D36EF0EE7F8E554E1B468126F5F3AC8
-
-Key = A36BEA2CD9E5D98B4B63A2EED52F8C1B
-Nonce = C2BCD83BF070721C
-In = 525585F116281D04FD8C06E92EFC21C91E936913C1247CEE67727653974C09F768F31F07ED1F3FDBD6A21194846E9C7E96E94728D640639C77B299102A8D7F6CB35904B00DB8455F1AF65B05DE83ADB6F2759BDFF79CBEE13FC46669771CBA432E6F777FD5D9C879C5B891BBABB568BB541CFC1A8E567D718DAF292697370206F4B69541F9F44DCE287FF966B62431BEA035BEB6C13573E32233A9ED5C50A0D71457FD8B99390FF345D22AD61B23DCD0A0464B95310097A2
-Out = CD13EC2531031AFD1B215EDCE6B60C6F1E9E8FB13D83B9DC28EE9F586C3C82AB7FB3359B6C2354703093C883C489AC1AA24D21255E2BDE7BECC0F77B55E23090B18129701553A908ABF324C917EFF7CAB5B12D6FD4CCD0928748A223DB90F66B48D79333968EF22502A5EA9CCCF588FF9FE70AC2DB669C2A56905EBEA7AF56BCF42031F3866C77E1D62A793F39827458AB46132868CFB8D72216BD41327B8473F24F68FEF8D0F46F339D533949B609FC2723D953C5F2BC6C
-
-Key = 52874F3F111082522E9EF5ADED117EDA
-Nonce = 2455286EA57BEB7E
-In = 47A0196C08AE929B236B36A04B7441FA40E69EACAF3F087F160709AF390C5769E1452EA41F4325EEED011D33B82454C7B6CDF6775E0809BE8068772E66EC81CC0319A7D27BBB50C2B7D0DCAA8040FAC70BF3947B6E57127422E979242ED79608566A4CE9C8E0EF3589249996601013B4A32D3784403D52F6E0467FFFBED8AC31E2C200F169AF68ECEDAE791AD6D4E518624D9BFF90116F154686DA7342B071E9A9435FC4AE2F42536FC93D98D6DA6697AEBEB47C94451522116467E3
-Out = A14B00431D6BB8042C402005AF87709D098F6366527099B8044FEA9C173323FFBE5F53C3013DECC92616652FC26B8E46E0FE4116F3A44D8C2E5F08B0D2B0EFA3B42CDD4809D2B8BEDC6940DDA928B58D7ABC1A7E753AD1DE54273C87FB18E77D58C4AA1867C7B01A6F8C291C3EEC5DDCE8CD3722749F3DA01C9DCB4E7B62F220697B5EB47538FF8FFD78E4CE949A0265E8346D2ABB62F5537789236072548D8588FFF3D8DABB7AA51634CE7051E824EB4BF7415A2DE90CCC264E2917
-
-Key = 1CCD49253B736228C454B8331631042C
-Nonce = 43666BD9D4555CB5
-In = D32975CF8583D36F57C092295D8FBA7C44722ED0F385C102EF12E5BDBAE80037C5FF0725E6B950EEC1413E628EA8088B9ADDF2CEA379235CD62FC01762AF3BE11DC766A17FC10F85BAD826E94147DB78EF4E0974D4566900D87643370A8C88F42471C2479B7686FE97332D3F014809711124619D13644E5C95FD083212F580F9FA3E2CCDDC0DC33D782C1D103093B9CD54E4A3113B6C75A7822ED24D9A422D719B26C21F4FE73D74012E81D9FF58F13BF1B681C29A94068A47FF18B9610DDF80
-Out = C8D6A2E21C15290F42BACC559380F1ECB797306B7B59EE22E452F971D049D24FC7C21BE4DA40A91BC91A2FE47E35CDA7C6A63BA7F0F38D038002093FB5E83CF52D197B9DBD0160EE6CD4BC690E0BAD9379352400453E85424E2583B9FB7502F2918C60E0976722395BD8FADA4C1726B249E4E8BBEAB59AEA3EB8B0D833FDD9A934D43542404633299FCF6163A43278202CCAF90CEE44FF094FEEAAA88EB085606A50E96C447234CD2F4A6602C18F71522D58BCD802DD3B97D5247F61AF099FB1
-
-Key = A9AB5A6AD1CFC14030B05F52CC27D166
-Nonce = 81F7271353D4D8FC
-In = BD15B15611F5D38034351F16A47A50C53F9952D35B0C888663EE6164F5F228584F25536D8EFC04FC9BB0CB228857440875E320CE25534AFED42F830F7BE88AAED5D91C128EFD7067A30088B1A3AB3C00FCC3C658262230AE7541DB9ABD0E1288EC7B2091050FF3935575FD32D7CFAC6D599655307F530304FBE4E16E647AFAA0EDFA51F4CD075182F2B6D1E8B2F15211CD52A996430CB634B099965A37B442B1E1B8104AE9DA9978412F53FD9FB1F24E5AD0A2D7BADA6011C87593392A629E1E916CF28D
-Out = BA61E2BFF557EFD75AA4E9DCBDC95E3D02C4870AC3604E5DB01C38C5E489254CF4B4D062FEFBB3CCB044B488909AF465ED13785E5034DC62F65DA7E7CD0B53E625D9090123E8DD548E377C4B9AB085A4AC083A2EF1815F115C08CD8AFB8B814C17B2DB422AF48EB71566F8D7246C2001795FA20AFA9DC6F76519CBF7378267A1262B87A98E6773E61FF3211A5994E2D3FE2E06AB52BA830CADA7EFD02A36A66F2D4C559CCEE4769C0339E56EF3946E736B048A39F41C0FAE0C7650B3486DA5A2349624E1
-
-Key = E3D2CAB6F748F35DD4E72335A0241476
-Nonce = D97CFD5DEE5CAA6E
-In = 2AFE5901D507A488E8729205EABCB8158347BE7FCB6C4FBC5F20EB471F00AEF1FCD46892E679EA9838E22882B80B1D68258D24392C219F9106EA1175D54F5AA495B6B3E0E60CE6EB6E1E892F2CED18DFC18D62012A4328923FAD58CC04EC70F832E3E1B8B2F1327414C5EF9A57DDA4D40C63289A5346520B7CF4909B41A8190B668EB9E5BE78F55155945936DB2C20E4C184BD2D3F6DF976168373A1E465E89B0C2ED18E750643932EF45DB0661ABB74088AA2163C06A19E917D7B6F513FD1DB784534D624EE5575
-Out = 4DDCA5CC4014C19993D857ED57876B384E8E06523066A86A4A4EE4EC597CCD3F1619D4C5124C088B1E89E969335BDEF659CD3E2DBB2FE26079EF7F5352991D26B89CB324234E2608A77BA1B66BB194D4CBAE3DFD6B80359ACCB81C3E69CE2BD30BF991930AA22FF0A2D02A0F460951DC829FFD8F095CB245AD84A152BC59DF1925B0F1BCA25FC2355AD25B25D821B22DC0AB2749AB7EC0442AE798674D8E11A87257AAA2767894914056C8287B139751DA5CB49E8DBACE28E2D9DE52C508089F8DCA82C7386619B4
-
-Key = 801D788845FC6152E33E6A2CB42A2A22
-Nonce = 5F5FC8B7D6B6C3A5
-In = 4541B90A451368513D4A09BCBE2CD48155E512FDF240E76795905DAC75CA9BE0264E5A7F924C4706925C7CD35392FF441031EECDF0D9EFCE0E6135E3F4C1CAE57286552C4AA4D4074C9F7C922B53D0F4CAAF6914F81123EABF9B012AB45C9AB989AD979A197D7094AF9A0EBEF2DA9AD8E32E5FF16E14475F0694A79346231E532660E0176224F21676E304A32405775A937E26FD3C9AF3A4DA27F2FC131717805CBACFB554AD1ED56036C18456B5C8211F2CB2E9E34AA5706E439D1FD5DF049FD63CF2490B74998AEEF3D63A
-Out = 37BE67361D55FDF19B8AD1A39BA3DD47210DA5B83614B00A72120BA2D9E5CD65890C58D81A3060A39A4E8CDABE0D2862419BDAEC7695B87E2894FA5A5B05E0E1D1E6B35D5369CE741BFE4EC755DE0BCAFCC1FC160A6260561AF899A735817258BA86062AC698CD50913E0043AFA85640C52BD8F1B979011EC8A20A5A0C52BD73552B2E1DF1481C62F2BC74E8150943FF4E888D944B253D0CC82848DFDC709792A2FD987EC564FA6D47AC98C3B271CC0A6ED3FA4EDD159715AB1972E45D51926E42E88C309A95494AF55C9E7C
-
-Key = 540E936A8F7DFA7E1069D1ECB6DA529F
-Nonce = 7DD8BE5EED8A3B91
-In = 9550E29D3D0E9483B8746D24A72396DD16DD31F7538548C6090950908C51E4AA9250B1713685E1A7337A1D917D197B72EE8A0969D58CAD94C73A9B24A63620BE8152013669BA44DAA9652C99787B338FF96C6FC00ABD13561045A1C25214695C990360F505D83E9FF3FB3711535164E06FFEA4A0050A09D7134FF72A98C67F3BD73BF90E2CCAC943DB049A788E7B62E92C9178E433255A5644DC67B17CBC87AF2AA145B3E4B657F31D28B9282B0E6B343C8759C51457D48EB5880CF255B2058A30388D306D896AAD42EDB05158223FBB
-Out = 22473327F8358F22AAC1473C942B78067FEA10319F52A6969A889AB87A09FB2A21878B308627C0FAB3C1358C5C30F198FD5EC27B9FFF78F4C4BB97ED9804443C18C01470CAC1D73095E8B9E2CE4E6766EB4DBE31DB528CAA80B01AE979A3FB32F056F54B93704DE4E45D0EC19FC8E571294C279CE3C1DAB74DE63C741EDC1AA7C60A8DC1EEDEB738FD415F22F9E42A2219A1BE56404E8921D95DB53F7B2873908C9A7E09A7B80EB40968319CAD1FEF85D31B916C2F0810CFCEAC1E77976D0DD2105F71E9625209ABB16E7CCD3171AF38
-
-Key = C3CCC1F40F2234124E8E44BE4D230D51
-Nonce = 7BB01E9C965EEAB0
-In = ED1ED1768831FE993379B5EA6091A5CECECAA6A1E4218F13755A75CE982B5901191B3F6FEFAC14A3D68190F66D759389A4B72FC1965516E16412E1DAFAD962A23420E3D108738D6BF1B7D8FD2B6DDDBD590E88EFE3353664085D1BFB7B8E2FF4169ADA322530724388BA378464B2DF93893FF936274E53916490A4917CBA6997BDCBB9A84ED1E7543B89B64AB70F8CF93713FF08A5E8EF164E33A6C85205173E9D2E3B0D31E565CBFEDE77FBDE48CF47E742F56BA466AA124B725840B56A69F2F46543C31C5DB8E926A7FD968B94606B77CF9820
-Out = 6F5F24233FCF42897405065C047A15EDB1BD4AC5824498D186E76D44A01636E3BFA6FD96B0FF5112FECC0F7D5E754505AF90F25F91FC121E5729D77E569744FA7095BE9C15216DA353AAF508D7A0BE30C64549A1D2F092FA65DF3C29144030A0B3407DF0C80D29A82CAFCB3AFC106FDD282E3E3792D034262EEC388134F0A0ED182D29AD8EE98FFC3FC18256DAB7D2374A31F293F88812AE33758A35521093334BD204CD2F01BCA1F914B9C1FEC402AD226102ED6C77459CE4D20EBC89CFDAF01334AE4DCC07D48ABAC694B86A90A5DF236BCF06
-
-Key = A8E311DC7544747FA09537683A4979FA
-Nonce = F010A1D16F896398
-In = A9CA7C9133827D9AF63A9A2D98F12E96708714F3DBA3F887C044EE50BF508A4759124EE3748CFF9E3F47976EFEF9E9E91DB6ADF75F2702C277D87E7EF2DECBC60E861FEAF695E93DF183AFC6548AB8F5BFF6C12A25E62C81196F3AD2392FC77326DD521D374F54865532157C75F1B77AA93EB2178F6117AF2AF8ABEAD69C2F4B3FCD3F0BCF24CA460FB596E47C4AC6D2873A96C90788A425400D8CF579733E553B9C38E538F2B1C762D6201EFC132E92ABB6912130F22547BAA1E44FF487D1C4B2B06B3A4768A1220716C44657F679E1F200164046325346
-Out = 1F1B86628E58A2F6220B26B25DC7723D22B02F2E5E011672C354C6D1CBF272100F066893EE1A9E353E841AC24D0AEF62BBB5480ED978C84BD5B052F1424D6238641C9F11E5787D3B94CD7D866FEA1D2DBACB58DE1B6A0582B6C103926953B3203C94CC8B87F0630E77650E851449A3BEDE5B2C1678A5F17F920234238C0C57C51181E5D1E7B1082EA9D4781F825574B93B69FFB03BE688210B74B0A6338370340C90442709591671D19FED7D44795B97409119B4CAD30C84B296C7CD76C3C3B8ADB8B273A35AE34EF402D4B22458EEBB1992C7A32919D2C5
-
-Key = 6CEA1E32C1732B9AAF2F9A85A9022895
-Nonce = FCF3906F4227113E
-In = CEF68DB7976679BD69BC5819CDBEA5749593FC2754D2B0860A87A3B16A680E9B634C7A23EEB7ECACDBFCA2FBF26AD3AFDBF29E98230B43D410F27777010F09ABF76C69E0864BA2C37ED9BE1C0E812154E570509F0C8F07C45A52E5FBB3DF015FD54BE20D8DEE69FFDE644EFA4DD93E7C8A7582DC19B5E1C69FBF190E43C7EAFA92C67083DAFB3890C25324E3590479D6BAE27E8E90B6F28EC39BFD46A73CE92F17609B596CD2BE34700E37E423CC9B9160304198D917357347E414627D7BD9D36ABB5BA07BEA6C9302F73F370D2DA6393F3CF310B65BBD45374EC60D
-Out = C8848BBA822123ACEF694A77E942F57FF02BCDAF6E6540FEF7A075B890A8CF32B9372A9553B501526455EFF2B764B5C3E8C3BB08085074B4EA0FDE7D4CE94BF284603423068E8FB5E9252C73DE7DB341AB624D1C44E79ECBC22874A73743004B99BD6316BD7C92415C1F2A54675FC2D26B0EAEF760B329A1BC24D140BA8F28000649F1FF43F586E2899FE63C133A67FBC542C87A4369539D8254DED0EF157425B379CF6F10BB0DDB7937441E3C091602C76424AD5E856550CEA7FECB24D54333C437251122C72E4D21DF23371B01D05E32FE1907F198F18BDBF68351
-
-Key = 808372C49B7BBBF65386566C6973A76F
-Nonce = 805EC1D405B86CED
-In = A7A87EEF419C8600662C5CBA01DA56DF0CE6977991502A27F5FEDAF68AC26AA89FADBD1563ECF3810643174D9A2B6E940E65ECD0FC120281BF9F52C0AF2F768924111941FF1D8424788E75CAF63FE7389ED1C736504F99BF1590C5B970DBD7E0D13C283209435EDE2360146F4F734A06F1ED649324985857FD3CD80C82E896C368E44B52C35C958D5CDB1DE800BA7343412CD66274A97037667767FB7C7E4B95C261106FF3D34A209B998C38F2639F74631D1BCEBA04A436D8DDE90C2A1A38CB44EFA7AC782BD5EAD9F3A5FAC879AA63F6FEA44FF967D70992533375BF94C2EE
-Out = 2F7335F36D102EABA78F04185805AB6F88BEFAF2ADC84DD6DE9629E34A00D934FF017D7EC8195B8B7D380FAB765646FCEAACAC912EFCF6E522052531D04255964ADC147ED533AE5D5917ED43F7E21BA784B121DEEB879B41B2D00C8A18FF075CD810F8C5DE84B8E3A137E9D1911BAEAB91402AD0461E58A58F45AC901B0B741C63A78C13C82B4709B14F7DB1B38962067F5A08DE2FA8BCD91CD6BF3FC17950693D0DFAC9CB1680E68D9C9823AC12B1F37E4B6C1663F5BBE7D8DAF7961C3D7B37C34FD2CB02918785E8B7B6777704AA4F11CD974EABCCD6784504A583C56CFDA7
-
-Key = 299F9BF1E1B34A0D39E6D49B67DF754D
-Nonce = A4C997CF160DCAF7
-In = 4F25B31BA0783DD6842D607CEE8FCACF6ECD2D5D6D885A230874782F2441ED47DAEF2138E6EC20333CFF9671E008481F80986EB91A46C08C9D22D2B6335F8E6BD10144324726FD7EA311573B1A03E6E6262B89D145B01BFEEF14D7904E0C53966747316842DEF71AD1144CE3B8C08C16980A2EBABE9A5501C89CF0B6F610808112123A56FE7F726639A20EDF2C531D8BDD30D9F4032C9C3F9C165634A898442C3EDDB0D8A63A855CE44E650E428B60C536918BE045A902B0346F232545B27A0C5EB15F79BBD1190552A68EE7C1D29D04DF1C70A7CA254A6CD47BCCECE1082A20F35E7E46
-Out = AAA603EC1AAF270AAFC06A43317B6FEB2398633A9D1C130F2C67B6C19E9C391C9396914ABD907B1419551202E6228FC7E06FB78FF669A2597AEA85DD4A372FDA60ED0E3C30E872E2AF2A250DBC6972CBBE00A5F1B5BCB7353175B5D528E32CB035460E12C8A3DAF3D1D4B25D0CE9CA5AE3F8250548EF24AF92F4346A0C5716619A640100922AAE13C7824341A938E14FE9D51AD691932421669D958C252DBAAF943C5AAF64C89AC8B381602D3AD0937D8B8ED4132803C2C9F40838CF1A2064D269A9CA2266DBB642852DEA101E4E6CCB40C377F17D195FED673F030484DA66428B3C7D03
-
-Key = CCDDD91BCCA1490EF312ABF7D7EB545B
-Nonce = B091FE75641EF510
-In = 3B0CA636F9F507E2D9CFDF06B3D69B44A3647FC9D6C824C3C1FF9F31162E7A40394D95589123310056EF2B668F59B93EA71CA45434D104A91878A6DD3C4349D374E39B7A4635FA0F0841824D02BC92EA6EFDEC08BF8566CCA111E478C569A96B9F7A2306A2CD5464EC4EB0FD642E91A01EFC0CBBD08EB28B34D99989BC3D55DBB5BF32FC8C0CFBC3E5B89DF3B01EC4EC8FF3553DA1714004AC52A2F14EA090B3DBFACA8A7664053DE14A905339D2952964DD501B638EADC396DC05814203C4568D5469D7E3FADE0302C14BED2FEEBBEE5A78ACD17D0D44259D4A47BEA7C4935967125BC0F0E228A2
-Out = 253D1DC003D0BA2B60422354551E3684951A5B77C142061BF86EB95DCAA1FA06E2E047F8DD94D3080BA6345E2F72478110899AB51D5BCBC6E16E564C407AC37A08F34108FD9EBFAE560FB59A6A37DDDE8F014EB525AE9F5F63046C263721E72B6E94151A129A3BD446D9AC21602FE0D150251754B4334462A99B7C5792B901E03AF71FAB991AAC8B9A75C29B2FAF35178946735608DF583B27C80661A53FAA4AA581B5AAB2F7F034707C9B812C9A22FEBBBD21E1BD4821C4E45E3A072F8301435E238C7489B23646CDF37800C9D40CE69BF17ADE4992F733F71C2273B37D1F17B68D15FE61163E84
-
-Key = 80EB0BB542D844F4768820077D8B81C6
-Nonce = E6936F2688231B9B
-In = 74CF8F2B03009D38E874C23AC4A01855EC591D2014AC96C5F6C4D0BBA42C8C3764A3554B9D5D44D9FFC259E266DD0A2649B5D299139F2ECDC1CF7E286C183F74051B150674E9407EC8A6E151E174EE66012DA6E2303AAF3AE7F677C17BDFD546589F52756CC02ED3BF4483D1B4BF49FFEA82F0A9111BCA3C2B5DE08FF67E5BEA7D2E74564D686D554DD9C31C291ACCDF76A0AE0ECDBB17A427D4223BB53592EE37E398707CCDD0AA70F815AC3EF6585F35A5E1ACD44C511CCB79CD85B5D1CFF534B0CC7F89C41CB4BBD351D8FBA99EC6717A98BCABDEB16D242F4DE41CF5BEBA4BFFFFBE600386FE55CE9F0F
-Out = 2747D5D76CC1A15D8D410C081DFA56049B7421A90B01EBCDBE9E31B70C61A58E0D2D5985596520528D6C0F64063C3F2386F4ACF2FFF68CBFB8A7C78B97A573FADA6AB69EC728CE77666C89250F9942F80FA653CE60ED9B65949D491A38953C688821A1C4B39F88A72AD5F4544D002456990F1C4F3CE293BDC8DD68BF8E13818A05454565D9B87AA9F4FC906E4AC61A523C1C65EE7467B498B5A06AF633A37B5287854365DF96A2675A3A454A25A345BC1F9A0375E091C6BC55054E2FCA011B1E3BA1C964A3470DFCAE1A937F1286031FB8435FD7487768DA018E69AD3029A1C6EF4EAFC302EACDCE8A02CC23
-
-Key = 89D3696A74D8D4A751C1219C3D742DA8
-Nonce = BCA7BD8D3A8B2682
-In = 44F6EF40CB3EEDE73D0BCDEF4009F48EFE4045B1422ACDA5111D1BAAD4827B33B37911FCBB51A9AF5E6E4D675A968F119DE1A64075DC4670B92FB83AD3B44796522B0D8187EDFF982D38C7E8EB63AD3B838FF50662685D4106BB1E0424B5631ECF069D988C446CD2E97CEFE1A2C3194681873266F5E02C7018715A3DA9CD927FAECB6B8AE6366998141ACF652B49353A8D6B9A6238C331138CDC90659BCADCE15CED1615B96D050250E5196F88F5601F6B53822645825C88580AC543DF13FB4403BD895000A2CAAD12DDEB584D70A0CBB8C029573F5A530F9E5BE2359E6011DDD4FC25E32397CACDE24178D0E0AB186E
-Out = 3AFAABBA1BA4E009171471B45D465F449D2F0DFE600893F2D60F9BD653B092C7CA980C4ABA1F15C08028835A341C5E59423AF6BA5E6F5B3C34E69CB2CAAB42EE3DF6B1FA10F2A611FB4871AF01815135426D60EB540D13B9058F154D6643FDB28542A079DA0549E9C62BFB6DCF3F6FD40175C86B2CAF712E42538F3B6C5C57024D36AEE3FC93B5E70CACD49776302E51CE84B4075BDA7B37FCD1968A6F561F625B1D32F3652D8A7BEEC11A11CD8737A9C9F87D1A4CCC3F24D201BC8C1CE24589313CB0387C3911C924A572237705774C89840DB93D5BEAC47F75E04A10839355A775A02FD417FCC2A0BD104E81E3CA40
-
-Key = F544BFEBA760D22BBF72BABC88528618
-Nonce = 869958C2FDFA5C52
-In = 950F2F4CD525EEC6CB634DEE121B847F35D083523526D9E20E329C263EB892E5FF2ED907B354B057101C73C094476768A225268BCAE04C564EEE9EC9D855E478E192A9FC22F12D440803BC49C5F20683DA0CBB09CF704E4938AD0620A4C40CDA769EA03C236B0DAAAD30B43284486A8D2619E94BD1B79F01B3AD9E70874BD6B929BAB1121FBD585CA2C0D25B799AA4877FDF222097CF0B8CE95593D0CDDACC418FB1734ACC19D365B410DCB94C3E64B11B5E1C61DB6B4BF2E291FE653E2EAA266C3CE7FA16857001FB6C2259BE0A9157F629B6E37BA037EC3A716293AD59C1A254EA4FC60DE1B875F40BB328B5B6CC148D5FF5AF
-Out = 34E2E8205BC53EDB71913053F33227BD0CE67F1D509A0FFC5F70AE3B59A722681182179726A242F1AADA28E15C3B04589D5847C762A36A73B7D0696C7393D5AC73DFE5DBA39752C8A06BC4DF90FB52372598B43726849B0907DD640C9D0D4C9990D5F2FDC9F1535400DBB3921C046556B0F8DDF88C46D8D7924E954B177B936EBE1961C89D5616761C51D576D60C22FF8973FD324DD7340B76D11F6612D80AE53CD3E5702AEA0EEEACB6FD21861B68CEF12AB12CAB6BF023D6F6F3771B237A9F68D5516EB85BC0907E947D702AEBF2FD72C196A087EB38AAF77E04BEA1F6798F6EC164BEAFAD1BDD2955B8721AA6717505EAB952
-
-Key = CD3603440E0D4ABFB32196ABAEA29DBD
-Nonce = 47D173BB5D14232E
-In = 3F20E497CC4C46C5C0B145DC2D1208627A07F0426608F4C240CB2C0E1B78858FA22280BE9DB77EA591738F57ECBB4F242386CDA36E926FDA022400566C2AA3AA885B5AC734DE191B61B66817B9A81D9F9FA9AA5F061E85B75DEED7A7C8E4C047923C6BB484747C0447381452444FDE4658AD1FD3FA214798B4119D0133DA8EEB08E4104F84B4485047E9E48195F4408E3473565036388A53FB9D657A7166DB7FE8F0978F01FC8DB66DFAFFD2E9B9FCFAD241E05F856A512BB70DDF8CB32B34F00A06F7A5547BA92DD905DED80937E3A1478142A549A34B1905A2C0183975E4DE684458DB2F80F39138ADA478D425453909AE585EFA7A91E0
-Out = AEB26738E31E6C09771AED38B68F236CC9B3B7C512B16DAE7BB44F2F8ED5BB38FA0FAA8FB4F8C9E3BF003CC4342BCEDB7F978F0383C7677622468E5A4C76F9A91CE4F3C2B26B9547E6384EE50BCA15D22A7EFF7BC69E749AFDF6F0BE7DA7E60BA86C399C34C580E18E5FB35B2D52ABD64A31F508711C5AD753FCC47D38933C581AB33C6F57E90090C7824A345046492A6A94293040ADF91673D8FF6FB1B6C989D0C0A962931504ED2E1E056FAE8EADE632D27B398D893F2D3B420AAAFCAE4EA0688AB45335BE5E8D5E1A7D70A4C6EF1EDA6BE64AA0CDE3939230E8B027B400CBA2615525C0377E22D5DB9EF150C316680E545B28D5AB02BD
-
-Key = 7ECC2FA94DB28B0C4CD002EA020B6111
-Nonce = 00519E7C6392488A
-In = 9FF2357073EA8FEB5696460CA5570F82A65C9C8B23CBBDB54161EDF09BBB952A57F9E02A0E60B53B9B29E47F64982A9D3AAF92CECA9B1B4F899C37EC998679E1C6E608FFE780EC780517AE6EAFE48474BBDBC2F59FE732779AA27380BD7B003F1D9D9977DA835C52A6D6742914276C92689190A1DCE67F31A165A08053063F08C01A5C25B5666540F0802C7F79E64DA6A2E8EE51888918CFA3C5437891E1F7186ACD7B48CC2B7C6E961C95A10121D4B2F20D737F74FE62D4401ABE8EE6EF748D646B02B117885D6F9F7BA65A01307454094C66AF68D25740EE9F45D7B9E12D9FBE44C13D98BBB59FFBBDE75E4E217F9BF794968A4B55F2B16DF6DD40
-Out = 30E20775061AC476109DEBEEC9CA69882E3F6FF8D05B913CE1ACCCBFADEA87B15AEAB81A8414EEFC3938D0149A0DEBC42E1B3E4CD4D6FA0CA171F7CA194A5F57BC2BA3221E43DE68A269714F5BEDF0F12FA33C456F839D30C4A9C7667273350CAE1E25BF98CDE73BC10FC5B202F88C7477B2973A077C567DE8408C3FDE4EA6722056D7AA0AABA3E332D53B686423ECC8D8C69524D3E94AE42FE6C70CDFE611C7DA0E300BD81FED416CC0952F008A9F4CC6795D85DD0732228628A8A3266782BFD7E041D6D135C329BF7C02F209EA97C288C613049ADAA2702F654FB81166C23F2EA91FB969679917CDCF22CD878AAFE6E2CD8BCA63468AB745762E7D
-
-Key = 0C8D98BEA46840B22546EE369F77CFFB
-Nonce = 4FD1822D02B9C1A3
-In = 7E508A73B21580529EF3C160A981240BA4A83989EC072F7F8296DC7DA3B9F785D11FA67DA1843A31BEEDD09919738D6E98AC7F37402FA60968E0EA3890CD0A0238B31AE3A26EF28BAE750FF2451D98D8B405FEC83672C3A531CDEE25AE5566EA23C51CE747CB44092B82AB89D0C3D0731DE92D1C862E50DA27A7024338FD62311DBB7BD2029713263EE16F9FF37EACE71EE5F25AD185A9E0327173F4287A93BAF814ADAF5AF869F2436BAAD8D8D3EA4908A816FADEE43AAC1B7E408BC049D2383F91D25D4CFC3537784E0071B5BB1614CE40C8E1EB9FCEF299C8C10DF96597B10BFF0606CA3CDD6AB72BBF8D4341222E36675360FA3193A0E275C95590056585
-Out = A5B2EC64C27DDC68D99C9F82F0833898B11B2355DF8F1CAFA49C4B3D67327A2367AED1C8330F5A700C788529F78AC260E0DB5231DF15E01BB616566CF4E3A64F1F42B503E42403867EA24A5DBB80E5B6403BAF272BB480E0B39C77E4D092FB8ED54360912930F36B91C94F39689F6571D948D9660CE319E1D72EECC0AF93072417F4A65F0F1823581B9DCF874094E32741BBA233F5A998C1CAEEE53C331BA9F9D437DDBA066160137AC5E7D006DE9EF709B1D033145CE09F1FDDE0C5B278201665BB835726314E1B76E8DE23E4FBE36C22F5D7009E6B7DB7F151DB23CD520666101F7D3F699016CDC3F286402EBAE4F59ABCCC3A86502112935EA87E1A993F6C
-
[CTR-BE(XTEA)]
Key = EC1147D3A4CB70A20AA8664E88E60985
Nonce = 7A38520947DD623F
diff --git a/src/tests/data/stream/salsa20.vec b/src/tests/data/stream/salsa20.vec
index d1ca30ca1..afe111266 100644
--- a/src/tests/data/stream/salsa20.vec
+++ b/src/tests/data/stream/salsa20.vec
@@ -1,16 +1,13 @@
[Salsa20]
Key = 000102030405060708090A0B0C0D0E0F
-In = 000000000000000000000000000000000000000000000000000000000000000000000000000000
Nonce = 0000000000000000
Out = 2DD5C3F7BA2B20F76802410C688688895AD8C1BD4EA6C9B140FB9B90E21049BF583F527970EBC1
Key = 1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A
-In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Nonce = 0000000000000000
Out = AE39508EAC9AECE7BF97BB20B9DEE41F87D947F828913598DB72CC232948565E837E0BF37D5D387B2D7102B43BB5D823B04ADF3CECB6D93B9BA752BEC5D450591514B40E40E653D1839C5BA092296B5E965B1E2FD3ACC192B1413F192FC43BC695464554E975030844AFE58A811209
Key = 1B27556473E985D462CD51197A9A46C76009549EAC6474F206C4EE0844F68389
-In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Nonce = 69696EE955B62B73CD62BDA875FC73D68219E0036B7A0B37
Out = EEA6A7251C1E72916D11C2CB214D3C252539121D8E234E652D651FA4C8CFF880309E645A74E9E0A60D8243ACD9177AB51A1BEB8D5A2F5D700C093C5E5585579625337BD3AB619D615760D8C5B224A85B1D0EFE0EB8A7EE163ABB0376529FCC09BAB506C618E13CE777D82C3AE9D1A6F972D4160287CBFE60BF2130FC0A6FF6049D0A5C8A82F429231F0080
diff --git a/src/tests/test_nr.cpp b/src/tests/test_nr.cpp
deleted file mode 100644
index bd1d67d4f..000000000
--- a/src/tests/test_nr.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
-* (C) 2014,2015 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include "tests.h"
-
-#if defined(BOTAN_HAS_NYBERG_RUEPPEL)
- #include <botan/nr.h>
- #include "test_pubkey.h"
-#endif
-
-namespace Botan_Tests {
-
-namespace {
-
-#if defined(BOTAN_HAS_NYBERG_RUEPPEL)
-
-class NR_KAT_Tests : public PK_Signature_Generation_Test
- {
- public:
- NR_KAT_Tests() : PK_Signature_Generation_Test(
- "Nyberg-Rueppel",
- "pubkey/nr.vec",
- {"P", "Q", "G", "X", "Hash", "Nonce", "Msg", "Signature"})
- {}
-
- std::unique_ptr<Botan::Private_Key> load_private_key(const VarMap& vars) override
- {
- const Botan::BigInt p = get_req_bn(vars, "P");
- const Botan::BigInt q = get_req_bn(vars, "Q");
- const Botan::BigInt g = get_req_bn(vars, "G");
- const Botan::BigInt x = get_req_bn(vars, "X");
-
- const Botan::DL_Group grp(p, q, g);
-
- std::unique_ptr<Botan::Private_Key> key(new Botan::NR_PrivateKey(Test::rng(), grp, x));
- return key;
- }
-
- std::string default_padding(const VarMap& vars) const override
- {
- return "EMSA1(" + get_req_str(vars, "Hash") + ")";
- }
- };
-
-class NR_Keygen_Tests : public PK_Key_Generation_Test
- {
- public:
- std::vector<std::string> keygen_params() const override { return { "dsa/jce/1024", "dsa/botan/2048" }; }
-
- std::unique_ptr<Botan::Private_Key> make_key(Botan::RandomNumberGenerator& rng,
- const std::string& param) const override
- {
- Botan::DL_Group group(param);
- std::unique_ptr<Botan::Private_Key> key(new Botan::NR_PrivateKey(rng, group));
- return key;
- }
- };
-
-BOTAN_REGISTER_TEST("nr_kat", NR_KAT_Tests);
-BOTAN_REGISTER_TEST("nr_keygen", NR_Keygen_Tests);
-
-#endif
-
-}
-
-}
diff --git a/src/tests/test_rw.cpp b/src/tests/test_rw.cpp
deleted file mode 100644
index bee9dfff0..000000000
--- a/src/tests/test_rw.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
-* (C) 2014,2015 Jack Lloyd
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include "tests.h"
-
-#if defined(BOTAN_HAS_RW)
- #include <botan/rw.h>
- #include <botan/pubkey.h>
- #include "test_pubkey.h"
-#endif
-
-namespace Botan_Tests {
-
-namespace {
-
-#if defined(BOTAN_HAS_RW)
-
-class RW_KAT_Tests : public PK_Signature_Generation_Test
- {
- public:
- RW_KAT_Tests() : PK_Signature_Generation_Test(
- "Rabin-Williams",
- "pubkey/rw_sig.vec",
- {"E", "P", "Q", "Msg", "Signature"},
- {"Padding"})
- {}
-
- std::string default_padding(const VarMap&) const override { return "EMSA2(SHA-1)"; }
-
- std::unique_ptr<Botan::Private_Key> load_private_key(const VarMap& vars) override
- {
- const BigInt p = get_req_bn(vars, "P");
- const BigInt q = get_req_bn(vars, "Q");
- const BigInt e = get_req_bn(vars, "E");
-
- std::unique_ptr<Botan::Private_Key> key(new Botan::RW_PrivateKey(Test::rng(), p, q, e));
- return key;
- }
-
- };
-
-class RW_Verify_Tests : public PK_Signature_Verification_Test
- {
- public:
- RW_Verify_Tests() : PK_Signature_Verification_Test(
- "Rabin-Williams",
- "pubkey/rw_verify.vec",
- {"E", "N", "Msg", "Signature"})
- {}
-
- std::string default_padding(const VarMap&) const override { return "EMSA2(SHA-1)"; }
-
- std::unique_ptr<Botan::Public_Key> load_public_key(const VarMap& vars) override
- {
- const BigInt n = get_req_bn(vars, "N");
- const BigInt e = get_req_bn(vars, "E");
-
- std::unique_ptr<Botan::Public_Key> key(new Botan::RW_PublicKey(n, e));
- return key;
- }
-
- };
-
-BOTAN_REGISTER_TEST("rw_kat", RW_KAT_Tests);
-BOTAN_REGISTER_TEST("rw_verify", RW_Verify_Tests);
-
-#endif
-
-}
-
-}
diff --git a/src/tests/test_stream.cpp b/src/tests/test_stream.cpp
index d3d83c26c..be7b9a548 100644
--- a/src/tests/test_stream.cpp
+++ b/src/tests/test_stream.cpp
@@ -18,15 +18,18 @@ class Stream_Cipher_Tests : public Text_Based_Test
{
public:
Stream_Cipher_Tests(): Text_Based_Test("stream",
- {"Key", "In", "Out"}, {"Nonce", "Seek"}) {}
+ std::vector<std::string>{"Key", "Out"}, {"In", "Nonce", "Seek"}) {}
Test::Result run_one_test(const std::string& algo, const VarMap& vars) override
{
const std::vector<uint8_t> key = get_req_bin(vars, "Key");
- const std::vector<uint8_t> input = get_req_bin(vars, "In");
const std::vector<uint8_t> expected = get_req_bin(vars, "Out");
const std::vector<uint8_t> nonce = get_opt_bin(vars, "Nonce");
const size_t seek = get_opt_sz(vars, "Seek", 0);
+ std::vector<uint8_t> input = get_opt_bin(vars, "In");
+
+ if(input.empty())
+ input.resize(expected.size());
Test::Result result(algo);
diff --git a/src/tests/unit_tls.cpp b/src/tests/unit_tls.cpp
index f125bfcb5..33c6c245e 100644
--- a/src/tests/unit_tls.cpp
+++ b/src/tests/unit_tls.cpp
@@ -1,5 +1,6 @@
/*
* (C) 2014,2015 Jack Lloyd
+* 2016 Matthias Gierlings
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
@@ -161,13 +162,18 @@ std::function<void (const byte[], size_t)> queue_inserter(std::vector<byte>& q)
return [&](const byte buf[], size_t sz) { q.insert(q.end(), buf, buf + sz); };
}
-void print_alert(Botan::TLS::Alert, const byte[], size_t)
+void print_alert(Botan::TLS::Alert)
+ {
+ }
+
+void alert_cb_with_data(Botan::TLS::Alert, const byte[], size_t)
{
}
Test::Result test_tls_handshake(Botan::TLS::Protocol_Version offer_version,
Botan::Credentials_Manager& creds,
- Botan::TLS::Policy& policy)
+ Botan::TLS::Policy& client_policy,
+ Botan::TLS::Policy& server_policy )
{
Botan::RandomNumberGenerator& rng = Test::rng();
@@ -218,164 +224,216 @@ Test::Result test_tls_handshake(Botan::TLS::Protocol_Version offer_version,
{
std::vector<byte> c2s_traffic, s2c_traffic, client_recv, server_recv, client_sent, server_sent;
- Botan::TLS::Server server(queue_inserter(s2c_traffic),
- queue_inserter(server_recv),
- print_alert,
- handshake_complete,
+ std::unique_ptr<Botan::TLS::Callbacks> server_cb(new Botan::TLS::Compat_Callbacks(
+ queue_inserter(s2c_traffic),
+ queue_inserter(server_recv),
+ std::function<void (Botan::TLS::Alert, const byte[], size_t)>(alert_cb_with_data),
+ handshake_complete,
+ nullptr,
+ next_protocol_chooser));
+
+ // TLS::Server object constructed by new constructor using virtual callback interface.
+ std::unique_ptr<Botan::TLS::Server> server(
+ new Botan::TLS::Server(*server_cb,
server_sessions,
creds,
- policy,
+ server_policy,
rng,
- next_protocol_chooser,
- false);
+ false));
+
+ std::unique_ptr<Botan::TLS::Callbacks> client_cb(new Botan::TLS::Compat_Callbacks(
+ queue_inserter(c2s_traffic),
+ queue_inserter(client_recv),
+ std::function<void (Botan::TLS::Alert, const byte[], size_t)>(alert_cb_with_data),
+ handshake_complete));
- Botan::TLS::Client client(queue_inserter(c2s_traffic),
- queue_inserter(client_recv),
- print_alert,
- handshake_complete,
+ // TLS::Client object constructed by new constructor using virtual callback interface.
+ std::unique_ptr<Botan::TLS::Client> client(
+ new Botan::TLS::Client(*client_cb,
client_sessions,
creds,
- policy,
+ client_policy,
rng,
Botan::TLS::Server_Information("server.example.com"),
offer_version,
- protocols_offered);
+ protocols_offered));
size_t rounds = 0;
- while(true)
+ // Test TLS using both new and legacy constructors.
+ for(size_t ctor_sel = 0; ctor_sel < 2; ctor_sel++)
{
- ++rounds;
-
- if(rounds > 25)
+ if(ctor_sel == 1)
{
- if(r <= 2)
- result.test_failure("Still here after many rounds, deadlock?");
- break;
+ c2s_traffic.clear();
+ s2c_traffic.clear();
+ server_recv.clear();
+ client_recv.clear();
+ client_sent.clear();
+ server_sent.clear();
+
+ // TLS::Server object constructed by legacy constructor.
+ server.reset(
+ new Botan::TLS::Server(queue_inserter(s2c_traffic),
+ queue_inserter(server_recv),
+ alert_cb_with_data,
+ handshake_complete,
+ server_sessions,
+ creds,
+ server_policy,
+ rng,
+ next_protocol_chooser,
+ false));
+
+ // TLS::Client object constructed by legacy constructor.
+ client.reset(
+ new Botan::TLS::Client(queue_inserter(c2s_traffic),
+ queue_inserter(client_recv),
+ alert_cb_with_data,
+ handshake_complete,
+ client_sessions,
+ creds,
+ server_policy,
+ rng,
+ Botan::TLS::Server_Information("server.example.com"),
+ offer_version,
+ protocols_offered));
}
- if(handshake_done && (client.is_closed() || server.is_closed()))
- break;
-
- if(client.is_active() && client_sent.empty())
+ while(true)
{
- // Choose a len between 1 and 511
- const size_t c_len = 1 + rng.next_byte() + rng.next_byte();
- client_sent = unlock(rng.random_vec(c_len));
+ ++rounds;
- // TODO send in several records
- client.send(client_sent);
- }
+ if(rounds > 25)
+ {
+ if(r <= 2)
+ result.test_failure("Still here after many rounds, deadlock?");
+ break;
+ }
- if(server.is_active() && server_sent.empty())
- {
- result.test_eq("server protocol", server.next_protocol(), "test/3");
+ if(handshake_done && (client->is_closed() || server->is_closed()))
+ break;
- const size_t s_len = 1 + rng.next_byte() + rng.next_byte();
- server_sent = unlock(rng.random_vec(s_len));
- server.send(server_sent);
- }
+ if(client->is_active() && client_sent.empty())
+ {
+ // Choose a len between 1 and 511
+ const size_t c_len = 1 + rng.next_byte() + rng.next_byte();
+ client_sent = unlock(rng.random_vec(c_len));
- const bool corrupt_client_data = (r == 3);
- const bool corrupt_server_data = (r == 4);
+ // TODO send in several records
+ client->send(client_sent);
+ }
- if(c2s_traffic.size() > 0)
- {
- /*
- * Use this as a temp value to hold the queues as otherwise they
- * might end up appending more in response to messages during the
- * handshake.
- */
- std::vector<byte> input;
- std::swap(c2s_traffic, input);
-
- if(corrupt_server_data)
+ if(server->is_active() && server_sent.empty())
{
- input = Test::mutate_vec(input, true);
- size_t needed = server.received_data(input.data(), input.size());
-
- size_t total_consumed = needed;
+ result.test_eq("server->protocol", server->next_protocol(), "test/3");
- while(needed > 0 &&
- result.test_lt("Never requesting more than max protocol len", needed, 18*1024) &&
- result.test_lt("Total requested is readonable", total_consumed, 128*1024))
- {
- input.resize(needed);
- Test::rng().randomize(input.data(), input.size());
- needed = server.received_data(input.data(), input.size());
- total_consumed += needed;
- }
+ const size_t s_len = 1 + rng.next_byte() + rng.next_byte();
+ server_sent = unlock(rng.random_vec(s_len));
+ server->send(server_sent);
}
- else
+
+ const bool corrupt_client_data = (r == 3);
+ const bool corrupt_server_data = (r == 4);
+
+ if(c2s_traffic.size() > 0)
{
- size_t needed = server.received_data(input.data(), input.size());
- result.test_eq("full packet received", needed, 0);
- }
+ /*
+ * Use this as a temp value to hold the queues as otherwise they
+ * might end up appending more in response to messages during the
+ * handshake.
+ */
+ std::vector<byte> input;
+ std::swap(c2s_traffic, input);
+
+ if(corrupt_server_data)
+ {
+ input = Test::mutate_vec(input, true);
+ size_t needed = server->received_data(input.data(), input.size());
- continue;
- }
+ size_t total_consumed = needed;
- if(s2c_traffic.size() > 0)
- {
- std::vector<byte> input;
- std::swap(s2c_traffic, input);
+ while(needed > 0 &&
+ result.test_lt("Never requesting more than max protocol len", needed, 18*1024) &&
+ result.test_lt("Total requested is readonable", total_consumed, 128*1024))
+ {
+ input.resize(needed);
+ Test::rng().randomize(input.data(), input.size());
+ needed = server->received_data(input.data(), input.size());
+ total_consumed += needed;
+ }
+ }
+ else
+ {
+ size_t needed = server->received_data(input.data(), input.size());
+ result.test_eq("full packet received", needed, 0);
+ }
+
+ continue;
+ }
- if(corrupt_client_data)
+ if(s2c_traffic.size() > 0)
{
- input = Test::mutate_vec(input, true);
- size_t needed = client.received_data(input.data(), input.size());
+ std::vector<byte> input;
+ std::swap(s2c_traffic, input);
+
+ if(corrupt_client_data)
+ {
+ input = Test::mutate_vec(input, true);
+ size_t needed = client->received_data(input.data(), input.size());
- size_t total_consumed = 0;
+ size_t total_consumed = 0;
- while(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024))
+ while(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024))
+ {
+ input.resize(needed);
+ Test::rng().randomize(input.data(), input.size());
+ needed = client->received_data(input.data(), input.size());
+ total_consumed += needed;
+ }
+ }
+ else
{
- input.resize(needed);
- Test::rng().randomize(input.data(), input.size());
- needed = client.received_data(input.data(), input.size());
- total_consumed += needed;
+ size_t needed = client->received_data(input.data(), input.size());
+ result.test_eq("full packet received", needed, 0);
}
+
+ continue;
}
- else
+
+ if(client_recv.size())
{
- size_t needed = client.received_data(input.data(), input.size());
- result.test_eq("full packet received", needed, 0);
+ result.test_eq("client recv", client_recv, server_sent);
}
- continue;
- }
-
- if(client_recv.size())
- {
- result.test_eq("client recv", client_recv, server_sent);
- }
-
- if(server_recv.size())
- {
- result.test_eq("server recv", server_recv, client_sent);
- }
+ if(server_recv.size())
+ {
+ result.test_eq("server->recv", server_recv, client_sent);
+ }
- if(r > 2)
- {
- if(client_recv.size() && server_recv.size())
+ if(r > 2)
{
- result.test_failure("Negotiated in the face of data corruption " + std::to_string(r));
+ if(client_recv.size() && server_recv.size())
+ {
+ result.test_failure("Negotiated in the face of data corruption " + std::to_string(r));
+ }
}
- }
- if(client.is_closed() && server.is_closed())
- break;
+ if(client->is_closed() && server->is_closed())
+ break;
- if(server_recv.size() && client_recv.size())
- {
- Botan::SymmetricKey client_key = client.key_material_export("label", "context", 32);
- Botan::SymmetricKey server_key = server.key_material_export("label", "context", 32);
+ if(server_recv.size() && client_recv.size())
+ {
+ Botan::SymmetricKey client_key = client->key_material_export("label", "context", 32);
+ Botan::SymmetricKey server_key = server->key_material_export("label", "context", 32);
- result.test_eq("TLS key material export", client_key.bits_of(), server_key.bits_of());
+ result.test_eq("TLS key material export", client_key.bits_of(), server_key.bits_of());
- if(r % 2 == 0)
- client.close();
- else
- server.close();
+ if(r % 2 == 0)
+ client->close();
+ else
+ server->close();
+ }
}
}
}
@@ -397,9 +455,17 @@ Test::Result test_tls_handshake(Botan::TLS::Protocol_Version offer_version,
return result;
}
+Test::Result test_tls_handshake(Botan::TLS::Protocol_Version offer_version,
+ Botan::Credentials_Manager& creds,
+ Botan::TLS::Policy& policy )
+ {
+ return test_tls_handshake(offer_version, creds, policy, policy);
+ }
+
Test::Result test_dtls_handshake(Botan::TLS::Protocol_Version offer_version,
Botan::Credentials_Manager& creds,
- Botan::TLS::Policy& policy)
+ Botan::TLS::Policy& client_policy,
+ Botan::TLS::Policy& server_policy )
{
BOTAN_ASSERT(offer_version.is_datagram_protocol(), "Test is for datagram version");
@@ -444,183 +510,232 @@ Test::Result test_dtls_handshake(Botan::TLS::Protocol_Version offer_version,
{
std::vector<byte> c2s_traffic, s2c_traffic, client_recv, server_recv, client_sent, server_sent;
- Botan::TLS::Server server(queue_inserter(s2c_traffic),
- queue_inserter(server_recv),
- print_alert,
- handshake_complete,
+ std::unique_ptr<Botan::TLS::Callbacks> server_cb(new Botan::TLS::Compat_Callbacks(
+ queue_inserter(s2c_traffic),
+ queue_inserter(server_recv),
+ std::function<void (Botan::TLS::Alert)>(print_alert),
+ handshake_complete,
+ nullptr,
+ next_protocol_chooser));
+
+ std::unique_ptr<Botan::TLS::Callbacks> client_cb(new Botan::TLS::Compat_Callbacks(
+ queue_inserter(c2s_traffic),
+ queue_inserter(client_recv),
+ std::function<void (Botan::TLS::Alert)>(print_alert),
+ handshake_complete));
+
+ // TLS::Server object constructed by new constructor using virtual callback interface.
+ std::unique_ptr<Botan::TLS::Server> server(
+ new Botan::TLS::Server(*server_cb,
server_sessions,
creds,
- policy,
+ server_policy,
rng,
- next_protocol_chooser,
- true);
+ true));
- Botan::TLS::Client client(queue_inserter(c2s_traffic),
- queue_inserter(client_recv),
- print_alert,
- handshake_complete,
+ // TLS::Client object constructed by new constructor using virtual callback interface.
+ std::unique_ptr<Botan::TLS::Client> client(
+ new Botan::TLS::Client(*client_cb,
client_sessions,
creds,
- policy,
+ client_policy,
rng,
Botan::TLS::Server_Information("server.example.com"),
offer_version,
- protocols_offered);
+ protocols_offered));
size_t rounds = 0;
- while(true)
+ // Test DTLS using both new and legacy constructors.
+ for(size_t ctor_sel = 0; ctor_sel < 2; ctor_sel++)
{
- // TODO: client and server should be in different threads
- std::this_thread::sleep_for(std::chrono::milliseconds(rng.next_byte() % 2));
- ++rounds;
-
- if(rounds > 100)
+ if(ctor_sel == 1)
{
- result.test_failure("Still here after many rounds");
- break;
+ c2s_traffic.clear();
+ s2c_traffic.clear();
+ server_recv.clear();
+ client_recv.clear();
+ client_sent.clear();
+ server_sent.clear();
+ // TLS::Server object constructed by legacy constructor.
+ server.reset(
+ new Botan::TLS::Server(queue_inserter(s2c_traffic),
+ queue_inserter(server_recv),
+ alert_cb_with_data,
+ handshake_complete,
+ server_sessions,
+ creds,
+ server_policy,
+ rng,
+ next_protocol_chooser,
+ true));
+
+ // TLS::Client object constructed by legacy constructor.
+ client.reset(
+ new Botan::TLS::Client(queue_inserter(c2s_traffic),
+ queue_inserter(client_recv),
+ alert_cb_with_data,
+ handshake_complete,
+ client_sessions,
+ creds,
+ client_policy,
+ rng,
+ Botan::TLS::Server_Information("server.example.com"),
+ offer_version,
+ protocols_offered));
}
- if(handshake_done && (client.is_closed() || server.is_closed()))
- break;
-
- if(client.is_active() && client_sent.empty())
+ while(true)
{
- // Choose a len between 1 and 511 and send random chunks:
- const size_t c_len = 1 + rng.next_byte() + rng.next_byte();
- client_sent = unlock(rng.random_vec(c_len));
-
- // TODO send multiple parts
- client.send(client_sent);
- }
+ // TODO: client and server should be in different threads
+ std::this_thread::sleep_for(std::chrono::milliseconds(rng.next_byte() % 2));
+ ++rounds;
- if(server.is_active() && server_sent.empty())
- {
- result.test_eq("server ALPN", server.next_protocol(), "test/3");
-
- const size_t s_len = 1 + rng.next_byte() + rng.next_byte();
- server_sent = unlock(rng.random_vec(s_len));
- server.send(server_sent);
- }
+ if(rounds > 100)
+ {
+ result.test_failure("Still here after many rounds");
+ break;
+ }
- const bool corrupt_client_data = (r == 3 && rng.next_byte() % 3 <= 1 && rounds < 10);
- const bool corrupt_server_data = (r == 4 && rng.next_byte() % 3 <= 1 && rounds < 10);
+ if(handshake_done && (client->is_closed() || server->is_closed()))
+ break;
- if(c2s_traffic.size() > 0)
- {
- /*
- * Use this as a temp value to hold the queues as otherwise they
- * might end up appending more in response to messages during the
- * handshake.
- */
- std::vector<byte> input;
- std::swap(c2s_traffic, input);
-
- if(corrupt_server_data)
+ if(client->is_active() && client_sent.empty())
{
- try
- {
- input = Test::mutate_vec(input, true);
- size_t needed = server.received_data(input.data(), input.size());
-
- if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024))
- {
- input.resize(needed);
- Test::rng().randomize(input.data(), input.size());
- client.received_data(input.data(), input.size());
- }
- }
- catch(std::exception&)
- {
- result.test_note("corruption caused server exception");
- }
+ // Choose a len between 1 and 511, todo use random chunks
+ const size_t c_len = 1 + rng.next_byte() + rng.next_byte();
+ client_sent = unlock(rng.random_vec(c_len));
+ client->send(client_sent);
}
- else
+
+ if(server->is_active() && server_sent.empty())
{
- try
- {
- size_t needed = server.received_data(input.data(), input.size());
- result.test_eq("full packet received", needed, 0);
- }
- catch(std::exception& e)
- {
- result.test_failure("server error", e.what());
- }
- }
+ result.test_eq("server ALPN", server->next_protocol(), "test/3");
- continue;
- }
+ const size_t s_len = 1 + rng.next_byte() + rng.next_byte();
+ server_sent = unlock(rng.random_vec(s_len));
+ server->send(server_sent);
+ }
- if(s2c_traffic.size() > 0)
- {
- std::vector<byte> input;
- std::swap(s2c_traffic, input);
+ const bool corrupt_client_data = (r == 3 && rng.next_byte() % 3 <= 1 && rounds < 10);
+ const bool corrupt_server_data = (r == 4 && rng.next_byte() % 3 <= 1 && rounds < 10);
- if(corrupt_client_data)
+ if(c2s_traffic.size() > 0)
{
- try
+ /*
+ * Use this as a temp value to hold the queues as otherwise they
+ * might end up appending more in response to messages during the
+ * handshake.
+ */
+ std::vector<byte> input;
+ std::swap(c2s_traffic, input);
+
+ if(corrupt_server_data)
{
- input = Test::mutate_vec(input, true);
- size_t needed = client.received_data(input.data(), input.size());
-
- if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024))
+ try
{
- input.resize(needed);
- Test::rng().randomize(input.data(), input.size());
- client.received_data(input.data(), input.size());
+ input = Test::mutate_vec(input, true);
+ size_t needed = server->received_data(input.data(), input.size());
+
+ if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024))
+ {
+ input.resize(needed);
+ Test::rng().randomize(input.data(), input.size());
+ client->received_data(input.data(), input.size());
+ }
+ }
+ catch(std::exception&)
+ {
+ result.test_note("corruption caused server exception");
}
}
- catch(std::exception&)
+ else
{
- result.test_note("corruption caused client exception");
+ try
+ {
+ size_t needed = server->received_data(input.data(), input.size());
+ result.test_eq("full packet received", needed, 0);
+ }
+ catch(std::exception& e)
+ {
+ result.test_failure("server error", e.what());
+ }
}
+
+ continue;
}
- else
+
+ if(s2c_traffic.size() > 0)
{
- try
+ std::vector<byte> input;
+ std::swap(s2c_traffic, input);
+
+ if(corrupt_client_data)
{
- size_t needed = client.received_data(input.data(), input.size());
- result.test_eq("full packet received", needed, 0);
+ try
+ {
+ input = Test::mutate_vec(input, true);
+ size_t needed = client->received_data(input.data(), input.size());
+
+ if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024))
+ {
+ input.resize(needed);
+ Test::rng().randomize(input.data(), input.size());
+ client->received_data(input.data(), input.size());
+ }
+ }
+ catch(std::exception&)
+ {
+ result.test_note("corruption caused client exception");
+ }
}
- catch(std::exception& e)
+ else
{
- result.test_failure("client error", e.what());
+ try
+ {
+ size_t needed = client->received_data(input.data(), input.size());
+ result.test_eq("full packet received", needed, 0);
+ }
+ catch(std::exception& e)
+ {
+ result.test_failure("client error", e.what());
+ }
}
- }
- continue;
- }
+ continue;
+ }
- // If we corrupted a DTLS application message, resend it:
- if(client.is_active() && corrupt_client_data && server_recv.empty())
- client.send(client_sent);
- if(server.is_active() && corrupt_server_data && client_recv.empty())
- server.send(server_sent);
+ // If we corrupted a DTLS application message, resend it:
+ if(client->is_active() && corrupt_client_data && server_recv.empty())
+ client->send(client_sent);
+ if(server->is_active() && corrupt_server_data && client_recv.empty())
+ server->send(server_sent);
- if(client_recv.size())
- {
- result.test_eq("client recv", client_recv, server_sent);
- }
+ if(client_recv.size())
+ {
+ result.test_eq("client recv", client_recv, server_sent);
+ }
- if(server_recv.size())
- {
- result.test_eq("server recv", server_recv, client_sent);
- }
+ if(server_recv.size())
+ {
+ result.test_eq("server recv", server_recv, client_sent);
+ }
- if(client.is_closed() && server.is_closed())
- break;
+ if(client->is_closed() && server->is_closed())
+ break;
- if(server_recv.size() && client_recv.size())
- {
- Botan::SymmetricKey client_key = client.key_material_export("label", "context", 32);
- Botan::SymmetricKey server_key = server.key_material_export("label", "context", 32);
+ if(server_recv.size() && client_recv.size())
+ {
+ Botan::SymmetricKey client_key = client->key_material_export("label", "context", 32);
+ Botan::SymmetricKey server_key = server->key_material_export("label", "context", 32);
- result.test_eq("key material export", client_key.bits_of(), server_key.bits_of());
+ result.test_eq("key material export", client_key.bits_of(), server_key.bits_of());
- if(r % 2 == 0)
- client.close();
- else
- server.close();
+ if(r % 2 == 0)
+ client->close();
+ else
+ server->close();
+ }
}
}
}
@@ -641,6 +756,13 @@ Test::Result test_dtls_handshake(Botan::TLS::Protocol_Version offer_version,
return result;
}
+Test::Result test_dtls_handshake(Botan::TLS::Protocol_Version offer_version,
+ Botan::Credentials_Manager& creds,
+ Botan::TLS::Policy& policy)
+ {
+ return test_dtls_handshake(offer_version, creds, policy, policy);
+ }
+
class Test_Policy : public Botan::TLS::Text_Policy
{
public:
@@ -650,6 +772,8 @@ class Test_Policy : public Botan::TLS::Text_Policy
size_t dtls_initial_timeout() const override { return 1; }
size_t dtls_maximum_timeout() const override { return 8; }
+
+ size_t minimum_rsa_bits() const { return 1024; }
};
@@ -719,6 +843,25 @@ class TLS_Unit_Tests : public Test
results.push_back(test_tls_handshake(Botan::TLS::Protocol_Version::TLS_V12, *basic_creds, policy));
results.push_back(test_dtls_handshake(Botan::TLS::Protocol_Version::DTLS_V12, *basic_creds, policy));
+ policy.set("negotiate_encrypt_then_mac", "false");
+ policy.set("key_exchange_methods", "ECDH");
+ policy.set("ciphers", "AES-128");
+ Test_Policy server_policy;
+ server_policy.set("key_exchange_methods", "ECDH");
+ server_policy.set("ciphers", "AES-128");
+ server_policy.set("negotiate_encrypt_then_mac", "true");
+ results.push_back(test_tls_handshake(Botan::TLS::Protocol_Version::TLS_V10, *basic_creds, policy, server_policy));
+ results.push_back(test_tls_handshake(Botan::TLS::Protocol_Version::TLS_V11, *basic_creds, policy, server_policy));
+ results.push_back(test_tls_handshake(Botan::TLS::Protocol_Version::TLS_V12, *basic_creds, policy, server_policy));
+ results.push_back(test_dtls_handshake(Botan::TLS::Protocol_Version::DTLS_V10, *basic_creds, policy, server_policy));
+ results.push_back(test_dtls_handshake(Botan::TLS::Protocol_Version::DTLS_V12, *basic_creds, policy, server_policy));
+
+ policy.set("negotiate_encrypt_then_mac", "true");
+ policy.set("ciphers", "AES-128/GCM");
+ server_policy.set("ciphers", "AES-128/GCM");
+ results.push_back(test_tls_handshake(Botan::TLS::Protocol_Version::TLS_V12, *basic_creds, policy, server_policy));
+ results.push_back(test_dtls_handshake(Botan::TLS::Protocol_Version::DTLS_V12, *basic_creds, policy, server_policy));
+
return results;
}
diff --git a/src/tests/unit_x509.cpp b/src/tests/unit_x509.cpp
index 4d3c63a1b..8449beba4 100644
--- a/src/tests/unit_x509.cpp
+++ b/src/tests/unit_x509.cpp
@@ -308,8 +308,8 @@ Test::Result test_x509_cert(const std::string& sig_algo, const std::string& hash
Botan::X509_Certificate user1_cert_copy(user1_cert);
result.test_eq("certificate copy", user1_cert == user1_cert_copy, true);
- user1_cert_copy = user1_cert;
- result.test_eq("certificate assignment", user1_cert == user1_cert_copy, true);
+ user1_cert_copy = user2_cert;
+ result.test_eq("certificate assignment", user2_cert == user1_cert_copy, true);
Botan::X509_Certificate user1_cert_differ =
ca.sign_request(user1_req, Test::rng(),
diff --git a/tls-policy/BSI_TR-02102-2.txt b/tls-policy/BSI_TR-02102-2.txt
new file mode 100644
index 000000000..2ec690850
--- /dev/null
+++ b/tls-policy/BSI_TR-02102-2.txt
@@ -0,0 +1,19 @@
+allow_tls10=false
+allow_tls11=false
+allow_tls12=true
+allow_dtls10=false
+allow_dtls12=false
+
+ciphers=AES-256/GCM AES-128/GCM AES-256 AES-128
+signature_hashes=SHA-384 SHA-256
+macs=AEAD SHA-384 SHA-256
+key_exchange_methods=ECDH DH ECDHE_PSK DHE_PSK ECDH_PSK
+signature_methods=ECDSA RSA DSA
+ecc_curves=brainpool512r1 brainpool384r1 brainpool256r1 secp384r1 secp256r1
+minimum_dh_group_size=2000
+minimum_ecdh_group_size=250
+minimum_rsa_bits=2000
+
+allow_insecure_renegotiation=false
+allow_server_initiated_renegotiation=true
+server_uses_own_ciphersuite_preferences=true