diff options
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 |